代码暂存 添加特定条件触发开关阀后数据通过蓝牙上报功能

This commit is contained in:
常正强 2025-05-25 13:47:23 +08:00
parent de383dc573
commit 2bd3e50c94
3 changed files with 82 additions and 52 deletions

View File

@ -69,6 +69,8 @@ typedef enum
kValveCmdDelayClose, // 延时关阀 kValveCmdDelayClose, // 延时关阀
kValveCmdManualClose, // 手动关阀 kValveCmdManualClose, // 手动关阀
kValveCmdTimeResp, // 设置定时关阀时间响应 kValveCmdTimeResp, // 设置定时关阀时间响应
kValveCmdLowBatClose, // 低电量关阀
kValveCmdManualOpen, // 手动开阀
} TeFrameCmd; } TeFrameCmd;
typedef struct __attribute__((packed)) typedef struct __attribute__((packed))
@ -143,6 +145,9 @@ void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd,
void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData); 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_SetTimerClose(uint32_t minutes);
static uint8_t BSP_VALVE_CancelTimerClose(void); static uint8_t BSP_VALVE_CancelTimerClose(void);
static uint32_t BSP_VALVE_GetRemainingMinutes(void); static uint32_t BSP_VALVE_GetRemainingMinutes(void);

View File

@ -63,9 +63,6 @@ typedef struct
uint8_t micro_leak_count; // 微泄漏检测计数 uint8_t micro_leak_count; // 微泄漏检测计数
uint8_t micro_leak_flag; // 微泄漏标志 uint8_t micro_leak_flag; // 微泄漏标志
// 超温相关
uint8_t over_temp_flag; // 超温标志
// 延时关阀相关 // 延时关阀相关
uint8_t auto_close_enabled; // 延时关阀功能是否启用 uint8_t auto_close_enabled; // 延时关阀功能是否启用
uint8_t auto_close_check_count; // 无流量检测次数计数 uint8_t auto_close_check_count; // 无流量检测次数计数
@ -964,24 +961,22 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
logError("超压关阀"); logError("超压关阀");
logDebug("in_press = %d; over_press = %d", ValveRawData.in_press, ValveInfo.over_press); logDebug("in_press = %d; over_press = %d", ValveRawData.in_press, ValveInfo.over_press);
VALVE_CLOSE(); BSP_VALVE_Close(kValveCmdOverPressure); // 使用超压关阀原因
fault_state = 1; fault_state = 1;
// 超压关阀时停止延时关阀功能 // 超压关阀时停止延时关阀功能
stopAutoCloseTimer(); 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) else if (ValveRawData.in_press <= ValveInfo.low_press)
// { {
// VALVE_CLOSE(); BSP_VALVE_Close(kValveCmdUnderPressure); // 使用欠压关阀原因
// fault_state = 2; fault_state = 2;
// // 欠压关阀时停止延时关阀功能 // 欠压关阀时停止延时关阀功能
// stopAutoCloseTimer(); stopAutoCloseTimer();
// tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); logError("******************************");
// logError("******************************"); logError("欠压关阀");
// logError("欠压关阀"); }
// }
#if 1 #if 1
// 1、过流自动关闭 // 1、过流自动关闭
// 进气端压力2kpa时额定流量调到0.9 // 进气端压力2kpa时额定流量调到0.9
@ -1009,11 +1004,10 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
else else
{ {
keydown_time = 0; keydown_time = 0;
VALVE_CLOSE(); BSP_VALVE_Close(kValveCmdOverCurrent); // 使用过流关阀原因
logError("******************************"); logError("******************************");
fault_state = 3; fault_state = 3;
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS));
logDebug("Over current status !"); 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); 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(); BSP_VALVE_Open(kValveCmdOpenWithStove); // 使用点火开阀原因
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS));
} }
// else // 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; 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) if (over_temp_count >= 2)
{ {
logDebug("Over temperature detected! T1=%d, T2=%d, T3=%d", T[0], T[1], T[2]); logDebug("Over temperature detected! T1=%d, T2=%d, T3=%d", T[0], T[1], T[2]);
valve_safety.over_temp_flag = 1; BSP_VALVE_Close(kValveCmdOverTemperature);
motor_flag = 2; // 触发关阀
} }
} }
} }
@ -1079,33 +1071,21 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
{ {
motor_flag = 0; motor_flag = 0;
LED_VALVE_OPEN; LED_VALVE_OPEN;
VALVE_OPEN(); BSP_VALVE_Open(kValveCmdManualOpen); // 使用普通开阀命令
keydown_flag = 1; keydown_flag = 1;
IotFlag_t.Valve_Open_flag = 1; IotFlag_t.Valve_Open_flag = 1;
fault_state = 0; fault_state = 0;
logDebug("motor/LED open!!!"); 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) else if (motor_flag == 2)
{ {
motor_flag = 0; motor_flag = 0;
LED_VALVE_CLOSE; LED_VALVE_CLOSE;
VALVE_CLOSE();
// 直接使用普通关阀命令
BSP_VALVE_Close(kValveCmdManualClose);
// fault_state = 4; // 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");
}
logDebug("motor/LED close!!!"); 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) 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); logError("6次检测均确认无流量,总耗时: %d ms", BSP_Get_Tick() - valve_safety.auto_close_start_time);
// 执行关阀动作 // 执行关阀动作
motor_flag = 2; // 触发关阀 BSP_VALVE_Close(kValveCmdDelayClose); // 使用延时关阀原因
// 停止延时关阀功能 // 停止延时关阀功能
stopAutoCloseTimer(); stopAutoCloseTimer();
@ -1195,7 +1175,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
logError("延时关阀:超时保护,强制关闭阀门"); logError("延时关阀:超时保护,强制关闭阀门");
// 强制执行关阀动作 // 强制执行关阀动作
motor_flag = 2; // 触发关阀 BSP_VALVE_Close(kValveCmdDelayClose); // 使用延时关阀原因
// 停止延时关阀功能 // 停止延时关阀功能
stopAutoCloseTimer(); stopAutoCloseTimer();

