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