fix OTA 10bit addresses, update examples
This commit is contained in:
parent
05dad2c873
commit
71f6e356fa
|
|
@ -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 <RFM69.h> //get it here: https://github.com/lowpowerlab/RFM69
|
||||
#include <RFM69_ATC.h> //get it here: https://github.com/lowpowerlab/RFM69
|
||||
#include <RFM69_OTA.h> //get it here: https://github.com/lowpowerlab/RFM69
|
||||
#include <SPI.h> //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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 <RFM69_ATC.h> //get it here: https://github.com/lowpowerlab/RFM69
|
||||
#include <RFM69_OTA.h> //get it here: https://github.com/lowpowerlab/RFM69
|
||||
#include <SPIFlash.h> //get it here: https://github.com/lowpowerlab/spiflash
|
||||
#include <SPI.h> //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);
|
||||
}
|
||||
//*****************************************************************************************************************************
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
16
RFM69_OTA.h
16
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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue