Files
iot_skeleton/esp32/main/sender_task.cpp
2026-04-24 16:37:04 +03:00

113 lines
2.3 KiB
C++

#include "sender_task.h"
#include "sampler_task.h"
#include "ringbuf.h"
#include "protocol.h"
#include <stdio.h>
#include <time.h>
#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 TaskHandle_t sender_task_handle = nullptr;
static void sender_task(void* arg)
{
ringbuf_t* rb = sampler_get_buffer();
last_send_ts = time(nullptr);
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(nullptr);
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++;
if (count >= RINGBUF_SIZE) break;
}
}
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()
{
if (sender_task_handle == nullptr)
{
xTaskCreate(
sender_task,
"sender",
4096,
nullptr,
5,
&sender_task_handle
);
}
}
void sender_task_stop()
{
if (sender_task_handle != nullptr)
{
vTaskDelete(sender_task_handle);
sender_task_handle = nullptr;
}
}