From fd4da5771c166fc7a565167272a4aeb84d327e92 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 28 May 2019 12:43:04 +0200 Subject: [PATCH] [Morse] Added support for Arduino flash strings --- .../Morse/Morse_Transmit/Morse_Transmit.ino | 3 +++ src/protocols/Morse.cpp | 23 +++++++++++++++++-- src/protocols/Morse.h | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/examples/Morse/Morse_Transmit/Morse_Transmit.ino b/examples/Morse/Morse_Transmit/Morse_Transmit.ino index 7467e85c..3ad9431d 100644 --- a/examples/Morse/Morse_Transmit/Morse_Transmit.ino +++ b/examples/Morse/Morse_Transmit/Morse_Transmit.ino @@ -74,6 +74,9 @@ void loop() { // character array (C-String) morse.print("C-String"); + // string saved in flash + morse.print(F("Flash String")); + // character morse.print('c'); diff --git a/src/protocols/Morse.cpp b/src/protocols/Morse.cpp index 8bf3782c..93fe254c 100644 --- a/src/protocols/Morse.cpp +++ b/src/protocols/Morse.cpp @@ -85,6 +85,10 @@ int16_t MorseClient::begin(float base, uint8_t speed) { return(state); } +size_t MorseClient::startSignal() { + return(MorseClient::write(0x01)); +} + size_t MorseClient::write(const char* str) { if(str == NULL) { return(0); @@ -147,8 +151,17 @@ size_t MorseClient::write(uint8_t b) { return(0); } -size_t MorseClient::startSignal() { - return(MorseClient::write(0x01)); +size_t MorseClient::print(__FlashStringHelper* fstr) { + PGM_P p = reinterpret_cast(fstr); + size_t n = 0; + while(true) { + char c = pgm_read_byte(p++); + if(c == '\0') { + break; + } + n += MorseClient::write(c); + } + return n; } size_t MorseClient::print(const String& str) { @@ -206,6 +219,12 @@ size_t MorseClient::println(void) { return(MorseClient::write(0x02)); } +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(); diff --git a/src/protocols/Morse.h b/src/protocols/Morse.h index d9dd5268..7e04e854 100644 --- a/src/protocols/Morse.h +++ b/src/protocols/Morse.h @@ -44,6 +44,7 @@ class MorseClient { size_t write(uint8_t* buff, size_t len); size_t write(uint8_t b); + size_t print(__FlashStringHelper*); size_t print(const String &); size_t print(const char[]); size_t print(char); @@ -55,6 +56,7 @@ class MorseClient { size_t print(double, int = 2); size_t println(void); + size_t println(__FlashStringHelper*); size_t println(const String &s); size_t println(const char[]); size_t println(char);