代码暂存 添加阀门锁定解锁功能

This commit is contained in:
常正强 2025-06-06 09:09:26 +08:00
parent bcd00dd9b4
commit e3016cca9c
6 changed files with 138 additions and 50 deletions

View File

@ -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);

View File

@ -33,9 +33,11 @@ extern tmosTaskID vavle_task_id;
#define VAVLE_LOW_VBAT_LED_OFF_EVT (0x0001 << 10) // 低电压LED关闭事件
#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=解锁 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); // 解锁阀门
uint8_t BSP_VALVE_CheckHazardCleared(void); // 检查隐患是否已排除
static uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes);
static uint8_t BSP_VALVE_CancelTimerClose(void);
static uint32_t BSP_VALVE_GetRemainingMinutes(void);

View File

@ -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,6 +1035,17 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
}
}
// 检查阀门是否处于锁定状态,如果是则检查隐患是否已排除
if (gValveData.Lock == 1)
{
// 检查隐患是否已排除(过流除外,过流只能手动解锁)
if (valve_safety.lock_reason != kValveCmdOverCurrent && BSP_VALVE_CheckHazardCleared())
{
// 隐患已排除,自动解锁
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; // 重置计数器
// 微泄漏关阀时停止延时关阀功能

View File

@ -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();

View File

@ -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

View File

@ -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 使TeFrameCmd中定义的枚举值
* @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("需手动解锁");
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;
// 触发开阀事件