View File

@ -31,6 +31,7 @@ TsValveData gValveData = {0};
TsRawFrameData RelyData; TsRawFrameData RelyData;
TsTimerCloseState gTimerCloseState = {0}; TsTimerCloseState gTimerCloseState = {0};
static TeFrameCmd gValveCloseReason = kCmdCloseVavle; // 默认为普通关阀命令 static TeFrameCmd gValveCloseReason = kCmdCloseVavle; // 默认为普通关阀命令
static TeFrameCmd gValveOpenReason = kCmdOpenVavle; // 默认为普通开阀命令
tmosTaskID vavle_task_id = INVALID_TASK_ID; tmosTaskID vavle_task_id = INVALID_TASK_ID;
@ -191,13 +192,12 @@ static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 处理TMOS消息函
break; break;
case kCmdCloseVavle: // 关阀命令 case kCmdCloseVavle: // 关阀命令
logDebug("kCmdCloseVavle"); logDebug("kCmdCloseVavle");
gValveCloseReason = kCmdCloseVavle; // 确保使用普通关阀命令 BSP_VALVE_Close(kCmdCloseVavle); // 使用普通关阀命令
tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
break; break;
case kCmdOpenVavle: // 开阀命令 case kCmdOpenVavle: // 开阀命令
logDebug("kCmdOpenVavle"); logDebug("kCmdOpenVavle");
tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT); BSP_VALVE_Open(kCmdOpenVavle); // 使用普通开阀命令
break; break;
case kValveCmdTimer: // 设置定时关阀命令 case kValveCmdTimer: // 设置定时关阀命令
{ {
@ -363,8 +363,15 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
VALVE_STOP(); VALVE_STOP();
LED_ALL_CLOSE; LED_ALL_CLOSE;
// 更新阀门状态
gValveData.switch_status = kOpened;
// 生成响应
tmos_memset(&RelyData, 0, sizeof(RelyData)); 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); tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
BSP_RequestSleep(); 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); logDebug("gValveData.switch_status %d",gValveData.switch_status);
if(gValveData.switch_status != kClosed) if(gValveData.switch_status != kClosed)
{ {
gValveCloseReason = kValveCmdUnderPressure; // 设置为欠压关阀 BSP_VALVE_Close(kValveCmdLowBatClose); // 低电量关阀命令
tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
} }
} }
else if (gValveData.bat <= LOW_VABAT_ALARM_VALUE) 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.is_active = 0;
gTimerCloseState.timer_minutes = 0; gTimerCloseState.timer_minutes = 0;
// 设置关阀原因为定时关阀 // 使用统一接口关阀
gValveCloseReason = kValveCmdTimer; BSP_VALVE_Close(kValveCmdTimer);
// 触发关阀动作
tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
// 发送定时关阀完成通知 // 发送定时关阀完成通知
uint8_t notification = 1; // 定时关阀完成 uint8_t notification = 1; // 定时关阀完成
@ -546,4 +549,46 @@ static uint32_t BSP_VALVE_GetRemainingMinutes(void)
return (remaining_ms / 60000) + 1; // 向上取整到分钟 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;
}