diff --git a/Common.h b/Common.h index 9b28f40a..4e881f8e 100644 --- a/Common.h +++ b/Common.h @@ -36,11 +36,14 @@ typedef enum { } PinStatus; typedef enum { - INPUT = 0x0, - OUTPUT = 0x1, - INPUT_PULLUP = 0x2, - INPUT_PULLDOWN = 0x3, - OUTPUT_OPENDRAIN = 0x4, + INPUT = 0x0, + OUTPUT = 0x1, + INPUT_PULLUP = 0x2, + INPUT_FLOATING = INPUT, + INPUT_PULLDOWN = 0x3, + OUTPUT_OPENDRAIN = 0x4, + OUTPUT_OPEN_DRAIN = OUTPUT_OPENDRAIN, + INPUT_ANALOG = 0x5, } PinMode; typedef enum { @@ -93,12 +96,12 @@ typedef void (*voidFuncPtrParam)(void*); #endif /* TODO: request for removal */ -typedef bool boolean; +typedef bool boolean __attribute__((deprecated)); typedef uint8_t byte; typedef uint16_t word; void init(void); -void initVariant(void); +void initVariant(void) __attribute__((weak)); #ifndef HOST int atexit(void (*func)()) __attribute__((weak)); @@ -175,8 +178,8 @@ uint16_t makeWord(byte h, byte l); #define word(...) makeWord(__VA_ARGS__) -unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); -unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); +unsigned long pulseIn(pin_size_t pin, uint8_t state, unsigned long timeout = 1000000L); +unsigned long pulseInLong(pin_size_t pin, uint8_t state, unsigned long timeout = 1000000L); void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); void noTone(uint8_t _pin); diff --git a/Print.cpp b/Print.cpp index 4a6e942a..5c2b1141 100644 --- a/Print.cpp +++ b/Print.cpp @@ -24,6 +24,14 @@ #include "Print.h" +#ifdef ARDUINO_CORE_STM32 +#include +#include "uart.h" +#if defined (VIRTIO_LOG) + #include "virtio_log.h" +#endif +#endif + using namespace arduino; // Public Methods ////////////////////////////////////////////////////////////// @@ -130,6 +138,11 @@ size_t Print::print(unsigned long long n, int base) else return printULLNumber(n, base); } +size_t Print::print(float n, int digits) +{ + return printFloat(n, digits); +} + size_t Print::print(double n, int digits) { return printFloat(n, digits); @@ -222,6 +235,13 @@ size_t Print::println(unsigned long long num, int base) return n; } +size_t Print::println(float num, int digits) +{ + size_t n = print(num, digits); + n += println(); + return n; +} + size_t Print::println(double num, int digits) { size_t n = print(num, digits); @@ -236,6 +256,60 @@ size_t Print::println(const Printable& x) return n; } +#ifdef ARDUINO_CORE_STM32 +extern "C" { + __attribute__((weak)) + int _write(int file, char *ptr, int len) + { + switch (file) { + case STDOUT_FILENO: + case STDERR_FILENO: + /* Used for core_debug() */ +#if defined (VIRTIO_LOG) + virtio_log((uint8_t *)ptr, (uint32_t)len); +#elif defined(HAL_UART_MODULE_ENABLED) && !defined(HAL_UART_MODULE_ONLY) + uart_debug_write((uint8_t *)ptr, (uint32_t)len); +#endif + break; + case STDIN_FILENO: + break; + default: + ((class Print *)file)->write((uint8_t *)ptr, len); + break; + } + return len; + } +} +#endif + +int Print::printf(const char *format, ...) +{ + va_list ap; + va_start(ap, format); + int retval = vdprintf((int)this, format, ap); + va_end(ap); + return retval; +} + +int Print::printf(const __FlashStringHelper *format, ...) +{ + va_list ap; + va_start(ap, format); + int retval = vdprintf((int)this, (const char *)format, ap); + va_end(ap); + return retval; +} + +int Print::vprintf(const char *format, va_list ap) +{ + return vdprintf((int)this, format, ap); +} + +int Print::vprintf(const __FlashStringHelper *format, va_list ap) +{ + return vdprintf((int)this, (const char *)format, ap); +} + // Private Methods ///////////////////////////////////////////////////////////// size_t Print::printNumber(unsigned long n, uint8_t base) diff --git a/Print.h b/Print.h index 2016d7d5..0782b8ee 100644 --- a/Print.h +++ b/Print.h @@ -21,6 +21,7 @@ #include #include // for size_t +#include // for printf #include "String.h" #include "Printable.h" @@ -72,6 +73,7 @@ class Print size_t print(unsigned long, int = DEC); size_t print(long long, int = DEC); size_t print(unsigned long long, int = DEC); + size_t print(float, int = 2); size_t print(double, int = 2); size_t print(const Printable&); @@ -86,10 +88,16 @@ class Print size_t println(unsigned long, int = DEC); size_t println(long long, int = DEC); size_t println(unsigned long long, int = DEC); + size_t println(float, int = 2); size_t println(double, int = 2); size_t println(const Printable&); size_t println(void); + int printf(const char *format, ...); + int printf(const __FlashStringHelper *format, ...); + int vprintf(const __FlashStringHelper *format, va_list ap); + int vprintf(const char *format, va_list ap); + virtual void flush() { /* Empty implementation for backward compatibility */ } };