From 039fca89a4950efb1553b1264867f4324b10cc36 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: Wed, 4 Dec 2024 18:55:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BA=864G=E7=9A=84=E5=BF=83?= =?UTF-8?q?=E8=B7=B3=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .settings/org.eclipse.core.resources.prefs | 4 +- .vscode/settings.json | 4 +- applications/main.c | 11 +- bsp/inc/at_device_ml307.h | 15 +- bsp/inc/bsp_bt.h | 5 +- bsp/inc/bsp_flash.h | 23 +- bsp/inc/bsp_ml307.h | 118 ++++--- bsp/inc/bsp_mq.h | 4 +- bsp/inc/bsp_vin_detection.h | 7 +- bsp/src/at_device_ml307.c | 42 +-- bsp/src/bsp_bt.c | 33 +- bsp/src/bsp_flash.c | 59 +++- bsp/src/bsp_ml307.c | 352 ++++++++++++++++----- bsp/src/bsp_vin_detection.c | 4 +- rt-thread/rtconfig.h | 6 +- 15 files changed, 492 insertions(+), 195 deletions(-) diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 4c2f9b4..d867afb 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -4,12 +4,12 @@ encoding//applications/main.c=UTF-8 encoding//applications/user_sys.h=UTF-8 encoding//board/board.c=UTF-8 encoding//board/board.h=UTF-8 -encoding//bsp/inc/at_device_ml307.h=GBK +encoding//bsp/inc/at_device_ml307.h=UTF-8 encoding//bsp/inc/bsp_bt.h=GBK encoding//bsp/inc/bsp_hr.h=GBK encoding//bsp/inc/bsp_led.h=UTF-8 encoding//bsp/src/at_device_ml307.c=UTF-8 -encoding//bsp/src/bsp_bt.c=GBK +encoding//bsp/src/bsp_bt.c=UTF-8 encoding//bsp/src/bsp_button.c=GBK encoding//bsp/src/bsp_flash.c=UTF-8 encoding//bsp/src/bsp_led.c=GBK diff --git a/.vscode/settings.json b/.vscode/settings.json index 65550c9..56f348f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -55,6 +55,8 @@ "ulog.h": "c", "ctype.h": "c", "string.h": "c", - "completion.h": "c" + "completion.h": "c", + "bsp_bt.h": "c", + "bsp_ml307.h": "c" } } diff --git a/applications/main.c b/applications/main.c index 6e538bb..e5de7e0 100644 --- a/applications/main.c +++ b/applications/main.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-10-23 17:14:16 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-04 09:23:08 + * @LastEditTime: 2024-12-04 11:37:55 * @FilePath: \ble_bjq_ch303rct6_ml307\applications\main.c * @Descrt_thread_ * @@ -162,12 +162,13 @@ int main(void) // 读取历史记录总数 Flash_GetTotalRecord(&TotalRecords); g_Calibration_status = Flash_Get_Calibration_State(); + rt_thread_mdelay(10); if (g_Calibration_status == kNotCalibrated)//没标定 { - // LED_STOP(r); - // LED_STOP(y); - // LED_CTRL(g, "1000,500", -1); - // LED_START(g); + LED_STOP(r); + LED_STOP(y); + LED_CTRL(g, "1000,500", -1); + LED_START(g); uint32_t ticks = 0, gas_calibration_voltage; while (1) diff --git a/bsp/inc/at_device_ml307.h b/bsp/inc/at_device_ml307.h index 0bfd2c7..38c1f0f 100644 --- a/bsp/inc/at_device_ml307.h +++ b/bsp/inc/at_device_ml307.h @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-10-09 08:42:14 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-02 16:54:17 + * @LastEditTime: 2024-12-04 15:56:22 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\at_device_ml307.h * @Description: * @ @@ -27,7 +27,7 @@ #include #include "completion.h" -/*测试地址*/ +/*娴嬭瘯鍦板潃*/ #if 0 #define TCP_SERVER_URL ("8.135.10.183 ") // #define TCP_SERVER_PORT ("35383") @@ -44,9 +44,9 @@ #define AT_SEND_MSOSD_FLAG_DEFAULT AT_SEND_MSOSD_FLAG_100 #define TCP_GET_SOCKET_STATUS ("AT+NSOSTATUS=%d") -#define TCP_CONNECT_CMD ("AT+MIPOPEN=%d,\"TCP\",\"%s\",%s") //AT+MIPOPEN=0,"TCP","120.27.12.119",2040 建立TCP连接 -#define TCP_CONNECT_STATE ("AT+MIPSTATE=%d")//AT+MIPSTATE=0 //查询指定连接的连接状态 -#define TCP_SEND_DATA ("AT+MIPSEND=%d,%d,\"%s\"") //第一个参数一般设为0,表示使用自动分配的 +#define TCP_CONNECT_CMD ("AT+MIPOPEN=%d,\"TCP\",\"%s\",%s") //AT+MIPOPEN=0,"TCP","120.27.12.119",2040 +#define TCP_CONNECT_STATE ("AT+MIPSTATE=%d")//AT+MIPSTATE=0 // +#define TCP_SEND_DATA ("AT+MIPSEND=%d,%d,\"%s\"") // #define TCP_CLOSE_SOCKET ("AT+MIPCLOSE=%d") /* close socket_id */ #define AT_DEVICE_ML307_SOCKETS_NUM 5 @@ -77,10 +77,7 @@ typedef struct __attribute__((packed)) uint8_t iccid[20]; uint8_t imsi[15]; uint8_t rssi; // RSSI - uint8_t rsrp; // RSRP - uint8_t rsrq; // RSRQ - uint16_t pci; // PCI - uint8_t snr; // SNR + uint8_t rsrq; // RSRP } ml307_sys_info; extern ml307_sys_info ml307; diff --git a/bsp/inc/bsp_bt.h b/bsp/inc/bsp_bt.h index 5dc40ee..547f302 100644 --- a/bsp/inc/bsp_bt.h +++ b/bsp/inc/bsp_bt.h @@ -2,8 +2,8 @@ * @Author: mbw * @Date: 2024-12-03 10:31:59 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-03 10:35:18 - * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\bsp_at.h + * @LastEditTime: 2024-12-04 13:34:14 + * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\bsp_bt.h * @Description: * @ * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. @@ -50,7 +50,6 @@ - #endif //BSP_BT_H__ diff --git a/bsp/inc/bsp_flash.h b/bsp/inc/bsp_flash.h index 78a06b1..88ced0b 100644 --- a/bsp/inc/bsp_flash.h +++ b/bsp/inc/bsp_flash.h @@ -128,6 +128,23 @@ #define FLASH_CALIBRATION_STATUS_ADDR (FLASH_SERVER_ADDR_ADDR + FLASH_SERVER_LEN) #define FLASH_CALIBRATION_STATUS_LEN (1) +/*无线阀门数量*/ +#define FLASH_VALVE_NUM_ADDR (FLASH_CALIBRATION_STATUS_ADDR + FLASH_CALIBRATION_STATUS_LEN) +#define FLASH_VALVE_NUM_LEN (1) + +/*无线阀门 1号 MAC地址*/ +#define FLASH_VALVE_1_MAC_ADDR_ADDR (FLASH_VALVE_NUM_ADDR + FLASH_VALVE_NUM_LEN) +#define FLASH_VALVE_MAC_ADDR_LEN (6) + +#define FLASH_VALVE_2_MAC_ADDR_ADDR (FLASH_VALVE_1_MAC_ADDR_ADDR + FLASH_VALVE_MAC_ADDR_LEN) +#define FLASH_VALVE_3_MAC_ADDR_ADDR (FLASH_VALVE_2_MAC_ADDR_ADDR + FLASH_VALVE_MAC_ADDR_LEN) +#define FLASH_VALVE_4_MAC_ADDR_ADDR (FLASH_VALVE_3_MAC_ADDR_ADDR + FLASH_VALVE_MAC_ADDR_LEN) +#define FLASH_VALVE_5_MAC_ADDR_ADDR (FLASH_VALVE_4_MAC_ADDR_ADDR + FLASH_VALVE_MAC_ADDR_LEN) +#define FLASH_VALVE_6_MAC_ADDR_ADDR (FLASH_VALVE_5_MAC_ADDR_ADDR + FLASH_VALVE_MAC_ADDR_LEN) +#define FLASH_VALVE_7_MAC_ADDR_ADDR (FLASH_VALVE_6_MAC_ADDR_ADDR + FLASH_VALVE_MAC_ADDR_LEN) +#define FLASH_VALVE_8_MAC_ADDR_ADDR (FLASH_VALVE_7_MAC_ADDR_ADDR + FLASH_VALVE_MAC_ADDR_LEN) + + #define FLASH_INIT_FLAG_ADDR (FLASH_CONFIG_INFO_START_ADDR + 254) @@ -293,8 +310,12 @@ void BSP_Flash_EraseRecodrs(void); int BSP_Flash_Init(void); rt_uint8_t Flash_Sys_Cfg(TeFlashCfgInfoId id, rt_uint8_t *buf, rt_size_t len); - size_t Flash_Get_SysCfg(TeFlashCfgInfoId id); + +int Flash_Set_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number); +int Flash_Get_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number); +rt_uint8_t Flash_Get_Valve_Num(void); +int Flash_Set_Valve_Num(rt_uint8_t valve_num); int BSP_Flash_Write_Info(rt_uint8_t *buf, rt_size_t len); int Flash_Get_Sever_Addr_Info(struct flash_sever_info *sever_info); int Flash_Set_Sever_Addr_Info(rt_uint8_t *data); diff --git a/bsp/inc/bsp_ml307.h b/bsp/inc/bsp_ml307.h index 2f3aeca..5e55d4e 100644 --- a/bsp/inc/bsp_ml307.h +++ b/bsp/inc/bsp_ml307.h @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-11-30 15:46:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-04 09:34:21 + * @LastEditTime: 2024-12-04 18:49:45 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\bsp_ml307.h * @Description: * @ @@ -12,6 +12,10 @@ #include #include "drv_gpio.h" + +#define MAX_VALVE_NUM 8 + + #define ML307_ENABLE_3_8_V GET_PIN(B, 3) #define ML307_PWR_PIN GET_PIN(B, 4) #define ML307_RST_PIN GET_PIN(B, 5) @@ -56,7 +60,6 @@ /*调压器新增事件类型*/ - /*指令下发*/ #define INSTRUCTION_DOWN_SELF_CHECK 0x50 // 指令下发 - 自检 #define INSTRUCTION_DOWN_MUTE 0x51 // 指令下发 - 消音 @@ -70,30 +73,28 @@ #define INSTRUCTION_HEART_BEAT 0x59 // 心跳 #define INSTRUCTION_DOWN_SEVER_ADDR 0x60 // 设置服务器地址和端口 -/*调压器新增指令下发*/ +/**********************************调压器新增指令下发**********************************************************/ +#define INSTRUCTION_DOWN_VALVE_ADD 0x61 // 新增阀门设备 +#define INSTRUCTION_DOWN_VALVE_REPLACE 0x62 // 更换阀门设备 +#define INSTRUCTION_DOWN_VALVE_REMOVE 0x63 // 移除阀门设备 +/************************************************************************************************************/ +#define RESPONSE_CODE_SUCCESS 0x00 // 响应码 - 操作成功 +#define RESPONSE_CODE_CRC_FAIL 0x01 // 响应码 - CRC 校验失败 +#define RESPONSE_CODE_PARSE_FAIL 0x02 // 响应码 - 数据解析失败(命令错误或者其他指令错误) +#define RESPONSE_CODE_ACTION_FAILURE 0x03 // 响应码 - 动作执行失败 +#define RESPONSE_CODE_NO_FUNCTION 0xAF // 响应码 - 无此功能 +#define RESPONSE_CODE_OTHER_ERROR 0xFF // 响应码 - 其他错误 -#define INSTRUCTION_DOWN_VALVE_OPEN 0x61 //新增阀门设备 -#define INSTRUCTION_DOWN_VALVE_REPLACE 0x62 //更换阀门设备 -#define INSTRUCTION_DOWN_VALVE_REMOVE 0x63//移除阀门设备 +#define MAX_DATA_LEN 512 // 数据长度 +#define ML307_DEFIENE_DATA "000000000000000000000000000000" -#define RESPONSE_CODE_SUCCESS 0x00 // 响应码 - 操作成功 -#define RESPONSE_CODE_CRC_FAIL 0x01 // 响应码 - CRC 校验失败 -#define RESPONSE_CODE_PARSE_FAIL 0x02 // 响应码 - 数据解析失败(命令错误或者其他指令错误) -#define RESPONSE_CODE_ACTION_FAILURE 0x03 // 响应码 - 动作执行失败 -#define RESPONSE_CODE_NO_FUNCTION 0xAF // 响应码 - 无此功能 -#define RESPONSE_CODE_OTHER_ERROR 0xFF // 响应码 - 其他错误 - -#define MAX_DATA_LEN 256 // 数据长度 - -#define ML307_DEFIENE_DATA "000000000000000000000000000000" - -#define DEVICE_DEFINE 1 // 具备该设备功能 -#define DEVICE_NOT_DEFINE 0 // 不具备该功能 -#define DEVICE_CONNECTED 1 // 设备连接上 -#define DEVICE_DISCONNECTED 0 // 设备未连接 -#define DEVICE_OPEN 1 // 设备开启 -#define DEVICE_CLOSE 0 // 设备关闭 +#define DEVICE_DEFINE 1 // 具备该设备功能 +#define DEVICE_NOT_DEFINE 0 // 不具备该功能 +#define DEVICE_CONNECTED 1 // 设备连接上 +#define DEVICE_DISCONNECTED 0 // 设备未连接 +#define DEVICE_OPEN 1 // 设备开启 +#define DEVICE_CLOSE 0 // 设备关闭 typedef enum { /****************优先级最低***************** */ @@ -109,11 +110,11 @@ typedef enum kMl307FaultRcyEvent, // 故障恢复事件 kMl307DeviceFailureEvent, // 设备失效事件 kMl307TimeCalibrationEvent, // 时间校准事件 - /**********************优先级第三************************* */ + /**********************优先级第三************************* */ kMl307SelfCheckEvent, // 自检事件 - /**********************优先级第二************************* */ + /**********************优先级第二************************* */ kMl307PowerDownEvent, // 掉电事件 - /**********************优先级第一************************* */ + /**********************优先级第一************************* */ kMl307PowerOnEvent, // 上电事件 kMl307MaxEventcnt // 最大事件计数 @@ -129,7 +130,7 @@ typedef enum kSensorFaultStatus, // 传感器故障触发状态 kSensorRecoveredStatus, // 传感器故障解除状态 kPowerDownStatus, // 掉电状态 -} Ml307Status; // 当前所处的上报状态 +} Ml307Status; // 当前所处的上报状态 typedef struct { @@ -137,6 +138,32 @@ typedef struct Ml307Event last_event; // 上次事件 } Ml307EventIndex; +/* +无线调压阀编号 +无线调压阀 MAC 地址 +无线调压阀连接状态 +无线调压阀开关状态 +无线调压阀温度 +无线调压阀进口压力 +无线调压阀出口压力 +无线调压阀大气压 +*/ +typedef struct valve_data valve_data_t; + + +struct __attribute__((packed)) valve_data +{ + uint8_t valve_id; + uint8_t valve_mac[6]; + uint8_t valve_connct_status; + uint8_t valve_switch_status; + uint8_t valve_temp; + uint32_t valve_in_pressure; + uint32_t valve_out_pressure; + uint32_t valve_atm_pressure; +}; + + struct __attribute__((packed)) DataBody { uint8_t device_type; // 设备类型 @@ -148,20 +175,13 @@ struct __attribute__((packed)) DataBody uint8_t imsi[15]; // IMSI uint8_t rssi; // RSSI uint8_t rsrp; // RSRP - uint8_t rsrq; // RSRQ - uint16_t pci; // PCI - int8_t snr; // SNR - float product_work_temperature; // 产品工作温度 - uint16_t work_duration; // 工作时长 - float lel; // 气体浓度 - float temp; // 环境温度 - float laser_temp; // 激光器温度 - float signal_strength; // 激光光强度 - float gain; // 放大系数 - uint8_t fault_code; // 故障码 - uint8_t device_status; // 设备失效状态 - uint8_t emv_status; // 电磁阀状态 - uint8_t relay_status; // 继电器状态 + uint16_t gas_voltage; // 传感器电压 + uint8_t product_work_temperature; //产品工作温度 + uint16_t work_duration; //工作时长 + uint8_t device_status; // 设备失效状态 + rt_uint8_t valve_num; // 阀门数量 + struct valve_data valve_data[MAX_VALVE_NUM]; + // valve_data_t* valve_data; // 阀门数据指针 }; // 定义数据帧结构体 @@ -188,15 +208,15 @@ struct __attribute__((packed)) Ml307Data struct __attribute__((packed)) Ml307RecvData { - rt_uint8_t header[3]; // 帧头 - rt_uint8_t version; // 协议版本 - rt_uint16_t manufacture; // 厂商标识 - rt_uint16_t datanumber; // 数据序列号 - rt_uint8_t cmd; // 命令位 - rt_uint16_t datalen; // 数据长度 + rt_uint8_t header[3]; // 帧头 + rt_uint8_t version; // 协议版本 + rt_uint16_t manufacture; // 厂商标识 + rt_uint16_t datanumber; // 数据序列号 + rt_uint8_t cmd; // 命令位 + rt_uint16_t datalen; // 数据长度 struct Ml307Data recv_data; // 接收数据体 - rt_uint16_t crc16; // 校验位 - rt_uint8_t tail[3]; // 帧尾 + rt_uint16_t crc16; // 校验位 + rt_uint8_t tail[3]; // 帧尾 }; struct Ml307_Ops diff --git a/bsp/inc/bsp_mq.h b/bsp/inc/bsp_mq.h index 7b47ff4..1b3ce33 100644 --- a/bsp/inc/bsp_mq.h +++ b/bsp/inc/bsp_mq.h @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-11-30 16:46:31 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-11-30 16:57:58 + * @LastEditTime: 2024-12-04 16:18:21 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\bsp_mq.h * @Description: * @ @@ -52,7 +52,7 @@ #define MQ_END_OF_LIFE_TIMS_DAYS (uint16_t)(365 * 5 + 30 * 3) -#define GAS_SNESOR_THREAD_STACK_SIZE (512+128) +#define GAS_SNESOR_THREAD_STACK_SIZE (1024) #define GAS_SENSOR_THREAD_PRIORITY 9 #define GAS_SENSOR_THREAD_TIMESLICE 5 diff --git a/bsp/inc/bsp_vin_detection.h b/bsp/inc/bsp_vin_detection.h index 82c797e..d7d6299 100644 --- a/bsp/inc/bsp_vin_detection.h +++ b/bsp/inc/bsp_vin_detection.h @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-11-30 15:46:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-04 10:13:57 + * @LastEditTime: 2024-12-04 17:06:16 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\bsp_vin_detection.h * @Description: * @ @@ -33,9 +33,10 @@ // 不含输入二极管的压降 // (4.7/19.7) * 13V = 3.1V, 3.1/3.3*4096 = 3723 -#define VIN_ADC_HIGH_THRESHOLD (uint16_t)3723 // 13V +// #define VIN_ADC_HIGH_THRESHOLD (uint16_t)3723 // 13V +#define VIN_ADC_HIGH_THRESHOLD (uint16_t)4095 // // (4.7/19.7) * 10V = 2.39V, 2.39/3.3*4096 = 2966 -#define VIN_ADC_LOW_THRESHOLD (uint16_t)2665 // 9V +#define VIN_ADC_LOW_THRESHOLD (uint16_t)2369 // 9V float Get_VIN_Voltage(void); diff --git a/bsp/src/at_device_ml307.c b/bsp/src/at_device_ml307.c index 37ecb6f..cf79717 100644 --- a/bsp/src/at_device_ml307.c +++ b/bsp/src/at_device_ml307.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-09-04 13:33:49 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-04 10:25:18 + * @LastEditTime: 2024-12-04 16:23:57 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c * @Description : * @@ -43,7 +43,7 @@ #ifdef AT_DEVICE_USING_ML307 #define ML307_WAIT_CONNECT_TIME 5000 -#define ML307_THREAD_STACK_SIZE 2560 +#define ML307_THREAD_STACK_SIZE 4096 #define ML307_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 2) char data_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; @@ -239,7 +239,6 @@ static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t s { if (id == socket_id) { - HexStrToBytes(data_buf, recv_byte_buf, len * 2); LOG_D("ml307 recv data: %s", data_buf); crc16 = crc1021(data_buf, len * 2 - 10); // 去掉帧尾三个字节和2个字节的校验值,字符长度为10 @@ -251,21 +250,21 @@ static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t s { LOG_E("ml307 recv data error {crc16 [%x]!= rec_crc16[%x]}", crc16, rec_crc16); } - // else - // { - // /*比较数组的长度和结构体的长度是否一致,如果不一致则数据解析错误,如果一致复制数组值到结构体中*/ - // if (len == sizeof(struct Ml307RecvData)) - // { - // rt_memset(ml307_ops.recv, 0, sizeof(struct Ml307RecvData)); // 清空结构体 - // rt_memcpy(ml307_ops.recv, recv_byte_buf, sizeof(struct Ml307RecvData)); + else + { + /*比较数组的长度和结构体的长度是否一致,如果不一致则数据解析错误,如果一致复制数组值到结构体中*/ + if (len == sizeof(struct Ml307RecvData)) + { + rt_memset(ml307_ops.recv, 0, sizeof(struct Ml307RecvData)); // 清空结构体 + rt_memcpy(ml307_ops.recv, recv_byte_buf, sizeof(struct Ml307RecvData)); - // rt_sem_release(ml307_recv_sem); - // } - // else - // { - // LOG_E("ml307 recv data error {len [%d]!= sizeof(struct Ml307RecvData)[%d]}", len, sizeof(struct Ml307RecvData)); - // } - // } + rt_sem_release(ml307_recv_sem); + } + else + { + LOG_E("ml307 recv data error {len [%d]!= sizeof(struct Ml307RecvData)[%d]}", len, sizeof(struct Ml307RecvData)); + } + } } } } @@ -1106,6 +1105,13 @@ static void ml307_init_thread_entry(void *parameter) result = -RT_ERROR; goto __exit; } + /*设置包模式*/ + if (at_obj_exec_cmd(device->client, resp, "AT+MIPCFG=\"encoding\",0,1,1") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + { #define ML307_NETDEV_HWADDR_LEN 8 #define ML307_IMEI_LEN 15 @@ -1466,7 +1472,7 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device) { LOG_D("%s device signal rsrp: %d, rsrq: %d", device->name, rsrp, rsrq); - ml307.rsrp = rsrp; +// ml307.rsrp = rsrp; ml307.rsrq = rsrq; break; } diff --git a/bsp/src/bsp_bt.c b/bsp/src/bsp_bt.c index 0470d9c..d6c1211 100644 --- a/bsp/src/bsp_bt.c +++ b/bsp/src/bsp_bt.c @@ -1,8 +1,33 @@ #include "bsp_bt.h" +#include "bsp_ml307.h" +#include "bsp_flash.h" +#include "rtdef.h" +valve_data_t valve_t[MAX_VALVE_NUM]; - - - - +int BSP_BT_Init(void) +{ + rt_uint8_t num = Flash_Get_Valve_Num(); + rt_uint8_t mac_buf[FLASH_VALVE_MAC_ADDR_LEN] = {0}; + if (num != 0) + { + for (size_t i = 0; i < MAX_VALVE_NUM; i++) + { + valve_t[i].valve_id = i; + if (Flash_Get_Mac_Addr(valve_t[i].valve_mac, i) == RT_EOK) + { + rt_memcpy(valve_t[i].valve_mac, mac_buf, 6); + } + } + } + else + { + for (size_t i = 0; i < MAX_VALVE_NUM; i++) + { + rt_memset(&valve_t[i], 0, sizeof(valve_data_t)); + } + } + return RT_EOK; +} +INIT_PREV_EXPORT(BSP_BT_Init); diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c index 21b71c2..971e325 100644 --- a/bsp/src/bsp_flash.c +++ b/bsp/src/bsp_flash.c @@ -91,10 +91,10 @@ rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能 struct flash_sever_info sever_info = { - // .server_url = "47.94.169.135", - // .server_port = "7150", - .server_port = "36078", - .server_url = "8.135.10.183", + .server_url = "47.94.169.135", + .server_port = "7150", + // .server_port = "36078", + // .server_url = "8.135.10.183", }; @@ -334,7 +334,7 @@ int Flash_Set_Calibration_State(TeCalibrationStatus status) { rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0}; rt_uint8_t in_page_offset = (FLASH_CALIBRATION_STATUS_ADDR - FLASH_CONFIG_INFO_START_ADDR); - + LOG_D("FLASH_CALIBRATION_STATUS_ADDR = %X", FLASH_CALIBRATION_STATUS_ADDR); Flash_ErasePage_ReadConfigInfo(page_buf); //*将传入的数据写到flash地址中 @@ -343,7 +343,54 @@ int Flash_Set_Calibration_State(TeCalibrationStatus status) return Flash_Write_ConfigInfo(page_buf); } +/*写入MAC地址*/ +int Flash_Set_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number) +{ + rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0}; + rt_uint8_t in_page_offset = ((FLASH_VALVE_1_MAC_ADDR_ADDR + number * FLASH_VALVE_MAC_ADDR_LEN) - FLASH_CONFIG_INFO_START_ADDR); + if (mac_addr == RT_NULL) + { + return -RT_ERROR; + } + Flash_ErasePage_ReadConfigInfo(page_buf); + for (size_t i = 0; i < FLASH_VALVE_MAC_ADDR_LEN; i++) + { + page_buf[in_page_offset++] = mac_addr[i]; + } + return Flash_Write_ConfigInfo(page_buf); +} +/*读取MAC地址*/ +int Flash_Get_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number) +{ + rt_uint8_t data[FLASH_VALVE_MAC_ADDR_LEN]; + rt_memcpy(data, (rt_uint8_t *)(FLASH_VALVE_1_MAC_ADDR_ADDR + number * FLASH_VALVE_MAC_ADDR_LEN), FLASH_VALVE_MAC_ADDR_LEN); + if (data == RT_NULL) + { + LOG_E("Flash_Get_Mac_Addr failed"); + return -RT_ERROR; + } + LOG_D("data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x", 0, data[0], 1, data[1], 2, data[2], 3, data[3], 4, data[4], 5, data[5]); + rt_snprintf(mac_addr, 6, "%02x:%02x:%02x:%02x:%02x:%02x", + data[5], data[4], data[3], data[2], data[1], data[0]); + return 0; +} + +/*设置无线调压器数量*/ +int Flash_Set_Valve_Num(rt_uint8_t valve_num) +{ + rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0}; + rt_uint8_t in_page_offset = (FLASH_VALVE_NUM_ADDR - FLASH_CONFIG_INFO_START_ADDR); + Flash_ErasePage_ReadConfigInfo(page_buf); + page_buf[in_page_offset] = valve_num; + return Flash_Write_ConfigInfo(page_buf); +} + +/*获取无线调压器数量*/ +rt_uint8_t Flash_Get_Valve_Num(void) +{ + return *(rt_uint8_t *)FLASH_VALVE_NUM_ADDR; +} /** * @description: Flash Erase Page * @param {TeRecord} record @@ -878,7 +925,7 @@ int BSP_Flash_Init(void) LOG_D("Flash_Set_Sever_Addr_Info error!"); } Flash_Set_Calibration_State(kSysGasCalibStatus);//未标定状态 - + Flash_Set_Valve_Num(0); Flash_Write(FLASH_HW_VER_ADDR, (rt_uint8_t *)&sci, (sizeof(sys_config_info) - 50)); diff --git a/bsp/src/bsp_ml307.c b/bsp/src/bsp_ml307.c index bc2b0d0..7a5e90f 100644 --- a/bsp/src/bsp_ml307.c +++ b/bsp/src/bsp_ml307.c @@ -2,11 +2,11 @@ * @Author: mbw * @Date: 2024-11-30 15:46:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-04 09:10:26 + * @LastEditTime: 2024-12-04 18:54:55 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + * @Description: + * + * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ #include #include "drv_gpio.h" @@ -15,13 +15,15 @@ #include "bsp_flash.h" #include "stddef.h" #include "bsp_rtc.h" +#include "bsp_bt.h" +#include "bsp_mq.h" #define LOG_TAG "ml307" #include #if IOT_MODULE_SWITCH == 1 -#define ML307_THREAD_STACK_SIZE (4096) -#define ML307_RECV_THREAD_STACK_SIZE (4096) +#define ML307_THREAD_STACK_SIZE (4096+2048) +#define ML307_RECV_THREAD_STACK_SIZE (4096+2048) #define ML307_LIFE_THREAD_STACK_SIZE (1024) #define ML307_THREAD_PRIORITY 25 #define ML307_THREAD_TICKS 50 @@ -31,7 +33,6 @@ #define ML307_LIFE_THREAD_PRIORITY 26 #define ML307_LIFE_THREAD_TICKS 10 - // static rt_uint32_t ml307_status = 0; ALIGN(RT_ALIGN_SIZE) static char ml307_thread_stack[ML307_THREAD_STACK_SIZE]; @@ -59,6 +60,9 @@ 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]; + 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); @@ -92,7 +96,7 @@ static struct at_device_ml307 _dev = { }; static rt_uint32_t ml307_event_flags[kMl307MaxEventcnt] = {0}; -static rt_bool_t ml307_event_initialized = RT_FALSE; // 是否初始化完成 +static rt_bool_t ml307_event_initialized = RT_FALSE; // 是否初始化完成 typedef enum { @@ -147,7 +151,6 @@ rt_uint32_t Ml307_Get_Event_Flag(Ml307Event event_type) void Ml307_Send_Event(Ml307Event event_type) { - LOG_D("Send_Ml307_Event = %d", event_type); ml307_event_index.last_event = ml307_event_index.current_event; ml307_event_index.current_event = event_type; if (ml307_event_initialized == RT_TRUE) @@ -191,12 +194,12 @@ static void Ml307_Error_Timer_Cb(void *parameter) static void Ml307_Heartbeat_check_Timer_Cb(void *parameter) { -// static rt_uint8_t relay_cnt = 0; + // static rt_uint8_t relay_cnt = 0; if (last_value == current_value) { // rt_timer_start(ml307_timer); // 重启一下定时器 // relay_cnt++; - reboot();//三个心跳周期定时器都没启动,直接重启 + reboot(); // 三个心跳周期定时器都没启动,直接重启 } // else // { @@ -213,21 +216,20 @@ void Reset_Ml307_Life_Timer(void) { if (ml307_life_timer != RT_NULL) { - // rt_timer_stop(ml307_life_timer);//启动这个时,他会自动清除以前的定时器,所以不必担心是否已经启动的问题,困扰我不少时间,点进去第一二句就是 rt_timer_start(ml307_life_timer); } } int _Pack_Send(struct Ml307_Ops *ops, char *buf) { - char ml307_send_buf[512] = {0}; // 发送缓冲区,用于存储最终发送的数据 - // char byteArr1[512]; // 转换成字节值 - unsigned short crc16 = 0; // 存储CRC16校验和 + char ml307_send_buf[1024] = {0}; // 发送缓冲区,用于存储最终发送的数据 + // char byteArr1[512]; // 转换成字节值 + unsigned short crc16 = 0; // 存储CRC16校验和 struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ML307_SAMPLE_DEIVCE_NAME); ASSERT(device); crc16 = crc1021(buf, rt_strlen(buf)); - LOG_D("buf: %s", buf); + LOG_D("buf: %s", buf); LOG_D("crc16: %X", crc16); // 将数据、校验和及尾部标识添加到发送缓冲区中 if (rt_snprintf(ml307_send_buf, sizeof(ml307_send_buf), @@ -246,7 +248,7 @@ int _Pack_Send(struct Ml307_Ops *ops, char *buf) // LOG_D("ml307_send_buf: %s", ml307_send_buf); rt_uint16_t data_len = rt_strlen(ml307_send_buf); // 通过AT指令发送数据给ML307模块 - if (at_send_data(device, ml307_send_buf, data_len) != RT_EOK) + if (at_send_data(device, ml307_send_buf, data_len/2) != RT_EOK) { return -RT_ERROR; } @@ -269,7 +271,7 @@ int _Pack_Send(struct Ml307_Ops *ops, char *buf) static int _Send_Handle(struct Ml307_Ops *ops, rt_size_t data_num, rt_size_t cmd_num, const char *data) { // 临时缓冲区,用于格式化数据 - char data_buf[512] = {0}; + char data_buf[1024] = {0}; rt_size_t data_len = rt_strlen(data); // 格式化数据,构建发送给ML307模块的数据包 @@ -282,7 +284,7 @@ static int _Send_Handle(struct Ml307_Ops *ops, rt_size_t data_num, rt_size_t cmd ops->frame->manufacture, // 制造商ID data_num, cmd_num, - data_len/2, + data_len / 2, data); if (len < 0 || len >= sizeof(data_buf)) { @@ -307,7 +309,7 @@ int BSP_Ml307_Init(struct Ml307_Ops *ops, rt_uint8_t version) ops->frame->header[0] = 0x4A; ops->frame->header[1] = 0x54; - ops->frame->header[2] = 0x34; + ops->frame->header[2] = 0x30; ops->frame->version = version; ops->frame->manufacture = DEVICE_MANUFACTURE; @@ -318,28 +320,65 @@ int BSP_Ml307_Init(struct Ml307_Ops *ops, rt_uint8_t version) return RT_EOK; } + +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(); + if (ops->body->valve_num == 0)//确保至少有一个阀门数据体 + { + LOG_D("No valve data"); + rt_memcpy(&ops->body->valve_data, &valve_data_t[0], sizeof(struct valve_data)); + } + 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] == 0xe9)) + { + break; + } + } + if(i == FLASH_VALVE_MAC_ADDR_LEN) + { + rt_memcpy(&ops->body->valve_data[id], &valve_t[i], sizeof(valve_data_t)); + id++; + } + } + } + return RT_EOK; +} // 更新函数 int BSP_Ml307_Update(struct Ml307_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type) { + + ops->body->device_type = device_type; ops->body->event_type = event_type; ops->body->hw = (rt_uint8_t)Flash_Get_SysCfg(kHwVerId); ops->body->sw = (rt_uint8_t)Flash_Get_SysCfg(kSwVerId); - rt_memcpy(ops->body->imei, &ml307, sizeof(ml307_sys_info)); // 直接赋值结构体数据 -// rt_memcpy(&(ops->body->lel), &Sensor_device.Data, (rt_ubase_t)offsetof(TsH308Data, checksum)); // 复制除了校验码以外的数据 - ops->body->product_work_temperature = ops->body->temp; // 暂时定为激光器测量的环境温度 + rt_memcpy(ops->body->imei, &ml307, sizeof(ml307_sys_info)); // 直接赋值结构体数据 + ops->body->gas_voltage = Get_Gas_VoltageInt1000x(); + ops->body->product_work_temperature = 0x32; ops->body->work_duration = work_duration; ops->body->device_status = device_state_flag; -// ops->body->emv_status = emv_state_flag; -// ops->body->relay_status = relay_state_flag; + ops->body->valve_num = Flash_Get_Valve_Num(); + _Update_Valve_Data(ops); return RT_EOK; } 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) { + rt_size_t lenght = 0; int ret = 0; - char data_buf[512] = {0}; + char data_buf[1024] = {0}; char temp[3]; // 临时缓冲区,用于存储每个字节的十六进制表示 if (ops == NULL || ops->body == NULL) @@ -358,10 +397,18 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_mutex_take(ml307_mutex, RT_WAITING_FOREVER); if (ml307_conncet_tcp_flag) { - ret = ml307_ops.update_data(ops, device_type, event_type); + ret = ml307_ops.update_data(ops, device_type, event_type); if (ret == RT_EOK) { - for (int i = 0; i < sizeof(struct DataBody); i++) + if (ops->body->valve_num == 0) + { + lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - 1) * sizeof(struct valve_data));//至少要发送一个阀门数据体 + } + else + { + lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - ops->body->valve_num) * sizeof(struct valve_data));//至少要发送一个阀门数据体 + } + for (int i = 0; i < lenght; i++) { rt_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]); rt_memcpy(data_buf + i * 2, temp, 2); @@ -370,18 +417,18 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, ret = _Send_Handle(ops, data_num, cmd, data_buf); if (ret != RT_EOK) { - + // rt_free(ops->body->valve_data); return -ret; } - rt_mutex_release(ml307_mutex); } - } else { + rt_mutex_release(ml307_mutex); LOG_E("ml307_conncet_tcp_flag = 0"); - ret = -RT_ERROR; + ret = -RT_ERROR; } + // rt_free(ops->body->valve_data); return ret; } @@ -424,7 +471,7 @@ int Ml307_Send_Heartbeat(struct at_device *device, void *param) { struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; - int ret = 0; + int ret = 0; if ((device == RT_NULL) || (ml307_ops == RT_NULL)) { @@ -783,7 +830,7 @@ const Ml307EventInfo ml307_event_info[] = { {kMl307FaultRcyEvent, ML307_PRIORITY_LOWEST, "传感器故障解除事件", Ml307_Send_Fault_Recover}, {kMl307TimeCalibrationEvent, ML307_PRIORITY_LOWEST, "时间校准事件", Ml307_Send_Time_Calibration}, {kMl307SilenceEvent, ML307_PRIORITY_LOWEST, "消音事件", Ml307_Send_Silence}, - {kMl307ExceptionEvent, ML307_PRIORITY_LOWEST, "异常事件", Ml307_Send_Exception}, + // {kMl307ExceptionEvent, ML307_PRIORITY_LOWEST, "异常事件", Ml307_Send_Exception}, {kMl307ValveStatusEvent, ML307_PRIORITY_LOWEST, "电磁阀状态改变事件", Ml307_Send_Valve_Status}, {kMl307FanStatusEvent, ML307_PRIORITY_LOWEST, "风机状态改变事件", Ml307_Send_Fan_Status}, {kMl307DeviceFailureEvent, ML307_PRIORITY_LOWEST, "设备失效事件", Ml307_Send_Device_Failure}}; @@ -795,7 +842,7 @@ const Ml307EventInfo ml307_event_info[] = { */ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, void *param) { - struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; + struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; const Ml307EventInfo *event = RT_NULL; for (size_t i = 0; i < sizeof(ml307_event_info) / sizeof(Ml307EventInfo); ++i) @@ -807,9 +854,8 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, break; } } - - // 处理该事件 - if (event) + + if (event)// 处理该事件 { // 打印事件的名称 LOG_D("%s上报\n", event->event_name); @@ -928,37 +974,72 @@ void Handle_Mute(struct Ml307_Ops *ops) ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_MUTE, temp, RESPONSE_CODE_SUCCESS); } -void Handle_Close_Valve(struct Ml307_Ops *ops) +/*关阀 52-阀门编号(1byte)+ MAC地址(6byte)+ 补零字节 = 15byte 如果内容全部为0,则默认为关闭有线阀门*/ +rt_err_t Handle_Close_Valve(struct Ml307_Ops *ops) { LOG_D("服务器下发关闭阀门指令\n"); - + int i = 0; + char mac_addr[6] = {0}; char imei[16] = {0}; Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); char temp[32] = "0"; String2Hex(temp, imei); // 将字符串转为十六进制字符串 + if (ops->recv->recv_data.res_data[0] != 0)//不为零则说明关闭无线阀门 + { + Flash_Get_Mac_Addr(mac_addr, ops->recv->recv_data.res_data[0]); + /*对两个数组进行比较,如果值不同则退出*/ + for (; i < FLASH_VALVE_MAC_ADDR_LEN; i++) + { + if (mac_addr[i] != ops->recv->recv_data.res_data[i + 1]) + { + LOG_E("mac_addr[%x] != ops->recv->recv_data.res_data[%x]\n", mac_addr[i], ops->recv->recv_data.res_data[i + 1]); + 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(i == FLASH_VALVE_MAC_ADDR_LEN) + { + LOG_D("mac地址匹配成功,执行关阀动作\n"); + //TODO:此处需要增加关阀无线阀门的逻辑 - // emv_state_flag = 1; - // rt_thread_mdelay(20); - // emv_state_flag = 0; - // rt_uint8_t ret = BSP_Set_Emv_Status(0); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); + 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 + { + LOG_E("mac地址匹配失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); + } + } + else + { + LOG_D("关闭有线阀门\n"); + //TODO:此处需要增加关阀有线阀门的逻辑 + // emv_state_flag = 0; // 电磁阀动作 + // rt_thread_mdelay(20); + // emv_state_flag = 0; + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); + return RT_EOK; + } + + } void Handle_Open_Valve(struct Ml307_Ops *ops) { LOG_D("服务器下发打开阀门指令\n"); - // char imei[16] = {0}; - // Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); - // char temp[32] = "0"; - // String2Hex(temp, imei); // 将字符串转为十六进制字符串 + char imei[16] = {0}; + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + char temp[32] = "0"; + String2Hex(temp, imei); // 将字符串转为十六进制字符串 // // rt_uint8_t ret = BSP_Set_Emv_Status(1); // emv_state_flag = 1; // 电磁阀动作 // rt_thread_mdelay(20); // emv_state_flag = 0; - // ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_OPEN_VALVE, temp, RESPONSE_CODE_SUCCESS); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_OPEN_VALVE, temp, RESPONSE_CODE_SUCCESS); } void Handle_Open_Relay(struct Ml307_Ops *ops) @@ -1051,11 +1132,7 @@ int Handle_Config_Params(struct Ml307_Ops *ops) { rt_uint16_t nb_upload_time = (uint16_t)Flash_Get_SysCfg(kIotUploadCycleId); unsigned long timeout = nb_upload_time * 60 * RT_TICK_PER_SECOND; - // rt_timer_stop(ml307_timer); rt_timer_control(ml307_timer, RT_TIMER_CTRL_SET_TIME, (void *)&timeout); // 更新上报周期 - // rt_timer_control(ml307_timer, RT_TIMER_CTRL_GET_TIME, &timeout); - // LOG_D("timeout:%d", timeout/1000/60); - // rt_timer_start(ml307_timer); LOG_D("上报周期由%dmin更新为%dmin", ((flash_info[5] << 8) | flash_info[6]), nb_upload_time); if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_SUCCESS) == RT_EOK) { @@ -1107,19 +1184,19 @@ void Handle_Time_Calibration_Data(struct Ml307_Ops *ops) ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_TIME_CALIBRATION, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_TIME_CALIBRATION, temp, RESPONSE_CODE_SUCCESS); } -//下发修改服务器地址指令 +// 下发修改服务器地址指令 void Handle_Sever_Addr_Set(struct Ml307_Ops *ops) { rt_uint8_t data[6] = {0}; - char imei[16] = {0}; - char temp[32] = "0"; + char imei[16] = {0}; + char temp[32] = "0"; Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); String2Hex(temp, imei); // 将字符串转为十六进制字符串 rt_memcpy(data, (ops->recv->recv_data.res_data + 9), FLASH_SERVER_LEN); LOG_D("data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x", 0, data[0], 1, data[1], 2, data[2], 3, data[3], 4, data[4], 5, data[5]); Flash_Set_Sever_Addr_Info(data); - if(Flash_Get_Sever_Addr_Info(&sever_info) != RT_EOK) + if (Flash_Get_Sever_Addr_Info(&sever_info) != RT_EOK) { LOG_E("服务器地址修改失败\n"); } @@ -1128,7 +1205,99 @@ void Handle_Sever_Addr_Set(struct Ml307_Ops *ops) LOG_D("服务器地址修改成功\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_SEVER_ADDR, temp, RESPONSE_CODE_SUCCESS); } - +} + +/*新增阀门设备*/ +rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops) +{ + rt_uint8_t data[7] = {0}; + char imei[16] = {0}; + char temp[32] = "0"; + rt_uint8_t cnt = Flash_Get_Valve_Num(); + + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + + if (cnt > MAX_VALVE_NUM) + { + LOG_E("阀门设备数量超过最大值\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_OTHER_ERROR); + 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]); + + if (Flash_Set_Mac_Addr(&data[1], data[0]) != 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; + } + 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_ADD, temp, RESPONSE_CODE_SUCCESS); + return RT_EOK; +} + +/*更换阀门设备*/ +rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) +{ + rt_uint8_t data[6] = {0}; + char imei[16] = {0}; + char temp[32] = "0"; + + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + 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]); + + if (Flash_Set_Mac_Addr(&data[1], data[0]) != 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); + 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; + } +} + +/*移除阀门设备*/ +rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops) +{ + rt_uint8_t data[6] = {0}; + char imei[16] = {0}; + char temp[32] = "0"; + rt_uint8_t cnt = Flash_Get_Valve_Num(); + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + if (cnt == 0) + { + LOG_E("阀门设备数量为0, 无法移除\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; + } + 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 (Flash_Set_Mac_Addr(&data[1], data[0]) != 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; + } + 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) @@ -1179,6 +1348,15 @@ void Handle_Instruction_Down(struct Ml307_Ops *ops) case INSTRUCTION_DOWN_SEVER_ADDR: Handle_Sever_Addr_Set(ml307_ops); break; + case INSTRUCTION_DOWN_VALVE_ADD: + Handle_Valve_Add(ml307_ops); + break; + case INSTRUCTION_DOWN_VALVE_REPLACE: + Handle_Valve_Replace(ml307_ops); + break; + case INSTRUCTION_DOWN_VALVE_REMOVE: + Handle_Remove_Valve(ml307_ops); + break; } } @@ -1247,9 +1425,9 @@ static void Ml307_Send_Thread_Entry(void *param) rt_uint32_t ml307_recv_event; LOG_D("ml307 thread entry\n"); - struct Ml307_Ops *ops = (struct Ml307_Ops *)param; + struct Ml307_Ops *ops = (struct Ml307_Ops *)param; struct at_device_ml307 *ml307 = &_dev; - struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); + struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); RT_ASSERT(device); if (ops->init(ops, PROTOCOL_VERSION) != RT_EOK) @@ -1259,14 +1437,14 @@ static void Ml307_Send_Thread_Entry(void *param) else { LOG_D("ml307 init success\n"); - while (cnt < 5000)//等待激光器进入正常工作状态 + while (cnt < 5000) // 等待激光器进入正常工作状态 { if (SysControl.status == kNormalDetectionEvents) { break; } cnt++; - rt_thread_mdelay(10); + rt_thread_mdelay(10); } rt_completion_wait(&ml307_init_complate, RT_WAITING_FOREVER); // wait for ml307 init finish Ml307_Send_Event(kMl307PowerOnEvent); @@ -1324,7 +1502,7 @@ static void Ml307_Send_Thread_Entry(void *param) { rt_timer_start(ml307_timer); // 当上电心跳包发送成功时, 开始心跳包周期发送 power_on_send_flag = 1; - Ml307_Send_Event(kMl307TimeCalibrationEvent); // 上电网络连接成功时,更新下时间 + // Ml307_Send_Event(kMl307TimeCalibrationEvent); // 上电网络连接成功时,更新下时间 rt_timer_start(ml307_upload_timer); } } @@ -1452,9 +1630,9 @@ static void Ml307_Send_Thread_Entry(void *param) static void Ml307_Recv_Thread_Entry(void *parameter) { - struct Ml307_Ops *ops = (struct Ml307_Ops *)parameter; + struct Ml307_Ops *ops = (struct Ml307_Ops *)parameter; struct at_device_ml307 *ml307 = &_dev; - struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); + struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); RT_ASSERT(device); rt_err_t ret; @@ -1476,7 +1654,7 @@ static void Ml307_Life_Thread_Entry(void *parameter) { struct at_device_ml307 *ml307 = &_dev; - struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); + struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); RT_ASSERT(device); rt_err_t ret; @@ -1528,10 +1706,10 @@ int BSP_Ml307_Thread_Init(void) } // 创建定时器 ml307_timer = rt_timer_create("heartbeat", - Ml307_Ht_Timer_Cb, // 回调函数 - RT_NULL, // 参数 - timeout, // 定时周期(120分钟) - RT_TIMER_FLAG_PERIODIC); // 周期性定时器 + Ml307_Ht_Timer_Cb, // 回调函数 + RT_NULL, // 参数 + timeout, // 定时周期(120分钟) + RT_TIMER_FLAG_PERIODIC); // 周期性定时器 if (ml307_timer == RT_NULL) { @@ -1539,31 +1717,31 @@ int BSP_Ml307_Thread_Init(void) return -1; } ml307_life_timer = rt_timer_create("ml307_life", - Ml307_Life_Timer_Cb, - RT_NULL, - 30 * RT_TICK_PER_SECOND, - RT_TIMER_FLAG_ONE_SHOT); + Ml307_Life_Timer_Cb, + RT_NULL, + 30 * RT_TICK_PER_SECOND, + RT_TIMER_FLAG_ONE_SHOT); if (ml307_life_timer == RT_NULL) { rt_kprintf("创建定时器失败\n"); return -1; } ml307_power_error_timer = rt_timer_create("ml307_error_timer", - Ml307_Error_Timer_Cb, - RT_NULL, - 3 * 60 * RT_TICK_PER_SECOND, // (3分钟) - RT_TIMER_FLAG_PERIODIC); + Ml307_Error_Timer_Cb, + RT_NULL, + 3 * 60 * RT_TICK_PER_SECOND, // (3分钟) + RT_TIMER_FLAG_PERIODIC); ml307_upload_timer = rt_timer_create("ml307_upload_timer", - Ml307_Upload_Timer_Cb, - RT_NULL, - 24 * 60 * RT_TICK_PER_SECOND, // - RT_TIMER_FLAG_PERIODIC); + Ml307_Upload_Timer_Cb, + RT_NULL, + 24 * 60 * RT_TICK_PER_SECOND, // + RT_TIMER_FLAG_PERIODIC); // 创建定时器 ml307_heartbeat_check_timer = rt_timer_create("ml307_check_hb", - Ml307_Heartbeat_check_Timer_Cb, - RT_NULL, - timeout * 3, // 3个定时心跳没有发送,就重启发送 - RT_TIMER_FLAG_PERIODIC); + Ml307_Heartbeat_check_Timer_Cb, + RT_NULL, + timeout * 3, // 3个定时心跳没有发送,就重启发送 + RT_TIMER_FLAG_PERIODIC); if (ml307_heartbeat_check_timer != RT_NULL) { diff --git a/bsp/src/bsp_vin_detection.c b/bsp/src/bsp_vin_detection.c index 126ffd9..1cb40a1 100644 --- a/bsp/src/bsp_vin_detection.c +++ b/bsp/src/bsp_vin_detection.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-06-14 15:28:09 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-04 10:30:42 + * @LastEditTime: 2024-12-04 16:09:54 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_vin_detection.c * @Description : * @@ -97,7 +97,7 @@ int BSP_VIN_Detection_Init(void) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); - rt_thread_mdelay(50); + rt_thread_mdelay(500); ADC_ITConfig(USED_ADC, ADC_IT_AWD, ENABLE); diff --git a/rt-thread/rtconfig.h b/rt-thread/rtconfig.h index bf8c0d7..4ec2e0f 100644 --- a/rt-thread/rtconfig.h +++ b/rt-thread/rtconfig.h @@ -31,7 +31,7 @@ #define RT_USING_TIMER_SOFT #define RT_TIMER_THREAD_PRIO 4 -#define RT_TIMER_THREAD_STACK_SIZE 512 +#define RT_TIMER_THREAD_STACK_SIZE 1024 /* kservice optimization */ @@ -145,7 +145,7 @@ #define AT_PRINT_RAW_CMD #endif -#define AT_CMD_MAX_LEN 256 +#define AT_CMD_MAX_LEN 1024 #define AT_SW_VERSION_NUM 0x10301 /* end of Network */ @@ -159,7 +159,7 @@ #define ULOG_OUTPUT_LVL 7 // 生产时将其设为0 #define ULOG_USING_ISR_LOG #define ULOG_ASSERT_ENABLE -#define ULOG_LINE_BUF_SIZE 512 +#define ULOG_LINE_BUF_SIZE 1024 /* log format */ // #define ULOG_OUTPUT_FLOAT