diff --git a/.cproject b/.cproject index fca4c0a..0a88c5f 100644 --- a/.cproject +++ b/.cproject @@ -1,174 +1,307 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.mrs/BLE_TYQ_BJQ_CH584M.mrs-workspace b/.mrs/ZBF_Master_ch584m.mrs-workspace similarity index 90% rename from .mrs/BLE_TYQ_BJQ_CH584M.mrs-workspace rename to .mrs/ZBF_Master_ch584m.mrs-workspace index d15aa25..9198ead 100644 --- a/.mrs/BLE_TYQ_BJQ_CH584M.mrs-workspace +++ b/.mrs/ZBF_Master_ch584m.mrs-workspace @@ -4,7 +4,7 @@ "path": "." }, { - "name": "BLE_TYQ_BJQ_CH584M", + "name": "ZBF_Master_ch584m", "path": "../" } ], diff --git a/.mrs/launch.json b/.mrs/launch.json index f3acb26..0b07c05 100644 --- a/.mrs/launch.json +++ b/.mrs/launch.json @@ -4,8 +4,8 @@ { "type": "mrs-debugger", "request": "launch", - "name": "BLE_TYQ_BJQ_CH584M", - "cwd": "d:\\SXDT\\Project\\CH32\\ble_-tyq_-bjq_-ch584-m", + "name": "ZBF_Master_ch584m", + "cwd": "d:\\SXDT\\Project\\HED\\zbf_master_ch584m", "openOCDCfg": { "useLocalOpenOCD": true, "executable": "c:/MounRiver/MounRiver_Studio2/resources/app/resources/win32/components/WCH/OpenOCD/OpenOCD/bin/openocd.exe", @@ -39,8 +39,8 @@ "additionalCommands": [] }, "loadedFiles": { - "executableFile": "d:\\SXDT\\Project\\CH32\\ble_-tyq_-bjq_-ch584-m\\obj\\BLE_TYQ_BJQ_CH584M.elf", - "symbolFile": "d:\\SXDT\\Project\\CH32\\ble_-tyq_-bjq_-ch584-m\\obj\\BLE_TYQ_BJQ_CH584M.elf", + "executableFile": "d:\\SXDT\\Project\\HED\\zbf_master_ch584m\\obj\\ZBF_Master_ch584m.elf", + "symbolFile": "d:\\SXDT\\Project\\HED\\zbf_master_ch584m\\obj\\ZBF_Master_ch584m.elf", "executableFileOffset": 0, "symbolFileOffset": 0 }, diff --git a/.project b/.project index 2aa28b2..47824a0 100644 --- a/.project +++ b/.project @@ -1,37 +1,34 @@ - BLE_TYQ_BJQ_CH584M - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - 1602468250279 - - 22 - - org.eclipse.ui.ide.multiFilter - 1.0-name-matches-false-false-*.wvproj - - - - + ZBF_Master_ch584m + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + + + 6 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-*.wvproj + + + + \ No newline at end of file diff --git a/.template b/.template index e69de29..da0444e 100644 --- a/.template +++ b/.template @@ -0,0 +1,23 @@ +Vendor=WCH +Toolchain=RISC-V +Series=CH32L103 +RTOS=NoneOS +MCU=CH32L103C8T6 +Link=WCH-Link +PeripheralVersion=1.0 +Description= +Mcu Type= +Address= +Target Path= +Exe Path= +Exe Arguments= +CLKSpeed=1 +DebugInterfaceMode=0 +Erase All=false +Program=false +Verify=false +Reset=false +SDIPrintf=false +Disable Power Output=false +Clear CodeFlash=false +Disable Code-Protect=false \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 38c6d82..051a531 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,9 +18,9 @@ } ], "files.associations": { + "*.dbclient-js": "javascript", "*.sqlbook": "sql", "*.ndjson": "jsonl", - "*.dbclient-js": "javascript", "config.h": "c", "ch58xble_lib.h": "c", "bsp_uart.h": "c", @@ -37,6 +37,7 @@ "bsp_flash.h": "c", "shell.h": "c", "ch58x_uart.h": "c", - "bsp_tim.h": "c" + "bsp_tim.h": "c", + "ch58x_common.h": "c" } } \ No newline at end of file diff --git a/APP/multiCentral.c b/APP/multiCentral.c index 34a3d8c..30147a7 100644 --- a/APP/multiCentral.c +++ b/APP/multiCentral.c @@ -18,6 +18,7 @@ #define MASTER_DETECT_EVT (0X01 << 3) uint8_t MasterCtrTaskId; +uint8_t bt_conncet_cnt = 0; /********************************************************************* * MACROS @@ -1252,15 +1253,17 @@ int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len) return -5; } + // //有效数据长度 size_t data_len = (datalength + 5); ret = data_len; - if (data[index + 1] == kCmdCloseVavle) // 0x02 代表了其是控制阀门响应 + if (data[index + 1] == 0x02) // 0x02 代表了其是控制阀门响应 { - // logDebug("BT 控制阀门响应包"); + logDebug("BT 控制阀门响应包"); + logHexDumpAll(data, len); if (data[index + datalength + 2] == 1) // 响应数据位 { - logInfo("关闭阀门成功"); + logInfo("BT 控制阀门成功"); } else { @@ -1272,8 +1275,14 @@ int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len) logDebug("蓝牙从机心跳数据包:"); logHexDumpAll(data, data_len); } + else + { + logDebug("蓝牙从机数据包:"); + logHexDumpAll(data, len); + } // 到这一步说明数据没问题,将接收到的数据通过中心任务发送出去 uint8_t *p_data; + p_data = tmos_msg_allocate(data_len); if (p_data) { @@ -1337,6 +1346,12 @@ uint16_t Master_ProcessEvent(uint8_t task_id, uint16_t events) if (Flash_Get_Valve_Num()) { logDebug("有设备,尝试连接\r\n"); + bt_conncet_cnt++; + if (bt_conncet_cnt > 180) + { + bt_conncet_cnt = 0; + PFIC_SystemReset(); + } tmos_start_task(task_id, MASTER_CONNECT_EVT, 1600); } } diff --git a/APP/multiCentral_main.c b/APP/multiCentral_main.c index 97925fa..0619bfe 100644 --- a/APP/multiCentral_main.c +++ b/APP/multiCentral_main.c @@ -96,15 +96,12 @@ int main(void) logDebug("test log debug\n"); #endif + CH58x_BLEInit(); HAL_Init(); GAPRole_CentralInit(); Central_Init(); - logDebug("get_ticks %d", BSP_Get_Tick()); - DelayMs(2000); - logDebug("get_ticks %d", BSP_Get_Tick()); - BSP_FLASH_Init(); BSP_Valve_Init(); BSP_UART1_Init(); // BT UART diff --git a/ZBF_Master_ch584m.launch b/ZBF_Master_ch584m.launch new file mode 100644 index 0000000..22e6c4b --- /dev/null +++ b/ZBF_Master_ch584m.launch @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BLE_TYQ_BJQ_CH584M.wvproj b/ZBF_Master_ch584m.wvproj similarity index 100% rename from BLE_TYQ_BJQ_CH584M.wvproj rename to ZBF_Master_ch584m.wvproj diff --git a/bsp/inc/bsp_uart.h b/bsp/inc/bsp_uart.h index 4ca0ade..a1cb70e 100644 --- a/bsp/inc/bsp_uart.h +++ b/bsp/inc/bsp_uart.h @@ -13,15 +13,25 @@ #include "CH58x_common.h" +// #define DEVICE_TYPE_TYQ_LY +#define DEVICE_TYPE_FXJB_LY + + #define BT_START_EVT (0X01 << 0) #define BT_REC_EVT (0X01 << 1) #define BT_INFO_UPDATA_EVT (0X01 << 2) #define BT_SEND_EVT (0X01 << 3)// #define BT_REC_EVT_FINISH (0X01 << 4) //接收完成事件 +#ifdef DEVICE_TYPE_TYQ_LY #define UART3_RX_PIN GPIO_Pin_20 //PB20 #define UART3_TX_PIN GPIO_Pin_21 // PB21 - +#endif +#ifdef DEVICE_TYPE_FXJB_LY +/*方形将本是PA4 PA5*/ +#define UART3_RX_PIN GPIO_Pin_4 //PA4 +#define UART3_TX_PIN GPIO_Pin_5 // PA5 +#endif #define BT_UART_TX_PIN GPIO_Pin_9 //PA9 #define BT_UART_RX_PIN GPIO_Pin_8 //PA8 diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h index 7f9896b..7526f79 100644 --- a/bsp/inc/bsp_valve.h +++ b/bsp/inc/bsp_valve.h @@ -2,8 +2,8 @@ * @Author: mbw * @Date: 2024-12-09 11:40:04 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-04-22 13:19:22 - * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_valve.h + * @LastEditTime: 2025-05-23 10:34:57 + * @FilePath: \zbf_master_ch584m\bsp\inc\bsp_valve.h * @Description: * @ * @Copyright (c) 2025 by ${git_name_email}, All Rights Reserved. @@ -27,16 +27,27 @@ typedef enum { - kValveCmdCtr = 0X01, - kValveCmdReg, - kValveCmdRem, - kValveCmdRep, - kValveCmdRemAll,//移除所有的阀门地址 - kValveEventStatus,//阀门状态包 - kValveConncetStatus,//阀门状态包 - kValveCmdMax, -} ValveCmdType; + kValveCmdCtr = 0X01, // 控制命令 + kValveCmdReg, // 注册命令 + kValveCmdRem, // 移除命令 + kValveCmdRep, // 替换命令 + kValveCmdRemAll, // 移除所有的阀门地址 + kValveEventStatus, // 阀门状态包 + kValveConncetStatus, // 阀门连接状态 + kValveCmdOverPressure, // 超压关阀 + kValveCmdUnderPressure, // 欠压关阀 + kValveCmdOverCurrent, // 过流关阀 + kValveCmdMicroLeak, // 微漏关阀 + kValveCmdTimer, // 定时关阀 + kValveCmdOpenWithStove, // 开灶开阀 + kValveCmdCloseWithStove, // 关灶关阀 + kValveCmdOverTemperature, // 超温关阀 + kValveCmdDelayClose, // 延时关阀 + kValveCmdManualClose, // 手动关阀 + + kValveCmdMax, // 枚举最大值 +} ValveCmdType; typedef enum { WirelessValveClose = 0x01, @@ -57,6 +68,16 @@ typedef enum kCmdCloseVavle, kCmdOpenVavle, kCmdData, + kValveCmdOverPressure, // 超压关阀 + kValveCmdUnderPressure, // 欠压关阀 + kValveCmdOverCurrent, // 过流关阀 + kValveCmdMicroLeak, // 微漏关阀 + kValveCmdTimer, // 定时关阀 + kValveCmdOpenWithStove, // 开灶开阀 + kValveCmdCloseWithStove, // 关灶关阀 + kValveCmdOverTemperature, // 超温关阀 + kValveCmdDelayClose, // 延时关阀 + kValveCmdManualClose, // 手动关阀 } TeFrameCmd; /* @@ -69,7 +90,7 @@ typedef enum 无线调压阀出口压力 无线调压阀大气压 */ -struct __attribute__((packed)) valve_data +typedef struct __attribute__((packed)) { uint8_t valve_id; uint8_t valve_mac[6]; @@ -80,12 +101,15 @@ struct __attribute__((packed)) valve_data uint32_t valve_out_pressure; uint32_t valve_atm_pressure; uint8_t valve_type; -}; + uint8_t valve_bat; + uint8_t valve_hum;//阀门湿度 + int8_t valve_rssi;//阀门rssi +}valve_data; typedef struct valve_data_list { uint8_t valve_num; - struct valve_data valve_data[MAX_VALVE_NUM]; + valve_data valve_data[MAX_VALVE_NUM]; } valve_data_list_t; extern valve_data_list_t valve_list; diff --git a/bsp/src/bsp_tim.c b/bsp/src/bsp_tim.c index 3582b35..7c782bb 100644 --- a/bsp/src/bsp_tim.c +++ b/bsp/src/bsp_tim.c @@ -11,7 +11,7 @@ #include "bsp_tim.h" #include "HAL.h" -volatile uint32_t tick_1ms_cnt = 0; +// volatile uint32_t tick_1ms_cnt = 0; /** * @description: @@ -25,15 +25,15 @@ uint32_t BSP_Get_Tick(void) } -__INTERRUPT -__HIGH_CODE -void SysTick_Handler() -{ - static uint8_t cnt_ms = 0; +// __INTERRUPT +// __HIGH_CODE +// void SysTick_Handler() +// { +// static uint8_t cnt_ms = 0; - SysTick->SR = 0; - tick_1ms_cnt++; +// SysTick->SR = 0; +// tick_1ms_cnt++; - cnt_ms++; -} +// cnt_ms++; +// } diff --git a/bsp/src/bsp_uart.c b/bsp/src/bsp_uart.c index 2fd4294..5b1618f 100644 --- a/bsp/src/bsp_uart.c +++ b/bsp/src/bsp_uart.c @@ -2,8 +2,8 @@ * @Author: mbw * @Date: 2024-12-06 16:52:30 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-04-22 15:16:57 - * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_uart.c + * @LastEditTime: 2025-05-23 10:35:36 + * @FilePath: \zbf_master_ch584m\bsp\src\bsp_uart.c * @Description: * * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. @@ -167,11 +167,11 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) switch (data[index + 2]) { case kValveCmdCtr: - logDebug("recv cmd: 0x01, 执行的动作是关闭阀门"); + ret = BSP_Bt_Valve_Ctr(&data_buf[0], datalength); break; case kValveCmdReg: - logDebug("recv cmd: 0x02, 执行的动作是注册阀门"); + ret = BSP_Bt_Register_Valve(&data_buf[0], datalength); if (ret == 0) { @@ -237,7 +237,6 @@ uint8_t BT_GenerateRawFrame(BTFrameData *pRawData, const uint8_t *p_src, uint8_t pRawData->buf[1] = src_len; tmos_memcpy(&pRawData->buf[2], p_src, src_len); - // 从帧起始符开始到校验码之前所有字节的和的模256 // ,即各字节不计超过255的溢出值的二进制算术和。 pRawData->buf[pRawData->len - 2] = _CheckSum(&pRawData->buf[0], pRawData->len - 2); @@ -308,6 +307,7 @@ uint16_t BSP_Send_Process(uint8_t *pdata) BSP_Bt_Valve_Resp(kValveCmdCtr, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); break; case kCmdOpenVavle: + BSP_Bt_Valve_Resp(kValveCmdCtr, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); break; case kCmdData: valve_list.valve_data[0].valve_connct_status = 1; @@ -324,8 +324,10 @@ uint16_t BSP_Send_Process(uint8_t *pdata) BSP_Bt_Valve_Resp(kValveEventStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, TRUE); } break; + //TODO:待完成从机的一些主动上报信息解析 + case default: - logError("不支持的命令: %d", master_rx_buf[1]); + logError("不支持的从机命令: %d", master_rx_buf[1]); break; } @@ -369,7 +371,7 @@ uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events) } else if (events & BT_REC_EVT) { - logDebug("BT_REC_EVT"); + // logDebug("BT_REC_EVT"); if (bt_recv_end_flag) { bt_recv_end_flag = 0; @@ -420,12 +422,22 @@ void BSP_UART1_Init(void) /*调试接口*/ void BSP_UART3_Init(void) { - GPIOPinRemap(ENABLE, RB_PIN_UART3); +#ifdef DEVICE_TYPE_TYQ_LY + GPIOPinRemap(ENABLE, RB_PIN_UART3); /* 配置串口3:先配置IO口模式,再配置串口 */ GPIOB_SetBits(UART3_TX_PIN); GPIOB_ModeCfg(UART3_RX_PIN, GPIO_ModeIN_PU); // RXD-配置上拉输入 GPIOB_ModeCfg(UART3_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 +#endif +#ifdef DEVICE_TYPE_FXJB_LY + /* 配置串口3:先配置IO口模式,再配置串口 */ + GPIOA_SetBits(UART3_TX_PIN); + GPIOA_ModeCfg(UART3_RX_PIN, GPIO_ModeIN_PU); // RXD-配置上拉输入 + GPIOA_ModeCfg(UART3_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 +#endif + UART3_DefInit(); + UART3_BaudRateCfg(460800); UART3_ByteTrigCfg(UART_1BYTE_TRIG); // 中断方式接收数据 diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index 648e8e6..08d74c1 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -51,10 +51,10 @@ uint8_t Valve_GenerateRawFrame(BTFrameData *pRawData, const uint8_t cmd, const u return 0; } -int BSP_Valve_Close(uint8_t valve_id) +int BSP_Valve_Ctr(uint8_t valve_id, const uint8_t cmd) { uint8_t num = Flash_Get_Valve_Num(); - uint8_t valve_ctr_valve = WirelessValveClose; + uint8_t valve_ctr_valve = cmd; if ((valve_id > 8) && (num == 0)) { logError("BSP_Valve_Close: valve id error"); @@ -63,13 +63,20 @@ int BSP_Valve_Close(uint8_t valve_id) } logDebug("BSP_Valve_Close: valve id: %d", valve_id); // TODO:检查是否连接, 如果连接,则发送数据,将关闭阀门指令发送过去,然后等待数据接收响应,如果接收到响应是关闭状态0x01,则返回成功,否则失败 - - Valve_GenerateRawFrame(&valve_frame_data, kCmdCloseVavle, &valve_ctr_valve, 1); + if (cmd == kCmdCloseVavle) + { + Valve_GenerateRawFrame(&valve_frame_data, kCmdCloseVavle, &valve_ctr_valve, 1); + } + else + { + 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); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), - BSP_Valve_Close, BSP_Valve_Close, "valve_id:CONNECT0_ITEM = 0"); + BSP_Valve_Ctr, BSP_Valve_Ctr, "valve_id: 0, close: 0x01, open :0x02"); /*用于控制阀门的状态 * id: 1-8 @@ -95,13 +102,25 @@ int BSP_Bt_Valve_Ctr(uint8_t *data, uint8_t len) return -2; } - /*如果到这里了,说明ID和MAC地址对应没问题,则关闭对应阀门*/ - return BSP_Valve_Close(data[0]); + /*如果到这里了,说明ID和MAC地址对应没问题,则控制对应阀门*/ + if (data[7] == WirelessValveClose) + { + logDebug("recv cmd: 0x01, 执行的动作是关闭阀门"); + return BSP_Valve_Ctr(data[0], kCmdCloseVavle); + } + else if (data[7] == WirelessValveOpen) + { + logDebug("recv cmd: 0x02, 执行的动作是打开阀门"); + return BSP_Valve_Ctr(data[0], kCmdOpenVavle); + } + logDebug("data[7] = %#x", data[7]); + return -1; } /*注册阀门信息*/ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len) { + logDebug("recv cmd: 0x02, 执行的动作是注册阀门"); uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0}; if ((data[0] >= 1) && (data[0] <= 8)) @@ -266,8 +285,7 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len) void BSP_Bt_Valve_Updata(void) { uint8_t cnt = 0; - __attribute__((aligned(4))) - uint8_t mac[6] = {0}; + uint8_t mac[6] = {0}; uint8_t num = Flash_Get_Valve_Num(); logInfo("BSP_Bt_Valve_Updata num: %d ", num); @@ -275,7 +293,6 @@ void BSP_Bt_Valve_Updata(void) { return; } - tmos_memset(&valve_list, 0, sizeof(valve_data_list_t)); for (int i = 1; i < MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中, 并且保证id号和flash对应起来 @@ -305,11 +322,11 @@ void BSP_Bt_Valve_Updata(void) } -//蓝牙主机对报警器的响应函数。 state表示此对应的项目,可能是执行成功与否,可能是蓝牙连接状态吗,具体参考对应的case +//蓝牙主机对报警器的响应函数。 state表示此对应的项目,可能是执行成功与否,可能是蓝牙连接状态码,具体参考对应的case int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) { uint8_t ret = 0; - BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(struct valve_data)); + BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(valve_data)); ptr->cmd = cmd; switch (cmd) { @@ -319,16 +336,16 @@ int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) case kValveCmdRep: ptr->buf[0] = id; tmos_memcpy(&ptr->buf[1], mac_addr, 6); - ptr->buf[7] = state; - BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 9); + ptr->buf[26] = state; + BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 28); break; case kValveCmdRemAll: ptr->buf[0] = state; BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 2); break; case kValveEventStatus: - tmos_memcpy(&ptr->buf[0], &valve_list.valve_data[id - 1], sizeof(struct valve_data)); - BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, sizeof(struct valve_data)); + tmos_memcpy(&ptr->buf[0], &valve_list.valve_data[id - 1], sizeof(valve_data)); + BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, sizeof(valve_data)); break; case kValveConncetStatus: ptr->buf[0] = id;