M2 protocol: replace toggle with idempotent explicit control

This commit is contained in:
2026-10-10 00:06:42 +08:00
parent 6d9f1f54a8
commit 3b00ed30d7
+24 -9
View File
@@ -336,6 +336,8 @@ static bool __attribute__((unused)) find_parameter_value(const uint8_t *cmd, uin
* *
* 支持的命令(FilmForge): * 支持的命令(FilmForge):
* - M1: 单次查询温度值(payload 为 ASCII 摄氏度,如 "23.8";OPEN/SHRT=故障) * - M1: 单次查询温度值(payload 为 ASCII 摄氏度,如 "23.8";OPEN/SHRT=故障)
* - M2: 查询连续上报状态(payload: "ON <ms>" 或 "OFF")
* - M2S<ms>: 设置连续上报间隔(100~60000)并开启;M2S0 停止
* - M888: 软件复位 * - M888: 软件复位
* - M999: 输出固件版本号(v<板卡码>.<主>.<次>.<修订>) * - M999: 输出固件版本号(v<板卡码>.<主>.<次>.<修订>)
* - M9999: 进入 OTA 模式(复位进 Bootloader) * - M9999: 进入 OTA 模式(复位进 Bootloader)
@@ -399,18 +401,26 @@ void handle_command(const uint8_t *frame, uint8_t len) {
return; return;
/* ========================================== /* ==========================================
* M2 连续温度上报开关(画曲线用) * M2 连续温度上报控制(画曲线用,全部幂等可重发)
* M2 : 切换连续上报 使能/停止(默认间隔 500ms) * M2 : 查询上报状态(payload: "ON <ms>" 或 "OFF")
* M2S<ms> : 设置上报间隔(100~60000,10ms 步进)并开启上报 * M2S<ms> : 100~60000 设置上报间隔(10ms 步进)并开启
* M2S0 : 停止上报
* 上报帧格式与 M1 响应相同:B5 F0 LEN [ASCII 摄氏度] CRC * 上报帧格式与 M1 响应相同:B5 F0 LEN [ASCII 摄氏度] CRC
* 注意:勿用"翻转"语义——链路 ack 丢失重发时翻转类命令会状态错乱,
* 本命令族全部为幂等的显式设置。
* ========================================== */ * ========================================== */
case 2u: case 2u:
{ {
uint32_t period = 0; uint32_t period = 0;
if (find_parameter_value(&cmd[cmd_index], (uint8_t)(cmd_len - cmd_index), 'S', &period)) { if (find_parameter_value(&cmd[cmd_index], (uint8_t)(cmd_len - cmd_index), 'S', &period)) {
/* 带参数:设置间隔并开启 */ if (period == 0U) {
if (period >= 100U && period <= 60000U) { /* M2S0: 停止上报 */
s_temp_report_enabled = false;
s_temp_report_counter = 0;
send_response(RESP_TYPE_OK, s_report_status_ok, sizeof(s_report_status_ok));
} else if (period >= 100U && period <= 60000U) {
/* M2S<ms>: 设置间隔并开启 */
s_temp_report_period_ms = (uint16_t)period; s_temp_report_period_ms = (uint16_t)period;
s_temp_report_enabled = true; s_temp_report_enabled = true;
s_temp_report_counter = 0; s_temp_report_counter = 0;
@@ -419,10 +429,15 @@ void handle_command(const uint8_t *frame, uint8_t len) {
send_response(RESP_TYPE_PARAM_ERR, s_report_status_err, sizeof(s_report_status_err)); send_response(RESP_TYPE_PARAM_ERR, s_report_status_err, sizeof(s_report_status_err));
} }
} else { } else {
/* 无参数:切换使能 */ /* M2: 查询上报状态 */
s_temp_report_enabled = !s_temp_report_enabled; char state_str[12];
s_temp_report_counter = 0; uint8_t n;
send_response(RESP_TYPE_OK, s_report_status_ok, sizeof(s_report_status_ok)); if (s_temp_report_enabled) {
n = (uint8_t)sprintf(state_str, "ON %u", s_temp_report_period_ms);
} else {
n = (uint8_t)sprintf(state_str, "OFF");
}
send_response(RESP_TYPE_OK, (const uint8_t *)state_str, n);
} }
COMMAND_DEBUG("M2 report %s, period=%ums", COMMAND_DEBUG("M2 report %s, period=%ums",
s_temp_report_enabled ? "ON" : "OFF", s_temp_report_period_ms); s_temp_report_enabled ? "ON" : "OFF", s_temp_report_period_ms);