diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h index 7526f79..f66ceb5 100644 --- a/bsp/inc/bsp_valve.h +++ b/bsp/inc/bsp_valve.h @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-09 11:40:04 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-05-23 10:34:57 + * @LastEditTime: 2025-05-23 11:01:23 * @FilePath: \zbf_master_ch584m\bsp\inc\bsp_valve.h * @Description: * @ @@ -65,19 +65,19 @@ typedef enum typedef enum { kCmdCfg = 0X01, - kCmdCloseVavle, - kCmdOpenVavle, - kCmdData, - kValveCmdOverPressure, // 超压关阀 - kValveCmdUnderPressure, // 欠压关阀 - kValveCmdOverCurrent, // 过流关阀 - kValveCmdMicroLeak, // 微漏关阀 - kValveCmdTimer, // 定时关阀 - kValveCmdOpenWithStove, // 开灶开阀 - kValveCmdCloseWithStove, // 关灶关阀 - kValveCmdOverTemperature, // 超温关阀 - kValveCmdDelayClose, // 延时关阀 - kValveCmdManualClose, // 手动关阀 + kCmdCloseVavle, //关阀 + kCmdOpenVavle,//开阀 + kCmdData,//命令数据(心跳数据) + kRespOverPressure, // 超压关阀 + kRespUnderPressure, // 欠压关阀 + kRespOverCurrent, // 过流关阀 + kRespMicroLeak, // 微漏关阀 + kRespTimer, // 定时关阀 + kRespOpenWithStove, // 开灶开阀 + kRespCloseWithStove, // 关灶关阀 + kRespOverTemperature, // 超温关阀 + kRespDelayClose, // 延时关阀 + kRespManualClose, // 手动关阀 } TeFrameCmd; /* @@ -121,6 +121,6 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len); int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len); void BSP_Bt_Valve_Updata(void); int BSP_Bt_Remove_All_Valve(void); -int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state); +int BSP_Bt_Valve_Resp(ValveCmdType cmd, uint8_t id, uint8_t *mac_addr, uint8_t state); #endif // ! __BSP_VALVE_H__ diff --git a/bsp/src/bsp_uart.c b/bsp/src/bsp_uart.c index 5b1618f..b4115c0 100644 --- a/bsp/src/bsp_uart.c +++ b/bsp/src/bsp_uart.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-06 16:52:30 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-05-23 10:35:36 + * @LastEditTime: 2025-05-23 11:05:49 * @FilePath: \zbf_master_ch584m\bsp\src\bsp_uart.c * @Description: * @@ -30,7 +30,7 @@ #define UART3_TX_BUFFER_LENGTH 2048U uint8_t bt_recv_start_flag = 0; -uint8_t bt_recv_end_flag = 0; +uint8_t bt_recv_end_flag = 0; lwrb_t uart1_rx_t; lwrb_t uart1_tx_t; uint8_t uart1_tx_buf[UART1_TX_BUFFER_LENGTH] = {0}; @@ -167,11 +167,11 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) switch (data[index + 2]) { case kValveCmdCtr: - + ret = BSP_Bt_Valve_Ctr(&data_buf[0], datalength); break; case kValveCmdReg: - + ret = BSP_Bt_Register_Valve(&data_buf[0], datalength); if (ret == 0) { @@ -183,7 +183,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) } break; case kValveCmdRem: - logDebug("recv cmd: 0x03, 执行的动作是移除阀门"); + logDebug("recv cmd: 0x03, 移除阀门"); ret = BSP_Bt_Remove_Valve(&data_buf[0], datalength); if (ret == 0) { @@ -195,7 +195,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) } break; case kValveCmdRep: - logDebug("recv cmd: 0x04, 执行的动作是更换阀门"); + logDebug("recv cmd: 0x04, 更换阀门"); ret = BSP_Bt_Replace_Valve(&data_buf[0], datalength); if (ret == 0) { @@ -207,7 +207,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) } break; case kValveCmdRemAll: - logDebug("recv cmd: 0x04, 执行的动作是移除所有阀门信息"); + logDebug("recv cmd: 0x04, 移除所有阀门信息"); ret = BSP_Bt_Remove_All_Valve(); if (ret == 0) { @@ -257,7 +257,7 @@ uint8_t BT_GenerateRawFrame(BTFrameData *pRawData, const uint8_t *p_src, uint8_t uint16_t BSP_Send_Process(uint8_t *pdata) { int8_t ret = 0; - __attribute__((aligned(4))) uint8_t master_rx_buf[64] = {0}; + uint8_t master_rx_buf[64] = {0}; uint8_t found_frame_start = 0; uint8_t *frame_start = NULL; @@ -312,26 +312,66 @@ uint16_t BSP_Send_Process(uint8_t *pdata) case kCmdData: valve_list.valve_data[0].valve_connct_status = 1; tmos_memcpy(&valve_list.valve_data[0].valve_switch_status, &master_rx_buf[3], master_rx_buf[2]); - + if ((bt_connect_flag != 1) && (valve_list.valve_data[0].valve_connct_status == 1)) { bt_connect_flag = 1; logDebug("阀门连接成功"); - BSP_Bt_Valve_Resp(kValveConncetStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, TRUE);//表示连接成功 + BSP_Bt_Valve_Resp(kValveConncetStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, TRUE); // 表示连接成功 } else { BSP_Bt_Valve_Resp(kValveEventStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, TRUE); } break; - //TODO:待完成从机的一些主动上报信息解析 - case + // TODO:待完成从机的一些主动上报信息解析 + case kRespOverPressure: + logDebug("阀门超压关阀"); + BSP_Bt_Valve_Resp(kValveCmdOverPressure, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespUnderPressure: + logDebug("阀门欠压关阀"); + + BSP_Bt_Valve_Resp(kValveCmdUnderPressure, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespOverCurrent: + logDebug("阀门过流关阀"); + BSP_Bt_Valve_Resp(kValveCmdOverCurrent, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespMicroLeak: + logDebug("阀门微漏关阀"); + BSP_Bt_Valve_Resp(kValveCmdMicroLeak, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespTimer: + logDebug("阀门定时关阀"); + BSP_Bt_Valve_Resp(kValveCmdTimer, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespOpenWithStove: + logDebug("开灶关阀"); + BSP_Bt_Valve_Resp(kValveCmdOpenWithStove, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespCloseWithStove: + logDebug("关灶关阀"); + BSP_Bt_Valve_Resp(kValveCmdCloseWithStove, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespOverTemperature: + logDebug("阀门超温关阀"); + BSP_Bt_Valve_Resp(kValveCmdOverTemperature, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespDelayClose: + logDebug("阀门延时关闭"); + BSP_Bt_Valve_Resp(kValveCmdDelayClose, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; + case kRespManualClose: + logDebug("阀门手动关闭"); + BSP_Bt_Valve_Resp(kValveCmdManualClose, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + break; default: logError("不支持的从机命令: %d", master_rx_buf[1]); break; } - - return 0; + + return 0; } uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events) @@ -363,7 +403,7 @@ uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events) if (bt_recv_start_flag) { bt_recv_start_flag = 0; - bt_recv_end_flag = 1; + bt_recv_end_flag = 1; tmos_start_task(task_id, BT_REC_EVT, 100); } tmos_start_task(task_id, BT_REC_EVT_FINISH, 50); @@ -375,7 +415,7 @@ uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events) if (bt_recv_end_flag) { bt_recv_end_flag = 0; - int len = lwrb_get_full(&uart1_rx_t); + int len = lwrb_get_full(&uart1_rx_t); if (len > 0) { __attribute__((aligned(4))) uint8_t buf[256] = {0}; @@ -423,7 +463,7 @@ void BSP_UART1_Init(void) void BSP_UART3_Init(void) { #ifdef DEVICE_TYPE_TYQ_LY - GPIOPinRemap(ENABLE, RB_PIN_UART3); + GPIOPinRemap(ENABLE, RB_PIN_UART3); /* 配置串口3:先配置IO口模式,再配置串口 */ GPIOB_SetBits(UART3_TX_PIN); GPIOB_ModeCfg(UART3_RX_PIN, GPIO_ModeIN_PU); // RXD-配置上拉输入 @@ -468,10 +508,10 @@ void UART1_IRQHandler(void) break; } case UART_II_RECV_RDY: - case UART_II_RECV_TOUT: // 接收数据 - if ((bt_recv_start_flag == 0)&&(bt_recv_end_flag == 0))//用于检测是否是开始接收数据 + case UART_II_RECV_TOUT: // 接收数据 + if ((bt_recv_start_flag == 0) && (bt_recv_end_flag == 0)) // 用于检测是否是开始接收数据 { - bt_recv_start_flag = 1; + bt_recv_start_flag = 1; } while (R8_UART1_RFC) { @@ -583,7 +623,7 @@ int reboot(void) { PFIC_SystemReset(); - return 0; + return 0; } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), reboot, reboot, "reboot"); diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index 08d74c1..44eae44 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -2,8 +2,8 @@ * @Author: mbw * @Date: 2024-12-09 11:40:10 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-04-22 15:15:24 - * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_valve.c + * @LastEditTime: 2025-05-23 11:08:46 + * @FilePath: \zbf_master_ch584m\bsp\src\bsp_valve.c * @Description: * * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. @@ -14,7 +14,6 @@ #include "bsp_uart.h" #include "multiCentral.h" - /* 接收的蓝牙从机info: 接收数据帧格式: 帧头 + 命令 + 数据长度 + 心跳数据包 + 校验码 + 帧尾 @@ -29,7 +28,6 @@ valve_data_list_t valve_list = {0}; BTFrameData valve_frame_data = {0}; - uint8_t Valve_GenerateRawFrame(BTFrameData *pRawData, const uint8_t cmd, const uint8_t *p_src, uint8_t src_len) { pRawData->len = src_len + 5; @@ -62,7 +60,6 @@ int BSP_Valve_Ctr(uint8_t valve_id, const uint8_t cmd) return -1; } logDebug("BSP_Valve_Close: valve id: %d", valve_id); - // TODO:检查是否连接, 如果连接,则发送数据,将关闭阀门指令发送过去,然后等待数据接收响应,如果接收到响应是关闭状态0x01,则返回成功,否则失败 if (cmd == kCmdCloseVavle) { Valve_GenerateRawFrame(&valve_frame_data, kCmdCloseVavle, &valve_ctr_valve, 1); @@ -71,7 +68,6 @@ int BSP_Valve_Ctr(uint8_t valve_id, const uint8_t cmd) { Valve_GenerateRawFrame(&valve_frame_data, kCmdOpenVavle, &valve_ctr_valve, 1); } - return BSP_Master_Send(centralConnList, CONNECT0_ITEM, &valve_frame_data.buf[0], valve_frame_data.len); } @@ -105,7 +101,7 @@ int BSP_Bt_Valve_Ctr(uint8_t *data, uint8_t len) /*如果到这里了,说明ID和MAC地址对应没问题,则控制对应阀门*/ if (data[7] == WirelessValveClose) { - logDebug("recv cmd: 0x01, 执行的动作是关闭阀门"); + logDebug("recv cmd: 0x01, 执行的动作是关闭阀门"); return BSP_Valve_Ctr(data[0], kCmdCloseVavle); } else if (data[7] == WirelessValveOpen) @@ -156,8 +152,8 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len) return 3; } else - { - uint8_t num = Flash_Get_Valve_Num(); + { + uint8_t num = Flash_Get_Valve_Num(); Flash_Set_Valve_Num(num + 1); BSP_Bt_Valve_Updata(); // 更新阀门信息 } @@ -176,7 +172,7 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len) { size_t i = 0; uint8_t mac_addr[FLASH_MAC_INFO_LEN + 2] = {0}; - if ((data[0] >= 1) && (data[0] <= 8))// 判断是否是正确的ID + if ((data[0] >= 1) && (data[0] <= 8)) // 判断是否是正确的ID { Flash_Get_Mac_Addr(mac_addr, data[0]); } @@ -186,10 +182,10 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len) logHexDumpAll(data, len); return -1; } - if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) != TRUE)// 判断是否是相同的MAC地址 + if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) != TRUE) // 判断是否是相同的MAC地址 { logError("mac addr error"); - logHexDumpAll(data, len); + logHexDumpAll(data, len); return -2; } else @@ -198,10 +194,10 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len) if (Flash_Set_Mac_Addr(mac_addr, data[0]) != 0) // 清空掉对应位置MAC数据 { logError("移除阀门信息失败"); - logHexDumpAll(data, len); + logHexDumpAll(data, len); return -2; } - uint8_t num = Flash_Get_Valve_Num(); + uint8_t num = Flash_Get_Valve_Num(); if (Flash_Set_Valve_Num(num - 1) != 0) // 移除一个阀门 { logError("移除阀门信息失败"); @@ -219,8 +215,8 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len) int BSP_Bt_Remove_All_Valve(void) { uint8_t mac_addr[FLASH_MAC_INFO_LEN + 2] = {0}; - uint8_t num = Flash_Get_Valve_Num(); - if(num == 0) + uint8_t num = Flash_Get_Valve_Num(); + if (num == 0) { logError("没有找到任何阀门信息"); return 0; @@ -248,7 +244,7 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len) uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0}; logDebug("更换阀门信息:"); logHexDumpAll(data, len); - if ((len == 0) || (len < 13))//新旧MAC地址长度加id 6 + 6 + 1 = 13至少要大于12 + if ((len == 0) || (len < 13)) // 新旧MAC地址长度加id 6 + 6 + 1 = 13至少要大于12 { logError("data len error"); return -1; @@ -269,14 +265,14 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len) } else { - //新阀门数据在前 + // 新阀门数据在前 if (Flash_Set_Mac_Addr(&data[1], data[0]) != 0) { logError("阀门注册写入flash 错误"); return 3; } BSP_Bt_Valve_Updata(); // 更新阀门信息 - Master_DisConnect();//更新后先断联接 + Master_DisConnect(); // 更新后先断联接 } return 0; } @@ -285,16 +281,16 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len) void BSP_Bt_Valve_Updata(void) { uint8_t cnt = 0; - uint8_t mac[6] = {0}; + uint8_t mac[6] = {0}; - uint8_t num = Flash_Get_Valve_Num(); + uint8_t num = Flash_Get_Valve_Num(); logInfo("BSP_Bt_Valve_Updata num: %d ", num); if (num == 0) { return; } tmos_memset(&valve_list, 0, sizeof(valve_data_list_t)); - + for (int i = 1; i < MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中, 并且保证id号和flash对应起来 { if (Flash_Get_Mac_Addr(valve_list.valve_data[cnt].valve_mac, i) == 0) // 说明有MAC数据 @@ -319,11 +315,10 @@ void BSP_Bt_Valve_Updata(void) } } Flash_Set_Valve_Num(valve_list.valve_num); - } -//蓝牙主机对报警器的响应函数。 state表示此对应的项目,可能是执行成功与否,可能是蓝牙连接状态码,具体参考对应的case -int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) +// 蓝牙主机对报警器的响应函数。 state表示此对应的项目,可能是执行成功与否,可能是蓝牙连接状态码,具体参考对应的case +int BSP_Bt_Valve_Resp(ValveCmdType cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) { uint8_t ret = 0; BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(valve_data)); @@ -334,6 +329,16 @@ int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) case kValveCmdReg: case kValveCmdRem: case kValveCmdRep: + // TODO:待完成从机的一些主动上报信息解析 + case kValveCmdOverPressure: + case kValveCmdUnderPressure: + case kValveCmdOverCurrent: + case kValveCmdMicroLeak: + case kValveCmdTimer: + case kValveCmdOpenWithStove: + case kValveCmdCloseWithStove: + case kValveCmdOverTemperature: + case kValveCmdDelayClose: ptr->buf[0] = id; tmos_memcpy(&ptr->buf[1], mac_addr, 6); ptr->buf[26] = state; @@ -350,10 +355,11 @@ int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) case kValveConncetStatus: ptr->buf[0] = id; tmos_memcpy(&ptr->buf[1], mac_addr, 6); - ptr->buf[7] = state; //0表示断开,1表示连接 - logDebug("连接状态:%d", ptr->buf[7]); - BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 9); + ptr->buf[7] = state; // 0表示断开,1表示连接 + logDebug("连接状态:%d", ptr->buf[7]); + BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 9); break; + default: break; } @@ -367,7 +373,7 @@ int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) return -1; } - + void BSP_Valve_Init(void) { logDebug("BSP_Valve_Init");