diff --git a/RFM69.cpp b/RFM69.cpp index c7aefbf..81cf4e6 100644 --- a/RFM69.cpp +++ b/RFM69.cpp @@ -268,6 +268,7 @@ void RFM69::sendACK(const void* buffer, uint8_t bufferSize) { writeReg(REG_PACKETCONFIG2, (readReg(REG_PACKETCONFIG2) & 0xFB) | RF_PACKET2_RXRESTART); // avoid RX deadlocks uint32_t now = millis(); while (!canSend() && millis() - now < RF69_CSMA_LIMIT_MS) receiveDone(); + SENDERID = sender; // TWS: Restore SenderID after it gets wiped out by receiveDone() sendFrame(sender, buffer, bufferSize, false, true); RSSI = _RSSI; // restore payload RSSI } @@ -439,9 +440,11 @@ void RFM69::writeReg(uint8_t addr, uint8_t value) // select the RFM69 transceiver (save SPI settings, set CS low) void RFM69::select() { noInterrupts(); +#if defined (SPCR) && defined (SPSR) // save current SPI settings _SPCR = SPCR; _SPSR = SPSR; +#endif // set RFM69 SPI settings SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); @@ -453,8 +456,10 @@ void RFM69::select() { void RFM69::unselect() { digitalWrite(_slaveSelectPin, HIGH); // restore SPI settings to what they were before talking to RFM69 +#if defined (SPCR) && defined (SPSR) SPCR = _SPCR; SPSR = _SPSR; +#endif interrupts(); } diff --git a/RFM69.h b/RFM69.h index 009d815..d90cab4 100644 --- a/RFM69.h +++ b/RFM69.h @@ -138,8 +138,10 @@ class RFM69 { bool _promiscuousMode; uint8_t _powerLevel; bool _isRFM69HW; +#if defined (SPCR) && defined (SPSR) uint8_t _SPCR; uint8_t _SPSR; +#endif virtual void receiveBegin(); virtual void setMode(uint8_t mode); diff --git a/RFM69_ATC.cpp b/RFM69_ATC.cpp index ce556db..79c4bb9 100644 --- a/RFM69_ATC.cpp +++ b/RFM69_ATC.cpp @@ -232,14 +232,14 @@ void RFM69_ATC::receiveBegin() { // enableAutoPower() - call with target RSSI, use 0 to disable (default), any other value with turn on autotransmit control. //============================================================================= // TomWS1: New methods to address autoPower control -void RFM69_ATC::enableAutoPower(int targetRSSI){ // TomWS1: New method to enable/disable auto Power control +void RFM69_ATC::enableAutoPower(int16_t targetRSSI){ // TomWS1: New method to enable/disable auto Power control _targetRSSI = targetRSSI; // no logic here, just set the value (if non-zero, then enabled), caller's responsibility to use a reasonable value } //============================================================================= // getAckRSSI() - returns the RSSI value ack'd by the far end. //============================================================================= -int RFM69_ATC::getAckRSSI(void){ // TomWS1: New method to retrieve the ack'd RSSI (if any) +int16_t RFM69_ATC::getAckRSSI(void){ // TomWS1: New method to retrieve the ack'd RSSI (if any) return (_targetRSSI==0?0:_ackRSSI); } diff --git a/RFM69_ATC.h b/RFM69_ATC.h index d4b677f..a57b45f 100644 --- a/RFM69_ATC.h +++ b/RFM69_ATC.h @@ -47,7 +47,7 @@ class RFM69_ATC: public RFM69 { void sendACK(const void* buffer = "", uint8_t bufferSize=0); //void setHighPower(bool onOFF=true, uint8_t PA_ctl=0x60); //have to call it after initialize for RFM69HW //void setPowerLevel(uint8_t level); // reduce/increase transmit power level - void enableAutoPower(int targetRSSI=-90); // TWS: New method to enable/disable auto Power control + void enableAutoPower(int16_t targetRSSI=-90); // TWS: New method to enable/disable auto Power control void setMode(uint8_t mode); // TWS: moved from protected to try to build block()/unblock() wrapper int16_t getAckRSSI(void); // TWS: New method to retrieve the ack'd RSSI (if any) @@ -58,7 +58,7 @@ class RFM69_ATC: public RFM69 { protected: void interruptHook(uint8_t CTLbyte); void sendFrame(uint8_t toAddress, const void* buffer, uint8_t size, bool requestACK=false, bool sendACK=false); // Need this one to match the RFM69 prototype. - void sendFrame(uint8_t toAddress, const void* buffer, uint8_t size, bool requestACK, bool sendACK, bool sendRSSI, int lastRSSI); + void sendFrame(uint8_t toAddress, const void* buffer, uint8_t size, bool requestACK, bool sendACK, bool sendRSSI, int16_t lastRSSI); void receiveBegin(); //void setHighPowerRegs(bool onOff);