#ifndef REMOTE_CONTROL_H
#define REMOTE_CONTROL_H

#include "esp_err.h"
#include "cJSON.h"

/** BLE FFE1 / 遥控 JSON：单帧 UTF-8 最大字节数（不含结尾 NUL） */
#define REMOTE_CTRL_JSON_MAX_BYTES 2048

/** 手机 → 设备：清空链路会话（中止 OTA、停车、丢弃武装态） */
#define REMOTE_CTRL_MSG_LINK_RESET 2

/** 手机 → 设备：串口/BLE 链路已连接（App 侧 open 成功）；设备回 OTA 询问 JSON(1002) */
#define REMOTE_CTRL_MSG_LINK_READY  6

/** 遥控超时：超过该时间未收到控制 JSON 则停车（ms） */
#define RC_CMD_TIMEOUT_MS 500

/** 固件超时停车后，经链路 Notify 推送停车 JSON 的周期（ms） */
#define RC_STOP_NOTIFY_PERIOD_MS 300

/** 解析 MQTT/BLE 下发的 JSON，执行 OTA、重启、PWM/GPIO 控制 */
void remote_control_apply_json(const char *json);

/** 中止 OTA 并复位遥控超时状态（BLE 断开/卡顿恢复） */
void remote_control_link_reset(void);

/** 链路正在接收一条控制 JSON 的片段，用于避免分片期间误触发超时停车 */
void remote_control_note_rx_activity(void);

/** 构造停车专用 JSON（message_type=3，speed/direction/mode/val 均为 0） */
char *remote_control_stop_json_malloc(void);

/** 注册停车状态 Notify 回调（BLE 0xFFE3 / UART 行）；json 由回调方发送后勿 free */
typedef void (*remote_control_stop_notify_cb_t)(const char *json);
void remote_control_set_stop_notify_cb(remote_control_stop_notify_cb_t cb);

/** 停止周期停车 JSON 推送任务（UART 对端离线等） */
void remote_control_stop_notify_end(void);

/** 已解析的 JSON 根节点，json_raw 用于无 head 时的 OTA 等需原文场景 */
void remote_control_apply_json_root(cJSON *root, const char *json_raw);

/**
 * @brief 启动遥控超时守护任务
 * 500ms 未收到控制命令将自动停止车辆
 */
esp_err_t remote_control_watchdog_start(void);

/**
 * @brief 停止遥控超时守护任务
 */
void remote_control_watchdog_stop(void);

#endif
