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

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)
{
gValveData.bat = BSP_ReadVbat();
if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE)
{
tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
}
else if (gValveData.bat <= LOW_VABAT_ALARM_VALUE)
{
tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT);
}
logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d",
gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi);
// gValveData.bat = BSP_ReadVbat();
// if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE)
// {
// tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
// }
// else if (gValveData.bat <= LOW_VABAT_ALARM_VALUE)
// {
// tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT);
// }
// logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d",
// gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi);
TsRawFrameData RawData;
BSP_VALVE_Generate_UploadData(&RawData);
// BSP_VALVE_Generate_UploadData(&RawData);
BSP_VALVE_Generate_Data(&RawData, kCmdData);
peripheralChar4Notify(&RawData.buf[0], RawData.len);
}

View File

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

View File

@ -32,6 +32,31 @@ void Function_Check(void);
extern uint8_t volatile fault_state;
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);

View File

@ -68,6 +68,7 @@ typedef enum
kValveCmdOverTemperature, // 超温关阀
kValveCmdDelayClose, // 延时关阀
kValveCmdManualClose, // 手动关阀
KValveCmdTimeSet, // 设置定时关阀时间
kValveCmdTimeResp, // 设置定时关阀时间响应
kValveCmdLowBatClose, // 低电量关阀
kValveCmdManualOpen, // 手动开阀
@ -99,30 +100,29 @@ typedef enum
typedef enum
{
kUnknown = 0,
kOpened= 0,
kClosed,
kOpened,
kDisconnect,
} TeValveSwitchStatus;
typedef struct __attribute__((packed))
{
// uint8_t status; // 1B 阀门工作状态 超欠压、过流
// uint8_t connct_status; // 1B 阀门连接状态 电磁阀BLE控制盒 0=未连接 1=已连接
uint8_t switch_status; // 1B 阀门开关状态 0=未知 1=关闭=关闭过,未按按键恢复 2=关闭过,按下了恢复键 = 打开
int8_t temp; // 1B 阀门温度 有符号整数 25 ℃
// uint8_t valve_id;
// uint8_t valve_mac[6];
// uint8_t connct_status; // 1B 阀门连接状态 电磁阀BLE控制盒 0=未连接 1=已连接
uint8_t switch_status; // 1B 阀门开关状态 0=未知 1=关闭, 2=打开
int8_t temp; // 1B 阀门温度 有符号整数 25 ℃
uint32_t in_pressure; // 4B 阀门入口压力 Pa
uint32_t out_pressure; // 4B 阀门出口压力 Pa
uint32_t atm_pressure; // 4B 阀门大气压力 Pa
uint8_t type; // 阀门类型
uint8_t bat; // 1B 电池电压 30=3V,18=1.8V
uint8_t humi; // 1B 阀门湿度 %RH
uint32_t out_pressure; // 4B 阀门出口压力 Pa
uint32_t atm_pressure; // 4B 阀门大气压力 Pa
uint8_t type; // 阀门类型
uint8_t bat; // 1B 电池电压 30=3V,18=1.8V
uint8_t humi; // 1B 阀门湿度 %RH
int8_t rssi;
} TsValveData;
extern TsValveData gValveData;
typedef struct __attribute__((packed))
{
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);
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_UploadData(TsRawFrameData *pRawData);

View File

@ -13,31 +13,7 @@ uint8_t keydown_flag = 0;
uint8_t keydown_time = 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_buffer[5];
typedef struct

View File

@ -145,37 +145,65 @@ uint8_t GenerateRawFrame(TsRawFrameData *pRawData, uint8_t cmd, const uint8_t *p
return 0;
}
void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData) // 生成上传数据函数
{
GenerateRawFrame(pRawData, kCmdData, (uint8_t *)&gValveData, sizeof(gValveData));
}
// void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData) // 生成上传数据函数
// {
// 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;
// uint8_t MacAddr[6];
// GetMACAddress(MacAddr);
ValveData.switch_status = 0;
ValveData.temp = temp;
// ValveData.valve_id = 1;
// 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.out_pressure = 0;
ValveData.atm_pressure = 0;
// ValveData.connct_status = gValveData.connct_status;
ValveData.switch_status = gValveData.switch_status;
ValveData.temp = ValveRawData.atom_temp;
ValveData.type = kTyq;
ValveData.bat = bat;
ValveData.humi = humi;
ValveData.in_pressure = ValveRawData.in_press_raw;
ValveData.out_pressure = ValveRawData.out_press_raw;
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) // 生成阀门响应函数
{
uint8_t data = 0;
data = status;
GenerateRawFrame(pRawData, cmd, &data, 1);
}
// void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status) // 生成阀门响应函数
// {
// uint8_t data = 0;
// data = status;
// GenerateRawFrame(pRawData, cmd, &data, 1);
// }
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;
case 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;
case 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;
case kValveCmdTimer: // 设置定时关阀命令
case KValveCmdTimeSet: // 设置定时关阀命令
{
uint8_t result = 0;
if (HostFrameData->len >= 4) {
if (HostFrameData->len >= 2) {
uint32_t minutes = 0;
tmos_memcpy(&minutes, HostFrameData->data, 4); // 安全的内存拷贝
tmos_memcpy(&minutes, HostFrameData->data, 2); // 安全的内存拷贝
result = BSP_VALVE_SetTimerClose(minutes);
logDebug("kValveCmdTimer: %d minutes, result: %d", minutes, result);
}
// 生成响应: 状态(1字节) + 设置的分钟数(4字节)
uint8_t response[5] = {result};
tmos_memcpy(&response[1], &gTimerCloseState.timer_minutes, 4); // 安全的内存拷贝
GenerateRawFrame(&RelyData, kValveCmdTimer, response, 5);
// 生成响应: 设置的分钟数(2字节) + 状态(1字节)
uint8_t response[3] = {result};
tmos_memcpy(&response[1], &gTimerCloseState.timer_minutes, 2); // 安全的内存拷贝
GenerateRawFrame(&RelyData, kValveCmdTimeResp, response, 3);
tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
break;
}
@ -316,7 +356,8 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
logWarning("gValveCloseReason %d",gValveCloseReason);
// gValveCloseReason = kCmdData;
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;
@ -366,7 +407,8 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
// gValveOpenReason = kCmdData;
// 生成响应
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;
@ -447,10 +489,10 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
// 使用统一接口关阀
BSP_VALVE_Close(kValveCmdTimer);
// 发送定时关阀完成通知
uint8_t notification = 1; // 定时关阀完成
GenerateRawFrame(&RelyData, kValveCmdTimeResp, &notification, 1);
tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
// // 发送定时关阀完成通知
// uint8_t notification = 1; // 定时关阀完成
// GenerateRawFrame(&RelyData, kValveCmdTimeResp, &notification, 1);
// tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_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小时
logError("Invalid timer minutes: %d", minutes);
return 0; // 设置失败
return 1; // 设置失败
}
// 检查当前阀门状态,如果已经关闭则不需要定时关阀
if (gValveData.switch_status == kClosed) {
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));
logInfo("Timer close set: %d minutes", minutes);
return 1; // 设置成功
return 0; // 设置成功
}
static uint8_t BSP_VALVE_CancelTimerClose(void)
{
if (!gTimerCloseState.is_active) {
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;
logInfo("Timer close cancelled");
return 1; // 取消成功
return 0; // 取消成功
}
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);
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);
return 1;
return 0;
}