/* 传感器通用通讯协议V1.0*/ #ifndef __SGCP_H #define __SGCP_H #include "bsp.h" #define WORK_MODE 1 //工作模式选择,0、本机为查询模式,1、本机为上报模式(低功耗) #define SGCP_SELECT 1 //协议选择,0、本机为单个主设备接多个子设备,1、本机为单个主设备不接子设备,2、本机为单个子设备 typedef struct {//网关与主设备固定帧 uint8_t Header; uint8_t GWAddr[6]; uint8_t MDAddr[6]; uint8_t Cmd; uint16_t PayloadLen; }__attribute__ ((packed))GatewayFrameHeader_t,*GatewayFrameHeader; typedef struct {//主设备与子设备固定帧 uint8_t Header; uint8_t Addr; uint8_t Cmd; uint8_t PayloadLen; }__attribute__ ((packed))SubsetFrameHeader_t,*SubsetFrameHeader; typedef struct {//内部指令固定帧 uint8_t Header; uint8_t MAC[6]; uint8_t Cmd; uint8_t PayloadLen; }__attribute__ ((packed))InsideFrameHeader_t,*InsideFrameHeader; typedef struct {//主设备固定包头 uint8_t BatLevel; //电池电量 int8_t RSSI; //信号强度 int8_t Nsr; //信噪比 }__attribute__ ((packed))MasterDev_T,*MasterDevDp; typedef struct {//0x0006 三维连续变形 int16_t PitchAngle; //俯仰角 (范围±1800)单位0.1° int16_t RollAngle; //横滚角 (范围±1800)单位0.1° int16_t YawAngle; //偏航角 (范围0~3600)单位0.1° }__attribute__ ((packed))ContDefor3D_T,*ContDefor3DDp; typedef struct {//0x0007 通讯单元 MasterDev_T MasterDev; }__attribute__ ((packed))CommUnit_T,*CommUnitDp; typedef struct {//0x0008 三维应力 int16_t PitchAngle; //俯仰角(范围±900)单位0.1° int16_t RollAngle; //横滚角(范围±900)单位0.1° int16_t YawAngle; //偏航角(范围0~3600)单位0.1° int32_t Strain1; //X轴应力值(范围±10MPa,单位Pa) int32_t Strain2; //Y轴应力值(范围±10MPa,单位Pa) int32_t Strain3; //Z轴应力值(范围±10MPa,单位Pa) }__attribute__ ((packed))Force3D_T,*Force3DDp; typedef struct {//0x0009 激光示踪 MasterDev_T MasterDev; int16_t PitchAngle; //俯仰角 (范围±900)单位0.1° int16_t RollAngle; //横滚角 (范围±900)单位0.1° int16_t YawAngle; //偏航角 (范围0~3600)单位0.1° }__attribute__ ((packed))LaserTracing_T,*LaserTracingDp; typedef struct {//0x000E 裂缝仪 int16_t XwiseDist; //横向位移量(范围0~150mm) int16_t LgthwysDist; //纵向位移距离(范围0~150mm) int16_t RotationDist; //旋转位移距离(范围0~150mm) }__attribute__ ((packed))Crack_T,*CrackDp; typedef struct { ContDefor3D_T ContDefor3D; CommUnit_T CommUnit; Force3D_T Force3D; Crack_T Crack; LaserTracing_T LaserTracing; }__attribute__ ((packed))DeviceData_T,*DeviceDp; //设备数据 /*接收子设备数据状态机*/ typedef enum { SUB_STATUS_IDLE, SUB_STATUS_BROADCAST_CALI, SUB_STATUS_READMASTER_DATA, SUB_STATUS_READSUBSET_DATA, SUB_STATUS_WAIT_READSUBSET, SUB_STATUS_MASTER_QUERY, SUB_STATUS_SUBSET_QUERY, SUB_STATUS_WAIT_SUBSET_QUERY, SUB_STATUS_BROADCAST_SET_COLTIME, SUB_STATUS_BROADCAST_SYNC_TIME, }SubStatus_m; /*接收网关数据状态机*/ typedef enum { GW_STATUS_IDLE, GW_STATUS_WAIT_SUBIDLE, GW_STATUS_LOGIN, GW_STATUS_WAIT_LOGIN, GW_STATUS_CALI, GW_STATUS_READ_SENSOR, GW_STATUS_SET_COL_TIME, GW_STATUS_SYNC_TIME, GW_STATUS_UPLOAD_SENSOR,//主动上报模式时会使用该状态 GW_STATUS_WAIT_UPLOAD,//主动上报模式时会使用该状态 GW_STATUS_LASER_STARES,//激光状态回应 GW_STATUS_SIGNAL, GW_STATUS_WAIT_SIGNAL, }GWStatus_m; /*接收主设备数据状态机*/ typedef enum { MAS_STATUS_IDLE, MAS_STATUS_CALI, MAS_STATUS_READ_SENSOR, MAS_STATUS_DEVICE_INQUIRE, MAS_STATUS_SET_COL_TIME, MAS_STATUS_SYNC_TIME, }MasStatus_m; /*内部指令数据状态机*/ typedef enum { IN_STATUS_IDLE, IN_STATUS_UPDATE, IN_STATUS_ALTER_485ADDR, }InStatus_m; /*网关到主设备命令集*/ typedef enum { GWTOMD_CMD_LOGIN = 0x00, //0x00,设备注册 GWTOMD_CMD_CALI = 0x01, //0x01, 校准指令 GWTOMD_CMD_READ_UPLOAD_SENSOR = 0x02, //0x02,读取数据指令or上传数据指令 GWTOMD_CMD_SET_COL_TIME = 0x05, //0x05,设置采集时间间隔 GWTOMD_CMD_SYNC_TIME = 0x06, //0x06,时间同步 GWTOMD_CMD_SET_LASER = 0x08,//打开or关闭激光 GWTOMD_CMD_SIGNAL = 0x09, }GWTOMD_CMD_M; /*主设备到子设备命令集*/ typedef enum { MDTOSD_CMD_CALI = 0x01, //0x01, 校准指令 MDTOSD_CMD_READ_DATA = 0x02, //0x02,读取数据指令 MDTOSD_CMD_INQUIRE = 0x03, //0x03, 设备查询指令 MDTOSD_CMD_SET_COL_TIME = 0x05, //0x05,设置采集时间间隔 MDTOSD_CMD_SYNC_TIME = 0x06, //0x06,时间同步 }MDTOSD_CMD_M; /*内部指令命令集*/ typedef enum { INSIDE_CMD_UPDATE = 0x81, //0x81,升级程序下发请求,由主机发起,从机应答 INSIDE_CMD_ALTER_485ADDR = 0x04, //0x04, 设置设备485地址 }INSIDE_CMD_M; /*设备类型*/ typedef enum { NUL, //0x0000 空设备 FORCE_6D, //0x0001 六维应力 OSMOTIC_PRESSURE, //0x0002 渗透压 ELASTIC_WAVEGUIDE, //0x0003 弹性波导 DIELECTRIC_MASS, //0x0004 介电质普 _0x0005, //0x0005 保留 CONT_DEFOR_3D, //0x0006 三维连续变形 COMM_UNIT, //0x0007 通讯单元 FORCE_3D, //0x0008 三维应力 LASER_TRACING, //0x0009 激光示踪 _0x000A, //0x000A 保留 _0x000B, //0x000B 保留 _0x000C, //0x000C 保留 MULTI_PARAMETER_FUSION, //0x000D 多参数融合 CRACK_DETECTION, //0x000E 裂缝仪 _0x000F, //0x000F 保留 ATTITUDE_MONITOR, //0x0010 姿态检测 LASER_DISPLACE, //0x0011 激光位移 REBAR_STRESS, //0x0012 钢筋应力 ANCHOR_ROD_STRESS, //0x0013 锚杆轴力 SURFACE_STRESS, //0x0014 表面应力 PRESSURE, //0x0015 压力 MICROWAVE_DISPLACE, //0x0016 微波测距 }DEVICE_TYPE_M; /*通讯方式*/ typedef enum { LORA = 0x01, //0x01 LORA通讯 RS485 = 0x02, //0x02 RS485通讯 RS232 = 0x03, //0x03 RS232通讯 CAN = 0x04, //0x04 CAN通讯 CATONE = 0x05, //0x05 _4G通讯 BLE = 0x06, //0x06 BLE通讯 WIFI = 0x07, //0x07 WIFI通讯 UART = 0x08, //0x08 UART通讯 }COMM_WAY_M; /*设备标志*/ typedef enum { MASTER = 0x000000, //0x000000 主设备 SUBSET = 0x800000, //0x800000 子设备 }DEVICE_SIGN_M; typedef struct { __IO GWTOMD_CMD_M rCmdGWToMD; //网关下发命令 __IO GWTOMD_CMD_M sCmdMDToGW; //主设备返回命令 __IO uint16_t rPayLen; __IO bool HeaderFrame; __IO uint8_t RxLen; uint8_t RxBuff[256]; }GWTOMD_Rx_T; typedef struct { __IO MDTOSD_CMD_M rCmdSDToMD; //子设备返回命令 __IO MDTOSD_CMD_M sCmdMDToSD; //主设备下发命令 __IO uint8_t rPayLen; __IO bool HeaderFrame; __IO uint8_t RxLen; uint8_t RxBuff[256]; }MDTOSD_Rx_T; typedef struct { uint32_t LpUart0Delay1mSCnt; uint32_t LoraDelay1mSCnt; uint32_t Uart1Delay1mSCnt; uint32_t GW1mSDelayCnt; uint32_t SD1mSDelayCnt; uint32_t In1mSDelayCnt; GWTOMD_Rx_T GWRS485Rx; uint8_t GatewayBuffLen; uint8_t GatewayBuff[256]; uint8_t GatewayRevTimeoutCnt; //网关串口接收超时计数 MDTOSD_Rx_T SDRS485Rx; uint8_t SubsetBuffLen; uint8_t SubsetBuff[256]; uint8_t SubsetRevTimeoutCnt; //子设备串口接收超时计数 uint8_t InsidePayLen; uint8_t InsideBuffLen; uint8_t InsideBuff[256]; uint8_t InsidePay[256]; SubStatus_m SubStatus; SubStatus_m NextSubStatus; GWStatus_m GWStatus; GWStatus_m NextGWStatus; MasStatus_m MasStatus; InStatus_m InStatus; DeviceData_T DevData; bool SubsetCaliOk; //子设备校准标志位 bool MasterCaliOk; //主设备标校标志位 uint8_t ReadDataAdd; //获取数据地址 uint16_t DeviceDataLen; //在线设备采集到的数据长度总和 uint8_t DeviceDataBuff[512]; //在线设备采集到的数据缓存(主设备的数据永远排在最前面) uint8_t DeviceData[512]; //在线设备采集到的数据(主设备的数据永远排在最前面) bool SubsetReadDataOk; //子设备读取数据成功标志位 bool DeviceReadDataOk; //设备读取数据完成标志位 uint8_t DeviceN; //在线设备数量(最多32个子设备,1个主设备) uint8_t Dev485Addr; //在线设备485地址(最多32个子设备,1个主设备) uint8_t Dev485Addrs[16]; //在线设备485地址缓存,0位为0x00广播地址 uint8_t DeviceMAC[16][6]; //在线设备的唯一MAC地址(主设备的MAC永远排在最前面) bool SubsetMACOk; //在线子设备MAC获取成功标志位 bool DeviceMACOk; //在线设备获取完成标志位 bool CollTimeSetOk; //采集时间设置成功标志位 uint8_t CollTimeAdd; //设置采集时间地址 bool SyncTimeOk; //时间同步成功标志位 uint8_t SyncTimeAdd; //时间同步设备地址 bool BroadCmd; //广播命令 bool LoginOk; //注册成功标志位 bool LoginMess; bool UploadOk; //上传成功标志位 bool UploadMess; bool Gateway_IRQ_Status; //网关接收中断 bool Subset_IRQ_Status; //子设备接收中断 bool TimingAcquisition; //采集传感器数据 /**激光示踪私有**/ bool LaserOnOff; //打开与关闭激光标志位 int8_t SignalRSSI; int8_t SignalSNR; uint8_t LaserTimerMinutes; //激光定时关闭分钟数 uint16_t LaserTimerCount; //激光定时计数(RTC 30s) }SGCP_t; extern SGCP_t SGCP; void SGCP1mSRoutine(void); void GwRevLoopHandler(void); void MasRevLoopHandler(void); void SubRevLoopHandler(void); void InRevLoopHandler(void); #endif