diff --git a/keywords.txt b/keywords.txt index c2ed8627..898ab9cb 100644 --- a/keywords.txt +++ b/keywords.txt @@ -54,7 +54,8 @@ setOutputPower KEYWORD2 listen KEYWORD2 onReceive KEYWORD2 readData KEYWORD2 -directMode KEYWORD2 +transmitDirect KEYWORD2 +receiveDirect KEYWORD2 packetMode KEYWORD2 # RF69-specific diff --git a/src/modules/SX127x.cpp b/src/modules/SX127x.cpp index 16d37b29..f17543d6 100644 --- a/src/modules/SX127x.cpp +++ b/src/modules/SX127x.cpp @@ -409,7 +409,7 @@ int16_t SX127x::standby() { return(setMode(SX127X_STANDBY)); } -int16_t SX127x::directMode(uint32_t FRF) { +int16_t SX127x::transmitDirect(uint32_t FRF) { // check modem if(getActiveModem() != SX127X_FSK_OOK) { return(ERR_WRONG_MODEM); @@ -424,6 +424,33 @@ int16_t SX127x::directMode(uint32_t FRF) { return(setMode(SX127X_TX)); } + // activate direct mode + int16_t state = directMode(); + if(state != ERR_NONE) { + return(state); + } + + // start transmitting + return(setMode(SX127X_TX)); +} + +int16_t SX127x::receiveDirect() { + // check modem + if(getActiveModem() != SX127X_FSK_OOK) { + return(ERR_WRONG_MODEM); + } + + // activate direct mode + int16_t state = directMode(); + if(state != ERR_NONE) { + return(state); + } + + // start receiving + return(setMode(SX127X_RX)); +} + +int16_t SX127x::directMode() { // set mode to standby int16_t state = setMode(SX127X_STANDBY); if(state != ERR_NONE) { @@ -435,12 +462,7 @@ int16_t SX127x::directMode(uint32_t FRF) { // set continuous mode state |= _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_2, SX127X_DATA_MODE_CONTINUOUS, 6, 6); - if(state != ERR_NONE) { - return(state); - } - - // start transmitting - return(setMode(SX127X_TX)); + return(state); } int16_t SX127x::packetMode() { diff --git a/src/modules/SX127x.h b/src/modules/SX127x.h index f18d41bd..9d9ecfdb 100644 --- a/src/modules/SX127x.h +++ b/src/modules/SX127x.h @@ -538,7 +538,8 @@ class SX127x: public PhysicalLayer { int16_t scanChannel(); int16_t sleep(); int16_t standby(); - int16_t directMode(uint32_t FRF = 0); + int16_t transmitDirect(uint32_t FRF = 0); + int16_t receiveDirect(); int16_t packetMode(); // interrupt methods @@ -583,6 +584,7 @@ class SX127x: public PhysicalLayer { int16_t config(); int16_t configFSK(); int16_t getActiveModem(); + int16_t directMode(); private: bool findChip(uint8_t ver); diff --git a/src/protocols/PhysicalLayer.h b/src/protocols/PhysicalLayer.h index 975a926d..21327295 100644 --- a/src/protocols/PhysicalLayer.h +++ b/src/protocols/PhysicalLayer.h @@ -9,7 +9,8 @@ class PhysicalLayer { // this class is purely virtual and does not require explicit constructor // basic methods - virtual int16_t directMode(uint32_t FRF = 0) = 0; + virtual int16_t transmitDirect(uint32_t FRF = 0) = 0; + virtual int16_t receiveDirect() = 0; virtual int16_t transmit(const char* data, uint8_t addr = 0) = 0; virtual int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) = 0; virtual int16_t receive(uint8_t* data, size_t len) = 0; diff --git a/src/protocols/RTTY.cpp b/src/protocols/RTTY.cpp index 9f31c234..afa67120 100644 --- a/src/protocols/RTTY.cpp +++ b/src/protocols/RTTY.cpp @@ -29,7 +29,7 @@ int16_t RTTYClient::begin(float base, uint16_t shift, uint16_t rate, uint8_t dat } void RTTYClient::idle() { - _phy->directMode(); + _phy->transmitDirect(); mark(); } @@ -178,13 +178,13 @@ size_t RTTYClient::println(double d, int digits) { void RTTYClient::mark() { uint32_t start = micros(); - _phy->directMode(_base + _shift); + _phy->transmitDirect(_base + _shift); while(micros() - start < _bitDuration); } void RTTYClient::space() { uint32_t start = micros(); - _phy->directMode(_base); + _phy->transmitDirect(_base); while(micros() - start < _bitDuration); }