Skip to content

Commit 2b8f8ec

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 2b8f8ec

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

Print.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,13 @@
2121
#include <stdio.h>
2222
#include <string.h>
2323
#include <math.h>
24+
#include <unistd.h>
2425

2526
#include "Print.h"
27+
#include "uart.h"
28+
#if defined (VIRTIO_LOG)
29+
#include "virtio_log.h"
30+
#endif
2631

2732
using namespace arduino;
2833

@@ -130,6 +135,11 @@ size_t Print::print(unsigned long long n, int base)
130135
else return printULLNumber(n, base);
131136
}
132137

138+
size_t Print::print(float n, int digits)
139+
{
140+
return printFloat(n, digits);
141+
}
142+
133143
size_t Print::print(double n, int digits)
134144
{
135145
return printFloat(n, digits);
@@ -222,6 +232,13 @@ size_t Print::println(unsigned long long num, int base)
222232
return n;
223233
}
224234

235+
size_t Print::println(float num, int digits)
236+
{
237+
size_t n = print(num, digits);
238+
n += println();
239+
return n;
240+
}
241+
225242
size_t Print::println(double num, int digits)
226243
{
227244
size_t n = print(num, digits);
@@ -236,6 +253,58 @@ size_t Print::println(const Printable& x)
236253
return n;
237254
}
238255

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

241310
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)