113 lines
2.3 KiB
C++
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;
|
|
}
|
|
} |