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:
@@ -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;}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user