RadioLib
Universal wireless communication library for Arduino
Hellschreiber.h
1 #if !defined(_RADIOLIB_HELLSCHREIBER_H)
2 #define _RADIOLIB_HELLSCHREIBER_H
3 
4 #include "../../TypeDef.h"
5 
6 #if !defined(RADIOLIB_EXCLUDE_HELLSCHREIBER)
7 
8 #include "../PhysicalLayer/PhysicalLayer.h"
9 #include "../AFSK/AFSK.h"
10 
11 #define RADIOLIB_HELL_FONT_WIDTH 7
12 #define RADIOLIB_HELL_FONT_HEIGHT 7
13 
14 // font definition: characters are stored in rows,
15 // least significant byte of each character is the first row
16 // Hellschreiber use 7x7 characters, but this simplified font uses only 5x5 - the extra bytes aren't stored
17 static const uint8_t HellFont[64][RADIOLIB_HELL_FONT_WIDTH - 2] RADIOLIB_NONVOLATILE = {
18  { 0b0000000, 0b0000000, 0b0000000, 0b0000000, 0b0000000 }, // space
19  { 0b0001000, 0b0001000, 0b0001000, 0b0000000, 0b0001000 }, // !
20  { 0b0010100, 0b0010100, 0b0000000, 0b0000000, 0b0000000 }, // "
21  { 0b0010100, 0b0111110, 0b0010100, 0b0111110, 0b0010100 }, // #
22  { 0b0111110, 0b0101000, 0b0111110, 0b0001010, 0b0111110 }, // $
23  { 0b0110010, 0b0110100, 0b0001000, 0b0010110, 0b0100110 }, // %
24  { 0b0010000, 0b0101000, 0b0010000, 0b0101000, 0b0110100 }, // &
25  { 0b0001000, 0b0001000, 0b0000000, 0b0000000, 0b0000000 }, // '
26  { 0b0000100, 0b0001000, 0b0001000, 0b0001000, 0b0000100 }, // (
27  { 0b0010000, 0b0001000, 0b0001000, 0b0001000, 0b0010000 }, // )
28  { 0b0010100, 0b0001000, 0b0010100, 0b0000000, 0b0000000 }, // *
29  { 0b0001000, 0b0001000, 0b0111110, 0b0001000, 0b0001000 }, // +
30  { 0b0000000, 0b0000000, 0b0000000, 0b0001000, 0b0010000 }, // ,
31  { 0b0000000, 0b0000000, 0b0111110, 0b0000000, 0b0000000 }, // -
32  { 0b0000000, 0b0000000, 0b0000000, 0b0000000, 0b0001000 }, // .
33  { 0b0000010, 0b0000100, 0b0001000, 0b0010000, 0b0100000 }, // /
34  { 0b0011100, 0b0100110, 0b0101010, 0b0110010, 0b0011100 }, // 0
35  { 0b0011000, 0b0001000, 0b0001000, 0b0001000, 0b0001000 }, // 1
36  { 0b0011000, 0b0100100, 0b0001000, 0b0010000, 0b0111100 }, // 2
37  { 0b0111100, 0b0000100, 0b0011100, 0b0000100, 0b0111100 }, // 3
38  { 0b0100100, 0b0100100, 0b0111100, 0b0000100, 0b0000100 }, // 4
39  { 0b0011100, 0b0100000, 0b0111100, 0b0000100, 0b0111100 }, // 5
40  { 0b0111100, 0b0100000, 0b0111100, 0b0100100, 0b0111100 }, // 6
41  { 0b0111100, 0b0000100, 0b0001000, 0b0010000, 0b0100000 }, // 7
42  { 0b0111100, 0b0100100, 0b0011000, 0b0100100, 0b0111100 }, // 8
43  { 0b0111100, 0b0100100, 0b0111100, 0b0000100, 0b0111100 }, // 9
44  { 0b0000000, 0b0001000, 0b0000000, 0b0000000, 0b0001000 }, // :
45  { 0b0000000, 0b0001000, 0b0000000, 0b0001000, 0b0001000 }, // ;
46  { 0b0000100, 0b0001000, 0b0010000, 0b0001000, 0b0000100 }, // <
47  { 0b0000000, 0b0111110, 0b0000000, 0b0111110, 0b0000000 }, // =
48  { 0b0010000, 0b0001000, 0b0000100, 0b0001000, 0b0010000 }, // >
49  { 0b0011100, 0b0000100, 0b0001000, 0b0000000, 0b0001000 }, // ?
50  { 0b0011100, 0b0100010, 0b0101110, 0b0101010, 0b0001100 }, // @
51  { 0b0111110, 0b0100010, 0b0111110, 0b0100010, 0b0100010 }, // A
52  { 0b0111100, 0b0010010, 0b0011110, 0b0010010, 0b0111100 }, // B
53  { 0b0011110, 0b0110000, 0b0100000, 0b0110000, 0b0011110 }, // C
54  { 0b0111100, 0b0100010, 0b0100010, 0b0100010, 0b0111100 }, // D
55  { 0b0111110, 0b0100000, 0b0111100, 0b0100000, 0b0111110 }, // E
56  { 0b0111110, 0b0100000, 0b0111100, 0b0100000, 0b0100000 }, // F
57  { 0b0111110, 0b0100000, 0b0101110, 0b0100010, 0b0111110 }, // G
58  { 0b0100010, 0b0100010, 0b0111110, 0b0100010, 0b0100010 }, // H
59  { 0b0011100, 0b0001000, 0b0001000, 0b0001000, 0b0011100 }, // I
60  { 0b0111100, 0b0001000, 0b0001000, 0b0101000, 0b0111000 }, // J
61  { 0b0100100, 0b0101000, 0b0110000, 0b0101000, 0b0100100 }, // K
62  { 0b0100000, 0b0100000, 0b0100000, 0b0100000, 0b0111100 }, // L
63  { 0b0100010, 0b0110110, 0b0101010, 0b0100010, 0b0100010 }, // M
64  { 0b0100010, 0b0110010, 0b0101010, 0b0100110, 0b0100010 }, // N
65  { 0b0011100, 0b0100010, 0b0100010, 0b0100010, 0b0011100 }, // O
66  { 0b0111110, 0b0100010, 0b0111110, 0b0100000, 0b0100000 }, // P
67  { 0b0111110, 0b0100010, 0b0100010, 0b0100110, 0b0111110 }, // Q
68  { 0b0111110, 0b0100010, 0b0111110, 0b0100100, 0b0100010 }, // R
69  { 0b0111110, 0b0100000, 0b0111110, 0b0000010, 0b0111110 }, // S
70  { 0b0111110, 0b0001000, 0b0001000, 0b0001000, 0b0001000 }, // T
71  { 0b0100010, 0b0100010, 0b0100010, 0b0100010, 0b0111110 }, // U
72  { 0b0100010, 0b0100010, 0b0010100, 0b0010100, 0b0001000 }, // V
73  { 0b0100010, 0b0100010, 0b0101010, 0b0110110, 0b0100010 }, // W
74  { 0b0100010, 0b0010100, 0b0001000, 0b0010100, 0b0100010 }, // X
75  { 0b0100010, 0b0010100, 0b0001000, 0b0001000, 0b0001000 }, // Y
76  { 0b0111110, 0b0000100, 0b0001000, 0b0010000, 0b0111110 }, // Z
77  { 0b0001100, 0b0001000, 0b0001000, 0b0001000, 0b0001100 }, // [
78  { 0b0100000, 0b0010000, 0b0001000, 0b0000100, 0b0000010 }, // backslash
79  { 0b0011000, 0b0001000, 0b0001000, 0b0001000, 0b0011000 }, // ]
80  { 0b0001000, 0b0010100, 0b0000000, 0b0000000, 0b0000000 }, // ^
81  { 0b0000000, 0b0000000, 0b0000000, 0b0000000, 0b0111110 } // _
82 };
83 
89 class HellClient {
90  public:
96  explicit HellClient(PhysicalLayer* phy);
97 
98  #if !defined(RADIOLIB_EXCLUDE_AFSK)
104  explicit HellClient(AFSKClient* audio);
105  #endif
106 
107  // basic methods
108 
116  int16_t begin(float base, float rate = 122.5);
117 
125  size_t printGlyph(uint8_t* buff);
126 
132  void setInversion(bool invert);
133 
134  size_t write(const char* str);
135  size_t write(uint8_t* buff, size_t len);
136  size_t write(uint8_t b);
137 
138  size_t print(__FlashStringHelper*);
139  size_t print(const String &);
140  size_t print(const char[]);
141  size_t print(char);
142  size_t print(unsigned char, int = DEC);
143  size_t print(int, int = DEC);
144  size_t print(unsigned int, int = DEC);
145  size_t print(long, int = DEC);
146  size_t print(unsigned long, int = DEC);
147  size_t print(double, int = 2);
148 
149  size_t println(void);
150  size_t println(__FlashStringHelper*);
151  size_t println(const String &);
152  size_t println(const char[]);
153  size_t println(char);
154  size_t println(unsigned char, int = DEC);
155  size_t println(int, int = DEC);
156  size_t println(unsigned int, int = DEC);
157  size_t println(long, int = DEC);
158  size_t println(unsigned long, int = DEC);
159  size_t println(double, int = 2);
160 
161 #if !defined(RADIOLIB_GODMODE)
162  private:
163 #endif
164  PhysicalLayer* _phy;
165  #if !defined(RADIOLIB_EXCLUDE_AFSK)
166  AFSKClient* _audio;
167  #endif
168 
169  uint32_t _base = 0, _baseHz = 0;
170  uint32_t _pixelDuration = 0;
171  bool _inv = false;
172 
173  size_t printNumber(unsigned long, uint8_t);
174  size_t printFloat(double, uint8_t);
175 
176  int16_t transmitDirect(uint32_t freq = 0, uint32_t freqHz = 0);
177  int16_t standby();
178 };
179 
180 #endif
181 
182 #endif
Client for audio-based transmissions. Requires Arduino tone() function, and a module capable of direc...
Definition: AFSK.h:17
Client for Hellschreiber transmissions.
Definition: Hellschreiber.h:89
void setInversion(bool invert)
Invert text color.
Definition: Hellschreiber.cpp:52
int16_t begin(float base, float rate=122.5)
Initialization method.
Definition: Hellschreiber.cpp:19
HellClient(PhysicalLayer *phy)
Constructor for 2-FSK mode.
Definition: Hellschreiber.cpp:4
size_t printGlyph(uint8_t *buff)
Method to "print" a buffer of pixels, this is exposed to allow users to send custom characters.
Definition: Hellschreiber.cpp:31
Provides common interface for protocols that run on LoRa/FSK modules, such as RTTY or LoRaWAN....
Definition: PhysicalLayer.h:14