Arduino KVComm  master
Key-Value pair communication library for Arduino
PrintStream.cpp
Go to the documentation of this file.
1 // https://github.com/tttapa/Arduino-PrintStream/blob/6a9e0d365be0b3d84187daa2a8a7bda8d541472e/src/PrintStream.cpp
2 
3 #include "PrintStream.hpp"
4 
5 // LCOV_EXCL_START
6 
7 #if (defined(ESP8266) || defined(TEENSY)) && not defined(ARDUINO_API_VERSION)
8 #define FLUSH
9 #endif // TODO
10 
11 /* #define OCT 8 */
12 
13 uint8_t formatPrintStream = DEC;
14 bool boolalphaPrintStream = false;
18 enum : char { LOWERCASE = 0x7F, UPPERCASE = 0x5F } casePrintStream = LOWERCASE;
19 bool showbasePrintStream = false;
20 
21 template <class T>
22 Print &printIntegral(Print &printer, T i);
23 
24 Print &endl(Print &printer) {
25  printer.println();
26 #ifdef FLUSH
27  printer.flush();
28 #endif
29  return printer;
30 }
31 
32 Print &uppercase(Print &printer) {
34  return printer;
35 }
36 
37 Print &nouppercase(Print &printer) {
39  return printer;
40 }
41 
42 Print &showbase(Print &printer) {
43  showbasePrintStream = true;
44  return printer;
45 }
46 
47 Print &noshowbase(Print &printer) {
48  showbasePrintStream = false;
49  return printer;
50 }
51 
52 Print &flush(Print &printer) {
53 #ifdef FLUSH
54  printer.flush();
55 #endif
56  return printer;
57 }
58 
59 Print &hex(Print &printer) {
60  formatPrintStream = HEX;
61  return printer;
62 }
63 
64 /* Print &oct(Print &printer) {
65  formatPrintStream = OCT;
66  return printer;
67 } */
68 
69 Print &bin(Print &printer) {
70  formatPrintStream = BIN;
71  return printer;
72 }
73 
74 Print &dec(Print &printer) {
75  formatPrintStream = DEC;
76  return printer;
77 }
78 
79 Print &boolalpha(Print &printer) {
80  boolalphaPrintStream = true;
81  return printer;
82 }
83 Print &noboolalpha(Print &printer) {
84  boolalphaPrintStream = false;
85  return printer;
86 }
87 
88 Print &leadingzeros(Print &printer) {
90  return printer;
91 }
92 Print &noleadingzeros(Print &printer) {
94  return printer;
95 }
96 Print &operator<<(Print &printer, const __FlashStringHelper *s) {
97  printer.print(s);
98  return printer;
99 }
100 #ifdef ARDUINO
101 Print &operator<<(Print &printer, const String &s) {
102  printer.print(s);
103  return printer;
104 }
105 #endif
106 Print &operator<<(Print &printer, const char s[]) {
107  printer.print(s);
108  return printer;
109 }
110 Print &operator<<(Print &printer, char c) {
111  printer.print(c);
112  return printer;
113 }
114 Print &operator<<(Print &printer, unsigned char i) {
115  return printIntegral(printer, i);
116 }
117 Print &operator<<(Print &printer, int i) { return printIntegral(printer, i); }
118 Print &operator<<(Print &printer, unsigned int i) {
119  return printIntegral(printer, i);
120 }
121 Print &operator<<(Print &printer, int8_t i) {
122  return printIntegral(printer, i);
123 }
124 Print &operator<<(Print &printer, long i) { return printIntegral(printer, i); }
125 Print &operator<<(Print &printer, unsigned long i) {
126  return printIntegral(printer, i);
127 }
128 Print &operator<<(Print &printer, double d) {
129  printer.print(d, precisionPrintStream);
130  return printer;
131 }
132 Print &operator<<(Print &printer, const Printable &p) {
133  printer.print(p);
134  return printer;
135 }
136 Print &operator<<(Print &printer, bool b) {
138  printer.print(b ? F("true") : F("false"));
139  else
140  printer.print(b);
141  return printer;
142 }
143 
144 template <class T>
145 Print &printIntegral(Print &printer, T i) {
146  switch (formatPrintStream) {
147  case DEC: printer.print(i); break;
148  case HEX: printHex(printer, i); break;
149  case BIN: printBin(printer, i); break;
150  /* case OCT:
151  printOct(printer, i);
152  break; */
153  default: break;
154  }
155  return printer;
156 }
157 
158 Print &operator<<(Print &printer, manipulator pf) { return pf(printer); }
159 
160 Setbase setbase(uint8_t base) { return {base}; }
161 Print &operator<<(Print &printer, Setbase f) {
163  return printer;
164 }
165 
166 Setbytesep setbytesep(char bytesep) { return {bytesep}; }
167 Print &operator<<(Print &printer, Setbytesep f) {
169  return printer;
170 }
171 
172 Setprecision setprecision(int n) { return {n}; }
173 Print &operator<<(Print &printer, Setprecision f) {
175  return printer;
176 }
177 
178 static char nibble_to_hex(
179  uint8_t nibble) { // convert a 4-bit nibble to a hexadecimal character
180  nibble &= 0xF;
181  return nibble > 9 ? nibble - 10 + ('a' & casePrintStream) : nibble + '0';
182 }
183 
184 #if __BYTE_ORDER != __LITTLE_ENDIAN
185 #error "Byte order not supported"
186 #endif
187 
188 template <class T>
189 void printHex(Print &printer, T val) {
191  printer.print("0x");
192  bool nonZero = false;
193  for (int i = sizeof(val) - 1; i >= 0; i--) {
194  uint8_t currByte = ((uint8_t *) &val)[i];
195  if (currByte != 0 || i == 0)
196  nonZero = true;
197  if (leadingZerosPrintStream || nonZero) {
198  printer.print(nibble_to_hex(currByte >> 4));
199  printer.print(nibble_to_hex(currByte));
200  if (byteSeparatorPrintStream && i)
201  printer.print(byteSeparatorPrintStream);
202  }
203  }
204 }
205 
206 template <class T>
207 void printBin(Print &printer, T val) {
209  printer.print("0b");
210  bool nonZero = false;
211  for (int i = sizeof(val) - 1; i >= 0; i--) {
212  uint8_t currByte = ((uint8_t *) &val)[i];
213  for (int j = 7; j >= 0; j--) {
214  uint8_t currBit = currByte & 0x80;
215  if (currBit != 0 || (i == 0 && j == 0))
216  nonZero = true;
217  if (leadingZerosPrintStream || nonZero)
218  printer.print(currBit ? '1' : '0');
219  currByte <<= 1;
220  }
221  if (byteSeparatorPrintStream && i &&
222  (leadingZerosPrintStream || nonZero))
223  printer.print(byteSeparatorPrintStream);
224  }
225 }
226 
227 /* template <class T>
228 void printOct(Print &printer, T val)
229 {
230  ; // TODO
231 } */
232 
233 // LCOV_EXCL_STOP
showbase
Print & showbase(Print &printer)
Definition: PrintStream.cpp:42
Setbase::M_base
uint8_t M_base
Definition: PrintStream.hpp:54
printHex
void printHex(Print &printer, T val)
Definition: PrintStream.cpp:189
setprecision
Setprecision setprecision(int n)
Definition: PrintStream.cpp:172
leadingzeros
Print & leadingzeros(Print &printer)
Definition: PrintStream.cpp:88
showbasePrintStream
bool showbasePrintStream
Definition: PrintStream.cpp:19
nibble_to_hex
static char nibble_to_hex(uint8_t nibble)
Definition: PrintStream.cpp:178
bin
Print & bin(Print &printer)
Definition: PrintStream.cpp:69
setbase
Setbase setbase(uint8_t base)
Definition: PrintStream.cpp:160
Setbytesep::M_bytesep
char M_bytesep
Definition: PrintStream.hpp:66
boolalphaPrintStream
bool boolalphaPrintStream
Definition: PrintStream.cpp:14
LOWERCASE
Definition: PrintStream.cpp:18
formatPrintStream
uint8_t formatPrintStream
Definition: PrintStream.cpp:13
setbytesep
Setbytesep setbytesep(char bytesep)
Definition: PrintStream.cpp:166
noshowbase
Print & noshowbase(Print &printer)
Definition: PrintStream.cpp:47
byteSeparatorPrintStream
char byteSeparatorPrintStream
Definition: PrintStream.cpp:17
UPPERCASE
Definition: PrintStream.cpp:18
nouppercase
Print & nouppercase(Print &printer)
Definition: PrintStream.cpp:37
printBin
void printBin(Print &printer, T val)
Definition: PrintStream.cpp:207
manipulator
Print & manipulator(Print &)
Definition: PrintStream.hpp:18
noboolalpha
Print & noboolalpha(Print &printer)
Definition: PrintStream.cpp:83
Setbytesep
Definition: PrintStream.hpp:65
Setbase
Definition: PrintStream.hpp:53
boolalpha
Print & boolalpha(Print &printer)
Definition: PrintStream.cpp:79
operator<<
Print & operator<<(Print &printer, const __FlashStringHelper *s)
Definition: PrintStream.cpp:96
flush
Print & flush(Print &printer)
Definition: PrintStream.cpp:52
printIntegral
Print & printIntegral(Print &printer, T i)
Definition: PrintStream.cpp:145
noleadingzeros
Print & noleadingzeros(Print &printer)
Definition: PrintStream.cpp:92
uppercase
Print & uppercase(Print &printer)
Definition: PrintStream.cpp:32
F
#define F(x)
Definition: KV_Error.hpp:38
hex
Print & hex(Print &printer)
Definition: PrintStream.cpp:59
precisionPrintStream
uint8_t precisionPrintStream
Definition: PrintStream.cpp:16
endl
Print & endl(Print &printer)
Definition: PrintStream.cpp:24
PrintStream.hpp
casePrintStream
enum @2 casePrintStream
dec
Print & dec(Print &printer)
Definition: PrintStream.cpp:74
Setprecision::M_n
int M_n
Definition: PrintStream.hpp:60
leadingZerosPrintStream
bool leadingZerosPrintStream
Definition: PrintStream.cpp:15
Setprecision
Definition: PrintStream.hpp:59