static size_t
get_target_sensors(const sensor_config_t* sensors,
                   size_t max_sensors,
                   size_t iteration,
                   const sensor_t* target_sensors[])
{
    size_t target_sensor_count = 0;
    for (size_t i = 0; i < max_sensors; i++) {
        if (iteration % sensors[i].interval == 0) {
            target_sensors[target_sensor_count++] =
                &sensors[i].sensor;
        }
    }
    return target_sensor_count;
}

static void
sensor_data_collect(const sensor_t* sensors[],
                    size_t num_sensors,
                    sensor_data_t* values)
{
    for (size_t i = 0; i < num_sensors; i++) {
        float value = sensors[i]->get_value();
        values[i].name = sensors[i]->name;
        values[i].value = value;
    }
}

static void get_sensors_report(char* buffer,
                               size_t buffer_size)
{
    // センサ取得のインターバル制御用
    static size_t iteration = 1;

    const sensor_t* target_sensors[MAX_SENSORS];
    const size_t target_sensor_count =
        get_target_sensors(SENSOR_CONFIGS,
                           MAX_SENSORS, iteration,
                           target_sensors);

    sensor_data_t data[MAX_SENSORS];
    sensor_data_collect(target_sensors,
                        target_sensor_count, data);

    sensor_data_output_json(data,
                            target_sensor_count,
                            buffer, buffer_size);

    iteration++;
}
