feat: 新增信号质量查询指令(sig)

1. 新增GWTOMD_CMD_SIGNAL(0x09)指令,Payload为空,GWAddr填0
2. 不依赖注册状态,同频段网关收到后返回SNR和RSSI
3. 传感器收到回应后读取本地SX1276的SNR/RSSI
4. 通过调试串口打印TX(上行)/RX(下行)两方向信号质量
5. 新增sig调试指令,内置设备忙状态保护
This commit is contained in:
2026-07-14 10:13:17 +08:00
parent 9f200e2e83
commit de545c9919
3 changed files with 111 additions and 0 deletions
+5
View File
@@ -102,6 +102,8 @@ typedef enum {
GW_STATUS_UPLOAD_SENSOR,//主动上报模式时会使用该状态
GW_STATUS_WAIT_UPLOAD,//主动上报模式时会使用该状态
GW_STATUS_LASER_STARES,//激光状态回应
GW_STATUS_SIGNAL,
GW_STATUS_WAIT_SIGNAL,
}GWStatus_m;
/*接收主设备数据状态机*/
typedef enum {
@@ -126,6 +128,7 @@ typedef enum {
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;
/*主设备到子设备命令集*/
@@ -270,6 +273,8 @@ typedef struct {
/**激光示踪私有**/
bool LaserOnOff; //打开与关闭激光标志位
int8_t SignalRSSI;
int8_t SignalSNR;
}SGCP_t;
extern SGCP_t SGCP;
+69
View File
@@ -535,6 +535,43 @@ SGCP.GWRS485Rx.sCmdMDToGW = (GWTOMD_CMD_M)GFHeader->Cmd;
LPUart0SendArray(Pack, Len);
#endif
}
/**
*******************************************************************************
** \brief 信号质量查询指令
**
** \param 无
**
** \retval 无
******************************************************************************/
static void ToGWSignalQuery(void)
{
uint8_t Pack[256];
uint16_t Crc16;
uint8_t Len;
GatewayFrameHeader GFHeader = (GatewayFrameHeader)Pack;
GFHeader->Header = 0x7B;
memset(&GFHeader->GWAddr[0], 0x00, sizeof(GFHeader->GWAddr));
memcpy(&GFHeader->MDAddr[0], &LocalMAC[0], sizeof(GFHeader->MDAddr));
GFHeader->Cmd = GWTOMD_CMD_SIGNAL;
GFHeader->PayloadLen = 0;
Len = sizeof(GatewayFrameHeader_t);
Crc16 = CRC_Modbus(CRC16_BASE, Pack, Len);
Pack[Len++] = Crc16 & 0x00ff;
Pack[Len++] = (Crc16 >> 8) & 0x00ff;
SGCP.GWRS485Rx.sCmdMDToGW = (GWTOMD_CMD_M)GFHeader->Cmd;
#if(SGCP_SELECT == 1 || SGCP_SELECT == 2)
Sx1276LoRaSendBuffer(Pack, Len);
#endif
#if(SGCP_SELECT == 3)
LPUart0SendArray(Pack, Len);
#endif
}
/**
*******************************************************************************
** \brief 网关读取数据指令回应
@@ -1069,6 +1106,11 @@ static void GWRevHandler(void)
}
}
break;}
case GWTOMD_CMD_SIGNAL:{
SGCP.SignalSNR = PayLoad[0];
SGCP.SignalRSSI = PayLoad[1];
break;}
}
SGCP.Gateway_IRQ_Status = true;
}
@@ -1835,6 +1877,33 @@ void GwRevLoopHandler(void)
}
SGCP.GWStatus = GW_STATUS_IDLE;
break;}
case GW_STATUS_SIGNAL:{
DBG_LOG("Query signal quality...\r\n");
SGCP.Gateway_IRQ_Status = false;
ToGWSignalQuery();
SGCP.GW1mSDelayCnt = 2000;
SGCP.GWStatus = GW_STATUS_WAIT_SIGNAL;
break;}
case GW_STATUS_WAIT_SIGNAL:{
if(SGCP.GW1mSDelayCnt <= 0)
{
DBG_LOG("Signal query timeout!\r\n");
SGCP.GWStatus = GW_STATUS_IDLE;
break;
}
if(SGCP.Gateway_IRQ_Status == true)
{
SGCP.Gateway_IRQ_Status = false;
int8_t localSNR, localRSSI;
SX1276LoCalcRssiSnr(&localRSSI, &localSNR);
DBG_LOG("Signal Quality:\r\n");
DBG_LOG(" TX(Dev->GW): SNR:%d, RSSI:%d\r\n", SGCP.SignalSNR, SGCP.SignalRSSI);
DBG_LOG(" RX(GW->Dev): SNR:%d, RSSI:%d\r\n", localSNR, localRSSI);
SGCP.GWStatus = GW_STATUS_IDLE;
}
break;}
}
}