[Morse] Use common print class

This commit is contained in:
jgromes 2023-04-29 22:54:43 +02:00
parent d79ed24a26
commit 0030a59028
2 changed files with 9 additions and 245 deletions

View file

@ -6,6 +6,7 @@
MorseClient::MorseClient(PhysicalLayer* phy) { MorseClient::MorseClient(PhysicalLayer* phy) {
phyLayer = phy; phyLayer = phy;
lineFeed = "^";
#if !defined(RADIOLIB_EXCLUDE_AFSK) #if !defined(RADIOLIB_EXCLUDE_AFSK)
audioClient = nullptr; audioClient = nullptr;
#endif #endif
@ -14,6 +15,7 @@ MorseClient::MorseClient(PhysicalLayer* phy) {
#if !defined(RADIOLIB_EXCLUDE_AFSK) #if !defined(RADIOLIB_EXCLUDE_AFSK)
MorseClient::MorseClient(AFSKClient* audio) { MorseClient::MorseClient(AFSKClient* audio) {
phyLayer = audio->phyLayer; phyLayer = audio->phyLayer;
lineFeed = "^";
audioClient = audio; audioClient = audio;
} }
#endif #endif
@ -110,22 +112,6 @@ int MorseClient::read(uint8_t* symbol, uint8_t* len, float low, float high) {
} }
#endif #endif
size_t MorseClient::write(const char* str) {
if(str == NULL) {
return(0);
}
return(MorseClient::write((uint8_t*)str, strlen(str)));
}
size_t MorseClient::write(uint8_t* buff, size_t len) {
size_t n = 0;
for(size_t i = 0; i < len; i++) {
n += MorseClient::write(buff[i]);
}
return(n);
}
size_t MorseClient::write(uint8_t b) { size_t MorseClient::write(uint8_t b) {
Module* mod = phyLayer->getMod(); Module* mod = phyLayer->getMod();
@ -180,205 +166,6 @@ size_t MorseClient::write(uint8_t b) {
return(1); return(1);
} }
#if defined(RADIOLIB_BUILD_ARDUINO)
size_t MorseClient::print(__FlashStringHelper* fstr) {
PGM_P p = reinterpret_cast<PGM_P>(fstr);
size_t n = 0;
while(true) {
char c = RADIOLIB_NONVOLATILE_READ_BYTE(p++);
if(c == '\0') {
break;
}
n += MorseClient::write(c);
}
return n;
}
size_t MorseClient::print(const String& str) {
return(MorseClient::write((uint8_t*)str.c_str(), str.length()));
}
#endif
size_t MorseClient::print(const char* str) {
return(MorseClient::write((uint8_t*)str, strlen(str)));
}
size_t MorseClient::print(char c) {
return(MorseClient::write(c));
}
size_t MorseClient::print(unsigned char b, int base) {
return(MorseClient::print((unsigned long)b, base));
}
size_t MorseClient::print(int n, int base) {
return(MorseClient::print((long)n, base));
}
size_t MorseClient::print(unsigned int n, int base) {
return(MorseClient::print((unsigned long)n, base));
}
size_t MorseClient::print(long n, int base) {
if(base == 0) {
return(MorseClient::write(n));
} else if(base == DEC) {
if (n < 0) {
int t = MorseClient::print('-');
n = -n;
return(MorseClient::printNumber(n, DEC) + t);
}
return(MorseClient::printNumber(n, DEC));
} else {
return(MorseClient::printNumber(n, base));
}
}
size_t MorseClient::print(unsigned long n, int base) {
if(base == 0) {
return(MorseClient::write(n));
} else {
return(MorseClient::printNumber(n, base));
}
}
size_t MorseClient::print(double n, int digits) {
return(MorseClient::printFloat(n, digits));
}
size_t MorseClient::println(void) {
return(MorseClient::write('^'));
}
#if defined(RADIOLIB_BUILD_ARDUINO)
size_t MorseClient::println(__FlashStringHelper* fstr) {
size_t n = MorseClient::print(fstr);
n += MorseClient::println();
return(n);
}
size_t MorseClient::println(const String& str) {
size_t n = MorseClient::print(str);
n += MorseClient::println();
return(n);
}
#endif
size_t MorseClient::println(const char* str) {
size_t n = MorseClient::print(str);
n += MorseClient::println();
return(n);
}
size_t MorseClient::println(char c) {
size_t n = MorseClient::print(c);
n += MorseClient::println();
return(n);
}
size_t MorseClient::println(unsigned char b, int base) {
size_t n = MorseClient::print(b, base);
n += MorseClient::println();
return(n);
}
size_t MorseClient::println(int num, int base) {
size_t n = MorseClient::print(num, base);
n += MorseClient::println();
return(n);
}
size_t MorseClient::println(unsigned int num, int base) {
size_t n = MorseClient::print(num, base);
n += MorseClient::println();
return(n);
}
size_t MorseClient::println(long num, int base) {
size_t n = MorseClient::print(num, base);
n += MorseClient::println();
return(n);
}
size_t MorseClient::println(unsigned long num, int base) {
size_t n = MorseClient::print(num, base);
n += MorseClient::println();
return(n);
}
size_t MorseClient::println(double d, int digits) {
size_t n = MorseClient::print(d, digits);
n += MorseClient::println();
return(n);
}
size_t MorseClient::printNumber(unsigned long n, uint8_t base) {
char buf[8 * sizeof(long) + 1];
char *str = &buf[sizeof(buf) - 1];
*str = '\0';
if(base < 2) {
base = 10;
}
do {
char c = n % base;
n /= base;
*--str = c < 10 ? c + '0' : c + 'A' - 10;
} while(n);
return(MorseClient::write(str));
}
size_t MorseClient::printFloat(double number, uint8_t digits) {
size_t n = 0;
char code[] = {0x00, 0x00, 0x00, 0x00};
if (isnan(number)) strcpy(code, "nan");
if (isinf(number)) strcpy(code, "inf");
if (number > 4294967040.0) strcpy(code, "ovf"); // constant determined empirically
if (number <-4294967040.0) strcpy(code, "ovf"); // constant determined empirically
if(code[0] != 0x00) {
return(MorseClient::write(code));
}
// Handle negative numbers
if (number < 0.0) {
n += MorseClient::print('-');
number = -number;
}
// Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5;
for(uint8_t i = 0; i < digits; ++i) {
rounding /= 10.0;
}
number += rounding;
// Extract the integer part of the number and print it
unsigned long int_part = (unsigned long)number;
double remainder = number - (double)int_part;
n += MorseClient::print(int_part);
// Print the decimal point, but only if there are digits beyond
if(digits > 0) {
n += MorseClient::print('.');
}
// Extract digits from the remainder one at a time
while(digits-- > 0) {
remainder *= 10.0;
unsigned int toPrint = (unsigned int)(remainder);
n += MorseClient::print(toPrint);
remainder -= toPrint;
}
return n;
}
int16_t MorseClient::transmitDirect(uint32_t freq, uint32_t freqHz) { int16_t MorseClient::transmitDirect(uint32_t freq, uint32_t freqHz) {
#if !defined(RADIOLIB_EXCLUDE_AFSK) #if !defined(RADIOLIB_EXCLUDE_AFSK)
if(audioClient != nullptr) { if(audioClient != nullptr) {

View file

@ -4,6 +4,7 @@
#include "../../TypeDef.h" #include "../../TypeDef.h"
#include "../PhysicalLayer/PhysicalLayer.h" #include "../PhysicalLayer/PhysicalLayer.h"
#include "../AFSK/AFSK.h" #include "../AFSK/AFSK.h"
#include "../Print/Print.h"
#define RADIOLIB_MORSE_DOT 0b0 #define RADIOLIB_MORSE_DOT 0b0
#define RADIOLIB_MORSE_DASH 0b1 #define RADIOLIB_MORSE_DASH 0b1
@ -89,7 +90,7 @@ static const uint8_t MorseTable[] RADIOLIB_NONVOLATILE = {
\class MorseClient \class MorseClient
\brief Client for Morse Code communication. The public interface is the same as Arduino Serial. \brief Client for Morse Code communication. The public interface is the same as Arduino Serial.
*/ */
class MorseClient { class MorseClient: public RadioLibPrint {
public: public:
/*! /*!
\brief Constructor for 2-FSK mode. \brief Constructor for 2-FSK mode.
@ -142,37 +143,13 @@ class MorseClient {
int read(uint8_t* symbol, uint8_t* len, float low = 0.75f, float high = 1.25f); int read(uint8_t* symbol, uint8_t* len, float low = 0.75f, float high = 1.25f);
#endif #endif
size_t write(const char* str); /*!
size_t write(uint8_t* buff, size_t len); \brief Write one byte. Implementation of interface of the RadioLibPrint/Print class.
\param b Byte to write.
\returns 1 if the byte was written, 0 otherwise.
*/
size_t write(uint8_t b); size_t write(uint8_t b);
#if defined(RADIOLIB_BUILD_ARDUINO)
size_t print(__FlashStringHelper*);
size_t print(const String &);
#endif
size_t print(const char[]);
size_t print(char);
size_t print(unsigned char, int = DEC);
size_t print(int, int = DEC);
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
size_t print(double, int = 2);
size_t println(void);
#if defined(RADIOLIB_BUILD_ARDUINO)
size_t println(__FlashStringHelper*);
size_t println(const String &);
#endif
size_t println(const char[]);
size_t println(char);
size_t println(unsigned char, int = DEC);
size_t println(int, int = DEC);
size_t println(unsigned int, int = DEC);
size_t println(long, int = DEC);
size_t println(unsigned long, int = DEC);
size_t println(double, int = 2);
#if !defined(RADIOLIB_GODMODE) #if !defined(RADIOLIB_GODMODE)
private: private:
#endif #endif