代码暂存 通过蓝牙上报阀门状态及数据

This commit is contained in:
常正强 2025-05-28 14:39:39 +08:00
parent 3724b20e2f
commit 6032d61ead
6 changed files with 141 additions and 93 deletions

View File

@ -725,19 +725,20 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven
*/ */
static void performPeriodicTask(void) static void performPeriodicTask(void)
{ {
gValveData.bat = BSP_ReadVbat(); // gValveData.bat = BSP_ReadVbat();
if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE) // if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE)
{ // {
tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); // 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)
{ // {
tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT); // tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT);
} // }
logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d", // logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d",
gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi); // gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi);
TsRawFrameData RawData; TsRawFrameData RawData;
BSP_VALVE_Generate_UploadData(&RawData); // BSP_VALVE_Generate_UploadData(&RawData);
BSP_VALVE_Generate_Data(&RawData, kCmdData);
peripheralChar4Notify(&RawData.buf[0], RawData.len); peripheralChar4Notify(&RawData.buf[0], RawData.len);
} }

View File

@ -7,3 +7,7 @@
6.低功耗优化 6.低功耗优化
7.电机停止需判断COIL_ADC优化 7.电机停止需判断COIL_ADC优化
8.低电压判断及后续处理 8.低电压判断及后续处理
灯显示加到开关阀流程中
4G上报添加到统一的开关阀函数中

View File

@ -32,6 +32,31 @@ void Function_Check(void);
extern uint8_t volatile fault_state; extern uint8_t volatile fault_state;
extern uint8_t keydown_flag; extern uint8_t keydown_flag;
// 安全阈值参数统一定义
#define SAFETY_AUTO_OPEN_THRESHOLD 3 // 自动开阀阈值(连续检测次数)
#define SAFETY_MICRO_LEAK_THRESHOLD 5 // 微泄漏检测阈值(连续检测次数)
#define SAFETY_MICRO_LEAK_PRESS_DIFF 15 // 微泄漏压力差阈值(Pa)对应流量约0.3L/min
#define SAFETY_OVER_TEMP_THRESHOLD 65 // 超温阈值(℃)
#define SAFETY_GAS_REQUEST_PRESS_DIFF 50 // 用气请求压力差阈值(Pa)
typedef struct
{
int in_press_raw;
int out_press_raw;
int8_t in_temp;
int8_t out_temp;
int8_t atom_temp;
int in_press; // 表压 单位Pa
int out_press;
int atom_press;
// 进气端和出气端压力差值 单位Pa
int in_out_press_diff;
} TsValveRawData;
extern TsValveRawData ValveRawData;
// 微泄漏检测相关函数 // 微泄漏检测相关函数
void startMicroLeakDetection(void); void startMicroLeakDetection(void);

View File

@ -68,6 +68,7 @@ typedef enum
kValveCmdOverTemperature, // 超温关阀 kValveCmdOverTemperature, // 超温关阀
kValveCmdDelayClose, // 延时关阀 kValveCmdDelayClose, // 延时关阀
kValveCmdManualClose, // 手动关阀 kValveCmdManualClose, // 手动关阀
KValveCmdTimeSet, // 设置定时关阀时间
kValveCmdTimeResp, // 设置定时关阀时间响应 kValveCmdTimeResp, // 设置定时关阀时间响应
kValveCmdLowBatClose, // 低电量关阀 kValveCmdLowBatClose, // 低电量关阀
kValveCmdManualOpen, // 手动开阀 kValveCmdManualOpen, // 手动开阀
@ -99,19 +100,18 @@ typedef enum
typedef enum typedef enum
{ {
kUnknown = 0, kOpened= 0,
kClosed, kClosed,
kOpened,
kDisconnect, kDisconnect,
} TeValveSwitchStatus; } TeValveSwitchStatus;
typedef struct __attribute__((packed)) typedef struct __attribute__((packed))
{ {
// uint8_t status; // 1B 阀门工作状态 超欠压、过流 // uint8_t valve_id;
// uint8_t valve_mac[6];
// uint8_t connct_status; // 1B 阀门连接状态 电磁阀BLE控制盒 0=未连接 1=已连接 // uint8_t connct_status; // 1B 阀门连接状态 电磁阀BLE控制盒 0=未连接 1=已连接
uint8_t switch_status; // 1B 阀门开关状态 0=未知 1=关闭=关闭过未按按键恢复 2=关闭过,按下了恢复键 = 打开 uint8_t switch_status; // 1B 阀门开关状态 0=未知 1=关闭 2=打开
int8_t temp; // 1B 阀门温度 有符号整数 25 ℃ int8_t temp; // 1B 阀门温度 有符号整数 25 ℃
uint32_t in_pressure; // 4B 阀门入口压力 Pa uint32_t in_pressure; // 4B 阀门入口压力 Pa
uint32_t out_pressure; // 4B 阀门出口压力 Pa uint32_t out_pressure; // 4B 阀门出口压力 Pa
uint32_t atm_pressure; // 4B 阀门大气压力 Pa uint32_t atm_pressure; // 4B 阀门大气压力 Pa
@ -119,10 +119,10 @@ typedef struct __attribute__((packed))
uint8_t bat; // 1B 电池电压 30=3V,18=1.8V uint8_t bat; // 1B 电池电压 30=3V,18=1.8V
uint8_t humi; // 1B 阀门湿度 %RH uint8_t humi; // 1B 阀门湿度 %RH
int8_t rssi; int8_t rssi;
} TsValveData; } TsValveData;
extern TsValveData gValveData; extern TsValveData gValveData;
typedef struct __attribute__((packed)) typedef struct __attribute__((packed))
{ {
uint32_t timer_minutes; // 设置的定时分钟数0表示未激活 uint32_t timer_minutes; // 设置的定时分钟数0表示未激活
@ -140,7 +140,7 @@ TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint8_t len);
uint8_t GenerateRawFrame(TsRawFrameData *pRawData, uint8_t cmd, const uint8_t *p_src, uint8_t src_len); uint8_t GenerateRawFrame(TsRawFrameData *pRawData, uint8_t cmd, const uint8_t *p_src, uint8_t src_len);
void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, uint8_t switch_status, uint8_t bat, int8_t temp, uint8_t humi); void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, TeFrameCmd cmd);
void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status); void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status);
void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData); void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData);

