From 69de24171ccc4ae6258013d680bae9f98663f824 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 24 Feb 2023 09:05:58 -1000 Subject: [PATCH 1/8] Move settings into LoRaSerial with other settings --- Firmware/LoRaSerial/LoRaSerial.ino | 1 + Firmware/LoRaSerial/settings.h | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index 02345167..718cafbc 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -509,6 +509,7 @@ unsigned long retransmitTimeout = 0; //Throttle back re-transmits //Global variables //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- const Settings defaultSettings; +Settings settings; //Active settings used by the radio Settings tempSettings; //Create a duplicate of settings during training so that we can resort as needed char platformPrefix[25]; //Used for printing platform specific device name, ie "SAMD21 1W 915MHz" diff --git a/Firmware/LoRaSerial/settings.h b/Firmware/LoRaSerial/settings.h index f0bae7e3..77df43bb 100644 --- a/Firmware/LoRaSerial/settings.h +++ b/Firmware/LoRaSerial/settings.h @@ -19,7 +19,7 @@ typedef enum RADIO_DISCOVER_SCANNING, RADIO_DISCOVER_WAIT_TX_FIND_PARTNER_DONE, RADIO_DISCOVER_STANDBY, - + //Multi-Point: Datagrams RADIO_MP_STANDBY, RADIO_MP_WAIT_TX_DONE, @@ -518,7 +518,6 @@ typedef struct struct_settings { //-- Add commands to set the parameters //-- Add parameters to routine updateRadioParameters } Settings; -Settings settings; //Monitor which devices on the device are on or offline. struct struct_online { From 628d486a4be3cd42f1e84da90cd3310a1c9abfb8 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 24 Feb 2023 08:51:57 -1000 Subject: [PATCH 2/8] Pass settings address to generateRandomKeysID --- Firmware/LoRaSerial/Commands.ino | 2 +- Firmware/LoRaSerial/Train.ino | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Firmware/LoRaSerial/Commands.ino b/Firmware/LoRaSerial/Commands.ino index ac8b1cdf..35f21e29 100644 --- a/Firmware/LoRaSerial/Commands.ino +++ b/Firmware/LoRaSerial/Commands.ino @@ -145,7 +145,7 @@ bool commandAT(const char * commandString) return true; case ('G'): //ATG - Generate a new netID and encryption key - generateRandomKeysID(); + generateRandomKeysID(&tempSettings); return true; case ('I'): //ATI diff --git a/Firmware/LoRaSerial/Train.ino b/Firmware/LoRaSerial/Train.ino index bb8ae162..2333c1f4 100644 --- a/Firmware/LoRaSerial/Train.ino +++ b/Firmware/LoRaSerial/Train.ino @@ -10,7 +10,7 @@ void selectTraining() //Generate new netID/AES key to share //We assume the user needs to maintain their settings (airSpeed, numberOfChannels, freq min/max, bandwidth/spread/hop) //but need to be on a different netID/AES key. -void generateRandomKeysID() +void generateRandomKeysID(Settings * radioSettings) { if ((settings.debug == true) || (settings.debugTraining == true)) { @@ -22,24 +22,24 @@ void generateRandomKeysID() randomSeed(radio.randomByte()); //Generate new NetID - settings.netID = random(0, 256); //Inclusive, exclusive + radioSettings->netID = random(0, 256); //Inclusive, exclusive //Generate new AES Key. User may not be using AES but we still need both radios to have the same key in case they do enable AES. for (int x = 0 ; x < 16 ; x++) - settings.encryptionKey[x] = random(0, 256); //Inclusive, exclusive + radioSettings->encryptionKey[x] = random(0, 256); //Inclusive, exclusive //We do not generate new AES Initial Values here. Those are generated during generateHopTable() based on the unit's settings. if ((settings.debug == true) || (settings.debugTraining == true)) { systemPrint("Select new NetID: "); - systemPrintln(settings.netID); + systemPrintln(radioSettings->netID); systemPrint("Select new Encryption Key:"); for (uint8_t i = 0 ; i < 16 ; i++) { systemPrint(" "); - systemPrint(settings.encryptionKey[i], HEX); + systemPrint(radioSettings->encryptionKey[i], HEX); } systemPrintln(); outputSerialData(true); From f0821fa7456ec9d4933f4e89d77b75db6d0bd672 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 24 Feb 2023 09:24:44 -1000 Subject: [PATCH 3/8] Remove trainingTimer --- Firmware/LoRaSerial/LoRaSerial.ino | 1 - Firmware/LoRaSerial/Train.ino | 1 - 2 files changed, 2 deletions(-) diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index 718cafbc..2270ceef 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -487,7 +487,6 @@ bool trainingPreviousRxInProgress = false; //Previous RX status float originalChannel; //Original channel from HOP table while training is in progress uint8_t trainingPartnerID[UNIQUE_ID_BYTES]; //Unique ID of the training partner uint8_t myUniqueId[UNIQUE_ID_BYTES]; // Unique ID of this system -unsigned long trainingTimer; //Virtual-Circuit int8_t cmdVc; //VC index for ATI commands only diff --git a/Firmware/LoRaSerial/Train.ino b/Firmware/LoRaSerial/Train.ino index 2333c1f4..dc1e9682 100644 --- a/Firmware/LoRaSerial/Train.ino +++ b/Firmware/LoRaSerial/Train.ino @@ -62,7 +62,6 @@ void beginTrainingClient() changeState(RADIO_TRAIN_WAIT_TX_FIND_PARTNER_DONE); else changeState(RADIO_TRAIN_WAIT_RX_RADIO_PARAMETERS); - trainingTimer = millis(); } //Start the training in server mode From 735ddb524ce326038f5b7f113b9f67d6a715acda Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 24 Feb 2023 09:20:02 -1000 Subject: [PATCH 4/8] Use a common reset function --- Firmware/LoRaSerial/Commands.ino | 29 ++++++++++++++++++----------- Firmware/LoRaSerial/States.ino | 4 +--- Firmware/LoRaSerial/Train.ino | 4 +--- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Firmware/LoRaSerial/Commands.ino b/Firmware/LoRaSerial/Commands.ino index 35f21e29..f87288e3 100644 --- a/Firmware/LoRaSerial/Commands.ino +++ b/Firmware/LoRaSerial/Commands.ino @@ -199,17 +199,7 @@ bool commandAT(const char * commandString) } reportOK(); - if (serialOperatingMode == MODE_VIRTUAL_CIRCUIT) - { - //Notify the PC of the serial port failure - serialOutputByte(START_OF_VC_SERIAL); - serialOutputByte(3); - serialOutputByte(PC_SERIAL_RECONNECT); - serialOutputByte(myVc); - } - outputSerialData(true); - systemFlush(); - systemReset(); + commandReset(); return true; } } @@ -852,6 +842,7 @@ void reportOK() commandComplete(true); } +//Notify the host that the command is complete void commandComplete(bool success) { if (settings.operatingMode == MODE_VIRTUAL_CIRCUIT) @@ -867,6 +858,22 @@ void commandComplete(bool success) } } +//Notify the host of the reset then reboot the system +void commandReset() +{ + if (serialOperatingMode == MODE_VIRTUAL_CIRCUIT) + { + //Notify the PC of the serial port failure + serialOutputByte(START_OF_VC_SERIAL); + serialOutputByte(3); + serialOutputByte(PC_SERIAL_RECONNECT); + serialOutputByte(myVc); + } + outputSerialData(true); + systemFlush(); + systemReset(); +} + //Remove any preceeding or following whitespace chars char * trimCommand() { diff --git a/Firmware/LoRaSerial/States.ino b/Firmware/LoRaSerial/States.ino index 08028fc6..4d7e019c 100644 --- a/Firmware/LoRaSerial/States.ino +++ b/Firmware/LoRaSerial/States.ino @@ -1722,9 +1722,7 @@ void updateRadioState() && tempSettings.server == false) { //Reboot the radio with the newly generated random netID/Key parameters - petWDT(); - systemFlush(); - systemReset(); + commandReset; } } break; diff --git a/Firmware/LoRaSerial/Train.ino b/Firmware/LoRaSerial/Train.ino index dc1e9682..3b598185 100644 --- a/Firmware/LoRaSerial/Train.ino +++ b/Firmware/LoRaSerial/Train.ino @@ -205,7 +205,5 @@ void endClientServerTraining(uint8_t event) trainingServerRunning = false; //Reboot the radio with the new parameters - petWDT(); - systemFlush(); - systemReset(); + commandReset(); } From fd7c26caee9af3384f0d8e94a5aa0e1d0e7ea69c Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 24 Feb 2023 09:02:06 -1000 Subject: [PATCH 5/8] Add trainingSettings --- Firmware/LoRaSerial/LoRaSerial.ino | 3 +- Firmware/LoRaSerial/Radio.ino | 128 ++++++++++++++--------------- Firmware/LoRaSerial/Train.ino | 64 +++++++-------- 3 files changed, 98 insertions(+), 97 deletions(-) diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index 2270ceef..b9511c51 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -509,7 +509,8 @@ unsigned long retransmitTimeout = 0; //Throttle back re-transmits //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- const Settings defaultSettings; Settings settings; //Active settings used by the radio -Settings tempSettings; //Create a duplicate of settings during training so that we can resort as needed +Settings tempSettings; //Temporary settings used for command processing +Settings trainingSettings; //Settings used for training other radios char platformPrefix[25]; //Used for printing platform specific device name, ie "SAMD21 1W 915MHz" //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index f577f1ae..a2da6e15 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -1237,88 +1237,88 @@ void updateRadioParameters(uint8_t * rxData) memcpy(¶ms, rxData, sizeof(params)); //Update the radio parameters - tempSettings.autoTuneFrequency = params.autoTuneFrequency; - tempSettings.frequencyHop = params.frequencyHop; - tempSettings.frequencyMax = params.frequencyMax; - tempSettings.frequencyMin = params.frequencyMin; - tempSettings.maxDwellTime = params.maxDwellTime; - tempSettings.numberOfChannels = params.numberOfChannels; - tempSettings.radioBandwidth = params.radioBandwidth; - tempSettings.radioBroadcastPower_dbm = params.radioBroadcastPower_dbm; - tempSettings.radioCodingRate = params.radioCodingRate; - tempSettings.radioPreambleLength = params.radioPreambleLength; - tempSettings.radioSpreadFactor = params.radioSpreadFactor; - tempSettings.radioSyncWord = params.radioSyncWord; - tempSettings.txToRxUsec = params.txToRxUsec; + trainingSettings.autoTuneFrequency = params.autoTuneFrequency; + trainingSettings.frequencyHop = params.frequencyHop; + trainingSettings.frequencyMax = params.frequencyMax; + trainingSettings.frequencyMin = params.frequencyMin; + trainingSettings.maxDwellTime = params.maxDwellTime; + trainingSettings.numberOfChannels = params.numberOfChannels; + trainingSettings.radioBandwidth = params.radioBandwidth; + trainingSettings.radioBroadcastPower_dbm = params.radioBroadcastPower_dbm; + trainingSettings.radioCodingRate = params.radioCodingRate; + trainingSettings.radioPreambleLength = params.radioPreambleLength; + trainingSettings.radioSpreadFactor = params.radioSpreadFactor; + trainingSettings.radioSyncWord = params.radioSyncWord; + trainingSettings.txToRxUsec = params.txToRxUsec; //Update the radio protocol parameters - tempSettings.dataScrambling = params.dataScrambling; - tempSettings.enableCRC16 = params.enableCRC16; - tempSettings.encryptData = params.encryptData; - memcpy(tempSettings.encryptionKey, params.encryptionKey, sizeof(tempSettings.encryptionKey)); - tempSettings.framesToYield = params.framesToYield; - tempSettings.heartbeatTimeout = params.heartbeatTimeout; - tempSettings.maxResends = params.maxResends; - tempSettings.netID = params.netID; - tempSettings.operatingMode = params.operatingMode; - tempSettings.overheadTime = params.overheadTime; - tempSettings.selectLedUse = params.selectLedUse; - tempSettings.server = params.server; - tempSettings.verifyRxNetID = params.verifyRxNetID; + trainingSettings.dataScrambling = params.dataScrambling; + trainingSettings.enableCRC16 = params.enableCRC16; + trainingSettings.encryptData = params.encryptData; + memcpy(trainingSettings.encryptionKey, params.encryptionKey, sizeof(trainingSettings.encryptionKey)); + trainingSettings.framesToYield = params.framesToYield; + trainingSettings.heartbeatTimeout = params.heartbeatTimeout; + trainingSettings.maxResends = params.maxResends; + trainingSettings.netID = params.netID; + trainingSettings.operatingMode = params.operatingMode; + trainingSettings.overheadTime = params.overheadTime; + trainingSettings.selectLedUse = params.selectLedUse; + trainingSettings.server = params.server; + trainingSettings.verifyRxNetID = params.verifyRxNetID; //Update the debug parameters if (params.copyDebug) { - tempSettings.copyDebug = params.copyDebug; - tempSettings.debug = params.debug; - tempSettings.debugDatagrams = params.debugDatagrams; - tempSettings.debugHeartbeat = params.debugHeartbeat; - tempSettings.debugNvm = params.debugNvm; - tempSettings.debugRadio = params.debugRadio; - tempSettings.debugReceive = params.debugReceive; - tempSettings.debugSerial = params.debugSerial; - tempSettings.debugStates = params.debugStates; - tempSettings.debugSync = params.debugSync; - tempSettings.debugTraining = params.debugTraining; - tempSettings.debugTransmit = params.debugTransmit; - tempSettings.displayRealMillis = params.displayRealMillis; - tempSettings.printAckNumbers = params.printAckNumbers; - tempSettings.printChannel = params.printChannel; - tempSettings.printFrequency = params.printFrequency; - tempSettings.printLinkUpDown = params.printLinkUpDown; - tempSettings.printPacketQuality = params.printPacketQuality; - tempSettings.printPktData = params.printPktData; - tempSettings.printRfData = params.printRfData; - tempSettings.printTimestamp = params.printTimestamp; - tempSettings.printTxErrors = params.printTxErrors; + trainingSettings.copyDebug = params.copyDebug; + trainingSettings.debug = params.debug; + trainingSettings.debugDatagrams = params.debugDatagrams; + trainingSettings.debugHeartbeat = params.debugHeartbeat; + trainingSettings.debugNvm = params.debugNvm; + trainingSettings.debugRadio = params.debugRadio; + trainingSettings.debugReceive = params.debugReceive; + trainingSettings.debugSerial = params.debugSerial; + trainingSettings.debugStates = params.debugStates; + trainingSettings.debugSync = params.debugSync; + trainingSettings.debugTraining = params.debugTraining; + trainingSettings.debugTransmit = params.debugTransmit; + trainingSettings.displayRealMillis = params.displayRealMillis; + trainingSettings.printAckNumbers = params.printAckNumbers; + trainingSettings.printChannel = params.printChannel; + trainingSettings.printFrequency = params.printFrequency; + trainingSettings.printLinkUpDown = params.printLinkUpDown; + trainingSettings.printPacketQuality = params.printPacketQuality; + trainingSettings.printPktData = params.printPktData; + trainingSettings.printRfData = params.printRfData; + trainingSettings.printTimestamp = params.printTimestamp; + trainingSettings.printTxErrors = params.printTxErrors; } //Update the serial parameters if (params.copySerial) { - tempSettings.copySerial = params.copySerial; - tempSettings.echo = params.echo; - tempSettings.flowControl = params.flowControl; - tempSettings.invertCts = params.invertCts; - tempSettings.invertRts = params.invertRts; - tempSettings.serialSpeed = params.serialSpeed; - tempSettings.serialTimeoutBeforeSendingFrame_ms = params.serialTimeoutBeforeSendingFrame_ms; - tempSettings.usbSerialWait = params.usbSerialWait; + trainingSettings.copySerial = params.copySerial; + trainingSettings.echo = params.echo; + trainingSettings.flowControl = params.flowControl; + trainingSettings.invertCts = params.invertCts; + trainingSettings.invertRts = params.invertRts; + trainingSettings.serialSpeed = params.serialSpeed; + trainingSettings.serialTimeoutBeforeSendingFrame_ms = params.serialTimeoutBeforeSendingFrame_ms; + trainingSettings.usbSerialWait = params.usbSerialWait; } //Update the training values - tempSettings.clientFindPartnerRetryInterval = params.clientFindPartnerRetryInterval; + trainingSettings.clientFindPartnerRetryInterval = params.clientFindPartnerRetryInterval; //The trainingKey is already the same - tempSettings.trainingTimeout = params.trainingTimeout; + trainingSettings.trainingTimeout = params.trainingTimeout; //Update the trigger parameters if (params.copyTriggers) { - tempSettings.copyTriggers = params.copyTriggers; - tempSettings.triggerEnable = params.triggerEnable; - tempSettings.triggerEnable2 = params.triggerEnable2; - tempSettings.triggerWidth = params.triggerWidth; - tempSettings.triggerWidthIsMultiplier = params.triggerWidthIsMultiplier; + trainingSettings.copyTriggers = params.copyTriggers; + trainingSettings.triggerEnable = params.triggerEnable; + trainingSettings.triggerEnable2 = params.triggerEnable2; + trainingSettings.triggerWidth = params.triggerWidth; + trainingSettings.triggerWidthIsMultiplier = params.triggerWidthIsMultiplier; } } @@ -1334,7 +1334,7 @@ bool xmitDatagramTrainRadioParameters(const uint8_t * clientID) radioCallHistory[RADIO_CALL_xmitDatagramTrainRadioParameters] = millis(); //Initialize the radio parameters - memcpy(¶ms, &tempSettings, sizeof(settings)); + memcpy(¶ms, &trainingSettings, sizeof(settings)); params.server = false; //Add the destination (client) ID diff --git a/Firmware/LoRaSerial/Train.ino b/Firmware/LoRaSerial/Train.ino index 3b598185..40aabcf9 100644 --- a/Firmware/LoRaSerial/Train.ino +++ b/Firmware/LoRaSerial/Train.ino @@ -87,9 +87,9 @@ void beginTrainingServer() systemPrintln("Server radio protocol parameters"); systemPrint(" netID: "); - systemPrintln(tempSettings.netID); + systemPrintln(trainingSettings.netID); systemPrint(" Encryption key: "); - displayEncryptionKey(tempSettings.encryptionKey); + displayEncryptionKey(trainingSettings.encryptionKey); systemPrintln(); outputSerialData(true); @@ -104,14 +104,14 @@ void beginTrainingServer() void commonTrainingInitialization() { //Save the current settings - tempSettings = settings; + trainingSettings = settings; //Use common radio settings between the client and server for training settings = defaultSettings; settings.dataScrambling = true; //Scramble the data settings.enableCRC16 = true; //Use CRC-16 settings.encryptData = true; //Enable packet encryption - memcpy(&settings.encryptionKey, &tempSettings.trainingKey, AES_KEY_BYTES); //Common encryption key + memcpy(&settings.encryptionKey, &trainingSettings.trainingKey, AES_KEY_BYTES); //Common encryption key settings.frequencyHop = false; //Stay on the training frequency settings.maxResends = 1; //Don't waste time retransmitting settings.netID = 'T'; //NetID for training @@ -124,37 +124,37 @@ void commonTrainingInitialization() selectHeaderAndTrailerBytes(); //Debug training if requested - if (tempSettings.debugTraining) + if (trainingSettings.debugTraining) { - settings.selectLedUse = tempSettings.selectLedUse; + settings.selectLedUse = trainingSettings.selectLedUse; //Ignore copyDebug - settings.debug = tempSettings.debug; - settings.debugDatagrams = tempSettings.debugDatagrams; - settings.debugHeartbeat = tempSettings.debugHeartbeat; - settings.debugNvm = tempSettings.debugNvm; - settings.debugRadio = tempSettings.debugRadio; - settings.debugReceive = tempSettings.debugReceive; - settings.debugSerial = tempSettings.debugSerial; - settings.debugStates = tempSettings.debugStates; - settings.debugSync = tempSettings.debugSync; - settings.debugTraining = tempSettings.debugTraining; - settings.debugTransmit = tempSettings.debugTransmit; - settings.displayRealMillis = tempSettings.displayRealMillis; - settings.printAckNumbers = tempSettings.printAckNumbers; - settings.printChannel = tempSettings.printChannel; - settings.printFrequency = tempSettings.printFrequency; - settings.printLinkUpDown = tempSettings.printLinkUpDown; - settings.printPacketQuality = tempSettings.printPacketQuality; - settings.printPktData = tempSettings.printPktData; - settings.printRfData = tempSettings.printRfData; - settings.printTimestamp = tempSettings.printTimestamp; - settings.printTxErrors = tempSettings.printTxErrors; + settings.debug = trainingSettings.debug; + settings.debugDatagrams = trainingSettings.debugDatagrams; + settings.debugHeartbeat = trainingSettings.debugHeartbeat; + settings.debugNvm = trainingSettings.debugNvm; + settings.debugRadio = trainingSettings.debugRadio; + settings.debugReceive = trainingSettings.debugReceive; + settings.debugSerial = trainingSettings.debugSerial; + settings.debugStates = trainingSettings.debugStates; + settings.debugSync = trainingSettings.debugSync; + settings.debugTraining = trainingSettings.debugTraining; + settings.debugTransmit = trainingSettings.debugTransmit; + settings.displayRealMillis = trainingSettings.displayRealMillis; + settings.printAckNumbers = trainingSettings.printAckNumbers; + settings.printChannel = trainingSettings.printChannel; + settings.printFrequency = trainingSettings.printFrequency; + settings.printLinkUpDown = trainingSettings.printLinkUpDown; + settings.printPacketQuality = trainingSettings.printPacketQuality; + settings.printPktData = trainingSettings.printPktData; + settings.printRfData = trainingSettings.printRfData; + settings.printTimestamp = trainingSettings.printTimestamp; + settings.printTxErrors = trainingSettings.printTxErrors; //Ignore copyTriggers - settings.triggerEnable = tempSettings.triggerEnable; - settings.triggerEnable2 = tempSettings.triggerEnable2; - settings.triggerWidth = tempSettings.triggerWidth; - settings.triggerWidthIsMultiplier = tempSettings.triggerWidthIsMultiplier; + settings.triggerEnable = trainingSettings.triggerEnable; + settings.triggerEnable2 = trainingSettings.triggerEnable2; + settings.triggerWidth = trainingSettings.triggerWidth; + settings.triggerWidthIsMultiplier = trainingSettings.triggerWidthIsMultiplier; } //Reset cylon variables @@ -180,7 +180,7 @@ void commonTrainingInitialization() void endClientServerTraining(uint8_t event) { triggerEvent(event); - settings = tempSettings; //Return to original radio settings + settings = trainingSettings; //Return to original radio settings if (settings.debugTraining) { From af0c0d89b14d78b459c99a14746c69e94b008c57 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 24 Feb 2023 09:36:22 -1000 Subject: [PATCH 6/8] Make the callers set trainingSettings --- Firmware/LoRaSerial/Commands.ino | 2 +- Firmware/LoRaSerial/System.ino | 3 ++- Firmware/LoRaSerial/Train.ino | 3 --- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Firmware/LoRaSerial/Commands.ino b/Firmware/LoRaSerial/Commands.ino index f87288e3..d94fc3ff 100644 --- a/Firmware/LoRaSerial/Commands.ino +++ b/Firmware/LoRaSerial/Commands.ino @@ -183,7 +183,7 @@ bool commandAT(const char * commandString) return true; case ('T'): //ATT - Enter training mode - settings = tempSettings; //Apply user's modifications + trainingSettings = tempSettings; //Apply user's modifications selectTraining(); return true; diff --git a/Firmware/LoRaSerial/System.ino b/Firmware/LoRaSerial/System.ino index 3789a1b8..096c0fd9 100644 --- a/Firmware/LoRaSerial/System.ino +++ b/Firmware/LoRaSerial/System.ino @@ -268,6 +268,7 @@ void updateButton() trainState = TRAIN_PRESSED; trainViaButton = true; + trainingSettings = settings; selectTraining(); } else if (trainState == TRAIN_PRESSED && trainBtn->wasReleased()) @@ -276,7 +277,7 @@ void updateButton() } else if (trainState == TRAIN_IN_PROCESS && trainBtn->wasReleased()) { - settings = tempSettings; //Return to original radio settings + settings = trainingSettings; //Return to original radio settings recordSystemSettings(); //Record original settings diff --git a/Firmware/LoRaSerial/Train.ino b/Firmware/LoRaSerial/Train.ino index 40aabcf9..ec378357 100644 --- a/Firmware/LoRaSerial/Train.ino +++ b/Firmware/LoRaSerial/Train.ino @@ -103,9 +103,6 @@ void beginTrainingServer() //Perform the common training initialization void commonTrainingInitialization() { - //Save the current settings - trainingSettings = settings; - //Use common radio settings between the client and server for training settings = defaultSettings; settings.dataScrambling = true; //Scramble the data From 4ff483dd28c19de7a69dd34906ab4e69c29a8738 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 24 Feb 2023 09:44:50 -1000 Subject: [PATCH 7/8] Don't save the training server parameters The user should save the training server parameters in command mode before entering training. Otherwise the training parameters are considered temporary and will be discarded. --- Firmware/LoRaSerial/Train.ino | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Firmware/LoRaSerial/Train.ino b/Firmware/LoRaSerial/Train.ino index ec378357..ec076ba5 100644 --- a/Firmware/LoRaSerial/Train.ino +++ b/Firmware/LoRaSerial/Train.ino @@ -67,11 +67,8 @@ void beginTrainingClient() //Start the training in server mode void beginTrainingServer() { - trainingServerRunning = true; - - //Record the settings used for training petWDT(); - recordSystemSettings(); + trainingServerRunning = true; //Display the values to be used for the client/server training systemPrintln("Server training parameters"); From d82f0139e51eeb6065d1ab0b478f0d6e1cd3ac2e Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 24 Feb 2023 10:52:47 -1000 Subject: [PATCH 8/8] New training button behavior When the training button is pressed the green LEDs start counting seconds. When the 4 second boundary is crossed the yellow LED starts to blink. When the 8 second boundary is crossed the blue LED starts to blink. When the time reaches 15 seconds the radio clears NVM and resets. Upon boot the LoRaSerial radio starts with factory settings. --- Firmware/LoRaSerial/LoRaSerial.ino | 7 +- Firmware/LoRaSerial/States.ino | 12 ++- Firmware/LoRaSerial/System.ino | 132 ++++++++++++++++++++++++----- Firmware/LoRaSerial/settings.h | 10 +-- 4 files changed, 126 insertions(+), 35 deletions(-) diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index b9511c51..f907dc65 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -166,8 +166,11 @@ uint8_t AESiv[AES_IV_BYTES] = {0}; //Set during hop table generation #include // http://librarymanager/All#JC_Button //v2.1.2 Button *trainBtn = NULL; //We can't instantiate the button here because we don't yet know what pin number to use -const int trainButtonTime = 2000; //ms press and hold before entering training -bool trainViaButton = false; //Allows auto-creation of server if client times out +const int trainButtonClientTime = 4 * 1000; //ms press and hold before entering client training +const int trainButtonServerTime = 8 * 1000; //ms press and hold before entering server training +const int trainButtonFactoryResetTime = 16 * 1000; //ms press and hold before reset + +bool inTraining; //True if training is in process //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- //Hardware Timers diff --git a/Firmware/LoRaSerial/States.ino b/Firmware/LoRaSerial/States.ino index 4d7e019c..b3abe0db 100644 --- a/Firmware/LoRaSerial/States.ino +++ b/Firmware/LoRaSerial/States.ino @@ -1717,12 +1717,16 @@ void updateRadioState() //If we are training via button, and in point to point mode, and the user has not manually set the server //then reboot with current settings after a single client acks - if (trainViaButton - && tempSettings.operatingMode == MODE_POINT_TO_POINT - && tempSettings.server == false) + if (inTraining + && (trainingSettings.operatingMode == MODE_POINT_TO_POINT) + && (!trainingSettings.server)) { + //Save the training parameters + settings = trainingSettings; + recordSystemSettings(); + //Reboot the radio with the newly generated random netID/Key parameters - commandReset; + commandReset(); } } break; diff --git a/Firmware/LoRaSerial/System.ino b/Firmware/LoRaSerial/System.ino index 096c0fd9..374f1b4d 100644 --- a/Firmware/LoRaSerial/System.ino +++ b/Firmware/LoRaSerial/System.ino @@ -257,35 +257,97 @@ uint8_t systemRead() //Check the train button and change state accordingly void updateButton() { - static TrainStates trainState = TRAIN_NO_PRESS; + bool buttonPressed; + static bool buttonWasPressed; + uint32_t deltaTime; + static Settings originalSettings; + static uint32_t pressedTime; if (trainBtn != NULL) { - trainBtn->read(); + //Determine the previous state of the button + buttonPressed = trainBtn->read(); - if (trainState == TRAIN_NO_PRESS && trainBtn->pressedFor(trainButtonTime)) + //Determine the current button state + if (buttonWasPressed) { - trainState = TRAIN_PRESSED; - - trainViaButton = true; - trainingSettings = settings; - selectTraining(); - } - else if (trainState == TRAIN_PRESSED && trainBtn->wasReleased()) - { - trainState = TRAIN_IN_PROCESS; + //Update the LEDs + deltaTime = millis() - pressedTime; + buttonLeds(deltaTime); + if (!buttonPressed) + { + //Button just released + settings = originalSettings; + + //Check for reset to factory settings + if (deltaTime >= trainButtonFactoryResetTime) + { + //Erase the EEPROM + nvmErase(); + + //Reboot the radio + commandReset(); + } + + //Starting training or exiting training via the button is only possible + //when the radio is not in command mode! + else if (!inCommandMode) + { + //Check for server training request + if (deltaTime >= trainButtonServerTime) + { + //Set the training settings + trainingSettings = settings; + inTraining = true; + if (settings.operatingMode == MODE_POINT_TO_POINT) + { + //Select a random netID and encryption key + generateRandomKeysID(&trainingSettings); + } + beginTrainingServer(); + } + + //Check for client training request + else if (deltaTime >= trainButtonClientTime) + { + trainingSettings = settings; //Set the training settings + inTraining = true; + beginTrainingClient(); + } + + //Exit training + else + { + //The user has stopped training with the button + //Restore the previous settings + settings = originalSettings; + if (inTraining) + { + inTraining = false; + changeState(RADIO_RESET); + } + } + } + } } - else if (trainState == TRAIN_IN_PROCESS && trainBtn->wasReleased()) - { - settings = trainingSettings; //Return to original radio settings - recordSystemSettings(); //Record original settings + //The button was not previously pressed + else + { + //Determine if the button is pressed + if (buttonPressed) + { + //Button just pressed + pressedTime = millis(); - //Reboot the radio - petWDT(); - systemFlush(); - systemReset(); + //Save the previous led state + if (!inTraining) + originalSettings = settings; + } } + + //Save the current button state + buttonWasPressed = buttonPressed; } } @@ -1001,6 +1063,36 @@ void updateCylonLEDs() blinkRadioTxLed(false); } +//Acknowledge the button press +void buttonLeds(uint32_t pressedMilliseconds) +{ + const uint32_t blinkTime = 1000 / 4; //Blink 4 times per second + uint8_t on; + const uint32_t onTime = blinkTime / 2; + uint8_t seconds; + + //Display the number of seconds the button has been pushed + seconds = pressedMilliseconds / 1000; + setRSSI((pressedMilliseconds >= trainButtonFactoryResetTime) ? 15 : seconds); + + if (!inCommandMode) + { + //Determine the blink state + on = (pressedMilliseconds % blinkTime) >= onTime; + + //Determine which LED to blink + if (pressedMilliseconds >= trainButtonServerTime) + { + //Blink the blue LED + digitalWrite(BLUE_LED, on); + digitalWrite(YELLOW_LED, 0); + } + else if (pressedMilliseconds >= trainButtonClientTime) + //Blink the yellow LED + digitalWrite(YELLOW_LED, on); + } +} + //Update the LED values depending upon the selected display //This is the only function that touches the LEDs void updateLeds() diff --git a/Firmware/LoRaSerial/settings.h b/Firmware/LoRaSerial/settings.h index 77df43bb..15b090a2 100644 --- a/Firmware/LoRaSerial/settings.h +++ b/Firmware/LoRaSerial/settings.h @@ -227,14 +227,6 @@ typedef struct _VIRTUAL_CIRCUIT #define ADD_VC_STATE_NAMES_TABLE #include "Virtual_Circuit_Protocol.h" -//Train button states -typedef enum -{ - TRAIN_NO_PRESS = 0, - TRAIN_PRESSED, - TRAIN_IN_PROCESS, -} TrainStates; - enum { //#, Width - Computed with: // triggerWidth = 25 @@ -358,7 +350,7 @@ typedef enum LEDS_RADIO_USE, // 3: Green1: RX, Green2: Link, Green3: RSSI, Green4: TX // Blue: Bad frames, Yellow: Bad CRC LEDS_RSSI, // 4: Green: RSSI, Blue: Serial TX, Yellow: Serial RX - LEDS_RESERVED_1, // 5 + LEDS_BUTTON_PRESS,// 5: Green: Seconds, Yellow: Client, Blue: Server LEDS_RESERVED_2, // 6 LEDS_CYLON, // 7: Display the cylon pattern on the green LEDs, others off