esp-openclaw-node/examples/common/esp_openclaw_node_example_saved_session_reconnect.c

106 lines
3.2 KiB
C

/*
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "esp_openclaw_node_example_saved_session_reconnect.h"
#include "esp_openclaw_node_wifi.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
static const char *TAG = "oc_reconnect";
static const char *DEFAULT_TASK_NAME = "esp_openclaw_node_reconnect";
static void esp_openclaw_node_example_saved_session_reconnect_task(void *arg)
{
esp_openclaw_node_example_saved_session_reconnect_t *state = arg;
const esp_openclaw_node_connect_request_t request = {
.source = ESP_OPENCLAW_NODE_CONNECT_SOURCE_SAVED_SESSION,
.gateway_uri = NULL,
.value = NULL,
};
for (;;) {
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
if (!esp_openclaw_node_wifi_wait_for_connection(portMAX_DELAY)) {
continue;
}
if (!esp_openclaw_node_has_saved_session(state->node)) {
ESP_LOGI(TAG, "saved-session reconnect skipped because no saved session is available");
continue;
}
vTaskDelay(pdMS_TO_TICKS(1000));
esp_err_t err = esp_openclaw_node_request_connect(state->node, &request);
if (err == ESP_OK) {
ESP_LOGI(TAG, "requested saved-session reconnect");
} else if (err != ESP_ERR_INVALID_STATE) {
ESP_LOGW(TAG, "saved-session reconnect request failed: %s", esp_err_to_name(err));
}
}
}
esp_err_t esp_openclaw_node_example_saved_session_reconnect_start(
esp_openclaw_node_example_saved_session_reconnect_t *state,
esp_openclaw_node_handle_t node,
const char *task_name)
{
if (state == NULL || node == NULL) {
return ESP_ERR_INVALID_ARG;
}
if (state->task != NULL) {
return ESP_ERR_INVALID_STATE;
}
state->node = node;
BaseType_t task_ok = xTaskCreate(
esp_openclaw_node_example_saved_session_reconnect_task,
task_name != NULL ? task_name : DEFAULT_TASK_NAME,
4096,
state,
5,
&state->task);
if (task_ok != pdPASS) {
state->node = NULL;
state->task = NULL;
return ESP_ERR_NO_MEM;
}
xTaskNotifyGive(state->task);
return ESP_OK;
}
void esp_openclaw_node_example_saved_session_reconnect_handle_event(
esp_openclaw_node_example_saved_session_reconnect_t *state,
esp_openclaw_node_event_t event,
const void *event_data)
{
if (state == NULL || state->task == NULL) {
return;
}
bool should_retry = false;
if (event == ESP_OPENCLAW_NODE_EVENT_CONNECT_FAILED) {
const esp_openclaw_node_connect_failed_event_t *failed = event_data;
should_retry =
failed != NULL &&
(failed->reason == ESP_OPENCLAW_NODE_CONNECT_FAILURE_TRANSPORT_START_FAILED ||
failed->reason == ESP_OPENCLAW_NODE_CONNECT_FAILURE_CONNECTION_LOST);
} else if (event == ESP_OPENCLAW_NODE_EVENT_DISCONNECTED) {
const esp_openclaw_node_disconnected_event_t *disconnected = event_data;
should_retry =
disconnected != NULL &&
disconnected->reason == ESP_OPENCLAW_NODE_DISCONNECTED_REASON_CONNECTION_LOST;
}
if (should_retry) {
xTaskNotifyGive(state->task);
}
}