/*** * @Author: mbw * @Date: 2024-10-09 08:42:14 * @LastEditors: mbw && 1600520629@qq.com * @LastEditTime: 2024-10-17 09:26:13 * @FilePath: \JT-DT-YD4N02A_RTT_MRS-4G\bsp\inc\bsp_nt26k.h * @Description: * @ * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ #include #include "drv_gpio.h" #define NT26K_PWR_EN_PIN GET_PIN(B, 3) #define NT26K_RST_PIN GET_PIN(A, 11) #define NT26K_WKP_PIN GET_PIN(C, 7) #define NT26K_SAMPLE_DEIVCE_NAME "nt26k" /*默认参数*/ #define DEVICE_MANUFACTURE 0x4454 // DT /*命令集*/ #define CMD_TYPE_DEVICE_DATA_REPORT 0x10 // 命令类型 - 设备数据上报 (设备->平台) #define CMD_TYPE_DEVICE_EVENT_REPORT 0x11 // 命令类型 - 设备事件上报 (设备->平台) #define CMD_TYPE_SERVER_REPLY 0x12 // 命令类型 - 服务器回复 (平台->设备) #define CMD_TYPE_INSTRUCTION_DOWN 0x13 // 命令类型 - 指令下发 (平台->设备) #define CMD_TYPE_INSTRUCTION_REPLY 0x14 // 命令类型 - 指令下发回复 (设备->平台) #define CMD_TYPE_TIME_CALIBRATION 0x15 // 命令类型 - 时间校准 (设备->平台) #define PROTOCOL_VERSION 0x40 /*协议版本*/ /*数据序列号*/ #define DATA_SERIAL_NUM 0x0001 // 1 /*设备类型*/ #define DEVICE_TYPE_NT26K 0x20 /*事件类型*/ #define EVENT_TYPE_HEARTBEAT 0x30 // 心跳事件 #define EVENT_TYPE_SELF_CHECK 0x31 // 自检事件 #define EVENT_TYPE_SILENCE 0x32 // 消音事件 #define EVENT_TYPE_EXCEPTION 0x33 // 异常事件 #define EVENT_TYPE_VALVE_STATUS 0x40 // 电磁阀状态改变事件 #define EVENT_TYPE_FAN_STATUS 0x41 // 风机状态改变事件 #define EVENT_TYPE_TEMP_ANOMALY 0x42 // 产品工作温度异常事件 #define EVENT_TYPE_POWER_ON 0x43 // 上电事件 #define EVENT_TYPE_POWER_OFF 0x44 // 掉电事件 #define EVENT_TYPE_ALARM 0x45 // 报警事件 #define EVENT_TYPE_ALARM_RECOVER 0x46 // 报警恢复事件 #define EVENT_TYPE_FAULT 0x47 // 故障事件 #define EVENT_TYPE_FAULT_RECOVER 0x48 // 故障恢复事件 #define EVENT_TYPE_DEVICE_FAILURE 0x49 // 设备失效事件 #define EVENT_TYPE_TIME_CALIBRATION 0x50 // 时间校准事件 /*指令下发*/ #define INSTRUCTION_DOWN_SELF_CHECK 0x50 // 指令下发 - 自检 #define INSTRUCTION_DOWN_MUTE 0x51 // 指令下发 - 消音 #define INSTRUCTION_DOWN_CLOSE_VALVE 0x52 // 指令下发 - 关阀 #define INSTRUCTION_DOWN_OPEN_VALVE 0x53 // 指令下发 - 开阀 #define INSTRUCTION_DOWN_OPEN_RELAY 0x54 // 指令下发 - 开继电器 #define INSTRUCTION_DOWN_CLOSE_RELAY 0x55 // 指令下发 - 关继电器 #define INSTRUCTION_DOWN_QUERY_PARAMS 0x56 // 指令下发 - 查询系统参数 #define INSTRUCTION_DOWN_CONFIG_PARAMS 0x57 // 指令下发 - 配置系统参数 #define INSTRUCTION_DOWN_TIME_CALIBRATION 0x58 // 指令下发 - 时间校准 #define INSTRUCTION_HEART_BEAT 0x59 // 心跳 #define INSTRUCTION_DOWN_SEVER_ADDR 0x60 // 设置服务器地址和端口 #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 NT26K_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 //设备关闭 typedef enum { /****************优先级最低***************** */ kNt26kHeartbeatEvent, // 定时心跳事件 kNt26kSilenceEvent, // 消音事件 kNt26kExceptionEvent, // 异常事件 kNt26kValveStatusEvent, // 电磁阀状态改变事件 kNt26kFanStatusEvent, // 风机状态改变事件 kNt26kTempAnomalyEvent, // 产品工作温度异常事件 kNt26kAlarmEvent, // 报警事件 kNt26kAlarmRcyEvent, // 报警恢复事件 kNt26kFaultEvent, // 故障事件 kNt26kFaultRcyEvent, // 故障恢复事件 kNt26kDeviceFailureEvent, // 设备失效事件 kNt26kTimeCalibrationEvent, // 时间校准事件 /**********************优先级第三************************* */ kNt26kSelfCheckEvent, // 自检事件 /**********************优先级第二************************* */ kNt26kPowerDownEvent, // 掉电事件 /**********************优先级第一************************* */ kNt26kPowerOnEvent, // 上电事件 kNt26kMaxEventcnt // 最大事件计数 } Nt26kEvent; // 当前所处的事件类型 typedef enum { kHeartbeatStatus, // 定时心跳状态 kConcentrationHighStatus, // 浓度异常状态 kSelfCheckStatus, // 自检触发状态 kAlarmStatus, // 报警触发状态 kAlarmClearedStatus, // 报警解除状态 kSensorFaultStatus, // 传感器故障触发状态 kSensorRecoveredStatus, // 传感器故障解除状态 kPowerDownStatus, // 掉电状态 } Nt26kStatus; // 当前所处的上报状态 typedef struct { Nt26kEvent current_event;//当前事件 Nt26kEvent last_event;//上次事件 }Nt26kEventIndex; struct __attribute__((packed)) DataBody { uint8_t device_type; // 设备类型 uint8_t event_type; // 事件类型 uint8_t hw; // 硬件版本 uint8_t sw; // 软件版本 uint8_t imei[15]; // 设备编号(IMEI) uint8_t iccid[20]; // ICCID 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; // 继电器状态 }; // 定义数据帧结构体 struct __attribute__((packed)) Nt26kDataFrame { uint8_t header[3]; // 帧头 uint8_t version; // 协议版本 uint16_t manufacture; // 厂商标识 uint16_t datanumber; // 数据序列号 uint8_t cmd; // 命令位 uint16_t datalen; // 数据长度 struct DataBody data; // 数据体 uint16_t crc16; // 校验位 uint8_t tail[3]; // 帧尾 }; struct __attribute__((packed)) Nt26kData { rt_uint8_t device_type; // 设备类型 rt_uint8_t event_type; // 事件类型 rt_uint8_t res_data[15];// rt_uint8_t res_num; }; struct __attribute__((packed)) Nt26kRecvData { 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 Nt26kData recv_data; // 接收数据体 rt_uint16_t crc16; // 校验位 rt_uint8_t tail[3]; // 帧尾 }; struct Nt26k_Ops { struct DataBody *body; struct Nt26kDataFrame *frame; struct Nt26kRecvData *recv; int (*init)(struct Nt26k_Ops *ops, rt_uint8_t version); int (*update_data)(struct Nt26k_Ops *ops, rt_uint8_t device_type, rt_uint8_t cmd); int (*send)(struct Nt26k_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type); int (*Resp)(struct Nt26k_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 (*Recv)(struct Nt26k_Ops *ops, char *data); // 解析数据 }; extern struct Nt26k_Ops nt26k_ops; extern rt_sem_t nt26k_recv_sem; extern rt_uint8_t nt26k_conncet_tcp_flag; extern rt_uint8_t power_on_send_flag; int nt26k_device_register(void); int BSP_Nt26k_Thread_Init(void); void Nt26k_Send_Event(Nt26kEvent event_type);