测试了4G的心跳包

This commit is contained in:
小马_666 2024-12-04 18:55:59 +08:00
parent 21b3098a03
commit 039fca89a4
15 changed files with 492 additions and 195 deletions

View File

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

View File

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

View File

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

View File

@ -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 <at_device.h>
#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;

View File

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

View File

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

View File

@ -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 <at_device_ml307.h>
#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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,7 @@
* @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:
*
@ -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 <at_log.h>
#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,16 +216,15 @@ 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);
@ -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)
@ -808,8 +855,7 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device,
}
}
// 处理该事件
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:此处需要增加关阀无线阀门的逻辑
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;
}
// 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);
}
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,7 +1437,7 @@ 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)
{
@ -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)
{

View File

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

View File

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