From de545c9919e53a2c4f1f1cd00687e215b26d904c Mon Sep 17 00:00:00 2001 From: YuanHongbin <975559679@qq.com> Date: Tue, 14 Jul 2026 10:13:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E8=B4=A8=E9=87=8F=E6=9F=A5=E8=AF=A2=E6=8C=87=E4=BB=A4(sig)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增GWTOMD_CMD_SIGNAL(0x09)指令,Payload为空,GWAddr填0 2. 不依赖注册状态,同频段网关收到后返回SNR和RSSI 3. 传感器收到回应后读取本地SX1276的SNR/RSSI 4. 通过调试串口打印TX(上行)/RX(下行)两方向信号质量 5. 新增sig调试指令,内置设备忙状态保护 --- Module/LaserTracing_Debug/UartDebug.c | 37 ++++++++++++++ source/inc/SGCP.h | 5 ++ source/src/SGCP.c | 69 +++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) 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;} } }