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:
@@ -840,6 +840,32 @@ static void DebugCmdReboot(int argc, char *argv[])
|
|||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* Function: DebugCmdSignal
|
||||||
|
* Description: 信号质量查询
|
||||||
|
* Input: argc, 参数个数
|
||||||
|
argv, 参数列表
|
||||||
|
* Output: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
static void DebugCmdSignal(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
DBG_LOG("\r\n");
|
||||||
|
if(argc > 1)
|
||||||
|
{
|
||||||
|
if(strcmp(argv[1], "?") == 0) {
|
||||||
|
DBG_LOG("Debug Cmd: sig\r\n");
|
||||||
|
DBG_LOG(" brief --> Query signal quality with gateway.\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SGCP.GWStatus != GW_STATUS_IDLE) {
|
||||||
|
DBG_LOG("Device is busy, please try again later.\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SGCP.GWStatus = GW_STATUS_SIGNAL;
|
||||||
|
}
|
||||||
void DebugCmdHelp(int argc, char *argv[])
|
void DebugCmdHelp(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
DBG_LOG("\r\n");
|
DBG_LOG("\r\n");
|
||||||
@@ -988,6 +1014,16 @@ void DebugCmdHelp(int argc, char *argv[])
|
|||||||
token = strtok(NULL, " ");
|
token = strtok(NULL, " ");
|
||||||
}
|
}
|
||||||
DebugCmdReboot(argc1, argv1);
|
DebugCmdReboot(argc1, argv1);
|
||||||
|
|
||||||
|
memset(Data, 0x00, 10);
|
||||||
|
len = strlen("sig ?\0");
|
||||||
|
memcpy(Data, "sig ?\0", len);
|
||||||
|
token = strtok(Data, " ");
|
||||||
|
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) {
|
||||||
|
argv1[argc1] = token;
|
||||||
|
token = strtok(NULL, " ");
|
||||||
|
}
|
||||||
|
DebugCmdSignal(argc1, argv1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const DBGFunType DebugFun[DEBUG_CMD_CNT] = {
|
const DBGFunType DebugFun[DEBUG_CMD_CNT] = {
|
||||||
@@ -1006,6 +1042,7 @@ const DBGFunType DebugFun[DEBUG_CMD_CNT] = {
|
|||||||
"res", DebugCmdRestoreFactory,
|
"res", DebugCmdRestoreFactory,
|
||||||
"dch", DebugCmdChannel,
|
"dch", DebugCmdChannel,
|
||||||
"reboot", DebugCmdReboot,
|
"reboot", DebugCmdReboot,
|
||||||
|
"sig", DebugCmdSignal,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,8 @@ typedef enum {
|
|||||||
GW_STATUS_UPLOAD_SENSOR,//主动上报模式时会使用该状态
|
GW_STATUS_UPLOAD_SENSOR,//主动上报模式时会使用该状态
|
||||||
GW_STATUS_WAIT_UPLOAD,//主动上报模式时会使用该状态
|
GW_STATUS_WAIT_UPLOAD,//主动上报模式时会使用该状态
|
||||||
GW_STATUS_LASER_STARES,//激光状态回应
|
GW_STATUS_LASER_STARES,//激光状态回应
|
||||||
|
GW_STATUS_SIGNAL,
|
||||||
|
GW_STATUS_WAIT_SIGNAL,
|
||||||
}GWStatus_m;
|
}GWStatus_m;
|
||||||
/*接收主设备数据状态机*/
|
/*接收主设备数据状态机*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -126,6 +128,7 @@ typedef enum {
|
|||||||
GWTOMD_CMD_SET_COL_TIME = 0x05, //0x05,设置采集时间间隔
|
GWTOMD_CMD_SET_COL_TIME = 0x05, //0x05,设置采集时间间隔
|
||||||
GWTOMD_CMD_SYNC_TIME = 0x06, //0x06,时间同步
|
GWTOMD_CMD_SYNC_TIME = 0x06, //0x06,时间同步
|
||||||
GWTOMD_CMD_SET_LASER = 0x08,//打开or关闭激光
|
GWTOMD_CMD_SET_LASER = 0x08,//打开or关闭激光
|
||||||
|
GWTOMD_CMD_SIGNAL = 0x09,
|
||||||
}GWTOMD_CMD_M;
|
}GWTOMD_CMD_M;
|
||||||
|
|
||||||
/*主设备到子设备命令集*/
|
/*主设备到子设备命令集*/
|
||||||
@@ -270,6 +273,8 @@ typedef struct {
|
|||||||
|
|
||||||
/**激光示踪私有**/
|
/**激光示踪私有**/
|
||||||
bool LaserOnOff; //打开与关闭激光标志位
|
bool LaserOnOff; //打开与关闭激光标志位
|
||||||
|
int8_t SignalRSSI;
|
||||||
|
int8_t SignalSNR;
|
||||||
}SGCP_t;
|
}SGCP_t;
|
||||||
extern SGCP_t SGCP;
|
extern SGCP_t SGCP;
|
||||||
|
|
||||||
|
|||||||
@@ -535,6 +535,43 @@ SGCP.GWRS485Rx.sCmdMDToGW = (GWTOMD_CMD_M)GFHeader->Cmd;
|
|||||||
LPUart0SendArray(Pack, Len);
|
LPUart0SendArray(Pack, Len);
|
||||||
#endif
|
#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 网关读取数据指令回应
|
** \brief 网关读取数据指令回应
|
||||||
@@ -1069,6 +1106,11 @@ static void GWRevHandler(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;}
|
break;}
|
||||||
|
|
||||||
|
case GWTOMD_CMD_SIGNAL:{
|
||||||
|
SGCP.SignalSNR = PayLoad[0];
|
||||||
|
SGCP.SignalRSSI = PayLoad[1];
|
||||||
|
break;}
|
||||||
}
|
}
|
||||||
SGCP.Gateway_IRQ_Status = true;
|
SGCP.Gateway_IRQ_Status = true;
|
||||||
}
|
}
|
||||||
@@ -1835,6 +1877,33 @@ void GwRevLoopHandler(void)
|
|||||||
}
|
}
|
||||||
SGCP.GWStatus = GW_STATUS_IDLE;
|
SGCP.GWStatus = GW_STATUS_IDLE;
|
||||||
break;}
|
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