Skip to content

Commit 4ddffe6

Browse files
committed
feat: enhance Print class with float support and printf functionality
- Add float overloads to Print::print/println - Enhance Print with printf() and vprintf() helpers Signed-off-by: Aymane Bahssain <[email protected]>
1 parent e17f3ac commit 4ddffe6

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

Print.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424

2525
#include "Print.h"
2626

27+
#ifdef ARDUINO_CORE_STM32
28+
#include <unistd.h>
29+
#include "uart.h"
30+
#if defined (VIRTIO_LOG)
31+
#include "virtio_log.h"
32+
#endif
33+
#endif
34+
2735
using namespace arduino;
2836

2937
// Public Methods //////////////////////////////////////////////////////////////
@@ -130,6 +138,11 @@ size_t Print::print(unsigned long long n, int base)
130138
else return printULLNumber(n, base);
131139
}
132140

141+
size_t Print::print(float n, int digits)
142+
{
143+
return printFloat(n, digits);
144+
}
145+
133146
size_t Print::print(double n, int digits)
134147
{
135148
return printFloat(n, digits);
@@ -222,6 +235,13 @@ size_t Print::println(unsigned long long num, int base)
222235
return n;
223236
}
224237

238+
size_t Print::println(float num, int digits)
239+
{
240+
size_t n = print(num, digits);
241+
n += println();
242+
return n;
243+
}
244+
225245
size_t Print::println(double num, int digits)
226246
{
227247
size_t n = print(num, digits);
@@ -236,6 +256,60 @@ size_t Print::println(const Printable& x)
236256
return n;
237257
}
238258

259+
#ifdef ARDUINO_CORE_STM32
260+
extern "C" {
261+
__attribute__((weak))
262+
int _write(int file, char *ptr, int len)
263+
{
264+
switch (file) {
265+
case STDOUT_FILENO:
266+
case STDERR_FILENO:
267+
/* Used for core_debug() */
268+
#if defined (VIRTIO_LOG)
269+
virtio_log((uint8_t *)ptr, (uint32_t)len);
270+
#elif defined(HAL_UART_MODULE_ENABLED) && !defined(HAL_UART_MODULE_ONLY)
271+
uart_debug_write((uint8_t *)ptr, (uint32_t)len);
272+
#endif
273+
break;
274+
case STDIN_FILENO:
275+
break;
276+
default:
277+
((class Print *)file)->write((uint8_t *)ptr, len);
278+
break;
279+
}
280+
return len;
281+
}
282+
}
283+
#endif
284+
285+
int Print::printf(const char *format, ...)
286+
{
287+
va_list ap;
288+
va_start(ap, format);
289+
int retval = vdprintf((int)this, format, ap);
290+
va_end(ap);
291+
return retval;
292+
}
293+
294+
int Print::printf(const __FlashStringHelper *format, ...)
295+
{
296+
va_list ap;
297+
va_start(ap, format);
298+
int retval = vdprintf((int)this, (const char *)format, ap);
299+
va_end(ap);
300+
return retval;
301+
}
302+
303+
int Print::vprintf(const char *format, va_list ap)
304+
{
305+
return vdprintf((int)this, format, ap);
306+
}
307+
308+
int Print::vprintf(const __FlashStringHelper *format, va_list ap)
309+
{
310+
return vdprintf((int)this, (const char *)format, ap);
311+
}
312+
239313
// Private Methods /////////////////////////////////////////////////////////////
240314

241315
size_t Print::printNumber(unsigned long n, uint8_t base)

Print.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include <inttypes.h>
2323
#include <stdio.h> // for size_t
24+
#include <stdarg.h> // for printf
2425

2526
#include "String.h"
2627
#include "Printable.h"
@@ -72,6 +73,7 @@ class Print
7273
size_t print(unsigned long, int = DEC);
7374
size_t print(long long, int = DEC);
7475
size_t print(unsigned long long, int = DEC);
76+
size_t print(float, int = 2);
7577
size_t print(double, int = 2);
7678
size_t print(const Printable&);
7779

@@ -86,10 +88,16 @@ class Print
8688
size_t println(unsigned long, int = DEC);
8789
size_t println(long long, int = DEC);
8890
size_t println(unsigned long long, int = DEC);
91+
size_t println(float, int = 2);
8992
size_t println(double, int = 2);
9093
size_t println(const Printable&);
9194
size_t println(void);
9295

96+
int printf(const char *format, ...);
97+
int printf(const __FlashStringHelper *format, ...);
98+
int vprintf(const __FlashStringHelper *format, va_list ap);
99+
int vprintf(const char *format, va_list ap);
100+
93101
virtual void flush() { /* Empty implementation for backward compatibility */ }
94102
};
95103

0 commit comments

Comments
 (0)