diff --git a/bsp/inc/bsp_bmp390.h b/bsp/inc/bsp_bmp390.h index 9a62e2a..433e1fb 100644 --- a/bsp/inc/bsp_bmp390.h +++ b/bsp/inc/bsp_bmp390.h @@ -2,6 +2,7 @@ #define __BSP_BMP390_H #include "CH58x_common.h" +#include "bsp_valve.h" #define BMP390_IN_START (0x0001 << 0) #define BMP390_OUT_START (0x0001 << 1) @@ -56,6 +57,29 @@ typedef struct int in_out_press_diff; } TsValveRawData; extern TsValveRawData ValveRawData; +typedef struct +{ + uint8_t auto_open_count; // 自动开阀检测计数 + uint8_t auto_open_flag; // 自动开阀标志 + uint8_t micro_leak_count; // 微泄漏检测计数 + uint8_t micro_leak_flag; // 微泄漏标志 + uint8_t auto_close_enabled; // 延时关阀功能是否启用 + uint8_t auto_close_check_count; // 无流量检测次数计数 + uint8_t auto_close_active; // 延时关阀检测是否激活 + uint32_t auto_close_start_time; // 延时关阀开始时间 + TeFrameCmd lock_reason; // 阀门锁定原因 +} TsValveSafetyStatus; +extern TsValveSafetyStatus valve_safety; +typedef struct +{ + uint16_t over_press; + uint16_t low_press; + uint8_t over_temp; + int over_flow_press_diff_1kpa; + int over_flow_press_diff_2kpa; + int over_flow_press_diff_3kpa; +} TsValveInfo; +extern TsValveInfo ValveInfo; // 微泄漏检测相关函数 void startMicroLeakDetection(void); diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h index 0e6a712..244d657 100644 --- a/bsp/inc/bsp_valve.h +++ b/bsp/inc/bsp_valve.h @@ -33,9 +33,11 @@ extern tmosTaskID vavle_task_id; #define VAVLE_LOW_VBAT_LED_OFF_EVT (0x0001 << 10) // 浣庣數鍘婰ED鍏抽棴浜嬩欢 #define VAVLE_TIMER_CLOSE_EVT (0x0001 << 11) // 瀹氭椂鍏抽榾浜嬩欢 +#define VAVLE_ALARM_LED_REFRESH_EVT (0x0001 << 12) // 鎶ヨLED鍒锋柊浜嬩欢 #define VALVE_LOW_VBAT_ALARM_PERIOD_MS (1600 * 60 * 10) #define VALVE_DECT_PERIOD_MS (1600 * 60 * 10) +#define VALVE_ALARM_LED_REFRESH_PERIOD_MS (1000) // 鎶ヨLED鍒锋柊鍛ㄦ湡锛1绉 #define CHARGE_TIME_MS (1500) @@ -102,6 +104,7 @@ typedef enum kOpened= 0, kClosed, kDisconnect, + kLocked, // 闃闂ㄩ攣瀹氱姸鎬 } TeValveSwitchStatus; typedef struct __attribute__((packed)) @@ -118,6 +121,7 @@ typedef struct __attribute__((packed)) uint8_t bat; // 1B 鐢垫睜鐢靛帇 30=3V,18=1.8V uint8_t humi; // 1B 闃闂ㄦ箍搴 %RH int8_t rssi; + uint8_t Lock; // 1B 闃闂ㄩ攣鐘舵 0=瑙i攣 1=閿佸畾 } TsValveData; extern TsValveData gValveData; @@ -149,6 +153,9 @@ void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData); uint8_t BSP_VALVE_Close(TeFrameCmd close_reason); uint8_t BSP_VALVE_Open(TeFrameCmd open_reason); +uint8_t BSP_VALVE_Lock(TeFrameCmd lock_reason); // 閿佸畾闃闂 +uint8_t BSP_VALVE_Unlock(void); // 瑙i攣闃闂 +uint8_t BSP_VALVE_CheckHazardCleared(void); // 妫鏌ラ殣鎮f槸鍚﹀凡鎺掗櫎 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 277339d..71ef750 100644 --- a/bsp/src/bsp_bmp390.c +++ b/bsp/src/bsp_bmp390.c @@ -6,7 +6,6 @@ #include "log.h" #include "bsp_ml307r.h" #include "SLEEP.h" -#include "bsp_valve.h" uint8_t flag; uint8_t keydown_flag = 0; @@ -16,35 +15,10 @@ uint8_t volatile fault_state = 0; TsValveRawData ValveRawData; TsValveRawData ValveRawData_buffer[5]; -typedef struct -{ - uint16_t over_press; - uint16_t low_press; - uint8_t over_temp; - int over_flow_press_diff_1kpa; - int over_flow_press_diff_2kpa; - int over_flow_press_diff_3kpa; -} TsValveInfo; TsValveInfo ValveInfo; -// 瀹夊叏淇濇姢鐘舵佺粨鏋勪綋 -typedef struct -{ - // 鑷姩寮闃鐩稿叧 - uint8_t auto_open_count; // 鑷姩寮闃妫娴嬭鏁 - uint8_t auto_open_flag; // 鑷姩寮闃鏍囧織 - // 寰硠婕忕浉鍏 - uint8_t micro_leak_count; // 寰硠婕忔娴嬭鏁 - uint8_t micro_leak_flag; // 寰硠婕忔爣蹇 - - // 寤舵椂鍏抽榾鐩稿叧 - uint8_t auto_close_enabled; // 寤舵椂鍏抽榾鍔熻兘鏄惁鍚敤 - uint8_t auto_close_check_count; // 鏃犳祦閲忔娴嬫鏁拌鏁 - uint8_t auto_close_active; // 寤舵椂鍏抽榾妫娴嬫槸鍚︽縺娲 - uint32_t auto_close_start_time; // 寤舵椂鍏抽榾寮濮嬫椂闂 -} TsValveSafetyStatus; // 瀹夊叏鐘舵佸叏灞鍙橀噺 TsValveSafetyStatus valve_safety = {0}; @@ -948,25 +922,26 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) if (ValveRawData.in_press >= ValveInfo.over_press) { logError("******************************"); - logError("瓒呭帇鍏抽榾"); + logError("瓒呭帇鍏抽榾骞堕攣瀹"); logDebug("in_press = %d; over_press = %d", ValveRawData.in_press, ValveInfo.over_press); BSP_VALVE_Close(kValveCmdOverPressure); // 浣跨敤瓒呭帇鍏抽榾鍘熷洜 + BSP_VALVE_Lock(kValveCmdOverPressure); // 閿佸畾闃闂紝闃叉鍐嶆寮鍚 fault_state = 1; // 瓒呭帇鍏抽榾鏃跺仠姝㈠欢鏃跺叧闃鍔熻兘 stopAutoCloseTimer(); } // 娆犲帇妫娴 - // else if (ValveRawData.in_press <= ValveInfo.low_press) - // { - // BSP_VALVE_Close(kValveCmdUnderPressure); // 浣跨敤娆犲帇鍏抽榾鍘熷洜 - - // fault_state = 2; - // // 娆犲帇鍏抽榾鏃跺仠姝㈠欢鏃跺叧闃鍔熻兘 - // stopAutoCloseTimer(); - // logError("******************************"); - // logError("娆犲帇鍏抽榾"); - // } + else if (ValveRawData.in_press <= ValveInfo.low_press) + { + BSP_VALVE_Close(kValveCmdUnderPressure); // 浣跨敤娆犲帇鍏抽榾鍘熷洜 + BSP_VALVE_Lock(kValveCmdUnderPressure); // 閿佸畾闃闂紝闃叉鍐嶆寮鍚 + fault_state = 2; + // 娆犲帇鍏抽榾鏃跺仠姝㈠欢鏃跺叧闃鍔熻兘 + stopAutoCloseTimer(); + logError("******************************"); + logError("娆犲帇鍏抽榾"); + } #if 1 // 1銆佽繃娴佽嚜鍔ㄥ叧闂細 // 杩涙皵绔帇鍔2kpa鏃讹紝棰濆畾娴侀噺璋冨埌0.9 @@ -994,8 +969,13 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) else { keydown_time = 0; - BSP_VALVE_Close(kValveCmdOverCurrent); // 浣跨敤杩囨祦鍏抽榾鍘熷洜 logError("******************************"); + logError("杩囨祦鍏抽榾骞堕攣瀹"); + logDebug("in_out_press_diff = %d; threshold = %d", ValveRawData.in_out_press_diff, ValveInfo.over_flow_press_diff_2kpa); + + // 鍏堝叧闃鍐嶉攣瀹 + BSP_VALVE_Close(kValveCmdOverCurrent); // 浣跨敤杩囨祦鍏抽榾鍘熷洜 + BSP_VALVE_Lock(kValveCmdOverCurrent); // 閿佸畾闃闂紝闃叉鍐嶆寮鍚 fault_state = 3; logDebug("Over current status !"); @@ -1055,7 +1035,18 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) } } - // logDebug("motor_flag_end = %d",motor_flag); + // 妫鏌ラ榾闂ㄦ槸鍚﹀浜庨攣瀹氱姸鎬侊紝濡傛灉鏄垯妫鏌ラ殣鎮f槸鍚﹀凡鎺掗櫎 + if (gValveData.Lock == 1) + { + // 妫鏌ラ殣鎮f槸鍚﹀凡鎺掗櫎锛堣繃娴侀櫎澶栵紝杩囨祦鍙兘鎵嬪姩瑙i攣锛 + if (valve_safety.lock_reason != kValveCmdOverCurrent && BSP_VALVE_CheckHazardCleared()) + { + // 闅愭偅宸叉帓闄わ紝鑷姩瑙i攣 + BSP_VALVE_Unlock(); + } + } + + // logDebug("motor_flag_end = %d",motor_flag); // 鎵嬪姩鍏抽榾 if (motor_flag == 1) { @@ -1187,6 +1178,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) logError("妫娴嬪埌寰硠婕"); BSP_VALVE_Close(kValveCmdMicroLeak); // 浣跨敤寰硠婕忓叧闃鍘熷洜 + BSP_VALVE_Lock(kValveCmdMicroLeak); // 閿佸畾闃闂紝闃叉鍐嶆寮鍚 valve_safety.micro_leak_count = 0; // 閲嶇疆璁℃暟鍣 // 寰硠婕忓叧闃鏃跺仠姝㈠欢鏃跺叧闃鍔熻兘 diff --git a/bsp/src/bsp_key.c b/bsp/src/bsp_key.c index 3d737bf..1fd4eaa 100644 --- a/bsp/src/bsp_key.c +++ b/bsp/src/bsp_key.c @@ -36,7 +36,11 @@ void app_task_handler(TeAppEvtType app_evt_type) } case kKeyLong: logDebug("button long press"); - + if (gValveData.Lock == 1) + { + BSP_VALVE_Unlock(); + logInfo("闀挎寜5绉掓墜鍔ㄨВ閿"); + } break; case kKeyRelease: BSP_KEY_EnterLowpower(); diff --git a/bsp/src/bsp_ml307r.c b/bsp/src/bsp_ml307r.c index edce85d..06e6c0c 100644 --- a/bsp/src/bsp_ml307r.c +++ b/bsp/src/bsp_ml307r.c @@ -564,14 +564,6 @@ void BSP_Module_Send_Data(uint8_t* data, uint8_t len) at_send_data(ml307r_obj, &attr, data, len); } -// 设备状态枚举 -typedef enum { - DEVICE_STATUS_NORMAL = 0, // 正常状态 - DEVICE_STATUS_CLOSED, // 关闭状态 - DEVICE_STATUS_FAULT, // 故障状态 - DEVICE_STATUS_LOW_BATTERY // 低电量状态 -} device_status_t; - // 定义JSON缓冲区大小 #define JSON_BUFFER_SIZE 512 diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index 719a217..7adfb86 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -175,7 +175,7 @@ void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, TeFrameCmd cmd) // 鐢熸垚 ValveData.rssi = gValveData.rssi; // 鎵撳嵃ValveData鐨勬墍鏈夊瓧娈 - logDebug("ValveData 璇︾粏淇℃伅:\r\n" + logDebug("ValveData info:\r\n" "switch_status: %d\r\n" "temp: %d\r\n" "in_pressure: %d\r\n" @@ -239,6 +239,12 @@ static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 澶勭悊TMOS娑堟伅鍑 BSP_VALVE_Generate_Data(&RelyData, kCmdOpenVavle); tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); } + else if(OpenStatus == 2) + { + logWarning("?????????????????????????"); + BSP_VALVE_Generate_Data(&RelyData, valve_safety.lock_reason); + tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); + } break; case KValveCmdTimeSet: // 璁剧疆瀹氭椂鍏抽榾鍛戒护 { @@ -501,6 +507,16 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 闃 return (events ^ VAVLE_TIMER_CLOSE_EVT); } + if (events & VAVLE_ALARM_LED_REFRESH_EVT) // 卤篓戮炉LED脣垄脨脗脢脗录镁 + { + if (gValveData.Lock == 1) + { + LED_ALARM_OPEN; + DelayMs(10); + tmos_start_task(vavle_task_id, VAVLE_ALARM_LED_REFRESH_EVT, MS1_TO_SYSTEM_TIME(VALVE_ALARM_LED_REFRESH_PERIOD_MS)); + } + return (events ^ VAVLE_ALARM_LED_REFRESH_EVT); + } return 0; } @@ -624,6 +640,55 @@ uint8_t BSP_VALVE_Close(TeFrameCmd close_reason) * @param open_reason 寮闃鍘熷洜锛屼娇鐢═eFrameCmd涓畾涔夌殑鏋氫妇鍊 * @return 鎿嶄綔缁撴灉 */ +uint8_t BSP_VALVE_Lock(TeFrameCmd lock_reason) +{ + if(gValveData.Lock == 1) { + return 1; + } + valve_safety.lock_reason = lock_reason; + LED_ALARM_OPEN; + gValveData.Lock = 1; + tmos_start_task(vavle_task_id, VAVLE_ALARM_LED_REFRESH_EVT, MS1_TO_SYSTEM_TIME(VALVE_ALARM_LED_REFRESH_PERIOD_MS)); + logWarning("switch_status: %d", gValveData.switch_status); + return 0; +} +uint8_t BSP_VALVE_Unlock(void) +{ + if(gValveData.Lock != 1) { + return 1; + } + LED_ALARM_CLOSE; + tmos_stop_task(vavle_task_id, VAVLE_ALARM_LED_REFRESH_EVT); + gValveData.Lock = 0; + return 0; +} +uint8_t BSP_VALVE_CheckHazardCleared(void) +{ + switch(valve_safety.lock_reason) + { + case kValveCmdOverPressure: + if(ValveRawData.in_press < ValveInfo.over_press) { + return 1; + } + break; + case kValveCmdUnderPressure: + if(ValveRawData.in_press > ValveInfo.low_press) { + return 1; + } + break; + case kValveCmdMicroLeak: + if (valve_safety.micro_leak_count == 0) { + logInfo("闇鎵嬪姩瑙i攣"); + return 1; + } + break; + case kValveCmdOverCurrent: + return 0; + default: + return 1; + } + return 0; +} uint8_t BSP_VALVE_Open(TeFrameCmd open_reason) { // 濡傛灉闃闂ㄥ凡缁忔墦寮锛屽垯涓嶉噸澶嶆搷浣 @@ -631,7 +696,11 @@ uint8_t BSP_VALVE_Open(TeFrameCmd open_reason) return 1; } - // 璁板綍寮闃鍘熷洜 + logWarning("switch_status: %d", gValveData.switch_status); + if(gValveData.Lock == 1) { + logWarning("lock_reason: %d", valve_safety.lock_reason); + return 2; + } gValveOpenReason = open_reason; // 瑙﹀彂寮闃浜嬩欢