diff --git a/APP/peripheral.c b/APP/peripheral.c index 3e85afd..cf051e4 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -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); } diff --git a/README.md b/README.md index ecf08d5..3c21017 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,7 @@ 6.低功耗优化 7.电机停止需判断COIL_ADC优化 8.低电压判断及后续处理 + + +灯显示加到开关阀流程中 +4G上报添加到统一的开关阀函数中 diff --git a/bsp/inc/bsp_bmp390.h b/bsp/inc/bsp_bmp390.h index 526145f..9a62e2a 100644 --- a/bsp/inc/bsp_bmp390.h +++ b/bsp/inc/bsp_bmp390.h @@ -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); diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h index f979235..bf05616 100644 --- a/bsp/inc/bsp_valve.h +++ b/bsp/inc/bsp_valve.h @@ -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); diff --git a/bsp/src/bsp_bmp390.c b/bsp/src/bsp_bmp390.c index 1ee88ca..4e9d36a 100644 --- a/bsp/src/bsp_bmp390.c +++ b/bsp/src/bsp_bmp390.c @@ -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 diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index 5c29839..ac07883 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -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, ¬ification, 1); - tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); + // // 发送定时关阀完成通知 + // uint8_t notification = 1; // 定时关阀完成 + // GenerateRawFrame(&RelyData, kValveCmdTimeResp, ¬ification, 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; }