From bfce1fed45ece0693d2481a3da5c926c5f7cc52e Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 22 Jun 2022 10:33:20 +0200 Subject: [PATCH 1/5] Adding API to retrieve the debug level. (#24) This fixes #14. --- src/Arduino_DebugUtils.cpp | 9 +++++++++ src/Arduino_DebugUtils.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/src/Arduino_DebugUtils.cpp b/src/Arduino_DebugUtils.cpp index 7111715..c8df64d 100644 --- a/src/Arduino_DebugUtils.cpp +++ b/src/Arduino_DebugUtils.cpp @@ -47,6 +47,10 @@ void Arduino_DebugUtils::setDebugLevel(int const debug_level) { _debug_level = debug_level; } +int Arduino_DebugUtils::getDebugLevel() const { + return _debug_level; +} + void Arduino_DebugUtils::setDebugOutputStream(Stream * stream) { _debug_output_stream = stream; } @@ -142,6 +146,11 @@ bool Arduino_DebugUtils::shouldPrint(int const debug_level) const ******************************************************************************/ Arduino_DebugUtils Debug; + void setDebugMessageLevel(int const debug_level) { Debug.setDebugLevel(debug_level); } + +int getDebugMessageLevel() { + return Debug.getDebugLevel(); +} diff --git a/src/Arduino_DebugUtils.h b/src/Arduino_DebugUtils.h index b759534..af04022 100644 --- a/src/Arduino_DebugUtils.h +++ b/src/Arduino_DebugUtils.h @@ -38,6 +38,7 @@ static int const DBG_DEBUG = 3; static int const DBG_VERBOSE = 4; void setDebugMessageLevel(int const debug_level); +int getDebugMessageLevel(); /****************************************************************************** CLASS DECLARATION @@ -50,6 +51,7 @@ class Arduino_DebugUtils { Arduino_DebugUtils(); void setDebugLevel(int const debug_level); + int getDebugLevel() const; void setDebugOutputStream(Stream * stream); From 7b07264ef29537ccb1633d67792983689b1e48a1 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 22 Jun 2022 13:35:01 +0200 Subject: [PATCH 2/5] Adding note explaining that there is no printf/float support on AVR. (#26) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8f08544..bd8dcd6 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ int i = 1; float pi = 3.1459; Debug.print(DBG_VERBOSE, "i = %d, pi = %f", i, pi); ``` +**Note**: The output of floating point numbers (`%f`) does NOT work on [ArduinoCore-avr](https://github.com/arduino/ArduinoCore-avr). If desired, timestamps can be prefixed to the debug message. Timestamp output can be enabled and disabled via `timestampOn` and `timestampOff`. From c7eec9afdcdaef260c242035a23cd4bf73faeac7 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 22 Jun 2022 14:28:32 +0200 Subject: [PATCH 3/5] Provide API for printing the debug level as a string. (#27) This fixes #7. --- src/Arduino_DebugUtils.cpp | 33 +++++++++++++++++++++++++++++++++ src/Arduino_DebugUtils.h | 5 +++++ 2 files changed, 38 insertions(+) diff --git a/src/Arduino_DebugUtils.cpp b/src/Arduino_DebugUtils.cpp index c8df64d..e2818e5 100644 --- a/src/Arduino_DebugUtils.cpp +++ b/src/Arduino_DebugUtils.cpp @@ -35,6 +35,7 @@ static Stream * DEFAULT_OUTPUT_STREAM = &Serial; Arduino_DebugUtils::Arduino_DebugUtils() { timestampOff(); newlineOn(); + debugLabelOff(); setDebugLevel(DEFAULT_DEBUG_LEVEL); setDebugOutputStream(DEFAULT_OUTPUT_STREAM); } @@ -63,6 +64,14 @@ void Arduino_DebugUtils::newlineOff() { _newline_on = false; } +void Arduino_DebugUtils::debugLabelOn() { + _print_debug_label = true; +} + +void Arduino_DebugUtils::debugLabelOff() { + _print_debug_label = false; +} + void Arduino_DebugUtils::timestampOn() { _timestamp_on = true; } @@ -76,6 +85,9 @@ void Arduino_DebugUtils::print(int const debug_level, const char * fmt, ...) if (!shouldPrint(debug_level)) return; + if (_print_debug_label) + printDebugLabel(debug_level); + if (_timestamp_on) printTimestamp(); @@ -90,6 +102,9 @@ void Arduino_DebugUtils::print(int const debug_level, const __FlashStringHelper if (!shouldPrint(debug_level)) return; + if (_print_debug_label) + printDebugLabel(debug_level); + if (_timestamp_on) printTimestamp(); @@ -136,6 +151,24 @@ void Arduino_DebugUtils::printTimestamp() _debug_output_stream->print(timestamp); } +void Arduino_DebugUtils::printDebugLabel(int const debug_level) +{ + static char const * DEBUG_MODE_STRING[5] = + { + "[DBG_ERROR ] ", + "[DBG_WARNING] ", + "[DBG_INFO ] ", + "[DBG_DEBUG ] ", + "[DBG_VERBOSE] ", + }; + + bool is_valid_debug_level = (debug_level >= DBG_ERROR) && (debug_level <= DBG_VERBOSE); + if (!is_valid_debug_level) + return; + + _debug_output_stream->print(DEBUG_MODE_STRING[debug_level]); +} + bool Arduino_DebugUtils::shouldPrint(int const debug_level) const { return ((debug_level >= DBG_ERROR) && (debug_level <= DBG_VERBOSE) && (debug_level <= _debug_level)); diff --git a/src/Arduino_DebugUtils.h b/src/Arduino_DebugUtils.h index af04022..2fe7392 100644 --- a/src/Arduino_DebugUtils.h +++ b/src/Arduino_DebugUtils.h @@ -61,6 +61,9 @@ class Arduino_DebugUtils { void newlineOn(); void newlineOff(); + void debugLabelOn(); + void debugLabelOff(); + void print(int const debug_level, const char * fmt, ...); void print(int const debug_level, const __FlashStringHelper * fmt, ...); @@ -69,11 +72,13 @@ class Arduino_DebugUtils { bool _timestamp_on; bool _newline_on; + bool _print_debug_label; int _debug_level; Stream * _debug_output_stream; void vPrint(char const * fmt, va_list args); void printTimestamp(); + void printDebugLabel(int const debug_level); bool shouldPrint(int const debug_level) const; }; From 901abd1bb744c7d4c35a5b191cef9571f3f8e44f Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 23 Jun 2022 06:51:02 +0200 Subject: [PATCH 4/5] Enable conditional formatting of timestamp. (#28) This fixes #5. --- src/Arduino_DebugUtils.cpp | 44 ++++++++++++++++++++++++++++++++++++-- src/Arduino_DebugUtils.h | 4 ++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/Arduino_DebugUtils.cpp b/src/Arduino_DebugUtils.cpp index e2818e5..3ffde7b 100644 --- a/src/Arduino_DebugUtils.cpp +++ b/src/Arduino_DebugUtils.cpp @@ -36,6 +36,7 @@ Arduino_DebugUtils::Arduino_DebugUtils() { timestampOff(); newlineOn(); debugLabelOff(); + formatTimestampOff(); setDebugLevel(DEFAULT_DEBUG_LEVEL); setDebugOutputStream(DEFAULT_OUTPUT_STREAM); } @@ -72,6 +73,14 @@ void Arduino_DebugUtils::debugLabelOff() { _print_debug_label = false; } +void Arduino_DebugUtils::formatTimestampOn() { + _format_timestamp_on = true; +} + +void Arduino_DebugUtils::formatTimestampOff() { + _format_timestamp_on = false; +} + void Arduino_DebugUtils::timestampOn() { _timestamp_on = true; } @@ -146,8 +155,39 @@ void Arduino_DebugUtils::vPrint(char const * fmt, va_list args) { void Arduino_DebugUtils::printTimestamp() { - char timestamp[20]; - snprintf(timestamp, 20, "[ %lu ] ", millis()); + char timestamp[32]; + + if (_format_timestamp_on) + { + auto const msCount = millis(); + + uint16_t const milliseconds = msCount % 1000; // ms remaining when converted to seconds + uint16_t const allSeconds = msCount / 1000; // total number of seconds to calculate remaining values + + uint16_t const hours = allSeconds / 3600; // convert seconds to hours + uint16_t const secondsRemaining = allSeconds % 3600; // seconds left over + + uint16_t const minutes = secondsRemaining / 60 ; // convert seconds left over to minutes + uint16_t const seconds = secondsRemaining % 60; // seconds left over + + snprintf(timestamp, sizeof(timestamp), // "prints" formatted output to a char array (string) + "[ " + "%02d:" //HH: + "%02d:" //MM: + "%02d." //SS. + "%03d" //MMM + " ] ", + hours, + minutes, + seconds, + milliseconds + ); + } + else + { + snprintf(timestamp, sizeof(timestamp), "[ %lu ] ", millis()); + } + _debug_output_stream->print(timestamp); } diff --git a/src/Arduino_DebugUtils.h b/src/Arduino_DebugUtils.h index 2fe7392..335f1c5 100644 --- a/src/Arduino_DebugUtils.h +++ b/src/Arduino_DebugUtils.h @@ -64,6 +64,9 @@ class Arduino_DebugUtils { void debugLabelOn(); void debugLabelOff(); + void formatTimestampOn(); + void formatTimestampOff(); + void print(int const debug_level, const char * fmt, ...); void print(int const debug_level, const __FlashStringHelper * fmt, ...); @@ -73,6 +76,7 @@ class Arduino_DebugUtils { bool _timestamp_on; bool _newline_on; bool _print_debug_label; + bool _format_timestamp_on; int _debug_level; Stream * _debug_output_stream; From 8bfebae5a78f9f6e66cb6ed540aaded0c548a151 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 23 Jun 2022 06:51:51 +0200 Subject: [PATCH 5/5] Release v1.3.0. --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 8bbc786..c1099ca 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Arduino_DebugUtils -version=1.2.0 +version=1.3.0 author=Arduino maintainer=Arduino sentence=Debugging module with different debug levels, timestamps and printf-style output.