From 730e0312e113ecd868ce5e82676fc9a283bf72d3 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 25 Feb 2024 11:25:55 -1000 Subject: [PATCH 01/11] Add triggerEnable3 setting to support trigger events 64 to 95 --- Firmware/LoRaSerial/Commands.ino | 1 + Firmware/LoRaSerial/System.ino | 7 ++++++- Firmware/LoRaSerial/settings.h | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Firmware/LoRaSerial/Commands.ino b/Firmware/LoRaSerial/Commands.ino index 22dfc0eb..a612823b 100644 --- a/Firmware/LoRaSerial/Commands.ino +++ b/Firmware/LoRaSerial/Commands.ino @@ -1375,6 +1375,7 @@ const COMMAND_ENTRY commands[] = {'P', 1, 0, 0, 1, 0, TYPE_BOOL, valInt, "CopyTriggers", &tempSettings.copyTriggers}, {'P', 1, 0, 0, 0xffffffff, 0, TYPE_U32, valInt, "TriggerEnable_31-0", &tempSettings.triggerEnable}, {'P', 1, 0, 0, 0xffffffff, 0, TYPE_U32, valInt, "TriggerEnable_63-32", &tempSettings.triggerEnable2}, + {'P', 1, 0, 0, 0xffffffff, 0, TYPE_U32, valInt, "TriggerEnable_95-64", &tempSettings.triggerEnable3}, {'P', 1, 0, 1, 255, 0, TYPE_U8, valInt, "TriggerWidth", &tempSettings.triggerWidth}, {'P', 1, 0, 0, 1, 0, TYPE_BOOL, valInt, "TriggerWidthIsMultiplier", &tempSettings.triggerWidthIsMultiplier}, diff --git a/Firmware/LoRaSerial/System.ino b/Firmware/LoRaSerial/System.ino index 4b8e6538..99f27a2e 100644 --- a/Firmware/LoRaSerial/System.ino +++ b/Firmware/LoRaSerial/System.ino @@ -519,7 +519,12 @@ void triggerEvent(uint8_t triggerNumber) //Determine which trigger enable to use triggerBitNumber = triggerNumber; triggerEnable = settings.triggerEnable; - if (triggerNumber >= 32) + if (triggerNumber >= 64) + { + triggerBitNumber -= 64; + triggerEnable = settings.triggerEnable3; + } + else if (triggerNumber >= 32) { triggerBitNumber -= 32; triggerEnable = settings.triggerEnable2; diff --git a/Firmware/LoRaSerial/settings.h b/Firmware/LoRaSerial/settings.h index 88884b3a..81964b5b 100644 --- a/Firmware/LoRaSerial/settings.h +++ b/Firmware/LoRaSerial/settings.h @@ -526,7 +526,7 @@ typedef struct struct_settings { uint32_t triggerEnable = 0; //Determine which triggers are enabled: 31 - 0 uint32_t triggerEnable2 = 0; //Determine which triggers are enabled: 63 - 32 - + uint32_t triggerEnable3 = 0; //Determine which triggers are enabled: 95 - 64 //---------------------------------------- //Debug parameters From 9883c7fdbd75cbda0e8cd7d7a9ed95c94cacdb1e Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 23 Feb 2024 17:47:16 -1000 Subject: [PATCH 02/11] Fix case for CheckChannelHop and remove checkChannelHopAndKickWatchdog --- Firmware/LoRaSerial/Begin.ino | 18 ------ Firmware/LoRaSerial/Radio.ino | 115 +++++++++++++++++++-------------- Firmware/LoRaSerial/Serial.ino | 21 ++++-- Firmware/LoRaSerial/States.ino | 16 ++--- Firmware/LoRaSerial/System.ino | 23 ++++--- 5 files changed, 105 insertions(+), 88 deletions(-) diff --git a/Firmware/LoRaSerial/Begin.ino b/Firmware/LoRaSerial/Begin.ino index abf9a2f4..bdf74362 100644 --- a/Firmware/LoRaSerial/Begin.ino +++ b/Firmware/LoRaSerial/Begin.ino @@ -97,24 +97,6 @@ void petWDT() //========================================================================================= -void CheckChannelHopAndKickWatchdog(void) -{ - if (timeToHop == true) //If the channelTimer has expired, move to next frequency - hopChannel(); - - petWDT(); -} - -//========================================================================================= - -void CheckChannelHop(void) -{ - if (timeToHop == true) //If the channelTimer has expired, move to next frequency - hopChannel(); -} - -//========================================================================================= - //Start the timer measuring the dwell interval and indicating that it is time to //hop channels void beginChannelTimer() diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index 0ddbcf00..144a9b74 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -609,6 +609,14 @@ void hopChannel(bool moveForwardThroughTable, uint8_t channelCount) //========================================================================================= +void checkChannelHop(void) +{ + if (timeToHop == true) //If the channelTimer has expired, move to next frequency + hopChannel(); +} + +//========================================================================================= + //Determine the time in milliseconds when channel zero is reached again unsigned long mSecToChannelZero() { @@ -1820,7 +1828,8 @@ PacketType rcvDatagram() systemPrint(rxDataBytes, HEX); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -1832,7 +1841,7 @@ PacketType rcvDatagram() if (settings.encryptData == true) { decryptBuffer(incomingBuffer, rxDataBytes); - CheckChannelHop(); + checkChannelHop(); } if (settings.debugReceive) @@ -1852,7 +1861,8 @@ PacketType rcvDatagram() systemPrint(rxDataBytes, HEX); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -1871,7 +1881,8 @@ PacketType rcvDatagram() systemPrint(rxDataBytes, HEX); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -1915,7 +1926,8 @@ PacketType rcvDatagram() systemPrintln(); outputSerialData(true); } - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.debugReceive && settings.printPktData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -1923,7 +1935,8 @@ PacketType rcvDatagram() return (DATAGRAM_NETID_MISMATCH); } } // MODE_POINT_TO_POINT - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); //Process the trailer if (settings.enableCRC16) @@ -1933,10 +1946,10 @@ PacketType rcvDatagram() //Compute the CRC-16 value crc = 0xffff; - CheckChannelHop(); + checkChannelHop(); for (data = incomingBuffer; data < &incomingBuffer[rxDataBytes - 2]; data++) crc = crc16Table[*data ^ (uint8_t)(crc >> (16 - 8))] ^ (crc << 8); - CheckChannelHop(); + checkChannelHop(); if ((incomingBuffer[rxDataBytes - 2] != (crc >> 8)) || (incomingBuffer[rxDataBytes - 1] != (crc & 0xff))) { @@ -1950,7 +1963,8 @@ PacketType rcvDatagram() systemPrint(" expected 0x"); systemPrintln(crc, HEX); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -2016,7 +2030,7 @@ PacketType rcvDatagram() systemPrint(incomingBuffer[rxDataBytes - 2], HEX); systemPrintln(incomingBuffer[rxDataBytes - 1], HEX); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } /* @@ -2043,7 +2057,7 @@ PacketType rcvDatagram() systemPrint(" Channel Timer(ms): "); systemPrintln(msToNextHopRemote); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } } @@ -2076,7 +2090,7 @@ PacketType rcvDatagram() systemPrint((int)rxDataBytes - minDatagramSize); systemPrintln(" received bytes"); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } badFrames++; return (DATAGRAM_BAD); @@ -2087,7 +2101,7 @@ PacketType rcvDatagram() systemPrint(" SF6 Length: "); systemPrintln(rxDataBytes); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } } else //SF6 @@ -2107,7 +2121,7 @@ PacketType rcvDatagram() systemPrint(rxDataBytes); systemPrintln(" bytes, expecting at least 3 bytes"); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } badFrames++; return DATAGRAM_BAD; @@ -2136,7 +2150,7 @@ PacketType rcvDatagram() else systemPrintln(rxSrcVc); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } //Validate the source VC @@ -2151,7 +2165,7 @@ PacketType rcvDatagram() systemPrint("Invalid source VC: "); systemPrintln(rxSrcVc); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -2174,7 +2188,7 @@ PacketType rcvDatagram() systemPrintln(rxDataBytes); outputSerialData(true); } - CheckChannelHop(); + checkChannelHop(); if (vc) vc->badLength++; badFrames++; @@ -2190,7 +2204,7 @@ PacketType rcvDatagram() systemPrint("Not my VC: "); systemPrintln(rxDestVc); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); if (settings.printPktData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -2218,7 +2232,7 @@ PacketType rcvDatagram() systemPrint(" expecting "); systemPrintln(vc->txAckNumber); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } badFrames++; return (DATAGRAM_BAD); @@ -2314,7 +2328,8 @@ PacketType rcvDatagram() systemPrint(rxDataBytes, HEX); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printPktData && rxDataBytes) dumpBuffer(rxData, rxDataBytes); } @@ -2362,7 +2377,7 @@ PacketType rcvDatagram() outputSerialData(true); } // debugDatagrams - CheckChannelHop(); + checkChannelHop(); //Process the packet datagramsReceived++; @@ -2395,7 +2410,7 @@ PacketType validateDatagram(VIRTUAL_CIRCUIT * vc, PacketType datagramType, uint8 systemPrint("Duplicate datagram received, ACK "); systemPrintln(ackNumber); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } linkDownTimer = millis(); duplicateFrames++; @@ -2411,7 +2426,7 @@ PacketType validateDatagram(VIRTUAL_CIRCUIT * vc, PacketType datagramType, uint8 systemPrint(" expecting "); systemPrintln(vc->rmtTxAckNumber); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } badFrames++; return DATAGRAM_BAD; @@ -2476,7 +2491,7 @@ bool transmitDatagram() VIRTUAL_CIRCUIT * vc; VC_RADIO_MESSAGE_HEADER * vcHeader; - CheckChannelHop(); + checkChannelHop(); //Remove some jitter by getting this time after the hopChannel txDatagramMicros = micros(); @@ -2562,7 +2577,7 @@ bool transmitDatagram() systemPrintln(); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } /* @@ -2588,7 +2603,8 @@ bool transmitDatagram() systemPrint(" (0x"); systemPrint(length, HEX); systemPrintln(") bytes"); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printPktData) dumpBuffer(&endOfTxData[-length], length); outputSerialData(true); @@ -2605,7 +2621,7 @@ bool transmitDatagram() systemPrint(headerBytes); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } /* @@ -2637,7 +2653,8 @@ bool transmitDatagram() systemPrint(settings.netID, HEX); systemPrintln(")"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } } @@ -2667,7 +2684,7 @@ bool transmitDatagram() if (settings.frequencyHop == true) { //Make sure that the transmitted msToNextHop is in the range 0 - maxDwellTime - CheckChannelHop(); + checkChannelHop(); //Measure the time to the next hop triggerEvent(TRIGGER_TX_LOAD_CHANNEL_TIMER_VALUE); @@ -2734,7 +2751,7 @@ bool transmitDatagram() systemPrint(" Channel Timer(ms): "); systemPrintln(msToNextHop); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } } else @@ -2788,7 +2805,7 @@ bool transmitDatagram() systemPrint(" SF6 TX Header Size: "); systemPrintln(txDatagramSize); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } } @@ -2823,7 +2840,7 @@ bool transmitDatagram() else systemPrintln(srcVc); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } /* @@ -2845,7 +2862,7 @@ bool transmitDatagram() uint16_t crc; uint8_t * txData; - CheckChannelHop(); + checkChannelHop(); //Compute the CRC-16 value crc = 0xffff; @@ -2855,7 +2872,7 @@ bool transmitDatagram() *endOfTxData++ = (uint8_t)(crc & 0xff); } txDatagramSize += trailerBytes; - CheckChannelHop(); + checkChannelHop(); //Display the trailer if (trailerBytes && settings.debugTransmit) @@ -2867,7 +2884,7 @@ bool transmitDatagram() systemPrint(trailerBytes); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); //Display the CRC if (settings.enableCRC16 && (settings.printPktData || settings.debugReceive)) @@ -2877,7 +2894,7 @@ bool transmitDatagram() systemPrint(endOfTxData[-2], HEX); systemPrintln(endOfTxData[-1], HEX); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } } @@ -2904,7 +2921,8 @@ bool transmitDatagram() systemPrint(txDatagramSize, HEX); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printRfData) { dumpBuffer(outgoingPacket, txDatagramSize); @@ -2923,7 +2941,7 @@ bool transmitDatagram() if (settings.encryptData == true) { encryptBuffer(outgoingPacket, txDatagramSize); - CheckChannelHop(); + checkChannelHop(); } //Scramble the datagram @@ -2941,7 +2959,8 @@ bool transmitDatagram() systemPrint(txDatagramSize, HEX); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printRfData) { dumpBuffer(outgoingPacket, txDatagramSize); @@ -2973,13 +2992,13 @@ void printControl(uint8_t value) systemPrint(" Control: 0x"); systemPrintln(value, HEX); - CheckChannelHop(); + checkChannelHop(); systemPrintTimestamp(); systemPrint(" ACK # "); systemPrintln(value & 3); - CheckChannelHop(); + checkChannelHop(); systemPrintTimestamp(); systemPrint(" datagramType "); @@ -3005,7 +3024,8 @@ void printControl(uint8_t value) outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } //========================================================================================= @@ -3026,7 +3046,7 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) |<------------------------- txDatagramSize --------------------------->| */ - CheckChannelHop(); + checkChannelHop(); //Display the transmitted frame bytes if (frameSentCount && (settings.printRfData || settings.debugTransmit)) @@ -3040,7 +3060,8 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) systemPrint(txDatagramSize, HEX); systemPrintln(") bytes"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); if (settings.printRfData) { dumpBuffer(outgoingPacket, txDatagramSize); @@ -3049,7 +3070,7 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) } //Transmit this frame - CheckChannelHop(); + checkChannelHop(); frameAirTimeUsec = calcAirTimeUsec(txDatagramSize); //Calculate frame air size while we're transmitting in the background @@ -3117,14 +3138,14 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) systemPrint(frameAirTimeUsec); systemPrintln(" uSec"); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); systemPrintTimestamp(); systemPrint("TX: responseDelay "); systemPrint(responseDelay); systemPrintln(" mSec"); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } } else diff --git a/Firmware/LoRaSerial/Serial.ino b/Firmware/LoRaSerial/Serial.ino index 487ae671..bb8bf3bb 100644 --- a/Firmware/LoRaSerial/Serial.ino +++ b/Firmware/LoRaSerial/Serial.ino @@ -342,7 +342,8 @@ void updateSerial() blinkSerialRxLed(true); //Turn on LED during serial reception //Take a break if there are ISRs to attend to - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); byte incoming = systemRead(); @@ -365,7 +366,8 @@ void updateSerial() systemPrint(sizeof(serialReceiveBuffer) - previousHead + rxHead); systemPrintln(" bytes into serialReceiveBuffer"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } //Process the serial data @@ -396,7 +398,8 @@ void updateSerial() systemPrint(commandLength); systemPrintln(" bytes from commandRXBuffer into commandBuffer"); outputSerialData(true); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } if (commandBuffer[0] == 'R') //Error check @@ -430,7 +433,8 @@ void processSerialInput() && (transactionComplete == false)) { //Take a break if there are ISRs to attend to - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); byte incoming = serialReceiveBuffer[rxTail++]; rxTail %= sizeof(serialReceiveBuffer); @@ -599,7 +603,8 @@ void outputSerialData(bool ignoreISR) blinkSerialTxLed(true); //Turn on LED during serial transmissions //Take a break if there are ISRs to attend to - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); arch.serialWrite(serialTransmitBuffer[txTail]); systemFlush(); //Prevent serial hardware from blocking more than this one write @@ -806,7 +811,8 @@ void vcProcessSerialInput() && (transactionComplete == false)) { //Take a break if there are ISRs to attend to - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); //Skip any garbage in the input stream data = serialReceiveBuffer[rxTail]; @@ -966,7 +972,8 @@ void vcProcessSerialInput() } //Take a break if there are ISRs to attend to - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } //========================================================================================= diff --git a/Firmware/LoRaSerial/States.ino b/Firmware/LoRaSerial/States.ino index 72ec7422..b45f99fa 100644 --- a/Firmware/LoRaSerial/States.ino +++ b/Firmware/LoRaSerial/States.ino @@ -641,7 +641,7 @@ void updateRadioState() //Wait for the data transmission to complete //==================== case RADIO_P2P_LINK_UP_WAIT_TX_DONE: - CheckChannelHop(); + checkChannelHop(); if (transactionComplete) { @@ -674,7 +674,7 @@ void updateRadioState() // * Link timeout //==================== case RADIO_P2P_LINK_UP: - CheckChannelHop(); + checkChannelHop(); //Check for a received datagram if (transactionComplete == true) @@ -1175,7 +1175,7 @@ void updateRadioState() systemPrintDec(channelNumber, 2); systemPrintln(); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } frequencyCorrection += radio.getFrequencyError() / 1000000.0; @@ -1336,7 +1336,7 @@ void updateRadioState() systemPrintDec(channelNumber, 2); systemPrintln(); outputSerialData(true); - CheckChannelHop(); + checkChannelHop(); } frequencyCorrection += radio.getFrequencyError() / 1000000.0; @@ -1374,7 +1374,7 @@ void updateRadioState() //==================== case RADIO_MP_STANDBY: //Hop channels when required - CheckChannelHop(); + checkChannelHop(); //Process the receive packet if (transactionComplete == true) @@ -1528,7 +1528,7 @@ void updateRadioState() //==================== case RADIO_MP_WAIT_TX_DONE: //Hop channels when required - CheckChannelHop(); + checkChannelHop(); //If transmit is complete then start receiving if (transactionComplete == true) @@ -1966,7 +1966,7 @@ void updateRadioState() //==================== case RADIO_VC_WAIT_TX_DONE: //Hop channels when required - CheckChannelHop(); + checkChannelHop(); //If dio0ISR has fired, we are done transmitting if (transactionComplete == true) @@ -1998,7 +1998,7 @@ void updateRadioState() //==================== case RADIO_VC_WAIT_RECEIVE: //Hop channels when required - CheckChannelHop(); + checkChannelHop(); //If dio0ISR has fired, a packet has arrived currentMillis = millis(); diff --git a/Firmware/LoRaSerial/System.ino b/Firmware/LoRaSerial/System.ino index 99f27a2e..fdc40db8 100644 --- a/Firmware/LoRaSerial/System.ino +++ b/Firmware/LoRaSerial/System.ino @@ -491,7 +491,7 @@ void radioComputeWhitening(uint8_t *buffer, uint16_t bufferSize) for (uint16_t j = 0 ; j < bufferSize ; j++) { - CheckChannelHop(); + checkChannelHop(); buffer[j] ^= WhiteningKeyLSB; for (uint8_t i = 0 ; i < 8 ; i++) @@ -626,14 +626,16 @@ void dumpBuffer(uint8_t * data, int length) { systemPrint(" "); systemPrint(*data++, HEX); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } // Space over to the ASCII display for (; index < displayWidth; index++) { systemPrint(" "); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } systemPrint(" "); @@ -644,7 +646,8 @@ void dumpBuffer(uint8_t * data, int length) systemPrint(((byte[0] < ' ') || (byte[0] >= 0x7f)) ? "." : byte); } systemPrintln(); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } } @@ -691,7 +694,8 @@ void dumpCircularBuffer(uint8_t * buffer, uint16_t tail, uint16_t bufferLength, for (index = 0; index < delta; index++) { systemPrint(" "); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } } @@ -706,14 +710,16 @@ void dumpCircularBuffer(uint8_t * buffer, uint16_t tail, uint16_t bufferLength, systemWrite(' '); data = buffer[(offset + index) % bufferLength]; systemPrint(data, HEX); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } //Space over to the ASCII display for (; (delta + index) < displayWidth; index++) { systemPrint(" "); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); } systemPrint(" "); @@ -725,7 +731,8 @@ void dumpCircularBuffer(uint8_t * buffer, uint16_t tail, uint16_t bufferLength, systemWrite(((data < ' ') || (data >= 0x7f)) ? '.' : data); } systemPrintln(); - CheckChannelHopAndKickWatchdog(); + checkChannelHop(); + petWDT(); outputSerialData(true); offset += bytes; length -= bytes; From f9d927d3add70bf9c039f4cd8be158180205ce05 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 25 Feb 2024 10:20:38 -1000 Subject: [PATCH 03/11] Move beginLoRa into Radio.ino --- Firmware/LoRaSerial/LoRaSerial.ino | 2 +- Firmware/LoRaSerial/Radio.ino | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index 9b434d02..1f440dec 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -658,7 +658,7 @@ void setup() arch.uniqueID(myUniqueId); //Get the unique ID - beginLoRa(); //Start radio + radioBeginLoRa(); //Start radio beginButton(); //Start watching the train button diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index 144a9b74..148fa135 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -2,6 +2,28 @@ // Radio.ino //========================================================================================= +//Initialize the radio layer +void radioBeginLoRa() +{ + int16_t status; + + float centerFrequency = (settings.frequencyMax - settings.frequencyMin) / 2; + centerFrequency += settings.frequencyMin; + + radio = arch.radio(); + status = radio.begin(centerFrequency); //Doesn't matter what freq we start at + if (status != RADIOLIB_ERR_NONE) + { + systemPrint("Radio init failed with code: "); + systemPrintln(status); + waitForever("Radio init failed!"); + } + + changeState(RADIO_RESET); +} + +//========================================================================================= + //Apply settings to radio //Called after begin() and once user exits from command interface bool configureRadio() From f9cce9a5cf8250b4071c1db267b80bb36350cad2 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 25 Feb 2024 10:05:53 -1000 Subject: [PATCH 04/11] Move channelTimerHandler into Radio.ino --- Firmware/LoRaSerial/Begin.ino | 23 ----------------------- Firmware/LoRaSerial/Radio.ino | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/Firmware/LoRaSerial/Begin.ino b/Firmware/LoRaSerial/Begin.ino index bdf74362..00138d18 100644 --- a/Firmware/LoRaSerial/Begin.ino +++ b/Firmware/LoRaSerial/Begin.ino @@ -107,26 +107,3 @@ void beginChannelTimer() stopChannelTimer(); //Start timer in state machine - beginChannelTimer } -//========================================================================================= - -//ISR that fires when channel timer expires -void channelTimerHandler() -{ - channelTimerStart = millis(); //Record when this ISR happened. Used for calculating clock sync. - radioCallHistory[RADIO_CALL_channelTimerHandler] = channelTimerStart; - - //If the last timer was used to sync clocks, restore full timer interval - if (reloadChannelTimer == true) - { - reloadChannelTimer = false; - channelTimer.setInterval_MS(settings.maxDwellTime, channelTimerHandler); - channelTimerMsec = settings.maxDwellTime; //ISR update - } - - if (settings.frequencyHop) - { - digitalWrite(pin_hop_timer, ((channelNumber + 1) % settings.numberOfChannels) & 1); - triggerEvent(TRIGGER_CHANNEL_TIMER_ISR); - timeToHop = true; - } -} diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index 148fa135..f89732e2 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -593,6 +593,30 @@ uint16_t myRand() //========================================================================================= +//ISR that fires when channel timer expires +void channelTimerHandler() +{ + channelTimerStart = millis(); //Record when this ISR happened. Used for calculating clock sync. + radioCallHistory[RADIO_CALL_channelTimerHandler] = channelTimerStart; + + //If the last timer was used to sync clocks, restore full timer interval + if (reloadChannelTimer == true) + { + reloadChannelTimer = false; + channelTimer.setInterval_MS(settings.maxDwellTime, channelTimerHandler); + channelTimerMsec = settings.maxDwellTime; //ISR update + } + + if (settings.frequencyHop) + { + digitalWrite(pin_hop_timer, ((channelNumber + 1) % settings.numberOfChannels) & 1); + triggerEvent(TRIGGER_CHANNEL_TIMER_ISR); + timeToHop = true; + } +} + +//========================================================================================= + //Move to the next channel //This is called when the FHSS interrupt is received //at the beginning and during of a transmission or reception From 9517a208e1893cce9513ec865afe15463e0011b3 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 25 Feb 2024 09:50:37 -1000 Subject: [PATCH 05/11] Move channel timer attach interrupt into radioBeginLoRa --- Firmware/LoRaSerial/Begin.ino | 13 ------------- Firmware/LoRaSerial/LoRaSerial.ino | 2 -- Firmware/LoRaSerial/Radio.ino | 8 ++++++++ 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/Firmware/LoRaSerial/Begin.ino b/Firmware/LoRaSerial/Begin.ino index 00138d18..d0b37876 100644 --- a/Firmware/LoRaSerial/Begin.ino +++ b/Firmware/LoRaSerial/Begin.ino @@ -94,16 +94,3 @@ void petWDT() arch.petWDT(); } } - -//========================================================================================= - -//Start the timer measuring the dwell interval and indicating that it is time to -//hop channels -void beginChannelTimer() -{ - if (channelTimer.attachInterruptInterval_MS(settings.maxDwellTime, channelTimerHandler) == false) - systemPrintln("Error starting ChannelTimer!"); - - stopChannelTimer(); //Start timer in state machine - beginChannelTimer -} - diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index 1f440dec..f4a94d17 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -662,8 +662,6 @@ void setup() beginButton(); //Start watching the train button - beginChannelTimer(); //Setup (but do not start) hardware timer for channel hopping - updateRTS(true); //We're ready for more data systemPrintTimestamp(); diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index f89732e2..fc407a74 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -19,6 +19,14 @@ void radioBeginLoRa() waitForever("Radio init failed!"); } + // Establish the channel (hop) timer interrupt handler + if (!channelTimer.attachInterruptInterval_MS(settings.maxDwellTime, + channelTimerHandler)) + waitForever("Error starting ChannelTimer!"); + + // Stop the timer + stopChannelTimer(); //Start timer in state machine - beginChannelTimer + changeState(RADIO_RESET); } From d853867a2da0e3f9a4cb48cd74582a8ba9427778 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 23 Feb 2024 17:16:17 -1000 Subject: [PATCH 06/11] Add mid level radio routines Add routines between the LoRaSerial logic and the calls to RadioLib that use SPI to interface with the LoRa radio. --- Firmware/LoRaSerial/Begin.ino | 21 -- Firmware/LoRaSerial/Commands.ino | 8 +- Firmware/LoRaSerial/LoRaSerial.ino | 1 - Firmware/LoRaSerial/Radio.ino | 512 ++++++++++++++++++++++------- Firmware/LoRaSerial/States.ino | 44 +-- Firmware/LoRaSerial/System.ino | 4 +- Firmware/LoRaSerial/Train.ino | 2 +- 7 files changed, 431 insertions(+), 161 deletions(-) diff --git a/Firmware/LoRaSerial/Begin.ino b/Firmware/LoRaSerial/Begin.ino index d0b37876..26a7cabf 100644 --- a/Firmware/LoRaSerial/Begin.ino +++ b/Firmware/LoRaSerial/Begin.ino @@ -27,27 +27,6 @@ void blinkStartup() //========================================================================================= -//Initialize the radio layer -void beginLoRa() -{ - radio = arch.radio(); - - float centerFreq = (settings.frequencyMax - settings.frequencyMin) / 2; - centerFreq += settings.frequencyMin; - - int state = radio.begin(centerFreq); //Doesn't matter what freq we start at - if (state != RADIOLIB_ERR_NONE) - { - systemPrint("Radio init failed with code: "); - systemPrintln(state); - waitForever("Radio init failed!"); - } - - changeState(RADIO_RESET); -} - -//========================================================================================= - //Initialize the button driver void beginButton() { diff --git a/Firmware/LoRaSerial/Commands.ino b/Firmware/LoRaSerial/Commands.ino index a612823b..4852c694 100644 --- a/Firmware/LoRaSerial/Commands.ino +++ b/Firmware/LoRaSerial/Commands.ino @@ -258,11 +258,11 @@ bool commandAT(const char * commandString) return true; case ('3'): //ATI3 - Display latest RSSI - systemPrintln(radio.getRSSI()); + systemPrintln(radioGetRSSI()); return true; case ('4'): //ATI4 - Get random byte from RSSI - systemPrintln(radio.randomByte()); + systemPrintln(radioRandomByte()); return true; case ('5'): //ATI5 - Show max possible bytes per second @@ -559,12 +559,12 @@ bool commandAT(const char * commandString) } else systemPrintln("None"); - systemPrint(" radio.startReceive Failure: "); + systemPrint(" radioStartReceive Failure: "); if (startReceiveFailureMillis) { systemPrintTimestamp(startReceiveFailureMillis + timestampOffset); systemPrintln(); - systemPrint(" radio.startReceive Status: "); + systemPrint(" radioStartReceive Status: "); systemPrintln(startReceiveFailureState); } else diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index f4a94d17..34ed6a6e 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -151,7 +151,6 @@ uint8_t pin_hop_timer = PIN_UNDEFINED; //Radio Library //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #include //Click here to get the library: http://librarymanager/All#RadioLib v5.6.0 -SX1276 radio = NULL; //We can't instantiate here because we don't yet know what pin numbers to use float *channels; uint8_t channelNumber = 0; diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index fc407a74..0df79b55 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -1,5 +1,26 @@ //========================================================================================= // Radio.ino +// +// Hop synchronization between LoRaSerial radios is maintained with a +// hardware timer (channelTimer) interrupt routine. The hop timer +// interrupt needs to switch frequencies which requires a SPI +// transaction with the radio. To prevent other SPI transactions with +// the radio from being interrupted, all SPI transactions need to be +// done within a critical section (interrupts disabled). The following +// radio support routines are the only routines that reference the radio +// structure. No other radio. calls should be made! +//========================================================================================= + +static SX1276 radio = NULL; //We can't instantiate here because we don't yet know what pin numbers to use + +int16_t radioAutoLDRO() +{ + int16_t status; + + status = radio.autoLDRO(); + return status; +} + //========================================================================================= //Initialize the radio layer @@ -32,6 +53,359 @@ void radioBeginLoRa() //========================================================================================= +void radioClearFHSSInt() +{ + radio.clearFHSSInt(); +} + +//========================================================================================= + +int16_t radioExplicitHeader() +{ + int16_t status; + + status = radio.explicitHeader(); + return status; +} + +//========================================================================================= + +int16_t radioForceLDRO(bool enable) +{ + int16_t status; + + status = radio.forceLDRO(enable); + return status; +} + +//========================================================================================= + +float radioGetFrequencyError() +{ + float frequencyError; + + frequencyError = radio.getFrequencyError(); + return frequencyError; +} + +//========================================================================================= + +uint16_t radioGetIRQFlags() +{ + uint16_t irqFlags; + + irqFlags = radio.getIRQFlags(); + return irqFlags; +} + +//========================================================================================= + +uint8_t radioGetModemStatus() +{ + uint8_t radioStatus; + + radioStatus = radio.getModemStatus(); + return radioStatus; +} + +//========================================================================================= + +size_t radioGetPacketLength() +{ + size_t packetLength; + + packetLength = radio.getPacketLength(); + return packetLength; +} + +//========================================================================================= + +int radioGetRSSI() +{ + int RSSI; + + RSSI = radio.getRSSI(); + return RSSI; +} + +//========================================================================================= + +float radioGetSNR() +{ + float signalToNoiseRatio; + + signalToNoiseRatio = radio.getSNR(); + return signalToNoiseRatio; +} + +//========================================================================================= + +int16_t radioImplicitHeader(size_t len) +{ + int16_t status; + + status = radio.implicitHeader(len); + return status; +} + +//========================================================================================= + +uint8_t radioRandomByte() +{ + int16_t status; + + status = radio.randomByte(); + return status; +} + +//========================================================================================= + +int16_t radioReadData(uint8_t * buffer, size_t bufferLength) +{ + int16_t status; + + status = radio.readData(buffer, bufferLength); + return status; +} + +//========================================================================================= + +int16_t radioSetBandwidth(float bandwidth) +{ + int16_t status; + + status = radio.setBandwidth(bandwidth); + return status; +} + +//========================================================================================= + +int16_t radioSetCodingRate(uint8_t codingRate) +{ + int16_t status; + + status = radio.setCodingRate(codingRate); + return status; +} + +//========================================================================================= + +int16_t radioSetCRC(bool enable) +{ + int16_t status; + + status = radio.setCRC(enable); + return status; +} + +//========================================================================================= + +int16_t radioSetDio0Action(void (*function)(void)) +{ + int16_t status; + + radio.setDio0Action(function); + return status; +} + +//========================================================================================= + +int16_t radioSetDio1Action(void (*function)(void)) +{ + int16_t status; + + radio.setDio1Action(function); + return status; +} + +//========================================================================================= + +int16_t radioSetFHSSHoppingPeriod(uint8_t freqHoppingPeriod) +{ + int16_t status; + + status = radio.setFHSSHoppingPeriod(freqHoppingPeriod); + return status; +} + +//========================================================================================= + +int16_t radioSetFrequency(float frequency) +{ + int16_t status; + + status = radio.setFrequency(frequency); + return status; +} + +//========================================================================================= + +int16_t radioSetOutputPower(int8_t power) +{ + int16_t status; + + status = radio.setOutputPower(power); + return status; +} + +//========================================================================================= + +int16_t radioSetPreambleLength(uint16_t preambleLength) +{ + int16_t status; + + status = radio.setPreambleLength(preambleLength); + return status; +} + +//========================================================================================= + +void radioSetRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn) +{ + radio.setRfSwitchPins(rxEn, txEn); +} + +//========================================================================================= + +int16_t radioSetSpreadingFactor(uint8_t spreadFactor) +{ + int16_t status; + + status = radio.setSpreadingFactor(spreadFactor); + return status; +} + +//========================================================================================= + +int16_t radioSetSyncWord(uint8_t syncWord) +{ + int16_t status; + + status = radio.setSyncWord(syncWord); + return status; +} + +//========================================================================================= + +int radioStartReceive() +{ + int state; + + state = radio.startReceive(); + return state; +} + +int radioStartReceive(uint8_t expectedSize) +{ + int state; + + state = radio.startReceive(expectedSize); + return state; +} + +//========================================================================================= + +int radioStartTransmit(uint8_t * buffer, uint8_t lengthInBytes) +{ + int state; + + state = radio.startTransmit(buffer, lengthInBytes); + return state; +} + +//========================================================================================= +#ifdef RADIOLIB_LOW_LEVEL +//========================================================================================= + +//Read a register from the SX1276 chip +uint8_t readSX1276Register(uint8_t reg) +{ + uint8_t data; + + radioCallHistory[RADIO_CALL_readSX1276Register] = millis(); + + noInterrupts(); + data = radio._mod->SPIreadRegister(reg); + interrupts(); + return data; +} + +//========================================================================================= + +//SX1276 LoRa Register Names +const char * const sx1276RegisterNames[] = +{ + NULL, "RegOpMode", NULL, NULL, // 0 - 3 + NULL, NULL, "RegFrfMsb", "RegFrfMid", // 4 - 7 + "RegFrfLsb", "RegPaConfig", "RegPaRamp", "RegOcp", // 8 - b + "RegLna", "RegFifoAddrPtr", "RegFifoTxBaseAddr", "regFifoRxBaseAddr", // c - f + + "FifoRxCurrentAddr", "RegIrqFlagsMask", "RegIrqFlags", "RegRxNbBytes", //10 - 13 + "RegRxHeaderCntValueMsb", "RegRxHeaderCntValueLsb", "RegRxPacketCntValueMsb", "RegRxPacketCntValueLsb", //14 - 17 + "RegModemStat", "RegPktSnrValue", "RegPktRssiValue", "RegRssiValue", //18 - 1b + "RegHopChannel", "RegModemConfig1", "RegModemConfig2", "RegSymbTimeoutLsb", //1c - 1f + + "RegPreambleMsb", "RegPreambleLsb", "RegPayloadLength", "RegMaxPayloadLength",//20 - 23 + "RegHopPeriod", "RegFifoRxByteAddr", "RegModemConfig3", NULL, //24 - 27 + "RegFeiMsb", "RegFeiMid", "RegFeiLsb", NULL, //28 - 2b + "RegRssiWideband", NULL, NULL, "RegIfFreq1", //2c - 2f + + "RegIfFreq2", "ReqDetectOptimize", NULL, "ReqInvertIQ", //30 - 33 + NULL, NULL, "RegHighBwOpimize1", "RegDetectionThreshold", //34 - 37 + NULL, "RegSyncWord", "RegHighBwOptimize2", "RegInvertIQ2", //38 - 3b + NULL, NULL, NULL, NULL, //3c - 3f + + "RegDioMapping1", "RegDioMapping2", "RegVersion", NULL, //40 - 43 + NULL, NULL, NULL, NULL, //44 - 47 + NULL, NULL, NULL, "RegTcxo", //48 - 4b + NULL, "RegPaDac", NULL, NULL, //4C - 4F + + NULL, NULL, NULL, NULL, //50 - 53 + NULL, NULL, NULL, NULL, //54 - 57 + NULL, NULL, NULL, "RegFormerTemp", //58 - 5b + NULL, NULL, NULL, NULL, //5c - 5f + + NULL, "RegAgcRef", "RegAgcThresh1", "RegAgcThresh2", //60 - 63 + "RegAgcThresh3", NULL, NULL, NULL, //64 - 67 + NULL, NULL, NULL, NULL, //68 - 6b + NULL, NULL, NULL, NULL, //6c - 6f + + "RegPII", //70 +}; + +//Print the SX1276 LoRa registers +void printSX1276Registers() +{ + radioCallHistory[RADIO_CALL_printSX1276Registers] = millis(); + + petWDT(); + systemPrintln("SX1276 Registers:"); + systemPrintln(" Reg Value Name"); + for (uint8_t i = 0; i < (sizeof(sx1276RegisterNames) / sizeof(sx1276RegisterNames[0])); i++) + { + //Only read and print the valid registers + if (sx1276RegisterNames[i]) + { + systemPrint(" 0x"); + systemPrint(i, HEX); + systemPrint(": 0x"); + systemPrint(readSX1276Register(i), HEX); + systemPrint(", "); + systemPrintln(sx1276RegisterNames[i]); + outputSerialData(true); + petWDT(); + } + } +} + +//========================================================================================= +#endif //RADIOLIB_LOW_LEVEL +//========================================================================================= + +//========================================================================================= +//***** All "radio." references must be in this module and above this line!!! ***** +//========================================================================================= + //Apply settings to radio //Called after begin() and once user exits from command interface bool configureRadio() @@ -48,36 +422,36 @@ bool configureRadio() //Measuring actual power output the radio will output 14dBm (25mW) to 27.9dBm (617mW) in constant transmission //So we use a lookup to convert between the user's chosen power and the radio setting int radioPowerSetting = covertdBmToSetting(settings.radioBroadcastPower_dbm); - if (radio.setOutputPower(radioPowerSetting) == RADIOLIB_ERR_INVALID_OUTPUT_POWER) + if (radioSetOutputPower(radioPowerSetting) == RADIOLIB_ERR_INVALID_OUTPUT_POWER) success = false; - if (radio.setBandwidth(settings.radioBandwidth) == RADIOLIB_ERR_INVALID_BANDWIDTH) + if (radioSetBandwidth(settings.radioBandwidth) == RADIOLIB_ERR_INVALID_BANDWIDTH) success = false; - if (radio.setSpreadingFactor(settings.radioSpreadFactor) == RADIOLIB_ERR_INVALID_SPREADING_FACTOR) + if (radioSetSpreadingFactor(settings.radioSpreadFactor) == RADIOLIB_ERR_INVALID_SPREADING_FACTOR) success = false; - if (radio.setCodingRate(settings.radioCodingRate) == RADIOLIB_ERR_INVALID_CODING_RATE) + if (radioSetCodingRate(settings.radioCodingRate) == RADIOLIB_ERR_INVALID_CODING_RATE) success = false; - if (radio.setSyncWord(settings.radioSyncWord) != RADIOLIB_ERR_NONE) + if (radioSetSyncWord(settings.radioSyncWord) != RADIOLIB_ERR_NONE) success = false; - if (radio.setPreambleLength(settings.radioPreambleLength) == RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH) + if (radioSetPreambleLength(settings.radioPreambleLength) == RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH) success = false; - if (radio.setCRC(true) == RADIOLIB_ERR_INVALID_CRC_CONFIGURATION) //Enable hardware CRC + if (radioSetCRC(true) == RADIOLIB_ERR_INVALID_CRC_CONFIGURATION) //Enable hardware CRC success = false; //SF6 requires an implicit header. We will transmit 255 bytes for most packets and 2 bytes for ACK packets. if (settings.radioSpreadFactor == 6) { - if (radio.implicitHeader(MAX_PACKET_SIZE) != RADIOLIB_ERR_NONE) + if (radioImplicitHeader(MAX_PACKET_SIZE) != RADIOLIB_ERR_NONE) success = false; } else { - if (radio.explicitHeader() != RADIOLIB_ERR_NONE) + if (radioExplicitHeader() != RADIOLIB_ERR_NONE) success = false; } @@ -85,20 +459,20 @@ bool configureRadio() uint16_t airSpeed = convertSettingsToAirSpeed(&settings); if (airSpeed <= 400) { - if (radio.forceLDRO(true) != RADIOLIB_ERR_NONE) + if (radioForceLDRO(true) != RADIOLIB_ERR_NONE) success = false; } else { - if (radio.autoLDRO() != RADIOLIB_ERR_NONE) + if (radioAutoLDRO() != RADIOLIB_ERR_NONE) success = false; } - radio.setDio0Action(transactionCompleteISR); //Called when transmission is finished - radio.setDio1Action(hopISR); //Called after a transmission has started, so we can move to next freq + radioSetDio0Action(transactionCompleteISR); //Called when transmission is finished + radioSetDio1Action(hopISR); //Called after a transmission has started, so we can move to next freq if (pin_rxen != PIN_UNDEFINED) - radio.setRfSwitchPins(pin_rxen, pin_txen); + radioSetRfSwitchPins(pin_rxen, pin_txen); // HoppingPeriod = Tsym * FreqHoppingPeriod // Given defaults of spreadfactor = 9, bandwidth = 125, it follows Tsym = 4.10ms @@ -106,7 +480,7 @@ bool configureRadio() uint16_t hoppingPeriod = settings.maxDwellTime / calcSymbolTimeMsec(); //Limit FHSS dwell time to 400ms max. / automatically floors number if (hoppingPeriod > 255) hoppingPeriod = 255; //Limit to 8 bits. if (settings.frequencyHop == false) hoppingPeriod = 0; //Disable - if (radio.setFHSSHoppingPeriod(hoppingPeriod) != RADIOLIB_ERR_NONE) + if (radioSetFHSSHoppingPeriod(hoppingPeriod) != RADIOLIB_ERR_NONE) success = false; if ((settings.debug == true) || (settings.debugRadio == true)) @@ -231,7 +605,7 @@ bool setRadioFrequency(bool rxAdjust) radioFrequency -= frequencyCorrection; //Set the new frequency - if (radio.setFrequency(radioFrequency) == RADIOLIB_ERR_INVALID_FREQUENCY) + if (radioSetFrequency(radioFrequency) == RADIOLIB_ERR_INVALID_FREQUENCY) return false; if (settings.debugSync) @@ -274,14 +648,14 @@ void returnToReceiving() int state; if (settings.radioSpreadFactor > 6) { - state = radio.startReceive(); + state = radioStartReceive(); } else { if (settings.operatingMode == MODE_POINT_TO_POINT) { - radio.implicitHeader(sf6ExpectedSize); - state = radio.startReceive(sf6ExpectedSize); //Set the size we expect to see + radioImplicitHeader(sf6ExpectedSize); + state = radioStartReceive(sf6ExpectedSize); //Set the size we expect to see if (sf6ExpectedSize < MAX_PACKET_SIZE) triggerEvent(TRIGGER_RTR_SHORT_PACKET); @@ -692,7 +1066,7 @@ unsigned long mSecToChannelZero() //Returns true if the radio indicates we have an ongoing reception bool receiveInProcess(bool startClock) { - uint8_t radioStatus = radio.getModemStatus(); + uint8_t radioStatus = radioGetModemStatus(); radioStatus &= 0b11011; //Get bits 0, 1, 3, and 4 //Known states where a reception is in progress @@ -741,88 +1115,6 @@ uint8_t covertdBmToSetting(uint8_t userSetting) } } -//========================================================================================= -#ifdef RADIOLIB_LOW_LEVEL -//========================================================================================= - -//Read a register from the SX1276 chip -uint8_t readSX1276Register(uint8_t reg) -{ - radioCallHistory[RADIO_CALL_readSX1276Register] = millis(); - - return radio._mod->SPIreadRegister(reg); -} - -//========================================================================================= - -//SX1276 LoRa Register Names -const char * const sx1276RegisterNames[] = -{ - NULL, "RegOpMode", NULL, NULL, // 0 - 3 - NULL, NULL, "RegFrfMsb", "RegFrfMid", // 4 - 7 - "RegFrfLsb", "RegPaConfig", "RegPaRamp", "RegOcp", // 8 - b - "RegLna", "RegFifoAddrPtr", "RegFifoTxBaseAddr", "regFifoRxBaseAddr", // c - f - - "FifoRxCurrentAddr", "RegIrqFlagsMask", "RegIrqFlags", "RegRxNbBytes", //10 - 13 - "RegRxHeaderCntValueMsb", "RegRxHeaderCntValueLsb", "RegRxPacketCntValueMsb", "RegRxPacketCntValueLsb", //14 - 17 - "RegModemStat", "RegPktSnrValue", "RegPktRssiValue", "RegRssiValue", //18 - 1b - "RegHopChannel", "RegModemConfig1", "RegModemConfig2", "RegSymbTimeoutLsb", //1c - 1f - - "RegPreambleMsb", "RegPreambleLsb", "RegPayloadLength", "RegMaxPayloadLength",//20 - 23 - "RegHopPeriod", "RegFifoRxByteAddr", "RegModemConfig3", NULL, //24 - 27 - "RegFeiMsb", "RegFeiMid", "RegFeiLsb", NULL, //28 - 2b - "RegRssiWideband", NULL, NULL, "RegIfFreq1", //2c - 2f - - "RegIfFreq2", "ReqDetectOptimize", NULL, "ReqInvertIQ", //30 - 33 - NULL, NULL, "RegHighBwOpimize1", "RegDetectionThreshold", //34 - 37 - NULL, "RegSyncWord", "RegHighBwOptimize2", "RegInvertIQ2", //38 - 3b - NULL, NULL, NULL, NULL, //3c - 3f - - "RegDioMapping1", "RegDioMapping2", "RegVersion", NULL, //40 - 43 - NULL, NULL, NULL, NULL, //44 - 47 - NULL, NULL, NULL, "RegTcxo", //48 - 4b - NULL, "RegPaDac", NULL, NULL, //4C - 4F - - NULL, NULL, NULL, NULL, //50 - 53 - NULL, NULL, NULL, NULL, //54 - 57 - NULL, NULL, NULL, "RegFormerTemp", //58 - 5b - NULL, NULL, NULL, NULL, //5c - 5f - - NULL, "RegAgcRef", "RegAgcThresh1", "RegAgcThresh2", //60 - 63 - "RegAgcThresh3", NULL, NULL, NULL, //64 - 67 - NULL, NULL, NULL, NULL, //68 - 6b - NULL, NULL, NULL, NULL, //6c - 6f - - "RegPII", //70 -}; - -//Print the SX1276 LoRa registers -void printSX1276Registers() -{ - radioCallHistory[RADIO_CALL_printSX1276Registers] = millis(); - - petWDT(); - systemPrintln("SX1276 Registers:"); - systemPrintln(" Reg Value Name"); - for (uint8_t i = 0; i < (sizeof(sx1276RegisterNames) / sizeof(sx1276RegisterNames[0])); i++) - { - //Only read and print the valid registers - if (sx1276RegisterNames[i]) - { - systemPrint(" 0x"); - systemPrint(i, HEX); - systemPrint(": 0x"); - systemPrint(readSX1276Register(i), HEX); - systemPrint(", "); - systemPrintln(sx1276RegisterNames[i]); - outputSerialData(true); - petWDT(); - } - } -} - -//========================================================================================= -#endif //RADIOLIB_LOW_LEVEL //========================================================================================= //ISR when DIO0 goes low @@ -865,7 +1157,7 @@ void updateHopISR() if (hop) //Clear hop ISR as needed { hop = false; - radio.clearFHSSInt(); //Clear the interrupt + radioClearFHSSInt(); //Clear the interrupt } } @@ -1804,11 +2096,11 @@ PacketType rcvDatagram() rcvTimeMillis = millis(); //Get the IRQ flags - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); //Get the received datagram framesReceived++; - int state = radio.readData(incomingBuffer, MAX_PACKET_SIZE); + int state = radioReadData(incomingBuffer, MAX_PACKET_SIZE); printPacketQuality(); //Display the RSSI, SNR and frequency error values @@ -1816,7 +2108,7 @@ PacketType rcvDatagram() { rxSuccessMillis = rcvTimeMillis; triggerEvent(TRIGGER_RX_SPI_DONE); - packetRSSI = radio.getRSSI(); + packetRSSI = radioGetRSSI(); } else { @@ -1847,7 +2139,7 @@ PacketType rcvDatagram() } } - rxDataBytes = radio.getPacketLength(); + rxDataBytes = radioGetPacketLength(); packetLength = rxDataBytes; //Total bytes received, used for calculating clock sync times in multi-point mode returnToReceiving(); //Immediately begin listening while we process new data @@ -2848,7 +3140,7 @@ bool transmitDatagram() break; } - radio.implicitHeader(txDatagramSize); //Set header size so that hardware CRC is calculated correctly + radioImplicitHeader(txDatagramSize); //Set header size so that hardware CRC is calculated correctly endOfTxData = &outgoingPacket[txDatagramSize]; if (settings.debugTransmit) @@ -3164,7 +3456,7 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) else { //Move the data to the radio over SPI - int state = radio.startTransmit(outgoingPacket, txDatagramSize); + int state = radioStartTransmit(outgoingPacket, txDatagramSize); if (state == RADIOLIB_ERR_NONE) { @@ -3915,7 +4207,7 @@ void dummyRead() triggerEvent(TRIGGER_DUMMY_READ); systemPrintln("Dummy read"); - int state = radio.readData(incomingBuffer, MAX_PACKET_SIZE); + int state = radioReadData(incomingBuffer, MAX_PACKET_SIZE); if (state != RADIOLIB_ERR_NONE) { diff --git a/Firmware/LoRaSerial/States.ino b/Firmware/LoRaSerial/States.ino index b45f99fa..f92934ab 100644 --- a/Firmware/LoRaSerial/States.ino +++ b/Firmware/LoRaSerial/States.ino @@ -23,7 +23,7 @@ #define P2P_SEND_ACK(trigger) \ { \ /*Compute the frequency correction*/ \ - frequencyCorrection += radio.getFrequencyError() / 1000000.0; \ + frequencyCorrection += radioGetFrequencyError() / 1000000.0; \ \ /*Send the ACK to the remote system*/ \ triggerEvent(trigger); \ @@ -105,7 +105,7 @@ void updateRadioState() //Initialize the radio rssi = -200; - radioSeed = radio.randomByte(); //Puts radio into standy-by state + radioSeed = radioRandomByte(); //Puts radio into standy-by state randomSeed(radioSeed); if ((settings.debug == true) || (settings.debugRadio == true)) { @@ -356,7 +356,7 @@ void updateRadioState() { triggerEvent(TRIGGER_TX_DONE); transactionComplete = false; //Reset ISR flag - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); startChannelTimerPending = true; //Starts at RX of SYNC_CLOCKS frame returnToReceiving(); changeState(RADIO_P2P_WAIT_SYNC_CLOCKS); @@ -479,7 +479,7 @@ void updateRadioState() { triggerEvent(TRIGGER_TX_DONE); transactionComplete = false; //Reset ISR flag - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); //Hop to the next channel hopChannel(); @@ -566,7 +566,7 @@ void updateRadioState() if (transactionComplete) { transactionComplete = false; //Reset ISR flag - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); setHeartbeatShort(); //We sent the last ack so be responsible for sending the next heartbeat //Bring up the link @@ -647,7 +647,7 @@ void updateRadioState() { transactionComplete = false; //Reset ISR flag triggerEvent(TRIGGER_TX_DONE); - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); //Determine the next packet size for SF6 if (ackTimer) @@ -762,7 +762,7 @@ void updateRadioState() STOP_ACK_TIMER(); setHeartbeatLong(); //Those who send an ACK have short time to next heartbeat. Those who send a heartbeat or data have long time to next heartbeat. - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; break; case DATAGRAM_REMOTE_COMMAND: @@ -1178,7 +1178,7 @@ void updateRadioState() checkChannelHop(); } - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; lastPacketReceived = millis(); //Reset changeState(RADIO_MP_STANDBY); @@ -1238,7 +1238,7 @@ void updateRadioState() if (transactionComplete) { transactionComplete = false; //Reset ISR flag - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); returnToReceiving(); changeState(RADIO_DISCOVER_SCANNING); } @@ -1339,7 +1339,7 @@ void updateRadioState() checkChannelHop(); } - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; lastPacketReceived = millis(); //Update timestamp for Link LED @@ -1418,7 +1418,7 @@ void updateRadioState() case DATAGRAM_REMOTE_COMMAND: case DATAGRAM_REMOTE_COMMAND_RESPONSE: //We should not be receiving these datagrams, but if we do, just ignore - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; triggerEvent(TRIGGER_BAD_PACKET); break; @@ -1450,7 +1450,7 @@ void updateRadioState() //Received heartbeat - do not ack. triggerEvent(TRIGGER_RX_HEARTBEAT); - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; lastPacketReceived = millis(); //Update timestamp for Link LED @@ -1465,7 +1465,7 @@ void updateRadioState() //Place any available data in the serial output buffer serialBufferOutput(rxData, rxDataBytes); - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; lastPacketReceived = millis(); //Update timestamp for Link LED break; @@ -1534,7 +1534,7 @@ void updateRadioState() if (transactionComplete == true) { transactionComplete = false; //Reset ISR flag - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); returnToReceiving(); changeState(RADIO_MP_STANDBY); } @@ -1596,7 +1596,7 @@ void updateRadioState() //Indicate that the receive is complete triggerEvent(TRIGGER_TRAINING_CLIENT_TX_FIND_PARTNER_DONE); - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); //Start the receive operation returnToReceiving(); @@ -1674,7 +1674,7 @@ void updateRadioState() if (transactionComplete == true) { transactionComplete = false; - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); endClientServerTraining(TRIGGER_TRAINING_CLIENT_TX_ACK_DONE); } break; @@ -1761,7 +1761,7 @@ void updateRadioState() systemPrintUniqueID(rxData); systemPrintln(); int radioPowerSetting = covertdBmToSetting(settings.radioBroadcastPower_dbm); - radio.setOutputPower(radioPowerSetting); + radioSetOutputPower(radioPowerSetting); } //Find a slot in the NVM unique ID table @@ -1829,7 +1829,7 @@ void updateRadioState() //Indicate that the receive is complete triggerEvent(TRIGGER_TRAINING_SERVER_TX_PARAMS_DONE); - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); //Start the receive operation returnToReceiving(); @@ -1974,7 +1974,7 @@ void updateRadioState() //Indicate that the transmission is complete transactionComplete = false; triggerEvent(TRIGGER_TX_DONE); - irqFlags = radio.getIRQFlags(); + irqFlags = radioGetIRQFlags(); //Start the receive operation returnToReceiving(); @@ -2066,7 +2066,7 @@ void updateRadioState() break; case DATAGRAM_DUPLICATE: - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; if (xmitVcAckFrame(rxSrcVc)) { @@ -2120,7 +2120,7 @@ void updateRadioState() } petWDT(); - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; //Transmit ACK if (xmitVcAckFrame(rxSrcVc)) @@ -2204,7 +2204,7 @@ void updateRadioState() serialBufferOutput(&rxData[index], length); } - frequencyCorrection += radio.getFrequencyError() / 1000000.0; + frequencyCorrection += radioGetFrequencyError() / 1000000.0; //ACK the command response if (xmitVcAckFrame(rxSrcVc)) //Transmit ACK diff --git a/Firmware/LoRaSerial/System.ino b/Firmware/LoRaSerial/System.ino index fdc40db8..90b46438 100644 --- a/Firmware/LoRaSerial/System.ino +++ b/Firmware/LoRaSerial/System.ino @@ -1383,9 +1383,9 @@ void printPacketQuality() systemPrint("R:"); systemPrint(rssi); systemPrint("\tS:"); - systemPrint(radio.getSNR()); + systemPrint(radioGetSNR()); systemPrint("\tfE:"); - systemPrint(radio.getFrequencyError()); + systemPrint(radioGetFrequencyError()); systemPrintln(); } } diff --git a/Firmware/LoRaSerial/Train.ino b/Firmware/LoRaSerial/Train.ino index 772162bd..cccb75ed 100644 --- a/Firmware/LoRaSerial/Train.ino +++ b/Firmware/LoRaSerial/Train.ino @@ -25,7 +25,7 @@ void generateRandomKeysID(Settings * radioSettings) } //Seed random number based on RF noise. We use Arduino random() because platform specific generation does not matter - randomSeed(radio.randomByte()); + randomSeed(radioRandomByte()); //Generate new NetID radioSettings->netID = random(0, 256); //Inclusive, exclusive From 46a3bee29d049da672729864968304338362c155 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 24 Feb 2024 09:22:23 -1000 Subject: [PATCH 07/11] Add critical section (no interrupts) around SPI transactions to radio Don't allow commands to stop the channel (hop) timer, remove ATI4 Prevent system crash in radioBeginLoRa by eliminating noInterrupt call Prevent system crash in radioRandomByte by stopping the channel timer --- Firmware/LoRaSerial/Commands.ino | 5 --- Firmware/LoRaSerial/Radio.ino | 67 ++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/Firmware/LoRaSerial/Commands.ino b/Firmware/LoRaSerial/Commands.ino index 4852c694..3b850df8 100644 --- a/Firmware/LoRaSerial/Commands.ino +++ b/Firmware/LoRaSerial/Commands.ino @@ -221,7 +221,6 @@ bool commandAT(const char * commandString) systemPrintln(" ATI1 - Show board variant"); systemPrintln(" ATI2 - Show firmware version"); systemPrintln(" ATI3 - Display RSSI value"); - systemPrintln(" ATI4 - Get random byte from RSSI"); systemPrintln(" ATI5 - Show max possible bytes per second"); systemPrintln(" ATI6 - Display AES key"); systemPrintln(" ATI7 - Show current FHSS channel"); @@ -261,10 +260,6 @@ bool commandAT(const char * commandString) systemPrintln(radioGetRSSI()); return true; - case ('4'): //ATI4 - Get random byte from RSSI - systemPrintln(radioRandomByte()); - return true; - case ('5'): //ATI5 - Show max possible bytes per second systemPrintln(calcMaxThroughput()); return true; diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index 0df79b55..265f5b97 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -17,7 +17,9 @@ int16_t radioAutoLDRO() { int16_t status; + noInterrupts(); status = radio.autoLDRO(); + interrupts(); return status; } @@ -31,6 +33,11 @@ void radioBeginLoRa() float centerFrequency = (settings.frequencyMax - settings.frequencyMin) / 2; centerFrequency += settings.frequencyMin; + // Disabling interrupts here causes the system to crash!!! + // + // Since this call is made only during setup and the channel timer is + // not running yet, it is not possible for the SPI operations to get + // interrupted during these radio calls. radio = arch.radio(); status = radio.begin(centerFrequency); //Doesn't matter what freq we start at if (status != RADIOLIB_ERR_NONE) @@ -55,7 +62,9 @@ void radioBeginLoRa() void radioClearFHSSInt() { + noInterrupts(); radio.clearFHSSInt(); + interrupts(); } //========================================================================================= @@ -64,7 +73,9 @@ int16_t radioExplicitHeader() { int16_t status; + noInterrupts(); status = radio.explicitHeader(); + interrupts(); return status; } @@ -74,7 +85,9 @@ int16_t radioForceLDRO(bool enable) { int16_t status; + noInterrupts(); status = radio.forceLDRO(enable); + interrupts(); return status; } @@ -84,7 +97,9 @@ float radioGetFrequencyError() { float frequencyError; + noInterrupts(); frequencyError = radio.getFrequencyError(); + interrupts(); return frequencyError; } @@ -94,7 +109,9 @@ uint16_t radioGetIRQFlags() { uint16_t irqFlags; + noInterrupts(); irqFlags = radio.getIRQFlags(); + interrupts(); return irqFlags; } @@ -104,7 +121,9 @@ uint8_t radioGetModemStatus() { uint8_t radioStatus; + noInterrupts(); radioStatus = radio.getModemStatus(); + interrupts(); return radioStatus; } @@ -114,7 +133,9 @@ size_t radioGetPacketLength() { size_t packetLength; + noInterrupts(); packetLength = radio.getPacketLength(); + interrupts(); return packetLength; } @@ -124,7 +145,9 @@ int radioGetRSSI() { int RSSI; + noInterrupts(); RSSI = radio.getRSSI(); + interrupts(); return RSSI; } @@ -134,7 +157,9 @@ float radioGetSNR() { float signalToNoiseRatio; + noInterrupts(); signalToNoiseRatio = radio.getSNR(); + interrupts(); return signalToNoiseRatio; } @@ -144,7 +169,9 @@ int16_t radioImplicitHeader(size_t len) { int16_t status; + noInterrupts(); status = radio.implicitHeader(len); + interrupts(); return status; } @@ -154,6 +181,14 @@ uint8_t radioRandomByte() { int16_t status; + // Disabling interrupts around this call causes the system to reset!!! + // + // Instead disable the channel (hop) timer to eliminate any SPI + // transactions interrupting the SPI transactions made by calling + // radio.randomByte + // + // This routine is called only during the RADIO_RESET state and training + stopChannelTimer(); status = radio.randomByte(); return status; } @@ -164,7 +199,9 @@ int16_t radioReadData(uint8_t * buffer, size_t bufferLength) { int16_t status; + noInterrupts(); status = radio.readData(buffer, bufferLength); + interrupts(); return status; } @@ -174,7 +211,9 @@ int16_t radioSetBandwidth(float bandwidth) { int16_t status; + noInterrupts(); status = radio.setBandwidth(bandwidth); + interrupts(); return status; } @@ -184,7 +223,9 @@ int16_t radioSetCodingRate(uint8_t codingRate) { int16_t status; + noInterrupts(); status = radio.setCodingRate(codingRate); + interrupts(); return status; } @@ -194,7 +235,9 @@ int16_t radioSetCRC(bool enable) { int16_t status; + noInterrupts(); status = radio.setCRC(enable); + interrupts(); return status; } @@ -204,7 +247,9 @@ int16_t radioSetDio0Action(void (*function)(void)) { int16_t status; + noInterrupts(); radio.setDio0Action(function); + interrupts(); return status; } @@ -214,7 +259,9 @@ int16_t radioSetDio1Action(void (*function)(void)) { int16_t status; + noInterrupts(); radio.setDio1Action(function); + interrupts(); return status; } @@ -224,7 +271,9 @@ int16_t radioSetFHSSHoppingPeriod(uint8_t freqHoppingPeriod) { int16_t status; + noInterrupts(); status = radio.setFHSSHoppingPeriod(freqHoppingPeriod); + interrupts(); return status; } @@ -234,7 +283,9 @@ int16_t radioSetFrequency(float frequency) { int16_t status; + noInterrupts(); status = radio.setFrequency(frequency); + interrupts(); return status; } @@ -244,7 +295,9 @@ int16_t radioSetOutputPower(int8_t power) { int16_t status; + noInterrupts(); status = radio.setOutputPower(power); + interrupts(); return status; } @@ -254,7 +307,9 @@ int16_t radioSetPreambleLength(uint16_t preambleLength) { int16_t status; + noInterrupts(); status = radio.setPreambleLength(preambleLength); + interrupts(); return status; } @@ -262,7 +317,9 @@ int16_t radioSetPreambleLength(uint16_t preambleLength) void radioSetRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn) { + noInterrupts(); radio.setRfSwitchPins(rxEn, txEn); + interrupts(); } //========================================================================================= @@ -271,7 +328,9 @@ int16_t radioSetSpreadingFactor(uint8_t spreadFactor) { int16_t status; + noInterrupts(); status = radio.setSpreadingFactor(spreadFactor); + interrupts(); return status; } @@ -281,7 +340,9 @@ int16_t radioSetSyncWord(uint8_t syncWord) { int16_t status; + noInterrupts(); status = radio.setSyncWord(syncWord); + interrupts(); return status; } @@ -291,7 +352,9 @@ int radioStartReceive() { int state; + noInterrupts(); state = radio.startReceive(); + interrupts(); return state; } @@ -299,7 +362,9 @@ int radioStartReceive(uint8_t expectedSize) { int state; + noInterrupts(); state = radio.startReceive(expectedSize); + interrupts(); return state; } @@ -309,7 +374,9 @@ int radioStartTransmit(uint8_t * buffer, uint8_t lengthInBytes) { int state; + noInterrupts(); state = radio.startTransmit(buffer, lengthInBytes); + interrupts(); return state; } From f4212183f70c49cbc3dd4da6ade6bfd9edb49c89 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 25 Feb 2024 08:45:13 -1000 Subject: [PATCH 08/11] Add inInterruptRoutine parameter to radioSetFrequency, setRadioFrequency --- Firmware/LoRaSerial/Radio.ino | 24 +++++++++++++++--------- Firmware/LoRaSerial/States.ino | 14 +++++++------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index 265f5b97..7af999c3 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -279,10 +279,16 @@ int16_t radioSetFHSSHoppingPeriod(uint8_t freqHoppingPeriod) //========================================================================================= -int16_t radioSetFrequency(float frequency) +int16_t radioSetFrequency(bool inInterruptRoutine, float frequency) { int16_t status; + if (inInterruptRoutine) + return radio.setFrequency(frequency); + + // Disable interrupts to prevent the channel (hop) timer interrupt + // from interrupting and corrupting the SPI operations necessary to + // change the frequency. noInterrupts(); status = radio.setFrequency(frequency); interrupts(); @@ -482,7 +488,7 @@ bool configureRadio() radioCallHistory[RADIO_CALL_configureRadio] = millis(); channelNumber = 0; - if (!setRadioFrequency(false)) + if (!setRadioFrequency(false, false)) success = false; //The SX1276 and RadioLib accepts a value of 2 to 17, with 20 enabling the power amplifier @@ -658,7 +664,7 @@ uint16_t convertSettingsToAirSpeed(Settings *newSettings) //========================================================================================= //Set radio frequency -bool setRadioFrequency(bool rxAdjust) +bool setRadioFrequency(bool inInterruptRoutine, bool rxAdjust) { float previousFrequency; static uint8_t previousChannelNumber; @@ -672,7 +678,7 @@ bool setRadioFrequency(bool rxAdjust) radioFrequency -= frequencyCorrection; //Set the new frequency - if (radioSetFrequency(radioFrequency) == RADIOLIB_ERR_INVALID_FREQUENCY) + if (radioSetFrequency(inInterruptRoutine, radioFrequency) == RADIOLIB_ERR_INVALID_FREQUENCY) return false; if (settings.debugSync) @@ -1071,7 +1077,7 @@ void channelTimerHandler() //at the beginning and during of a transmission or reception void hopChannel() { - hopChannel(true, 1); //Move forward + hopChannel(false, true, 1); //Move forward } //========================================================================================= @@ -1079,13 +1085,13 @@ void hopChannel() //Hop to the previous channel in the frequency list void hopChannelReverse() { - hopChannel(false, 1); //Move backward + hopChannel(false, false, 1); //Move backward } //========================================================================================= //Set the next radio frequency given the hop direction and frequency table -void hopChannel(bool moveForwardThroughTable, uint8_t channelCount) +void hopChannel(bool inInterruptRoutine, bool moveForwardThroughTable, uint8_t channelCount) { radioCallHistory[RADIO_CALL_hopChannel] = millis(); @@ -1098,7 +1104,7 @@ void hopChannel(bool moveForwardThroughTable, uint8_t channelCount) channelNumber %= settings.numberOfChannels; //Select the new frequency - setRadioFrequency(radioStateTable[radioState].rxState); + setRadioFrequency(inInterruptRoutine, radioStateTable[radioState].rxState); blinkChannelHopLed(true); } @@ -3969,7 +3975,7 @@ void syncChannelTimer(uint32_t frameAirTimeUsec, bool clockStarting) //Hop if the timer fired prior to disabling the timer, resetting the channelTimerStart value if (delayedHopCount) - hopChannel(true, delayedHopCount); + hopChannel(false, true, delayedHopCount); //Display the channel sync timer calculations if (settings.debugSync) diff --git a/Firmware/LoRaSerial/States.ino b/Firmware/LoRaSerial/States.ino index f92934ab..741ebfa7 100644 --- a/Firmware/LoRaSerial/States.ino +++ b/Firmware/LoRaSerial/States.ino @@ -274,7 +274,7 @@ void updateRadioState() if (channelNumber != 0) { channelNumber = 0; - setRadioFrequency(false); + setRadioFrequency(false, false); } //Stop the channel timer if it is running @@ -1072,7 +1072,7 @@ void updateRadioState() if (((frameAirTimeUsec + txDataAckUsec + settings.txToRxUsec) / 1000) > (settings.maxDwellTime / 2)) { channelNumber = 0; - setRadioFrequency(false); + setRadioFrequency(false, false); stopChannelTimer(); changeState(RADIO_DISCOVER_STANDBY); } @@ -1155,7 +1155,7 @@ void updateRadioState() { //Change to the server's channel number channelNumber = rxData[0]; - setRadioFrequency(false); + setRadioFrequency(false, false); //Update the timestamp COMPUTE_TIMESTAMP_OFFSET(rxData + 1, 0, txSyncClocksUsec); @@ -1216,7 +1216,7 @@ void updateRadioState() //Give up, return to channel 0, and wait in Standby for Server to Xmit HB channelNumber = 0; - setRadioFrequency(false); + setRadioFrequency(false, false); changeState(RADIO_DISCOVER_STANDBY); } @@ -1255,7 +1255,7 @@ void updateRadioState() { //Return to channel zero channelNumber = 0; - setRadioFrequency(false); + setRadioFrequency(false, false); } rssi = -200; //Force RSSI LEDs off until link is up @@ -1322,7 +1322,7 @@ void updateRadioState() { //Change to the server's channel number channelNumber = rxData[0]; - setRadioFrequency(false); + setRadioFrequency(false, false); //Start and adjust freq hop ISR based on remote's remaining clock channelTimerStart -= settings.maxDwellTime; @@ -1929,7 +1929,7 @@ void updateRadioState() if (channelNumber != 0) { channelNumber = 0; - setRadioFrequency(false); + setRadioFrequency(false, false); } //If dio0ISR has fired, a packet has arrived From 752ea35c8741f6eb1565cc744e2e287ec0a51e1d Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 25 Feb 2024 10:53:14 -1000 Subject: [PATCH 09/11] Hop channel in the channel interrupt routine --- Firmware/LoRaSerial/Radio.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index 7af999c3..3191c9d8 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -1064,9 +1064,11 @@ void channelTimerHandler() if (settings.frequencyHop) { - digitalWrite(pin_hop_timer, ((channelNumber + 1) % settings.numberOfChannels) & 1); + // Move to the next channel + hopChannel(true, true, 1); //Move forward + + digitalWrite(pin_hop_timer, (channelNumber % settings.numberOfChannels) & 1); triggerEvent(TRIGGER_CHANNEL_TIMER_ISR); - timeToHop = true; } } @@ -1112,8 +1114,6 @@ void hopChannel(bool inInterruptRoutine, bool moveForwardThroughTable, uint8_t c void checkChannelHop(void) { - if (timeToHop == true) //If the channelTimer has expired, move to next frequency - hopChannel(); } //========================================================================================= From e3678c74a2a8ae5f4d0d17c1a0f5e0522d35bafb Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 25 Feb 2024 11:04:18 -1000 Subject: [PATCH 10/11] Remove checkChannelHop, channel hop is done in the interrupt routine --- Firmware/LoRaSerial/Radio.ino | 67 ---------------------------------- Firmware/LoRaSerial/Serial.ino | 15 -------- Firmware/LoRaSerial/States.ino | 18 --------- Firmware/LoRaSerial/System.ino | 8 ---- 4 files changed, 108 deletions(-) diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index 3191c9d8..9a3afb0c 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -1112,12 +1112,6 @@ void hopChannel(bool inInterruptRoutine, bool moveForwardThroughTable, uint8_t c //========================================================================================= -void checkChannelHop(void) -{ -} - -//========================================================================================= - //Determine the time in milliseconds when channel zero is reached again unsigned long mSecToChannelZero() { @@ -2247,7 +2241,6 @@ PacketType rcvDatagram() systemPrint(rxDataBytes, HEX); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); petWDT(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); @@ -2258,10 +2251,7 @@ PacketType rcvDatagram() radioComputeWhitening(incomingBuffer, rxDataBytes); if (settings.encryptData == true) - { decryptBuffer(incomingBuffer, rxDataBytes); - checkChannelHop(); - } if (settings.debugReceive) { @@ -2280,7 +2270,6 @@ PacketType rcvDatagram() systemPrint(rxDataBytes, HEX); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); petWDT(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); @@ -2300,7 +2289,6 @@ PacketType rcvDatagram() systemPrint(rxDataBytes, HEX); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); petWDT(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); @@ -2345,7 +2333,6 @@ PacketType rcvDatagram() systemPrintln(); outputSerialData(true); } - checkChannelHop(); petWDT(); if (settings.debugReceive && settings.printPktData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); @@ -2354,7 +2341,6 @@ PacketType rcvDatagram() return (DATAGRAM_NETID_MISMATCH); } } // MODE_POINT_TO_POINT - checkChannelHop(); petWDT(); //Process the trailer @@ -2365,10 +2351,8 @@ PacketType rcvDatagram() //Compute the CRC-16 value crc = 0xffff; - checkChannelHop(); for (data = incomingBuffer; data < &incomingBuffer[rxDataBytes - 2]; data++) crc = crc16Table[*data ^ (uint8_t)(crc >> (16 - 8))] ^ (crc << 8); - checkChannelHop(); if ((incomingBuffer[rxDataBytes - 2] != (crc >> 8)) || (incomingBuffer[rxDataBytes - 1] != (crc & 0xff))) { @@ -2382,7 +2366,6 @@ PacketType rcvDatagram() systemPrint(" expected 0x"); systemPrintln(crc, HEX); outputSerialData(true); - checkChannelHop(); petWDT(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); @@ -2449,7 +2432,6 @@ PacketType rcvDatagram() systemPrint(incomingBuffer[rxDataBytes - 2], HEX); systemPrintln(incomingBuffer[rxDataBytes - 1], HEX); outputSerialData(true); - checkChannelHop(); } /* @@ -2476,7 +2458,6 @@ PacketType rcvDatagram() systemPrint(" Channel Timer(ms): "); systemPrintln(msToNextHopRemote); outputSerialData(true); - checkChannelHop(); } } @@ -2509,7 +2490,6 @@ PacketType rcvDatagram() systemPrint((int)rxDataBytes - minDatagramSize); systemPrintln(" received bytes"); outputSerialData(true); - checkChannelHop(); } badFrames++; return (DATAGRAM_BAD); @@ -2520,7 +2500,6 @@ PacketType rcvDatagram() systemPrint(" SF6 Length: "); systemPrintln(rxDataBytes); outputSerialData(true); - checkChannelHop(); } } else //SF6 @@ -2540,7 +2519,6 @@ PacketType rcvDatagram() systemPrint(rxDataBytes); systemPrintln(" bytes, expecting at least 3 bytes"); outputSerialData(true); - checkChannelHop(); } badFrames++; return DATAGRAM_BAD; @@ -2569,7 +2547,6 @@ PacketType rcvDatagram() else systemPrintln(rxSrcVc); outputSerialData(true); - checkChannelHop(); } //Validate the source VC @@ -2584,7 +2561,6 @@ PacketType rcvDatagram() systemPrint("Invalid source VC: "); systemPrintln(rxSrcVc); outputSerialData(true); - checkChannelHop(); if (settings.printRfData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -2607,7 +2583,6 @@ PacketType rcvDatagram() systemPrintln(rxDataBytes); outputSerialData(true); } - checkChannelHop(); if (vc) vc->badLength++; badFrames++; @@ -2623,7 +2598,6 @@ PacketType rcvDatagram() systemPrint("Not my VC: "); systemPrintln(rxDestVc); outputSerialData(true); - checkChannelHop(); if (settings.printPktData && rxDataBytes) dumpBuffer(incomingBuffer, rxDataBytes); outputSerialData(true); @@ -2651,7 +2625,6 @@ PacketType rcvDatagram() systemPrint(" expecting "); systemPrintln(vc->txAckNumber); outputSerialData(true); - checkChannelHop(); } badFrames++; return (DATAGRAM_BAD); @@ -2747,7 +2720,6 @@ PacketType rcvDatagram() systemPrint(rxDataBytes, HEX); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); petWDT(); if (settings.printPktData && rxDataBytes) dumpBuffer(rxData, rxDataBytes); @@ -2796,8 +2768,6 @@ PacketType rcvDatagram() outputSerialData(true); } // debugDatagrams - checkChannelHop(); - //Process the packet datagramsReceived++; linkDownTimer = millis(); @@ -2829,7 +2799,6 @@ PacketType validateDatagram(VIRTUAL_CIRCUIT * vc, PacketType datagramType, uint8 systemPrint("Duplicate datagram received, ACK "); systemPrintln(ackNumber); outputSerialData(true); - checkChannelHop(); } linkDownTimer = millis(); duplicateFrames++; @@ -2845,7 +2814,6 @@ PacketType validateDatagram(VIRTUAL_CIRCUIT * vc, PacketType datagramType, uint8 systemPrint(" expecting "); systemPrintln(vc->rmtTxAckNumber); outputSerialData(true); - checkChannelHop(); } badFrames++; return DATAGRAM_BAD; @@ -2910,8 +2878,6 @@ bool transmitDatagram() VIRTUAL_CIRCUIT * vc; VC_RADIO_MESSAGE_HEADER * vcHeader; - checkChannelHop(); - //Remove some jitter by getting this time after the hopChannel txDatagramMicros = micros(); radioCallHistory[RADIO_CALL_transmitDatagram] = millis(); @@ -2996,7 +2962,6 @@ bool transmitDatagram() systemPrintln(); outputSerialData(true); - checkChannelHop(); } /* @@ -3022,7 +2987,6 @@ bool transmitDatagram() systemPrint(" (0x"); systemPrint(length, HEX); systemPrintln(") bytes"); - checkChannelHop(); petWDT(); if (settings.printPktData) dumpBuffer(&endOfTxData[-length], length); @@ -3040,7 +3004,6 @@ bool transmitDatagram() systemPrint(headerBytes); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); } /* @@ -3072,7 +3035,6 @@ bool transmitDatagram() systemPrint(settings.netID, HEX); systemPrintln(")"); outputSerialData(true); - checkChannelHop(); petWDT(); } } @@ -3102,9 +3064,6 @@ bool transmitDatagram() //Add the clock sync information if (settings.frequencyHop == true) { - //Make sure that the transmitted msToNextHop is in the range 0 - maxDwellTime - checkChannelHop(); - //Measure the time to the next hop triggerEvent(TRIGGER_TX_LOAD_CHANNEL_TIMER_VALUE); txSetChannelTimerMicros = micros(); @@ -3170,7 +3129,6 @@ bool transmitDatagram() systemPrint(" Channel Timer(ms): "); systemPrintln(msToNextHop); outputSerialData(true); - checkChannelHop(); } } else @@ -3224,7 +3182,6 @@ bool transmitDatagram() systemPrint(" SF6 TX Header Size: "); systemPrintln(txDatagramSize); outputSerialData(true); - checkChannelHop(); } } @@ -3259,7 +3216,6 @@ bool transmitDatagram() else systemPrintln(srcVc); outputSerialData(true); - checkChannelHop(); } /* @@ -3281,8 +3237,6 @@ bool transmitDatagram() uint16_t crc; uint8_t * txData; - checkChannelHop(); - //Compute the CRC-16 value crc = 0xffff; for (txData = outgoingPacket; txData < endOfTxData; txData++) @@ -3291,7 +3245,6 @@ bool transmitDatagram() *endOfTxData++ = (uint8_t)(crc & 0xff); } txDatagramSize += trailerBytes; - checkChannelHop(); //Display the trailer if (trailerBytes && settings.debugTransmit) @@ -3303,7 +3256,6 @@ bool transmitDatagram() systemPrint(trailerBytes); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); //Display the CRC if (settings.enableCRC16 && (settings.printPktData || settings.debugReceive)) @@ -3313,7 +3265,6 @@ bool transmitDatagram() systemPrint(endOfTxData[-2], HEX); systemPrintln(endOfTxData[-1], HEX); outputSerialData(true); - checkChannelHop(); } } @@ -3340,7 +3291,6 @@ bool transmitDatagram() systemPrint(txDatagramSize, HEX); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); petWDT(); if (settings.printRfData) { @@ -3358,10 +3308,7 @@ bool transmitDatagram() //Encrypt the datagram if (settings.encryptData == true) - { encryptBuffer(outgoingPacket, txDatagramSize); - checkChannelHop(); - } //Scramble the datagram if (settings.dataScrambling == true) @@ -3378,7 +3325,6 @@ bool transmitDatagram() systemPrint(txDatagramSize, HEX); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); petWDT(); if (settings.printRfData) { @@ -3411,14 +3357,10 @@ void printControl(uint8_t value) systemPrint(" Control: 0x"); systemPrintln(value, HEX); - checkChannelHop(); - systemPrintTimestamp(); systemPrint(" ACK # "); systemPrintln(value & 3); - checkChannelHop(); - systemPrintTimestamp(); systemPrint(" datagramType "); if (control->datagramType < MAX_DATAGRAM_TYPE) @@ -3442,8 +3384,6 @@ void printControl(uint8_t value) } outputSerialData(true); - - checkChannelHop(); petWDT(); } @@ -3465,8 +3405,6 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) |<------------------------- txDatagramSize --------------------------->| */ - checkChannelHop(); - //Display the transmitted frame bytes if (frameSentCount && (settings.printRfData || settings.debugTransmit)) { @@ -3479,7 +3417,6 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) systemPrint(txDatagramSize, HEX); systemPrintln(") bytes"); outputSerialData(true); - checkChannelHop(); petWDT(); if (settings.printRfData) { @@ -3489,8 +3426,6 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) } //Transmit this frame - checkChannelHop(); - frameAirTimeUsec = calcAirTimeUsec(txDatagramSize); //Calculate frame air size while we're transmitting in the background uint16_t responseDelay = frameAirTimeUsec / responseDelayDivisor; //Give the receiver a bit of wiggle time to respond @@ -3557,14 +3492,12 @@ bool retransmitDatagram(VIRTUAL_CIRCUIT * vc) systemPrint(frameAirTimeUsec); systemPrintln(" uSec"); outputSerialData(true); - checkChannelHop(); systemPrintTimestamp(); systemPrint("TX: responseDelay "); systemPrint(responseDelay); systemPrintln(" mSec"); outputSerialData(true); - checkChannelHop(); } } else diff --git a/Firmware/LoRaSerial/Serial.ino b/Firmware/LoRaSerial/Serial.ino index bb8bf3bb..460f4eae 100644 --- a/Firmware/LoRaSerial/Serial.ino +++ b/Firmware/LoRaSerial/Serial.ino @@ -340,9 +340,6 @@ void updateSerial() while (bufferSpace-- && arch.serialAvailable() && (transactionComplete == false)) { blinkSerialRxLed(true); //Turn on LED during serial reception - - //Take a break if there are ISRs to attend to - checkChannelHop(); petWDT(); byte incoming = systemRead(); @@ -366,7 +363,6 @@ void updateSerial() systemPrint(sizeof(serialReceiveBuffer) - previousHead + rxHead); systemPrintln(" bytes into serialReceiveBuffer"); outputSerialData(true); - checkChannelHop(); petWDT(); } @@ -398,7 +394,6 @@ void updateSerial() systemPrint(commandLength); systemPrintln(" bytes from commandRXBuffer into commandBuffer"); outputSerialData(true); - checkChannelHop(); petWDT(); } @@ -432,8 +427,6 @@ void processSerialInput() && ((!inCommandMode) || (!waitRemoteCommandResponse)) && (transactionComplete == false)) { - //Take a break if there are ISRs to attend to - checkChannelHop(); petWDT(); byte incoming = serialReceiveBuffer[rxTail++]; @@ -601,9 +594,6 @@ void outputSerialData(bool ignoreISR) while (dataBytes-- && isCTS() && (ignoreISR || (!transactionComplete))) { blinkSerialTxLed(true); //Turn on LED during serial transmissions - - //Take a break if there are ISRs to attend to - checkChannelHop(); petWDT(); arch.serialWrite(serialTransmitBuffer[txTail]); @@ -810,8 +800,6 @@ void vcProcessSerialInput() while (dataBytes && (availableRadioTXBytes() < (sizeof(radioTxBuffer) - 256)) && (transactionComplete == false)) { - //Take a break if there are ISRs to attend to - checkChannelHop(); petWDT(); //Skip any garbage in the input stream @@ -970,9 +958,6 @@ void vcProcessSerialInput() //Determine how much data is left in the buffer dataBytes = availableRXBytes(); } - - //Take a break if there are ISRs to attend to - checkChannelHop(); petWDT(); } diff --git a/Firmware/LoRaSerial/States.ino b/Firmware/LoRaSerial/States.ino index 741ebfa7..4f743608 100644 --- a/Firmware/LoRaSerial/States.ino +++ b/Firmware/LoRaSerial/States.ino @@ -641,8 +641,6 @@ void updateRadioState() //Wait for the data transmission to complete //==================== case RADIO_P2P_LINK_UP_WAIT_TX_DONE: - checkChannelHop(); - if (transactionComplete) { transactionComplete = false; //Reset ISR flag @@ -674,8 +672,6 @@ void updateRadioState() // * Link timeout //==================== case RADIO_P2P_LINK_UP: - checkChannelHop(); - //Check for a received datagram if (transactionComplete == true) { @@ -1175,7 +1171,6 @@ void updateRadioState() systemPrintDec(channelNumber, 2); systemPrintln(); outputSerialData(true); - checkChannelHop(); } frequencyCorrection += radioGetFrequencyError() / 1000000.0; @@ -1336,7 +1331,6 @@ void updateRadioState() systemPrintDec(channelNumber, 2); systemPrintln(); outputSerialData(true); - checkChannelHop(); } frequencyCorrection += radioGetFrequencyError() / 1000000.0; @@ -1373,9 +1367,6 @@ void updateRadioState() // * Link timeout //==================== case RADIO_MP_STANDBY: - //Hop channels when required - checkChannelHop(); - //Process the receive packet if (transactionComplete == true) { @@ -1527,9 +1518,6 @@ void updateRadioState() //Wait for the frame transmission to complete //==================== case RADIO_MP_WAIT_TX_DONE: - //Hop channels when required - checkChannelHop(); - //If transmit is complete then start receiving if (transactionComplete == true) { @@ -1965,9 +1953,6 @@ void updateRadioState() //Wait for the transmission to complete //==================== case RADIO_VC_WAIT_TX_DONE: - //Hop channels when required - checkChannelHop(); - //If dio0ISR has fired, we are done transmitting if (transactionComplete == true) { @@ -1997,9 +1982,6 @@ void updateRadioState() // * Link timeout //==================== case RADIO_VC_WAIT_RECEIVE: - //Hop channels when required - checkChannelHop(); - //If dio0ISR has fired, a packet has arrived currentMillis = millis(); if (transactionComplete == true) diff --git a/Firmware/LoRaSerial/System.ino b/Firmware/LoRaSerial/System.ino index 90b46438..2c0582d0 100644 --- a/Firmware/LoRaSerial/System.ino +++ b/Firmware/LoRaSerial/System.ino @@ -491,7 +491,6 @@ void radioComputeWhitening(uint8_t *buffer, uint16_t bufferSize) for (uint16_t j = 0 ; j < bufferSize ; j++) { - checkChannelHop(); buffer[j] ^= WhiteningKeyLSB; for (uint8_t i = 0 ; i < 8 ; i++) @@ -626,7 +625,6 @@ void dumpBuffer(uint8_t * data, int length) { systemPrint(" "); systemPrint(*data++, HEX); - checkChannelHop(); petWDT(); } @@ -634,7 +632,6 @@ void dumpBuffer(uint8_t * data, int length) for (; index < displayWidth; index++) { systemPrint(" "); - checkChannelHop(); petWDT(); } systemPrint(" "); @@ -646,7 +643,6 @@ void dumpBuffer(uint8_t * data, int length) systemPrint(((byte[0] < ' ') || (byte[0] >= 0x7f)) ? "." : byte); } systemPrintln(); - checkChannelHop(); petWDT(); } } @@ -694,7 +690,6 @@ void dumpCircularBuffer(uint8_t * buffer, uint16_t tail, uint16_t bufferLength, for (index = 0; index < delta; index++) { systemPrint(" "); - checkChannelHop(); petWDT(); } } @@ -710,7 +705,6 @@ void dumpCircularBuffer(uint8_t * buffer, uint16_t tail, uint16_t bufferLength, systemWrite(' '); data = buffer[(offset + index) % bufferLength]; systemPrint(data, HEX); - checkChannelHop(); petWDT(); } @@ -718,7 +712,6 @@ void dumpCircularBuffer(uint8_t * buffer, uint16_t tail, uint16_t bufferLength, for (; (delta + index) < displayWidth; index++) { systemPrint(" "); - checkChannelHop(); petWDT(); } systemPrint(" "); @@ -731,7 +724,6 @@ void dumpCircularBuffer(uint8_t * buffer, uint16_t tail, uint16_t bufferLength, systemWrite(((data < ' ') || (data >= 0x7f)) ? '.' : data); } systemPrintln(); - checkChannelHop(); petWDT(); outputSerialData(true); offset += bytes; From ec3bb5ac13eab5dc5f3d8b088e3f0ff6cbc63756 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 25 Feb 2024 09:57:28 -1000 Subject: [PATCH 11/11] Remove the timeToHop variable --- Firmware/LoRaSerial/LoRaSerial.ino | 1 - Firmware/LoRaSerial/Radio.ino | 14 +------------- Firmware/LoRaSerial/States.ino | 5 ----- Firmware/LoRaSerial/settings.h | 1 - 4 files changed, 1 insertion(+), 20 deletions(-) diff --git a/Firmware/LoRaSerial/LoRaSerial.ino b/Firmware/LoRaSerial/LoRaSerial.ino index 34ed6a6e..49f7f215 100644 --- a/Firmware/LoRaSerial/LoRaSerial.ino +++ b/Firmware/LoRaSerial/LoRaSerial.ino @@ -189,7 +189,6 @@ bool inTraining; //True if training is in process SAMDTimer channelTimer(TIMER_TCC); //Available: TC3, TC4, TC5, TCC, TCC1 or TCC2 volatile uint16_t channelTimerMsec; //Last value programmed into the channel timer volatile unsigned long channelTimerStart = 0; //Tracks how long our timer has been running since last hop -volatile bool timeToHop = false; //Set by channelTimerHandler to indicate that hopChannel needs to be called volatile bool reloadChannelTimer = false; //When set channel timer interval needs to be reloaded with settings.maxDwellTime //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/Firmware/LoRaSerial/Radio.ino b/Firmware/LoRaSerial/Radio.ino index 9a3afb0c..245ddae0 100644 --- a/Firmware/LoRaSerial/Radio.ino +++ b/Firmware/LoRaSerial/Radio.ino @@ -1097,8 +1097,6 @@ void hopChannel(bool inInterruptRoutine, bool moveForwardThroughTable, uint8_t c { radioCallHistory[RADIO_CALL_hopChannel] = millis(); - timeToHop = false; - if (moveForwardThroughTable) channelNumber += channelCount; else @@ -3607,7 +3605,6 @@ void startChannelTimer(int16_t startAmount) channelTimer.setInterval_MS(startAmount, channelTimerHandler); digitalWrite(pin_hop_timer, channelNumber & 1); reloadChannelTimer = (startAmount != settings.maxDwellTime); - timeToHop = false; channelTimerStart = millis(); //startChannelTimer - ISR updates value channelTimerMsec = startAmount; //startChannelTimer - ISR updates value channelTimer.enableTimer(); @@ -3627,7 +3624,6 @@ void stopChannelTimer() channelTimerMsec = 0; //Indicate that the timer is off triggerEvent(TRIGGER_HOP_TIMER_STOP); - timeToHop = false; } //========================================================================================= @@ -3694,13 +3690,7 @@ void syncChannelTimer(uint32_t frameAirTimeUsec, bool clockStarting) //Synchronize with the hardware timer channelTimer.disableTimer(); - - //When timeToHop is true, a hop is required to match the hops indicated by - //the channelTimerStart value. Delay this hop to avoid adding unaccounted - //delay. After the channel timer is restarted, perform this hop because - //the channelTimerStart value indicated that it was done. The channel - //timer update will add only microseconds to when the hop is done. - delayedHopCount = timeToHop ? 1 : 0; + delayedHopCount = 0; // 4800 BPS operation // @@ -3887,12 +3877,10 @@ void syncChannelTimer(uint32_t frameAirTimeUsec, bool clockStarting) clockSyncData[clockSyncIndex].adjustment = adjustment; clockSyncData[clockSyncIndex].delayedHopCount = delayedHopCount; clockSyncData[clockSyncIndex].lclHopTimeMsec = lclHopTimeMsec; - clockSyncData[clockSyncIndex].timeToHop = timeToHop; clockSyncIndex += 1; if (clockSyncIndex >= (sizeof(clockSyncData) / sizeof(CLOCK_SYNC_DATA)) ) clockSyncIndex = 0; //Restart the channel timer - timeToHop = false; channelTimer.setInterval_MS(msToNextHop, channelTimerHandler); //Adjust our hardware timer to match our mate's digitalWrite(pin_hop_timer, ((channelNumber + delayedHopCount) % settings.numberOfChannels) & 1); channelTimerStart = currentMillis; diff --git a/Firmware/LoRaSerial/States.ino b/Firmware/LoRaSerial/States.ino index 4f743608..069f9e16 100644 --- a/Firmware/LoRaSerial/States.ino +++ b/Firmware/LoRaSerial/States.ino @@ -1243,9 +1243,6 @@ void updateRadioState() //Wait for the Server to transmit a HB on Channel 0 //==================== case RADIO_DISCOVER_STANDBY: - //Hop channels when required - if (timeToHop == true) - hopChannel(); if (channelNumber && (!channelTimerMsec)) { //Return to channel zero @@ -2911,8 +2908,6 @@ void dumpClockSynchronization() systemPrint(" msToNextHop"); if (clockSyncData[index].delayedHopCount) { - systemPrint(", timeToHop: "); - systemPrintDec(clockSyncData[index].timeToHop, 3); systemPrint(", Hops: "); systemPrintDec(clockSyncData[index].delayedHopCount, 2); } diff --git a/Firmware/LoRaSerial/settings.h b/Firmware/LoRaSerial/settings.h index 81964b5b..5fcd06a3 100644 --- a/Firmware/LoRaSerial/settings.h +++ b/Firmware/LoRaSerial/settings.h @@ -379,7 +379,6 @@ typedef struct _CLOCK_SYNC_DATA int16_t lclHopTimeMsec; int16_t adjustment; int8_t delayedHopCount; - bool timeToHop; } CLOCK_SYNC_DATA; typedef struct _AIR_SPEED_TABLE