#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <unistd.h>

// ============= サンプル実行用コード =============
// 本来は各センサ・ドライバのソースコードに記述される想定
static float get_sensor_A_value(void)
{
    return 154.25;
}

static float get_sensor_B_value(void)
{
    return 567.80;
}

static float get_sensor_C_value(void)
 {
    return 3555.08;
}
// =============================================

/// センサから値を取得してJSON形式の文字列に変換する
/// buffer JSON文字列を格納するバッファ
/// buffer_size バッファのサイズ
static void get_sensors_report(char* buffer,    ←リファクタリングの対象
                             size_t buffer_size)
{
    // センサ取得のインターバル制御用
    static size_t iteration = 1;
    int offset = 0;

    offset += snprintf(buffer + offset,
                       buffer_size - offset,
                       "{\"sensors\":[");

    bool first = true;
    for (size_t i = 0; i < 3; i++) {
        const char* name = NULL;
        float value = 0.0;
        switch (i) {
        case 0:
            value = get_sensor_A_value();
            name = "A";
            break;
        case 1:
            if (iteration % 2 == 0) {
                value = get_sensor_B_value();
                name = "B";
            }
            break;
        case 2:
            if (iteration % 4 == 0) {
                value = get_sensor_C_value();
                name = "C";
            }
            break;
        default:
            break;
        }
        if (value == 0.0) {
            continue;
        }

        if (!first) {
            offset +=
                snprintf(buffer + offset,
                         buffer_size - offset, ",");
        }
        first = false;

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

    snprintf(buffer + offset,
             buffer_size - offset, "]}");
    iteration++;
}

// ============= サンプル実行用コード =============
// 出力したJSONをテストするためのメイン関数
int main(void)
{
    // テスト用に4回で終了
    for (size_t i = 0; i < 4; i++) {
        char buffer[256] = {0};
        get_sensors_report(buffer, 256);
        // 本来はJSONを送信する想定
        printf("%s\n", buffer);
        sleep(1);
    }
    return 0;
}