This commit is contained in:
小马_666 2024-12-16 15:35:19 +08:00
parent 6b0ae4194e
commit 81964ccc97
9 changed files with 84 additions and 97 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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];
};
// 定义数据帧结构体

View File

@ -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
/**

View File

@ -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,7 +111,7 @@ 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)
{
@ -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:

View File

@ -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;

View File

@ -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);

View File

@ -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 //打开所有的终端测试程序