From 2bd3e50c94c9aae1760ab880c63bc40d367b0b0e Mon Sep 17 00:00:00 2001 From: czq <860517298@qq.com> Date: Sun, 25 May 2025 13:47:23 +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=9D=A1=E4=BB=B6=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=BC=80=E5=85=B3=E9=98=80=E5=90=8E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E8=93=9D=E7=89=99=E4=B8=8A=E6=8A=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/inc/bsp_valve.h | 5 ++++ bsp/src/bsp_bmp390.c | 62 ++++++++++++++-------------------------- bsp/src/bsp_valve.c | 67 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 82 insertions(+), 52 deletions(-) diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h index 2897755..f979235 100644 --- a/bsp/inc/bsp_valve.h +++ b/bsp/inc/bsp_valve.h @@ -69,6 +69,8 @@ typedef enum kValveCmdDelayClose, // 延时关阀 kValveCmdManualClose, // 手动关阀 kValveCmdTimeResp, // 设置定时关阀时间响应 + kValveCmdLowBatClose, // 低电量关阀 + kValveCmdManualOpen, // 手动开阀 } TeFrameCmd; typedef struct __attribute__((packed)) @@ -143,6 +145,9 @@ void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData); +uint8_t BSP_VALVE_Close(TeFrameCmd close_reason); +uint8_t BSP_VALVE_Open(TeFrameCmd open_reason); + static uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes); static uint8_t BSP_VALVE_CancelTimerClose(void); static uint32_t BSP_VALVE_GetRemainingMinutes(void); diff --git a/bsp/src/bsp_bmp390.c b/bsp/src/bsp_bmp390.c index 356b604..1127847 100644 --- a/bsp/src/bsp_bmp390.c +++ b/bsp/src/bsp_bmp390.c @@ -62,9 +62,6 @@ typedef struct // 微泄漏相关 uint8_t micro_leak_count; // 微泄漏检测计数 uint8_t micro_leak_flag; // 微泄漏标志 - - // 超温相关 - uint8_t over_temp_flag; // 超温标志 // 延时关阀相关 uint8_t auto_close_enabled; // 延时关阀功能是否启用 @@ -964,24 +961,22 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) logError("超压关阀"); logDebug("in_press = %d; over_press = %d", ValveRawData.in_press, ValveInfo.over_press); - VALVE_CLOSE(); + BSP_VALVE_Close(kValveCmdOverPressure); // 使用超压关阀原因 fault_state = 1; // 超压关阀时停止延时关阀功能 stopAutoCloseTimer(); - tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); } // 欠压检测 - // else if (ValveRawData.in_press <= ValveInfo.low_press) - // { - // VALVE_CLOSE(); + else if (ValveRawData.in_press <= ValveInfo.low_press) + { + BSP_VALVE_Close(kValveCmdUnderPressure); // 使用欠压关阀原因 - // fault_state = 2; - // // 欠压关阀时停止延时关阀功能 - // stopAutoCloseTimer(); - // tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); - // logError("******************************"); - // logError("欠压关阀"); - // } + fault_state = 2; + // 欠压关阀时停止延时关阀功能 + stopAutoCloseTimer(); + logError("******************************"); + logError("欠压关阀"); + } #if 1 // 1、过流自动关闭: // 进气端压力2kpa时,额定流量调到0.9 @@ -1009,11 +1004,10 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) else { keydown_time = 0; - VALVE_CLOSE(); + BSP_VALVE_Close(kValveCmdOverCurrent); // 使用过流关阀原因 logError("******************************"); fault_state = 3; - tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); logDebug("Over current status !"); } } @@ -1038,8 +1032,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) { logDebug("[%d]: in_press = %d; out_press = %d; in_out_press_diff = %d", i, ValveRawData_buffer[i].in_press, ValveRawData_buffer[i].out_press, ValveRawData_buffer[i].in_out_press_diff); } - VALVE_OPEN(); - tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); + BSP_VALVE_Open(kValveCmdOpenWithStove); // 使用点火开阀原因 } // else // { @@ -1053,7 +1046,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) } // 超温关阀功能:检测至少两个传感器的温度超过阈值 - if (!valve_safety.over_temp_flag && gValveData.switch_status == kOpened) + if (gValveData.switch_status == kOpened) { // 计算超过阈值的传感器数量 uint8_t over_temp_count = 0; @@ -1067,8 +1060,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) if (over_temp_count >= 2) { logDebug("Over temperature detected! T1=%d, T2=%d, T3=%d", T[0], T[1], T[2]); - valve_safety.over_temp_flag = 1; - motor_flag = 2; // 触发关阀 + BSP_VALVE_Close(kValveCmdOverTemperature); } } } @@ -1079,33 +1071,21 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) { motor_flag = 0; LED_VALVE_OPEN; - VALVE_OPEN(); + BSP_VALVE_Open(kValveCmdManualOpen); // 使用普通开阀命令 keydown_flag = 1; IotFlag_t.Valve_Open_flag = 1; fault_state = 0; logDebug("motor/LED open!!!"); - tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); } else if (motor_flag == 2) { motor_flag = 0; LED_VALVE_CLOSE; - VALVE_CLOSE(); - // fault_state = 4; - // 微泄漏关阀后重置标志 - if (valve_safety.micro_leak_flag) - { - valve_safety.micro_leak_flag = 0; - logDebug("Micro leak protection activated"); - } - // 超温关阀后重置标志 - if (valve_safety.over_temp_flag) - { - valve_safety.over_temp_flag = 0; - logDebug("Over temperature protection activated"); - } + + // 直接使用普通关阀命令 + BSP_VALVE_Close(kValveCmdManualClose); + // fault_state = 4; logDebug("motor/LED close!!!"); - tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); } else if (motor_flag == 3) { @@ -1160,7 +1140,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) logError("6次检测均确认无流量,总耗时: %d ms", BSP_Get_Tick() - valve_safety.auto_close_start_time); // 执行关阀动作 - motor_flag = 2; // 触发关阀 + BSP_VALVE_Close(kValveCmdDelayClose); // 使用延时关阀原因 // 停止延时关阀功能 stopAutoCloseTimer(); @@ -1195,7 +1175,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) logError("延时关阀:超时保护,强制关闭阀门"); // 强制执行关阀动作 - motor_flag = 2; // 触发关阀 + BSP_VALVE_Close(kValveCmdDelayClose); // 使用延时关阀原因 // 停止延时关阀功能 stopAutoCloseTimer(); diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index 419d9ab..3a367bd 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -31,6 +31,7 @@ TsValveData gValveData = {0}; TsRawFrameData RelyData; TsTimerCloseState gTimerCloseState = {0}; static TeFrameCmd gValveCloseReason = kCmdCloseVavle; // 默认为普通关阀命令 +static TeFrameCmd gValveOpenReason = kCmdOpenVavle; // 默认为普通开阀命令 tmosTaskID vavle_task_id = INVALID_TASK_ID; @@ -191,13 +192,12 @@ 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); + BSP_VALVE_Close(kCmdCloseVavle); // 使用普通关阀命令 break; case kCmdOpenVavle: // 开阀命令 logDebug("kCmdOpenVavle"); - tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT); + BSP_VALVE_Open(kCmdOpenVavle); // 使用普通开阀命令 break; case kValveCmdTimer: // 设置定时关阀命令 { @@ -363,8 +363,15 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀 VALVE_STOP(); LED_ALL_CLOSE; + // 更新阀门状态 + gValveData.switch_status = kOpened; + + // 生成响应 tmos_memset(&RelyData, 0, sizeof(RelyData)); - BSP_VALVE_Generate_ValveResponse(&RelyData, kCmdOpenVavle, 1); + BSP_VALVE_Generate_ValveResponse(&RelyData, gValveOpenReason, 1); + + // 重置为默认值 + gValveOpenReason = kCmdOpenVavle; tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); BSP_RequestSleep(); @@ -385,8 +392,7 @@ 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) { - gValveCloseReason = kValveCmdUnderPressure; // 设置为欠压关阀 - tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); + BSP_VALVE_Close(kValveCmdLowBatClose); // 低电量关阀命令 } } else if (gValveData.bat <= LOW_VABAT_ALARM_VALUE) @@ -436,11 +442,8 @@ 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); + // 使用统一接口关阀 + BSP_VALVE_Close(kValveCmdTimer); // 发送定时关阀完成通知 uint8_t notification = 1; // 定时关阀完成 @@ -546,4 +549,46 @@ static uint32_t BSP_VALVE_GetRemainingMinutes(void) return (remaining_ms / 60000) + 1; // 向上取整到分钟 } +/** + * @brief 统一的关阀接口函数 + * @param close_reason 关阀原因,使用TeFrameCmd中定义的枚举值 + * @return 操作结果 + */ +uint8_t BSP_VALVE_Close(TeFrameCmd close_reason) +{ + // 如果阀门已经关闭,则不重复操作 + if(gValveData.switch_status == kClosed) { + return 1; + } + + // 设置关阀原因 + gValveCloseReason = close_reason; + + // 触发关阀事件 + tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); + + return 1; +} + +/** + * @brief 统一的开阀接口函数 + * @param open_reason 开阀原因,使用TeFrameCmd中定义的枚举值 + * @return 操作结果 + */ +uint8_t BSP_VALVE_Open(TeFrameCmd open_reason) +{ + // 如果阀门已经打开,则不重复操作 + if(gValveData.switch_status == kOpened) { + return 1; + } + + // 记录开阀原因 + gValveOpenReason = open_reason; + + // 触发开阀事件 + tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT); + + return 1; +} +