From 0a494a737a563609c69b646fdfee10507ecd84b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=A9=AC=5F666?= <13089258+pony-six-hundred-and-sixty-six@user.noreply.gitee.com> Date: Mon, 16 Dec 2024 20:46:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BA=86=E8=BF=9C=E7=AB=AF?= =?UTF-8?q?=E5=85=B3=E9=98=80=E5=92=8C=E7=A7=BB=E9=99=A4=E9=98=80=E9=97=A8?= =?UTF-8?q?=E7=9A=84=E6=93=8D=E4=BD=9C=EF=BC=8C=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/inc/bsp_button.h | 2 +- bsp/src/bsp_bt.c | 27 ++++++++----- bsp/src/bsp_ml307.c | 95 ++++++++++++++++++++++++++++---------------- bsp/src/bsp_wdg.c | 2 +- 4 files changed, 79 insertions(+), 47 deletions(-) diff --git a/bsp/inc/bsp_button.h b/bsp/inc/bsp_button.h index 16497dc..fd040fe 100644 --- a/bsp/inc/bsp_button.h +++ b/bsp/inc/bsp_button.h @@ -18,7 +18,7 @@ #ifdef BUTTON_USE_THREAD #define BUTTON_THREAD_PRIORITY 5 // 优先级拉高,这时按键响应快点 #define BUTTON_THREAD_TICKS 10 -#define BUTTON_THREAD_STACK_SIZE 768 /**< button_thread 线程堆栈大小 */ +#define BUTTON_THREAD_STACK_SIZE 1024 /**< button_thread 线程堆栈大小 */ #endif // !BUTTON_USE_THREAD diff --git a/bsp/src/bsp_bt.c b/bsp/src/bsp_bt.c index 39ee061..df9ac34 100644 --- a/bsp/src/bsp_bt.c +++ b/bsp/src/bsp_bt.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-03 10:31:45 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-16 11:09:26 + * @LastEditTime: 2024-12-16 19:00:53 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c * @Description: * @@ -244,7 +244,7 @@ int Bt_Valve_Handler(ValveCmdType type, rt_uint8_t id, rt_uint8_t *data) switch (type) { - case kValveCmdCtr: // 阀门控制 + case kValveCmdCtr: // 阀门控制 ret = BSP_Bt_Valve_Ctr(valve[id].valve_id, valve[id].valve_mac, WirelessValveClose); // 关阀门 break; case kValveCmdReg: // 阀门注册 @@ -324,7 +324,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) { LOG_I("接收到阀门注册响应:"); LOG_HEX("bt_rx_data:", 16, data_buf, fram_len); - + Flash_Set_Mac_Addr(&data_buf[4], data[index + 3] - 1); rt_uint8_t num = Flash_Get_Valve_Num(); Flash_Set_Valve_Num(num + 1); @@ -375,14 +375,15 @@ static void BSP_Bt_Parse_Data(void) static void Bt_Thread_Entry(void *parameter) { // 初始化阀门信息 - valve[0].valve_id = 1; - valve[0].valve_mac[0] = 0XA2; - valve[0].valve_mac[1] = 0xB4; - valve[0].valve_mac[2] = 0x8F; - valve[0].valve_mac[3] = 0x10; - valve[0].valve_mac[4] = 0x53; - valve[0].valve_mac[5] = 0x5C; - + valve[0].valve_id = 1; + valve[0].valve_mac[0] = 0XA2; + valve[0].valve_mac[1] = 0xB4; + valve[0].valve_mac[2] = 0x8F; + valve[0].valve_mac[3] = 0x10; + valve[0].valve_mac[4] = 0x53; + valve[0].valve_mac[5] = 0x5C; + Flash_Set_Mac_Addr(valve[0].valve_mac, 0); + Flash_Set_Valve_Num(1); LOG_D("Bt_Thread_Entry"); while (1) { @@ -462,10 +463,14 @@ static void TEST_BT_Send_Data(int argc, char **argv) Bt_Valve_Handler(kValveCmdCtr, id, RT_NULL); break; case 2: + Flash_Set_Valve_Num(1); Bt_Valve_Handler(kValveCmdReg, id, RT_NULL); break; case 3: Bt_Valve_Handler(kValveCmdRem, id, RT_NULL); + rt_memset(valve[0].valve_mac, 0, sizeof(struct valve_t)); + Flash_Set_Mac_Addr(valve[0].valve_mac, 0); + Flash_Set_Valve_Num(0); break; case 4: Bt_Valve_Handler(kValveCmdRep, id, RT_NULL); diff --git a/bsp/src/bsp_ml307.c b/bsp/src/bsp_ml307.c index 29a5c3d..e226fbd 100644 --- a/bsp/src/bsp_ml307.c +++ b/bsp/src/bsp_ml307.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-11-30 15:46:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-15 17:09:30 + * @LastEditTime: 2024-12-16 19:40:43 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c * @Description: * @@ -956,7 +956,7 @@ rt_err_t Handle_Close_Valve(struct Ml307_Ops *ops) if ((data[0] > 0) && (data[0] < MAX_VALVE_NUM)) // 不为零则说明关闭无线阀门 { LOG_D("无线阀门编号:%d\n", data[0]); - Flash_Get_Mac_Addr(mac_addr, data[0] - 1); + Flash_Get_Mac_Addr(mac_addr, 0); LOG_D("mac_addr[0] = %x mac_addr[1] = %x mac_addr[2] = %x mac_addr[3] = %x mac_addr[4] = %x, mac_addr[5] = %x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); /*对两个数组进行比较,如果值不同则退出*/ for (; i < FLASH_VALVE_MAC_ADDR_LEN; i++) @@ -973,9 +973,25 @@ rt_err_t Handle_Close_Valve(struct Ml307_Ops *ops) if (i == FLASH_VALVE_MAC_ADDR_LEN) { LOG_D("mac地址匹配成功,执行关阀动作\n"); - // TODO:此处需要增加关阀无线阀门的逻辑 - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); - return RT_EOK; + // if (Bt_Valve_Handler(kValveCmdCtr, data[0] - 1, RT_NULL) != RT_EOK) + if (Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL) != RT_EOK) + { + LOG_E("关阀失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; + } + if (rt_sem_take(&bt_ctr_sem, 15000) != RT_EOK) // 等待十秒获取信号量 + { + LOG_E("获取信号量失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; + } + else + { + LOG_D("关阀成功\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); + return RT_EOK; + } } else { @@ -1256,7 +1272,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) String2Hex(temp, imei); // 将字符串转为十六进制字符串 rt_memcpy(data, (ops->recv->recv_data.res_data + 3), (2 * FLASH_VALVE_MAC_ADDR_LEN + 1)); /*设备编号(1byte)+ 新MAC地址(6)+ 旧阀门MAC地址(6) + 补零字节= 15byte*/ - if (Flash_Get_Mac_Addr(mac_addr, data[0]) == RT_EOK) + if (Flash_Get_Mac_Addr(mac_addr, data[0] - 1) == RT_EOK) { for (; i < FLASH_VALVE_MAC_ADDR_LEN; i++) { @@ -1278,29 +1294,26 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; } - if (Flash_Set_Mac_Addr(&data[2], data[0]) == RESET) + if (rt_sem_take(&bt_rep_sem, 10000) != RT_EOK) // 等待十秒获取信号量 { - LOG_E("更换阀门设备失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_ACTION_FAILURE); + LOG_E("获取更换阀门信号量失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; } - LOG_D("更换阀门设备成功\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_SUCCESS); - return RT_EOK; + else + { + if (Flash_Set_Mac_Addr(&data[2], data[0]) == RESET) + { + LOG_E("更换阀门设备失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; + } + LOG_D("更换阀门设备成功\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_SUCCESS); + return RT_EOK; + } } } - if (Flash_Set_Mac_Addr(&data[1], data[0]) == RESET) - { - LOG_E("更换阀门设备失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_ACTION_FAILURE); - return RT_ERROR; - } - else - { - LOG_D("更换阀门设备成功\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_SUCCESS); - return RT_EOK; - } } /*移除阀门设备*/ @@ -1312,6 +1325,7 @@ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops) rt_uint8_t cnt = Flash_Get_Valve_Num(); Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); String2Hex(temp, imei); // 将字符串转为十六进制字符串 + LOG_I("接收到服务器下发移除阀门指令"); if (cnt == 0) { LOG_E("阀门设备数量为0, 无法移除\n"); @@ -1319,31 +1333,44 @@ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops) return RT_ERROR; } + rt_memcpy(data, (ops->recv->recv_data.res_data + 8), FLASH_VALVE_MAC_ADDR_LEN + 1); LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); - rt_memset(&data[1], 0, sizeof(data) - 1); - if (Bt_Valve_Handler(kValveCmdRem, data[0] - 1, RT_NULL) != RT_EOK) + + // if (Bt_Valve_Handler(kValveCmdRem, data[0] - 1, RT_NULL) != RT_EOK) + if (Bt_Valve_Handler(kValveCmdRem, 0, RT_NULL) != RT_EOK) { LOG_E("移除阀门设备失败\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; } - if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) == RESET) + if (rt_sem_take(&bt_rem_sem, 10000) != RT_EOK) // 等待十秒获取信号量 { - LOG_E("移除阀门设备失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE); - + LOG_E("获取更换阀门信号量失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; } else { - LOG_D("移除阀门设备成功\n"); - Flash_Set_Valve_Num(cnt - 1); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_SUCCESS); + rt_memset(&data[1], 0, sizeof(data) - 1); + if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) == RESET) + { + LOG_E("移除阀门设备失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE); - return RT_EOK; + return RT_ERROR; + } + else + { + LOG_D("移除阀门设备成功\n"); + Flash_Set_Valve_Num(cnt - 1); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_SUCCESS); + + return RT_EOK; + } } + } void Handle_Error(struct Ml307_Ops *ops, rt_err_t ret) diff --git a/bsp/src/bsp_wdg.c b/bsp/src/bsp_wdg.c index 6154333..e252918 100644 --- a/bsp/src/bsp_wdg.c +++ b/bsp/src/bsp_wdg.c @@ -165,7 +165,7 @@ int BSP_WDG_Init(void) return 0; } #ifdef RT_USING_COMPONENTS_INIT -INIT_DEVICE_EXPORT(BSP_WDG_Init); +INIT_APP_EXPORT(BSP_WDG_Init); #endif #if USED_WWDG