diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index c00a722..974a79e 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -24,6 +24,7 @@ encoding//libraries/hal_libraries/bmsis/source/startup_ch32v30x.S=GBK encoding//libraries/hal_libraries/ch32v303_hal/include/ch32v30x_gpio.h=GBK encoding//libraries/hal_libraries/ch32v303_hal/include/ch32v30x_rcc.h=GBK encoding//libraries/hal_libraries/ch32v303_hal/source/ch32v30x_gpio.c=GBK +encoding//obj/ble_bjq_ch303rct6_ml307.map=GBK encoding//packages/at_device-2.1.0/at_device.c=GBK encoding//packages/at_device-2.1.0/at_device.h=GBK encoding//packages/rt_vsnprintf_full-master/rt_vsnprintf.c=GBK diff --git a/.template b/.template index 51e8dc0..5c47e73 100644 --- a/.template +++ b/.template @@ -4,8 +4,8 @@ Series=CH32V307 RTOS=NoneOS MCU=CH32V307RVT6 Link=WCH-Link -PeripheralVersion==========1.4 -Description==========ROM(byte): 256K, SRAM(byte): 64K, CHIP PINS: 64, GPIO PORTS: 51.\nWCH CH32V3 series of mainstream MCUs covers the needs of a large variety of applications in the industrial,medical and consumer markets. High performance with first-class peripherals and low-power,low-voltage operation is paired with a high level of integration at accessible prices with a simple architecture and easy-to-use tools. +PeripheralVersion=================1.4 +Description=================ROM(byte): 256K, SRAM(byte): 64K, CHIP PINS: 64, GPIO PORTS: 51.\nWCH CH32V3 series of mainstream MCUs covers the needs of a large variety of applications in the industrial,medical and consumer markets. High performance with first-class peripherals and low-power,low-voltage operation is paired with a high level of integration at accessible prices with a simple architecture and easy-to-use tools. Mcu Type=CH32V30x Address=0x08000000 Target Path=obj\ble_bjq_ch303rct6_ml307.hex diff --git a/bsp/inc/bsp_button.h b/bsp/inc/bsp_button.h index 0121440..16497dc 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 512 /**< button_thread 线程堆栈大小 */ +#define BUTTON_THREAD_STACK_SIZE 768 /**< button_thread 线程堆栈大小 */ #endif // !BUTTON_USE_THREAD diff --git a/bsp/inc/bsp_ml307.h b/bsp/inc/bsp_ml307.h index 237f7c3..eff171d 100644 --- a/bsp/inc/bsp_ml307.h +++ b/bsp/inc/bsp_ml307.h @@ -148,10 +148,8 @@ typedef struct 无线调压阀出口压力 无线调压阀大气压 */ -typedef struct valve_data valve_data_t; - - -struct __attribute__((packed)) valve_data +typedef struct valve_t valve_data; +struct __attribute__((packed)) valve_t { uint8_t valve_id; uint8_t valve_mac[6]; @@ -180,7 +178,7 @@ struct __attribute__((packed)) DataBody uint16_t work_duration; //工作时长 uint8_t device_status; // 设备失效状态 rt_uint8_t valve_num; // 阀门数量 - struct valve_data valve_data[MAX_VALVE_NUM]; + struct valve_t valve_data[MAX_VALVE_NUM]; }; // 定义数据帧结构体 diff --git a/bsp/src/bsp_adc.c b/bsp/src/bsp_adc.c index 654dd98..8d9f2de 100644 --- a/bsp/src/bsp_adc.c +++ b/bsp/src/bsp_adc.c @@ -146,7 +146,7 @@ int BSP_ADC_Init(void) return 0; } #ifdef RT_USING_COMPONENTS_INIT -INIT_BOARD_EXPORT(BSP_ADC_Init); +INIT_DEVICE_EXPORT(BSP_ADC_Init); #endif /** diff --git a/bsp/src/bsp_bt.c b/bsp/src/bsp_bt.c index 96c2c00..39ee061 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-13 18:09:14 + * @LastEditTime: 2024-12-16 11:09:26 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c * @Description: * @@ -42,7 +42,7 @@ lwrb_t bt_lwrb_rx; static char bt_rx_buffer[256] = {0}; BTFrameData bt_frame = {0}; -valve_data_t valve_t[MAX_VALVE_NUM]; +valve_data valve[MAX_VALVE_NUM]; rt_size_t BSP_Bt_Send_Data(uint8_t *data, size_t size) { @@ -61,10 +61,10 @@ int BSP_BT_Init(void) { for (size_t i = 0; i < MAX_VALVE_NUM; i++) { - valve_t[i].valve_id = (i + 1); // 1-8 - if (Flash_Get_Mac_Addr(valve_t[i].valve_mac, i) == RT_EOK) + valve[i].valve_id = (i + 1); // 1-8 + if (Flash_Get_Mac_Addr(valve[i].valve_mac, i) == RT_EOK) { - rt_memcpy(valve_t[i].valve_mac, mac_buf, 6); + rt_memcpy(valve[i].valve_mac, mac_buf, 6); } } } @@ -72,7 +72,7 @@ int BSP_BT_Init(void) { for (size_t i = 0; i < MAX_VALVE_NUM; i++) { - rt_memset(&valve_t[i], 0, sizeof(valve_data_t)); + rt_memset(&valve[i], 0, sizeof(struct valve_t)); } } return RT_EOK; @@ -111,14 +111,14 @@ static int bt_recv_readline(void) { is_full = RT_TRUE; } - if ((ch == '\n' && last_ch == '\r') || ch == 0x55) + if (ch == '\n' && last_ch == '\r') { if (is_full) { LOG_E("read line failed. The line data length is out of buffer size(%d)!", lwrb_get_free(&bt_lwrb_rx)); return -RT_EFULL; } - + break; } last_ch = ch; @@ -245,20 +245,20 @@ int Bt_Valve_Handler(ValveCmdType type, rt_uint8_t id, rt_uint8_t *data) switch (type) { case kValveCmdCtr: // 阀门控制 - ret = BSP_Bt_Valve_Ctr(valve_t[id].valve_id, valve_t[id].valve_mac, WirelessValveClose); // 关阀门 + ret = BSP_Bt_Valve_Ctr(valve[id].valve_id, valve[id].valve_mac, WirelessValveClose); // 关阀门 break; case kValveCmdReg: // 阀门注册 - ret = BSP_Bt_Register_Valve(valve_t[id].valve_id, valve_t[id].valve_mac); + ret = BSP_Bt_Register_Valve(valve[id].valve_id, valve[id].valve_mac); break; case kValveCmdRem: // 阀门移除 - ret = BSP_Bt_Remove_Valve(valve_t[id].valve_id, valve_t[id].valve_mac); + ret = BSP_Bt_Remove_Valve(valve[id].valve_id, valve[id].valve_mac); break; case kValveCmdRep: // 阀门更换 - ret = BSP_Bt_Replace_Valve(valve_t[id].valve_id, valve_t[id].valve_mac, data); + ret = BSP_Bt_Replace_Valve(valve[id].valve_id, valve[id].valve_mac, data); if (ret == RT_EOK) { - rt_memcpy(valve_t[id].valve_mac, data, 6); - Flash_Set_Mac_Addr(valve_t[id].valve_mac, valve_t[id].valve_id - 1); + rt_memcpy(valve[id].valve_mac, data, 6); + Flash_Set_Mac_Addr(valve[id].valve_mac, valve[id].valve_id - 1); } break; default: @@ -272,82 +272,87 @@ int Bt_Valve_Handler(ValveCmdType type, rt_uint8_t id, rt_uint8_t *data) int BSP_Bt_Process(uint8_t *data, uint16_t len) { - int ret = 0; - uint16_t index = 0; + int ret = 0; + uint16_t index = 0; uint8_t data_buf[256] = {0}; // 解析接收到的数据帧,先寻找AA开头,然后再找AA下一个字节,其代表了数据长度,然后找到代表长度的值的长度的下一位,其为校验码,校验码后为结束码0x55, // 如果数据正确,则提取数据,不正确,则不处理 - LOG_HEX("BT_RX_DATA", 16, data, len); + // LOG_HEX("BT_RX_DATA", 16, data, len); + LOG_D("len = %d", len); if (len < 4) { // 至少需要 4 个字节:起始码、长度、校验码、结束码 - LOG_E("BT_RX_DATA_LEN_ERROR"); + LOG_E("长度不对 [1]"); + ; return 1; } while (index < len && data[index] != 0xAA) // 寻找起始码 0xAA { index++; } - if (index >= len - 3) // 不够空间容纳长度、校验码和结束码 - { - LOG_E("BT_RX_DATA_LEN_ERROR"); - return 2; - } - + LOG_D("index = %d", index); uint16_t datalength = data[index + 1]; // 读取数据长度 - if (index + 2 + datalength + 1 >= len) // 检查数据长度是否合理 数据长度 + 校验码 + 结束码 - { - LOG_E("BT_RX_DATA_LEN_ERROR"); - return 3; // - } + LOG_D("datalength = %d", datalength); - uint8_t rx_sum = data[index + 2 + datalength]; // 读取校验码 - uint8_t calculated_sum = XOR_CheckSum(&data[0], datalength + 2); // 计算校验码 + uint8_t rx_sum = data[index + 2 + datalength]; // 读取校验码 + uint8_t calculated_sum = XOR_CheckSum(&data[index], datalength + 2); // 计算校验码 if (rx_sum != calculated_sum) { - LOG_E("BT_RX_DATA_SUM_ERROR"); + LOG_E("校验和不对 rx_sum[%02X] != calculated_sum[%02X]", rx_sum, calculated_sum); + LOG_HEX("bt_rx_data:", 16, data, len); return 4; } if (data[index + 2 + datalength + 1] != 0x55) // 检查结束码 { - LOG_E("BT_RX_DATA_END_ERROR"); + LOG_E("结束码错误"); return 5; } + rt_uint8_t fram_len = datalength + 4; // 当程序走到这里时,就说明接收到了正确的数据帧,开始解析响应 - rt_memcpy(data_buf, &data[index + 3], datalength); + rt_memcpy(data_buf, &data[index], fram_len); switch (data[index + 2]) { case kValveEventCtr: LOG_D("valve control event"); - if (data[index + datalength - 3] == WirelessValveClose) // 关闭成功 + if (data_buf[fram_len - 3] == WirelessValveClose) // 关闭成功 { rt_sem_release(&bt_ctr_sem); } break; case kValveEventReg: - LOG_D("valve register event"); - if (data[index + datalength - 3] == RT_TRUE) // 注册成功 + if (data_buf[fram_len - 3] == RT_TRUE) // 注册成功) { + 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); + rt_sem_release(&bt_reg_sem); } break; case kValveEventRem: - LOG_D("valve remove event"); - if (data[index + datalength - 3] == RT_TRUE) // 移除成功 + if (data_buf[fram_len - 3] == RT_TRUE) // 移除成功 { + LOG_D("移除阀门响应成功"); rt_sem_release(&bt_rem_sem); } break; case kValveEventRep: - LOG_D("valve replace event"); - if (data[index + datalength - 3] == RT_TRUE) // 更换成功 + if (data_buf[index + datalength - 3] == RT_TRUE) // 更换成功 { + LOG_D("阀门更换响应成功"); rt_sem_release(&bt_rep_sem); } break; case kValveEventStatus: - LOG_D("valve status event"); + LOG_I("接收到阀门心跳数据:"); + LOG_HEX("bt_rx_data:", 16, data_buf, fram_len); // TODO:添加阀门数据处理函数 + rt_memcpy(&valve[data_buf[3] - 1], &data_buf[3], sizeof(struct valve_t)); + LOG_HEX("valve_data:", 16, (rt_uint8_t *)&valve[data_buf[3] - 1], sizeof(struct valve_t)); + break; default: LOG_W("unknow cmd: %02X", data[index + 2]); @@ -359,7 +364,6 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) static void BSP_Bt_Parse_Data(void) { - LOG_D("parse data:"); rt_size_t len = lwrb_get_full(&bt_lwrb_rx); char *rx_ptr = rt_calloc(1, len + 1); BSP_Bt_Recv_Data(rx_ptr, len); @@ -370,14 +374,15 @@ static void BSP_Bt_Parse_Data(void) static void Bt_Thread_Entry(void *parameter) { - //初始化阀门信息 - valve_t[0].valve_id = 1; - valve_t[0].valve_mac[0] = 0xb6; - valve_t[0].valve_mac[1] = 0xb4; - valve_t[0].valve_mac[2] = 0x8f; - valve_t[0].valve_mac[3] = 0x10; - valve_t[0].valve_mac[4] = 0x53; - valve_t[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; + LOG_D("Bt_Thread_Entry"); while (1) { @@ -450,6 +455,7 @@ static void TEST_BT_Send_Data(int argc, char **argv) { int mode = atoi(argv[1]); int id = atoi(argv[2]) - 1; + LOG_D("send data mode: %d id :%d", mode, id); switch (mode) { case 1: diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c index 0110e79..9bd4cf8 100644 --- a/bsp/src/bsp_flash.c +++ b/bsp/src/bsp_flash.c @@ -93,7 +93,7 @@ static rt_base_t interrupt_value; rt_uint8_t sys_hw_ver = 0x10; rt_uint8_t sys_sw_ver = 0x11; rt_uint8_t sys_nb_retry = 0x03; // 重试次数3次 -rt_uint16_t sys_nb_upload_cycle = 0x0078; // 120分钟一次 +rt_uint16_t sys_nb_upload_cycle = 0x001; // 120分钟一次 rt_uint16_t sys_alarm_h_value = 0x0032; // 50 rt_uint16_t sys_alarm_l_value = 0x09C4; // 2500 rt_uint8_t sys_temp_alarm_threshold = 0x32; diff --git a/bsp/src/bsp_ml307.c b/bsp/src/bsp_ml307.c index afb3b07..29a5c3d 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-11 13:04:23 + * @LastEditTime: 2024-12-15 17:09:30 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c * @Description: * @@ -60,13 +60,13 @@ Ml307EventIndex ml307_event_index; rt_uint8_t power_on_send_flag = 0; rt_mutex_t ml307_mutex; -extern valve_data_t valve_t[MAX_VALVE_NUM]; +extern valve_data valve[MAX_VALVE_NUM]; int BSP_Ml307_Init(struct Ml307_Ops *ops, rt_uint8_t version); int BSP_Ml307_Update(struct Ml307_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type); int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type); int Data_Resp(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type, char *data, rt_uint8_t res); -int Ml307_Recv_Data(struct Ml307_Ops *ops, char *data); +// int Ml307_Recv_Data(struct Ml307_Ops *ops, char *data); static struct DataBody body; static struct Ml307DataFrame frame; @@ -306,40 +306,20 @@ int BSP_Ml307_Init(struct Ml307_Ops *ops, rt_uint8_t version) int _Update_Valve_Data(struct Ml307_Ops *ops) { - valve_data_t valve_data_t[MAX_VALVE_NUM] = {0}; - rt_uint8_t id = 0; - rt_uint8_t mac_addr[FLASH_VALVE_MAC_ADDR_LEN] = {0}; - ops->body->valve_num = Flash_Get_Valve_Num(); + ops->body->valve_num = Flash_Get_Valve_Num(); if (ops->body->valve_num == 0) // 确保至少有一个阀门数据体 { LOG_D("No valve data"); - rt_memset(&ops->body->valve_data, 0, sizeof(struct valve_data)); // 直接全部发送0 - // rt_memcpy(&ops->body->valve_data, &valve_data_t[0], sizeof(struct valve_data)); + rt_memset(&ops->body->valve_data, 0, sizeof(struct valve_t)); // 直接全部发送0 } else { - for (int i = 0; i < MAX_VALVE_NUM; i++) - { - size_t j = 0; - Flash_Get_Mac_Addr(mac_addr, i); - for (; j < FLASH_VALVE_MAC_ADDR_LEN; j++) - { - if ((mac_addr[j] == 0xe3) || (mac_addr[j] == 0x39)) - { - break; - } - } - if (i == FLASH_VALVE_MAC_ADDR_LEN) - { - rt_memcmp(valve_t[i].valve_mac, mac_addr, FLASH_VALVE_MAC_ADDR_LEN); - rt_memcpy(&ops->body->valve_data[id], &valve_t[i], sizeof(valve_data_t)); - ops->body->valve_data[id].valve_id = (i + 1); - id++; - } - } + LOG_D("valve_num: %d", ops->body->valve_num); + rt_memcpy(&ops->body->valve_data[0], &valve[0], sizeof(struct valve_t)); } return RT_EOK; } + // 更新函数 int BSP_Ml307_Update(struct Ml307_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type) { @@ -387,11 +367,11 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, { if (ops->body->valve_num == 0) { - lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - 1) * sizeof(struct valve_data)); // 至少要发送一个阀门数据体 + lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - 1) * sizeof(struct valve_t)); // 至少要发送一个阀门数据体 } else { - lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - ops->body->valve_num) * sizeof(struct valve_data)); // 至少要发送一个阀门数据体 + lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - ops->body->valve_num) * sizeof(struct valve_t)); // 至少要发送一个阀门数据体 } for (int i = 0; i < lenght; i++) { @@ -436,6 +416,7 @@ int Data_Resp(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uin return _Send_Handle(ops, data_num, cmd, data_buf); } +#if 0 int Ml307_Recv_Data(struct Ml307_Ops *ops, char *data) { // ops->body = (struct DataBody *)rt_malloc(sizeof(struct DataBody)); @@ -443,6 +424,7 @@ int Ml307_Recv_Data(struct Ml307_Ops *ops, char *data) // rt_free(ops->body); return RT_EOK; } +#endif /***************************************发送处理函数************************************************ */ /** @@ -1221,16 +1203,16 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops) { if (mac_addr[0] == 0) // 无MAC地址数据,写入MAC地址数据 { - valve_t[data[0] - 1].valve_id = data[0]; - rt_memcpy(valve_t[data[0] - 1].valve_mac, &data[1], FLASH_VALVE_MAC_ADDR_LEN);//将信息更新 + valve[data[0] - 1].valve_id = data[0]; + rt_memcpy(valve[data[0] - 1].valve_mac, &data[1], FLASH_VALVE_MAC_ADDR_LEN); // 将信息更新 if (Bt_Valve_Handler(kValveCmdReg, data[0] - 1, RT_NULL) != RT_EOK) { 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; } - //TODO:此处需要等待蓝牙响应数据 - if(rt_sem_take(&bt_reg_sem, 10000) != RT_EOK) //等待十秒获取信号量 + // TODO:此处需要等待蓝牙响应数据 + if (rt_sem_take(&bt_reg_sem, 10000) != RT_EOK) // 等待十秒获取信号量 { 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); @@ -1290,7 +1272,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11], data[12]); if (i == FLASH_VALVE_MAC_ADDR_LEN) { - if (Bt_Valve_Handler(kValveCmdRep, data[0] - 1, &data[2]) != RT_EOK) + if (Bt_Valve_Handler(kValveCmdRep, data[0] - 1, &data[2]) != 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); diff --git a/rt-thread/rtconfig.h b/rt-thread/rtconfig.h index a234189..4ec2e0f 100644 --- a/rt-thread/rtconfig.h +++ b/rt-thread/rtconfig.h @@ -149,7 +149,7 @@ #define AT_SW_VERSION_NUM 0x10301 /* end of Network */ -#define IOT_MODULE_SWITCH 0 // 开启NB物联网功能 +#define IOT_MODULE_SWITCH 1 // 开启NB物联网功能 /* Utilities */ #define TEST_ENABLE //打开所有的终端测试程序