Updated debug macros

This commit is contained in:
jgromes 2019-09-28 10:30:50 +02:00
parent c4d9fe3a37
commit c093d34c91
13 changed files with 207 additions and 196 deletions

View file

@ -120,20 +120,20 @@ bool Module::ATgetResponse() {
while (millis() - start < _ATtimeout) { while (millis() - start < _ATtimeout) {
while(ModuleSerial->available() > 0) { while(ModuleSerial->available() > 0) {
char c = ModuleSerial->read(); char c = ModuleSerial->read();
DEBUG_PRINT(c); RADIOLIB_VERBOSE_PRINT(c);
data += c; data += c;
} }
if(data.indexOf("OK") != -1) { if(data.indexOf("OK") != -1) {
DEBUG_PRINTLN(); RADIOLIB_VERBOSE_PRINTLN();
return(true); return(true);
} else if (data.indexOf("ERROR") != -1) { } else if (data.indexOf("ERROR") != -1) {
DEBUG_PRINTLN(); RADIOLIB_VERBOSE_PRINTLN();
return(false); return(false);
} }
} }
DEBUG_PRINTLN(); RADIOLIB_VERBOSE_PRINTLN();
return(false); return(false);
} }
@ -170,24 +170,24 @@ int16_t Module::SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb, uint8_t
} }
// check failed, print debug info // check failed, print debug info
DEBUG_PRINTLN(); RADIOLIB_DEBUG_PRINTLN();
DEBUG_PRINT(F("address:\t0x")); RADIOLIB_DEBUG_PRINT(F("address:\t0x"));
DEBUG_PRINTLN(reg, HEX); RADIOLIB_DEBUG_PRINTLN(reg, HEX);
DEBUG_PRINT(F("bits:\t\t")); RADIOLIB_DEBUG_PRINT(F("bits:\t\t"));
DEBUG_PRINT(msb); RADIOLIB_DEBUG_PRINT(msb);
DEBUG_PRINT(' '); RADIOLIB_DEBUG_PRINT(' ');
DEBUG_PRINTLN(lsb); RADIOLIB_DEBUG_PRINTLN(lsb);
DEBUG_PRINT(F("value:\t\t0b")); RADIOLIB_DEBUG_PRINT(F("value:\t\t0b"));
DEBUG_PRINTLN(value, BIN); RADIOLIB_DEBUG_PRINTLN(value, BIN);
DEBUG_PRINT(F("current:\t0b")); RADIOLIB_DEBUG_PRINT(F("current:\t0b"));
DEBUG_PRINTLN(currentValue, BIN); RADIOLIB_DEBUG_PRINTLN(currentValue, BIN);
DEBUG_PRINT(F("mask:\t\t0b")); RADIOLIB_DEBUG_PRINT(F("mask:\t\t0b"));
DEBUG_PRINTLN(mask, BIN); RADIOLIB_DEBUG_PRINTLN(mask, BIN);
DEBUG_PRINT(F("new:\t\t0b")); RADIOLIB_DEBUG_PRINT(F("new:\t\t0b"));
DEBUG_PRINTLN(newValue, BIN); RADIOLIB_DEBUG_PRINTLN(newValue, BIN);
DEBUG_PRINT(F("read:\t\t0b")); RADIOLIB_DEBUG_PRINT(F("read:\t\t0b"));
DEBUG_PRINTLN(readValue, BIN); RADIOLIB_DEBUG_PRINTLN(readValue, BIN);
DEBUG_PRINTLN(); RADIOLIB_DEBUG_PRINTLN();
return(ERR_SPI_WRITE_FAILED); return(ERR_SPI_WRITE_FAILED);
} }
@ -219,30 +219,30 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da
// send SPI register address with access command // send SPI register address with access command
_spi->transfer(reg | cmd); _spi->transfer(reg | cmd);
DEBUG_PRINT(reg | cmd, HEX); RADIOLIB_VERBOSE_PRINT(reg | cmd, HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
DEBUG_PRINT(reg | cmd, BIN); RADIOLIB_VERBOSE_PRINT(reg | cmd, BIN);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
// send data or get response // send data or get response
if(cmd == SPIwriteCommand) { if(cmd == SPIwriteCommand) {
for(size_t n = 0; n < numBytes; n++) { for(size_t n = 0; n < numBytes; n++) {
_spi->transfer(dataOut[n]); _spi->transfer(dataOut[n]);
DEBUG_PRINT(dataOut[n], HEX); RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
DEBUG_PRINT(dataOut[n], BIN); RADIOLIB_VERBOSE_PRINT(dataOut[n], BIN);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
} }
} else if (cmd == SPIreadCommand) { } else if (cmd == SPIreadCommand) {
for(size_t n = 0; n < numBytes; n++) { for(size_t n = 0; n < numBytes; n++) {
dataIn[n] = _spi->transfer(0x00); dataIn[n] = _spi->transfer(0x00);
DEBUG_PRINT(dataIn[n], HEX); RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
DEBUG_PRINT(dataIn[n], BIN); RADIOLIB_VERBOSE_PRINT(dataIn[n], BIN);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
} }
} }
DEBUG_PRINTLN(); RADIOLIB_VERBOSE_PRINTLN();
// release CS // release CS
digitalWrite(_cs, HIGH); digitalWrite(_cs, HIGH);

View file

@ -7,14 +7,25 @@
#error "Unsupported Arduino version (< 1.0.0)" #error "Unsupported Arduino version (< 1.0.0)"
#endif #endif
#define RADIOLIB_DEBUG_PORT Serial
//#define RADIOLIB_DEBUG //#define RADIOLIB_DEBUG
//#define RADIOLIB_VERBOSE
#ifdef RADIOLIB_DEBUG #ifdef RADIOLIB_DEBUG
#define DEBUG_PRINT(...) { Serial.print(__VA_ARGS__); } #define RADIOLIB_DEBUG_PRINT(...) { RADIOLIB_DEBUG_PORT.print(__VA_ARGS__); }
#define DEBUG_PRINTLN(...) { Serial.println(__VA_ARGS__); } #define RADIOLIB_DEBUG_PRINTLN(...) { RADIOLIB_DEBUG_PORT.println(__VA_ARGS__); }
#else #else
#define DEBUG_PRINT(...) {} #define RADIOLIB_DEBUG_PRINT(...) {}
#define DEBUG_PRINTLN(...) {} #define RADIOLIB_DEBUG_PRINTLN(...) {}
#endif
#ifdef RADIOLIB_VERBOSE
#define RADIOLIB_VERBOSE_PRINT(...) { RADIOLIB_DEBUG_PORT.print(__VA_ARGS__); }
#define RADIOLIB_VERBOSE_PRINTLN(...) { RADIOLIB_DEBUG_PORT.println(__VA_ARGS__); }
#else
#define RADIOLIB_VERBOSE_PRINT(...) {}
#define RADIOLIB_VERBOSE_PRINTLN(...) {}
#endif #endif
/*! /*!

View file

@ -36,11 +36,11 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po
} }
if(!flagFound) { if(!flagFound) {
DEBUG_PRINTLN(F("No CC1101 found!")); RADIOLIB_DEBUG_PRINTLN(F("No CC1101 found!"));
SPI.end(); SPI.end();
return(ERR_CHIP_NOT_FOUND); return(ERR_CHIP_NOT_FOUND);
} else { } else {
DEBUG_PRINTLN(F("Found CC1101! (match by CC1101_REG_VERSION == 0x14)")); RADIOLIB_DEBUG_PRINTLN(F("Found CC1101! (match by CC1101_REG_VERSION == 0x14)"));
} }
// configure settings not accessible by API // configure settings not accessible by API

View file

@ -173,7 +173,7 @@ size_t ESP8266::receive(uint8_t* data, size_t len, uint32_t timeout) {
while((millis() - start < timeout) && (i < len)) { while((millis() - start < timeout) && (i < len)) {
while(_mod->ModuleSerial->available() > 0) { while(_mod->ModuleSerial->available() > 0) {
uint8_t b = _mod->ModuleSerial->read(); uint8_t b = _mod->ModuleSerial->read();
DEBUG_PRINT(b); RADIOLIB_DEBUG_PRINT(b);
data[i] = b; data[i] = b;
i++; i++;
} }

View file

@ -35,11 +35,11 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe
} }
if(!flagFound) { if(!flagFound) {
DEBUG_PRINTLN(F("No RF69 found!")); RADIOLIB_DEBUG_PRINTLN(F("No RF69 found!"));
SPI.end(); SPI.end();
return(ERR_CHIP_NOT_FOUND); return(ERR_CHIP_NOT_FOUND);
} else { } else {
DEBUG_PRINTLN(F("Found RF69! (match by RF69_REG_VERSION == 0x24)")); RADIOLIB_DEBUG_PRINTLN(F("Found RF69! (match by RF69_REG_VERSION == 0x24)"));
} }
// configure settings not accessible by API // configure settings not accessible by API

View file

@ -7,7 +7,7 @@ SX1231::SX1231(Module* mod) : RF69(mod) {
int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t power) {
// set module properties // set module properties
_mod->init(USE_SPI, INT_BOTH); _mod->init(USE_SPI, INT_BOTH);
// try to find the SX1231 chip // try to find the SX1231 chip
uint8_t i = 0; uint8_t i = 0;
bool flagFound = false; bool flagFound = false;
@ -21,7 +21,7 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
Serial.print(F("SX127x not found! (")); Serial.print(F("SX127x not found! ("));
Serial.print(i + 1); Serial.print(i + 1);
Serial.print(F(" of 10 tries) SX127X_REG_VERSION == ")); Serial.print(F(" of 10 tries) SX127X_REG_VERSION == "));
char buffHex[7]; char buffHex[7];
sprintf(buffHex, "0x%04X", version); sprintf(buffHex, "0x%04X", version);
Serial.print(buffHex); Serial.print(buffHex);
@ -32,55 +32,55 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
i++; i++;
} }
} }
if(!flagFound) { if(!flagFound) {
DEBUG_PRINTLN(F("No SX1231 found!")); RADIOLIB_DEBUG_PRINTLN(F("No SX1231 found!"));
SPI.end(); SPI.end();
return(ERR_CHIP_NOT_FOUND); return(ERR_CHIP_NOT_FOUND);
} else { } else {
DEBUG_PRINTLN(F("Found SX1231!")); RADIOLIB_DEBUG_PRINTLN(F("Found SX1231!"));
} }
// configure settings not accessible by API // configure settings not accessible by API
int16_t state = config(); int16_t state = config();
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure publicly accessible settings // configure publicly accessible settings
state = setFrequency(freq); state = setFrequency(freq);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
_rxBw = 125.0; _rxBw = 125.0;
state = setBitRate(br); state = setBitRate(br);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
state = setRxBandwidth(rxBw); state = setRxBandwidth(rxBw);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
state = setFrequencyDeviation(freqDev); state = setFrequencyDeviation(freqDev);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
state = setOutputPower(power); state = setOutputPower(power);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library
uint8_t syncWord[] = {0x2D, 0x01}; uint8_t syncWord[] = {0x2D, 0x01};
state = setSyncWord(syncWord, 2); state = setSyncWord(syncWord, 2);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// SX1231 V2a only // SX1231 V2a only
if(_chipRevision == SX1231_CHIP_REVISION_2_A) { if(_chipRevision == SX1231_CHIP_REVISION_2_A) {
// modify default OOK threshold value // modify default OOK threshold value
@ -88,13 +88,13 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// enable OCP with 95 mA limit // enable OCP with 95 mA limit
state = _mod->SPIsetRegValue(RF69_REG_OCP, RF69_OCP_ON | RF69_OCP_TRIM, 4, 0); state = _mod->SPIsetRegValue(RF69_REG_OCP, RF69_OCP_ON | RF69_OCP_TRIM, 4, 0);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
} }
return(ERR_NONE); return(ERR_NONE);
} }

View file

@ -172,9 +172,9 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) {
return(ERR_UNKNOWN); return(ERR_UNKNOWN);
} }
DEBUG_PRINT(F("Timeout in ")); RADIOLIB_DEBUG_PRINT(F("Timeout in "));
DEBUG_PRINT(timeout); RADIOLIB_DEBUG_PRINT(timeout);
DEBUG_PRINTLN(F(" us")); RADIOLIB_DEBUG_PRINTLN(F(" us"));
// start transmission // start transmission
state = startTransmit(data, len, addr); state = startTransmit(data, len, addr);
@ -236,9 +236,9 @@ int16_t SX126x::receive(uint8_t* data, size_t len) {
return(ERR_UNKNOWN); return(ERR_UNKNOWN);
} }
DEBUG_PRINT(F("Timeout in ")); RADIOLIB_DEBUG_PRINT(F("Timeout in "));
DEBUG_PRINT(timeout); RADIOLIB_DEBUG_PRINT(timeout);
DEBUG_PRINTLN(F(" us")); RADIOLIB_DEBUG_PRINTLN(F(" us"));
// start reception // start reception
uint32_t timeoutValue = (uint32_t)((float)timeout / 15.625); uint32_t timeoutValue = (uint32_t)((float)timeout / 15.625);
@ -1107,9 +1107,9 @@ int16_t SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t
// calculate symbol length and enable low data rate optimization, if needed // calculate symbol length and enable low data rate optimization, if needed
if(ldro == 0xFF) { if(ldro == 0xFF) {
float symbolLength = (float)(uint32_t(1) << _sf) / (float)_bwKhz; float symbolLength = (float)(uint32_t(1) << _sf) / (float)_bwKhz;
DEBUG_PRINT("Symbol length: "); RADIOLIB_DEBUG_PRINT("Symbol length: ");
DEBUG_PRINT(symbolLength); RADIOLIB_DEBUG_PRINT(symbolLength);
DEBUG_PRINTLN(" ms"); RADIOLIB_DEBUG_PRINTLN(" ms");
if(symbolLength >= 16.0) { if(symbolLength >= 16.0) {
_ldro = SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON; _ldro = SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON;
} else { } else {
@ -1277,8 +1277,8 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d
// send command byte(s) // send command byte(s)
for(uint8_t n = 0; n < cmdLen; n++) { for(uint8_t n = 0; n < cmdLen; n++) {
spi->transfer(cmd[n]); spi->transfer(cmd[n]);
DEBUG_PRINT(cmd[n], HEX); RADIOLIB_VERBOSE_PRINT(cmd[n], HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
} }
// variable to save error during SPI transfer // variable to save error during SPI transfer
@ -1289,10 +1289,10 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d
for(uint8_t n = 0; n < numBytes; n++) { for(uint8_t n = 0; n < numBytes; n++) {
// send byte // send byte
uint8_t in = spi->transfer(dataOut[n]); uint8_t in = spi->transfer(dataOut[n]);
DEBUG_PRINT(dataOut[n], HEX); RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
DEBUG_PRINT(in, HEX); RADIOLIB_VERBOSE_PRINT(in, HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
// check status // check status
if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) ||
@ -1302,14 +1302,14 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d
status = in; status = in;
} }
} }
DEBUG_PRINTLN(); RADIOLIB_VERBOSE_PRINT();
} else { } else {
// skip the first byte for read-type commands (status-only) // skip the first byte for read-type commands (status-only)
uint8_t in = spi->transfer(SX126X_CMD_NOP); uint8_t in = spi->transfer(SX126X_CMD_NOP);
DEBUG_PRINT(SX126X_CMD_NOP, HEX); RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
DEBUG_PRINT(in, HEX); RADIOLIB_VERBOSE_PRINT(in, HEX);
DEBUG_PRINT('\t') RADIOLIB_VERBOSE_PRINT('\t')
// check status // check status
if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) ||
@ -1320,12 +1320,12 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d
} }
for(uint8_t n = 0; n < numBytes; n++) { for(uint8_t n = 0; n < numBytes; n++) {
dataIn[n] = spi->transfer(SX126X_CMD_NOP); dataIn[n] = spi->transfer(SX126X_CMD_NOP);
DEBUG_PRINT(SX126X_CMD_NOP, HEX); RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
DEBUG_PRINT(dataIn[n], HEX); RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX);
DEBUG_PRINT('\t'); RADIOLIB_VERBOSE_PRINT('\t');
} }
DEBUG_PRINTLN(); RADIOLIB_VERBOSE_PRINT();
} }
// stop transfer // stop transfer

View file

@ -125,9 +125,9 @@ int16_t SX1272::setBandwidth(float bw) {
// calculate symbol length and set low data rate optimization, if needed // calculate symbol length and set low data rate optimization, if needed
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw; float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
DEBUG_PRINT("Symbol length: "); RADIOLIB_DEBUG_PRINT("Symbol length: ");
DEBUG_PRINT(symbolLength); RADIOLIB_DEBUG_PRINT(symbolLength);
DEBUG_PRINTLN(" ms"); RADIOLIB_DEBUG_PRINTLN(" ms");
if(symbolLength >= 16.0) { if(symbolLength >= 16.0) {
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0); state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0);
} else { } else {
@ -179,9 +179,9 @@ int16_t SX1272::setSpreadingFactor(uint8_t sf) {
// calculate symbol length and set low data rate optimization, if needed // calculate symbol length and set low data rate optimization, if needed
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw; float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
DEBUG_PRINT("Symbol length: "); RADIOLIB_DEBUG_PRINT("Symbol length: ");
DEBUG_PRINT(symbolLength); RADIOLIB_DEBUG_PRINT(symbolLength);
DEBUG_PRINTLN(" ms"); RADIOLIB_DEBUG_PRINTLN(" ms");
if(symbolLength >= 16.0) { if(symbolLength >= 16.0) {
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0); state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0);
} else { } else {

View file

@ -195,9 +195,9 @@ int16_t SX1278::setBandwidth(float bw) {
// calculate symbol length and set low data rate optimization, if needed // calculate symbol length and set low data rate optimization, if needed
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw; float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
DEBUG_PRINT("Symbol length: "); RADIOLIB_DEBUG_PRINT("Symbol length: ");
DEBUG_PRINT(symbolLength); RADIOLIB_DEBUG_PRINT(symbolLength);
DEBUG_PRINTLN(" ms"); RADIOLIB_DEBUG_PRINTLN(" ms");
if(symbolLength >= 16.0) { if(symbolLength >= 16.0) {
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3); state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3);
} else { } else {
@ -249,9 +249,9 @@ int16_t SX1278::setSpreadingFactor(uint8_t sf) {
// calculate symbol length and set low data rate optimization, if needed // calculate symbol length and set low data rate optimization, if needed
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw; float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
DEBUG_PRINT("Symbol length: "); RADIOLIB_DEBUG_PRINT("Symbol length: ");
DEBUG_PRINT(symbolLength); RADIOLIB_DEBUG_PRINT(symbolLength);
DEBUG_PRINTLN(" ms"); RADIOLIB_DEBUG_PRINTLN(" ms");
if(symbolLength >= 16.0) { if(symbolLength >= 16.0) {
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3); state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3);
} else { } else {

View file

@ -11,11 +11,11 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi
// try to find the SX127x chip // try to find the SX127x chip
if(!SX127x::findChip(chipVersion)) { if(!SX127x::findChip(chipVersion)) {
DEBUG_PRINTLN(F("No SX127x found!")); RADIOLIB_DEBUG_PRINTLN(F("No SX127x found!"));
_mod->term(); _mod->term();
return(ERR_CHIP_NOT_FOUND); return(ERR_CHIP_NOT_FOUND);
} else { } else {
DEBUG_PRINTLN(F("Found SX127x!")); RADIOLIB_DEBUG_PRINTLN(F("Found SX127x!"));
} }
// check active modem // check active modem
@ -55,11 +55,11 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB
// try to find the SX127x chip // try to find the SX127x chip
if(!SX127x::findChip(chipVersion)) { if(!SX127x::findChip(chipVersion)) {
DEBUG_PRINTLN(F("No SX127x found!")); RADIOLIB_DEBUG_PRINTLN(F("No SX127x found!"));
_mod->term(); _mod->term();
return(ERR_CHIP_NOT_FOUND); return(ERR_CHIP_NOT_FOUND);
} else { } else {
DEBUG_PRINTLN(F("Found SX127x!")); RADIOLIB_DEBUG_PRINTLN(F("Found SX127x!"));
} }
// check currently active modem // check currently active modem

View file

@ -12,13 +12,13 @@ int16_t XBee::begin(long speed) {
// set module properties // set module properties
_mod->baudrate = speed; _mod->baudrate = speed;
_mod->init(USE_UART, INT_1); _mod->init(USE_UART, INT_1);
// reset module // reset module
reset(); reset();
// empty UART buffer (garbage data) // empty UART buffer (garbage data)
_mod->ATemptyBuffer(); _mod->ATemptyBuffer();
// try to find the XBee // try to find the XBee
bool flagFound = false; bool flagFound = false;
uint8_t i = 0; uint8_t i = 0;
@ -26,29 +26,29 @@ int16_t XBee::begin(long speed) {
// hardware reset should return 2 modem status frames - 1st status 0x00, second status 0x06 // hardware reset should return 2 modem status frames - 1st status 0x00, second status 0x06
int16_t state = readApiFrame(0x00, 1, 2000); int16_t state = readApiFrame(0x00, 1, 2000);
readApiFrame(0x00, 1, 2000); readApiFrame(0x00, 1, 2000);
if(state == ERR_NONE) { if(state == ERR_NONE) {
flagFound = true; flagFound = true;
} else { } else {
DEBUG_PRINT(F("XBee not found! (")); RADIOLIB_DEBUG_PRINT(F("XBee not found! ("));
DEBUG_PRINT(i + 1); RADIOLIB_DEBUG_PRINT(i + 1);
DEBUG_PRINT(F(" of 10 tries) STATE == ")); RADIOLIB_DEBUG_PRINT(F(" of 10 tries) STATE == "));
DEBUG_PRINTLN(state); RADIOLIB_DEBUG_PRINTLN(state);
DEBUG_PRINTLN(F("Resetting ...")); RADIOLIB_DEBUG_PRINTLN(F("Resetting ..."));
reset(); reset();
delay(1000); delay(1000);
_mod->ATemptyBuffer(); _mod->ATemptyBuffer();
i++; i++;
} }
} }
if(!flagFound) { if(!flagFound) {
DEBUG_PRINTLN(F("No XBee found!")); RADIOLIB_DEBUG_PRINTLN(F("No XBee found!"));
return(ERR_CMD_MODE_FAILED); return(ERR_CMD_MODE_FAILED);
} else { } else {
DEBUG_PRINTLN(F("Found XBee!")); RADIOLIB_DEBUG_PRINTLN(F("Found XBee!"));
} }
return(ERR_NONE); return(ERR_NONE);
} }
@ -75,12 +75,12 @@ int16_t XBee::transmit(uint8_t* dest, uint8_t* destNetwork, const char* payload,
cmd[10] = radius; cmd[10] = radius;
cmd[11] = 0x01; // options: no retries cmd[11] = 0x01; // options: no retries
memcpy(cmd + 12, payload, payloadLen); memcpy(cmd + 12, payload, payloadLen);
// send frame // send frame
uint8_t frameID = _frameID++; uint8_t frameID = _frameID++;
sendApiFrame(XBEE_API_FRAME_ZIGBEE_TRANSMIT_REQUEST, frameID, cmd, dataLen); sendApiFrame(XBEE_API_FRAME_ZIGBEE_TRANSMIT_REQUEST, frameID, cmd, dataLen);
delete[] cmd; delete[] cmd;
// get response code // get response code
return(readApiFrame(frameID, 5)); return(readApiFrame(frameID, 5));
} }
@ -90,35 +90,35 @@ size_t XBee::available() {
size_t serialBytes = _mod->ModuleSerial->available(); size_t serialBytes = _mod->ModuleSerial->available();
if(serialBytes < 3) { if(serialBytes < 3) {
return(0); return(0);
} }
uint8_t header[3]; uint8_t header[3];
if(!_frameHeaderProcessed) { if(!_frameHeaderProcessed) {
// read frame header // read frame header
for(uint8_t i = 0; i < 3; i++) { for(uint8_t i = 0; i < 3; i++) {
header[i] = _mod->ModuleSerial->read(); header[i] = _mod->ModuleSerial->read();
} }
// check if we received API frame // check if we received API frame
if(header[0] != XBEE_API_START) { if(header[0] != XBEE_API_START) {
return(0); return(0);
} }
// get expected frame length // get expected frame length
_frameLength = ((header[1] << 8) | header[2]) + 1; _frameLength = ((header[1] << 8) | header[2]) + 1;
_frameHeaderProcessed = true; _frameHeaderProcessed = true;
} }
// check if the header is complete // check if the header is complete
if(serialBytes < _frameLength) { if(serialBytes < _frameLength) {
return(0); return(0);
} }
uint8_t* frame = new uint8_t[_frameLength]; //24 uint8_t* frame = new uint8_t[_frameLength]; //24
for(size_t i = 0; i < _frameLength; i++) { for(size_t i = 0; i < _frameLength; i++) {
frame[i] = _mod->ModuleSerial->read(); frame[i] = _mod->ModuleSerial->read();
} }
// save packet source and data // save packet source and data
size_t payloadLength = _frameLength - 12; size_t payloadLength = _frameLength - 12;
delete[] _packetData; delete[] _packetData;
@ -126,11 +126,11 @@ size_t XBee::available() {
memcpy(_packetData, frame + 12, payloadLength - 1); memcpy(_packetData, frame + 12, payloadLength - 1);
_packetData[payloadLength - 1] = '\0'; _packetData[payloadLength - 1] = '\0';
memcpy(_packetSource, frame + 1, 8); memcpy(_packetSource, frame + 1, 8);
delete[] frame; delete[] frame;
_frameLength = 0; _frameLength = 0;
_frameHeaderProcessed = false; _frameHeaderProcessed = false;
// return number of bytes in payload // return number of bytes in payload
return(payloadLength); return(payloadLength);
} }
@ -153,23 +153,23 @@ int16_t XBee::setPanId(uint8_t* panId) {
uint8_t cmd[10]; uint8_t cmd[10];
memcpy(cmd, "ID", 2); memcpy(cmd, "ID", 2);
memcpy(cmd + 2, panId, 8); memcpy(cmd + 2, panId, 8);
// send frame // send frame
uint8_t frameID = _frameID++; uint8_t frameID = _frameID++;
sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, cmd, 10); sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, cmd, 10);
// get response code // get response code
int16_t state = readApiFrame(frameID, 4); int16_t state = readApiFrame(frameID, 4);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// confirm changes // confirm changes
return(confirmChanges()); return(confirmChanges());
} }
XBeeSerial::XBeeSerial(Module* mod) : ISerial(mod) { XBeeSerial::XBeeSerial(Module* mod) : ISerial(mod) {
} }
int16_t XBeeSerial::begin(long speed) { int16_t XBeeSerial::begin(long speed) {
@ -177,24 +177,24 @@ int16_t XBeeSerial::begin(long speed) {
_mod->AtLineFeed = "\r"; _mod->AtLineFeed = "\r";
_mod->baudrate = speed; _mod->baudrate = speed;
_mod->init(USE_UART, INT_NONE); _mod->init(USE_UART, INT_NONE);
// empty UART buffer (garbage data) // empty UART buffer (garbage data)
_mod->ATemptyBuffer(); _mod->ATemptyBuffer();
// enter command mode // enter command mode
DEBUG_PRINTLN(F("Entering command mode ...")); RADIOLIB_DEBUG_PRINTLN(F("Entering command mode ..."));
if(!enterCmdMode()) { if(!enterCmdMode()) {
return(ERR_CMD_MODE_FAILED); return(ERR_CMD_MODE_FAILED);
} }
// test AT setup // test AT setup
DEBUG_PRINTLN(F("Sending test command ...")); RADIOLIB_DEBUG_PRINTLN(F("Sending test command ..."));
if(!_mod->ATsendCommand("AT")) { if(!_mod->ATsendCommand("AT")) {
return(ERR_AT_FAILED); return(ERR_AT_FAILED);
} }
// exit command mode // exit command mode
DEBUG_PRINTLN(F("Exiting command mode ...")); RADIOLIB_DEBUG_PRINTLN(F("Exiting command mode ..."));
if(!_mod->ATsendCommand("ATCN")) { if(!_mod->ATsendCommand("ATCN")) {
return(ERR_AT_FAILED); return(ERR_AT_FAILED);
} }
@ -212,13 +212,13 @@ void XBeeSerial::reset() {
int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, const char* destinationAddressLow) { int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, const char* destinationAddressLow) {
// enter command mode // enter command mode
DEBUG_PRINTLN(F("Entering command mode ...")); RADIOLIB_DEBUG_PRINTLN(F("Entering command mode ..."));
if(!enterCmdMode()) { if(!enterCmdMode()) {
return(ERR_CMD_MODE_FAILED); return(ERR_CMD_MODE_FAILED);
} }
// set higher address bytes // set higher address bytes
DEBUG_PRINTLN(F("Setting address (high) ...")); RADIOLIB_DEBUG_PRINTLN(F("Setting address (high) ..."));
char* addressHigh = new char[strlen(destinationAddressHigh) + 4]; char* addressHigh = new char[strlen(destinationAddressHigh) + 4];
strcpy(addressHigh, "ATDH"); strcpy(addressHigh, "ATDH");
strcat(addressHigh, destinationAddressHigh); strcat(addressHigh, destinationAddressHigh);
@ -227,9 +227,9 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co
if(!res) { if(!res) {
return(ERR_AT_FAILED); return(ERR_AT_FAILED);
} }
// set lower address bytes // set lower address bytes
DEBUG_PRINTLN(F("Setting address (low) ...")); RADIOLIB_DEBUG_PRINTLN(F("Setting address (low) ..."));
char* addressLow = new char[strlen(destinationAddressLow) + 4]; char* addressLow = new char[strlen(destinationAddressLow) + 4];
strcpy(addressLow, "ATDL"); strcpy(addressLow, "ATDL");
strcat(addressLow, destinationAddressLow); strcat(addressLow, destinationAddressLow);
@ -238,25 +238,25 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co
if(!res) { if(!res) {
return(ERR_AT_FAILED); return(ERR_AT_FAILED);
} }
// exit command mode // exit command mode
DEBUG_PRINTLN(F("Exiting command mode ...")); RADIOLIB_DEBUG_PRINTLN(F("Exiting command mode ..."));
if(!_mod->ATsendCommand("ATCN")) { if(!_mod->ATsendCommand("ATCN")) {
return(ERR_AT_FAILED); return(ERR_AT_FAILED);
} }
return(ERR_NONE); return(ERR_NONE);
} }
int16_t XBeeSerial::setPanId(const char* panId) { int16_t XBeeSerial::setPanId(const char* panId) {
// enter command mode // enter command mode
DEBUG_PRINTLN(F("Entering command mode ...")); RADIOLIB_DEBUG_PRINTLN(F("Entering command mode ..."));
if(!enterCmdMode()) { if(!enterCmdMode()) {
return(ERR_CMD_MODE_FAILED); return(ERR_CMD_MODE_FAILED);
} }
// set PAN ID // set PAN ID
DEBUG_PRINTLN(F("Setting PAN ID ...")); RADIOLIB_DEBUG_PRINTLN(F("Setting PAN ID ..."));
char* cmd = new char[strlen(panId) + 4]; char* cmd = new char[strlen(panId) + 4];
strcpy(cmd, "ATID"); strcpy(cmd, "ATID");
strcat(cmd, panId); strcat(cmd, panId);
@ -265,40 +265,40 @@ int16_t XBeeSerial::setPanId(const char* panId) {
if(!res) { if(!res) {
return(ERR_AT_FAILED); return(ERR_AT_FAILED);
} }
// exit command mode // exit command mode
DEBUG_PRINTLN(F("Exiting command mode ...")); RADIOLIB_DEBUG_PRINTLN(F("Exiting command mode ..."));
if(!_mod->ATsendCommand("ATCN")) { if(!_mod->ATsendCommand("ATCN")) {
return(ERR_AT_FAILED); return(ERR_AT_FAILED);
} }
return(ERR_NONE); return(ERR_NONE);
} }
bool XBeeSerial::enterCmdMode() { bool XBeeSerial::enterCmdMode() {
for(uint8_t i = 0; i < 10; i++) { for(uint8_t i = 0; i < 10; i++) {
delay(1000); delay(1000);
_mod->ModuleSerial->write('+'); _mod->ModuleSerial->write('+');
_mod->ModuleSerial->write('+'); _mod->ModuleSerial->write('+');
_mod->ModuleSerial->write('+'); _mod->ModuleSerial->write('+');
delay(1000); delay(1000);
if(_mod->ATgetResponse()) { if(_mod->ATgetResponse()) {
return(true); return(true);
} else { } else {
DEBUG_PRINT(F("Unable to enter command mode! (")); RADIOLIB_DEBUG_PRINT(F("Unable to enter command mode! ("));
DEBUG_PRINT(i + 1); RADIOLIB_DEBUG_PRINT(i + 1);
DEBUG_PRINTLN(F(" of 10 tries)")); RADIOLIB_DEBUG_PRINTLN(F(" of 10 tries)"));
reset(); reset();
_mod->ATsendCommand("ATCN"); _mod->ATsendCommand("ATCN");
} }
} }
DEBUG_PRINTLN(F("Terminated, check your wiring. Is AT FW uploaded?")); RADIOLIB_DEBUG_PRINTLN(F("Terminated, check your wiring. Is AT FW uploaded?"));
return(false); return(false);
} }
@ -306,23 +306,23 @@ int16_t XBee::confirmChanges() {
// save changes to non-volatile memory // save changes to non-volatile memory
uint8_t frameID = _frameID++; uint8_t frameID = _frameID++;
sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "WR"); sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "WR");
// get response code // get response code
int16_t state = readApiFrame(frameID, 4); int16_t state = readApiFrame(frameID, 4);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// apply changes // apply changes
frameID = _frameID++; frameID = _frameID++;
sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "AC"); sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "AC");
// get response code // get response code
state = readApiFrame(frameID, 4); state = readApiFrame(frameID, 4);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
return(state); return(state);
} }
@ -334,42 +334,42 @@ void XBee::sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length
// build the API frame // build the API frame
size_t frameLength = 1 + 2 + length + 1 + 2; size_t frameLength = 1 + 2 + length + 1 + 2;
uint8_t* frame = new uint8_t[frameLength]; uint8_t* frame = new uint8_t[frameLength];
frame[0] = 0x7E; // start delimiter frame[0] = 0x7E; // start delimiter
frame[1] = ((length + 2) & 0xFF00) >> 8; // length MSB frame[1] = ((length + 2) & 0xFF00) >> 8; // length MSB
frame[2] = (length + 2) & 0x00FF; // length LSB frame[2] = (length + 2) & 0x00FF; // length LSB
frame[3] = type; // frame type frame[3] = type; // frame type
frame[4] = id; // frame ID frame[4] = id; // frame ID
memcpy(frame + 5, data, length); // data memcpy(frame + 5, data, length); // data
// calculate the checksum // calculate the checksum
uint8_t checksum = 0; uint8_t checksum = 0;
for(uint16_t i = 3; i < frameLength - 1; i++) { for(uint16_t i = 3; i < frameLength - 1; i++) {
checksum += frame[i]; checksum += frame[i];
} }
frame[5 + length] = 0xFF - checksum; frame[5 + length] = 0xFF - checksum;
// send the frame // send the frame
for(uint16_t i = 0; i < frameLength; i++) { for(uint16_t i = 0; i < frameLength; i++) {
_mod->ModuleSerial->write(frame[i]); _mod->ModuleSerial->write(frame[i]);
} }
// deallocate memory // deallocate memory
delete[] frame; delete[] frame;
} }
int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) { int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) {
// TODO: modemStatus frames may be sent at any time, interfering with frame parsing. Add check to make sure this does not happen. // TODO: modemStatus frames may be sent at any time, interfering with frame parsing. Add check to make sure this does not happen.
// get number of bytes in response (must be enough to read the length field // get number of bytes in response (must be enough to read the length field
uint16_t numBytes = getNumBytes(timeout/2, 3); uint16_t numBytes = getNumBytes(timeout/2, 3);
if(numBytes == 0) { if(numBytes == 0) {
return(ERR_FRAME_NO_RESPONSE); return(ERR_FRAME_NO_RESPONSE);
} }
// checksum byte is not included in length field // checksum byte is not included in length field
numBytes++; numBytes++;
// wait until all response bytes are available (5s timeout) // wait until all response bytes are available (5s timeout)
uint32_t start = millis(); uint32_t start = millis();
while(_mod->ModuleSerial->available() < (int16_t)numBytes) { while(_mod->ModuleSerial->available() < (int16_t)numBytes) {
@ -377,37 +377,37 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) {
return(ERR_FRAME_MALFORMED); return(ERR_FRAME_MALFORMED);
} }
} }
DEBUG_PRINT(F("frame data field length: ")); RADIOLIB_DEBUG_PRINT(F("frame data field length: "));
DEBUG_PRINTLN(numBytes); RADIOLIB_DEBUG_PRINTLN(numBytes);
// read the response // read the response
uint8_t* resp = new uint8_t[numBytes]; uint8_t* resp = new uint8_t[numBytes];
for(uint16_t i = 0; i < numBytes; i++) { for(uint16_t i = 0; i < numBytes; i++) {
resp[i] = _mod->ModuleSerial->read(); resp[i] = _mod->ModuleSerial->read();
} }
// verify checksum // verify checksum
uint8_t checksum = 0; uint8_t checksum = 0;
for(uint16_t i = 0; i < numBytes; i++) { for(uint16_t i = 0; i < numBytes; i++) {
DEBUG_PRINT(resp[i], HEX); RADIOLIB_DEBUG_PRINT(resp[i], HEX);
DEBUG_PRINT('\t'); RADIOLIB_DEBUG_PRINT('\t');
checksum += resp[i]; checksum += resp[i];
} }
DEBUG_PRINTLN(); RADIOLIB_DEBUG_PRINTLN();
if(checksum != 0xFF) { if(checksum != 0xFF) {
DEBUG_PRINTLN(checksum, HEX); RADIOLIB_DEBUG_PRINTLN(checksum, HEX);
return(ERR_FRAME_INCORRECT_CHECKSUM); return(ERR_FRAME_INCORRECT_CHECKSUM);
} }
// check frame ID // check frame ID
if(resp[1] != frameID) { if(resp[1] != frameID) {
DEBUG_PRINT(F("received frame ID: ")); RADIOLIB_DEBUG_PRINT(F("received frame ID: "));
DEBUG_PRINTLN(resp[1]); RADIOLIB_DEBUG_PRINTLN(resp[1]);
DEBUG_PRINT(F("expected frame ID: ")); RADIOLIB_DEBUG_PRINT(F("expected frame ID: "));
DEBUG_PRINTLN(frameID); RADIOLIB_DEBUG_PRINTLN(frameID);
return(ERR_FRAME_UNEXPECTED_ID); return(ERR_FRAME_UNEXPECTED_ID);
} }
// codePos does not include start delimiter and frame ID // codePos does not include start delimiter and frame ID
uint8_t code = resp[codePos]; uint8_t code = resp[codePos];
delete[] resp; delete[] resp;
@ -422,21 +422,21 @@ uint16_t XBee::getNumBytes(uint32_t timeout, size_t minBytes) {
return(0); return(0);
} }
} }
// read response // read response
uint8_t resp[3]; uint8_t resp[3];
uint8_t i = 0; uint8_t i = 0;
DEBUG_PRINT(F("reading frame length: ")); RADIOLIB_DEBUG_PRINT(F("reading frame length: "));
while(_mod->ModuleSerial->available() > 0) { while(_mod->ModuleSerial->available() > 0) {
uint8_t b = _mod->ModuleSerial->read(); uint8_t b = _mod->ModuleSerial->read();
DEBUG_PRINT(b, HEX); RADIOLIB_DEBUG_PRINT(b, HEX);
DEBUG_PRINT('\t'); RADIOLIB_DEBUG_PRINT('\t');
resp[i++] = b; resp[i++] = b;
if(i == 3) { if(i == 3) {
break; break;
} }
} }
DEBUG_PRINTLN(); RADIOLIB_DEBUG_PRINTLN();
return((resp[1] << 8) | resp[2]); return((resp[1] << 8) | resp[2]);
} }

View file

@ -20,7 +20,7 @@ int16_t nRF24::begin(int16_t freq, int16_t dataRate, int8_t power, uint8_t addrW
// check SPI connection // check SPI connection
int16_t val = _mod->SPIgetRegValue(NRF24_REG_SETUP_AW); int16_t val = _mod->SPIgetRegValue(NRF24_REG_SETUP_AW);
if(!((val >= 1) && (val <= 3))) { if(!((val >= 1) && (val <= 3))) {
DEBUG_PRINTLN(F("No nRF24 found!")); RADIOLIB_DEBUG_PRINTLN(F("No nRF24 found!"));
_mod->term(); _mod->term();
return(ERR_CHIP_NOT_FOUND); return(ERR_CHIP_NOT_FOUND);
} }

View file

@ -119,9 +119,9 @@ size_t MorseClient::write(uint8_t b) {
// check if the requested code was found in the array // check if the requested code was found in the array
if(found) { if(found) {
DEBUG_PRINT(mc.c); RADIOLIB_DEBUG_PRINT(mc.c);
DEBUG_PRINT('\t'); RADIOLIB_DEBUG_PRINT('\t');
DEBUG_PRINTLN(mc.m); RADIOLIB_DEBUG_PRINTLN(mc.m);
// iterate over Morse code representation and output appropriate tones // iterate over Morse code representation and output appropriate tones
for(uint8_t i = 0; i < strlen(mc.m); i++) { for(uint8_t i = 0; i < strlen(mc.m); i++) {
@ -145,7 +145,7 @@ size_t MorseClient::write(uint8_t b) {
} }
// letter space // letter space
DEBUG_PRINTLN(); RADIOLIB_DEBUG_PRINTLN();
delay(_dotLength * 3); delay(_dotLength * 3);
return(1); return(1);