Soldered SD Card Arduino Library 1.0.0
Easily read and write files to and form the SD card breakout! A fork of the original SDFat library by Bill Greiman.
Loading...
Searching...
No Matches
BufferedPrint.h
Go to the documentation of this file.
1
25#ifndef BufferedPrint_h
26#define BufferedPrint_h
31#include "common/FmtNumber.h"
36template <typename WriteClass, uint8_t BUF_DIM> class BufferedPrint
37{
38 public:
39 BufferedPrint() : m_wr(nullptr), m_in(0)
40 {
41 }
45 explicit BufferedPrint(WriteClass *wr) : m_wr(wr), m_in(0)
46 {
47 }
51 void begin(WriteClass *wr)
52 {
53 m_wr = wr;
54 m_in = 0;
55 }
57 void flush()
58 {
59 sync();
60 }
66 size_t printField(char c, char term)
67 {
68 char buf[3];
69 char *str = buf + sizeof(buf);
70 if (term)
71 {
72 *--str = term;
73 if (term == '\n')
74 {
75 *--str = '\r';
76 }
77 }
78 *--str = c;
79 return write(str, buf + sizeof(buf) - str);
80 }
86 size_t printField(const __FlashStringHelper *fsh, char term)
87 {
88#ifdef __AVR__
89 size_t rtn = 0;
90 PGM_P p = reinterpret_cast<PGM_P>(fsh);
91 char c;
92 while ((c = pgm_read_byte(p++)))
93 {
94 if (!write(&c, 1))
95 {
96 return 0;
97 }
98 rtn++;
99 }
100 if (term)
101 {
102 char buf[2];
103 char *str = buf + sizeof(buf);
104 *--str = term;
105 if (term == '\n')
106 {
107 *--str = '\r';
108 }
109 rtn += write(str, buf + sizeof(buf) - str);
110 }
111 return rtn;
112#else // __AVR__
113 return printField(reinterpret_cast<const char *>(fsh), term);
114#endif // __AVR__
115 }
121 size_t printField(const char *str, char term)
122 {
123 size_t rtn = write(str, strlen(str));
124 if (term)
125 {
126 char buf[2];
127 char *ptr = buf + sizeof(buf);
128 *--ptr = term;
129 if (term == '\n')
130 {
131 *--ptr = '\r';
132 }
133 rtn += write(ptr, buf + sizeof(buf) - ptr);
134 }
135 return rtn;
136 }
143 size_t printField(double d, char term, uint8_t prec = 2)
144 {
145 char buf[24];
146 char *str = buf + sizeof(buf);
147 if (term)
148 {
149 *--str = term;
150 if (term == '\n')
151 {
152 *--str = '\r';
153 }
154 }
155 str = fmtDouble(str, d, prec, false);
156 return write(str, buf + sizeof(buf) - str);
157 }
164 size_t printField(float f, char term, uint8_t prec = 2)
165 {
166 return printField(static_cast<double>(f), term, prec);
167 }
173 template <typename Type> size_t printField(Type n, char term)
174 {
175 const uint8_t DIM = sizeof(Type) <= 2 ? 8 : 13;
176 char buf[DIM];
177 char *str = buf + sizeof(buf);
178
179 if (term)
180 {
181 *--str = term;
182 if (term == '\n')
183 {
184 *--str = '\r';
185 }
186 }
187 Type p = n < 0 ? -n : n;
188 if (sizeof(Type) <= 2)
189 {
190 str = fmtBase10(str, (uint16_t)p);
191 }
192 else
193 {
194 str = fmtBase10(str, (uint32_t)p);
195 }
196 if (n < 0)
197 {
198 *--str = '-';
199 }
200 return write(str, buf + sizeof(buf) - str);
201 }
205 size_t println()
206 {
207 char buf[2];
208 buf[0] = '\r';
209 buf[1] = '\n';
210 return write(buf, 2);
211 }
217 size_t print(double d, uint8_t prec = 2)
218 {
219 return printField(d, 0, prec);
220 }
226 size_t println(double d, uint8_t prec = 2)
227 {
228 return printField(d, '\n', prec);
229 }
235 size_t print(float f, uint8_t prec = 2)
236 {
237 return printField(static_cast<double>(f), 0, prec);
238 }
244 size_t println(float f, uint8_t prec)
245 {
246 return printField(static_cast<double>(f), '\n', prec);
247 }
252 template <typename Type> size_t print(Type v)
253 {
254 return printField(v, 0);
255 }
260 template <typename Type> size_t println(Type v)
261 {
262 return printField(v, '\n');
263 }
264
268 bool sync()
269 {
270 if (!m_wr || m_wr->write(m_buf, m_in) != m_in)
271 {
272 return false;
273 }
274 m_in = 0;
275 return true;
276 }
285 size_t write(const void *src, size_t n)
286 {
287 if ((m_in + n) > sizeof(m_buf))
288 {
289 if (!sync())
290 {
291 return 0;
292 }
293 if (n >= sizeof(m_buf))
294 {
295 return n == m_wr->write((const uint8_t *)src, n) ? n : 0;
296 }
297 }
298 memcpy(m_buf + m_in, src, n);
299 m_in += n;
300 return n;
301 }
302
303 private:
304 WriteClass *m_wr;
305 uint8_t m_in;
306 // Insure room for double.
307 uint8_t m_buf[BUF_DIM < 24 ? 24 : BUF_DIM]; // NOLINT
308};
309#endif // BufferedPrint_h
char * fmtDouble(char *str, double num, uint8_t prec, bool altFmt)
Definition FmtNumber.cpp:262
static const float p[]
Definition FmtNumber.cpp:461
char * fmtBase10(char *str, uint16_t n)
Definition FmtNumber.cpp:163
Fast buffered print template.
Definition BufferedPrint.h:37
WriteClass * m_wr
Definition BufferedPrint.h:304
size_t println(Type v)
Definition BufferedPrint.h:260
void begin(WriteClass *wr)
Definition BufferedPrint.h:51
uint8_t m_in
Definition BufferedPrint.h:305
bool sync()
Definition BufferedPrint.h:268
BufferedPrint()
Definition BufferedPrint.h:39
void flush()
Definition BufferedPrint.h:57
size_t printField(double d, char term, uint8_t prec=2)
Definition BufferedPrint.h:143
size_t printField(char c, char term)
Definition BufferedPrint.h:66
size_t println()
Definition BufferedPrint.h:205
size_t printField(float f, char term, uint8_t prec=2)
Definition BufferedPrint.h:164
size_t print(double d, uint8_t prec=2)
Definition BufferedPrint.h:217
uint8_t m_buf[BUF_DIM< 24 ? 24 :BUF_DIM]
Definition BufferedPrint.h:307
size_t println(double d, uint8_t prec=2)
Definition BufferedPrint.h:226
size_t write(const void *src, size_t n)
Definition BufferedPrint.h:285
size_t printField(const __FlashStringHelper *fsh, char term)
Definition BufferedPrint.h:86
size_t printField(const char *str, char term)
Definition BufferedPrint.h:121
size_t print(Type v)
Definition BufferedPrint.h:252
size_t print(float f, uint8_t prec=2)
Definition BufferedPrint.h:235
size_t printField(Type n, char term)
Definition BufferedPrint.h:173
BufferedPrint(WriteClass *wr)
Definition BufferedPrint.h:45
size_t println(float f, uint8_t prec)
Definition BufferedPrint.h:244