diff --git a/Examples/WirelessProgramming_OTA/Programmer/Programmer.ino b/Examples/WirelessProgramming_OTA/Programmer/Programmer.ino index 31e3758..3fe62a4 100644 --- a/Examples/WirelessProgramming_OTA/Programmer/Programmer.ino +++ b/Examples/WirelessProgramming_OTA/Programmer/Programmer.ino @@ -10,7 +10,7 @@ // is handled by the SPIFLash/WirelessHEX69 library, which also relies on the RFM69 library // These libraries and custom 1k Optiboot bootloader for the target node are at: http://github.com/lowpowerlab // ********************************************************************************** -// Copyright Felix Rusu 2016, http://www.LowPowerLab.com/contact +// Copyright Felix Rusu 2020, http://www.LowPowerLab.com/contact // ********************************************************************************** // License // ********************************************************************************** @@ -35,8 +35,6 @@ #include //get it here: https://github.com/lowpowerlab/RFM69 #include //get it here: https://github.com/lowpowerlab/RFM69 #include //get it here: https://github.com/lowpowerlab/RFM69 -#include //included with Arduino IDE (www.arduino.cc) - //**************************************************************************************************************** //**** IMPORTANT RADIO SETTINGS - YOU MUST CHANGE/CONFIGURE TO MATCH YOUR HARDWARE TRANSCEIVER CONFIGURATION! **** //**************************************************************************************************************** @@ -68,10 +66,11 @@ char c = 0; char input[64]; //serial input buffer -byte targetID=0; +uint16_t targetID=0; void setup(){ Serial.begin(SERIAL_BAUD); + delay(1000); radio.initialize(FREQUENCY,NODEID,NETWORKID); radio.encrypt(ENCRYPTKEY); //OPTIONAL diff --git a/Examples/WirelessProgramming_OTA/Target/Target.ino b/Examples/WirelessProgramming_OTA/Target/Target.ino index dab4e86..646b3b8 100644 --- a/Examples/WirelessProgramming_OTA/Target/Target.ino +++ b/Examples/WirelessProgramming_OTA/Target/Target.ino @@ -9,7 +9,7 @@ // is handled by the SPIFLash/RFM69_OTA library, which also relies on the RFM69 library // These libraries and custom 1k Optiboot bootloader are at: http://github.com/lowpowerlab // ********************************************************************************** -// Copyright Felix Rusu 2016, http://www.LowPowerLab.com/contact +// Copyright Felix Rusu 2020, http://www.LowPowerLab.com/contact // ********************************************************************************** // License // ********************************************************************************** @@ -35,8 +35,6 @@ #include //get it here: https://github.com/lowpowerlab/RFM69 #include //get it here: https://github.com/lowpowerlab/RFM69 #include //get it here: https://github.com/lowpowerlab/spiflash -#include //included with Arduino IDE install (www.arduino.cc) - //**************************************************************************************************************** //**** IMPORTANT RADIO SETTINGS - YOU MUST CHANGE/CONFIGURE TO MATCH YOUR HARDWARE TRANSCEIVER CONFIGURATION! **** //**************************************************************************************************************** @@ -52,16 +50,14 @@ //***************************************************************************************************************************** #define ENABLE_ATC //comment out this line to disable AUTO TRANSMISSION CONTROL #define ATC_RSSI -80 +#define FLASH_ID 0xEF30 //ex. 0xEF30 for windbond 4mbit, 0xEF40 for windbond 16/64mbit //***************************************************************************************************************************** -//#define BR_300KBPS //run radio at max rate of 300kbps! +//#define BR_300KBPS //run radio at max rate of 300kbps! //***************************************************************************************************************************** #define SERIAL_BAUD 115200 -#define ACK_TIME 30 // # of ms to wait for an ack -#define BLINKPERIOD 200 - -#if defined(MOTEINO_M0) && defined(SERIAL_PORT_USBVIRTUAL) - #define Serial SERIAL_PORT_USBVIRTUAL // Required for Serial on Zero based boards -#endif +#define BLINKPERIOD 1000 +//***************************************************************************************************************************** +SPIFlash flash(SS_FLASHMEM, FLASH_ID); #ifdef ENABLE_ATC RFM69_ATC radio; @@ -72,16 +68,6 @@ char input = 0; long lastPeriod = -1; -//***************************************************************************************************************************** -// flash(SPI_CS, MANUFACTURER_ID) -// SPI_CS - CS pin attached to SPI flash chip (8 in case of Moteino) -// MANUFACTURER_ID - OPTIONAL, 0x1F44 for adesto(ex atmel) 4mbit flash -// 0xEF30 for windbond 4mbit flash -// 0xEF40 for windbond 16/64mbit flash -// 0x1F84 for adesto 4mbit AT25SF041 4MBIT flash -//***************************************************************************************************************************** -SPIFlash flash(SS_FLASHMEM, 0xEF30); //EF30 for windbond 4mbit flash - void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(SERIAL_BAUD); @@ -202,7 +188,7 @@ void loop(){ if ((int)(millis()/BLINKPERIOD) > lastPeriod) { lastPeriod++; - digitalWrite(LED, lastPeriod%2); + digitalWrite(LED_BUILTIN, lastPeriod%2); Serial.print("BLINKPERIOD ");Serial.println(BLINKPERIOD); } //***************************************************************************************************************************** diff --git a/RFM69_OTA.cpp b/RFM69_OTA.cpp index 975b1f2..c679b8b 100644 --- a/RFM69_OTA.cpp +++ b/RFM69_OTA.cpp @@ -49,7 +49,7 @@ void CheckForWirelessHEX(RFM69& radio, SPIFlash& flash, uint8_t DEBUG, uint8_t L //special FLASH command, enter a FLASH image exchange sequence if (radio.DATALEN >= 4 && radio.DATA[0]=='F' && radio.DATA[1]=='L' && radio.DATA[2]=='X' && radio.DATA[3]=='?') { - uint8_t remoteID = radio.SENDERID; + uint16_t remoteID = radio.SENDERID; if (radio.DATALEN == 7 && radio.DATA[4]=='E' && radio.DATA[5]=='O' && radio.DATA[6]=='F') { //sender must have not received EOF ACK so just resend radio.send(remoteID, "FLX?OK",6); @@ -95,7 +95,7 @@ void HandleHandshakeACK(RFM69& radio, SPIFlash& flash, uint8_t flashCheck) { // that also shifts channel when SHIFTCHANNEL is defined //=================================================================================================================== #ifdef SHIFTCHANNEL -uint8_t HandleWirelessHEXDataWrapper(RFM69& radio, uint8_t remoteID, SPIFlash& flash, uint8_t DEBUG, uint8_t LEDpin) { +uint8_t HandleWirelessHEXDataWrapper(RFM69& radio, uint16_t remoteID, SPIFlash& flash, uint8_t DEBUG, uint8_t LEDpin) { HandleHandshakeACK(radio, flash); if (DEBUG) { Serial.println(F("FLX?OK (ACK sent)")); Serial.print(F("Shifting channel to ")); Serial.println(radio.getFrequency() + SHIFTCHANNEL);} radio.setFrequency(radio.getFrequency() + SHIFTCHANNEL); //shift center freq by SHIFTCHANNEL amount @@ -111,7 +111,7 @@ uint8_t HandleWirelessHEXDataWrapper(RFM69& radio, uint8_t remoteID, SPIFlash& f // HandleWirelessHEXData() - ACKs the wireless programming handshake and handles // the complete transmission of the HEX image at the OTA programmed node side //=================================================================================================================== -uint8_t HandleWirelessHEXData(RFM69& radio, uint8_t remoteID, SPIFlash& flash, uint8_t DEBUG, uint8_t LEDpin) { +uint8_t HandleWirelessHEXData(RFM69& radio, uint16_t remoteID, SPIFlash& flash, uint8_t DEBUG, uint8_t LEDpin) { uint32_t now=0; uint16_t tmp,seq=0; char buffer[16]; @@ -207,9 +207,9 @@ uint8_t HandleWirelessHEXData(RFM69& radio, uint8_t remoteID, SPIFlash& flash, u { #if defined (MOTEINO_M0) - if ((bytesFlashed-10)>253952) { //max 65536 - 10 bytes (signature) - if (DEBUG) Serial.println(F("IMG > 64k, too big")); - radio.sendACK("FLX?NOK:HEX>64k",15); + if ((bytesFlashed-10)>253952) { //max 253952 - 10 bytes (signature) + if (DEBUG) Serial.println(F("IMG > 253952, too big")); + radio.sendACK("FLX?NOK:HEX>248k",16); return false; //just return, let MAIN timeout } #elif defined(__AVR_ATmega1284P__) @@ -275,7 +275,7 @@ uint8_t readSerialLine(char* input, char endOfLineChar, uint8_t maxLength, uint1 // CheckForSerialHEX() - returns TRUE if a HEX file transmission was detected and it was actually transmitted successfully // this is called at the OTA programmer side //=================================================================================================================== -uint8_t CheckForSerialHEX(uint8_t* input, uint8_t inputLen, RFM69& radio, uint8_t targetID, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) +uint8_t CheckForSerialHEX(uint8_t* input, uint8_t inputLen, RFM69& radio, uint16_t targetID, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) { if (inputLen == 4 && input[0]=='F' && input[1]=='L' && input[2]=='X' && input[3]=='?') { if (HandleSerialHandshake(radio, targetID, false, TIMEOUT, ACKTIMEOUT, DEBUG)) @@ -309,7 +309,7 @@ uint8_t CheckForSerialHEX(uint8_t* input, uint8_t inputLen, RFM69& radio, uint8_ //=================================================================================================================== // HandleSerialHandshake() - handles the handshake with the serial port //=================================================================================================================== -uint8_t HandleSerialHandshake(RFM69& radio, uint8_t targetID, uint8_t isEOF, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) +uint8_t HandleSerialHandshake(RFM69& radio, uint16_t targetID, uint8_t isEOF, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) { long now = millis(); @@ -329,7 +329,7 @@ uint8_t HandleSerialHandshake(RFM69& radio, uint8_t targetID, uint8_t isEOF, uin // HandleSerialHEXDataWrapper() - wrapper for HandleSerialHEXData(), also shifts the channel if SHIFTCHANNEL is defined //=================================================================================================================== #ifdef SHIFTCHANNEL -uint8_t HandleSerialHEXDataWrapper(RFM69& radio, uint8_t targetID, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) { +uint8_t HandleSerialHEXDataWrapper(RFM69& radio, uint16_t targetID, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) { radio.setFrequency(radio.getFrequency() + SHIFTCHANNEL); //shift center freq by SHIFTCHANNEL amount uint8_t result = HandleSerialHEXData(radio, targetID, TIMEOUT, ACKTIMEOUT, DEBUG); radio.setFrequency(radio.getFrequency() - SHIFTCHANNEL); //shift center freq by SHIFTCHANNEL amount @@ -342,10 +342,10 @@ uint8_t HandleSerialHEXDataWrapper(RFM69& radio, uint8_t targetID, uint16_t TIME // HandleSerialHEXData() - handles the transmission of the HEX image from the serial port to the node being OTA programmed // this is called at the OTA programmer side //=================================================================================================================== -uint8_t HandleSerialHEXData(RFM69& radio, uint8_t targetID, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) { +uint8_t HandleSerialHEXData(RFM69& radio, uint16_t targetID, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) { long now=millis(); uint16_t seq=0, tmp=0, inputLen; - uint8_t remoteID = radio.SENDERID; //save the remoteID as soon as possible + uint16_t remoteID = radio.SENDERID; //save the remoteID as soon as possible uint8_t sendBuf[57]; char input[115]; //a FLASH record should not be more than 64 bytes: FLX:9999:10042000FF4FA591B4912FB7F894662321F48C91D6 @@ -483,7 +483,7 @@ uint8_t BYTEfromHEX(char MSB, char LSB) //=================================================================================================================== // sendHEXPacket() - return the SEQ of the ACK received, or -1 if invalid //=================================================================================================================== -uint8_t sendHEXPacket(RFM69& radio, uint8_t targetID, uint8_t* sendBuf, uint8_t hexDataLen, uint16_t seq, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) +uint8_t sendHEXPacket(RFM69& radio, uint16_t targetID, uint8_t* sendBuf, uint8_t hexDataLen, uint16_t seq, uint16_t TIMEOUT, uint16_t ACKTIMEOUT, uint8_t DEBUG) { long now = millis(); diff --git a/RFM69_OTA.h b/RFM69_OTA.h index 4989057..4855d78 100644 --- a/RFM69_OTA.h +++ b/RFM69_OTA.h @@ -61,24 +61,24 @@ void CheckForWirelessHEX(RFM69& radio, SPIFlash& flash, uint8_t DEBUG=false, uint8_t LEDpin=LED); void HandleHandshakeACK(RFM69& radio, SPIFlash& flash, uint8_t flashCheck=true); void resetUsingWatchdog(uint8_t DEBUG=false); -uint8_t HandleWirelessHEXData(RFM69& radio, uint8_t remoteID, SPIFlash& flash, uint8_t DEBUG=false, uint8_t LEDpin=LED); +uint8_t HandleWirelessHEXData(RFM69& radio, uint16_t remoteID, SPIFlash& flash, uint8_t DEBUG=false, uint8_t LEDpin=LED); #ifdef SHIFTCHANNEL -uint8_t HandleWirelessHEXDataWrapper(RFM69& radio, uint8_t remoteID, SPIFlash& flash, uint8_t DEBUG=false, uint8_t LEDpin=LED); +uint8_t HandleWirelessHEXDataWrapper(RFM69& radio, uint16_t remoteID, SPIFlash& flash, uint8_t DEBUG=false, uint8_t LEDpin=LED); #endif //functions used in the MAIN node -uint8_t CheckForSerialHEX(uint8_t* input, uint8_t inputLen, RFM69& radio, uint8_t targetID, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); -uint8_t HandleSerialHandshake(RFM69& radio, uint8_t targetID, uint8_t isEOF, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); -uint8_t HandleSerialHEXData(RFM69& radio, uint8_t targetID, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); +uint8_t CheckForSerialHEX(uint8_t* input, uint8_t inputLen, RFM69& radio, uint16_t targetID, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); +uint8_t HandleSerialHandshake(RFM69& radio, uint16_t targetID, uint8_t isEOF, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); +uint8_t HandleSerialHEXData(RFM69& radio, uint16_t targetID, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); #ifdef SHIFTCHANNEL -uint8_t HandleSerialHEXDataWrapper(RFM69& radio, uint8_t targetID, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); +uint8_t HandleSerialHEXDataWrapper(RFM69& radio, uint16_t targetID, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); #endif -uint8_t waitForAck(RFM69& radio, uint8_t fromNodeID, uint16_t ACKTIMEOUT=ACK_TIMEOUT); +uint8_t waitForAck(RFM69& radio, uint16_t fromNodeID, uint16_t ACKTIMEOUT=ACK_TIMEOUT); uint8_t validateHEXData(void* data, uint8_t length); uint8_t prepareSendBuffer(char* hexdata, uint8_t*buf, uint8_t length, uint16_t seq); -uint8_t sendHEXPacket(RFM69& radio, uint8_t remoteID, uint8_t* sendBuf, uint8_t hexDataLen, uint16_t seq, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); +uint8_t sendHEXPacket(RFM69& radio, uint16_t remoteID, uint8_t* sendBuf, uint8_t hexDataLen, uint16_t seq, uint16_t TIMEOUT=DEFAULT_TIMEOUT, uint16_t ACKTIMEOUT=ACK_TIMEOUT, uint8_t DEBUG=false); uint8_t BYTEfromHEX(char MSB, char LSB); uint8_t readSerialLine(char* input, char endOfLineChar=10, uint8_t maxLength=115, uint16_t timeout=1000); void PrintHex83(uint8_t* data, uint8_t length);