#if !defined(_RADIOLIB_RADIOLIB_MORSE_H) && !defined(RADIOLIB_EXCLUDE_MORSE) #define _RADIOLIB_RADIOLIB_MORSE_H #include "../../TypeDef.h" #include "../PhysicalLayer/PhysicalLayer.h" #include "../AFSK/AFSK.h" #define RADIOLIB_MORSE_DOT 0b0 #define RADIOLIB_MORSE_DASH 0b1 #define RADIOLIB_MORSE_GUARDBIT 0b1 #define RADIOLIB_MORSE_UNSUPORTED 0xFF // Morse character table: - using codes defined in ITU-R M.1677-1 // - Morse code representation is saved LSb first, using additional bit as guard // - position in array corresponds ASCII code minus RADIOLIB_MORSE_ASCII_OFFSET // - ASCII characters marked RADIOLIB_MORSE_UNSUPORTED do not have ITU-R M.1677-1 equivalent static const uint8_t MorseTable[] RADIOLIB_NONVOLATILE = { 0b00, // space 0b110101, // ! (unsupported) 0b1010010, // " RADIOLIB_MORSE_UNSUPORTED, // # (unsupported) RADIOLIB_MORSE_UNSUPORTED, // $ (unsupported) RADIOLIB_MORSE_UNSUPORTED, // % (unsupported) RADIOLIB_MORSE_UNSUPORTED, // & (unsupported) 0b1011110, // ' 0b101101, // ( 0b1101101, // ) RADIOLIB_MORSE_UNSUPORTED, // * (unsupported) 0b101010, // + 0b1110011, // , 0b1100001, // - 0b1101010, // . 0b101001, // / 0b111111, // 0 0b111110, // 1 0b111100, // 2 0b111000, // 3 0b110000, // 4 0b100000, // 5 0b100001, // 6 0b100011, // 7 0b100111, // 8 0b101111, // 9 0b1000111, // : RADIOLIB_MORSE_UNSUPORTED, // ; (unsupported) RADIOLIB_MORSE_UNSUPORTED, // < (unsupported) 0b110001, // = RADIOLIB_MORSE_UNSUPORTED, // > (unsupported) 0b1001100, // ? 0b1010110, // @ 0b110, // A 0b10001, // B 0b10101, // C 0b1001, // D 0b10, // E 0b10100, // F 0b1011, // G 0b10000, // H 0b100, // I 0b11110, // J 0b1101, // K 0b10010, // L 0b111, // M 0b101, // N 0b1111, // O 0b10110, // P 0b11011, // Q 0b1010, // R 0b1000, // S 0b11, // T 0b1100, // U 0b11000, // V 0b1110, // W 0b11001, // X 0b11101, // Y 0b10011, // Z RADIOLIB_MORSE_UNSUPORTED, // [ (unsupported) RADIOLIB_MORSE_UNSUPORTED, // \ (unsupported) RADIOLIB_MORSE_UNSUPORTED, // ] (unsupported) 0b1101000, // ^ (unsupported, used as alias for end of work) 0b110101 // _ (unsupported, used as alias for starting signal) }; /*! \class MorseClient \brief Client for Morse Code communication. The public interface is the same as Arduino Serial. */ class MorseClient { public: /*! \brief Constructor for 2-FSK mode. \param phy Pointer to the wireless module providing PhysicalLayer communication. */ explicit MorseClient(PhysicalLayer* phy); #if !defined(RADIOLIB_EXCLUDE_AFSK) /*! \brief Constructor for AFSK mode. \param audio Pointer to the AFSK instance providing audio. */ explicit MorseClient(AFSKClient* audio); #endif // basic methods /*! \brief Initialization method. \param base Base RF frequency to be used in MHz (in 2-FSK mode), or the tone frequency in Hz (in AFSK mode) \param speed Coding speed in words per minute. \returns \ref status_codes */ int16_t begin(float base, uint8_t speed = 20); /*! \brief Send start signal. \returns Number of bytes sent (always 0). */ size_t startSignal(); size_t write(const char* str); 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); 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); size_t println(__FlashStringHelper*); size_t println(const String &); 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) private: #endif PhysicalLayer* _phy; #if !defined(RADIOLIB_EXCLUDE_AFSK) AFSKClient* _audio; #endif uint32_t _base = 0, _baseHz = 0; uint16_t _dotLength = 0; size_t printNumber(unsigned long, uint8_t); size_t printFloat(double, uint8_t); int16_t transmitDirect(uint32_t freq = 0, uint32_t freqHz = 0); int16_t standby(); }; #endif