added README and WS client watchdog
This commit is contained in:
@@ -5,15 +5,32 @@
|
||||
#include <string.h>
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/semphr.h>
|
||||
#include <freertos/timers.h>
|
||||
|
||||
static const char *TAG = "ws_client";
|
||||
|
||||
#define WS_WATCHDOG_PERIOD_MS 5000
|
||||
#define WS_DATA_TIMEOUT_MS 10000
|
||||
|
||||
static esp_websocket_client_handle_t s_client = NULL;
|
||||
static pi_stats_t s_stats = {};
|
||||
static SemaphoreHandle_t s_stats_mutex = NULL;
|
||||
static ws_state_t s_state = WS_STATE_DISCONNECTED;
|
||||
static ws_data_callback_t s_data_cb = NULL;
|
||||
static ws_state_callback_t s_state_cb = NULL;
|
||||
static TickType_t s_last_data_tick = 0;
|
||||
static TimerHandle_t s_watchdog_timer = NULL;
|
||||
|
||||
static void watchdog_callback(TimerHandle_t timer)
|
||||
{
|
||||
(void)timer;
|
||||
if (s_state == WS_STATE_CONNECTED &&
|
||||
(xTaskGetTickCount() - s_last_data_tick) > pdMS_TO_TICKS(WS_DATA_TIMEOUT_MS)) {
|
||||
ESP_LOGW(TAG, "WS watchdog: no data for %ds, forcing reconnect",
|
||||
WS_DATA_TIMEOUT_MS / 1000);
|
||||
esp_websocket_client_close(s_client, pdMS_TO_TICKS(2000));
|
||||
}
|
||||
}
|
||||
|
||||
static void set_state(ws_state_t state)
|
||||
{
|
||||
@@ -83,6 +100,8 @@ static void parse_stats_json(const char *data, int len)
|
||||
s_stats.valid = true;
|
||||
xSemaphoreGive(s_stats_mutex);
|
||||
|
||||
s_last_data_tick = xTaskGetTickCount();
|
||||
|
||||
if (s_data_cb) {
|
||||
s_data_cb(&s_stats);
|
||||
}
|
||||
@@ -99,6 +118,7 @@ static void ws_event_handler(void *arg, esp_event_base_t event_base,
|
||||
switch (event_id) {
|
||||
case WEBSOCKET_EVENT_CONNECTED:
|
||||
ESP_LOGI(TAG, "WebSocket connected");
|
||||
s_last_data_tick = xTaskGetTickCount();
|
||||
set_state(WS_STATE_CONNECTED);
|
||||
break;
|
||||
case WEBSOCKET_EVENT_DISCONNECTED:
|
||||
@@ -132,6 +152,9 @@ void ws_client_init(const char *uri)
|
||||
s_client = esp_websocket_client_init(&config);
|
||||
esp_websocket_register_events(s_client, WEBSOCKET_EVENT_ANY, ws_event_handler, NULL);
|
||||
|
||||
s_watchdog_timer = xTimerCreate("ws_wd", pdMS_TO_TICKS(WS_WATCHDOG_PERIOD_MS),
|
||||
pdTRUE, NULL, watchdog_callback);
|
||||
|
||||
ESP_LOGI(TAG, "WS client initialized: %s", uri);
|
||||
}
|
||||
|
||||
@@ -140,12 +163,18 @@ void ws_client_start(void)
|
||||
if (s_client) {
|
||||
set_state(WS_STATE_CONNECTING);
|
||||
esp_websocket_client_start(s_client);
|
||||
if (s_watchdog_timer) {
|
||||
xTimerStart(s_watchdog_timer, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ws_client_stop(void)
|
||||
{
|
||||
if (s_client) {
|
||||
if (s_watchdog_timer) {
|
||||
xTimerStop(s_watchdog_timer, 0);
|
||||
}
|
||||
esp_websocket_client_stop(s_client);
|
||||
set_state(WS_STATE_DISCONNECTED);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user