Arduino Core for STM32  1.0
Print.h
Go to the documentation of this file.
1 
37 #ifndef Print_h
38 #define Print_h
39 
40 #include <stdint.h>
41 #include <stddef.h>
42 #include <stdarg.h>
43 #include <cstring>
44 #include <type_traits>
45 #include <stdexcept>
46 
47 #include "Printable.h"
48 #include "WString.h"
49 
53 #define DEC 10
54 
58 #define HEX 16
59 
63 #define OCT 8
64 
68 #define BIN 2
69 
70 
74 #define endl "\r\n"
75 
82 #define __INTEGER_ONLY__(t, ret_type) template<typename t> typename std::enable_if_t<std::is_integral<t>::value, ret_type>
83 
89 #define __INTEGER_ONLY__R(t) __INTEGER_ONLY__(t, t)
90 
97 #define __SIGNED_INTEGER_ONLY__(t, ret_type) template<typename t> typename std::enable_if_t<std::is_integral<t>::value && std::is_signed<t>::value && !std::is_same<t, bool>::value, ret_type>
98 
105 #define __UNSIGNED_INTEGER_ONLY__(t, ret_type) template<typename t> typename std::enable_if_t<std::is_integral<t>::value && (!std::is_signed<t>::value || std::is_same<t, bool>::value), ret_type>
106 
113 #define __FLOATING_ONLY__(t, ret_type) template<typename t> typename std::enable_if_t<std::is_floating_point<t>::value, ret_type>
114 
120 #define __FLOATING_ONLY__R(t) __FLOATING_ONLY__(t, t)
121 
122 
130 class Print {
131  private:
135  int write_error = 0;
136 
143  __INTEGER_ONLY__(T, size_t) printNumber(T n, uint8_t base){
144  char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte.
145  char* str = &buf[sizeof(buf) - 1];
146 
147  *str = '\0';
148 
149  // prevent crash if called with base == 1
150  if (base < 2) {
151  base = 10;
152  }
153 
154  do {
155  auto m = n;
156  n /= base;
157  char c = m - base * n;
158 
159  *--str = c < 10 ? c + '0' : c + 'A' - 10;
160  } while (n);
161 
162  return write(str);
163  }
164 
171  __FLOATING_ONLY__(T, size_t) inline printNumber(T number, uint8_t digits){
172  char buf[40];
173  return write(ftoa(number, buf, digits));
174  }
175 
176  template<typename T, typename... P> inline size_t _println(T v, P... args){
177  size_t n = print(v, args...);
178  n += println();
179  return n;
180  }
181  protected:
187  void setWriteError(int err = 1) {
188  write_error = err;
189  }
190  public:
194  Print() {}
195 
202  return write_error;
203  }
204 
209  setWriteError(0);
210  }
211 
217  virtual size_t write(uint8_t byte) = 0;
218 
225  size_t write(const char *str) {
226  if(str == NULL)
227  return 0;
228  return write((const uint8_t *) str, strlen(str));
229  }
230 
237  virtual size_t write(const uint8_t *buffer, size_t size);
238 
245  size_t write(const char *buffer, size_t size) {
246  return write((const uint8_t *) buffer, size);
247  }
248 
255  __INTEGER_ONLY__(T, size_t) inline write(T val){ return write((uint8_t)val); }
256 
257  /*// These handle ambiguity for write(0) case, because (0) can be a pointer or an integer
258  inline size_t write(short t) { return write((uint8_t)t); }
259  inline size_t write(unsigned short t) { return write((uint8_t)t); }
260  inline size_t write(int t) { return write((uint8_t)t); }
261  inline size_t write(unsigned int t) { return write((uint8_t)t); }
262  inline size_t write(long t) { return write((uint8_t)t); }
263  inline size_t write(unsigned long t) { return write((uint8_t)t); }
264  inline size_t write(long long t) { return write((uint8_t)t); }
265  inline size_t write(unsigned long long t) { return write((uint8_t)t); }
266  // Enable write(char) to fall through to write(uint8_t)
267  inline size_t write(char c) { return write((uint8_t) c); }
268  inline size_t write(int8_t c) { return write((uint8_t) c); }*/
269 
270  // default to zero, meaning "a single write may block"
271  // should be overriden by subclasses with buffering
277  virtual int availableForWrite() { return INT16_MAX; }
278 
285  size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3)));
286 #ifdef String_class_h
287 
292  size_t print(const String &s);
293 #endif
294 
300  size_t print(const char str[]);
301 
307  size_t print(char c);
308 
315  __SIGNED_INTEGER_ONLY__(T, size_t) print(T n, int base = DEC){
316  int t = 0;
317  if (base == 10 && n < 0) {
318  t = print('-');
319  n = -n;
320  }
321  return printNumber(static_cast<typename std::make_unsigned<T>::type>(n), base) + t;
322  }
323 
330  __UNSIGNED_INTEGER_ONLY__(T, size_t) print(T n, int base = DEC){
331  if (base == 0) {
332  return write(n);
333  }
334  return printNumber(n, base);
335  }
336 
337 
344  //Removed, because constexpr is not allowed in this version of C++
345  /*__INTEGER_ONLY__(T, size_t) print(T n, int base = DEC){
346  if constexpr (std::is_signed<T>::value && !std::is_same<T, bool>::value){
347  int t = 0;
348  if (base == 10 && n < 0) {
349  t = print('-');
350  n = -n;
351  }
352  return printNumber(static_cast<typename std::make_unsigned<T>::type>(n), base) + t;
353  }
354  else{
355  if (base == 0) {
356  return write(n);
357  }
358  return printNumber(n, base);
359  }
360  }*/
361 
362  /*size_t print(unsigned char, int = DEC);
363  size_t print(int, int = DEC);
364  size_t print(unsigned int, int = DEC);
365  size_t print(long, int = DEC);
366  size_t print(unsigned long, int = DEC);
367  size_t print(long long, int = DEC);
368  size_t print(unsigned long long, int = DEC);*/
369 
376  __FLOATING_ONLY__(T, size_t) inline print(T n, int digits = 2){
377  return printNumber(n, digits);
378  }
379  //size_t print(double, int = 2);
380 
388  size_t print(const Printable& x);
389 
390 #ifdef String_class_h
391 
396  size_t println(const String &s);
397 #endif
398 
405  size_t println(const char[]);
406 
412  size_t println(char);
413 
420  __INTEGER_ONLY__(T, size_t) inline println(T n, int base = 10){
421  return _println(n, base);
422  }
423  /*size_t println(unsigned char, int = DEC);
424  size_t println(int, int = DEC);
425  size_t println(unsigned int, int = DEC);
426  size_t println(long, int = DEC);
427  size_t println(unsigned long, int = DEC);
428  size_t println(long long, int = DEC);
429  size_t println(unsigned long long, int = DEC);*/
430 
437  __FLOATING_ONLY__(T, size_t) inline println(T n, int digits = 2){
438  return _println(n, digits);
439  }
440  //template<typename T> typename std::enable_if<std::is_floating_point<T>::value, size_t>::type println(T n, int digits = 2);
441  //size_t println(double, int = 2);
442 
450  size_t println(const Printable&);
451 
456  size_t println(void);
457 
458 
466  template<class T> inline Print& operator <<(T value) { print(value); return *this; }
467 };
468 
469 
470 #endif
Print::print
size_t size_t print(const String &s)
Prints string.
Print::operator<<
Print & operator<<(T value)
This operator (<<) applied to an output stream is known as insertion operator, it can be used same as...
Definition: Print.h:466
Print::getWriteError
int getWriteError()
Gets write error.
Definition: Print.h:201
Print::write
size_t write(const char *buffer, size_t size)
Writes character array (string).
Definition: Print.h:245
Print::printf
size_t printf(const char *format,...) __attribute__((format(printf
Prints formatted data.
Definition: Print.cpp:31
Print::Print
Print()
Constructor.
Definition: Print.h:194
Print::__SIGNED_INTEGER_ONLY__
__SIGNED_INTEGER_ONLY__(T, size_t) print(T n
Converts integer number to character array and prints it.
__UNSIGNED_INTEGER_ONLY__
#define __UNSIGNED_INTEGER_ONLY__(t, ret_type)
Macro, that allows method or function to use unsigned integers only template in parameter.
Definition: Print.h:105
Print::availableForWrite
virtual int availableForWrite()
Gets how many bytes can be written, meaning "a single write may block".
Definition: Print.h:277
Printable.h
The Printable class provides a way for new classes to allow themselves to be printed....
Printable
Definition: Printable.h:33
__attribute__
void __attribute__((optimize("Ofast"))) delayMicrosecondsDWT(uint32_t microseconds)
Pauses the program for the amount of time (in microseconds) specified as parameter.
Definition: wirish.h:906
Print::clearWriteError
void clearWriteError()
Clears write error.
Definition: Print.h:208
Print::__INTEGER_ONLY__
__INTEGER_ONLY__(T, size_t) inline write(T val)
Converts integer type variable to unsigned byte and writes it.
Definition: Print.h:255
Print::println
size_t println(void)
Prints carriage return and new line.
Definition: Print.cpp:143
WString.h
Print
The stream class is derived from this class. This class contains methods, that are used for to print ...
Definition: Print.h:130
DEC
#define DEC
Decimal base macro.
Definition: Print.h:53
Print::setWriteError
void setWriteError(int err=1)
Sets write error.
Definition: Print.h:187
Print::write
size_t write(const char *str)
Writes character array (string).
Definition: Print.h:225
ftoa
std::enable_if< std::is_floating_point< T >::value, char * >::type ftoa(T f, char *buf, int precision)
Converts floating point number to char array.
Definition: ftoa.h:49