View File

@ -13,31 +13,7 @@ uint8_t keydown_flag = 0;
uint8_t keydown_time = 0; uint8_t keydown_time = 0;
uint8_t volatile fault_state = 0; uint8_t volatile fault_state = 0;
// 安全阈值参数统一定义
#define SAFETY_AUTO_OPEN_THRESHOLD 3 // 自动开阀阈值(连续检测次数)
#define SAFETY_MICRO_LEAK_THRESHOLD 5 // 微泄漏检测阈值(连续检测次数)
#define SAFETY_MICRO_LEAK_PRESS_DIFF 15 // 微泄漏压力差阈值(Pa)对应流量约0.3L/min
#define SAFETY_OVER_TEMP_THRESHOLD 65 // 超温阈值(℃)
#define SAFETY_GAS_REQUEST_PRESS_DIFF 50 // 用气请求压力差阈值(Pa)
typedef struct
{
int in_press_raw;
int out_press_raw;
int8_t in_temp;
int8_t out_temp;
int8_t atom_temp;
int in_press; // 表压 单位Pa
int out_press;
int atom_press;
// 进气端和出气端压力差值 单位Pa
int in_out_press_diff;
} TsValveRawData;
TsValveRawData ValveRawData; TsValveRawData ValveRawData;
TsValveRawData ValveRawData_buffer[5]; TsValveRawData ValveRawData_buffer[5];
typedef struct typedef struct

View File

