Files
LaserTracing/source/inc/SGCP.h
T

285 lines
8.5 KiB
C
Raw Normal View History

2026-04-23 14:02:03 +08:00
/* 传感器通用通讯协议V1.0*/
#ifndef __SGCP_H
#define __SGCP_H
#include "bsp.h"
#define WORK_MODE 1 //工作模式选择,0、本机为查询模式,1、本机为上报模式(低功耗)
2026-05-11 10:10:13 +08:00
#define SGCP_SELECT 1 //协议选择,0、本机为单个主设备接多个子设备,1、本机为单个主设备不接子设备,2、本机为单个子设备
2026-04-23 14:02:03 +08:00
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; //俯仰角 (范围±900)单位0.1°
int16_t RollAngle; //横滚角 (范围±900)单位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,//激光状态回应
}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_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通讯
2026-04-23 14:02:03 +08:00
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; //打开与关闭激光标志位
}SGCP_t;
extern SGCP_t SGCP;
void SGCP1mSRoutine(void);
void GwRevLoopHandler(void);
void MasRevLoopHandler(void);
void SubRevLoopHandler(void);
void InRevLoopHandler(void);
#endif