#include "sender_task.h" #include "sampler_task.h" #include "ringbuf.h" #include "protocol.h" #include #include #include "ws.h" extern "C" { #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_timer.h" } static uint32_t last_send_ms = 0; static int64_t last_send_ts = 0; static void sender_task(void* arg) { ringbuf_t* rb = sampler_get_buffer(); last_send_ts = time(NULL); last_send_ms = esp_timer_get_time() / 1000; while (1) { vTaskDelay(pdMS_TO_TICKS(50000)); // 1 мин^-1 char buf[512]; uint32_t now_ms = esp_timer_get_time() / 1000; time_t now_ts = time(NULL); sample_t tmp[RINGBUF_SIZE]; ringbuf_copy(rb, tmp); int out_values[RINGBUF_SIZE * 2]; int count = 0; for (int i = 0; i < RINGBUF_SIZE; i++) { if (tmp[i].ts_ms >= last_send_ms) { uint32_t delta = tmp[i].ts_ms - last_send_ms; // кладём delta + value out_values[count * 2 + 0] = delta; out_values[count * 2 + 1] = tmp[i].value; count++; } } int len = build_telemetry( buf, sizeof(buf), last_send_ts, 1, // device_id (пока захардкожен) "t", // metric "ds18b20", // source "c_x100", // unit out_values, count ); if (len > 0) { if (ws_is_connected()) { ws_send(buf); } else { printf("%s\n", buf); // fallback } } else { printf("build_telemetry failed\n"); } last_send_ms = now_ms; last_send_ts = now_ts; } } void sender_task_start() { xTaskCreate( sender_task, "sender", 4096, NULL, 5, NULL ); }