static void get_sensor_data(size_t iteration,
                            size_t sensor_id,
                            float* value,
                            const char** name,
                            bool* need_output)
{
    *need_output = false;
    switch (sensor_id) {
    case 0:
        *value = get_sensor_A_value();
        *name = "A";
        *need_output = true;
        break;
    case 1:
        if (iteration % 2 == 0) {
            *value = get_sensor_B_value();
            *name = "B";
            *need_output = true;
        }
        break;
    case 2:
        if (iteration % 4 == 0) {
            *value = get_sensor_C_value();
            *name = "C";
            *need_output = true;
        }
        break;
    default:
        break;
    }
}

static int output_json_sensors_start(char* buffer,
                                     size_t size)
{
    return snprintf(buffer, size, "{\"sensors\":[");
}

static int output_json_one_sensor(
    bool first, float value, const char* name,
    char* buffer, size_t size, int offset)
{
    int new_offset = offset;
    if (!first) {
        new_offset += snprintf(buffer + offset,
                               size - offset, ",");
    }

    new_offset += snprintf(
        buffer + new_offset, size - new_offset,
        "{\"name\":\"%s\",\"value\":%.2f}", name,
        value);

    return new_offset;
}

static int output_json_sensors_end(char* buffer,
                                   size_t size,
                                   int offset)
{
    return snprintf(buffer + offset, size - offset,
                    "]}");
}

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

    offset = output_json_sensors_start(buffer,
                                       buffer_size);

    bool first = true;
    for (size_t sensor_id = 0;
         sensor_id < MAX_SENSORS; sensor_id++) {
        const char* name = NULL;
        float value = 0.0;
        bool need_output = false;
        get_sensor_data(iteration, sensor_id,
                        &value, &name,
                        &need_output);
        if (need_output) {
            offset = output_json_one_sensor(
                first, value, name, buffer,
                buffer_size, offset);
            first = false;
        }
    }

    output_json_sensors_end(buffer, buffer_size,
                            offset);
    iteration++;
}
