// // Created by EDZ on 25-9-11. // #ifndef E52_H #define E52_H #include "main.h" #include #include #include "string.h" #include "stdlib.h" #include "RTC_SLEEP.h" #include "ring_buffer.h" // 组合命令和步骤的宏 #define COMBINE_CMD_STEP(cmd, step) ((cmd) | (step)) // 从组合值中提取命令 #define GET_CMD(value) (value & 0x0F) // 从组合值中提取步骤 #define GET_STEP(value) ((value & 0xF0)) enum { TRUE = 1, FALSE = 0 }; // 定义云端命令枚举,使命令含义更清晰 typedef enum { IDLE = 0x00, REQUEST_BLUETOOTH_DATA = 0x03, // 请求发送蓝牙数据 CONFIGURE_E52 = 0x07, // E52 配置命令 E52_ENTER_SLEEP = 0x05, // E52 进入睡眠模式 E52_HEARTBEAT = 0x08, // E52 心跳包命令 IS_ONLINE = 0x0A } CloudCommand; // 定义步骤枚举,高4位用于存储步骤(0x00~0x50,间隔0x10) 通用 typedef enum { STEP_INIT = 0x00 << 4, // 0x00 - 原始命令 STEP_VERIFY = 0x01 << 4, // 0x10 - 中断已处理(while中防止一个命令被多次分析数据,导致内存崩溃)(有新数据过来) STEP_COMPLETE = 0x0F << 4 // 0x40 - 完成步骤 } CommandStep; //独立step范围(0x02~0x0E typedef enum { REQUEST_BLUETOOTH_DATA_SCAN = 0x02 << 4, // 请求蓝牙数据第1步 REQUEST_BLUETOOTH_DATA_SEND = 0x03 << 4 // 发送蓝牙数据第2步 } REQUEST_BLUETOOTH_DATA_STEP; typedef enum { CONFIGURE_E52_SET_BROADCAST_TYPE= 0x02 << 4, //设置广播类型 CONFIGURE_E52_SET_LORA_ADDRESS= 0x03 << 4, //设置目标地址 CONFIGURE_E52_CONNECT_TEST= 0x04 << 4 //测试通讯 } CONFIGURE_E52_STEP; typedef enum { HEARTBEAT_SEND = 0x02 << 4, //发送心跳包 } HEARTBEAT_E52_STEP; typedef enum { RTC_SLEEP_STEP = 0x02 << 4, //睡眠模式 } SLEEP_STEP; typedef enum { E52_TYPE_TERMINAL = 1, // 终端 E52_TYPE_REPEATER = 0, // 中继 // E52_TYPE_MASTER = 2 // 主机 } E52_TYPE; // // 发送 "请求蓝牙数据" 命令的第2步 // uint8_t cmd = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, STEP_2); // // cmd 的值为 0x23 (0x03 | 0x20) // // // 解析接收到的命令 // uint8_t received_cmd = 0x23; // CloudCommand command = GET_CMD(received_cmd); // 得到 0x03 (REQUEST_BLUETOOTH_DATA) // uint8_t step = GET_STEP(received_cmd); // 得到 2 typedef enum { TIMER_IDLE, TIMER_ENABLE, TIMER_DISABLE } TimerSTATUS; // 定义定时器操作类型 typedef enum { TIMER_OP_START, // 启动定时器 TIMER_OP_STOP // 停止定时器 } Timer_Operation; typedef enum { BL_IDLE, BL_START, BL_STOP } BLSTATUS; typedef enum { BROADCAST_SINGLE = 0x01, //单播 BROADCAST_MULTI, //多播 BROADCAST_ALL //广播 }BROADCAST; // 设备信息结构体 typedef struct { uint8_t isOnline; // 设备是否就绪 uint8_t broadcast_type; // 广播类型 01:单波 02:广播 03:多播 uint8_t loraDeviceAddress_H; //设备地址高位 默认0 uint8_t loraDeviceAddress_L; //设备地址低位 默认0 uint8_t target_addr_H; // 目标地址高字节 默认FF uint8_t target_addr_L; // 目标地址低字节 默认FF uint8_t powerValue; //电量 默认0 // uint8_t isSOS; // uint8_t receivingNewDataFlag; //接收lora新数据 //使能蓝牙收发数据 uint8_t BlDataFlag; //BL_START:开始接收新蓝牙数据,BL_STOP.停止接收新蓝牙数据 //后台的远程命令 uint8_t commandFromCloud; //从云端接收到的命令 1.请求蓝牙数据,2.请求lora数据,3.睡眠 4,重新发送点卯数据 //lora发生成功标志 // uint8_t loraSendSuccessFlag; //rtc定时唤醒时间 uint32_t rtc_wake_up_time; uint16_t forwardBLAndLoraDataDuration; //发送蓝牙间隔时间 uint8_t forwardBLAndLoraDataCount; //发送蓝牙数量 uint8_t forwardBLAndLoraDataCountMax; //发送蓝牙数量最大值 RingBuffer queueBLData; //蓝牙数据队列 RingBuffer queueLoraCommandData; //命令数据队列 } Device_structure; // 只声明变量,不定义变量,使用extern关键字 extern Device_structure deviceInfo; // 心跳数据结构体 typedef struct __attribute__((packed)){ uint8_t frame_header_H; // 帧头高字节 uint8_t frame_header_L; // 帧头低字节 uint8_t function_code; // 功能码 uint8_t badge_addr_high; //胸牌地址高字节 uint8_t badge_addr_low; //胸牌地址低字节 uint8_t broadcast_type; // 广播类型 uint8_t target_addr_H; // 目标地址高字节 uint8_t target_addr_L; // 目标地址低字节 uint8_t frame_tail_H; // 帧尾高字节 uint8_t frame_tail_L; // 帧尾低字节 } Heartbeat_structure; void E52_Heartbeat_Fun(void); // 发送蓝牙结构体 typedef struct __attribute__((packed)){ uint8_t frame_header_H; // 帧头高字节 uint8_t frame_header_L; // 帧头低字节 uint8_t function_code; // 功能码 uint8_t badge_addr_high; //胸牌地址高字节 uint8_t badge_addr_low; //胸牌地址低字节 uint8_t bl_data[8]; //蓝牙数据 uint8_t finish_send; // 是否完成发送 // uint8_t target_addr_H; // 目标地址高字节 // uint8_t target_addr_L; // 目标地址低字节 uint8_t frame_tail_H; // 帧尾高字节 uint8_t frame_tail_L; // 帧尾低字节 } SendBlData_structure; void E52_Send_Bl_Data_Fun(uint8_t *sendData,uint8_t); // 发送SOS结构体 typedef struct __attribute__((packed)){ uint8_t frame_header_H; // 帧头高字节 uint8_t frame_header_L; // 帧头低字节 uint8_t function_code; // 功能码 uint8_t badge_addr_high; //胸牌地址高字节 uint8_t badge_addr_low; //胸牌地址低字节 // uint8_t SOS_data; //蓝牙数据 uint8_t bl_data[8]; //蓝牙数据 uint8_t finish_send; // 是否完成发送 uint8_t target_addr_H; // 目标地址高字节 uint8_t target_addr_L; // 目标地址低字节 uint8_t frame_tail_H; // 帧尾高字节 uint8_t frame_tail_L; // 帧尾低字节 } SendSOS_structure; void E52_Send_SOS_Fun(uint8_t *sendData,uint8_t finishData); void E52_Analyze_Data(void); void E52_Heartbeat_Fun(void); void E52_CONFIG_BROADCAST_TYPE_FUN(uint8_t); void E104_BT5005A_DST_ADDR_Fun(void); //开启lora电源 void E52_CtlPowerOn_Fun(); //关闭lora电源 void E52_CtlPowerOff_Fun(); void schedule_Fun(void); void Enter_Sleep_ACK_Fun(void); void E52_AT_TYPE_Fun(uint8_t type); #endif //E52_H