@ -145,37 +145,65 @@ uint8_t GenerateRawFrame(TsRawFrameData *pRawData, uint8_t cmd, const uint8_t *p
return 0; return 0;
} }
void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData) // 生成上传数据函数 // void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData) // 生成上传数据函数
{ // {
GenerateRawFrame(pRawData, kCmdData, (uint8_t *)&gValveData, sizeof(gValveData)); // GenerateRawFrame(pRawData, kCmdData, (uint8_t *)&gValveData, sizeof(gValveData));
} // }
void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, uint8_t switch_status, uint8_t bat, int8_t temp, uint8_t humi) // 生成阀门数据函数 void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, TeFrameCmd cmd) // 生成阀门数据函数
{ {
TsValveData ValveData; TsValveData ValveData;
// uint8_t MacAddr[6];
// GetMACAddress(MacAddr);
ValveData.switch_status = 0; // ValveData.valve_id = 1;
ValveData.temp = temp; // tmos_memset(ValveData.valve_mac, 0, sizeof(ValveData.valve_mac));
// tmos_memcpy(ValveData.valve_mac, MacAddr, sizeof(ValveData.valve_mac));
ValveData.in_pressure = 0; // ValveData.connct_status = gValveData.connct_status;
ValveData.out_pressure = 0; ValveData.switch_status = gValveData.switch_status;
ValveData.atm_pressure = 0; ValveData.temp = ValveRawData.atom_temp;
ValveData.type = kTyq; ValveData.in_pressure = ValveRawData.in_press_raw;
ValveData.bat = bat; ValveData.out_pressure = ValveRawData.out_press_raw;
ValveData.humi = humi; ValveData.atm_pressure = ValveRawData.atom_press;
ValveData.rssi = 0; ValveData.type = kZbf;
ValveData.bat = BSP_ReadVbat();
ValveData.humi = 50;
ValveData.rssi = gValveData.rssi;
GenerateRawFrame(pRawData, kCmdData, (uint8_t *)&ValveData, sizeof(ValveData)); // 打印ValveData的所有字段
logDebug("ValveData 详细信息:\r\n"
"switch_status: %d\r\n"
"temp: %d\r\n"
"in_pressure: %d\r\n"
"out_pressure: %d\r\n"
"atm_pressure: %d\r\n"
"type: %d\r\n"
"bat: %d\r\n"
"humi: %d\r\n"
"rssi: %d",
ValveData.switch_status,
ValveData.temp,
ValveData.in_pressure,
ValveData.out_pressure,
ValveData.atm_pressure,
ValveData.type,
ValveData.bat,
ValveData.humi,
ValveData.rssi);
GenerateRawFrame(pRawData, cmd, (uint8_t *)&ValveData, sizeof(ValveData));
} }
void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status) // 生成阀门响应函数
{ // void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status) // 生成阀门响应函数
uint8_t data = 0; // {
data = status; // uint8_t data = 0;
GenerateRawFrame(pRawData, cmd, &data, 1); // data = status;
} // GenerateRawFrame(pRawData, cmd, &data, 1);
// }
static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 处理TMOS消息函数 static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 处理TMOS消息函数
{ {
@ -192,26 +220,38 @@ static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 处理TMOS消息函
break; break;
case kCmdCloseVavle: // 关阀命令 case kCmdCloseVavle: // 关阀命令
logDebug("kCmdCloseVavle"); logDebug("kCmdCloseVavle");
BSP_VALVE_Close(kCmdCloseVavle); // 使用普通关阀命令 uint8_t CloseStatus = 0;
CloseStatus = BSP_VALVE_Close(kCmdCloseVavle); // 使用普通关阀命令
if(CloseStatus == 1)
{
BSP_VALVE_Generate_Data(&RelyData, kCmdCloseVavle);
tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
}
break; break;
case kCmdOpenVavle: // 开阀命令 case kCmdOpenVavle: // 开阀命令
logDebug("kCmdOpenVavle"); logDebug("kCmdOpenVavle");
BSP_VALVE_Open(kCmdOpenVavle); // 使用普通开阀命令 uint8_t OpenStatus = 0;
OpenStatus = BSP_VALVE_Open(kCmdOpenVavle); // 使用普通开阀命令
if(OpenStatus == 1)
{
BSP_VALVE_Generate_Data(&RelyData, kCmdOpenVavle);
tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
}
break; break;
case kValveCmdTimer: // 设置定时关阀命令 case KValveCmdTimeSet: // 设置定时关阀命令
{ {
uint8_t result = 0; uint8_t result = 0;
if (HostFrameData->len >= 4) { if (HostFrameData->len >= 2) {
uint32_t minutes = 0; uint32_t minutes = 0;
tmos_memcpy(&minutes, HostFrameData->data, 4); // 安全的内存拷贝 tmos_memcpy(&minutes, HostFrameData->data, 2); // 安全的内存拷贝
result = BSP_VALVE_SetTimerClose(minutes); result = BSP_VALVE_SetTimerClose(minutes);
logDebug("kValveCmdTimer: %d minutes, result: %d", minutes, result); logDebug("kValveCmdTimer: %d minutes, result: %d", minutes, result);
} }
// 生成响应: 状态(1字节) + 设置的分钟数(4字节) // 生成响应: 设置的分钟数(2字节) + 状态(1字节)
uint8_t response[5] = {result}; uint8_t response[3] = {result};
tmos_memcpy(&response[1], &gTimerCloseState.timer_minutes, 4); // 安全的内存拷贝 tmos_memcpy(&response[1], &gTimerCloseState.timer_minutes, 2); // 安全的内存拷贝
GenerateRawFrame(&RelyData, kValveCmdTimer, response, 5); GenerateRawFrame(&RelyData, kValveCmdTimeResp, response, 3);
tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
break; break;
} }
@ -316,7 +356,8 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
logWarning("gValveCloseReason %d",gValveCloseReason); logWarning("gValveCloseReason %d",gValveCloseReason);
// gValveCloseReason = kCmdData; // gValveCloseReason = kCmdData;
tmos_memset(&RelyData, 0, sizeof(RelyData)); tmos_memset(&RelyData, 0, sizeof(RelyData));
BSP_VALVE_Generate_ValveResponse(&RelyData, gValveCloseReason, 1); // BSP_VALVE_Generate_ValveResponse(&RelyData, gValveCloseReason, 1);
BSP_VALVE_Generate_Data(&RelyData, gValveCloseReason);
// 重置为默认值 // 重置为默认值
gValveCloseReason = kCmdCloseVavle; gValveCloseReason = kCmdCloseVavle;
@ -366,7 +407,8 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
// gValveOpenReason = kCmdData; // gValveOpenReason = kCmdData;
// 生成响应 // 生成响应
tmos_memset(&RelyData, 0, sizeof(RelyData)); tmos_memset(&RelyData, 0, sizeof(RelyData));
BSP_VALVE_Generate_ValveResponse(&RelyData, gValveOpenReason, 1); // BSP_VALVE_Generate_ValveResponse(&RelyData, gValveOpenReason, 1);
BSP_VALVE_Generate_Data(&RelyData, gValveOpenReason);
// 重置为默认值 // 重置为默认值
gValveOpenReason = kCmdOpenVavle; gValveOpenReason = kCmdOpenVavle;
@ -447,10 +489,10 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
// 使用统一接口关阀 // 使用统一接口关阀
BSP_VALVE_Close(kValveCmdTimer); BSP_VALVE_Close(kValveCmdTimer);
// 发送定时关阀完成通知 // // 发送定时关阀完成通知
uint8_t notification = 1; // 定时关阀完成 // uint8_t notification = 1; // 定时关阀完成
GenerateRawFrame(&RelyData, kValveCmdTimeResp, &notification, 1); // GenerateRawFrame(&RelyData, kValveCmdTimeResp, &notification, 1);
tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); // tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
return (events ^ VAVLE_TIMER_CLOSE_EVT); return (events ^ VAVLE_TIMER_CLOSE_EVT);
} }
@ -488,13 +530,13 @@ static uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes)
// 参数验证 // 参数验证
if (minutes == 0 || minutes > 1440) { // 1分钟到24小时 if (minutes == 0 || minutes > 1440) { // 1分钟到24小时
logError("Invalid timer minutes: %d", minutes); logError("Invalid timer minutes: %d", minutes);
return 0; // 设置失败 return 1; // 设置失败
} }
// 检查当前阀门状态,如果已经关闭则不需要定时关阀 // 检查当前阀门状态,如果已经关闭则不需要定时关阀
if (gValveData.switch_status == kClosed) { if (gValveData.switch_status == kClosed) {
logDebug("Valve already closed, timer not needed"); logDebug("Valve already closed, timer not needed");
return 2; // 阀门已关闭 return 1; // 阀门已关闭
} }
// 停止现有定时器(如果有) // 停止现有定时器(如果有)
@ -513,14 +555,14 @@ static uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes)
tmos_start_task(vavle_task_id, VAVLE_TIMER_CLOSE_EVT, MS1_TO_SYSTEM_TIME(delay_ms)); tmos_start_task(vavle_task_id, VAVLE_TIMER_CLOSE_EVT, MS1_TO_SYSTEM_TIME(delay_ms));
logInfo("Timer close set: %d minutes", minutes); logInfo("Timer close set: %d minutes", minutes);
return 1; // 设置成功 return 0; // 设置成功
} }
static uint8_t BSP_VALVE_CancelTimerClose(void) static uint8_t BSP_VALVE_CancelTimerClose(void)
{ {
if (!gTimerCloseState.is_active) { if (!gTimerCloseState.is_active) {
logDebug("No active timer to cancel"); logDebug("No active timer to cancel");
return 0; // 没有激活的定时器 return 1; // 没有激活的定时器
} }
// 停止定时器 // 停止定时器
@ -531,7 +573,7 @@ static uint8_t BSP_VALVE_CancelTimerClose(void)
gTimerCloseState.timer_minutes = 0; gTimerCloseState.timer_minutes = 0;
logInfo("Timer close cancelled"); logInfo("Timer close cancelled");
return 1; // 取消成功 return 0; // 取消成功
} }
static uint32_t BSP_VALVE_GetRemainingMinutes(void) static uint32_t BSP_VALVE_GetRemainingMinutes(void)
@ -569,7 +611,7 @@ uint8_t BSP_VALVE_Close(TeFrameCmd close_reason)
// 触发关阀事件 // 触发关阀事件
tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
return 1; return 0;
} }
/** /**
@ -590,7 +632,7 @@ uint8_t BSP_VALVE_Open(TeFrameCmd open_reason)
// 触发开阀事件 // 触发开阀事件
tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT); tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT);
return 1; return 0;
} }