From de383dc573387da4e96fa4bd2a5b4538728748e9 Mon Sep 17 00:00:00 2001 From: czq <860517298@qq.com> Date: Sun, 25 May 2025 12:15:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=89=B9=E5=AE=9A=E6=9E=9A=E4=B8=BE=E5=80=BC?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/inc/bsp_valve.h | 20 ++++++++++++++------ bsp/src/bsp_valve.c | 25 ++++++++++++++++++------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h index 1455f1f..2897755 100644 --- a/bsp/inc/bsp_valve.h +++ b/bsp/inc/bsp_valve.h @@ -55,12 +55,20 @@ extern tmosTaskID vavle_task_id; typedef enum { kCmdCfg = 0X01, - kCmdCloseVavle, - kCmdOpenVavle, - kCmdData, - kCmdTimerClose = 0x05, // 设置定时关阀 - kCmdCancelTimer = 0x06, // 取消定时关阀 - kCmdQueryTimer = 0x07, // 查询定时器状态 + kCmdCloseVavle, // 关阀 + kCmdOpenVavle, // 开阀 + kCmdData, // 命令数据(心跳数据) + kValveCmdOverPressure, // 超压关阀 + kValveCmdUnderPressure, // 欠压关阀 + kValveCmdOverCurrent, // 过流关阀 + kValveCmdMicroLeak, // 微漏关阀 + kValveCmdTimer, // 定时关阀 + kValveCmdOpenWithStove, // 开灶开阀 + kValveCmdCloseWithStove, // 关灶关阀 + kValveCmdOverTemperature, // 超温关阀 + kValveCmdDelayClose, // 延时关阀 + kValveCmdManualClose, // 手动关阀 + kValveCmdTimeResp, // 设置定时关阀时间响应 } TeFrameCmd; typedef struct __attribute__((packed)) diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index eefca7d..419d9ab 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -30,6 +30,7 @@ TsValveData gValveData = {0}; TsRawFrameData RelyData; TsTimerCloseState gTimerCloseState = {0}; +static TeFrameCmd gValveCloseReason = kCmdCloseVavle; // 默认为普通关阀命令 tmosTaskID vavle_task_id = INVALID_TASK_ID; @@ -190,30 +191,32 @@ static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 处理TMOS消息函 break; case kCmdCloseVavle: // 关阀命令 logDebug("kCmdCloseVavle"); + gValveCloseReason = kCmdCloseVavle; // 确保使用普通关阀命令 tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); - break; case kCmdOpenVavle: // 开阀命令 logDebug("kCmdOpenVavle"); tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT); break; - case kCmdTimerClose: // 设置定时关阀命令 + case kValveCmdTimer: // 设置定时关阀命令 { uint8_t result = 0; if (HostFrameData->len >= 4) { uint32_t minutes = 0; tmos_memcpy(&minutes, HostFrameData->data, 4); // 安全的内存拷贝 result = BSP_VALVE_SetTimerClose(minutes); - logDebug("kCmdTimerClose: %d minutes, result: %d", minutes, result); + logDebug("kValveCmdTimer: %d minutes, result: %d", minutes, result); } // 生成响应: 状态(1字节) + 设置的分钟数(4字节) uint8_t response[5] = {result}; tmos_memcpy(&response[1], &gTimerCloseState.timer_minutes, 4); // 安全的内存拷贝 - GenerateRawFrame(&RelyData, kCmdTimerClose, response, 5); + GenerateRawFrame(&RelyData, kValveCmdTimer, response, 5); tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); break; } + // 定时器取消和查询功能暂时屏蔽 + /* case kCmdCancelTimer: // 取消定时关阀命令 { uint8_t result = BSP_VALVE_CancelTimerClose(); @@ -233,6 +236,7 @@ static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 处理TMOS消息函 tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); break; } + */ default: logError("Invalid command"); break; @@ -311,7 +315,10 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀 LED_ALL_CLOSE; tmos_memset(&RelyData, 0, sizeof(RelyData)); - BSP_VALVE_Generate_ValveResponse(&RelyData, kCmdCloseVavle, 1); + BSP_VALVE_Generate_ValveResponse(&RelyData, gValveCloseReason, 1); + + // 重置为默认值 + gValveCloseReason = kCmdCloseVavle; tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); @@ -378,7 +385,8 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀 logDebug("gValveData.switch_status %d",gValveData.switch_status); if(gValveData.switch_status != kClosed) { - tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); + gValveCloseReason = kValveCmdUnderPressure; // 设置为欠压关阀 + tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); } } else if (gValveData.bat <= LOW_VABAT_ALARM_VALUE) @@ -428,12 +436,15 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀 gTimerCloseState.is_active = 0; gTimerCloseState.timer_minutes = 0; + // 设置关阀原因为定时关阀 + gValveCloseReason = kValveCmdTimer; + // 触发关阀动作 tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); // 发送定时关阀完成通知 uint8_t notification = 1; // 定时关阀完成 - GenerateRawFrame(&RelyData, kCmdTimerClose, ¬ification, 1); + GenerateRawFrame(&RelyData, kValveCmdTimeResp, ¬ification, 1); tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); return (events ^ VAVLE_TIMER_CLOSE_EVT);