diff --git a/Module/LaserTracing_Debug/UartDebug.c b/Module/LaserTracing_Debug/UartDebug.c index 3742f21..7f0ca2b 100644 --- a/Module/LaserTracing_Debug/UartDebug.c +++ b/Module/LaserTracing_Debug/UartDebug.c @@ -840,6 +840,32 @@ static void DebugCmdReboot(int argc, char *argv[]) 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[]) { DBG_LOG("\r\n"); @@ -988,6 +1014,16 @@ void DebugCmdHelp(int argc, char *argv[]) token = strtok(NULL, " "); } 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] = { @@ -1006,6 +1042,7 @@ const DBGFunType DebugFun[DEBUG_CMD_CNT] = { "res", DebugCmdRestoreFactory, "dch", DebugCmdChannel, "reboot", DebugCmdReboot, + "sig", DebugCmdSignal, }; #endif diff --git a/source/inc/SGCP.h b/source/inc/SGCP.h index d2d4a0c..be0afe1 100644 --- a/source/inc/SGCP.h +++ b/source/inc/SGCP.h @@ -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; diff --git a/source/src/SGCP.c b/source/src/SGCP.c index 77fb4d0..d145636 100644 --- a/source/src/SGCP.c +++ b/source/src/SGCP.c @@ -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;} } }