/* Synthetic samples only. Target: esp32, ESP-IDF v5.3.2. */
#include <inttypes.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"

typedef struct {
    uint32_t seq;
    uint16_t millivolts;
} sample_t;

static QueueHandle_t samples;
static const char *TAG = "node";

static void produce(void *arg) {
    (void)arg;
    uint32_t seq = 0;
    for (;;) {
        sample_t value = {.seq = seq, .millivolts = (uint16_t)(1000 + seq % 100)};
        ++seq;
        if (xQueueSend(samples, &value, 0) != pdPASS) {
            ESP_LOGW(TAG, "queue full; dropped seq=%" PRIu32, value.seq);
        }
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

static void consume(void *arg) {
    (void)arg;
    sample_t value;
    for (;;) {
        if (xQueueReceive(samples, &value, portMAX_DELAY) == pdPASS) {
            ESP_LOGI(TAG, "synthetic seq=%" PRIu32 " mV=%u", value.seq,
                     (unsigned)value.millivolts);
        }
    }
}

void app_main(void) {
    samples = xQueueCreate(4, sizeof(sample_t));
    if (samples == NULL) {
        ESP_LOGE(TAG, "queue allocation failed");
        abort();
    }
    if (xTaskCreate(consume, "consume", 4096, NULL, 4, NULL) != pdPASS ||
        xTaskCreate(produce, "produce", 4096, NULL, 5, NULL) != pdPASS) {
        ESP_LOGE(TAG, "task creation failed");
        abort();
    }
}
