Control Surface
main
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
AH
PrintStream
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) && not defined(ArduinoFake) && \
9
not defined(ARDUINO_ARCH_STM32)
10
#define FLUSH
11
#endif
12
13
BEGIN_AH_NAMESPACE
14
15
/* #define OCT 8 */
16
17
uint8_t
formatPrintStream
= DEC;
18
bool
boolalphaPrintStream
=
false
;
19
bool
leadingZerosPrintStream
=
false
;
20
uint8_t
precisionPrintStream
= 2;
21
char
byteSeparatorPrintStream
=
'\0'
;
22
enum :
char
{
LOWERCASE
= 0x7F,
UPPERCASE
= 0x5F }
casePrintStream
=
LOWERCASE
;
23
bool
showbasePrintStream
=
false
;
24
25
template
<
class
T>
26
Print &
printIntegral
(Print &printer, T i);
27
28
Print &
endl
(Print &printer) {
29
printer.println();
30
#ifdef FLUSH
31
printer.flush();
32
#endif
33
return
printer;
34
}
35
36
Print &
uppercase
(Print &printer) {
37
casePrintStream
=
UPPERCASE
;
38
return
printer;
39
}
40
41
Print &
nouppercase
(Print &printer) {
42
casePrintStream
=
LOWERCASE
;
43
return
printer;
44
}
45
46
Print &
showbase
(Print &printer) {
47
showbasePrintStream
=
true
;
48
return
printer;
49
}
50
51
Print &
noshowbase
(Print &printer) {
52
showbasePrintStream
=
false
;
53
return
printer;
54
}
55
56
Print &
flush
(Print &printer) {
57
#ifdef FLUSH
58
printer.flush();
59
#endif
60
return
printer;
61
}
62
63
Print &
hex
(Print &printer) {
64
formatPrintStream
= HEX;
65
return
printer;
66
}
67
68
/* Print &oct(Print &printer) {
69
formatPrintStream = OCT;
70
return printer;
71
} */
72
73
Print &
bin
(Print &printer) {
74
formatPrintStream
= BIN;
75
return
printer;
76
}
77
78
Print &
dec
(Print &printer) {
79
formatPrintStream
= DEC;
80
return
printer;
81
}
82
83
Print &
boolalpha
(Print &printer) {
84
boolalphaPrintStream
=
true
;
85
return
printer;
86
}
87
Print &
noboolalpha
(Print &printer) {
88
boolalphaPrintStream
=
false
;
89
return
printer;
90
}
91
92
Print &
leadingzeros
(Print &printer) {
93
leadingZerosPrintStream
=
true
;
94
return
printer;
95
}
96
Print &
noleadingzeros
(Print &printer) {
97
leadingZerosPrintStream
=
false
;
98
return
printer;
99
}
100
Print &
operator<<
(Print &printer,
const
__FlashStringHelper *s) {
101
printer.print(s);
102
return
printer;
103
}
104
#ifdef ARDUINO
105
Print &
operator<<
(Print &printer,
const
String &s) {
106
printer.print(s);
107
return
printer;
108
}
109
#endif
110
Print &
operator<<
(Print &printer,
const
char
s[]) {
111
printer.print(s);
112
return
printer;
113
}
114
Print &
operator<<
(Print &printer,
char
c) {
115
printer.print(c);
116
return
printer;
117
}
118
Print &
operator<<
(Print &printer,
unsigned
char
i) {
119
return
printIntegral
(printer, i);
120
}
121
Print &
operator<<
(Print &printer,
int
i) {
return
printIntegral
(printer, i); }
122
Print &
operator<<
(Print &printer,
unsigned
int
i) {
123
return
printIntegral
(printer, i);
124
}
125
Print &
operator<<
(Print &printer, int8_t i) {
126
return
printIntegral
(printer, i);
127
}
128
Print &
operator<<
(Print &printer,
long
i) {
return
printIntegral
(printer, i); }
129
Print &
operator<<
(Print &printer,
unsigned
long
i) {
130
return
printIntegral
(printer, i);
131
}
132
Print &
operator<<
(Print &printer,
double
d) {
133
printer.print(d, +
precisionPrintStream
);
134
return
printer;
135
}
136
Print &
operator<<
(Print &printer,
float
f) {
137
return
printer << static_cast<double>(f);
138
}
139
Print &
operator<<
(Print &printer,
const
Printable &p) {
140
printer.print(p);
141
return
printer;
142
}
143
Print &
operator<<
(Print &printer,
bool
b) {
144
if
(
boolalphaPrintStream
)
145
printer.print(b ? F(
"true"
) : F(
"false"
));
146
else
147
printer.print(b);
148
return
printer;
149
}
150
151
Print &
operator<<
(Print &printer,
manipulator
pf) {
return
pf(printer); }
152
153
Setbase
setbase
(uint8_t base) {
return
{base}; }
154
Print &
operator<<
(Print &printer,
Setbase
f) {
155
formatPrintStream
= f.
M_base
;
156
return
printer;
157
}
158
159
Setbytesep
setbytesep
(
char
bytesep) {
return
{bytesep}; }
160
Print &
operator<<
(Print &printer,
Setbytesep
f) {
161
byteSeparatorPrintStream
= f.
M_bytesep
;
162
return
printer;
163
}
164
165
Setprecision
setprecision
(
int
n) {
return
{n}; }
166
Print &
operator<<
(Print &printer,
Setprecision
f) {
167
precisionPrintStream
= f.
M_n
;
168
return
printer;
169
}
170
171
static
char
nibble_to_hex
(
172
uint8_t nibble) {
// convert a 4-bit nibble to a hexadecimal character
173
nibble &= 0xF;
174
return
nibble > 9 ? nibble - 10 + (
'a'
&
casePrintStream
) : nibble +
'0'
;
175
}
176
177
#if __BYTE_ORDER != __LITTLE_ENDIAN
178
#error "Byte order not supported"
179
#endif
180
181
template
<
class
T>
182
void
printHex
(Print &printer, T val) {
183
if
(
showbasePrintStream
)
184
printer.print(
"0x"
);
185
bool
nonZero =
false
;
186
for
(
int
i =
sizeof
(val) - 1; i >= 0; i--) {
187
uint8_t currByte = ((uint8_t *)&val)[i];
188
if
(currByte != 0 || i == 0)
189
nonZero =
true
;
190
if
(
leadingZerosPrintStream
|| nonZero) {
191
printer.print(
nibble_to_hex
(currByte >> 4));
192
printer.print(
nibble_to_hex
(currByte));
193
if
(
byteSeparatorPrintStream
&& i)
194
printer.print(
byteSeparatorPrintStream
);
195
}
196
}
197
}
198
199
template
<
class
T>
200
void
printBin
(Print &printer, T val) {
201
if
(
showbasePrintStream
)
202
printer.print(
"0b"
);
203
bool
nonZero =
false
;
204
for
(
int
i =
sizeof
(val) - 1; i >= 0; i--) {
205
uint8_t currByte = ((uint8_t *)&val)[i];
206
for
(
int
j = 7; j >= 0; j--) {
207
uint8_t currBit = currByte & 0x80;
208
if
(currBit != 0 || (i == 0 && j == 0))
209
nonZero =
true
;
210
if
(
leadingZerosPrintStream
|| nonZero)
211
printer.print(currBit ?
'1'
:
'0'
);
212
currByte <<= 1;
213
}
214
if
(
byteSeparatorPrintStream
&& i &&
215
(
leadingZerosPrintStream
|| nonZero))
216
printer.print(
byteSeparatorPrintStream
);
217
}
218
}
219
220
/* template <class T>
221
void printOct(Print &printer, T val)
222
{
223
; // TODO
224
} */
225
226
template
<
class
T>
227
Print &
printIntegral
(Print &printer, T i) {
228
switch
(
formatPrintStream
) {
229
case
DEC: printer.print(i);
break
;
230
case
HEX:
printHex
(printer, i);
break
;
231
case
BIN:
printBin
(printer, i);
break
;
232
/* case OCT:
233
printOct(printer, i);
234
break; */
235
default
:
break
;
236
}
237
return
printer;
238
}
239
240
Print &
operator<<
(Print &p,
HexDump
h) {
241
if
(h.
length
== 0)
242
return
p;
243
244
auto
temp_case =
casePrintStream
;
245
casePrintStream
=
UPPERCASE
;
246
while
(h.
length
-- > 1) {
247
printHex
(p, *h.
data
++);
248
p.print(
' '
);
249
}
250
printHex
(p, *h.
data
++);
251
casePrintStream
= temp_case;
252
return
p;
253
}
254
255
#ifndef ARDUINO
256
257
std::ostream &
operator<<
(std::ostream &p,
HexDump
h) {
258
if
(h.
length
== 0)
259
return
p;
260
261
auto
hex_nibble_to_char = [](uint8_t nibble) ->
char
{
262
nibble &= 0xF;
263
return
nibble > 9 ? nibble - 10 +
'A'
: nibble +
'0'
;
264
};
265
auto
printHex
= [&](std::ostream &p, uint8_t b) {
266
p << hex_nibble_to_char(b >> 4) << hex_nibble_to_char(b);
267
};
268
269
while
(h.
length
-- > 1) {
270
printHex
(p, *h.
data
++);
271
p <<
' '
;
272
}
273
printHex
(p, *h.
data
++);
274
return
p;
275
}
276
277
#endif
278
279
END_AH_NAMESPACE
280
281
// LCOV_EXCL_STOP
END_AH_NAMESPACE
#define END_AH_NAMESPACE
Definition
AH/Settings/NamespaceSettings.hpp:14
BEGIN_AH_NAMESPACE
#define BEGIN_AH_NAMESPACE
Definition
AH/Settings/NamespaceSettings.hpp:11
PrintStream.hpp
AH::operator<<
Print & operator<<(Print &printer, const __FlashStringHelper *s)
Definition
PrintStream.cpp:100
AH::hex
Print & hex(Print &printer)
Definition
PrintStream.cpp:63
AH::bin
Print & bin(Print &printer)
Definition
PrintStream.cpp:73
AH::nouppercase
Print & nouppercase(Print &printer)
Definition
PrintStream.cpp:41
AH::endl
Print & endl(Print &printer)
Definition
PrintStream.cpp:28
AH::uppercase
Print & uppercase(Print &printer)
Definition
PrintStream.cpp:36
AH::flush
Print & flush(Print &printer)
Definition
PrintStream.cpp:56
AH::showbase
Print & showbase(Print &printer)
Definition
PrintStream.cpp:46
AH::manipulator
Print & manipulator(Print &)
Definition
PrintStream.hpp:16
AH::boolalpha
Print & boolalpha(Print &printer)
Definition
PrintStream.cpp:83
AH::setbytesep
Setbytesep setbytesep(char bytesep)
Definition
PrintStream.cpp:159
AH::leadingzeros
Print & leadingzeros(Print &printer)
Definition
PrintStream.cpp:92
AH::noshowbase
Print & noshowbase(Print &printer)
Definition
PrintStream.cpp:51
AH::dec
Print & dec(Print &printer)
Definition
PrintStream.cpp:78
AH::noboolalpha
Print & noboolalpha(Print &printer)
Definition
PrintStream.cpp:87
AH::noleadingzeros
Print & noleadingzeros(Print &printer)
Definition
PrintStream.cpp:96
AH::setbase
Setbase setbase(uint8_t base)
Definition
PrintStream.cpp:153
AH::setprecision
Setprecision setprecision(int n)
Definition
PrintStream.cpp:165
AH::UPPERCASE
@ UPPERCASE
Definition
PrintStream.cpp:22
AH::LOWERCASE
@ LOWERCASE
Definition
PrintStream.cpp:22
AH::printIntegral
Print & printIntegral(Print &printer, T i)
Definition
PrintStream.cpp:227
AH::byteSeparatorPrintStream
char byteSeparatorPrintStream
Definition
PrintStream.cpp:21
AH::nibble_to_hex
static char nibble_to_hex(uint8_t nibble)
Definition
PrintStream.cpp:171
AH::printBin
void printBin(Print &printer, T val)
Definition
PrintStream.cpp:200
AH::formatPrintStream
uint8_t formatPrintStream
Definition
PrintStream.cpp:17
AH::boolalphaPrintStream
bool boolalphaPrintStream
Definition
PrintStream.cpp:18
AH::casePrintStream
enum AH::@053035214075202000142003047051144067333040041015 casePrintStream
AH::leadingZerosPrintStream
bool leadingZerosPrintStream
Definition
PrintStream.cpp:19
AH::precisionPrintStream
uint8_t precisionPrintStream
Definition
PrintStream.cpp:20
AH::printHex
void printHex(Print &printer, T val)
Definition
PrintStream.cpp:182
AH::showbasePrintStream
bool showbasePrintStream
Definition
PrintStream.cpp:23
::HexDump
Definition
PrintStream.hpp:70
AH::HexDump::data
const uint8_t * data
Definition
PrintStream.hpp:74
AH::HexDump::length
size_t length
Definition
PrintStream.hpp:75
::Setbase
Definition
PrintStream.hpp:52
AH::Setbase::M_base
uint8_t M_base
Definition
PrintStream.hpp:53
::Setbytesep
Definition
PrintStream.hpp:64
AH::Setbytesep::M_bytesep
char M_bytesep
Definition
PrintStream.hpp:65
::Setprecision
Definition
PrintStream.hpp:58
AH::Setprecision::M_n
int M_n
Definition
PrintStream.hpp:59
Generated by
1.17.0