From 546da6649e3e22ffe647a8ccad12147a58e24f37 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 15 Apr 2023 13:51:13 -1000 Subject: [PATCH 1/3] After hop timer wait blink time then turn off the yellow LED --- Firmware/LoRaSerial/System.ino | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Firmware/LoRaSerial/System.ino b/Firmware/LoRaSerial/System.ino index 0da76963..d87939c6 100644 --- a/Firmware/LoRaSerial/System.ino +++ b/Firmware/LoRaSerial/System.ino @@ -985,8 +985,7 @@ void multiPointLeds() blinkRadioRssiLed(); //Update the hop LED - if ((millis() - radioCallHistory[RADIO_CALL_hopChannel]) >= RADIO_USE_BLINK_MILLIS) - digitalWrite(YELLOW_LED, LED_OFF); + blinkChannelHopLed(false); //Update the HEARTBEAT LED blinkHeartbeatLed(false); @@ -1006,8 +1005,7 @@ void p2pLeds() //Leave the LINK LED (GREEN_LED_2) off //Update the hop LED - if ((millis() - radioCallHistory[RADIO_CALL_hopChannel]) >= RADIO_USE_BLINK_MILLIS) - digitalWrite(YELLOW_LED, LED_OFF); + blinkChannelHopLed(false); //Update the HEARTBEAT LED blinkHeartbeatLed(false); @@ -1049,8 +1047,7 @@ void vcLeds() //Serial RX displayed on the LINK LED (GREEN_LED_2) by blinkSerialRxLed //Update the hop LED - if ((millis() - radioCallHistory[RADIO_CALL_hopChannel]) >= RADIO_USE_BLINK_MILLIS) - digitalWrite(YELLOW_LED, LED_OFF); + blinkChannelHopLed(false); //Update the HEARTBEAT LED blinkHeartbeatLed(false); From e47e68e55c182d8fd841863ab99dc4f284979300 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 15 Apr 2023 08:47:56 -1000 Subject: [PATCH 2/3] Separate the default settings from the values in settings.h --- Firmware/LoRaSerial/Commands.ino | 2 +- Firmware/LoRaSerial/LoRaSerial.ino | 10 +++++++++- Firmware/LoRaSerial/NVM.ino | 12 ++++++++++++ Firmware/LoRaSerial/Train.ino | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Firmware/LoRaSerial/Commands.ino b/Firmware/LoRaSerial/Commands.ino index 80495997..d8e25ef1 100644 --- a/Firmware/LoRaSerial/Commands.ino +++ b/Firmware/LoRaSerial/Commands.ino @@ -130,7 +130,7 @@ bool commandAT(const char * commandString) return true; case ('F'): //ATF - Restore default parameters - settings = defaultSettings; //Overwrite all system settings with defaults + getDefaultSettings(&settings); //Overwrite all system settings with defaults validateSettings(); //Modify defaults for each radio type (915, 868, 433, etc) diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index 4f688231..dfad1fb7 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -518,7 +518,6 @@ unsigned long retransmitTimeout = 0; //Throttle back re-transmits //Global variables //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -const Settings defaultSettings; Settings settings; //Active settings used by the radio Settings tempSettings; //Temporary settings used for command processing Settings trainingSettings; //Settings used for training other radios @@ -629,6 +628,15 @@ void setup() arch.beginBoard(); //Initialize the board specific hardware, and ID platform type loadSettings(); //Load settings from EEPROM + + //Use the current radio settings if they are already set + if (!settings.radioBandwidth) + { + //Set the initial radio parameters + getDefaultSettings(&settings); + recordSystemSettings(); + } + serialOperatingMode = settings.operatingMode; beginSerial(settings.serialSpeed); diff --git a/Firmware/LoRaSerial/NVM.ino b/Firmware/LoRaSerial/NVM.ino index 5eb7e703..7d6e007b 100644 --- a/Firmware/LoRaSerial/NVM.ino +++ b/Firmware/LoRaSerial/NVM.ino @@ -3,6 +3,9 @@ void loadSettings() { arch.eepromBegin(); + //Use the default settings + getDefaultSettings(&settings); + //Check to see if EEPROM is blank uint32_t testRead = 0; if (EEPROM.get(0, testRead) == 0xFFFFFFFF) @@ -55,6 +58,15 @@ void loadSettings() recordSystemSettings(); } +//Merge the default settings with the default radio settings +void getDefaultSettings(Settings * newSettings) +{ + const Settings defaultSettings; + + //Set the initial radio parameters + *newSettings = defaultSettings; +} + //Modify defaults for each radio type (915, 868, 433, etc) //Confirm various settings are within regulatory bounds void validateSettings() diff --git a/Firmware/LoRaSerial/Train.ino b/Firmware/LoRaSerial/Train.ino index 1e2bb312..1da7d882 100644 --- a/Firmware/LoRaSerial/Train.ino +++ b/Firmware/LoRaSerial/Train.ino @@ -101,7 +101,7 @@ void beginTrainingServer() void commonTrainingInitialization() { //Use common radio settings between the client and server for training - settings = defaultSettings; + getDefaultSettings(&settings); settings.dataScrambling = true; //Scramble the data settings.enableCRC16 = true; //Use CRC-16 settings.encryptData = true; //Enable packet encryption From 3e628316bf7d3361ea9bf556d3e7fe66009c8630 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 15 Apr 2023 13:33:17 -1000 Subject: [PATCH 3/3] MP: Add debugHopTimer setting to compute and display link uptime --- Firmware/LoRaSerial/Commands.ino | 131 +++++++++++++++++-------------- Firmware/LoRaSerial/States.ino | 16 +++- Firmware/LoRaSerial/settings.h | 1 + 3 files changed, 88 insertions(+), 60 deletions(-) diff --git a/Firmware/LoRaSerial/Commands.ino b/Firmware/LoRaSerial/Commands.ino index d8e25ef1..b6849c5e 100644 --- a/Firmware/LoRaSerial/Commands.ino +++ b/Firmware/LoRaSerial/Commands.ino @@ -720,19 +720,29 @@ bool commandAT(const char * commandString) return true; case ('1'): //ATI31 - Display the VC details - systemPrintTimestamp(); - systemPrint("VC "); - systemPrint(cmdVc); - systemPrint(": "); - if (!vc->flags.valid) - systemPrintln("Down, Not valid"); - else + if ((settings.operatingMode == MODE_VIRTUAL_CIRCUIT) && (!vc->flags.valid)) { - systemPrintln(vcStateNames[vc->vcState]); systemPrintTimestamp(); - systemPrint(" ID: "); - systemPrintUniqueID(vc->uniqueId); - systemPrintln(vc->flags.valid ? " (Valid)" : " (Invalid)"); + systemPrint("VC "); + systemPrint(cmdVc); + systemPrint(": "); + if (!vc->flags.valid) + systemPrintln("Down, Not valid"); + } + else + { + if (settings.operatingMode == MODE_VIRTUAL_CIRCUIT) + { + systemPrintTimestamp(); + systemPrint("VC "); + systemPrint(cmdVc); + systemPrint(": "); + systemPrintln(vcStateNames[vc->vcState]); + systemPrintTimestamp(); + systemPrint(" ID: "); + systemPrintUniqueID(vc->uniqueId); + systemPrintln(vc->flags.valid ? " (Valid)" : " (Invalid)"); + } //Heartbeat metrics systemPrintTimestamp(); @@ -762,57 +772,60 @@ bool commandAT(const char * commandString) outputSerialData(true); petWDT(); - //Transmitter metrics - systemPrintTimestamp(); - systemPrintln(" Sent"); - systemPrintTimestamp(); - systemPrint(" Frames: "); - systemPrintln(vc->framesSent); - systemPrintTimestamp(); - systemPrint(" Messages: "); - systemPrintln(vc->messagesSent); - outputSerialData(true); - petWDT(); + if ((settings.operatingMode == MODE_VIRTUAL_CIRCUIT) && (!vc->flags.valid)) + { + //Transmitter metrics + systemPrintTimestamp(); + systemPrintln(" Sent"); + systemPrintTimestamp(); + systemPrint(" Frames: "); + systemPrintln(vc->framesSent); + systemPrintTimestamp(); + systemPrint(" Messages: "); + systemPrintln(vc->messagesSent); + outputSerialData(true); + petWDT(); - //Receiver metrics - systemPrintTimestamp(); - systemPrintln(" Received"); - systemPrintTimestamp(); - systemPrint(" Frames: "); - systemPrintln(vc->framesReceived); - systemPrintTimestamp(); - systemPrint(" Messages: "); - systemPrintln(vc->messagesReceived); - systemPrintTimestamp(); - systemPrint(" Bad Lengths: "); - systemPrintln(vc->badLength); - systemPrintTimestamp(); - systemPrint(" Link Failures: "); - systemPrintln(linkFailures); - outputSerialData(true); - petWDT(); + //Receiver metrics + systemPrintTimestamp(); + systemPrintln(" Received"); + systemPrintTimestamp(); + systemPrint(" Frames: "); + systemPrintln(vc->framesReceived); + systemPrintTimestamp(); + systemPrint(" Messages: "); + systemPrintln(vc->messagesReceived); + systemPrintTimestamp(); + systemPrint(" Bad Lengths: "); + systemPrintln(vc->badLength); + systemPrintTimestamp(); + systemPrint(" Link Failures: "); + systemPrintln(linkFailures); + outputSerialData(true); + petWDT(); - //ACK Management metrics - systemPrintTimestamp(); - systemPrintln(" ACK Management"); - systemPrintTimestamp(); - systemPrint(" Last RX ACK number: "); - systemPrintln(vc->rxAckNumber); - systemPrintTimestamp(); - systemPrint(" Next RX ACK number: "); - systemPrintln(vc->rmtTxAckNumber); - systemPrintTimestamp(); - systemPrint(" Last TX ACK number: "); - systemPrintln(vc->txAckNumber); - if (txDestVc == cmdVc) - { + //ACK Management metrics systemPrintTimestamp(); - systemPrint(" ackTimer: "); - if (ackTimer) - systemPrintTimestamp(ackTimer + timestampOffset); - else - systemPrint("Not Running"); - systemPrintln(); + systemPrintln(" ACK Management"); + systemPrintTimestamp(); + systemPrint(" Last RX ACK number: "); + systemPrintln(vc->rxAckNumber); + systemPrintTimestamp(); + systemPrint(" Next RX ACK number: "); + systemPrintln(vc->rmtTxAckNumber); + systemPrintTimestamp(); + systemPrint(" Last TX ACK number: "); + systemPrintln(vc->txAckNumber); + if (txDestVc == cmdVc) + { + systemPrintTimestamp(); + systemPrint(" ackTimer: "); + if (ackTimer) + systemPrintTimestamp(ackTimer + timestampOffset); + else + systemPrint("Not Running"); + systemPrintln(); + } } } return true; diff --git a/Firmware/LoRaSerial/States.ino b/Firmware/LoRaSerial/States.ino index 97dd8127..92a30f96 100644 --- a/Firmware/LoRaSerial/States.ino +++ b/Firmware/LoRaSerial/States.ino @@ -1160,6 +1160,8 @@ void updateRadioState() //Start and adjust freq hop ISR based on remote's remaining clock startChannelTimer(); channelTimerStart -= settings.maxDwellTime; + if (!settings.server) + virtualCircuitList[VC_SERVER].firstHeartbeatMillis = millis(); syncChannelTimer(txSyncClocksUsec, 1); triggerEvent(TRIGGER_RX_SYNC_CLOCKS); @@ -1320,6 +1322,8 @@ void updateRadioState() //Start and adjust freq hop ISR based on remote's remaining clock channelTimerStart -= settings.maxDwellTime; + if (!settings.server) + virtualCircuitList[VC_SERVER].firstHeartbeatMillis = millis(); syncChannelTimer(txSyncClocksUsec, 1); if (settings.debugSync) @@ -1434,6 +1438,9 @@ void updateRadioState() //Sync clock if server sent the heartbeat if (settings.server == false) { + if (!settings.server) + virtualCircuitList[VC_SERVER].lastTrafficMillis = millis(); + //Adjust freq hop ISR based on server's remaining clock syncChannelTimer(txHeartbeatUsec, 0); @@ -1495,8 +1502,15 @@ void updateRadioState() if ((millis() - lastPacketReceived) > ((uint32_t)settings.heartbeatTimeout * LINK_BREAK_MULTIPLIER)) { if (settings.debugSync) - { systemPrintln("HEARTBEAT Timeout"); + if ((!settings.server) && settings.debugHopTimer) + { + systemPrint("Link Uptime: "); + systemPrintln(virtualCircuitList[VC_SERVER].lastTrafficMillis + - virtualCircuitList[VC_SERVER].firstHeartbeatMillis); + } + if (settings.debugSync || settings.debugHopTimer) + { outputSerialData(true); dumpClockSynchronization(); } diff --git a/Firmware/LoRaSerial/settings.h b/Firmware/LoRaSerial/settings.h index 608e4b9f..c932a68e 100644 --- a/Firmware/LoRaSerial/settings.h +++ b/Firmware/LoRaSerial/settings.h @@ -487,6 +487,7 @@ typedef struct struct_settings { bool debug = false; //Print basic events: ie, radio state changes bool debugDatagrams = false; //Print the datagrams bool debugHeartbeat = false; //Print the HEARTBEAT timing values + bool debugHopTimer = false; //Print the hop timer when the link fails bool debugNvm = false; //Debug NVM operation bool debugRadio = false; //Print radio info