From b600d6127d29abbd109241506196b8f8a0c64e59 Mon Sep 17 00:00:00 2001 From: Rozhnov Alexandr Date: Thu, 7 Aug 2014 21:56:49 +0400 Subject: [PATCH 1/2] Add flash helper support. --- Logging.cpp | 190 +++++++++++++++++++++++++--------------------------- Logging.h | 47 ++++++++++--- 2 files changed, 129 insertions(+), 108 deletions(-) diff --git a/Logging.cpp b/Logging.cpp index aede239..b5e4a6c 100644 --- a/Logging.cpp +++ b/Logging.cpp @@ -1,119 +1,109 @@ #include "Logging.h" void Logging::Init(int level, long baud){ - _level = constrain(level,LOG_LEVEL_NOOUTPUT,LOG_LEVEL_VERBOSE); - _baud = baud; - Serial.begin(_baud); + _level = constrain(level,LOG_LEVEL_NOOUTPUT,LOG_LEVEL_VERBOSE); + _baud = baud; + Serial.begin(_baud); } -void Logging::Error(char* msg, ...){ - if (LOG_LEVEL_ERRORS <= _level) { - print ("ERROR: ",0); - va_list args; - va_start(args, msg); - print(msg,args); +void Logging::print(const __FlashStringHelper *format, va_list args) { + PGM_P p = reinterpret_cast(format); + char c; + for(;c != 0; c = pgm_read_byte(p++)){ + if (c == '%') { + c = pgm_read_byte(p++); + printFormat(c, args); + } else { + Serial.print(c); } -} - + } -void Logging::Info(char* msg, ...){ - if (LOG_LEVEL_INFOS <= _level) { - va_list args; - va_start(args, msg); - print(msg,args); - } } -void Logging::Debug(char* msg, ...){ - if (LOG_LEVEL_DEBUG <= _level) { - va_list args; - va_start(args, msg); - print(msg,args); +void Logging::print(const char *format, va_list args) { + for (; *format != 0; ++format) { + if (*format == '%') { + ++format; + printFormat(*format, args); + } else { + Serial.print(*format); } + } } - -void Logging::Verbose(char* msg, ...){ - if (LOG_LEVEL_VERBOSE <= _level) { - va_list args; - va_start(args, msg); - print(msg,args); +void Logging::printFormat(const char format, va_list args) { + if (format == '\0') return; + + if (format == '%') { + Serial.print(format); + return; + } + + if( format == 's' ) { + register char *s = (char *)va_arg( args, int ); + Serial.print(s); + return; + } + + if( format == 'd' || format == 'i') { + Serial.print(va_arg( args, int ),DEC); + return; + } + + if( format == 'x' ) { + Serial.print(va_arg( args, int ),HEX); + return; + } + + if( format == 'X' ) { + Serial.print("0x"); + Serial.print(va_arg( args, int ),HEX); + return; + } + + if( format == 'b' ) { + Serial.print(va_arg( args, int ),BIN); + return; + } + + if( format == 'B' ) { + Serial.print("0b"); + Serial.print(va_arg( args, int ),BIN); + return; + } + + if( format == 'l' ) { + Serial.print(va_arg( args, long ),DEC); + return; + } + + if( format == 'c' ) { + Serial.print(va_arg( args, int )); + return; + } + + if( format == 't' ) { + if (va_arg( args, int ) == 1) { + Serial.print("T"); } -} + else { + Serial.print("F"); + } + return; + } + if( format == 'T' ) { + if (va_arg( args, int ) == 1) { + Serial.print(F("true")); + } + else { + Serial.print(F("false")); + } + return; + } +} - void Logging::print(const char *format, va_list args) { - // - // loop through format string - for (; *format != 0; ++format) { - if (*format == '%') { - ++format; - if (*format == '\0') break; - if (*format == '%') { - Serial.print(*format); - continue; - } - if( *format == 's' ) { - register char *s = (char *)va_arg( args, int ); - Serial.print(s); - continue; - } - if( *format == 'd' || *format == 'i') { - Serial.print(va_arg( args, int ),DEC); - continue; - } - if( *format == 'x' ) { - Serial.print(va_arg( args, int ),HEX); - continue; - } - if( *format == 'X' ) { - Serial.print("0x"); - Serial.print(va_arg( args, int ),HEX); - continue; - } - if( *format == 'b' ) { - Serial.print(va_arg( args, int ),BIN); - continue; - } - if( *format == 'B' ) { - Serial.print("0b"); - Serial.print(va_arg( args, int ),BIN); - continue; - } - if( *format == 'l' ) { - Serial.print(va_arg( args, long ),DEC); - continue; - } - - if( *format == 'c' ) { - Serial.print(va_arg( args, int )); - continue; - } - if( *format == 't' ) { - if (va_arg( args, int ) == 1) { - Serial.print("T"); - } - else { - Serial.print("F"); - } - continue; - } - if( *format == 'T' ) { - if (va_arg( args, int ) == 1) { - Serial.print("true"); - } - else { - Serial.print("false"); - } - continue; - } - - } - Serial.print(*format); - } - } - Logging Log = Logging(); diff --git a/Logging.h b/Logging.h index 930fa1b..fd56bf2 100644 --- a/Logging.h +++ b/Logging.h @@ -95,8 +95,17 @@ class Logging { * \param ... any number of variables * \return void */ - void Error(char* msg, ...); - + + template void Error(T msg, ...){ + if (LOG_LEVEL_ERRORS <= _level) { + print (F("ERROR: "),0); + va_list args; + va_start(args, msg); + print(msg,args); + } + } + + /** * Output an info message. Output message contains * Info messages are printed out at l @@ -107,8 +116,14 @@ class Logging { * \return void */ - void Info(char* msg, ...); - + template void Info(T msg, ...){ + if (LOG_LEVEL_INFOS <= _level) { + va_list args; + va_start(args, msg); + print(msg,args); + } + } + /** * Output an debug message. Output message contains * Debug messages are printed out at l @@ -119,8 +134,16 @@ class Logging { * \return void */ - void Debug(char* msg, ...); - + + template void Debug(T msg, ...){ + if (LOG_LEVEL_DEBUG <= _level) { + va_list args; + va_start(args, msg); + print(msg,args); + } + } + + /** * Output an verbose message. Output message contains * Debug messages are printed out at l @@ -131,11 +154,19 @@ class Logging { * \return void */ - void Verbose(char* msg, ...); + template void Verbose(T msg, ...){ + if (LOG_LEVEL_VERBOSE <= _level) { + va_list args; + va_start(args, msg); + print(msg,args); + } + } + - private: void print(const char *format, va_list args); + void print(const __FlashStringHelper *format, va_list args); + void printFormat(const char format, va_list args); }; extern Logging Log; From 04d60962a730a74f8bb2f5593dcad076b7d0737b Mon Sep 17 00:00:00 2001 From: Rozhnov Alexandr Date: Fri, 8 Aug 2014 22:23:02 +0400 Subject: [PATCH 2/2] Fixed va_args --- Logging.cpp | 28 ++++++++++++++-------------- Logging.h | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Logging.cpp b/Logging.cpp index b5e4a6c..8c1e960 100644 --- a/Logging.cpp +++ b/Logging.cpp @@ -8,11 +8,11 @@ void Logging::Init(int level, long baud){ void Logging::print(const __FlashStringHelper *format, va_list args) { PGM_P p = reinterpret_cast(format); - char c; + char c = pgm_read_byte(p++); for(;c != 0; c = pgm_read_byte(p++)){ if (c == '%') { c = pgm_read_byte(p++); - printFormat(c, args); + printFormat(c, &args); } else { Serial.print(c); } @@ -24,14 +24,14 @@ void Logging::print(const char *format, va_list args) { for (; *format != 0; ++format) { if (*format == '%') { ++format; - printFormat(*format, args); + printFormat(*format, &args); } else { Serial.print(*format); } } } -void Logging::printFormat(const char format, va_list args) { +void Logging::printFormat(const char format, va_list *args) { if (format == '\0') return; if (format == '%') { @@ -40,50 +40,50 @@ void Logging::printFormat(const char format, va_list args) { } if( format == 's' ) { - register char *s = (char *)va_arg( args, int ); + register char *s = (char *)va_arg( *args, int ); Serial.print(s); return; } if( format == 'd' || format == 'i') { - Serial.print(va_arg( args, int ),DEC); + Serial.print(va_arg( *args, int ),DEC); return; } if( format == 'x' ) { - Serial.print(va_arg( args, int ),HEX); + Serial.print(va_arg( *args, int ),HEX); return; } if( format == 'X' ) { Serial.print("0x"); - Serial.print(va_arg( args, int ),HEX); + Serial.print(va_arg( *args, int ),HEX); return; } if( format == 'b' ) { - Serial.print(va_arg( args, int ),BIN); + Serial.print(va_arg( *args, int ),BIN); return; } if( format == 'B' ) { Serial.print("0b"); - Serial.print(va_arg( args, int ),BIN); + Serial.print(va_arg( *args, int ),BIN); return; } if( format == 'l' ) { - Serial.print(va_arg( args, long ),DEC); + Serial.print(va_arg( *args, long ),DEC); return; } if( format == 'c' ) { - Serial.print(va_arg( args, int )); + Serial.print(va_arg( *args, int )); return; } if( format == 't' ) { - if (va_arg( args, int ) == 1) { + if (va_arg( *args, int ) == 1) { Serial.print("T"); } else { @@ -93,7 +93,7 @@ void Logging::printFormat(const char format, va_list args) { } if( format == 'T' ) { - if (va_arg( args, int ) == 1) { + if (va_arg( *args, int ) == 1) { Serial.print(F("true")); } else { diff --git a/Logging.h b/Logging.h index fd56bf2..5efa044 100644 --- a/Logging.h +++ b/Logging.h @@ -166,7 +166,7 @@ class Logging { private: void print(const char *format, va_list args); void print(const __FlashStringHelper *format, va_list args); - void printFormat(const char format, va_list args); + void printFormat(const char format, va_list *args); }; extern Logging Log;