From 119b82a3769ca7da4280a06f9835b4833b21426f Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Wed, 22 Feb 2017 21:47:40 +0100 Subject: [PATCH 001/109] First Commit of library --- ArduinoLog.cpp | 150 ++++++ ArduinoLog.h | 214 ++++++++ Logging.cpp | 125 ----- Logging.h | 146 ------ Logging.zip | Bin 157704 -> 0 bytes Logging_WikiPage.txt | 54 -- README.md | 135 +++++ doc/doxygen_objdb_4636.tmp | 0 doc/html/_logging_8cpp-source.html | 146 ------ doc/html/_logging_8cpp.html | 57 --- doc/html/_logging_8cpp__incl.md5 | 1 - doc/html/_logging_8cpp__incl.png | Bin 7262 -> 0 bytes doc/html/_logging_8h-source.html | 77 --- doc/html/_logging_8h.html | 236 --------- doc/html/_logging_8h__dep__incl.map | 1 - doc/html/_logging_8h__dep__incl.md5 | 1 - doc/html/_logging_8h__dep__incl.png | Bin 2553 -> 0 bytes doc/html/_logging_8h__incl.map | 0 doc/html/_logging_8h__incl.md5 | 1 - doc/html/_logging_8h__incl.png | Bin 6304 -> 0 bytes doc/html/annotated.html | 32 -- doc/html/class_logging-members.html | 39 -- doc/html/class_logging.html | 450 ----------------- ...cf44ab531c72761fba811882336a2ad_cgraph.map | 1 - ...cf44ab531c72761fba811882336a2ad_cgraph.md5 | 1 - ...cf44ab531c72761fba811882336a2ad_cgraph.png | Bin 1122 -> 0 bytes ...ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.map | 1 - ...ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 | 1 - ...ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.png | Bin 1165 -> 0 bytes ...a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.map | 1 - ...a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 | 1 - ...a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.png | Bin 1102 -> 0 bytes ...0fcd9e5350d7b9158c8ae9289fef193_cgraph.map | 1 - ...0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 | 1 - ...0fcd9e5350d7b9158c8ae9289fef193_cgraph.png | Bin 1137 -> 0 bytes doc/html/classes.html | 34 -- doc/html/doxygen.css | 473 ------------------ doc/html/doxygen.png | Bin 1281 -> 0 bytes doc/html/files.html | 33 -- doc/html/ftv2blank.png | Bin 174 -> 0 bytes doc/html/ftv2doc.png | Bin 255 -> 0 bytes doc/html/ftv2folderclosed.png | Bin 259 -> 0 bytes doc/html/ftv2folderopen.png | Bin 261 -> 0 bytes doc/html/ftv2lastnode.png | Bin 233 -> 0 bytes doc/html/ftv2link.png | Bin 358 -> 0 bytes doc/html/ftv2mlastnode.png | Bin 160 -> 0 bytes doc/html/ftv2mnode.png | Bin 194 -> 0 bytes doc/html/ftv2node.png | Bin 235 -> 0 bytes doc/html/ftv2plastnode.png | Bin 165 -> 0 bytes doc/html/ftv2pnode.png | Bin 200 -> 0 bytes doc/html/ftv2vertline.png | Bin 229 -> 0 bytes doc/html/functions.html | 58 --- doc/html/functions_func.html | 54 -- doc/html/functions_vars.html | 44 -- doc/html/globals.html | 59 --- doc/html/globals_defs.html | 56 --- doc/html/globals_vars.html | 43 -- doc/html/graph_legend.dot | 23 - doc/html/graph_legend.html | 85 ---- doc/html/graph_legend.png | Bin 13795 -> 0 bytes doc/html/index.html | 11 - doc/html/main.html | 25 - doc/html/tab_b.gif | Bin 35 -> 0 bytes doc/html/tab_l.gif | Bin 706 -> 0 bytes doc/html/tab_r.gif | Bin 2585 -> 0 bytes doc/html/tabs.css | 102 ---- doc/html/tree.html | 79 --- doc/latex/FreeSans.ttf | Bin 22932 -> 0 bytes doc/latex/Makefile | 19 - doc/latex/_logging_8cpp.tex | 32 -- doc/latex/_logging_8cpp__incl.eps | 392 --------------- doc/latex/_logging_8cpp__incl.md5 | 1 - doc/latex/_logging_8cpp__incl.pdf | Bin 6916 -> 0 bytes doc/latex/_logging_8h.tex | 153 ------ doc/latex/_logging_8h__dep__incl.eps | 256 ---------- doc/latex/_logging_8h__dep__incl.md5 | 1 - doc/latex/_logging_8h__dep__incl.pdf | Bin 6265 -> 0 bytes doc/latex/_logging_8h__incl.eps | 353 ------------- doc/latex/_logging_8h__incl.md5 | 1 - doc/latex/_logging_8h__incl.pdf | Bin 6685 -> 0 bytes doc/latex/annotated.tex | 4 - doc/latex/class_logging.tex | 257 ---------- ...cf44ab531c72761fba811882336a2ad_cgraph.eps | 256 ---------- ...cf44ab531c72761fba811882336a2ad_cgraph.md5 | 1 - ...cf44ab531c72761fba811882336a2ad_cgraph.pdf | Bin 4876 -> 0 bytes ...ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.eps | 256 ---------- ...ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 | 1 - ...ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.pdf | Bin 5216 -> 0 bytes ...a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.eps | 256 ---------- ...a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 | 1 - ...a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.pdf | Bin 4908 -> 0 bytes ...0fcd9e5350d7b9158c8ae9289fef193_cgraph.eps | 256 ---------- ...0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 | 1 - ...0fcd9e5350d7b9158c8ae9289fef193_cgraph.pdf | Bin 5125 -> 0 bytes doc/latex/doxygen.sty | 78 --- doc/latex/files.tex | 5 - doc/latex/refman.tex | 59 --- examples/Log/Log.ino | 61 +++ examples/Logging_example/Logging_example.ino | 47 -- .../Logging_example/Logging_example.ino.bak | 47 -- .../Logging_example/Logging_example.ino.orig | 47 -- keywords.txt | 19 +- library.json | 26 + library.properties | 10 + 104 files changed, 608 insertions(+), 5340 deletions(-) create mode 100644 ArduinoLog.cpp create mode 100644 ArduinoLog.h delete mode 100644 Logging.cpp delete mode 100644 Logging.h delete mode 100644 Logging.zip delete mode 100644 Logging_WikiPage.txt create mode 100644 README.md delete mode 100644 doc/doxygen_objdb_4636.tmp delete mode 100644 doc/html/_logging_8cpp-source.html delete mode 100644 doc/html/_logging_8cpp.html delete mode 100644 doc/html/_logging_8cpp__incl.md5 delete mode 100644 doc/html/_logging_8cpp__incl.png delete mode 100644 doc/html/_logging_8h-source.html delete mode 100644 doc/html/_logging_8h.html delete mode 100644 doc/html/_logging_8h__dep__incl.map delete mode 100644 doc/html/_logging_8h__dep__incl.md5 delete mode 100644 doc/html/_logging_8h__dep__incl.png delete mode 100644 doc/html/_logging_8h__incl.map delete mode 100644 doc/html/_logging_8h__incl.md5 delete mode 100644 doc/html/_logging_8h__incl.png delete mode 100644 doc/html/annotated.html delete mode 100644 doc/html/class_logging-members.html delete mode 100644 doc/html/class_logging.html delete mode 100644 doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.map delete mode 100644 doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.md5 delete mode 100644 doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.png delete mode 100644 doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.map delete mode 100644 doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 delete mode 100644 doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.png delete mode 100644 doc/html/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.map delete mode 100644 doc/html/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 delete mode 100644 doc/html/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.png delete mode 100644 doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.map delete mode 100644 doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 delete mode 100644 doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.png delete mode 100644 doc/html/classes.html delete mode 100644 doc/html/doxygen.css delete mode 100644 doc/html/doxygen.png delete mode 100644 doc/html/files.html delete mode 100644 doc/html/ftv2blank.png delete mode 100644 doc/html/ftv2doc.png delete mode 100644 doc/html/ftv2folderclosed.png delete mode 100644 doc/html/ftv2folderopen.png delete mode 100644 doc/html/ftv2lastnode.png delete mode 100644 doc/html/ftv2link.png delete mode 100644 doc/html/ftv2mlastnode.png delete mode 100644 doc/html/ftv2mnode.png delete mode 100644 doc/html/ftv2node.png delete mode 100644 doc/html/ftv2plastnode.png delete mode 100644 doc/html/ftv2pnode.png delete mode 100644 doc/html/ftv2vertline.png delete mode 100644 doc/html/functions.html delete mode 100644 doc/html/functions_func.html delete mode 100644 doc/html/functions_vars.html delete mode 100644 doc/html/globals.html delete mode 100644 doc/html/globals_defs.html delete mode 100644 doc/html/globals_vars.html delete mode 100644 doc/html/graph_legend.dot delete mode 100644 doc/html/graph_legend.html delete mode 100644 doc/html/graph_legend.png delete mode 100644 doc/html/index.html delete mode 100644 doc/html/main.html delete mode 100644 doc/html/tab_b.gif delete mode 100644 doc/html/tab_l.gif delete mode 100644 doc/html/tab_r.gif delete mode 100644 doc/html/tabs.css delete mode 100644 doc/html/tree.html delete mode 100644 doc/latex/FreeSans.ttf delete mode 100644 doc/latex/Makefile delete mode 100644 doc/latex/_logging_8cpp.tex delete mode 100644 doc/latex/_logging_8cpp__incl.eps delete mode 100644 doc/latex/_logging_8cpp__incl.md5 delete mode 100644 doc/latex/_logging_8cpp__incl.pdf delete mode 100644 doc/latex/_logging_8h.tex delete mode 100644 doc/latex/_logging_8h__dep__incl.eps delete mode 100644 doc/latex/_logging_8h__dep__incl.md5 delete mode 100644 doc/latex/_logging_8h__dep__incl.pdf delete mode 100644 doc/latex/_logging_8h__incl.eps delete mode 100644 doc/latex/_logging_8h__incl.md5 delete mode 100644 doc/latex/_logging_8h__incl.pdf delete mode 100644 doc/latex/annotated.tex delete mode 100644 doc/latex/class_logging.tex delete mode 100644 doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.eps delete mode 100644 doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.md5 delete mode 100644 doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.pdf delete mode 100644 doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.eps delete mode 100644 doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 delete mode 100644 doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.pdf delete mode 100644 doc/latex/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.eps delete mode 100644 doc/latex/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 delete mode 100644 doc/latex/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.pdf delete mode 100644 doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.eps delete mode 100644 doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 delete mode 100644 doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.pdf delete mode 100644 doc/latex/doxygen.sty delete mode 100644 doc/latex/files.tex delete mode 100644 doc/latex/refman.tex create mode 100644 examples/Log/Log.ino delete mode 100644 examples/Logging_example/Logging_example.ino delete mode 100644 examples/Logging_example/Logging_example.ino.bak delete mode 100644 examples/Logging_example/Logging_example.ino.orig create mode 100644 library.json create mode 100644 library.properties diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp new file mode 100644 index 0000000..32aa4d9 --- /dev/null +++ b/ArduinoLog.cpp @@ -0,0 +1,150 @@ +/* + _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ + /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| + / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | + /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| + + Log library for Arduino + version 1.0.0 + https://github.com/thijse/Arduino-Log + +Licensed under the MIT License . + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "ArduinoLog.h" + +void Logging::begin(int level, Print* logOutput, bool showLevel){ + _level = constrain(level,LOG_LEVEL_SILENT,LOG_LEVEL_VERBOSE); + _showLevel = showLevel; + _logOutput = logOutput; +} + +void Logging::print(const __FlashStringHelper *format, va_list args) { +#ifndef DISABLE_LOGGING + PGM_P p = reinterpret_cast(format); + char c = pgm_read_byte(p++); + for(;c != 0; c = pgm_read_byte(p++)){ + if (c == '%') { + c = pgm_read_byte(p++); + printFormat(c, &args); + } else { + _logOutput->print(c); + } + } +#endif +} + +void Logging::print(const char *format, va_list args) { +#ifndef DISABLE_LOGGING + for (; *format != 0; ++format) { + if (*format == '%') { + ++format; + printFormat(*format, &args); + } else { + _logOutput->print(*format); + } + } +#endif +} + +void Logging::printFormat(const char format, va_list *args) { +#ifndef DISABLE_LOGGING + if (format == '\0') return; + + if (format == '%') { + _logOutput->print(format); + return; + } + + if( format == 's' ) { + register char *s = (char *)va_arg( *args, int ); + _logOutput->print(s); + return; + } + + if( format == 'd' || format == 'i') { + _logOutput->print(va_arg( *args, int ),DEC); + return; + } + + if( format == 'x' ) { + _logOutput->print(va_arg( *args, int ),HEX); + return; + } + + if( format == 'X' ) { + _logOutput->print("0x"); + _logOutput->print(va_arg( *args, int ),HEX); + return; + } + + if( format == 'b' ) { + _logOutput->print(va_arg( *args, int ),BIN); + return; + } + + if( format == 'B' ) { + _logOutput->print("0b"); + _logOutput->print(va_arg( *args, int ),BIN); + return; + } + + if( format == 'l' ) { + _logOutput->print(va_arg( *args, long ),DEC); + return; + } + + if( format == 'c' ) { + _logOutput->print(va_arg( *args, int )); + return; + } + + if( format == 't' ) { + if (va_arg( *args, int ) == 1) { + _logOutput->print("T"); + } + else { + _logOutput->print("F"); + } + return; + } + + if( format == 'T' ) { + if (va_arg( *args, int ) == 1) { + _logOutput->print(F("true")); + } + else { + _logOutput->print(F("false")); + } + return; + } +#endif +} + +Logging Log = Logging(); + + + + + + + + diff --git a/ArduinoLog.h b/ArduinoLog.h new file mode 100644 index 0000000..7f6d06b --- /dev/null +++ b/ArduinoLog.h @@ -0,0 +1,214 @@ +/* + _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ + /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| + / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | + /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| + + Log library for Arduino + version 1.0.0 + https://github.com/thijse/Arduino-Log + +Licensed under the MIT License . + +*/ + +#ifndef LOGGING_H +#define LOGGING_H +#include +#include +#if defined(ARDUINO) && ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +//#include +//#include +// ************************************************************************* +// Uncomment line below to fully disable logging, and reduce project size +// ************************************************************************ +//#define DISABLE_LOGGING + + +#define LOG_LEVEL_SILENT 0 +#define LOG_LEVEL_FATAL 1 +#define LOG_LEVEL_ERROR 2 +#define LOG_LEVEL_WARNING 3 +#define LOG_LEVEL_NOTICE 4 +#define LOG_LEVEL_VERBOSE 5 + +#define CR "\n" +#define LOGGING_VERSION 1_0_0 + +/*! + Logging is a helper class to output informations over + RS232. If you know log4j or log4net, this logging class + is more or less similar ;-)
+ Different loglevels can be used to extend or reduce output + All methods are able to handle any number of output parameters. + All methods print out a formated string (like printf).
+ To reduce output and program size, reduce loglevel. + + Output format string can contain below wildcards. Every wildcard + must be start with percent sign (\%) + +**** Wildcards + +* %s replace with an string (char*) +* %c replace with an character +* %d replace with an integer value +* %l replace with an long value +* %x replace and convert integer value into hex +* %X like %x but combine with 0x123AB +* %b replace and convert integer value into binary +* %B like %x but combine with 0b10100011 +* %t replace and convert boolean value into "t" or "f" +* %T like %t but convert into "true" or "false" + +**** Loglevels + +* 0 - LOG_LEVEL_SILENT no output +* 1 - LOG_LEVEL_FATAL fatal errors +* 2 - LOG_LEVEL_ERROR all errors +* 3 - LOG_LEVEL_WARNING errors, and warnings +* 4 - LOG_LEVEL_NOTICE errors, warnings and notices +* 5 - LOG_LEVEL_VERBOSE all +*/ + +class Logging { +private: + int _level; + bool _showLevel; + Print* _logOutput; +public: + /*! + * default Constructor + */ + Logging() + : _level(LOG_LEVEL_SILENT), + _showLevel(true), + _logOutput(NULL) {} + + + /** + * Initializing, must be called as first. Note that if you use + * this variant of Init, you need to initialize the baud rate + * yourself, if printer happens to be a serial port. + * \param level - logging levels <= this will be logged. + * \param printer - place that logging output will be sent to. + * \return void + * + */ + void begin(int level, Print *output, bool showLevel = true); + + /** + * Output an error message. Output message contains + * ERROR: followed by original msg + * Error messages are printed out, at every loglevel + * except 0 ;-) + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void fatal(T msg, ...){ +#ifndef DISABLE_LOGGING + if (LOG_LEVEL_FATAL <= _level) { + if (_showLevel) _logOutput->print("F: "); + va_list args; + va_start(args, msg); + print(msg,args); + } +#endif + } + + /** + * Output an error message. Output message contains + * ERROR: followed by original msg + * Error messages are printed out, at every loglevel + * except 0 ;-) + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void error(T msg, ...){ +#ifndef DISABLE_LOGGING + if (LOG_LEVEL_ERROR <= _level) { + if (_showLevel) _logOutput->print("E: "); + va_list args; + va_start(args, msg); + print(msg,args); + } +#endif + } + /** + * Output an info message. Output message contains + * Info messages are printed out at l + * loglevels >= LOG_LEVEL_INFOS + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + + template void warning(T msg, ...){ +#ifndef DISABLE_LOGGING + if (LOG_LEVEL_WARNING <= _level) { + if (_showLevel) _logOutput->print("W: "); + va_list args; + va_start(args, msg); + print(msg,args); + } +#endif + } + /** + * Output an debug message. Output message contains + * Debug messages are printed out at l + * loglevels >= LOG_LEVEL_DEBUG + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + + template void notice(T msg, ...){ +#ifndef DISABLE_LOGGING + if (LOG_LEVEL_NOTICE <= _level) { + if (_showLevel) _logOutput->print("N: "); + va_list args; + va_start(args, msg); + print(msg,args); + } +#endif + } + /** + * Output an verbose message. Output message contains + * Debug messages are printed out at l + * loglevels >= LOG_LEVEL_VERBOSE + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void verbose(T msg, ...){ +#ifndef DISABLE_LOGGING + if (LOG_LEVEL_VERBOSE <= _level) { + if (_showLevel) _logOutput->print("V: "); + va_list args; + va_start(args, msg); + print(msg,args); + } +#endif + } + +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; +#endif + + + + diff --git a/Logging.cpp b/Logging.cpp deleted file mode 100644 index aede239..0000000 --- a/Logging.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#include "Logging.h" - -void Logging::Init(int level, long 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::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::Verbose(char* msg, ...){ - if (LOG_LEVEL_VERBOSE <= _level) { - va_list args; - va_start(args, msg); - print(msg,args); - } -} - - - - 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 deleted file mode 100644 index 930fa1b..0000000 --- a/Logging.h +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef LOGGING_H -#define LOGGING_H -#include -#include -#if defined(ARDUINO) && ARDUINO >= 100 - #include "Arduino.h" -#else - #include "WProgram.h" -#endif -//#include "pins_arduino.h" -extern "C" { - #include -} - - -#define LOG_LEVEL_NOOUTPUT 0 -#define LOG_LEVEL_ERRORS 1 -#define LOG_LEVEL_INFOS 2 -#define LOG_LEVEL_DEBUG 3 -#define LOG_LEVEL_VERBOSE 4 - -// default loglevel if nothing is set from user -#define LOGLEVEL LOG_LEVEL_DEBUG - - -#define CR "\r\n" -#define LOGGING_VERSION 1 - -/*! -* Logging is a helper class to output informations over -* RS232. If you know log4j or log4net, this logging class -* is more or less similar ;-)
-* Different loglevels can be used to extend or reduce output -* All methods are able to handle any number of output parameters. -* All methods print out a formated string (like printf).
-* To reduce output and program size, reduce loglevel. -*
-* Output format string can contain below wildcards. Every wildcard -* must be start with percent sign (\%) -* -* Depending on loglevel, source code is excluded from compile !
-*
-* Wildcards
-*
    -*
  • \%s replace with an string (char*)
  • -*
  • \%c replace with an character
  • -*
  • \%d replace with an integer value
  • -*
  • \%l replace with an long value
  • -*
  • \%x replace and convert integer value into hex
  • -*
  • \%X like %x but combine with 0x123AB
  • -*
  • \%b replace and convert integer value into binary
  • -*
  • \%B like %x but combine with 0b10100011
  • -*
  • \%t replace and convert boolean value into "t" or "f"
  • -*
  • \%T like %t but convert into "true" or "false"
  • -*

-* Loglevels
-* -* -* -* -* -* -*
0LOG_LEVEL_NOOUTPUTno output
1LOG_LEVEL_ERRORSonly errors
2LOG_LEVEL_INFOSerrors and info
3LOG_LEVEL_DEBUGerrors, info and debug
4LOG_LEVEL_VERBOSEall
-*
-*

History


-* -* -* -* -*/ -class Logging { -private: - int _level; - long _baud; -public: - /*! - * default Constructor - */ - Logging(){} ; - - /** - * Initializing, must be called as first. - * \param void - * \return void - * - */ - void Init(int level, long baud); - - /** - * Output an error message. Output message contains - * ERROR: followed by original msg - * Error messages are printed out, at every loglevel - * except 0 ;-) - * \param msg format string to output - * \param ... any number of variables - * \return void - */ - void Error(char* msg, ...); - - /** - * Output an info message. Output message contains - * Info messages are printed out at l - * loglevels >= LOG_LEVEL_INFOS - * - * \param msg format string to output - * \param ... any number of variables - * \return void - */ - - void Info(char* msg, ...); - - /** - * Output an debug message. Output message contains - * Debug messages are printed out at l - * loglevels >= LOG_LEVEL_DEBUG - * - * \param msg format string to output - * \param ... any number of variables - * \return void - */ - - void Debug(char* msg, ...); - - /** - * Output an verbose message. Output message contains - * Debug messages are printed out at l - * loglevels >= LOG_LEVEL_VERBOSE - * - * \param msg format string to output - * \param ... any number of variables - * \return void - */ - - void Verbose(char* msg, ...); - - -private: - void print(const char *format, va_list args); -}; - -extern Logging Log; -#endif - - - - diff --git a/Logging.zip b/Logging.zip deleted file mode 100644 index 6978edb5da2fe3a7102a3976eb183550bc04fc0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157704 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

f>X)F&gM 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 ijY|A)Hk0FTXkJ%F0kSR-h%fNd&H%g= LOGLEVEL_ERROR || -||Info ||print messages with loglevel >= LOGLEVEL_INFO || -||Debug ||print messages with loglevel >= LOGLEVEL_DEBUG || -||Verbose ||print messages with loglevel >= LOGLEVEL_VERGBOSE || -%% diff --git a/README.md b/README.md new file mode 100644 index 0000000..7a6c3db --- /dev/null +++ b/README.md @@ -0,0 +1,135 @@ +ArduinoLog - C++ Log library for Arduino devices +==================== + +[![Build status](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/master?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/master) [![Build Status](https://travis-ci.org/bblanchon/ArduinoJson.svg?branch=master)](https://travis-ci.org/bblanchon/ArduinoJson) [![Coverage Status](https://img.shields.io/coveralls/bblanchon/ArduinoJson.svg)](https://coveralls.io/r/bblanchon/ArduinoJson?branch=master) [![Star this project](http://githubbadges.com/star.svg?user=bblanchon&repo=ArduinoJson&style=flat&color=fff&background=007ec6)](https://github.com/bblanchon/ArduinoJson) + +*An small Logging library for embedded systems.* + +It's designed to expose the main features of extensive logging libraries such as log4j, log4net & CocoaLumberjack, with a small footprint. + +## Features + +* Different log levels (Error, Info, Warn, Debug, Verbose ) +* Supports multiple variables +* Supports formatted strings +* Supports formatted strings from flash memeory +* Fixed memory allocation (zero malloc) +* MIT License + +## Tested for + +* All Arduino boards (Uno, Due, Mini, Micro, Yun...) +* ESP8266 +## Downloading + +## Downloading + +This package has not yet been published to the Arduino & PlatformIO package managers and can therefore only be downloaded from GitHub. + +- By directly loading fetching the Archive from GitHub: + 1. Go to [https://github.com/thijse/Arduino-Log](https://github.com/thijse/Arduino-Log) + 2. Click the DOWNLOAD ZIP button in the panel on the + 3. Rename the uncompressed folder **Arduino-Log-master** to **Arduino-Log**. + 4. You may need to create the libraries subfolder if its your first library. + 5. Place the **Arduino-Log** library folder in your **/libraries/** folder. + 5. Restart the IDE. + 6. For more information, [read this extended manual](http://thijs.elenbaas.net/2012/07/installing-an-arduino-library/) + + +##Quick start + +```c++ + Serial.begin(9600); + + // Initialize with log level and log output. + Log.begin(LOG_LEVEL_VERBOSE, &Serial); + Log.info ( "Log as Info with integer values : %d, %d"CR , 34, 799870); +``` + +[See JsonParserExample.ino](examples/Log/Log.ino) + +## Usage + +### Initialisation + +The log library needs to be initialized with the log level of messages to show and the log output. The latter will often be the Serial interface. +Optionally, you can indicate whether to show the log type (error, debug, etc) for each line. + +``` +begin(int level, Print* logOutput, bool showLevel) +begin(int level, Print* logOutput) +``` + +The loglevels available are + +``` +* 0 - LOG_LEVEL_NONE no output +* 1 - LOG_LEVEL_ERROR errors +* 2 - LOG_LEVEL_INFO errors and info +* 3 - LOG_LEVEL_DEBUG errors, info and debug +* 4 - LOG_LEVEL_VERBOSE all +``` + +example + +``` + Log.begin(LOG_LEVEL_ERROR, &Serial, true); +``` + +if you want to fully remove all logging code, uncomment `#define DISABLE_LOGGING` in `ArduinoLog.h`, this may significantly reduce your sketch/library size. + +### Log events + +The library allows you to log on different levels by the following functions + +``` +void error (const char *format, va_list logVariables); +void debug (const char *format, va_list logVariables); +void error (const char *format, va_list logVariables); +void verbose(const char *format, va_list logVariables); + +``` + +where the format string can be used to format the log variables + +* %s display as string (char*) +* %c display as single character +* %d display as integer value +* %l display as long value +* %x display as hexadecimal value +* %X display as hexadecimal value prefixed by `0x` +* %b display as binary number +* %B display as binary number, prefixed by `0b' +* %t display as boolean value "t" or "f" +* %T display as boolean value "true" or "false" + +The format string may come from flash memory. + +examples + +``` + Log.info ( "Log as Info with integer values : %d, %d"CR , 34, 799870); + Log.debug (F("Log as Debug with hex values from Flash : %x, %X"CR ), 24342, 25546); + Log.error (F("Log as Error with string value from Flash : %s"CR ), "value"); + Log.verbose ( "Log as Verbose with long value : %l"CR , 7979); +``` + + +## Credit + +Based on library by +* https://github.com/mrRobot62 +Bugfixes & features by +* https://github.com/rahuldeo2047 +* https://github.com/NOX73 +* https://github.com/dhylands + +## On using and modifying libraries + +- [http://www.arduino.cc/en/Main/Libraries](http://www.arduino.cc/en/Main/Libraries) +- [http://www.arduino.cc/en/Reference/Libraries](http://www.arduino.cc/en/Reference/Libraries) + +## Copyright + +CmdMessenger is provided Copyright © 2017 under MIT License. + diff --git a/doc/doxygen_objdb_4636.tmp b/doc/doxygen_objdb_4636.tmp deleted file mode 100644 index e69de29..0000000 diff --git a/doc/html/_logging_8cpp-source.html b/doc/html/_logging_8cpp-source.html deleted file mode 100644 index 475dfa4..0000000 --- a/doc/html/_logging_8cpp-source.html +++ /dev/null @@ -1,146 +0,0 @@ - - -Logging: K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.cpp Source File - - - - -

-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/_logging_8cpp.html b/doc/html/_logging_8cpp.html deleted file mode 100644 index bff159c..0000000 --- a/doc/html/_logging_8cpp.html +++ /dev/null @@ -1,57 +0,0 @@ - - -Logging: K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.cpp File Reference - - - - - -
-

K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.cpp File Reference

#include "Logging.h"
- -

-

-Include dependency graph for Logging.cpp:
-
-

-
- -

-Go to the source code of this file.

01 FEB 2012initial release
06 MAR 2012implement a preinstanciate object (like in Wire, ...)
methode init get now loglevel and baud parameter
- - - - -

Variables

Logging Log = Logging()
-

Variable Documentation

- -
-
- - - - -
Logging Log = Logging()
-
-
- -

- -

Definition at line 117 of file Logging.cpp.

- -
-

- -


Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/_logging_8cpp__incl.md5 b/doc/html/_logging_8cpp__incl.md5 deleted file mode 100644 index 42fa2fc..0000000 --- a/doc/html/_logging_8cpp__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -9bc36cc228a2c8d3e1c6ff210fc4873c \ No newline at end of file diff --git a/doc/html/_logging_8cpp__incl.png b/doc/html/_logging_8cpp__incl.png deleted file mode 100644 index 63b116e3567e025222912ecad32edb9f909ec253..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7262 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 HNyvWz6!i4% diff --git a/doc/html/_logging_8h-source.html b/doc/html/_logging_8h-source.html deleted file mode 100644 index 08f0086..0000000 --- a/doc/html/_logging_8h-source.html +++ /dev/null @@ -1,77 +0,0 @@ - - -Logging: K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.h Source File - - - - - -
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/_logging_8h.html b/doc/html/_logging_8h.html deleted file mode 100644 index e31432c..0000000 --- a/doc/html/_logging_8h.html +++ /dev/null @@ -1,236 +0,0 @@ - - -Logging: K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.h File Reference - - - - - -
-

K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.h File Reference

#include <inttypes.h>
-#include <stdarg.h>
-#include "WProgram.h"
-#include <avr/io.h>
- -

-

-Include dependency graph for Logging.h:
-
-

-
- -

-

-This graph shows which files directly or indirectly include this file:
-
-

- - -
- -

-Go to the source code of this file. - - - - - - - - - - - - - - - - - - - - - - - - -

Classes

class  Logging

Defines

#define LOG_LEVEL_NOOUTPUT   0
#define LOG_LEVEL_ERRORS   1
#define LOG_LEVEL_INFOS   2
#define LOG_LEVEL_DEBUG   3
#define LOG_LEVEL_VERBOSE   4
#define LOGLEVEL   LOG_LEVEL_DEBUG
#define CR   "\r\n"
#define LOGGING_VERSION   1

Variables

Logging Log
-


Define Documentation

- -
-
- - - - -
#define CR   "\r\n"
-
-
- -

- -

Definition at line 26 of file Logging.h.

- -
-

- -

-
- - - - -
#define LOG_LEVEL_DEBUG   3
-
-
- -

- -

Definition at line 19 of file Logging.h.

- -

Referenced by Logging::Debug().

- -
-

- -

-
- - - - -
#define LOG_LEVEL_ERRORS   1
-
-
- -

- -

Definition at line 17 of file Logging.h.

- -

Referenced by Logging::Error().

- -
-

- -

-
- - - - -
#define LOG_LEVEL_INFOS   2
-
-
- -

- -

Definition at line 18 of file Logging.h.

- -

Referenced by Logging::Info().

- -
-

- -

-
- - - - -
#define LOG_LEVEL_NOOUTPUT   0
-
-
- -

- -

Definition at line 16 of file Logging.h.

- -

Referenced by Logging::Init().

- -
-

- -

-
- - - - -
#define LOG_LEVEL_VERBOSE   4
-
-
- -

- -

Definition at line 20 of file Logging.h.

- -

Referenced by Logging::Init(), and Logging::Verbose().

- -
-

- -

-
- - - - -
#define LOGGING_VERSION   1
-
-
- -

- -

Definition at line 27 of file Logging.h.

- -
-

- -

-
- - - - -
#define LOGLEVEL   LOG_LEVEL_DEBUG
-
-
- -

- -

Definition at line 23 of file Logging.h.

- -
-

-


Variable Documentation

- -
-
- - - - -
Logging Log
-
-
- -

- -

Definition at line 117 of file Logging.cpp.

- -
-

-

-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/_logging_8h__dep__incl.map b/doc/html/_logging_8h__dep__incl.map deleted file mode 100644 index 0b98831..0000000 --- a/doc/html/_logging_8h__dep__incl.map +++ /dev/null @@ -1 +0,0 @@ - diff --git a/doc/html/_logging_8h__dep__incl.md5 b/doc/html/_logging_8h__dep__incl.md5 deleted file mode 100644 index d63556a..0000000 --- a/doc/html/_logging_8h__dep__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -f474553a6094abd8cb87cb218f448acf \ No newline at end of file diff --git a/doc/html/_logging_8h__dep__incl.png b/doc/html/_logging_8h__dep__incl.png deleted file mode 100644 index a3bb9c54da5f7153c24679b4c37bd905d46b458a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2553 zcmc(hc~H{b8pnURyrx$6x-_OzNmi0&k>M_qQtrt_i@8x^X{ni_@FpSp_8MwQ_L|CT zDQGUKfmtdpiQQ66&7~A1#Z04Aa7hzPNxXLN-1km*-nldPult;tvwWX(=A1LnIiGn_ zP)A+XYZzz%0I=T86?qH**7U6QW7qz)S}Wv_CRUrDf;?Q1z{>Z+Xe`NCRn%hKybh}g zl?>K`VLE|_`T#)vt{d{u@n7yu4MA_cJE;F`c9$?9(Hb=Ya zn!wlmYVHZLgBnXM?&M#+E^f@!0(5jd)_}GhGDFVzS{Ussgxgip1=L*mN+DXlle%mj zHD}UAWUgJ^_)kl~G11{T$1A!3@M`87?Rk#MMI=(Tu%LHW2|#7Pc=4hWb3b~trnqvD z9odm)Xm#+ro+;_C=*YDr6tIcL&U*l0&ldI7^{U#Y0H9%l0sviC1^}1_do#*;?$xZO z_-bDpa&&VcB)fjd2-?igC>XMl;mV`DBSOZ7t|UcaGS6HhC%W5kPnSZ^u2f_ z_MY@LrT*1{B*SPYejX#Jx{sa}G!+KBL@$!M1aBr4XbDX75F|neL|iQ~$a(YFk>VNl zHlna>SFqo(Z9g814u)24$OMTgSuOa@!0p4YrhnwOX_F@Keq9xL}7(0wZjt}V^>7)Pb zg(Z8KB~zd>m_=nDz$*$T3FBT~p1GXZfe%L87dpK| zF)&HMxvU90-br$J|FsCaZQ4~0ghi`OpIKQ}wMWXauEu8U+ z9T{)>%32m_rd9KATr7|3-;F1?aOmyl#0{LvxM-;{Z=H`T$Yb2u>%82dN0AZAvRO>O zKodlB?0O-+aO~g`KPh}Hb^A_!{M&p(dZiRQc->kns^kHtmn%@X!}!i0t-Cl=la@j9 zv5UCIKsENr?vja&p?FUaQ<|TpmT|N)?ZWbkGV|P+a)PVSsvX@=ckdwm^7;MWKCLLH zwWoaZs|8R3?PB}v9!hB!PbZXY3(y7yRR^-Xz6|U8m1YTcQ%cKq#s1j*XemHUcff2>O8i@g^=9{J5!!ZmA7)FHW)hkw_8m6gkgE z`^?)7T3S}*P6d&%pf?C4SFsls6O&)QpkPQAggwt}W)FFu^-@wze>**05{Vz;6To1u zJxNkRpN@AVcmjE?b|{8Z06Vr<-^TI?wc(QFlW-QWzM-PgS0b_f;@02RHF0YZN!zPb z=Dd2QCk;eN4s=Lzx0@SNF*E(H-ZI1!=mIAyWlq@Q(1pY|esiLj%?UZ_h{Q6Z@D$pu z!>^K7vj5O5>DW;7>4s)Pnu^A8QG2G@OlnMa7i+>im!*u-)HX%k4(S#-V?~0%OE--i zi95G;{j396ao(yO9~JYwF<0k9B@ZN`g0M#D-1ulqNjCZG$nu7S&gb^m zud~UYsOr!5=OGd`CMWH$IJ%q$7Q?$i0C1Z{9O9;LMa5Zd+b zUC4q=25+z;7y&}sb5#J5sGbMtZArHdAu zTtYX0@Y&=`IYNy(d2yX!s`z2~NBHru@dX5WzxIN>koCASb{$X8V-OF)Uxl^$;=-NX zn?X70lRi#V^0>Y^l4ss-qvU&-j^K`Q9n!N0 z{_1@M_Pv6@239^~uN?QXDr@LSS)5ail!=S5vOK&=M}m5rA73l}Op>*18Nkp_et2g} zO4I~-a2~Uy&`s&~f*0nj(JaNPlX~uSgN8TPk+rH;Omf1G z!h;QV*4&%vifOOv7SwQJjR)&SlT)fO_;GGX__CnJxXW1x5%*U?YnqOwNl`Y`Cy{my zX#z#vz$AF!a%S&*+ae`%3B!?@Q3i_z%e1m`WqhmIeP2_>Sl z*6+PFWG*U-a}7XKPlPWU(_vD+Ho#Yd87R8*D_>fvDbHcjCdKTxg2Q0b#kJhJr zCD$Uau;L$ljvP@!Y^nCTQhaGO+`$<{4Z?=Dt-Xor+~Ukie@IC>R^ok5o%Hg2ih5P4 zazYE%J}S&GwUz<^U_hPK=i@6^bD1A3A?us+ XKK%@on20X=?r=MN6v=Wr^XuOM(h9SM diff --git a/doc/html/_logging_8h__incl.map b/doc/html/_logging_8h__incl.map deleted file mode 100644 index e69de29..0000000 diff --git a/doc/html/_logging_8h__incl.md5 b/doc/html/_logging_8h__incl.md5 deleted file mode 100644 index 40689a5..0000000 --- a/doc/html/_logging_8h__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -a2cd343e55b11f7ce30991e2ff3c64f6 \ No newline at end of file diff --git a/doc/html/_logging_8h__incl.png b/doc/html/_logging_8h__incl.png deleted file mode 100644 index 7f150fa36be9eb8972db9f926b300a1282c2e34f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6304 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 diff --git a/doc/html/annotated.html b/doc/html/annotated.html deleted file mode 100644 index 0013253..0000000 --- a/doc/html/annotated.html +++ /dev/null @@ -1,32 +0,0 @@ - - -Logging: Class List - - - - - -
-

Class List

Here are the classes, structs, unions and interfaces with brief descriptions: - -
Logging
-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/class_logging-members.html b/doc/html/class_logging-members.html deleted file mode 100644 index b16513b..0000000 --- a/doc/html/class_logging-members.html +++ /dev/null @@ -1,39 +0,0 @@ - - -Logging: Member List - - - - - -
-

Logging Member List

This is the complete list of members for Logging, including all inherited members.

- - - - - - - - - -
_baudLogging [private]
_levelLogging [private]
Debug(char *msg,...)Logging
Error(char *msg,...)Logging
Info(char *msg,...)Logging
Init(int level, long baud)Logging
Logging()Logging [inline]
print(const char *format, va_list args)Logging [private]
Verbose(char *msg,...)Logging

-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/class_logging.html b/doc/html/class_logging.html deleted file mode 100644 index c380cc8..0000000 --- a/doc/html/class_logging.html +++ /dev/null @@ -1,450 +0,0 @@ - - -Logging: Logging Class Reference - - - - - -
-

Logging Class Reference

#include <Logging.h> -

- -

-List of all members. - - - - - - - - - - - - - - - - - - - - - - -

Public Member Functions

 Logging ()
void Init (int level, long baud)
void Error (char *msg,...)
void Info (char *msg,...)
void Debug (char *msg,...)
void Verbose (char *msg,...)

Private Member Functions

void print (const char *format, va_list args)

Private Attributes

int _level
long _baud
-


Detailed Description

-Logging is a helper class to output informations over RS232. If you know log4j or log4net, this logging class is more or less similar ;-)
- Different loglevels can be used to extend or reduce output All methods are able to handle any number of output parameters. All methods print out a formated string (like printf).
- To reduce output and program size, reduce loglevel.
- Output format string can contain below wildcards. Every wildcard must be start with percent sign (%)

-Depending on loglevel, source code is excluded from compile !
-
- Wildcards
-

    -
  • -%s replace with an string (char*)
  • -
  • -%c replace with an character
  • -
  • -%d replace with an integer value
  • -
  • -%l replace with an long value
  • -
  • -%x replace and convert integer value into hex
  • -
  • -%X like x but combine with 0x123AB
  • -
  • -%b replace and convert integer value into binary
  • -
  • -%B like x but combine with 0b10100011
  • -
  • -%t replace and convert boolean value into "t" or "f"
  • -
  • -%T like t but convert into "true" or "false"
  • -
-
- Loglevels
- - - - - - - - - - - -
0LOG_LEVEL_NOOUTPUTno output
1LOG_LEVEL_ERRORSonly errors
2LOG_LEVEL_INFOSerrors and info
3LOG_LEVEL_DEBUGerrors, info and debug
4LOG_LEVEL_VERBOSEall
-
-

History

-

-
- - - - - - - -
01 FEB 2012initial release
06 MAR 2012implement a preinstanciate object (like in Wire, ...)
methode init get now loglevel and baud parameter
- -

Definition at line 71 of file Logging.h.

-

Constructor & Destructor Documentation

- -
-
- - - - - - - - -
Logging::Logging (  )  [inline]
-
-
- -

-default Constructor -

Definition at line 79 of file Logging.h.

- -
-

-


Member Function Documentation

- -
-
- - - - - - - - - - - - - - - - - - -
void Logging::Init (int  level,
long  baud 
)
-
-
- -

-Initializing, must be called as first.

Parameters:
- - -
void 
-
-
Returns:
void
- -

Definition at line 3 of file Logging.cpp.

- -

References _baud, _level, LOG_LEVEL_NOOUTPUT, and LOG_LEVEL_VERBOSE.

- -
-

- -

-
- - - - - - - - - - - - - - - - - - -
void Logging::Error (char *  msg,
  ... 
)
-
-
- -

-Output an error message. Output message contains ERROR: followed by original msg Error messages are printed out, at every loglevel except 0 ;-)

Parameters:
- - - -
msg format string to output
... any number of variables
-
-
Returns:
void
- -

Definition at line 9 of file Logging.cpp.

- -

References _level, LOG_LEVEL_ERRORS, and print().

- -

-

-Here is the call graph for this function:
-
-

- - -
- -
-

- -

-
- - - - - - - - - - - - - - - - - - -
void Logging::Info (char *  msg,
  ... 
)
-
-
- -

-Output an info message. Output message contains Info messages are printed out at l loglevels >= LOG_LEVEL_INFOS

-

Parameters:
- - - -
msg format string to output
... any number of variables
-
-
Returns:
void
- -

Definition at line 19 of file Logging.cpp.

- -

References _level, LOG_LEVEL_INFOS, and print().

- -

-

-Here is the call graph for this function:
-
-

- - -
- -
-

- -

-
- - - - - - - - - - - - - - - - - - -
void Logging::Debug (char *  msg,
  ... 
)
-
-
- -

-Output an debug message. Output message contains Debug messages are printed out at l loglevels >= LOG_LEVEL_DEBUG

-

Parameters:
- - - -
msg format string to output
... any number of variables
-
-
Returns:
void
- -

Definition at line 27 of file Logging.cpp.

- -

References _level, LOG_LEVEL_DEBUG, and print().

- -

-

-Here is the call graph for this function:
-
-

- - -
- -
-

- -

-
- - - - - - - - - - - - - - - - - - -
void Logging::Verbose (char *  msg,
  ... 
)
-
-
- -

-Output an verbose message. Output message contains Debug messages are printed out at l loglevels >= LOG_LEVEL_VERBOSE

-

Parameters:
- - - -
msg format string to output
... any number of variables
-
-
Returns:
void
- -

Definition at line 36 of file Logging.cpp.

- -

References _level, LOG_LEVEL_VERBOSE, and print().

- -

-

-Here is the call graph for this function:
-
-

- - -
- -
-

- -

-
- - - - - - - - - - - - - - - - - - -
void Logging::print (const char *  format,
va_list  args 
) [private]
-
-
- -

- -

Definition at line 46 of file Logging.cpp.

- -

Referenced by Debug(), Error(), Info(), and Verbose().

- -
-

-


Member Data Documentation

- -
-
- - - - -
int Logging::_level [private]
-
-
- -

- -

Definition at line 73 of file Logging.h.

- -

Referenced by Debug(), Error(), Info(), Init(), and Verbose().

- -
-

- -

-
- - - - -
long Logging::_baud [private]
-
-
- -

- -

Definition at line 74 of file Logging.h.

- -

Referenced by Init().

- -
-

-


The documentation for this class was generated from the following files:
    -
  • K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.h
  • K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.cpp
-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.map b/doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.map deleted file mode 100644 index 4e7e826..0000000 --- a/doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.map +++ /dev/null @@ -1 +0,0 @@ - diff --git a/doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.md5 b/doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.md5 deleted file mode 100644 index 7cbc5c5..0000000 --- a/doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -b44edf156b3ed94fc1e1a435a07bb5dd \ No newline at end of file diff --git a/doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.png b/doc/html/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.png deleted file mode 100644 index b7a3a1c820be40e5a754363897625aad1def6108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1122 zcmV-o1fBbdP)L-{**W{UCrbS2?&72X5fKp)5fKp)5s^iX@c1Nv3uz`oi981I z(RLDD;QK3kKBD=)I-)2XJPKfZY;3HT2~h`DR#pID$#NRq8U-*8V9|CW1fcm^G;|G8 zfk3rd#q8{C&oZLU{4Egu;1z%g+er`rU|wo))69a1@`VM0h(s(9L?mK?AR-Y91QChE zPcf46JP*F_n+lhS{yfhU+tPfl1OQNw@7w8z{-RjP$5??#TUr+=3xVv+ncI~{qj0fa zKU~`0p8I7xAH%X#9Dw-w7%e2ZEf8d1y*@DPy6X9{V+EAU({BLhWvR6P?(5gN-?noj zGg4cF@I3F|pVZdcj?<>wP8wg=S5m>aQa`%fr01MdmjU&9cek)LGBWkFQkl90j2BYu zU$y;7ZP2t!ZMyBG@pXOa_H}WC@#5qoJ;#ovGJ*)M7qssOx25xCaRY+G>h}HMwsc-pZecN{ z7{Q^wZs;$?((Ol`=R};7Sf-{JzVC-#klijCM#bnRZqjo)IW{kp!a#G&83xoX*Hx31 z%GA12&U2-lg^i7ewo+?dKuOzL?cK!hByOi|#$>8MP_$xk2tz}cCyT|CS8V5^6i&oA zY_NH(b6P3faU6B8T%N|>-sexpkDovLQ#0pW7hfU{s{O)gUE&Tn6w zYk#bLTWPkV+Tsd}5oggcc)kh7ijEXyzFMtbv+;WnVXOKkR{Zn+slnf3Gl9&EAXIAv zu@9gCU{5Kv=(>1StJOXLiwBxhTfaYGlJ=NAHE=khUyND{{m78bsXbN3hLAeCp2NU}LM%C|u9@t=4g;AHg;g@pI35 zfdIlUS`!yEi$ZU#tv#s$cwsw_7h($07*qoM6N<$f{LRMSO5S3 diff --git a/doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.map b/doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.map deleted file mode 100644 index 9105e07..0000000 --- a/doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.map +++ /dev/null @@ -1 +0,0 @@ - diff --git a/doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 b/doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 deleted file mode 100644 index 4e4f608..0000000 --- a/doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -5e8a322879636277bcdb0b2b55b54b9f \ No newline at end of file diff --git a/doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.png b/doc/html/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.png deleted file mode 100644 index c1c0895ce371cccaa7ae6c3717563c62f459012c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1165 zcmV;81akX{P))7s7ytkSFG)l}RCt{2-7#n!M-&F&|J_NByBLGf z-8zIcsg0@_Y_PU;=M-w3Iz<{w5rm{u1S(niyW(f3#SMsT_7Yy zh$9Js?Q{+o?zuQQzHDZ8SG%(_d#nEgpjP!hw} z&H}jPI}r-zA%N?llc?Zs=mhA0u4DYX`i~jI1K$R)xUjHLcS01{*47pP3{Q{)C}Ej7lXkdbQ&&v0N{4$BnSYYwuX++EQsjvVzD72 zFIa4d$O{%5BJzU8hKRgyQf%Tlb`hpA{pH0k)4%VZ5m{O9mb9e5Ji+p@-uiB`BuPT2 zK#tALt(@+3^w{?Ho8JMS{}VbNhfFV=4XJ28dVt3k!ex{}k|frdNF2v3b~O+g%>(*v zzyEwMik5Cf(efEIZ=g~IUW!c|$NzrV+Fl(OX)_%kG`^{?GHl;lk?*NUoGNWo>KGs& zs^VdM1>6yUf zdHUFPU6DN$TTEMw^z6iRo|SvmbK9}2wkh>DfHzbz3jiV#iHuf8Bl$FnmVQx{o1>B3 z+10{e^>nrY%N#hG&}b*ly=sUsRIjyR5`HvaTcmT|+%KXgC@LIpWj2AC{ zJ_nq-|Loc2ziLjCDqyjx$j3}0YpHbDW;!&z8dGetenY#MJ(P`+HLEf8;d<~NBxafZ zpFaKO5ytPD4yxB%{zwGxWj#g&!~NOKV-dYM93Hv5xA)~XfbW3^K4&#q`!X&zRm;S1 zzQ^L4vtnZ!%t?}DE(0dpOpmj*6_pjk#pY_>5+|+5&%sq&TZrgTRc1xh diff --git a/doc/html/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 b/doc/html/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 deleted file mode 100644 index d8d161d..0000000 --- a/doc/html/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -2e8d61f05c7d2cc58b8f665f5d80d4de \ No newline at end of file diff --git a/doc/html/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.png b/doc/html/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.png deleted file mode 100644 index bf963efce3a24b342f4786ff2082579262f78ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102 zcmV-U1hM;xP)9)I#ue(-Q{<>?J;udL2AcB1W&I9U2qv5SL8keq*jd_PNPDA;AOl{D# zo7!~S-Nx5lOSi9!8;lnxAJcQ}Ste6};1JorAKW&b7uA`OR$M4_ItoAX7;IP-fAKW&b7u9LPVwz$E zM?<>NktvpLKk7V*IHzm5ngWD%l&DS=r;{b^hy&h{Q=^m`1^^Kp6p?GKmU`zn7vDIJ z=Z%bbj>Xi%I!08diPNci>3F^7l*v?UU>5<4N~DU>(Q{MPYVEY`T$EA=qL1l}3;-Nf z3WtVv#XKd43uTXT8Kob+vf<+|koH#L}_IqtBfGY6!on8bV06eTzFu%S& zyOQE{k}T5o(iSWtVdun&(amvD=XTSUi1jr94*T;@DSQWTS45rM*q9yL*qFJRa_3JX zkHh|fVSNoC?(`tomPULEr&Q%F&_0#(j{?V?9t7Lch(GYG7XTpH{r{x#$?Vgoo3Cx> z5L3VJr}r8o_r=2c6o82AVF4g2F%|%#5@P`%DlrxSq7q{PASyBAZNSCFMYLM2EOVh^ zIRpIprXblh3Bz|wOa)*Wz)*qyP1T@Tvzb%707*qoM6N<$g2kc&rvLx| diff --git a/doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.map b/doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.map deleted file mode 100644 index 5d4ffa6..0000000 --- a/doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.map +++ /dev/null @@ -1 +0,0 @@ - diff --git a/doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 b/doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 deleted file mode 100644 index f957c37..0000000 --- a/doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -efec75918d9cbb82f0986a019f6a914b \ No newline at end of file diff --git a/doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.png b/doc/html/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.png deleted file mode 100644 index b5c22ef2d11fd0742c298cf7639780a66caff0f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1137 zcmV-%1djWOP)yXOh4SLVJw2UwK$L^^^>x=F*l-p=8^D_DKnTF#d$Fr3P$dum z!0ha7ZqZPFrlzJaKR@p}3>#JfTy-4;0RUEX1&t!3AfkF<0wE$}Odv#Lj0uE@j4^=_ zkufU?#P@w0&6KJ?-}m=@WUWtyk~QxyiIaG=w{goX2m&Yl_`Y9Q-*wPx-8v2Ioj7#p z_p5K;mUmpoW0~qrm@cJ_M`n0#A}(Pv2!en!i%jH6DezoJLBd((& zdkRS)am#@4MW7BrS1NWogcJUy~{l0!IK`Yc%lM^N#mCud~!_-aJ!q z7&7#sD}$n3SEf47+PGEb)U^>^ikK`- z;;t<&mMqs&7ee6R-@^$2*M*QXo;R}rG@eNL>shb2{3XZkqto{AdGuIUFKN)lwW(_( zx|C2YEp%rKz68Dqb#!q=$ZNw!E+qZd5 zW8T^Mj&66+`QHO+wQgQP%x`i6fRxxB%tFK$DdpovLq6|zA1naC_V(MNXCHC<95yx{ zP1>-!XJMPQ1fqJe2SKp!)@OKth09dW)0L$a*GAF?sOp+j8?U-+i`Lg&cb1rIVKzBU%A$iYu1=aZveYw) zF>84pmqq_)8rTA`BBfaE^_JdS>|&TrPLr}|5{j#nrj0DmORAftY$#6e!c<||QnV_@ zoJ30W0X*H?!-dVwAI;6prB1K6Xft^Xqm0Xz%5b^|l6H9$Ewj;nSyeG+J@HitdGYY! zQoofw?eZpCW~2SebH0h1_f)=$1F(uQt8}~fKLYsZI*t_bem{k28>LS+rFkP65mgTp z2oV`$0wE$}Odv#Lj0uE@j4^=_kumLU+_|~ABI6)SYVxlw0pJSo?{A2ZTWt*fQ{X - -Logging: Alphabetical List - - - - - -
-

Class Index

- -
  L  
-
Logging   

-

-
Generated on Sun Feb 26 09:52:54 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css deleted file mode 100644 index 22c4843..0000000 --- a/doc/html/doxygen.css +++ /dev/null @@ -1,473 +0,0 @@ -BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { - font-family: Geneva, Arial, Helvetica, sans-serif; -} -BODY,TD { - font-size: 90%; -} -H1 { - text-align: center; - font-size: 160%; -} -H2 { - font-size: 120%; -} -H3 { - font-size: 100%; -} -CAPTION { - font-weight: bold -} -DIV.qindex { - width: 100%; - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - padding: 2px; - line-height: 140%; -} -DIV.navpath { - width: 100%; - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - padding: 2px; - line-height: 140%; -} -DIV.navtab { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} -TD.navtab { - font-size: 70%; -} -A.qindex { - text-decoration: none; - font-weight: bold; - color: #1A419D; -} -A.qindex:visited { - text-decoration: none; - font-weight: bold; - color: #1A419D -} -A.qindex:hover { - text-decoration: none; - background-color: #ddddff; -} -A.qindexHL { - text-decoration: none; - font-weight: bold; - background-color: #6666cc; - color: #ffffff; - border: 1px double #9295C2; -} -A.qindexHL:hover { - text-decoration: none; - background-color: #6666cc; - color: #ffffff; -} -A.qindexHL:visited { - text-decoration: none; - background-color: #6666cc; - color: #ffffff -} -A.el { - text-decoration: none; - font-weight: bold -} -A.elRef { - font-weight: bold -} -A.code:link { - text-decoration: none; - font-weight: normal; - color: #0000FF -} -A.code:visited { - text-decoration: none; - font-weight: normal; - color: #0000FF -} -A.codeRef:link { - font-weight: normal; - color: #0000FF -} -A.codeRef:visited { - font-weight: normal; - color: #0000FF -} -A:hover { - text-decoration: none; - background-color: #f2f2ff -} -DL.el { - margin-left: -1cm -} -.fragment { - font-family: monospace, fixed; - font-size: 95%; -} -PRE.fragment { - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - margin-top: 4px; - margin-bottom: 4px; - margin-left: 2px; - margin-right: 8px; - padding-left: 6px; - padding-right: 6px; - padding-top: 4px; - padding-bottom: 4px; -} -DIV.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px -} - -DIV.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; -} -DIV.groupText { - margin-left: 16px; - font-style: italic; - font-size: 90% -} -BODY { - background: white; - color: black; - margin-right: 20px; - margin-left: 20px; -} -TD.indexkey { - background-color: #e8eef2; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px; - border: 1px solid #CCCCCC; -} -TD.indexvalue { - background-color: #e8eef2; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px; - border: 1px solid #CCCCCC; -} -TR.memlist { - background-color: #f0f0f0; -} -P.formulaDsp { - text-align: center; -} -IMG.formulaDsp { -} -IMG.formulaInl { - vertical-align: middle; -} -SPAN.keyword { color: #008000 } -SPAN.keywordtype { color: #604020 } -SPAN.keywordflow { color: #e08000 } -SPAN.comment { color: #800000 } -SPAN.preprocessor { color: #806020 } -SPAN.stringliteral { color: #002080 } -SPAN.charliteral { color: #008080 } -SPAN.vhdldigit { color: #ff00ff } -SPAN.vhdlchar { color: #000000 } -SPAN.vhdlkeyword { color: #700070 } -SPAN.vhdllogic { color: #ff0000 } - -.mdescLeft { - padding: 0px 8px 4px 8px; - font-size: 80%; - font-style: italic; - background-color: #FAFAFA; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; -} -.mdescRight { - padding: 0px 8px 4px 8px; - font-size: 80%; - font-style: italic; - background-color: #FAFAFA; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; -} -.memItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; -} -.memItemRight { - padding: 1px 8px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; -} -.memTemplItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: none; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; -} -.memTemplItemRight { - padding: 1px 8px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: none; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; -} -.memTemplParams { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - color: #606060; - background-color: #FAFAFA; - font-size: 80%; -} -.search { - color: #003399; - font-weight: bold; -} -FORM.search { - margin-bottom: 0px; - margin-top: 0px; -} -INPUT.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -TD.tiny { - font-size: 75%; -} -a { - color: #1A41A8; -} -a:visited { - color: #2A3798; -} -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #84b0c7; -} -TH.dirtab { - background: #e8eef2; - font-weight: bold; -} -HR { - height: 1px; - border: none; - border-top: 1px solid black; -} - -/* Style for detailed member documentation */ -.memtemplate { - font-size: 80%; - color: #606060; - font-weight: normal; - margin-left: 3px; -} -.memnav { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} -.memitem { - padding: 4px; - background-color: #eef3f5; - border-width: 1px; - border-style: solid; - border-color: #dedeee; - -moz-border-radius: 8px 8px 8px 8px; -} -.memname { - white-space: nowrap; - font-weight: bold; -} -.memdoc{ - padding-left: 10px; -} -.memproto { - background-color: #d5e1e8; - width: 100%; - border-width: 1px; - border-style: solid; - border-color: #84b0c7; - font-weight: bold; - -moz-border-radius: 8px 8px 8px 8px; -} -.paramkey { - text-align: right; -} -.paramtype { - white-space: nowrap; -} -.paramname { - color: #602020; - font-style: italic; - white-space: nowrap; -} -/* End Styling for detailed member documentation */ - -/* for the tree view */ -.ftvtree { - font-family: sans-serif; - margin:0.5em; -} -/* these are for tree view when used as main index */ -.directory { - font-size: 9pt; - font-weight: bold; -} -.directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -/* The following two styles can be used to replace the root node title */ -/* with an image of your choice. Simply uncomment the next two styles, */ -/* specify the name of your image and be sure to set 'height' to the */ -/* proper pixel height of your image. */ - -/* .directory h3.swap { */ -/* height: 61px; */ -/* background-repeat: no-repeat; */ -/* background-image: url("yourimage.gif"); */ -/* } */ -/* .directory h3.swap span { */ -/* display: none; */ -/* } */ - -.directory > h3 { - margin-top: 0; -} -.directory p { - margin: 0px; - white-space: nowrap; -} -.directory div { - display: none; - margin: 0px; -} -.directory img { - vertical-align: -30%; -} -/* these are for tree view when not used as main index */ -.directory-alt { - font-size: 100%; - font-weight: bold; -} -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} -.directory-alt > h3 { - margin-top: 0; -} -.directory-alt p { - margin: 0px; - white-space: nowrap; -} -.directory-alt div { - display: none; - margin: 0px; -} -.directory-alt img { - vertical-align: -30%; -} - diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} diff --git a/doc/html/files.html b/doc/html/files.html deleted file mode 100644 index 57e8865..0000000 --- a/doc/html/files.html +++ /dev/null @@ -1,33 +0,0 @@ - - -Logging: File Index - - - - - -
-

File List

Here is a list of all files with brief descriptions: - - -
K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.cpp [code]
K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.h [code]
-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/ftv2blank.png b/doc/html/ftv2blank.png deleted file mode 100644 index 493c3c0b615ade5b22027bde773faf2c0e076d66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr2qYM%T@!Q%(o7{me!&ckj8p!u14)&*MwA5S zr6z#mEsk^N1FBF3sc_EE%}vcKVF=AhO-xa6_jFST&P^;T z2~I3aEm8;rVk12R#UIz>f`J-DJY5_^DsClP9B62eH+WF*G=YJMp~A-KbWwke5Kx}M M)78&qol`;+0EL(^EC2ui diff --git a/doc/html/ftv2doc.png b/doc/html/ftv2doc.png deleted file mode 100644 index f72999f92172cca6edaa2538286b3e369bec9f49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^5yjnX4egh%q=bp-`Pe zR7&bp17l3gfhmh7Fm(iZ2eAfco|q!h5)>qKG?UBh!IC9QGMbJAHf6IEiufk_g|d7~ qkWqJ4k(|I-Aeo-5U~n{Fnc?dN!3Uwu?t6hQVDNPHb6Mw<&;$TLIZ`G7 diff --git a/doc/html/ftv2folderclosed.png b/doc/html/ftv2folderclosed.png deleted file mode 100644 index d6d063440cbf13c4128dacd96661b6fce58abf26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^55uo^`BphW;jCHO69?}tw{JfcdnZ<*@N=4I z?xF5Qc|QYEmKAIZ;JRGVHe=bn*tx1_|J^^vyg*oVM#A1kZlFULJYD@<);T3K0RTgB BWg7qh diff --git a/doc/html/ftv2folderopen.png b/doc/html/ftv2folderopen.png deleted file mode 100644 index bbe2c913cf493ee37ad8e3a5132382138d93ac92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^5u(C zYP)Mg%H-DB+{J~>rPn_#pYTax?r*V6ubqGX{lvROQ{?n5_cbm+cQAOm`njxgN@xNA D92;js diff --git a/doc/html/ftv2lastnode.png b/doc/html/ftv2lastnode.png deleted file mode 100644 index e7b9ba90cb0cf71c8ce662956bfee7d64cf60fa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!py+H=+kU?6UZ?L@CkAK|NlRbNhD}!Xpp$P zU;Pg)ksC(lf|p%(p+w2Gk+!>EaktaVt4N i!r*{E4>QXNV>t$uAA#a^n)TVt_DW*G8-srQl%FeIsRSdYm zeDdtWec}u&7@8h5rqv#p7g*pRdwwmugmlS-+cHV~j}#7`Nwj9m+AU)JGGo`8z_}`K z?s#Xsy%Z;1_jl5Y+?Gum8WyK6`MBvup0SAOKJ)mWcHyteJ?WLL>>-)=?&<$H&t5oH Vd!azZ1yDdSc)I$ztaD0e0sw}(dc*(# diff --git a/doc/html/ftv2mlastnode.png b/doc/html/ftv2mlastnode.png deleted file mode 100644 index 09ceb6adb01054ce799ad20c0e818ab9272f2df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr#LU3Jc=+&fg$isFPOjJ*AaIJQGm()YSDb0rfjgNefXW#>UHx3vIVCg! E0ORy6RsaA1 diff --git a/doc/html/ftv2mnode.png b/doc/html/ftv2mnode.png deleted file mode 100644 index 3254c05112199fbc80aad313611c58a5b388792d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!py+H=+kU?6Ub2s@Ck7}aNq!ti3c<^Gz9OH zn+a6GSQ6wH%;50sMjDVKR^l2_5}cn_Ql40p%8;I!W>k=uu3)5RqGz-?&YcgaLd(;| zF{I*Fa>4?=2W(CyOv{5p*uLi}G<-ambjQcb>&~4!CzK3KXWY6d$*{eWU47N}X+XCz OFnGH9xvXPg)ksC(lf|p%(p+w2Gk+y>EaktaVt4N l!r*{E4>Lv;t diff --git a/doc/html/ftv2plastnode.png b/doc/html/ftv2plastnode.png deleted file mode 100644 index 0b07e00913d8069ebbb51bd7fd6d70d8bba88f75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr#LU3Jc=+&MJ diff --git a/doc/html/ftv2pnode.png b/doc/html/ftv2pnode.png deleted file mode 100644 index 2001b797ba2b98a4127f1d3efca64aef08bf6d51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!py+H=+kU?6Ub2s@Ck7}aNq!ti3c<^Gz9OH zn+a6GSQ6wH%;50sMjDVKR^l2_5}cn_Ql40p%8;I!W>k=uu3)5RqGz-?&Ycga!obtT zF{I*Fa>4?=2W(Dkd1@Anj~<0|oqBMOmqox%*rjK-r)THv+0v0L%h-agt(X~hWwYzA SIxU|Ma*U^|pUXO@geCywmoZiV diff --git a/doc/html/ftv2vertline.png b/doc/html/ftv2vertline.png deleted file mode 100644 index b330f3a33c0085c183ff39fc56b1b274160c1da0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!py+H=+kU?6UZ?L@CkAK|NlRbNhD}!Xpp$P zU;Pg)ksC(lf|p%(p+w2Gqgt>EaktaVt4N e!r*{^G#i7W2*a|cHZQDzQVgE1elF{r5}E+)J2fZ( diff --git a/doc/html/functions.html b/doc/html/functions.html deleted file mode 100644 index eb64096..0000000 --- a/doc/html/functions.html +++ /dev/null @@ -1,58 +0,0 @@ - - -Logging: Class Members - - - - - -
-Here is a list of all class members with links to the classes they belong to: -

-

-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html deleted file mode 100644 index ef1ead3..0000000 --- a/doc/html/functions_func.html +++ /dev/null @@ -1,54 +0,0 @@ - - -Logging: Class Members - Functions - - - - - -
-  -

-

-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html deleted file mode 100644 index 99826ae..0000000 --- a/doc/html/functions_vars.html +++ /dev/null @@ -1,44 +0,0 @@ - - -Logging: Class Members - Variables - - - - - -
-  -

-

-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/globals.html b/doc/html/globals.html deleted file mode 100644 index bfbd518..0000000 --- a/doc/html/globals.html +++ /dev/null @@ -1,59 +0,0 @@ - - -Logging: Class Members - - - - - -
-Here is a list of all file members with links to the files they belong to: -

-

-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/globals_defs.html b/doc/html/globals_defs.html deleted file mode 100644 index d80de84..0000000 --- a/doc/html/globals_defs.html +++ /dev/null @@ -1,56 +0,0 @@ - - -Logging: Class Members - - - - - -
-  -

-

-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/globals_vars.html b/doc/html/globals_vars.html deleted file mode 100644 index f88a79f..0000000 --- a/doc/html/globals_vars.html +++ /dev/null @@ -1,43 +0,0 @@ - - -Logging: Class Members - - - - - -
-  -

-

-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/graph_legend.dot b/doc/html/graph_legend.dot deleted file mode 100644 index 1f7c6e4..0000000 --- a/doc/html/graph_legend.dot +++ /dev/null @@ -1,23 +0,0 @@ -digraph G -{ - bgcolor="transparent"; - edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10]; - node [fontname="FreeSans",fontsize=10,shape=record]; - Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; - Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; - Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"]; - Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; - Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"]; - Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; - Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; - Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"]; - Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"]; - Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; -} diff --git a/doc/html/graph_legend.html b/doc/html/graph_legend.html deleted file mode 100644 index 79fdf29..0000000 --- a/doc/html/graph_legend.html +++ /dev/null @@ -1,85 +0,0 @@ - - -Logging: Graph Legend - - - - - -
-

Graph Legend

This page explains how to interpret the graphs that are generated by doxygen.

-Consider the following example:

/*! Invisible class because of truncation */
-class Invisible { };
-
-/*! Truncated class, inheritance relation is hidden */
-class Truncated : public Invisible { };
-
-/* Class not documented with doxygen comments */
-class Undocumented { };
-
-/*! Class that is inherited using public inheritance */
-class PublicBase : public Truncated { };
-
-/*! A template class */
-template<class T> class Templ { };
-
-/*! Class that is inherited using protected inheritance */
-class ProtectedBase { };
-
-/*! Class that is inherited using private inheritance */
-class PrivateBase { };
-
-/*! Class that is used by the Inherited class */
-class Used { };
-
-/*! Super class that inherits a number of other classes */
-class Inherited : public PublicBase,
-                  protected ProtectedBase,
-                  private PrivateBase,
-                  public Undocumented,
-                  public Templ<int>
-{
-  private:
-    Used *m_usedClass;
-};
-
If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

-

-graph_legend.png -
-

-The boxes in the above graph have the following meaning:

    -
  • -A filled gray box represents the struct or class for which the graph is generated.
  • -
  • -A box with a black border denotes a documented struct or class.
  • -
  • -A box with a grey border denotes an undocumented struct or class.
  • -
  • -A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • -
-The arrows have the following meaning:
    -
  • -A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • -
  • -A dark green arrow is used for protected inheritance.
  • -
  • -A dark red arrow is used for private inheritance.
  • -
  • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • -
  • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
  • -
-
-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/graph_legend.png b/doc/html/graph_legend.png deleted file mode 100644 index 1f49d7ff0a6258a9d83294790157822b8376f8db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13795 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 PXaNdxs)#Zf)4=}$Bd#v3 diff --git a/doc/html/index.html b/doc/html/index.html deleted file mode 100644 index ea2faa4..0000000 --- a/doc/html/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - -Logging - - - - - <a href="main.html">Frames are disabled. Click here to go to the main page.</a> - - - diff --git a/doc/html/main.html b/doc/html/main.html deleted file mode 100644 index c722324..0000000 --- a/doc/html/main.html +++ /dev/null @@ -1,25 +0,0 @@ - - -Logging: Main Page - - - - - -
-

Logging Documentation

-

-

-
Generated on Tue Mar 6 20:17:24 2012 for Logging by  - -doxygen 1.5.6
- - diff --git a/doc/html/tab_b.gif b/doc/html/tab_b.gif deleted file mode 100644 index 0d623483ffdf5f9f96900108042a7ab0643fe2a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H diff --git a/doc/html/tab_l.gif b/doc/html/tab_l.gif deleted file mode 100644 index 9b1e6337c9299a700401a2a78a2c6ffced475216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI diff --git a/doc/html/tab_r.gif b/doc/html/tab_r.gif deleted file mode 100644 index ce9dd9f533cb5486d6941844f442b59d4a9e9175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo diff --git a/doc/html/tabs.css b/doc/html/tabs.css deleted file mode 100644 index 95f00a9..0000000 --- a/doc/html/tabs.css +++ /dev/null @@ -1,102 +0,0 @@ -/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ - -DIV.tabs -{ - float : left; - width : 100%; - background : url("tab_b.gif") repeat-x bottom; - margin-bottom : 4px; -} - -DIV.tabs UL -{ - margin : 0px; - padding-left : 10px; - list-style : none; -} - -DIV.tabs LI, DIV.tabs FORM -{ - display : inline; - margin : 0px; - padding : 0px; -} - -DIV.tabs FORM -{ - float : right; -} - -DIV.tabs A -{ - float : left; - background : url("tab_r.gif") no-repeat right top; - border-bottom : 1px solid #84B0C7; - font-size : x-small; - font-weight : bold; - text-decoration : none; -} - -DIV.tabs A:hover -{ - background-position: 100% -150px; -} - -DIV.tabs A:link, DIV.tabs A:visited, -DIV.tabs A:active, DIV.tabs A:hover -{ - color: #1A419D; -} - -DIV.tabs SPAN -{ - float : left; - display : block; - background : url("tab_l.gif") no-repeat left top; - padding : 5px 9px; - white-space : nowrap; -} - -DIV.tabs INPUT -{ - float : right; - display : inline; - font-size : 1em; -} - -DIV.tabs TD -{ - font-size : x-small; - font-weight : bold; - text-decoration : none; -} - - - -/* Commented Backslash Hack hides rule from IE5-Mac \*/ -DIV.tabs SPAN {float : none;} -/* End IE5-Mac hack */ - -DIV.tabs A:hover SPAN -{ - background-position: 0% -150px; -} - -DIV.tabs LI.current A -{ - background-position: 100% -150px; - border-width : 0px; -} - -DIV.tabs LI.current SPAN -{ - background-position: 0% -150px; - padding-bottom : 6px; -} - -DIV.navpath -{ - background : none; - border : none; - border-bottom : 1px solid #84B0C7; -} diff --git a/doc/html/tree.html b/doc/html/tree.html deleted file mode 100644 index a886f2c..0000000 --- a/doc/html/tree.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - TreeView - - - - - - diff --git a/doc/latex/FreeSans.ttf b/doc/latex/FreeSans.ttf deleted file mode 100644 index b550b90ba5480f9a3db170a19a1f86daecb0dc92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22932 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 RlllN>Fk>(~eFPlj{{dxA`xyWL diff --git a/doc/latex/Makefile b/doc/latex/Makefile deleted file mode 100644 index 8b7c89a..0000000 --- a/doc/latex/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -all: clean refman.pdf - -pdf: refman.pdf - -refman.pdf: refman.tex - pdflatex refman.tex - makeindex refman.idx - pdflatex refman.tex - latex_count=5 ; \ - while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ - do \ - echo "Rerunning latex...." ;\ - pdflatex refman.tex ;\ - latex_count=`expr $$latex_count - 1` ;\ - done - - -clean: - rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf diff --git a/doc/latex/_logging_8cpp.tex b/doc/latex/_logging_8cpp.tex deleted file mode 100644 index 3cd3691..0000000 --- a/doc/latex/_logging_8cpp.tex +++ /dev/null @@ -1,32 +0,0 @@ -\hypertarget{_logging_8cpp}{ -\section{K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/Logging.cpp File Reference} -\label{_logging_8cpp}\index{K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/Logging.cpp@{K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/Logging.cpp}} -} -{\tt \#include \char`\"{}Logging.h\char`\"{}}\par - - -Include dependency graph for Logging.cpp:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=192pt]{_logging_8cpp__incl} -\end{center} -\end{figure} -\subsection*{Variables} -\begin{CompactItemize} -\item -\hyperlink{class_logging}{Logging} \hyperlink{_logging_8cpp_f8164407f3289dde66d36070af4244c1}{Log} = \hyperlink{class_logging}{Logging}() -\end{CompactItemize} - - -\subsection{Variable Documentation} -\hypertarget{_logging_8cpp_f8164407f3289dde66d36070af4244c1}{ -\index{Logging.cpp@{Logging.cpp}!Log@{Log}} -\index{Log@{Log}!Logging.cpp@{Logging.cpp}} -\subsubsection[Log]{\setlength{\rightskip}{0pt plus 5cm}{\bf Logging} {\bf Log} = {\bf Logging}()}} -\label{_logging_8cpp_f8164407f3289dde66d36070af4244c1} - - - - -Definition at line 117 of file Logging.cpp. \ No newline at end of file diff --git a/doc/latex/_logging_8cpp__incl.eps b/doc/latex/_logging_8cpp__incl.eps deleted file mode 100644 index a3288ae..0000000 --- a/doc/latex/_logging_8cpp__incl.eps +++ /dev/null @@ -1,392 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: graphviz version 2.26.3 (20100126.1600) -%%Title: G -%%Pages: (atend) -%%BoundingBox: (atend) -%%EndComments -save -%%BeginProlog -/DotDict 200 dict def -DotDict begin - -/setupLatin1 { -mark -/EncodingVector 256 array def - EncodingVector 0 - -ISOLatin1Encoding 0 255 getinterval putinterval -EncodingVector 45 /hyphen put - -% Set up ISO Latin 1 character encoding -/starnetISO { - dup dup findfont dup length dict begin - { 1 index /FID ne { def }{ pop pop } ifelse - } forall - /Encoding EncodingVector def - currentdict end definefont -} def -/Times-Roman starnetISO def -/Times-Italic starnetISO def -/Times-Bold starnetISO def -/Times-BoldItalic starnetISO def -/Helvetica starnetISO def -/Helvetica-Oblique starnetISO def -/Helvetica-Bold starnetISO def -/Helvetica-BoldOblique starnetISO def -/Courier starnetISO def -/Courier-Oblique starnetISO def -/Courier-Bold starnetISO def -/Courier-BoldOblique starnetISO def -cleartomark -} bind def - -%%BeginResource: procset graphviz 0 0 -/coord-font-family /Times-Roman def -/default-font-family /Times-Roman def -/coordfont coord-font-family findfont 8 scalefont def - -/InvScaleFactor 1.0 def -/set_scale { - dup 1 exch div /InvScaleFactor exch def - scale -} bind def - -% styles -/solid { [] 0 setdash } bind def -/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def -/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def -/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def -/bold { 2 setlinewidth } bind def -/filled { } bind def -/unfilled { } bind def -/rounded { } bind def -/diagonals { } bind def - -% hooks for setting color -/nodecolor { sethsbcolor } bind def -/edgecolor { sethsbcolor } bind def -/graphcolor { sethsbcolor } bind def -/nopcolor {pop pop pop} bind def - -/beginpage { % i j npages - /npages exch def - /j exch def - /i exch def - /str 10 string def - npages 1 gt { - gsave - coordfont setfont - 0 0 moveto - (\() show i str cvs show (,) show j str cvs show (\)) show - grestore - } if -} bind def - -/set_font { - findfont exch - scalefont setfont -} def - -% draw text fitted to its expected width -/alignedtext { % width text - /text exch def - /width exch def - gsave - width 0 gt { - [] 0 setdash - text stringwidth pop width exch sub text length div 0 text ashow - } if - grestore -} def - -/boxprim { % xcorner ycorner xsize ysize - 4 2 roll - moveto - 2 copy - exch 0 rlineto - 0 exch rlineto - pop neg 0 rlineto - closepath -} bind def - -/ellipse_path { - /ry exch def - /rx exch def - /y exch def - /x exch def - matrix currentmatrix - newpath - x y translate - rx ry scale - 0 0 1 0 360 arc - setmatrix -} bind def - -/endpage { showpage } bind def -/showpage { } def - -/layercolorseq - [ % layer color sequence - darkest to lightest - [0 0 0] - [.2 .8 .8] - [.4 .8 .8] - [.6 .8 .8] - [.8 .8 .8] - ] -def - -/layerlen layercolorseq length def - -/setlayer {/maxlayer exch def /curlayer exch def - layercolorseq curlayer 1 sub layerlen mod get - aload pop sethsbcolor - /nodecolor {nopcolor} def - /edgecolor {nopcolor} def - /graphcolor {nopcolor} def -} bind def - -/onlayer { curlayer ne {invis} if } def - -/onlayers { - /myupper exch def - /mylower exch def - curlayer mylower lt - curlayer myupper gt - or - {invis} if -} def - -/curlayer 0 def - -%%EndResource -%%EndProlog -%%BeginSetup -14 default-font-family set_font -1 setmiterlimit -% /arrowlength 10 def -% /arrowwidth 5 def - -% make sure pdfmark is harmless for PS-interpreters other than Distiller -/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse -% make '<<' and '>>' safe on PS Level 1 devices -/languagelevel where {pop languagelevel}{1} ifelse -2 lt { - userdict (<<) cvn ([) cvn load put - userdict (>>) cvn ([) cvn load put -} if - -%%EndSetup -setupLatin1 -%%Page: 1 1 -%%PageBoundingBox: 36 36 384 182 -%%PageOrientation: Portrait -0 0 1 beginpage -gsave -36 36 348 146 boxprim clip newpath -1 1 set_scale 0 rotate 40 41 translate -% Node1 -gsave -0 0 0.74902 nodecolor -newpath 0 116.5 moveto -0 137.5 lineto -340 137.5 lineto -340 116.5 lineto -closepath fill -1 setlinewidth -filled -0 0 0 nodecolor -newpath 0 116.5 moveto -0 137.5 lineto -340 137.5 lineto -340 116.5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -8 124.5 moveto 324 (K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.cpp) alignedtext -grestore -% Node2 -gsave -[ /Rect [ 141 58 199 80 ] - /Border [ 0 0 0 ] - /Action << /Subtype /URI /URI ($_logging_8h.html) >> - /Subtype /Link -/ANN pdfmark -1 setlinewidth -0 0 0 nodecolor -newpath 140.5 58.5 moveto -140.5 79.5 lineto -199.5 79.5 lineto -199.5 58.5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -148.5 66.5 moveto 43 (Logging.h) alignedtext -grestore -% Node1->Node2 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 170 116.36 moveto -170 108.92 170 98.74 170 89.73 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 173.5 89.57 moveto -170 79.57 lineto -166.5 89.57 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 173.5 89.57 moveto -170 79.57 lineto -166.5 89.57 lineto -closepath stroke -grestore -% Node3 -gsave -1 setlinewidth -0 0 0.74902 nodecolor -newpath 28.5 .5 moveto -28.5 21.5 lineto -87.5 21.5 lineto -87.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -36.5 8.5 moveto 43 (inttypes.h) alignedtext -grestore -% Node2->Node3 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 149.72 58.5 moveto -132.38 49.52 107.21 36.48 87.62 26.34 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 89 23.11 moveto -78.51 21.62 lineto -85.78 29.33 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 89 23.11 moveto -78.51 21.62 lineto -85.78 29.33 lineto -closepath stroke -grestore -% Node4 -gsave -1 setlinewidth -0 0 0.74902 nodecolor -newpath 105 .5 moveto -105 21.5 lineto -157 21.5 lineto -157 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -113 8.5 moveto 36 (stdarg.h) alignedtext -grestore -% Node2->Node4 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 162.85 58.36 moveto -157.51 50.43 150.09 39.39 143.75 29.96 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 146.59 27.92 moveto -138.11 21.57 lineto -140.78 31.82 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 146.59 27.92 moveto -138.11 21.57 lineto -140.78 31.82 lineto -closepath stroke -grestore -% Node5 -gsave -1 setlinewidth -0 0 0.74902 nodecolor -newpath 174.5 .5 moveto -174.5 21.5 lineto -245.5 21.5 lineto -245.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -182.5 8.5 moveto 55 (WProgram.h) alignedtext -grestore -% Node2->Node5 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 177.34 58.36 moveto -182.81 50.43 190.42 39.39 196.92 29.96 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 199.91 31.79 moveto -202.71 21.57 lineto -194.15 27.82 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 199.91 31.79 moveto -202.71 21.57 lineto -194.15 27.82 lineto -closepath stroke -grestore -% Node6 -gsave -1 setlinewidth -0 0 0.74902 nodecolor -newpath 262.5 .5 moveto -262.5 21.5 lineto -309.5 21.5 lineto -309.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -270.5 8.5 moveto 31 (avr/io.h) alignedtext -grestore -% Node2->Node6 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 191.01 58.5 moveto -209.04 49.48 235.27 36.36 255.6 26.2 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 257.38 29.22 moveto -264.76 21.62 lineto -254.25 22.96 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 257.38 29.22 moveto -264.76 21.62 lineto -254.25 22.96 lineto -closepath stroke -grestore -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -%%BoundingBox: 36 36 384 182 -end -restore -%%EOF diff --git a/doc/latex/_logging_8cpp__incl.md5 b/doc/latex/_logging_8cpp__incl.md5 deleted file mode 100644 index f8eeced..0000000 --- a/doc/latex/_logging_8cpp__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -d8b0810a428a95861502d74c2672c55f \ No newline at end of file diff --git a/doc/latex/_logging_8cpp__incl.pdf b/doc/latex/_logging_8cpp__incl.pdf deleted file mode 100644 index 994299c4798a60c4fb961d6c2e429658d6376d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6916 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 SUlcR~9-bGjSYf%r3h{sUB5T+H diff --git a/doc/latex/_logging_8h.tex b/doc/latex/_logging_8h.tex deleted file mode 100644 index 9e56344..0000000 --- a/doc/latex/_logging_8h.tex +++ /dev/null @@ -1,153 +0,0 @@ -\hypertarget{_logging_8h}{ -\section{K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/Logging.h File Reference} -\label{_logging_8h}\index{K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/Logging.h@{K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/Logging.h}} -} -{\tt \#include $<$inttypes.h$>$}\par -{\tt \#include $<$stdarg.h$>$}\par -{\tt \#include \char`\"{}WProgram.h\char`\"{}}\par -{\tt \#include $<$avr/io.h$>$}\par - - -Include dependency graph for Logging.h:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=186pt]{_logging_8h__incl} -\end{center} -\end{figure} - - -This graph shows which files directly or indirectly include this file:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=192pt]{_logging_8h__dep__incl} -\end{center} -\end{figure} -\subsection*{Classes} -\begin{CompactItemize} -\item -class \hyperlink{class_logging}{Logging} -\end{CompactItemize} -\subsection*{Defines} -\begin{CompactItemize} -\item -\#define \hyperlink{_logging_8h_33ec8ee51526c3b2008ed92830c1da16}{LOG\_\-LEVEL\_\-NOOUTPUT}~0 -\item -\#define \hyperlink{_logging_8h_ec8706c3ef9b186e438cccf4a02ccc78}{LOG\_\-LEVEL\_\-ERRORS}~1 -\item -\#define \hyperlink{_logging_8h_660a0bd19f239a2e586f9a432395289e}{LOG\_\-LEVEL\_\-INFOS}~2 -\item -\#define \hyperlink{_logging_8h_130224df8c6bf22a688e3cb74a45689a}{LOG\_\-LEVEL\_\-DEBUG}~3 -\item -\#define \hyperlink{_logging_8h_7d2f762be61df3727748e69e4ff197c2}{LOG\_\-LEVEL\_\-VERBOSE}~4 -\item -\#define \hyperlink{_logging_8h_6c6fd5e242df15a7a42e9b75d55d5d3c}{LOGLEVEL}~LOG\_\-LEVEL\_\-DEBUG -\item -\#define \hyperlink{_logging_8h_876ce77f3c672c7162658151e648389e}{CR}~\char`\"{}$\backslash$r$\backslash$n\char`\"{} -\item -\#define \hyperlink{_logging_8h_7e6435a637199b392c536e50a8334d32}{LOGGING\_\-VERSION}~1 -\end{CompactItemize} -\subsection*{Variables} -\begin{CompactItemize} -\item -\hyperlink{class_logging}{Logging} \hyperlink{_logging_8h_f8164407f3289dde66d36070af4244c1}{Log} -\end{CompactItemize} - - -\subsection{Define Documentation} -\hypertarget{_logging_8h_876ce77f3c672c7162658151e648389e}{ -\index{Logging.h@{Logging.h}!CR@{CR}} -\index{CR@{CR}!Logging.h@{Logging.h}} -\subsubsection[CR]{\setlength{\rightskip}{0pt plus 5cm}\#define CR~\char`\"{}$\backslash$r$\backslash$n\char`\"{}}} -\label{_logging_8h_876ce77f3c672c7162658151e648389e} - - - - -Definition at line 26 of file Logging.h.\hypertarget{_logging_8h_130224df8c6bf22a688e3cb74a45689a}{ -\index{Logging.h@{Logging.h}!LOG\_\-LEVEL\_\-DEBUG@{LOG\_\-LEVEL\_\-DEBUG}} -\index{LOG\_\-LEVEL\_\-DEBUG@{LOG\_\-LEVEL\_\-DEBUG}!Logging.h@{Logging.h}} -\subsubsection[LOG\_\-LEVEL\_\-DEBUG]{\setlength{\rightskip}{0pt plus 5cm}\#define LOG\_\-LEVEL\_\-DEBUG~3}} -\label{_logging_8h_130224df8c6bf22a688e3cb74a45689a} - - - - -Definition at line 19 of file Logging.h. - -Referenced by Logging::Debug().\hypertarget{_logging_8h_ec8706c3ef9b186e438cccf4a02ccc78}{ -\index{Logging.h@{Logging.h}!LOG\_\-LEVEL\_\-ERRORS@{LOG\_\-LEVEL\_\-ERRORS}} -\index{LOG\_\-LEVEL\_\-ERRORS@{LOG\_\-LEVEL\_\-ERRORS}!Logging.h@{Logging.h}} -\subsubsection[LOG\_\-LEVEL\_\-ERRORS]{\setlength{\rightskip}{0pt plus 5cm}\#define LOG\_\-LEVEL\_\-ERRORS~1}} -\label{_logging_8h_ec8706c3ef9b186e438cccf4a02ccc78} - - - - -Definition at line 17 of file Logging.h. - -Referenced by Logging::Error().\hypertarget{_logging_8h_660a0bd19f239a2e586f9a432395289e}{ -\index{Logging.h@{Logging.h}!LOG\_\-LEVEL\_\-INFOS@{LOG\_\-LEVEL\_\-INFOS}} -\index{LOG\_\-LEVEL\_\-INFOS@{LOG\_\-LEVEL\_\-INFOS}!Logging.h@{Logging.h}} -\subsubsection[LOG\_\-LEVEL\_\-INFOS]{\setlength{\rightskip}{0pt plus 5cm}\#define LOG\_\-LEVEL\_\-INFOS~2}} -\label{_logging_8h_660a0bd19f239a2e586f9a432395289e} - - - - -Definition at line 18 of file Logging.h. - -Referenced by Logging::Info().\hypertarget{_logging_8h_33ec8ee51526c3b2008ed92830c1da16}{ -\index{Logging.h@{Logging.h}!LOG\_\-LEVEL\_\-NOOUTPUT@{LOG\_\-LEVEL\_\-NOOUTPUT}} -\index{LOG\_\-LEVEL\_\-NOOUTPUT@{LOG\_\-LEVEL\_\-NOOUTPUT}!Logging.h@{Logging.h}} -\subsubsection[LOG\_\-LEVEL\_\-NOOUTPUT]{\setlength{\rightskip}{0pt plus 5cm}\#define LOG\_\-LEVEL\_\-NOOUTPUT~0}} -\label{_logging_8h_33ec8ee51526c3b2008ed92830c1da16} - - - - -Definition at line 16 of file Logging.h. - -Referenced by Logging::Init().\hypertarget{_logging_8h_7d2f762be61df3727748e69e4ff197c2}{ -\index{Logging.h@{Logging.h}!LOG\_\-LEVEL\_\-VERBOSE@{LOG\_\-LEVEL\_\-VERBOSE}} -\index{LOG\_\-LEVEL\_\-VERBOSE@{LOG\_\-LEVEL\_\-VERBOSE}!Logging.h@{Logging.h}} -\subsubsection[LOG\_\-LEVEL\_\-VERBOSE]{\setlength{\rightskip}{0pt plus 5cm}\#define LOG\_\-LEVEL\_\-VERBOSE~4}} -\label{_logging_8h_7d2f762be61df3727748e69e4ff197c2} - - - - -Definition at line 20 of file Logging.h. - -Referenced by Logging::Init(), and Logging::Verbose().\hypertarget{_logging_8h_7e6435a637199b392c536e50a8334d32}{ -\index{Logging.h@{Logging.h}!LOGGING\_\-VERSION@{LOGGING\_\-VERSION}} -\index{LOGGING\_\-VERSION@{LOGGING\_\-VERSION}!Logging.h@{Logging.h}} -\subsubsection[LOGGING\_\-VERSION]{\setlength{\rightskip}{0pt plus 5cm}\#define LOGGING\_\-VERSION~1}} -\label{_logging_8h_7e6435a637199b392c536e50a8334d32} - - - - -Definition at line 27 of file Logging.h.\hypertarget{_logging_8h_6c6fd5e242df15a7a42e9b75d55d5d3c}{ -\index{Logging.h@{Logging.h}!LOGLEVEL@{LOGLEVEL}} -\index{LOGLEVEL@{LOGLEVEL}!Logging.h@{Logging.h}} -\subsubsection[LOGLEVEL]{\setlength{\rightskip}{0pt plus 5cm}\#define LOGLEVEL~LOG\_\-LEVEL\_\-DEBUG}} -\label{_logging_8h_6c6fd5e242df15a7a42e9b75d55d5d3c} - - - - -Definition at line 23 of file Logging.h. - -\subsection{Variable Documentation} -\hypertarget{_logging_8h_f8164407f3289dde66d36070af4244c1}{ -\index{Logging.h@{Logging.h}!Log@{Log}} -\index{Log@{Log}!Logging.h@{Logging.h}} -\subsubsection[Log]{\setlength{\rightskip}{0pt plus 5cm}{\bf Logging} {\bf Log}}} -\label{_logging_8h_f8164407f3289dde66d36070af4244c1} - - - - -Definition at line 117 of file Logging.cpp. \ No newline at end of file diff --git a/doc/latex/_logging_8h__dep__incl.eps b/doc/latex/_logging_8h__dep__incl.eps deleted file mode 100644 index ae82db2..0000000 --- a/doc/latex/_logging_8h__dep__incl.eps +++ /dev/null @@ -1,256 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: graphviz version 2.26.3 (20100126.1600) -%%Title: G -%%Pages: (atend) -%%BoundingBox: (atend) -%%EndComments -save -%%BeginProlog -/DotDict 200 dict def -DotDict begin - -/setupLatin1 { -mark -/EncodingVector 256 array def - EncodingVector 0 - -ISOLatin1Encoding 0 255 getinterval putinterval -EncodingVector 45 /hyphen put - -% Set up ISO Latin 1 character encoding -/starnetISO { - dup dup findfont dup length dict begin - { 1 index /FID ne { def }{ pop pop } ifelse - } forall - /Encoding EncodingVector def - currentdict end definefont -} def -/Times-Roman starnetISO def -/Times-Italic starnetISO def -/Times-Bold starnetISO def -/Times-BoldItalic starnetISO def -/Helvetica starnetISO def -/Helvetica-Oblique starnetISO def -/Helvetica-Bold starnetISO def -/Helvetica-BoldOblique starnetISO def -/Courier starnetISO def -/Courier-Oblique starnetISO def -/Courier-Bold starnetISO def -/Courier-BoldOblique starnetISO def -cleartomark -} bind def - -%%BeginResource: procset graphviz 0 0 -/coord-font-family /Times-Roman def -/default-font-family /Times-Roman def -/coordfont coord-font-family findfont 8 scalefont def - -/InvScaleFactor 1.0 def -/set_scale { - dup 1 exch div /InvScaleFactor exch def - scale -} bind def - -% styles -/solid { [] 0 setdash } bind def -/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def -/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def -/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def -/bold { 2 setlinewidth } bind def -/filled { } bind def -/unfilled { } bind def -/rounded { } bind def -/diagonals { } bind def - -% hooks for setting color -/nodecolor { sethsbcolor } bind def -/edgecolor { sethsbcolor } bind def -/graphcolor { sethsbcolor } bind def -/nopcolor {pop pop pop} bind def - -/beginpage { % i j npages - /npages exch def - /j exch def - /i exch def - /str 10 string def - npages 1 gt { - gsave - coordfont setfont - 0 0 moveto - (\() show i str cvs show (,) show j str cvs show (\)) show - grestore - } if -} bind def - -/set_font { - findfont exch - scalefont setfont -} def - -% draw text fitted to its expected width -/alignedtext { % width text - /text exch def - /width exch def - gsave - width 0 gt { - [] 0 setdash - text stringwidth pop width exch sub text length div 0 text ashow - } if - grestore -} def - -/boxprim { % xcorner ycorner xsize ysize - 4 2 roll - moveto - 2 copy - exch 0 rlineto - 0 exch rlineto - pop neg 0 rlineto - closepath -} bind def - -/ellipse_path { - /ry exch def - /rx exch def - /y exch def - /x exch def - matrix currentmatrix - newpath - x y translate - rx ry scale - 0 0 1 0 360 arc - setmatrix -} bind def - -/endpage { showpage } bind def -/showpage { } def - -/layercolorseq - [ % layer color sequence - darkest to lightest - [0 0 0] - [.2 .8 .8] - [.4 .8 .8] - [.6 .8 .8] - [.8 .8 .8] - ] -def - -/layerlen layercolorseq length def - -/setlayer {/maxlayer exch def /curlayer exch def - layercolorseq curlayer 1 sub layerlen mod get - aload pop sethsbcolor - /nodecolor {nopcolor} def - /edgecolor {nopcolor} def - /graphcolor {nopcolor} def -} bind def - -/onlayer { curlayer ne {invis} if } def - -/onlayers { - /myupper exch def - /mylower exch def - curlayer mylower lt - curlayer myupper gt - or - {invis} if -} def - -/curlayer 0 def - -%%EndResource -%%EndProlog -%%BeginSetup -14 default-font-family set_font -1 setmiterlimit -% /arrowlength 10 def -% /arrowwidth 5 def - -% make sure pdfmark is harmless for PS-interpreters other than Distiller -/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse -% make '<<' and '>>' safe on PS Level 1 devices -/languagelevel where {pop languagelevel}{1} ifelse -2 lt { - userdict (<<) cvn ([) cvn load put - userdict (>>) cvn ([) cvn load put -} if - -%%EndSetup -setupLatin1 -%%Page: 1 1 -%%PageBoundingBox: 36 36 384 124 -%%PageOrientation: Portrait -0 0 1 beginpage -gsave -36 36 348 88 boxprim clip newpath -1 1 set_scale 0 rotate 40 41 translate -% Node1 -gsave -0 0 0.74902 nodecolor -newpath 5.5 58.5 moveto -5.5 79.5 lineto -334.5 79.5 lineto -334.5 58.5 lineto -closepath fill -1 setlinewidth -filled -0 0 0 nodecolor -newpath 5.5 58.5 moveto -5.5 79.5 lineto -334.5 79.5 lineto -334.5 58.5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -13.5 66.5 moveto 313 (K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.h) alignedtext -grestore -% Node2 -gsave -[ /Rect [ 0 0 340 22 ] - /Border [ 0 0 0 ] - /Action << /Subtype /URI /URI ($_logging_8cpp.html) >> - /Subtype /Link -/ANN pdfmark -1 setlinewidth -0 0 0 nodecolor -newpath 0 .5 moveto -0 21.5 lineto -340 21.5 lineto -340 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -8 8.5 moveto 324 (K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.cpp) alignedtext -grestore -% Node1->Node2 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 170 48.19 moveto -170 39.17 170 28.99 170 21.57 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 166.5 48.36 moveto -170 58.36 lineto -173.5 48.36 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 166.5 48.36 moveto -170 58.36 lineto -173.5 48.36 lineto -closepath stroke -grestore -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -%%BoundingBox: 36 36 384 124 -end -restore -%%EOF diff --git a/doc/latex/_logging_8h__dep__incl.md5 b/doc/latex/_logging_8h__dep__incl.md5 deleted file mode 100644 index 9d175e1..0000000 --- a/doc/latex/_logging_8h__dep__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -6a05ccb4580feaa0a41a9439546f2ae1 \ No newline at end of file diff --git a/doc/latex/_logging_8h__dep__incl.pdf b/doc/latex/_logging_8h__dep__incl.pdf deleted file mode 100644 index 5bf30fda44323cf378458a18056aec7cec2dc41d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6265 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 diff --git a/doc/latex/_logging_8h__incl.eps b/doc/latex/_logging_8h__incl.eps deleted file mode 100644 index b3de7f5..0000000 --- a/doc/latex/_logging_8h__incl.eps +++ /dev/null @@ -1,353 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: graphviz version 2.26.3 (20100126.1600) -%%Title: G -%%Pages: (atend) -%%BoundingBox: (atend) -%%EndComments -save -%%BeginProlog -/DotDict 200 dict def -DotDict begin - -/setupLatin1 { -mark -/EncodingVector 256 array def - EncodingVector 0 - -ISOLatin1Encoding 0 255 getinterval putinterval -EncodingVector 45 /hyphen put - -% Set up ISO Latin 1 character encoding -/starnetISO { - dup dup findfont dup length dict begin - { 1 index /FID ne { def }{ pop pop } ifelse - } forall - /Encoding EncodingVector def - currentdict end definefont -} def -/Times-Roman starnetISO def -/Times-Italic starnetISO def -/Times-Bold starnetISO def -/Times-BoldItalic starnetISO def -/Helvetica starnetISO def -/Helvetica-Oblique starnetISO def -/Helvetica-Bold starnetISO def -/Helvetica-BoldOblique starnetISO def -/Courier starnetISO def -/Courier-Oblique starnetISO def -/Courier-Bold starnetISO def -/Courier-BoldOblique starnetISO def -cleartomark -} bind def - -%%BeginResource: procset graphviz 0 0 -/coord-font-family /Times-Roman def -/default-font-family /Times-Roman def -/coordfont coord-font-family findfont 8 scalefont def - -/InvScaleFactor 1.0 def -/set_scale { - dup 1 exch div /InvScaleFactor exch def - scale -} bind def - -% styles -/solid { [] 0 setdash } bind def -/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def -/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def -/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def -/bold { 2 setlinewidth } bind def -/filled { } bind def -/unfilled { } bind def -/rounded { } bind def -/diagonals { } bind def - -% hooks for setting color -/nodecolor { sethsbcolor } bind def -/edgecolor { sethsbcolor } bind def -/graphcolor { sethsbcolor } bind def -/nopcolor {pop pop pop} bind def - -/beginpage { % i j npages - /npages exch def - /j exch def - /i exch def - /str 10 string def - npages 1 gt { - gsave - coordfont setfont - 0 0 moveto - (\() show i str cvs show (,) show j str cvs show (\)) show - grestore - } if -} bind def - -/set_font { - findfont exch - scalefont setfont -} def - -% draw text fitted to its expected width -/alignedtext { % width text - /text exch def - /width exch def - gsave - width 0 gt { - [] 0 setdash - text stringwidth pop width exch sub text length div 0 text ashow - } if - grestore -} def - -/boxprim { % xcorner ycorner xsize ysize - 4 2 roll - moveto - 2 copy - exch 0 rlineto - 0 exch rlineto - pop neg 0 rlineto - closepath -} bind def - -/ellipse_path { - /ry exch def - /rx exch def - /y exch def - /x exch def - matrix currentmatrix - newpath - x y translate - rx ry scale - 0 0 1 0 360 arc - setmatrix -} bind def - -/endpage { showpage } bind def -/showpage { } def - -/layercolorseq - [ % layer color sequence - darkest to lightest - [0 0 0] - [.2 .8 .8] - [.4 .8 .8] - [.6 .8 .8] - [.8 .8 .8] - ] -def - -/layerlen layercolorseq length def - -/setlayer {/maxlayer exch def /curlayer exch def - layercolorseq curlayer 1 sub layerlen mod get - aload pop sethsbcolor - /nodecolor {nopcolor} def - /edgecolor {nopcolor} def - /graphcolor {nopcolor} def -} bind def - -/onlayer { curlayer ne {invis} if } def - -/onlayers { - /myupper exch def - /mylower exch def - curlayer mylower lt - curlayer myupper gt - or - {invis} if -} def - -/curlayer 0 def - -%%EndResource -%%EndProlog -%%BeginSetup -14 default-font-family set_font -1 setmiterlimit -% /arrowlength 10 def -% /arrowwidth 5 def - -% make sure pdfmark is harmless for PS-interpreters other than Distiller -/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse -% make '<<' and '>>' safe on PS Level 1 devices -/languagelevel where {pop languagelevel}{1} ifelse -2 lt { - userdict (<<) cvn ([) cvn load put - userdict (>>) cvn ([) cvn load put -} if - -%%EndSetup -setupLatin1 -%%Page: 1 1 -%%PageBoundingBox: 36 36 372 124 -%%PageOrientation: Portrait -0 0 1 beginpage -gsave -36 36 336 88 boxprim clip newpath -1 1 set_scale 0 rotate 40 41 translate -% Node1 -gsave -0 0 0.74902 nodecolor -newpath -.5 58.5 moveto --.5 79.5 lineto -328.5 79.5 lineto -328.5 58.5 lineto -closepath fill -1 setlinewidth -filled -0 0 0 nodecolor -newpath -.5 58.5 moveto --.5 79.5 lineto -328.5 79.5 lineto -328.5 58.5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -7.5 66.5 moveto 313 (K:/Projekte/robotic/arduino/arduino_1-0Patch/libraries/Logging/Logging.h) alignedtext -grestore -% Node2 -gsave -1 setlinewidth -0 0 0.74902 nodecolor -newpath 22.5 .5 moveto -22.5 21.5 lineto -81.5 21.5 lineto -81.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -30.5 8.5 moveto 43 (inttypes.h) alignedtext -grestore -% Node1->Node2 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 143.72 58.5 moveto -126.38 49.52 101.21 36.48 81.62 26.34 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 83 23.11 moveto -72.51 21.62 lineto -79.78 29.33 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 83 23.11 moveto -72.51 21.62 lineto -79.78 29.33 lineto -closepath stroke -grestore -% Node3 -gsave -1 setlinewidth -0 0 0.74902 nodecolor -newpath 99 .5 moveto -99 21.5 lineto -151 21.5 lineto -151 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -107 8.5 moveto 36 (stdarg.h) alignedtext -grestore -% Node1->Node3 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 156.85 58.36 moveto -151.51 50.43 144.09 39.39 137.75 29.96 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 140.59 27.92 moveto -132.11 21.57 lineto -134.78 31.82 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 140.59 27.92 moveto -132.11 21.57 lineto -134.78 31.82 lineto -closepath stroke -grestore -% Node4 -gsave -1 setlinewidth -0 0 0.74902 nodecolor -newpath 168.5 .5 moveto -168.5 21.5 lineto -239.5 21.5 lineto -239.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -176.5 8.5 moveto 55 (WProgram.h) alignedtext -grestore -% Node1->Node4 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 171.34 58.36 moveto -176.81 50.43 184.42 39.39 190.92 29.96 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 193.91 31.79 moveto -196.71 21.57 lineto -188.15 27.82 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 193.91 31.79 moveto -196.71 21.57 lineto -188.15 27.82 lineto -closepath stroke -grestore -% Node5 -gsave -1 setlinewidth -0 0 0.74902 nodecolor -newpath 256.5 .5 moveto -256.5 21.5 lineto -303.5 21.5 lineto -303.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -264.5 8.5 moveto 31 (avr/io.h) alignedtext -grestore -% Node1->Node5 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 185.01 58.5 moveto -203.04 49.48 229.27 36.36 249.6 26.2 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 251.38 29.22 moveto -258.76 21.62 lineto -248.25 22.96 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 251.38 29.22 moveto -258.76 21.62 lineto -248.25 22.96 lineto -closepath stroke -grestore -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -%%BoundingBox: 36 36 372 124 -end -restore -%%EOF diff --git a/doc/latex/_logging_8h__incl.md5 b/doc/latex/_logging_8h__incl.md5 deleted file mode 100644 index d37d578..0000000 --- a/doc/latex/_logging_8h__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -ee71a91a2b38f624cb7272bb9991a2b0 \ No newline at end of file diff --git a/doc/latex/_logging_8h__incl.pdf b/doc/latex/_logging_8h__incl.pdf deleted file mode 100644 index 487b054e505a07b945dac6f98bccd6bb5740a193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6685 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 Ivl-(50PR{2ivR!s diff --git a/doc/latex/annotated.tex b/doc/latex/annotated.tex deleted file mode 100644 index 1dd82f8..0000000 --- a/doc/latex/annotated.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Class List} -Here are the classes, structs, unions and interfaces with brief descriptions:\begin{CompactList} -\item\contentsline{section}{\hyperlink{class_logging}{Logging} }{\pageref{class_logging}}{} -\end{CompactList} diff --git a/doc/latex/class_logging.tex b/doc/latex/class_logging.tex deleted file mode 100644 index 1e828b4..0000000 --- a/doc/latex/class_logging.tex +++ /dev/null @@ -1,257 +0,0 @@ -\hypertarget{class_logging}{ -\section{Logging Class Reference} -\label{class_logging}\index{Logging@{Logging}} -} -{\tt \#include $<$Logging.h$>$} - -\subsection*{Public Member Functions} -\begin{CompactItemize} -\item -\hyperlink{class_logging_cc3d848a3d05076fd185cd95e9c648d5}{Logging} () -\item -void \hyperlink{class_logging_f6a890a6feac5bf93b04cb22db7bd530}{Init} (int level, long baud) -\item -void \hyperlink{class_logging_1cf44ab531c72761fba811882336a2ad}{Error} (char $\ast$msg,...) -\item -void \hyperlink{class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e}{Info} (char $\ast$msg,...) -\item -void \hyperlink{class_logging_e0fcd9e5350d7b9158c8ae9289fef193}{Debug} (char $\ast$msg,...) -\item -void \hyperlink{class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f}{Verbose} (char $\ast$msg,...) -\end{CompactItemize} -\subsection*{Private Member Functions} -\begin{CompactItemize} -\item -void \hyperlink{class_logging_714840794950ab31df5da5b95322e391}{print} (const char $\ast$format, va\_\-list args) -\end{CompactItemize} -\subsection*{Private Attributes} -\begin{CompactItemize} -\item -int \hyperlink{class_logging_117105f639285ba5922836121294c04a}{\_\-level} -\item -long \hyperlink{class_logging_8a2fe833b6e957b763146c32d6be5f2d}{\_\-baud} -\end{CompactItemize} - - -\subsection{Detailed Description} -\hyperlink{class_logging}{Logging} is a helper class to output informations over RS232. If you know log4j or log4net, this logging class is more or less similar ;-) \par - Different loglevels can be used to extend or reduce output All methods are able to handle any number of output parameters. All methods print out a formated string (like printf).\par - To reduce output and program size, reduce loglevel. \par - Output format string can contain below wildcards. Every wildcard must be start with percent sign (\%) - -{\bf Depending on loglevel, source code is excluded from compile !}\par - \par - {\bf Wildcards}\par - \begin{itemize} -\item {\bf \%s} replace with an string (char$\ast$) \item {\bf \%c} replace with an character \item {\bf \%d} replace with an integer value \item {\bf \%l} replace with an long value \item {\bf \%x} replace and convert integer value into hex \item {\bf \%X} like x but combine with {\bf 0x}123AB \item {\bf \%b} replace and convert integer value into binary \item {\bf \%B} like x but combine with {\bf 0b}10100011 \item {\bf \%t} replace and convert boolean value into {\bf \char`\"{}t\char`\"{}} or {\bf \char`\"{}f\char`\"{}} \item {\bf \%T} like t but convert into {\bf \char`\"{}true\char`\"{}} or {\bf \char`\"{}false\char`\"{}} \end{itemize} -\par - {\bf Loglevels}\par - \begin{TabularC}{3} -\hline -0&LOG\_\-LEVEL\_\-NOOUTPUT&no output \\\hline -1&LOG\_\-LEVEL\_\-ERRORS&only errors \\\hline -2&LOG\_\-LEVEL\_\-INFOS&errors and info \\\hline -3&LOG\_\-LEVEL\_\-DEBUG&errors, info and debug \\\hline -4&LOG\_\-LEVEL\_\-VERBOSE&all \\\hline -\end{TabularC} -\par - \subsection*{History} - -\par - \begin{TabularC}{2} -\hline -01 FEB 2012&initial release \\\hline -06 MAR 2012&implement a preinstanciate object (like in Wire, ...) \\\hline -&methode init get now loglevel and baud parameter \\\hline -\end{TabularC} - - -Definition at line 71 of file Logging.h. - -\subsection{Constructor \& Destructor Documentation} -\hypertarget{class_logging_cc3d848a3d05076fd185cd95e9c648d5}{ -\index{Logging@{Logging}!Logging@{Logging}} -\index{Logging@{Logging}!Logging@{Logging}} -\subsubsection[Logging]{\setlength{\rightskip}{0pt plus 5cm}Logging::Logging ()\hspace{0.3cm}{\tt \mbox{[}inline\mbox{]}}}} -\label{class_logging_cc3d848a3d05076fd185cd95e9c648d5} - - -default Constructor - -Definition at line 79 of file Logging.h. - -\subsection{Member Function Documentation} -\hypertarget{class_logging_f6a890a6feac5bf93b04cb22db7bd530}{ -\index{Logging@{Logging}!Init@{Init}} -\index{Init@{Init}!Logging@{Logging}} -\subsubsection[Init]{\setlength{\rightskip}{0pt plus 5cm}void Logging::Init (int {\em level}, \/ long {\em baud})}} -\label{class_logging_f6a890a6feac5bf93b04cb22db7bd530} - - -Initializing, must be called as first. \begin{Desc} -\item[Parameters:] -\begin{description} -\item[{\em void}]\end{description} -\end{Desc} -\begin{Desc} -\item[Returns:]void \end{Desc} - - -Definition at line 3 of file Logging.cpp. - -References \_\-baud, \_\-level, LOG\_\-LEVEL\_\-NOOUTPUT, and LOG\_\-LEVEL\_\-VERBOSE.\hypertarget{class_logging_1cf44ab531c72761fba811882336a2ad}{ -\index{Logging@{Logging}!Error@{Error}} -\index{Error@{Error}!Logging@{Logging}} -\subsubsection[Error]{\setlength{\rightskip}{0pt plus 5cm}void Logging::Error (char $\ast$ {\em msg}, \/ {\em ...})}} -\label{class_logging_1cf44ab531c72761fba811882336a2ad} - - -Output an error message. Output message contains ERROR: followed by original msg Error messages are printed out, at every loglevel except 0 ;-) \begin{Desc} -\item[Parameters:] -\begin{description} -\item[{\em msg}]format string to output \item[{\em ...}]any number of variables \end{description} -\end{Desc} -\begin{Desc} -\item[Returns:]void \end{Desc} - - -Definition at line 9 of file Logging.cpp. - -References \_\-level, LOG\_\-LEVEL\_\-ERRORS, and print(). - -Here is the call graph for this function:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=117pt]{class_logging_1cf44ab531c72761fba811882336a2ad_cgraph} -\end{center} -\end{figure} -\hypertarget{class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e}{ -\index{Logging@{Logging}!Info@{Info}} -\index{Info@{Info}!Logging@{Logging}} -\subsubsection[Info]{\setlength{\rightskip}{0pt plus 5cm}void Logging::Info (char $\ast$ {\em msg}, \/ {\em ...})}} -\label{class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e} - - -Output an info message. Output message contains Info messages are printed out at l loglevels $>$= LOG\_\-LEVEL\_\-INFOS - -\begin{Desc} -\item[Parameters:] -\begin{description} -\item[{\em msg}]format string to output \item[{\em ...}]any number of variables \end{description} -\end{Desc} -\begin{Desc} -\item[Returns:]void \end{Desc} - - -Definition at line 19 of file Logging.cpp. - -References \_\-level, LOG\_\-LEVEL\_\-INFOS, and print(). - -Here is the call graph for this function:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=114pt]{class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph} -\end{center} -\end{figure} -\hypertarget{class_logging_e0fcd9e5350d7b9158c8ae9289fef193}{ -\index{Logging@{Logging}!Debug@{Debug}} -\index{Debug@{Debug}!Logging@{Logging}} -\subsubsection[Debug]{\setlength{\rightskip}{0pt plus 5cm}void Logging::Debug (char $\ast$ {\em msg}, \/ {\em ...})}} -\label{class_logging_e0fcd9e5350d7b9158c8ae9289fef193} - - -Output an debug message. Output message contains Debug messages are printed out at l loglevels $>$= LOG\_\-LEVEL\_\-DEBUG - -\begin{Desc} -\item[Parameters:] -\begin{description} -\item[{\em msg}]format string to output \item[{\em ...}]any number of variables \end{description} -\end{Desc} -\begin{Desc} -\item[Returns:]void \end{Desc} - - -Definition at line 27 of file Logging.cpp. - -References \_\-level, LOG\_\-LEVEL\_\-DEBUG, and print(). - -Here is the call graph for this function:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=120pt]{class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph} -\end{center} -\end{figure} -\hypertarget{class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f}{ -\index{Logging@{Logging}!Verbose@{Verbose}} -\index{Verbose@{Verbose}!Logging@{Logging}} -\subsubsection[Verbose]{\setlength{\rightskip}{0pt plus 5cm}void Logging::Verbose (char $\ast$ {\em msg}, \/ {\em ...})}} -\label{class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f} - - -Output an verbose message. Output message contains Debug messages are printed out at l loglevels $>$= LOG\_\-LEVEL\_\-VERBOSE - -\begin{Desc} -\item[Parameters:] -\begin{description} -\item[{\em msg}]format string to output \item[{\em ...}]any number of variables \end{description} -\end{Desc} -\begin{Desc} -\item[Returns:]void \end{Desc} - - -Definition at line 36 of file Logging.cpp. - -References \_\-level, LOG\_\-LEVEL\_\-VERBOSE, and print(). - -Here is the call graph for this function:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=124pt]{class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph} -\end{center} -\end{figure} -\hypertarget{class_logging_714840794950ab31df5da5b95322e391}{ -\index{Logging@{Logging}!print@{print}} -\index{print@{print}!Logging@{Logging}} -\subsubsection[print]{\setlength{\rightskip}{0pt plus 5cm}void Logging::print (const char $\ast$ {\em format}, \/ va\_\-list {\em args})\hspace{0.3cm}{\tt \mbox{[}private\mbox{]}}}} -\label{class_logging_714840794950ab31df5da5b95322e391} - - - - -Definition at line 46 of file Logging.cpp. - -Referenced by Debug(), Error(), Info(), and Verbose(). - -\subsection{Member Data Documentation} -\hypertarget{class_logging_117105f639285ba5922836121294c04a}{ -\index{Logging@{Logging}!\_\-level@{\_\-level}} -\index{\_\-level@{\_\-level}!Logging@{Logging}} -\subsubsection[\_\-level]{\setlength{\rightskip}{0pt plus 5cm}int {\bf Logging::\_\-level}\hspace{0.3cm}{\tt \mbox{[}private\mbox{]}}}} -\label{class_logging_117105f639285ba5922836121294c04a} - - - - -Definition at line 73 of file Logging.h. - -Referenced by Debug(), Error(), Info(), Init(), and Verbose().\hypertarget{class_logging_8a2fe833b6e957b763146c32d6be5f2d}{ -\index{Logging@{Logging}!\_\-baud@{\_\-baud}} -\index{\_\-baud@{\_\-baud}!Logging@{Logging}} -\subsubsection[\_\-baud]{\setlength{\rightskip}{0pt plus 5cm}long {\bf Logging::\_\-baud}\hspace{0.3cm}{\tt \mbox{[}private\mbox{]}}}} -\label{class_logging_8a2fe833b6e957b763146c32d6be5f2d} - - - - -Definition at line 74 of file Logging.h. - -Referenced by Init(). - -The documentation for this class was generated from the following files:\begin{CompactItemize} -\item -K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/\hyperlink{_logging_8h}{Logging.h}\item -K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/\hyperlink{_logging_8cpp}{Logging.cpp}\end{CompactItemize} diff --git a/doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.eps b/doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.eps deleted file mode 100644 index e971549..0000000 --- a/doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.eps +++ /dev/null @@ -1,256 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: graphviz version 2.26.3 (20100126.1600) -%%Title: G -%%Pages: (atend) -%%BoundingBox: (atend) -%%EndComments -save -%%BeginProlog -/DotDict 200 dict def -DotDict begin - -/setupLatin1 { -mark -/EncodingVector 256 array def - EncodingVector 0 - -ISOLatin1Encoding 0 255 getinterval putinterval -EncodingVector 45 /hyphen put - -% Set up ISO Latin 1 character encoding -/starnetISO { - dup dup findfont dup length dict begin - { 1 index /FID ne { def }{ pop pop } ifelse - } forall - /Encoding EncodingVector def - currentdict end definefont -} def -/Times-Roman starnetISO def -/Times-Italic starnetISO def -/Times-Bold starnetISO def -/Times-BoldItalic starnetISO def -/Helvetica starnetISO def -/Helvetica-Oblique starnetISO def -/Helvetica-Bold starnetISO def -/Helvetica-BoldOblique starnetISO def -/Courier starnetISO def -/Courier-Oblique starnetISO def -/Courier-Bold starnetISO def -/Courier-BoldOblique starnetISO def -cleartomark -} bind def - -%%BeginResource: procset graphviz 0 0 -/coord-font-family /Times-Roman def -/default-font-family /Times-Roman def -/coordfont coord-font-family findfont 8 scalefont def - -/InvScaleFactor 1.0 def -/set_scale { - dup 1 exch div /InvScaleFactor exch def - scale -} bind def - -% styles -/solid { [] 0 setdash } bind def -/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def -/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def -/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def -/bold { 2 setlinewidth } bind def -/filled { } bind def -/unfilled { } bind def -/rounded { } bind def -/diagonals { } bind def - -% hooks for setting color -/nodecolor { sethsbcolor } bind def -/edgecolor { sethsbcolor } bind def -/graphcolor { sethsbcolor } bind def -/nopcolor {pop pop pop} bind def - -/beginpage { % i j npages - /npages exch def - /j exch def - /i exch def - /str 10 string def - npages 1 gt { - gsave - coordfont setfont - 0 0 moveto - (\() show i str cvs show (,) show j str cvs show (\)) show - grestore - } if -} bind def - -/set_font { - findfont exch - scalefont setfont -} def - -% draw text fitted to its expected width -/alignedtext { % width text - /text exch def - /width exch def - gsave - width 0 gt { - [] 0 setdash - text stringwidth pop width exch sub text length div 0 text ashow - } if - grestore -} def - -/boxprim { % xcorner ycorner xsize ysize - 4 2 roll - moveto - 2 copy - exch 0 rlineto - 0 exch rlineto - pop neg 0 rlineto - closepath -} bind def - -/ellipse_path { - /ry exch def - /rx exch def - /y exch def - /x exch def - matrix currentmatrix - newpath - x y translate - rx ry scale - 0 0 1 0 360 arc - setmatrix -} bind def - -/endpage { showpage } bind def -/showpage { } def - -/layercolorseq - [ % layer color sequence - darkest to lightest - [0 0 0] - [.2 .8 .8] - [.4 .8 .8] - [.6 .8 .8] - [.8 .8 .8] - ] -def - -/layerlen layercolorseq length def - -/setlayer {/maxlayer exch def /curlayer exch def - layercolorseq curlayer 1 sub layerlen mod get - aload pop sethsbcolor - /nodecolor {nopcolor} def - /edgecolor {nopcolor} def - /graphcolor {nopcolor} def -} bind def - -/onlayer { curlayer ne {invis} if } def - -/onlayers { - /myupper exch def - /mylower exch def - curlayer mylower lt - curlayer myupper gt - or - {invis} if -} def - -/curlayer 0 def - -%%EndResource -%%EndProlog -%%BeginSetup -14 default-font-family set_font -1 setmiterlimit -% /arrowlength 10 def -% /arrowwidth 5 def - -% make sure pdfmark is harmless for PS-interpreters other than Distiller -/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse -% make '<<' and '>>' safe on PS Level 1 devices -/languagelevel where {pop languagelevel}{1} ifelse -2 lt { - userdict (<<) cvn ([) cvn load put - userdict (>>) cvn ([) cvn load put -} if - -%%EndSetup -setupLatin1 -%%Page: 1 1 -%%PageBoundingBox: 36 36 234 66 -%%PageOrientation: Portrait -0 0 1 beginpage -gsave -36 36 198 30 boxprim clip newpath -1 1 set_scale 0 rotate 40 41 translate -% Node1 -gsave -0 0 0.74902 nodecolor -newpath .5 .5 moveto -.5 21.5 lineto -77.5 21.5 lineto -77.5 .5 lineto -closepath fill -1 setlinewidth -filled -0 0 0 nodecolor -newpath .5 .5 moveto -.5 21.5 lineto -77.5 21.5 lineto -77.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -8.5 8.5 moveto 61 (Logging::Error) alignedtext -grestore -% Node2 -gsave -[ /Rect [ 115 0 189 22 ] - /Border [ 0 0 0 ] - /Action << /Subtype /URI /URI ($class_logging.html#714840794950ab31df5da5b95322e391) >> - /Subtype /Link -/ANN pdfmark -1 setlinewidth -0 0 0 nodecolor -newpath 114.5 .5 moveto -114.5 21.5 lineto -189.5 21.5 lineto -189.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -122.5 8.5 moveto 59 (Logging::print) alignedtext -grestore -% Node1->Node2 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 77.57 11 moveto -86.12 11 95.28 11 104.14 11 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 104.37 14.5 moveto -114.37 11 lineto -104.37 7.5 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 104.37 14.5 moveto -114.37 11 lineto -104.37 7.5 lineto -closepath stroke -grestore -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -%%BoundingBox: 36 36 234 66 -end -restore -%%EOF diff --git a/doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.md5 b/doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.md5 deleted file mode 100644 index 1865ac1..0000000 --- a/doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -3277410f8d9ecca3a5de0ab53691ba26 \ No newline at end of file diff --git a/doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.pdf b/doc/latex/class_logging_1cf44ab531c72761fba811882336a2ad_cgraph.pdf deleted file mode 100644 index df16ffa603fc7ec88563a5bfacf3c9d9c15a3520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4876 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 G#{U4zDx2^C diff --git a/doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.eps b/doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.eps deleted file mode 100644 index 27b4ffc..0000000 --- a/doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.eps +++ /dev/null @@ -1,256 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: graphviz version 2.26.3 (20100126.1600) -%%Title: G -%%Pages: (atend) -%%BoundingBox: (atend) -%%EndComments -save -%%BeginProlog -/DotDict 200 dict def -DotDict begin - -/setupLatin1 { -mark -/EncodingVector 256 array def - EncodingVector 0 - -ISOLatin1Encoding 0 255 getinterval putinterval -EncodingVector 45 /hyphen put - -% Set up ISO Latin 1 character encoding -/starnetISO { - dup dup findfont dup length dict begin - { 1 index /FID ne { def }{ pop pop } ifelse - } forall - /Encoding EncodingVector def - currentdict end definefont -} def -/Times-Roman starnetISO def -/Times-Italic starnetISO def -/Times-Bold starnetISO def -/Times-BoldItalic starnetISO def -/Helvetica starnetISO def -/Helvetica-Oblique starnetISO def -/Helvetica-Bold starnetISO def -/Helvetica-BoldOblique starnetISO def -/Courier starnetISO def -/Courier-Oblique starnetISO def -/Courier-Bold starnetISO def -/Courier-BoldOblique starnetISO def -cleartomark -} bind def - -%%BeginResource: procset graphviz 0 0 -/coord-font-family /Times-Roman def -/default-font-family /Times-Roman def -/coordfont coord-font-family findfont 8 scalefont def - -/InvScaleFactor 1.0 def -/set_scale { - dup 1 exch div /InvScaleFactor exch def - scale -} bind def - -% styles -/solid { [] 0 setdash } bind def -/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def -/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def -/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def -/bold { 2 setlinewidth } bind def -/filled { } bind def -/unfilled { } bind def -/rounded { } bind def -/diagonals { } bind def - -% hooks for setting color -/nodecolor { sethsbcolor } bind def -/edgecolor { sethsbcolor } bind def -/graphcolor { sethsbcolor } bind def -/nopcolor {pop pop pop} bind def - -/beginpage { % i j npages - /npages exch def - /j exch def - /i exch def - /str 10 string def - npages 1 gt { - gsave - coordfont setfont - 0 0 moveto - (\() show i str cvs show (,) show j str cvs show (\)) show - grestore - } if -} bind def - -/set_font { - findfont exch - scalefont setfont -} def - -% draw text fitted to its expected width -/alignedtext { % width text - /text exch def - /width exch def - gsave - width 0 gt { - [] 0 setdash - text stringwidth pop width exch sub text length div 0 text ashow - } if - grestore -} def - -/boxprim { % xcorner ycorner xsize ysize - 4 2 roll - moveto - 2 copy - exch 0 rlineto - 0 exch rlineto - pop neg 0 rlineto - closepath -} bind def - -/ellipse_path { - /ry exch def - /rx exch def - /y exch def - /x exch def - matrix currentmatrix - newpath - x y translate - rx ry scale - 0 0 1 0 360 arc - setmatrix -} bind def - -/endpage { showpage } bind def -/showpage { } def - -/layercolorseq - [ % layer color sequence - darkest to lightest - [0 0 0] - [.2 .8 .8] - [.4 .8 .8] - [.6 .8 .8] - [.8 .8 .8] - ] -def - -/layerlen layercolorseq length def - -/setlayer {/maxlayer exch def /curlayer exch def - layercolorseq curlayer 1 sub layerlen mod get - aload pop sethsbcolor - /nodecolor {nopcolor} def - /edgecolor {nopcolor} def - /graphcolor {nopcolor} def -} bind def - -/onlayer { curlayer ne {invis} if } def - -/onlayers { - /myupper exch def - /mylower exch def - curlayer mylower lt - curlayer myupper gt - or - {invis} if -} def - -/curlayer 0 def - -%%EndResource -%%EndProlog -%%BeginSetup -14 default-font-family set_font -1 setmiterlimit -% /arrowlength 10 def -% /arrowwidth 5 def - -% make sure pdfmark is harmless for PS-interpreters other than Distiller -/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse -% make '<<' and '>>' safe on PS Level 1 devices -/languagelevel where {pop languagelevel}{1} ifelse -2 lt { - userdict (<<) cvn ([) cvn load put - userdict (>>) cvn ([) cvn load put -} if - -%%EndSetup -setupLatin1 -%%Page: 1 1 -%%PageBoundingBox: 36 36 248 66 -%%PageOrientation: Portrait -0 0 1 beginpage -gsave -36 36 212 30 boxprim clip newpath -1 1 set_scale 0 rotate 40 41 translate -% Node1 -gsave -0 0 0.74902 nodecolor -newpath 0 .5 moveto -0 21.5 lineto -92 21.5 lineto -92 .5 lineto -closepath fill -1 setlinewidth -filled -0 0 0 nodecolor -newpath 0 .5 moveto -0 21.5 lineto -92 21.5 lineto -92 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -8 8.5 moveto 76 (Logging::Verbose) alignedtext -grestore -% Node2 -gsave -[ /Rect [ 129 0 203 22 ] - /Border [ 0 0 0 ] - /Action << /Subtype /URI /URI ($class_logging.html#714840794950ab31df5da5b95322e391) >> - /Subtype /Link -/ANN pdfmark -1 setlinewidth -0 0 0 nodecolor -newpath 128.5 .5 moveto -128.5 21.5 lineto -203.5 21.5 lineto -203.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -136.5 8.5 moveto 59 (Logging::print) alignedtext -grestore -% Node1->Node2 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 92.05 11 moveto -100.6 11 109.56 11 118.16 11 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 118.43 14.5 moveto -128.43 11 lineto -118.43 7.5 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 118.43 14.5 moveto -128.43 11 lineto -118.43 7.5 lineto -closepath stroke -grestore -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -%%BoundingBox: 36 36 248 66 -end -restore -%%EOF diff --git a/doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 b/doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 deleted file mode 100644 index bb251bd..0000000 --- a/doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -e24d211a832d762b210c351a2929e4e6 \ No newline at end of file diff --git a/doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.pdf b/doc/latex/class_logging_2ae6a981ea685c851b87cf4c1ec2fb8f_cgraph.pdf deleted file mode 100644 index 9e8e8d5ef5061123a15c648f372d006a50bd7a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5216 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' safe on PS Level 1 devices -/languagelevel where {pop languagelevel}{1} ifelse -2 lt { - userdict (<<) cvn ([) cvn load put - userdict (>>) cvn ([) cvn load put -} if - -%%EndSetup -setupLatin1 -%%Page: 1 1 -%%PageBoundingBox: 36 36 228 66 -%%PageOrientation: Portrait -0 0 1 beginpage -gsave -36 36 192 30 boxprim clip newpath -1 1 set_scale 0 rotate 40 41 translate -% Node1 -gsave -0 0 0.74902 nodecolor -newpath .5 .5 moveto -.5 21.5 lineto -71.5 21.5 lineto -71.5 .5 lineto -closepath fill -1 setlinewidth -filled -0 0 0 nodecolor -newpath .5 .5 moveto -.5 21.5 lineto -71.5 21.5 lineto -71.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -8.5 8.5 moveto 55 (Logging::Info) alignedtext -grestore -% Node2 -gsave -[ /Rect [ 109 0 183 22 ] - /Border [ 0 0 0 ] - /Action << /Subtype /URI /URI ($class_logging.html#714840794950ab31df5da5b95322e391) >> - /Subtype /Link -/ANN pdfmark -1 setlinewidth -0 0 0 nodecolor -newpath 108.5 .5 moveto -108.5 21.5 lineto -183.5 21.5 lineto -183.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -116.5 8.5 moveto 59 (Logging::print) alignedtext -grestore -% Node1->Node2 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 71.71 11 moveto -80.1 11 89.17 11 98 11 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 98.19 14.5 moveto -108.19 11 lineto -98.19 7.5 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 98.19 14.5 moveto -108.19 11 lineto -98.19 7.5 lineto -closepath stroke -grestore -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -%%BoundingBox: 36 36 228 66 -end -restore -%%EOF diff --git a/doc/latex/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 b/doc/latex/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 deleted file mode 100644 index fde9732..0000000 --- a/doc/latex/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -e09d701f830a3a3458eb02a37752be21 \ No newline at end of file diff --git a/doc/latex/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.pdf b/doc/latex/class_logging_8a99e1a55e2b24d864d89e9aa86b2f2e_cgraph.pdf deleted file mode 100644 index 6ed6f9f28c9f9f7c18e23b20eb9cb63fdd1d545a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4908 zcmb_gdq7iV8#go21t^fFnR&d>P}t68=ZtN_a4nc&J+5-qSyLmUdtjsJxh=Sa<6CR z>mpaYQZQ@Wf2yzlHhIb?I}Os=!Z~$?bxcj;@ABr>Qy4wPf+$2Vv_6vJVqg#_2#%s`91st-aiNhMhy;Y9?J6NOP)9NQ0|*SPvRG)2 zjgj$$I5-G!!Tv17hgT~A0uCGb1KYz5_69~mb}Ly3o@_F(P>g{0K`V%Zzz!+=0o_#j zgB_XDt{Fsfq?u0W*uvq9hT=#A;6P~mUR`JV_S~S$DFHk+LIa^nrNco0$nJ?e=z9=rk z5nnkjClFF6K@CR2KoUARA;B<8B1gvx;7DGX$1^fT$MHc7H(8Q84YPyquuSVK;2qL- z`Dc$t2UjkT_vG@A4rU<9QhfYiZD3Sjc%*j-Ls5~Wg@t*dnqu{g$;#0Tgz_n)wa3ZM z5`d~?SS~1$WFSHYhm(#qib~;`CIgqq#z0bpS91IbI#(T(PJXA{U&!>(>cQu=+BG}% z!Ojk25_)toh!`+2DLqb;{xHj8k#5c2-pY1EHjKB2c zw}*>`z5m$#4wX~hSBALwOC_o~{m?wK({$$-Z{#}v^qH!!Pu$JfN4~k$E7&!Gup+OI zK9*HF=$AgT;9c=0&O-D|>4g>0hpz8zXkJ)Q^&rpSw8HaR-?gQ-S+(W0wxJ_udA-zo z^wQ|CK)Q4i1Raxay#K;RC!c1QrRiVZ_qx|CAKGu!s@o%@R1xAiYdsH~6<`xQ;?7lG z9A7!?3d8I#--ccLz2%cttxMlGW5nfZ#(nk1*W~hwvR)&+`>Rs>R0l_7p4~a4-(;Ux zk)0cQujyYLJa_dPZE@Ii=L~2?QOv;1HBs=E#~*CGQ0eaRsA;qLtjGG&NgrQVy%b&D z=d|j`uLttq+VN+quXEW0*_?qlZw~sS*YRFuGe~iP``*)g4h?MxuUcG^Q<6DIH`p++ zYDxN%xG%i#Ka?NNo3L_IOkP`de~IX;ADfd}2Mu!FojKcje`{#=vbz4YRB^;dNutrC zTykUX=yH?sl>3tO#22T%zp}|BTb#Hexb=usJ^E4K;tjI>U$my5Sd~BJb-%`;0n;0{ z7y1rwWNhr-T}vj$k<~+?<->A)a@=PQPlp@4>L+

|plA3w2uUh#Xadm9spS2OmB zif-2y-g+FJ{>18*AAhRM2^pciIHG0h#WyZ)2@vJQ;`FK7vG7%!?8(F2Q2ciN=5Y(B zWY@1-wZLH54>9>tT3djd}%N?nw- z0RP#!>Z1jdN3?#e*t#$`clLmDpC59a8|PPc@?b%6V$HQHD&D(WH$-QpWd=z{mV)%sp`G#!l;tG#35CZBfdm^9U)bl z)2`~+AB-~}xo*3A`c7)b;_}_+Z9yk8D$d7^KistN!KaPmvV9iaDW8dlPdJq~ZDerB z%X?*hD-Svq&iBrL_ZO~c>7_OoV&w0#f{U}>3aA-8;vLgt+=~*A85A`S!rA+1pk>_G$~?T>E9y4(lr#mq*?u73X6|rR=>t?e{%pOJn0p zJ<8=f+DgCtasTyw6|a1dzjI!2iE$pYR6SNzvK4kONOf9WR#|!X7wpDC@2phJwe9+} z7tFUF?l|GU`ccDOpGP&1S1X0y8EaEk%KH#cPX4mJj@SW*-MO+v>UOl*XUx8n1Mjt_ zzU9y5wcJvq?HSM2hSrzOS=XGiFd;Q{*Tv9gIxLa(IBR>i&s%AQn^GHf(?ojYEuSCfs_gm-mV9O>+^egQTssZXLfNJoL0!(Vvs_~$~%WbhZx zBs7S|8bl?UCZ;h|WZIM{eOi)UZV(121%3e}m?tTbjkJo4_L-Z7z}v`wRFF12WE3x8 zQ`nNN$zZC2Y{_N|tFZYC?J5ee=E<-SvWsv@{=#TY1jNy_ImyI9m{=}GMX1CFGBV(m znMyNB5Gs}m!Iq4{sL+D(vVBAFbMrUL^%AfwQLA;`Eu4d!XD$PWJd{8DZq&0EADGi!WF)SYm zOpHmz637eKg8-AHViXKDW800e@8nSQgZY?s!|FMrM_M(SzsD~*na^%sPNAmtDal|+ z3se8g+?uNUVJJu*S;{D_+nC+NlSvi&?YiaMl!|B36-JkxSLJN_Jv&m?%L!pqGBh3 zss;gqJ9~yw06nMQ^V_JaQG)jCFHGgz;4_Vwzu7waa7S5t{Y_PatD8M*0pNVCc&Qb9 zp&=M1MdT9PUSmQ85dtw#i~k_uNPn;YS2M9aizap~*foletyk#S&a0x0p^V__gc1V2 ztF`|iDM3gG$Ov`N2r0M~@;}JZLBlaA81{S85Q4uKJw=n?;1k4CGz10r{ikRW3|v#6 zqDdv-ZvHgQ_gP(;3|z%~%Au$XdK__ i)M_~%D3vS!St5@A$iZ?X!`Xv|;{+k_^bDRFBKRL=XQ=!D diff --git a/doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.eps b/doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.eps deleted file mode 100644 index 70d0c50..0000000 --- a/doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.eps +++ /dev/null @@ -1,256 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: graphviz version 2.26.3 (20100126.1600) -%%Title: G -%%Pages: (atend) -%%BoundingBox: (atend) -%%EndComments -save -%%BeginProlog -/DotDict 200 dict def -DotDict begin - -/setupLatin1 { -mark -/EncodingVector 256 array def - EncodingVector 0 - -ISOLatin1Encoding 0 255 getinterval putinterval -EncodingVector 45 /hyphen put - -% Set up ISO Latin 1 character encoding -/starnetISO { - dup dup findfont dup length dict begin - { 1 index /FID ne { def }{ pop pop } ifelse - } forall - /Encoding EncodingVector def - currentdict end definefont -} def -/Times-Roman starnetISO def -/Times-Italic starnetISO def -/Times-Bold starnetISO def -/Times-BoldItalic starnetISO def -/Helvetica starnetISO def -/Helvetica-Oblique starnetISO def -/Helvetica-Bold starnetISO def -/Helvetica-BoldOblique starnetISO def -/Courier starnetISO def -/Courier-Oblique starnetISO def -/Courier-Bold starnetISO def -/Courier-BoldOblique starnetISO def -cleartomark -} bind def - -%%BeginResource: procset graphviz 0 0 -/coord-font-family /Times-Roman def -/default-font-family /Times-Roman def -/coordfont coord-font-family findfont 8 scalefont def - -/InvScaleFactor 1.0 def -/set_scale { - dup 1 exch div /InvScaleFactor exch def - scale -} bind def - -% styles -/solid { [] 0 setdash } bind def -/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def -/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def -/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def -/bold { 2 setlinewidth } bind def -/filled { } bind def -/unfilled { } bind def -/rounded { } bind def -/diagonals { } bind def - -% hooks for setting color -/nodecolor { sethsbcolor } bind def -/edgecolor { sethsbcolor } bind def -/graphcolor { sethsbcolor } bind def -/nopcolor {pop pop pop} bind def - -/beginpage { % i j npages - /npages exch def - /j exch def - /i exch def - /str 10 string def - npages 1 gt { - gsave - coordfont setfont - 0 0 moveto - (\() show i str cvs show (,) show j str cvs show (\)) show - grestore - } if -} bind def - -/set_font { - findfont exch - scalefont setfont -} def - -% draw text fitted to its expected width -/alignedtext { % width text - /text exch def - /width exch def - gsave - width 0 gt { - [] 0 setdash - text stringwidth pop width exch sub text length div 0 text ashow - } if - grestore -} def - -/boxprim { % xcorner ycorner xsize ysize - 4 2 roll - moveto - 2 copy - exch 0 rlineto - 0 exch rlineto - pop neg 0 rlineto - closepath -} bind def - -/ellipse_path { - /ry exch def - /rx exch def - /y exch def - /x exch def - matrix currentmatrix - newpath - x y translate - rx ry scale - 0 0 1 0 360 arc - setmatrix -} bind def - -/endpage { showpage } bind def -/showpage { } def - -/layercolorseq - [ % layer color sequence - darkest to lightest - [0 0 0] - [.2 .8 .8] - [.4 .8 .8] - [.6 .8 .8] - [.8 .8 .8] - ] -def - -/layerlen layercolorseq length def - -/setlayer {/maxlayer exch def /curlayer exch def - layercolorseq curlayer 1 sub layerlen mod get - aload pop sethsbcolor - /nodecolor {nopcolor} def - /edgecolor {nopcolor} def - /graphcolor {nopcolor} def -} bind def - -/onlayer { curlayer ne {invis} if } def - -/onlayers { - /myupper exch def - /mylower exch def - curlayer mylower lt - curlayer myupper gt - or - {invis} if -} def - -/curlayer 0 def - -%%EndResource -%%EndProlog -%%BeginSetup -14 default-font-family set_font -1 setmiterlimit -% /arrowlength 10 def -% /arrowwidth 5 def - -% make sure pdfmark is harmless for PS-interpreters other than Distiller -/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse -% make '<<' and '>>' safe on PS Level 1 devices -/languagelevel where {pop languagelevel}{1} ifelse -2 lt { - userdict (<<) cvn ([) cvn load put - userdict (>>) cvn ([) cvn load put -} if - -%%EndSetup -setupLatin1 -%%Page: 1 1 -%%PageBoundingBox: 36 36 240 66 -%%PageOrientation: Portrait -0 0 1 beginpage -gsave -36 36 204 30 boxprim clip newpath -1 1 set_scale 0 rotate 40 41 translate -% Node1 -gsave -0 0 0.74902 nodecolor -newpath 0 .5 moveto -0 21.5 lineto -84 21.5 lineto -84 .5 lineto -closepath fill -1 setlinewidth -filled -0 0 0 nodecolor -newpath 0 .5 moveto -0 21.5 lineto -84 21.5 lineto -84 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -8 8.5 moveto 68 (Logging::Debug) alignedtext -grestore -% Node2 -gsave -[ /Rect [ 121 0 195 22 ] - /Border [ 0 0 0 ] - /Action << /Subtype /URI /URI ($class_logging.html#714840794950ab31df5da5b95322e391) >> - /Subtype /Link -/ANN pdfmark -1 setlinewidth -0 0 0 nodecolor -newpath 120.5 .5 moveto -120.5 21.5 lineto -195.5 21.5 lineto -195.5 .5 lineto -closepath stroke -0 0 0 nodecolor -10 /FreeSans set_font -128.5 8.5 moveto 59 (Logging::print) alignedtext -grestore -% Node1->Node2 -gsave -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 84.21 11 moveto -92.59 11 101.45 11 110.01 11 curveto -stroke -0.66667 0.77647 0.43922 edgecolor -newpath 110.24 14.5 moveto -120.24 11 lineto -110.24 7.5 lineto -closepath fill -1 setlinewidth -solid -0.66667 0.77647 0.43922 edgecolor -newpath 110.24 14.5 moveto -120.24 11 lineto -110.24 7.5 lineto -closepath stroke -grestore -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -%%BoundingBox: 36 36 240 66 -end -restore -%%EOF diff --git a/doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 b/doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 deleted file mode 100644 index 8f0071f..0000000 --- a/doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -25ab114c57dd2bf7b625223980cba149 \ No newline at end of file diff --git a/doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.pdf b/doc/latex/class_logging_e0fcd9e5350d7b9158c8ae9289fef193_cgraph.pdf deleted file mode 100644 index fc29eec2ae130a412a6b9c24855ec4dc7132509b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5125 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\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} -} -{\end{tabular*}\par} -\newcommand{\entrylabel}[1]{ - {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\vspace{1.5\baselineskip}}}} -\newenvironment{Desc} -{\begin{list}{} - { - \settowidth{\labelwidth}{40pt} - \setlength{\leftmargin}{\labelwidth} - \setlength{\parsep}{0pt} - \setlength{\itemsep}{-4pt} - \renewcommand{\makelabel}{\entrylabel} - } -} -{\end{list}} -\newenvironment{Indent} - {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} - \item[]\ignorespaces} - {\unskip\end{list}} -\setlength{\parindent}{0cm} -\setlength{\parskip}{0.2cm} -\addtocounter{secnumdepth}{1} -\sloppy -\usepackage[T1]{fontenc} diff --git a/doc/latex/files.tex b/doc/latex/files.tex deleted file mode 100644 index b9066e3..0000000 --- a/doc/latex/files.tex +++ /dev/null @@ -1,5 +0,0 @@ -\section{File List} -Here is a list of all files with brief descriptions:\begin{CompactList} -\item\contentsline{section}{K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/\hyperlink{_logging_8cpp}{Logging.cpp} }{\pageref{_logging_8cpp}}{} -\item\contentsline{section}{K:/Projekte/robotic/arduino/arduino\_\-1-0Patch/libraries/Logging/\hyperlink{_logging_8h}{Logging.h} }{\pageref{_logging_8h}}{} -\end{CompactList} diff --git a/doc/latex/refman.tex b/doc/latex/refman.tex deleted file mode 100644 index 701a4b1..0000000 --- a/doc/latex/refman.tex +++ /dev/null @@ -1,59 +0,0 @@ -\documentclass[a4paper]{book} -\usepackage{a4wide} -\usepackage{makeidx} -\usepackage{fancyhdr} -\usepackage{graphicx} -\usepackage{multicol} -\usepackage{float} -\usepackage{textcomp} -\usepackage{alltt} -\usepackage{times} -\usepackage{ifpdf} -\ifpdf -\usepackage[pdftex, - pagebackref=true, - colorlinks=true, - linkcolor=blue, - unicode - ]{hyperref} -\else -\usepackage[ps2pdf, - pagebackref=true, - colorlinks=true, - linkcolor=blue, - unicode - ]{hyperref} -\usepackage{pspicture} -\fi -\usepackage[utf8]{inputenc} -\usepackage{doxygen} -\makeindex -\setcounter{tocdepth}{3} -\renewcommand{\footrulewidth}{0.4pt} -\begin{document} -\begin{titlepage} -\vspace*{7cm} -\begin{center} -{\Large Logging }\\ -\vspace*{1cm} -{\large Generated by Doxygen 1.5.6}\\ -\vspace*{0.5cm} -{\small Tue Mar 6 20:17:24 2012}\\ -\end{center} -\end{titlepage} -\clearemptydoublepage -\pagenumbering{roman} -\tableofcontents -\clearemptydoublepage -\pagenumbering{arabic} -\chapter{Class Index} -\input{annotated} -\chapter{File Index} -\input{files} -\chapter{Class Documentation} -\input{class_logging} -\chapter{File Documentation} -\input{_logging_8cpp} -\include{_logging_8h} -\printindex -\end{document} diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino new file mode 100644 index 0000000..956f0aa --- /dev/null +++ b/examples/Log/Log.ino @@ -0,0 +1,61 @@ +#include + +/*! +* This example sketch shows most of the features of the ArduinoLog library +* +*/ + + +int intValue1 , intValue2; +long longValue1, longValue2; +bool boolValue1, boolValue2; +char* charArray = "this is a string"; +String stringValue1 = "this is a string"; + +void setup() { + // Set up serial port and wait until connected + Serial.begin(9600); + while(!Serial && !Serial.available()){} + randomSeed(analogRead(0)); + // Pass log level, whether to show log level, and print interface. + // Available levels are: + // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE + // Note: if you want to fully remove all logging code, uncomment #define DISABLE_LOGGING in Logging.h + // this will significantly reduce your project size + + Log.begin(LOG_LEVEL_VERBOSE, &Serial); + + //Start logging + + Log.notice(F(CR"******************************************"CR)); // Info string with Newline + Log.notice( "*** Logging example "CR); // Info string in flash memory + Log.notice(F("******************* ")); Log.notice("*********************** "CR); // two info strings without newline +} + +void loop() { + + // set up some random variables + intValue1 = random(100); + intValue2 = random(10000); + longValue1 = random(1000000); + longValue2 = random(100000000); + boolValue1 = random(2)==0; + boolValue2 = random(2)==1; + + Log.notice ( "Log as Info with integer values : %d, %d"CR , intValue1, intValue2); + Log.notice (F("Log as Info with hex values : %x, %X"CR ), intValue1, intValue1); + Log.notice ( "Log as Info with hex values : %x, %X"CR , intValue2, intValue2); + Log.notice (F("Log as Info with binary values : %b, %B"CR ), intValue1, intValue1); + Log.notice ( "Log as Info with binary values : %b, %B"CR , intValue2, intValue2); + Log.notice (F("Log as Info with long values : %l, %l"CR ), longValue1, longValue2); + Log.notice ( "Log as Info with bool values : %t, %T"CR , boolValue1, boolValue2); + Log.notice (F("Log as Info with string value : %s"CR ), charArray); + Log.notice ( "Log as Info with string value : %s"CR , stringValue1.c_str()); + Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T"CR ), intValue1 , intValue2, + longValue1, longValue2, boolValue1, boolValue2); + Log.warning ( "Log as Waring with bool value : %T"CR , boolValue1); + Log.error ( "Log as Error with bool value : %T"CR , boolValue1); + Log.fatal ( "Log as Fatal with bool value : %T"CR , boolValue1); + Log.verbose (F("Log as Vebose with bool value : %T"CR CR CR ), boolValue2); + delay(5000); +} diff --git a/examples/Logging_example/Logging_example.ino b/examples/Logging_example/Logging_example.ino deleted file mode 100644 index a9ec5e0..0000000 --- a/examples/Logging_example/Logging_example.ino +++ /dev/null @@ -1,47 +0,0 @@ -#include - -/*! -* This example show some examples to use the Log library -* -* Have fun -* mrRobot@web.de -*/ - -// we need a Log object - -#define LOGLEVEL LOG_LEVEL_DEBUG - -int myInt1, myInt2; -long myLong1, myLong2; -bool myBool1, myBool2; -char* myString = "this is a string"; - -void setup() { - Log.Init(LOGLEVEL, 38400L); - Log.Info(CR"******************************************"CR); - Log.Info("My favorite output stuff in future :-)"CR); - Log.Info("******************************************"CR); - myInt1 = 232; - myInt2 = 32199; - myLong1 = 99403020; - myLong2 = 45021; - myBool1 = true; - myBool2 = !myBool1; -} - -void loop() { - Log.Info("Display my integers myInt1 %d, myInt2 %d"CR, myInt1, myInt2); - Log.Info("Display as hex myInt1=%x, myInt1=%X"CR, myInt1, myInt1); - Log.Info("Display as hex myInt2=%x, myInt2=%X"CR, myInt2, myInt2); - Log.Info("Display as binary myInt1=%b, myInt1=%B"CR, myInt1, myInt1); - Log.Info("Display as binary myInt2=%b, myInt2=%B"CR, myInt2, myInt2); - Log.Info("Display my longs myLong1 %l, myLong2=%l"CR, myLong1, myLong2); - Log.Info("Display my bool myBool1=%t, myBool2=%T"CR, myBool1, myBool2); - Log.Info("Output: %s"CR, myString); - Log.Error("is this an real error? %T"CR, myBool2); - Log.Debug("%d, %d, %l, %l, %t, %T"CR, myInt1, myInt2, - myLong1, myLong2, - myBool1, myBool2); - Log.Info(CR"have fun with this Log"CR); - delay(5000); -} diff --git a/examples/Logging_example/Logging_example.ino.bak b/examples/Logging_example/Logging_example.ino.bak deleted file mode 100644 index 303adb6..0000000 --- a/examples/Logging_example/Logging_example.ino.bak +++ /dev/null @@ -1,47 +0,0 @@ -#include - -/*! -* This example show some examples to use the Log library -* -* Have fun -* mrRobot@web.de -*/ - -// we need a Log object - -#define LOGLEVEL LOG_LEVEL_DEBUG - -int myInt1, myInt2; -long myLong1, myLong2; -bool myBool1, myBool2; -char* myString = "this is a string"; - -void setup() { - Log.Init(LOGLEVEL, 38400L); - Log.Info(CR"******************************************"CR); - Log.Info("My favorite output stuff in future :-)"CR); - Log.Info("******************************************"CR); - myInt1 = 232; - myInt2 = 32199; - myLong1 = 99403020; - myLong2 = 45021; - myBool1 = true; - myBool2 = !myBool1; -} - -void loop() { - Log.Info("Display my integers myInt1 %d, myInt2 %d"CR, myInt1, myInt2); - Log.Info("Display as hex myInt1=%x, myInt1=%X"CR, myInt1, myInt1); - Log.Info("Display as hex myInt2=%x, myInt2=%X"CR, myInt2, myInt2); - Log.Info("Display as binary myInt1=%b, myInt1=%B"CR, myInt1, myInt1); - Log.Info("Display as binary myInt2=%b, myInt2=%B"CR, myInt2, myInt2); - Log.Info("Display my longs myLong1 %l, myLong2=%l"CR, myLong1, myLong2); - Log.Info("Display my bool myBool1=%t, myBool2=%T"CR, myBool1, myBool2); - Log.Info("Output: %s"CR, myString); - Log.Error("is this an real error? %T"CR, myBool2); - Log.Debug("%d, %d, %l, %l, %t, %T"CR, myInt1, myInt2, - myLong1, myLong2, - myBool1, myBool2); - Log.Info(CR"have fun with this Log"CR); - delay(5000); -} diff --git a/examples/Logging_example/Logging_example.ino.orig b/examples/Logging_example/Logging_example.ino.orig deleted file mode 100644 index 3c3bab7..0000000 --- a/examples/Logging_example/Logging_example.ino.orig +++ /dev/null @@ -1,47 +0,0 @@ -#include - -/*! -* This example show some examples to use the Log library -* -* Have fun -* mrRobot@web.de -*/ - -// we need a Log object - -#define LOGLEVEL LOG_LEVEL_DEBUG - -int myInt1, myInt2; -long myLong1, myLong2; -bool myBool1, myBool2; -char* myString = "this is a string"; - -void setup() { - Log.Init(LOGLEVEL, 38400L); - Log.Info(CR"******************************************"CR); - Log.Info("My favorite output stuff in future :-)"CR); - Log.Info("******************************************"CR); - myInt1 = 232; - myInt2 = 32199; - myLong1 = 99403020; - myLong2 = 45021; - myBool1 = true; - myBool2 = !myBool1; -} - -void loop() { - Log.Info("Display my integers myInt1 %d, myInt2 %d"CR,myInt1, myInt2); - Log.Info("Display as hex myInt1=%x, myInt1=%X"CR,myInt1, myInt1); - Log.Info("Display as hex myInt2=%x, myInt2=%X"CR,myInt2, myInt2); - Log.Info("Display as binary myInt1=%b, myInt1=%B"CR,myInt1, myInt1); - Log.Info("Display as binary myInt2=%b, myInt2=%B"CR,myInt2, myInt2); - Log.Info("Display my longs myLong1 %l, myLong2=%l"CR,myLong1, myLong2); - Log.Info("Display my bool myBool1=%t, myBool2=%T"CR,myBool1, myBool2); - Log.Info("Output: %s"CR, myString); - Log.Error("is this an real error? %T"CR,myBool2); - Log.Debug("%d, %d, %l, %l, %t, %T"CR,myInt1,myInt2, - myLong1,myLong2, - myBool1,myBool2); - Log.Info(CR"have fun with this Log"CR); - delay(5000); -} diff --git a/keywords.txt b/keywords.txt index eb7d93a..9da6cb9 100644 --- a/keywords.txt +++ b/keywords.txt @@ -1,7 +1,12 @@ ####################################### -# Syntax Coloring Map logging lib +# Syntax Coloring Map ArduinoLog library ####################################### +####################################### +# Instances (KEYWORD1) +####################################### +Logging KEYWORD1 Logging library +Log KEYWORD1 Logging library ####################################### # Datatypes (KEYWORD1) ####################################### @@ -9,12 +14,12 @@ ####################################### # Methods and Functions (KEYWORD2) ####################################### -Error KEYWORD2 error output -Warn KEYWORD2 warning output -Info KEYWORD2 info output -Debug KEYWORD2 debug output -Verbose KEYWORD2 verbose output -Init KEYWORD2 initialiazing +fatal KEYWORD2 fatal error output +error KEYWORD2 error output +warning KEYWORD2 warning output +notice KEYWORD2 info output +verbose KEYWORD2 verbose output +begin KEYWORD2 initialize library ####################################### # Instances (KEYWORD2) diff --git a/library.json b/library.json new file mode 100644 index 0000000..150badb --- /dev/null +++ b/library.json @@ -0,0 +1,26 @@ +{ + "name": "ArduinoLog", + "version": "1.0.0", + "description": "Simple application log library. Simple application log library. Main features: multiple log levels, custom output stream, custom formatting, flash memory support.", + "keywords": "logging, debug, log, log levels", + "authors": + { + "name": "Thijs Elenbaas", + "url": "https://github.com/thijse", + "maintainer": true + }, + "repository": + { + "type": "git", + "url": "https://github.com/thijse/Arduino-Log/" + }, + "homepage": "https://github.com/thijse/Arduino-Log/", + "export": { + "exclude": [ + "extras", + ] + }, + "frameworks": [ "arduino", ], + "platforms": "*", + "examples": "examples/*/*.ino" +} diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..bd3bc15 --- /dev/null +++ b/library.properties @@ -0,0 +1,10 @@ +name=ArduinoLog +version=1.0.0 +author=Thijs Elenbaas +maintainer=Thijs Elenbaas +sentence=Simple log library +paragraph=Simple application log library. Main features: multiple log levels, custom output stream, custom formatting, flash memory support. +category=Communication +url=https://github.com/thijse/Arduino-Log/ +architectures=* +includes=ArduinoLog.h From c3c01804d8275c0597680305cffdc8f49f276576 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Wed, 22 Feb 2017 21:51:02 +0100 Subject: [PATCH 002/109] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7a6c3db..1b9a5dc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ ArduinoLog - C++ Log library for Arduino devices ==================== -[![Build status](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/master?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/master) [![Build Status](https://travis-ci.org/bblanchon/ArduinoJson.svg?branch=master)](https://travis-ci.org/bblanchon/ArduinoJson) [![Coverage Status](https://img.shields.io/coveralls/bblanchon/ArduinoJson.svg)](https://coveralls.io/r/bblanchon/ArduinoJson?branch=master) [![Star this project](http://githubbadges.com/star.svg?user=bblanchon&repo=ArduinoJson&style=flat&color=fff&background=007ec6)](https://github.com/bblanchon/ArduinoJson) - *An small Logging library for embedded systems.* It's designed to expose the main features of extensive logging libraries such as log4j, log4net & CocoaLumberjack, with a small footprint. @@ -20,7 +18,6 @@ It's designed to expose the main features of extensive logging libraries such as * All Arduino boards (Uno, Due, Mini, Micro, Yun...) * ESP8266 -## Downloading ## Downloading @@ -63,11 +60,12 @@ begin(int level, Print* logOutput) The loglevels available are ``` -* 0 - LOG_LEVEL_NONE no output -* 1 - LOG_LEVEL_ERROR errors -* 2 - LOG_LEVEL_INFO errors and info -* 3 - LOG_LEVEL_DEBUG errors, info and debug -* 4 - LOG_LEVEL_VERBOSE all +* 0 - LOG_LEVEL_SILENT no output +* 1 - LOG_LEVEL_FATAL fatal errors +* 2 - LOG_LEVEL_ERROR all errors +* 3 - LOG_LEVEL_WARNING errors, and warnings +* 4 - LOG_LEVEL_NOTICE errors, warnings and notices +* 5 - LOG_LEVEL_VERBOSE all ``` example @@ -119,11 +117,13 @@ examples Based on library by * https://github.com/mrRobot62 + Bugfixes & features by * https://github.com/rahuldeo2047 * https://github.com/NOX73 * https://github.com/dhylands + ## On using and modifying libraries - [http://www.arduino.cc/en/Main/Libraries](http://www.arduino.cc/en/Main/Libraries) From 7a53c09ff3aa48a17849ad98406ceed976da3326 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Wed, 22 Feb 2017 21:51:37 +0100 Subject: [PATCH 003/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b9a5dc..a51273d 100644 --- a/README.md +++ b/README.md @@ -131,5 +131,5 @@ Bugfixes & features by ## Copyright -CmdMessenger is provided Copyright © 2017 under MIT License. +ArduinoLog is provided Copyright © 2017 under MIT License. From 1c765eb1657e40f16d27d17c4f90ca8b5722bc9c Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:33:01 +0100 Subject: [PATCH 004/109] Update README.md --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a51273d..aaee3f0 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ArduinoLog - C++ Log library for Arduino devices *An small Logging library for embedded systems.* -It's designed to expose the main features of extensive logging libraries such as log4j, log4net & CocoaLumberjack, with a small footprint. +ArduinoLog is a minimalistic framework to help the programmer output log statements to a variety of output targets, fashioned after xtensive logging libraries such as log4cpp ,log4j and log4net. In case of problems with an application, it is helpful to enable logging so that the problem can be located. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. ## Features @@ -90,6 +90,7 @@ void verbose(const char *format, va_list logVariables); where the format string can be used to format the log variables +``` * %s display as string (char*) * %c display as single character * %d display as integer value @@ -100,6 +101,7 @@ where the format string can be used to format the log variables * %B display as binary number, prefixed by `0b' * %t display as boolean value "t" or "f" * %T display as boolean value "true" or "false" +``` The format string may come from flash memory. @@ -116,12 +118,12 @@ examples ## Credit Based on library by -* https://github.com/mrRobot62 +* [/mrRobot62](https://github.com/mrRobot62) Bugfixes & features by -* https://github.com/rahuldeo2047 -* https://github.com/NOX73 -* https://github.com/dhylands +* [rahuldeo2047](https://github.com/rahuldeo2047) +* [NOX73](https://github.com/NOX73) +* [dhylands](https://github.com/dhylands) ## On using and modifying libraries From 9e732b3758655b62732172216748c565e4d4af60 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:49:07 +0100 Subject: [PATCH 005/109] Update README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index aaee3f0..ab0cb2d 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ void error (const char *format, va_list logVariables); void debug (const char *format, va_list logVariables); void error (const char *format, va_list logVariables); void verbose(const char *format, va_list logVariables); - +void verbose(const char *format, va_list logVariables); ``` where the format string can be used to format the log variables @@ -108,10 +108,11 @@ The format string may come from flash memory. examples ``` - Log.info ( "Log as Info with integer values : %d, %d"CR , 34, 799870); - Log.debug (F("Log as Debug with hex values from Flash : %x, %X"CR ), 24342, 25546); - Log.error (F("Log as Error with string value from Flash : %s"CR ), "value"); - Log.verbose ( "Log as Verbose with long value : %l"CR , 7979); + Log.fatal (F("Log as Fatal with string value from Flash : %s"CR ) , "value" ); + Log.error ( "Log as Error with binary values : %b, %B"CR , 23 , 345808); + Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); + Log.notice ( "Log as Notice with hexadecimal values : %x, %X"CR , 21 , 348972); + Log.verbose (F("Log as Verbose with bool value from Flash : %t, %T"CR) , true, false ); ``` From b16741ff50aab3cd8b80474e7fc24477abd473ff Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:52:13 +0100 Subject: [PATCH 006/109] Create LICENSE.ml --- LICENSE.ml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE.ml diff --git a/LICENSE.ml b/LICENSE.ml new file mode 100644 index 0000000..f87a4ae --- /dev/null +++ b/LICENSE.ml @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From ecc6b0c7a9aa89780fb8a2208b4f94746531ec1d Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:53:26 +0100 Subject: [PATCH 007/109] Rename LICENSE.ml to LICENSE.md --- LICENSE.ml => LICENSE.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE.ml => LICENSE.md (100%) diff --git a/LICENSE.ml b/LICENSE.md similarity index 100% rename from LICENSE.ml rename to LICENSE.md From 5676a543788019a8e98bab6d1ed304b5ab5501dc Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:54:31 +0100 Subject: [PATCH 008/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab0cb2d..cabcd7a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ArduinoLog - C++ Log library for Arduino devices ==================== -*An small Logging library for embedded systems.* +*An minimalistic Logging framework for Arduino-compatible embedded systems.* ArduinoLog is a minimalistic framework to help the programmer output log statements to a variety of output targets, fashioned after xtensive logging libraries such as log4cpp ,log4j and log4net. In case of problems with an application, it is helpful to enable logging so that the problem can be located. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. From 9002a16bdfeae673f5ecd1ef38dc7c2d1c41abbe Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:56:39 +0100 Subject: [PATCH 009/109] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cabcd7a..0e86ed5 100644 --- a/README.md +++ b/README.md @@ -40,10 +40,11 @@ This package has not yet been published to the Arduino & PlatformIO package mana // Initialize with log level and log output. Log.begin(LOG_LEVEL_VERBOSE, &Serial); - Log.info ( "Log as Info with integer values : %d, %d"CR , 34, 799870); + Log.error ( "Log as Error with binary values : %b, %B"CR , 23 , 345808); + Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); ``` -[See JsonParserExample.ino](examples/Log/Log.ino) +[See examples/ArduinoLog/Log.ino](examples/ArduinoLog/Log.ino) ## Usage From 02b1ca57cbcc62acb408ff5b9c0ea576c6d40cd1 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:57:13 +0100 Subject: [PATCH 010/109] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0e86ed5..ec2e11d 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ if you want to fully remove all logging code, uncomment `#define DISABLE_LOGGING The library allows you to log on different levels by the following functions -``` +```c++ void error (const char *format, va_list logVariables); void debug (const char *format, va_list logVariables); void error (const char *format, va_list logVariables); @@ -108,7 +108,7 @@ The format string may come from flash memory. examples -``` +```c++ Log.fatal (F("Log as Fatal with string value from Flash : %s"CR ) , "value" ); Log.error ( "Log as Error with binary values : %b, %B"CR , 23 , 345808); Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); From c0b9720e7dd52ebbe561cd874e069727aaae6613 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:57:57 +0100 Subject: [PATCH 011/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec2e11d..419ec2e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ ArduinoLog is a minimalistic framework to help the programmer output log stateme * Different log levels (Error, Info, Warn, Debug, Verbose ) * Supports multiple variables * Supports formatted strings -* Supports formatted strings from flash memeory +* Supports formatted strings from flash memory * Fixed memory allocation (zero malloc) * MIT License From c42ce791971d22361dc9f020b51f218e7c1e857b Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:58:26 +0100 Subject: [PATCH 012/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 419ec2e..d19e684 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ This package has not yet been published to the Arduino & PlatformIO package mana Serial.begin(9600); // Initialize with log level and log output. - Log.begin(LOG_LEVEL_VERBOSE, &Serial); + Log.begin (LOG_LEVEL_VERBOSE, &Serial); Log.error ( "Log as Error with binary values : %b, %B"CR , 23 , 345808); Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); ``` From d2937375152bb50085c70bad156bc0506dace364 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 10:59:10 +0100 Subject: [PATCH 013/109] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d19e684..fbeb8e7 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,8 @@ This package has not yet been published to the Arduino & PlatformIO package mana // Initialize with log level and log output. Log.begin (LOG_LEVEL_VERBOSE, &Serial); + + // Start logging text and formatted values Log.error ( "Log as Error with binary values : %b, %B"CR , 23 , 345808); Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); ``` From a8e6847a04d230b67a8f1ec035c3442f016009f6 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 11:01:50 +0100 Subject: [PATCH 014/109] Update library.properties --- library.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index bd3bc15..c633c63 100644 --- a/library.properties +++ b/library.properties @@ -2,8 +2,8 @@ name=ArduinoLog version=1.0.0 author=Thijs Elenbaas maintainer=Thijs Elenbaas -sentence=Simple log library -paragraph=Simple application log library. Main features: multiple log levels, custom output stream, custom formatting, flash memory support. +sentence=Small logging framework +paragraph=ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a variety of output targets. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards. category=Communication url=https://github.com/thijse/Arduino-Log/ architectures=* From ce038f8dc2a48b09e4dff77b01f8e6837bd5f934 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 11:03:12 +0100 Subject: [PATCH 015/109] Update library.json --- library.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index 150badb..eff27eb 100644 --- a/library.json +++ b/library.json @@ -1,8 +1,8 @@ { "name": "ArduinoLog", "version": "1.0.0", - "description": "Simple application log library. Simple application log library. Main features: multiple log levels, custom output stream, custom formatting, flash memory support.", - "keywords": "logging, debug, log, log levels", + "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", + "keywords": "logging, debug, log, log levels, AVR, ESP8266, ", "authors": { "name": "Thijs Elenbaas", From 3365e3eed12282c13a7678617cb49b5af970480a Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 11:14:56 +0100 Subject: [PATCH 016/109] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fbeb8e7..0fded83 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ArduinoLog - C++ Log library for Arduino devices *An minimalistic Logging framework for Arduino-compatible embedded systems.* -ArduinoLog is a minimalistic framework to help the programmer output log statements to a variety of output targets, fashioned after xtensive logging libraries such as log4cpp ,log4j and log4net. In case of problems with an application, it is helpful to enable logging so that the problem can be located. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. +ArduinoLog is a minimalistic framework to help the programmer output log statements to an output of choice, fashioned after extensive logging libraries such as log4cpp ,log4j and log4net. In case of problems with an application, it is helpful to enable logging so that the problem can be located. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and (if your code is completely tested) all logging code can be compiled out. ## Features @@ -118,6 +118,13 @@ examples Log.verbose (F("Log as Verbose with bool value from Flash : %t, %T"CR) , true, false ); ``` +### Disable library + +(if your code is completely tested) all logging code can be compiled out. Do this by uncommenting +```c++ +#define DISABLE_LOGGING +``` +in `Logging.h`. This may significantly reduce your project size. ## Credit From 38a99c2e9e381c3d4ba48165bf1719fc5144921e Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 22:07:56 +0100 Subject: [PATCH 017/109] Added Trace loglevel --- ArduinoLog.h | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/ArduinoLog.h b/ArduinoLog.h index 7f6d06b..eebf9d3 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -35,7 +35,8 @@ Licensed under the MIT License . #define LOG_LEVEL_ERROR 2 #define LOG_LEVEL_WARNING 3 #define LOG_LEVEL_NOTICE 4 -#define LOG_LEVEL_VERBOSE 5 +#define LOG_LEVEL_TRACE 5 +#define LOG_LEVEL_VERBOSE 6 #define CR "\n" #define LOGGING_VERSION 1_0_0 @@ -72,7 +73,8 @@ Licensed under the MIT License . * 2 - LOG_LEVEL_ERROR all errors * 3 - LOG_LEVEL_WARNING errors, and warnings * 4 - LOG_LEVEL_NOTICE errors, warnings and notices -* 5 - LOG_LEVEL_VERBOSE all +* 5 - LOG_LEVEL_TRACE errors, warnings, notices, traces +* 6 - LOG_LEVEL_VERBOSE all */ class Logging { @@ -180,6 +182,26 @@ class Logging { } #endif } + /** + * Output a trace message. Output message contains + * Debug messages are printed out at l + * loglevels >= LOG_LEVEL_VERBOSE + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void trace(T msg, ...){ +#ifndef DISABLE_LOGGING + if (LOG_LEVEL_TRACE <= _level) { + if (_showLevel) _logOutput->print("T: "); + va_list args; + va_start(args, msg); + print(msg,args); + } +#endif + } + /** * Output an verbose message. Output message contains * Debug messages are printed out at l From 4a5205b3824b206867c4f547d73f6388a99fe7a8 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 22:08:51 +0100 Subject: [PATCH 018/109] Update keywords.txt --- keywords.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/keywords.txt b/keywords.txt index 9da6cb9..dd829b1 100644 --- a/keywords.txt +++ b/keywords.txt @@ -18,6 +18,7 @@ fatal KEYWORD2 fatal error output error KEYWORD2 error output warning KEYWORD2 warning output notice KEYWORD2 info output +trace KEYWORD2 trace output verbose KEYWORD2 verbose output begin KEYWORD2 initialize library From c3813799a739ad03adb46221f7bf9681a9d900d4 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 22:10:54 +0100 Subject: [PATCH 019/109] Update README.md --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0fded83..28144b4 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,8 @@ The loglevels available are * 2 - LOG_LEVEL_ERROR all errors * 3 - LOG_LEVEL_WARNING errors, and warnings * 4 - LOG_LEVEL_NOTICE errors, warnings and notices -* 5 - LOG_LEVEL_VERBOSE all +* 5 - LOG_LEVEL_TRACE errors, warnings, notices & traces +* 6 - LOG_LEVEL_VERBOSE all ``` example @@ -84,11 +85,12 @@ if you want to fully remove all logging code, uncomment `#define DISABLE_LOGGING The library allows you to log on different levels by the following functions ```c++ -void error (const char *format, va_list logVariables); -void debug (const char *format, va_list logVariables); -void error (const char *format, va_list logVariables); -void verbose(const char *format, va_list logVariables); -void verbose(const char *format, va_list logVariables); +void fatal (const char *format, va_list logVariables); +void error (const char *format, va_list logVariables); +void warning (const char *format, va_list logVariables); +void notice (const char *format, va_list logVariables); +void trace (const char *format, va_list logVariables); +void verbose (const char *format, va_list logVariables); ``` where the format string can be used to format the log variables From ae87cf5b3724d572031ad977887c44781ce656fa Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 22:15:42 +0100 Subject: [PATCH 020/109] Updated sketch to show Trace --- examples/Log/Log.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index 956f0aa..60e7cd0 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -53,9 +53,10 @@ void loop() { Log.notice ( "Log as Info with string value : %s"CR , stringValue1.c_str()); Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T"CR ), intValue1 , intValue2, longValue1, longValue2, boolValue1, boolValue2); - Log.warning ( "Log as Waring with bool value : %T"CR , boolValue1); + Log.trace ( "Log as Trace with bool value : %T"CR , boolValue1); + Log.warning ( "Log as Warning with bool value : %T"CR , boolValue1); Log.error ( "Log as Error with bool value : %T"CR , boolValue1); Log.fatal ( "Log as Fatal with bool value : %T"CR , boolValue1); Log.verbose (F("Log as Vebose with bool value : %T"CR CR CR ), boolValue2); delay(5000); -} +} \ No newline at end of file From 36d6dc2cee2109a5ea5682d96640c7e304a40824 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 22:25:16 +0100 Subject: [PATCH 021/109] Create .travis.yml --- .travis.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7b984a6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +{ + "language": "c", + "before_install": [ + "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16", + "sleep 3", + "export DISPLAY=:1.0", + "wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz", + "tar xf arduino-1.6.9-linux64.tar.xz", + "sudo mv arduino-1.6.9 /usr/local/share/arduino", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino" + ], + "install": [ + "ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog" + ], + "script": [ + "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", + ], + "group": "stable", + "dist": "precise", + "os": "linux" +} From d4171cda6f568d8def337d9980cea29a91f2b9fb Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 22:27:46 +0100 Subject: [PATCH 022/109] Update .travis.yml From 03f309a7907294c951c9f50f1fa48206f15d83c0 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 22:33:25 +0100 Subject: [PATCH 023/109] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 28144b4..928dcdf 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ ArduinoLog - C++ Log library for Arduino devices ==================== +[![Build Status](https://travis-ci.org/thijse/Arduino-Log.svg?branch=master)](https://travis-ci.org/thijse/Arduino-Log) *An minimalistic Logging framework for Arduino-compatible embedded systems.* From 508eb99c2b047b097fa5b15211c513f3013015d5 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 22:41:15 +0100 Subject: [PATCH 024/109] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 928dcdf..8bb5e38 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ArduinoLog - C++ Log library for Arduino devices ==================== [![Build Status](https://travis-ci.org/thijse/Arduino-Log.svg?branch=master)](https://travis-ci.org/thijse/Arduino-Log) +[![License](http://img.shields.io/:license-mit-blue.svg)](http://doge.mit-license.org) *An minimalistic Logging framework for Arduino-compatible embedded systems.* From 14748402f939c324d017aef7152bdfb35eee2ff0 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 23:17:50 +0100 Subject: [PATCH 025/109] Update .travis.yml --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7b984a6..87d0f5a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,8 @@ "export DISPLAY=:1.0", "wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz", "tar xf arduino-1.6.9-linux64.tar.xz", - "sudo mv arduino-1.6.9 /usr/local/share/arduino", + "sudo rm /usr/local/share/arduino", + "sudo ln -s arduino-1.6.9 /usr/local/share/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino" ], "install": [ From 6867fd2ad463e9a249bb84378522e92a7c9abc19 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 23 Feb 2017 23:33:40 +0100 Subject: [PATCH 026/109] Update .travis.yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 87d0f5a..9647a94 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,6 @@ "export DISPLAY=:1.0", "wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz", "tar xf arduino-1.6.9-linux64.tar.xz", - "sudo rm /usr/local/share/arduino", "sudo ln -s arduino-1.6.9 /usr/local/share/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino" ], From ad076bbaa319163b842f0b52e800decbd655e604 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 09:59:55 +0100 Subject: [PATCH 027/109] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9647a94..ed1929c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ "export DISPLAY=:1.0", "wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz", "tar xf arduino-1.6.9-linux64.tar.xz", - "sudo ln -s arduino-1.6.9 /usr/local/share/arduino", + "sudo cp arduino-1.6.9 /usr/local/share/arduino" "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino" ], "install": [ From 3f76bf23ca25b632e2c16613967c7f4eb21c4fa8 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 10:02:36 +0100 Subject: [PATCH 028/109] Fixed typo .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ed1929c..586b1c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ "export DISPLAY=:1.0", "wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz", "tar xf arduino-1.6.9-linux64.tar.xz", - "sudo cp arduino-1.6.9 /usr/local/share/arduino" + "sudo cp arduino-1.6.9 /usr/local/share/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino" ], "install": [ From 7725c8bc37e3223d2cd9e70daeaf60073395234b Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 10:25:34 +0100 Subject: [PATCH 029/109] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 586b1c2..e509781 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ "export DISPLAY=:1.0", "wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz", "tar xf arduino-1.6.9-linux64.tar.xz", - "sudo cp arduino-1.6.9 /usr/local/share/arduino", + "sudo cp -r arduino-1.6.9 /usr/local/share/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino" ], "install": [ From 4d99a0f34d8b5576902412f4c609dcd27c303b5d Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 10:28:13 +0100 Subject: [PATCH 030/109] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e509781..d6dfdda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino" ], "install": [ - "ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog" + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog" ], "script": [ "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", From 8e0e70eafb9b5c9fb8e1ceddf2c5315ce79853eb Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 10:32:38 +0100 Subject: [PATCH 031/109] Update .travis.yml --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index d6dfdda..3e38441 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,14 +5,14 @@ "sleep 3", "export DISPLAY=:1.0", "wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz", - "tar xf arduino-1.6.9-linux64.tar.xz", - "sudo cp -r arduino-1.6.9 /usr/local/share/arduino", - "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino" + "tar xf arduino-1.6.9-linux64.tar.xz" ], - "install": [ - "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog" + "install": [ ], "script": [ + "sudo cp -r arduino-1.6.9 /usr/local/share/arduino", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", ], "group": "stable", From ba2200074b7fd1684fc0e584b90793010bda3248 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 10:47:00 +0100 Subject: [PATCH 032/109] Remove warnings raised by example --- examples/Log/Log.ino | 46 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index 60e7cd0..4d041ef 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -6,11 +6,11 @@ */ -int intValue1 , intValue2; -long longValue1, longValue2; -bool boolValue1, boolValue2; -char* charArray = "this is a string"; -String stringValue1 = "this is a string"; +int intValue1 , intValue2; +long longValue1, longValue2; +bool boolValue1, boolValue2; +const char * charArray = "this is a string"; +String stringValue1 = "this is a string"; void setup() { // Set up serial port and wait until connected @@ -27,9 +27,9 @@ void setup() { //Start logging - Log.notice(F(CR"******************************************"CR)); // Info string with Newline - Log.notice( "*** Logging example "CR); // Info string in flash memory - Log.notice(F("******************* ")); Log.notice("*********************** "CR); // two info strings without newline + Log.notice(F(CR "******************************************" CR)); // Info string with Newline + Log.notice( "*** Logging example " CR); // Info string in flash memory + Log.notice(F("******************* ")); Log.notice("*********************** " CR); // two info strings without newline } void loop() { @@ -42,21 +42,21 @@ void loop() { boolValue1 = random(2)==0; boolValue2 = random(2)==1; - Log.notice ( "Log as Info with integer values : %d, %d"CR , intValue1, intValue2); - Log.notice (F("Log as Info with hex values : %x, %X"CR ), intValue1, intValue1); - Log.notice ( "Log as Info with hex values : %x, %X"CR , intValue2, intValue2); - Log.notice (F("Log as Info with binary values : %b, %B"CR ), intValue1, intValue1); - Log.notice ( "Log as Info with binary values : %b, %B"CR , intValue2, intValue2); - Log.notice (F("Log as Info with long values : %l, %l"CR ), longValue1, longValue2); - Log.notice ( "Log as Info with bool values : %t, %T"CR , boolValue1, boolValue2); - Log.notice (F("Log as Info with string value : %s"CR ), charArray); - Log.notice ( "Log as Info with string value : %s"CR , stringValue1.c_str()); - Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T"CR ), intValue1 , intValue2, + Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); + Log.notice (F("Log as Info with hex values : %x, %X" CR ), intValue1, intValue1); + Log.notice ( "Log as Info with hex values : %x, %X" CR , intValue2, intValue2); + Log.notice (F("Log as Info with binary values : %b, %B" CR ), intValue1, intValue1); + Log.notice ( "Log as Info with binary values : %b, %B" CR , intValue2, intValue2); + Log.notice (F("Log as Info with long values : %l, %l" CR ), longValue1, longValue2); + Log.notice ( "Log as Info with bool values : %t, %T" CR , boolValue1, boolValue2); + Log.notice (F("Log as Info with string value : %s" CR ), charArray); + Log.notice ( "Log as Info with string value : %s" CR , stringValue1.c_str()); + Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR ), intValue1 , intValue2, longValue1, longValue2, boolValue1, boolValue2); - Log.trace ( "Log as Trace with bool value : %T"CR , boolValue1); - Log.warning ( "Log as Warning with bool value : %T"CR , boolValue1); - Log.error ( "Log as Error with bool value : %T"CR , boolValue1); - Log.fatal ( "Log as Fatal with bool value : %T"CR , boolValue1); - Log.verbose (F("Log as Vebose with bool value : %T"CR CR CR ), boolValue2); + Log.trace ( "Log as Trace with bool value : %T" CR , boolValue1); + Log.warning ( "Log as Warning with bool value : %T" CR , boolValue1); + Log.error ( "Log as Error with bool value : %T" CR , boolValue1); + Log.fatal ( "Log as Fatal with bool value : %T" CR , boolValue1); + Log.verbose (F("Log as Vebose with bool value : %T" CR CR CR ), boolValue2); delay(5000); } \ No newline at end of file From c631d52c5e28ec4db45a32903b56ad70dee4b2c7 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 11:07:01 +0100 Subject: [PATCH 033/109] Update .travis.yml --- .travis.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3e38441..5bc009f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,16 +4,23 @@ "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16", "sleep 3", "export DISPLAY=:1.0", - "wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz", - "tar xf arduino-1.6.9-linux64.tar.xz" + "wget http://downloads.arduino.cc/arduino-1.8.1-linux64.tar.xz", + "wget http://downloads.arduino.cc/arduino-1.6.13-linux64.tar.xz", + "tar xf arduino-1.6.13-linux64.tar.xz" + "tar xf arduino-1.8.1-linux64.tar.xz" ], "install": [ ], "script": [ - "sudo cp -r arduino-1.6.9 /usr/local/share/arduino", + "sudo cp -r arduino-1.6.13 /usr/local/share/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", + "sudo cp -r arduino-1.8.1 /usr/local/share/arduino", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", + "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", + ], "group": "stable", "dist": "precise", From b9a6aec3ce688ddbefd61717f7ddf4f9d2384f87 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 11:07:15 +0100 Subject: [PATCH 034/109] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5bc009f..9993eca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ "export DISPLAY=:1.0", "wget http://downloads.arduino.cc/arduino-1.8.1-linux64.tar.xz", "wget http://downloads.arduino.cc/arduino-1.6.13-linux64.tar.xz", - "tar xf arduino-1.6.13-linux64.tar.xz" + "tar xf arduino-1.6.13-linux64.tar.xz", "tar xf arduino-1.8.1-linux64.tar.xz" ], "install": [ From 974e582f43dc98defdc6e613e60ccc201afa00ce Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 11:12:38 +0100 Subject: [PATCH 035/109] Update .travis.yml --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 9993eca..a1b8afd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,9 @@ "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", + "sudo rm -rf /usr/local/share/arduino", "sudo cp -r arduino-1.8.1 /usr/local/share/arduino", + "sudo rm /usr/local/bin/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", From f90ffc185b7fa89b09bd1dbac61ceee13815ca5a Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 11:29:14 +0100 Subject: [PATCH 036/109] Update .travis.yml --- .travis.yml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index a1b8afd..9983e36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,17 +12,16 @@ "install": [ ], "script": [ - "sudo cp -r arduino-1.6.13 /usr/local/share/arduino", - "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", - "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", + "sudo cp -r arduino-1.6.13 /usr/local/share/arduino /dev/null 2>&1", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino /dev/null 2>&1", + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog /dev/null 2>&1", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", - "sudo rm -rf /usr/local/share/arduino", - "sudo cp -r arduino-1.8.1 /usr/local/share/arduino", - "sudo rm /usr/local/bin/arduino", - "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", - "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", - "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", - + "sudo rm -rf /usr/local/share/arduino /dev/null 2>&1", + "sudo cp -r arduino-1.8.1 /usr/local/share/arduino /dev/null 2>&1", + "sudo rm /usr/local/bin/arduino /dev/null 2>&1", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino /dev/null 2>&1", + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog /dev/null 2>&1", + "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino" ], "group": "stable", "dist": "precise", From a22c8df11c08160f24fe13eb32318ab97ac4bd8f Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 11:40:20 +0100 Subject: [PATCH 037/109] Update .travis.yml --- .travis.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9983e36..0e7cd80 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,15 +12,15 @@ "install": [ ], "script": [ - "sudo cp -r arduino-1.6.13 /usr/local/share/arduino /dev/null 2>&1", - "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino /dev/null 2>&1", - "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog /dev/null 2>&1", + "sudo cp -r arduino-1.6.13 /usr/local/share/arduino > /dev/null 2>&1", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino > /dev/null 2>&1", + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog > /dev/null 2>&1", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", - "sudo rm -rf /usr/local/share/arduino /dev/null 2>&1", - "sudo cp -r arduino-1.8.1 /usr/local/share/arduino /dev/null 2>&1", - "sudo rm /usr/local/bin/arduino /dev/null 2>&1", - "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino /dev/null 2>&1", - "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog /dev/null 2>&1", + "sudo rm -rf /usr/local/share/arduino /dev/null >2>&1", + "sudo cp -r arduino-1.8.1 /usr/local/share/arduino >/dev/null 2>&1", + "sudo rm /usr/local/bin/arduino >/dev/null 2>&1", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino >/dev/null 2>&1", + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog >/dev/null 2>&1", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino" ], "group": "stable", From 6d873821867dab19a86528f6796a1c1452119504 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 12:23:24 +0100 Subject: [PATCH 038/109] Update .travis.yml --- .travis.yml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0e7cd80..d10d2ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,15 +12,18 @@ "install": [ ], "script": [ - "sudo cp -r arduino-1.6.13 /usr/local/share/arduino > /dev/null 2>&1", - "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino > /dev/null 2>&1", - "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog > /dev/null 2>&1", + "sudo cp -r arduino-1.6.13 /usr/local/share/arduino ", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", + "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", - "sudo rm -rf /usr/local/share/arduino /dev/null >2>&1", - "sudo cp -r arduino-1.8.1 /usr/local/share/arduino >/dev/null 2>&1", - "sudo rm /usr/local/bin/arduino >/dev/null 2>&1", - "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino >/dev/null 2>&1", - "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog >/dev/null 2>&1", + + "sudo rm -rf /usr/local/share/arduino", + "sudo cp -r arduino-1.8.1 /usr/local/share/arduino", + "sudo rm /usr/local/bin/arduino", + "sudo ln -s /usr/local/share/arduino/arduino", + "sudo ln -s $PWD /usr/local/share/arduino", + "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino" ], "group": "stable", From 9bd6f4ea55398cc734561250d280146287768731 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 13:12:33 +0100 Subject: [PATCH 039/109] Update .travis.yml --- .travis.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index d10d2ff..6157095 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,16 +14,13 @@ "script": [ "sudo cp -r arduino-1.6.13 /usr/local/share/arduino ", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", - "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", - - "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", - + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", + "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", "sudo rm -rf /usr/local/share/arduino", "sudo cp -r arduino-1.8.1 /usr/local/share/arduino", "sudo rm /usr/local/bin/arduino", "sudo ln -s /usr/local/share/arduino/arduino", - "sudo ln -s $PWD /usr/local/share/arduino", - + "sudo ln -s $PWD /usr/local/share/arduino", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino" ], "group": "stable", From 5a8740a0b3054cbc6faaa9ca38b5bbf7d50e3ca4 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 13:46:40 +0100 Subject: [PATCH 040/109] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6157095..a03e01d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ "sudo cp -r arduino-1.8.1 /usr/local/share/arduino", "sudo rm /usr/local/bin/arduino", "sudo ln -s /usr/local/share/arduino/arduino", - "sudo ln -s $PWD /usr/local/share/arduino", + "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino" ], "group": "stable", From 63a149f27a119072c40d460b9f49eb526fabc823 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Fri, 24 Feb 2017 13:59:16 +0100 Subject: [PATCH 041/109] Update .travis.yml --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a03e01d..167bd7b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,14 +12,15 @@ "install": [ ], "script": [ - "sudo cp -r arduino-1.6.13 /usr/local/share/arduino ", + "sudo cp -r arduino-1.6.13 /usr/local/share/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", + "sudo rm -rf /usr/local/share/arduino", "sudo cp -r arduino-1.8.1 /usr/local/share/arduino", "sudo rm /usr/local/bin/arduino", - "sudo ln -s /usr/local/share/arduino/arduino", + "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino" ], From 125374c431aef6f02c9b8e016da83d0493067988 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Tue, 7 Mar 2017 11:46:53 +0100 Subject: [PATCH 042/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8bb5e38..ff4df66 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ArduinoLog - C++ Log library for Arduino devices ==================== [![Build Status](https://travis-ci.org/thijse/Arduino-Log.svg?branch=master)](https://travis-ci.org/thijse/Arduino-Log) -[![License](http://img.shields.io/:license-mit-blue.svg)](http://doge.mit-license.org) +[![License](https://img.shields.io/badge/license-MIT%20License-blue.svg)](http://doge.mit-license.org) *An minimalistic Logging framework for Arduino-compatible embedded systems.* From 33d3f35fc1a44c7d679ea4b2863bcfb4454f6b7b Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Sun, 12 Mar 2017 22:54:09 +1100 Subject: [PATCH 043/109] Remove incorrect exclude --- library.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/library.json b/library.json index eff27eb..d8470ad 100644 --- a/library.json +++ b/library.json @@ -15,11 +15,6 @@ "url": "https://github.com/thijse/Arduino-Log/" }, "homepage": "https://github.com/thijse/Arduino-Log/", - "export": { - "exclude": [ - "extras", - ] - }, "frameworks": [ "arduino", ], "platforms": "*", "examples": "examples/*/*.ino" From 7a69284516a80abcbfe69fc0c6ebe3b9ea3b4061 Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Sun, 12 Mar 2017 22:57:50 +1100 Subject: [PATCH 044/109] Remove trailing comma --- library.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.json b/library.json index d8470ad..e48768d 100644 --- a/library.json +++ b/library.json @@ -15,7 +15,7 @@ "url": "https://github.com/thijse/Arduino-Log/" }, "homepage": "https://github.com/thijse/Arduino-Log/", - "frameworks": [ "arduino", ], + "frameworks": [ "arduino" ], "platforms": "*", "examples": "examples/*/*.ino" } From 240eb5c3d40fc750082ba0740966e385c981b7bf Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 12 Mar 2017 22:24:33 +0100 Subject: [PATCH 045/109] Update library.json --- library.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.json b/library.json index e48768d..5b59c1a 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "ArduinoLog", - "version": "1.0.0", + "version": "1.0.1", "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", "keywords": "logging, debug, log, log levels, AVR, ESP8266, ", "authors": From 123caa7882836a5da58c364fd486a3931e3f30d6 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 12 Mar 2017 22:24:47 +0100 Subject: [PATCH 046/109] Update library.properties --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index c633c63..412e3e2 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ArduinoLog -version=1.0.0 +version=1.0.1 author=Thijs Elenbaas maintainer=Thijs Elenbaas sentence=Small logging framework From f2d344c667eaf3d2c79f5a6f6e7ea398b99e4e47 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 12 Mar 2017 22:45:07 +0100 Subject: [PATCH 047/109] Update library.json --- library.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.json b/library.json index 5b59c1a..be8b7d9 100644 --- a/library.json +++ b/library.json @@ -2,7 +2,7 @@ "name": "ArduinoLog", "version": "1.0.1", "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", - "keywords": "logging, debug, log, log levels, AVR, ESP8266, ", + "keywords": "logging, debug, log, log levels, AVR, ESP8266", "authors": { "name": "Thijs Elenbaas", From 503e93f222591d5342fde4fc05cb2a78134afecd Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 12 Mar 2017 22:48:57 +0100 Subject: [PATCH 048/109] Update library.json --- library.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library.json b/library.json index be8b7d9..a23cde3 100644 --- a/library.json +++ b/library.json @@ -1,8 +1,8 @@ { - "name": "ArduinoLog", - "version": "1.0.1", - "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", + "name": "ArduinoLog", "keywords": "logging, debug, log, log levels, AVR, ESP8266", + "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", + "version": "1.0.1", "authors": { "name": "Thijs Elenbaas", From b2a61cf8b199edaaacc8b8b6bf765f8e58c32b3d Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 12 Mar 2017 22:51:24 +0100 Subject: [PATCH 049/109] Update library.json --- library.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index a23cde3..949b228 100644 --- a/library.json +++ b/library.json @@ -12,10 +12,10 @@ "repository": { "type": "git", - "url": "https://github.com/thijse/Arduino-Log/" + "url": "https://github.com/thijse/Arduino-Log.git" }, "homepage": "https://github.com/thijse/Arduino-Log/", - "frameworks": [ "arduino" ], + "frameworks": "arduino", "platforms": "*", "examples": "examples/*/*.ino" } From c7df089c8b2fce9c05bfe2dfee052df2c3cc18fc Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 12 Mar 2017 22:52:21 +0100 Subject: [PATCH 050/109] Update library.json --- library.json | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/library.json b/library.json index 949b228..f79d318 100644 --- a/library.json +++ b/library.json @@ -1,21 +1,19 @@ { - "name": "ArduinoLog", - "keywords": "logging, debug, log, log levels, AVR, ESP8266", - "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", - "version": "1.0.1", - "authors": - { - "name": "Thijs Elenbaas", - "url": "https://github.com/thijse", - "maintainer": true - }, - "repository": - { - "type": "git", - "url": "https://github.com/thijse/Arduino-Log.git" - }, - "homepage": "https://github.com/thijse/Arduino-Log/", - "frameworks": "arduino", - "platforms": "*", - "examples": "examples/*/*.ino" + "name": "ArduinoLog", + "keywords": "logging, debug, log, log levels, AVR, ESP8266", + "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", + "version": "1.0.1", + "authors": { + "name": "Thijs Elenbaas", + "url": "https://github.com/thijse", + "maintainer": true + }, + "repository": { + "type": "git", + "url": "https://github.com/thijse/Arduino-Log.git" + }, + "homepage": "https://github.com/thijse/Arduino-Log/", + "frameworks": "arduino", + "platforms": "*", + "examples": "examples/*/*.ino" } From 31d5d0717dafd4de28ff74ac26643be845573b48 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 12 Mar 2017 22:52:42 +0100 Subject: [PATCH 051/109] Update library.json --- library.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.json b/library.json index f79d318..6636453 100644 --- a/library.json +++ b/library.json @@ -13,7 +13,7 @@ "url": "https://github.com/thijse/Arduino-Log.git" }, "homepage": "https://github.com/thijse/Arduino-Log/", - "frameworks": "arduino", + "frameworks": ["arduino"], "platforms": "*", "examples": "examples/*/*.ino" } From cbb82d8c10a487d880e48ad3fcac9c9ec9eefcdc Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 12 Mar 2017 22:53:03 +0100 Subject: [PATCH 052/109] Update library.json --- library.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.json b/library.json index 6636453..918768d 100644 --- a/library.json +++ b/library.json @@ -10,7 +10,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/thijse/Arduino-Log.git" + "url": "https://github.com/thijse/Arduino-Log" }, "homepage": "https://github.com/thijse/Arduino-Log/", "frameworks": ["arduino"], From 2b8ea52d6831d67f303871cf8e1442aa120a148a Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Sun, 19 Mar 2017 13:49:37 +1100 Subject: [PATCH 053/109] feat: allow double and float --- ArduinoLog.cpp | 5 +++++ README.md | 1 + examples/Log/Log.ino | 10 +++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 32aa4d9..3d993d5 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -85,6 +85,11 @@ void Logging::printFormat(const char format, va_list *args) { return; } + if( format == 'D' || format == 'F') { + _logOutput->print(va_arg( *args, double )); + return; + } + if( format == 'x' ) { _logOutput->print(va_arg( *args, int ),HEX); return; diff --git a/README.md b/README.md index ff4df66..0cf41a4 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ where the format string can be used to format the log variables * %B display as binary number, prefixed by `0b' * %t display as boolean value "t" or "f" * %T display as boolean value "true" or "false" +* %D,%F display as double value ``` The format string may come from flash memory. diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index 4d041ef..4b7bdc8 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -11,6 +11,8 @@ long longValue1, longValue2; bool boolValue1, boolValue2; const char * charArray = "this is a string"; String stringValue1 = "this is a string"; +float floatValue; +double doubleValue; void setup() { // Set up serial port and wait until connected @@ -41,6 +43,8 @@ void loop() { longValue2 = random(100000000); boolValue1 = random(2)==0; boolValue2 = random(2)==1; + floatValue = 12.34; + doubleValue= 1234.56789; Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); Log.notice (F("Log as Info with hex values : %x, %X" CR ), intValue1, intValue1); @@ -51,12 +55,16 @@ void loop() { Log.notice ( "Log as Info with bool values : %t, %T" CR , boolValue1, boolValue2); Log.notice (F("Log as Info with string value : %s" CR ), charArray); Log.notice ( "Log as Info with string value : %s" CR , stringValue1.c_str()); + Log.notice (F("Log as Info with float value : %F" CR ), floatValue); + Log.notice ( "Log as Info with float value : %F" CR , floatValue); + Log.notice (F("Log as Info with double value : %D" CR ), doubleValue); + Log.notice ( "Log as Info with double value : %D" CR , doubleValue); Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR ), intValue1 , intValue2, longValue1, longValue2, boolValue1, boolValue2); Log.trace ( "Log as Trace with bool value : %T" CR , boolValue1); Log.warning ( "Log as Warning with bool value : %T" CR , boolValue1); Log.error ( "Log as Error with bool value : %T" CR , boolValue1); Log.fatal ( "Log as Fatal with bool value : %T" CR , boolValue1); - Log.verbose (F("Log as Vebose with bool value : %T" CR CR CR ), boolValue2); + Log.verbose (F("Log as Verbose with bool value : %T" CR CR CR ), boolValue2); delay(5000); } \ No newline at end of file From 58a3e8f0a5d5a52aac1ccf2bee075d41db723529 Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Wed, 27 Sep 2017 21:04:01 +1000 Subject: [PATCH 054/109] bump version for changes from #2 --- library.json | 2 +- library.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index 918768d..bbc53b6 100644 --- a/library.json +++ b/library.json @@ -2,7 +2,7 @@ "name": "ArduinoLog", "keywords": "logging, debug, log, log levels, AVR, ESP8266", "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", - "version": "1.0.1", + "version": "1.0.2", "authors": { "name": "Thijs Elenbaas", "url": "https://github.com/thijse", diff --git a/library.properties b/library.properties index 412e3e2..c4865b3 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ArduinoLog -version=1.0.1 +version=1.0.2 author=Thijs Elenbaas maintainer=Thijs Elenbaas sentence=Small logging framework From a3b8b10f21d5afbe30f7a9fa76c2a3b983a0e4a6 Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Wed, 27 Sep 2017 21:13:09 +1000 Subject: [PATCH 055/109] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 0cf41a4..6c7f916 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ This package has not yet been published to the Arduino & PlatformIO package mana 6. For more information, [read this extended manual](http://thijs.elenbaas.net/2012/07/installing-an-arduino-library/) -##Quick start +## Quick start ```c++ Serial.begin(9600); @@ -150,4 +150,3 @@ Bugfixes & features by ## Copyright ArduinoLog is provided Copyright © 2017 under MIT License. - From 385feab6ef50095a1b4733bb74880b2ba0ba5f54 Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Wed, 27 Sep 2017 21:24:31 +1000 Subject: [PATCH 056/109] print chars as the actual character instead of their int counterpart --- ArduinoLog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 3d993d5..cc7824d 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -118,7 +118,7 @@ void Logging::printFormat(const char format, va_list *args) { } if( format == 'c' ) { - _logOutput->print(va_arg( *args, int )); + _logOutput->print((char) va_arg( *args, int )); return; } From 1fb0b46483df37c7ad1785ec499ac9bdd5d37c6e Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Wed, 27 Sep 2017 17:45:58 +0200 Subject: [PATCH 057/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c7f916..7facbdb 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ This package has not yet been published to the Arduino & PlatformIO package mana Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); ``` -[See examples/ArduinoLog/Log.ino](examples/ArduinoLog/Log.ino) +[See examples/Log/Log.ino](examples/Log/Log.ino) ## Usage From 3403b864c49361252b7135e1c67734347299a2ea Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 28 Sep 2017 13:49:17 +0200 Subject: [PATCH 058/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7facbdb..0c1ae35 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ ArduinoLog is a minimalistic framework to help the programmer output log stateme ## Downloading -This package has not yet been published to the Arduino & PlatformIO package managers and can therefore only be downloaded from GitHub. +This package has been published to the Arduino & PlatformIO package managers, but you can also download it from GitHub. - By directly loading fetching the Archive from GitHub: 1. Go to [https://github.com/thijse/Arduino-Log](https://github.com/thijse/Arduino-Log) From 5a6fcff401dc42547105a0e1e14099e31f146bd1 Mon Sep 17 00:00:00 2001 From: "Mikael Falkvidd git@mjo.se" Date: Thu, 26 Oct 2017 14:32:31 +0200 Subject: [PATCH 059/109] Update LOG_LEVEL_X comments The log levels in keywords.txt did not match existing log levels. Comments did not match the code. Also removed trailing whitespace. Big thanks to @thijse for maintaining this library. --- ArduinoLog.h | 103 ++++++++++++++++++++++--------------------- examples/Log/Log.ino | 4 +- keywords.txt | 10 +++-- 3 files changed, 61 insertions(+), 56 deletions(-) diff --git a/ArduinoLog.h b/ArduinoLog.h index eebf9d3..e3185b3 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -1,9 +1,9 @@ /* - _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ + _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| - + Log library for Arduino version 1.0.0 https://github.com/thijse/Arduino-Log @@ -30,7 +30,7 @@ Licensed under the MIT License . //#define DISABLE_LOGGING -#define LOG_LEVEL_SILENT 0 +#define LOG_LEVEL_SILENT 0 #define LOG_LEVEL_FATAL 1 #define LOG_LEVEL_ERROR 2 #define LOG_LEVEL_WARNING 3 @@ -49,12 +49,12 @@ Licensed under the MIT License . All methods are able to handle any number of output parameters. All methods print out a formated string (like printf).
To reduce output and program size, reduce loglevel. - + Output format string can contain below wildcards. Every wildcard must be start with percent sign (\%) - + **** Wildcards - + * %s replace with an string (char*) * %c replace with an character * %d replace with an integer value @@ -68,13 +68,13 @@ Licensed under the MIT License . **** Loglevels -* 0 - LOG_LEVEL_SILENT no output -* 1 - LOG_LEVEL_FATAL fatal errors -* 2 - LOG_LEVEL_ERROR all errors -* 3 - LOG_LEVEL_WARNING errors, and warnings -* 4 - LOG_LEVEL_NOTICE errors, warnings and notices +* 0 - LOG_LEVEL_SILENT no output +* 1 - LOG_LEVEL_FATAL fatal errors +* 2 - LOG_LEVEL_ERROR all errors +* 3 - LOG_LEVEL_WARNING errors and warnings +* 4 - LOG_LEVEL_NOTICE errors, warnings and notices * 5 - LOG_LEVEL_TRACE errors, warnings, notices, traces -* 6 - LOG_LEVEL_VERBOSE all +* 6 - LOG_LEVEL_VERBOSE all */ class Logging { @@ -83,14 +83,14 @@ class Logging { bool _showLevel; Print* _logOutput; public: - /*! + /*! * default Constructor */ Logging() : _level(LOG_LEVEL_SILENT), _showLevel(true), _logOutput(NULL) {} - + /** * Initializing, must be called as first. Note that if you use @@ -104,48 +104,51 @@ class Logging { void begin(int level, Print *output, bool showLevel = true); /** - * Output an error message. Output message contains - * ERROR: followed by original msg - * Error messages are printed out, at every loglevel - * except 0 ;-) + * Output a fatal error message. Output message contains + * F: followed by original message + * Fatal error messages are printed out at + * loglevels >= LOG_LEVEL_FATAL + * * \param msg format string to output * \param ... any number of variables * \return void */ template void fatal(T msg, ...){ -#ifndef DISABLE_LOGGING +#ifndef DISABLE_LOGGING if (LOG_LEVEL_FATAL <= _level) { if (_showLevel) _logOutput->print("F: "); va_list args; va_start(args, msg); print(msg,args); } -#endif +#endif } - + /** * Output an error message. Output message contains - * ERROR: followed by original msg - * Error messages are printed out, at every loglevel - * except 0 ;-) + * E: followed by original message + * Error messages are printed out at + * loglevels >= LOG_LEVEL_ERROR + * * \param msg format string to output * \param ... any number of variables * \return void */ template void error(T msg, ...){ -#ifndef DISABLE_LOGGING +#ifndef DISABLE_LOGGING if (LOG_LEVEL_ERROR <= _level) { if (_showLevel) _logOutput->print("E: "); va_list args; va_start(args, msg); print(msg,args); } -#endif +#endif } /** - * Output an info message. Output message contains - * Info messages are printed out at l - * loglevels >= LOG_LEVEL_INFOS + * Output a warning message. Output message contains + * W: followed by original message + * Warning messages are printed out at + * loglevels >= LOG_LEVEL_WARNING * * \param msg format string to output * \param ... any number of variables @@ -153,19 +156,20 @@ class Logging { */ template void warning(T msg, ...){ -#ifndef DISABLE_LOGGING +#ifndef DISABLE_LOGGING if (LOG_LEVEL_WARNING <= _level) { if (_showLevel) _logOutput->print("W: "); va_list args; va_start(args, msg); print(msg,args); } -#endif +#endif } /** - * Output an debug message. Output message contains - * Debug messages are printed out at l - * loglevels >= LOG_LEVEL_DEBUG + * Output a notice message. Output message contains + * N: followed by original message + * Notice messages are printed out at + * loglevels >= LOG_LEVEL_NOTICE * * \param msg format string to output * \param ... any number of variables @@ -173,38 +177,40 @@ class Logging { */ template void notice(T msg, ...){ -#ifndef DISABLE_LOGGING +#ifndef DISABLE_LOGGING if (LOG_LEVEL_NOTICE <= _level) { if (_showLevel) _logOutput->print("N: "); va_list args; va_start(args, msg); print(msg,args); } -#endif +#endif } /** * Output a trace message. Output message contains - * Debug messages are printed out at l - * loglevels >= LOG_LEVEL_VERBOSE + * N: followed by original message + * Trace messages are printed out at + * loglevels >= LOG_LEVEL_TRACE * * \param msg format string to output * \param ... any number of variables * \return void */ template void trace(T msg, ...){ -#ifndef DISABLE_LOGGING +#ifndef DISABLE_LOGGING if (LOG_LEVEL_TRACE <= _level) { if (_showLevel) _logOutput->print("T: "); va_list args; va_start(args, msg); print(msg,args); } -#endif - } - +#endif + } + /** - * Output an verbose message. Output message contains - * Debug messages are printed out at l + * Output a verbose message. Output message contains + * V: followed by original message + * Debug messages are printed out at * loglevels >= LOG_LEVEL_VERBOSE * * \param msg format string to output @@ -212,16 +218,16 @@ class Logging { * \return void */ template void verbose(T msg, ...){ -#ifndef DISABLE_LOGGING +#ifndef DISABLE_LOGGING if (LOG_LEVEL_VERBOSE <= _level) { if (_showLevel) _logOutput->print("V: "); va_list args; va_start(args, msg); print(msg,args); } -#endif +#endif } - + private: void print(const char *format, va_list args); void print(const __FlashStringHelper *format, va_list args); @@ -231,6 +237,3 @@ class Logging { extern Logging Log; #endif - - - diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index 4b7bdc8..36acb25 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -21,7 +21,7 @@ void setup() { randomSeed(analogRead(0)); // Pass log level, whether to show log level, and print interface. // Available levels are: - // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE + // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, LOG_LEVEL_NOTICE, LOG_LEVEL_TRACE, LOG_LEVEL_VERBOSE // Note: if you want to fully remove all logging code, uncomment #define DISABLE_LOGGING in Logging.h // this will significantly reduce your project size @@ -67,4 +67,4 @@ void loop() { Log.fatal ( "Log as Fatal with bool value : %T" CR , boolValue1); Log.verbose (F("Log as Verbose with bool value : %T" CR CR CR ), boolValue2); delay(5000); -} \ No newline at end of file +} diff --git a/keywords.txt b/keywords.txt index dd829b1..24e2721 100644 --- a/keywords.txt +++ b/keywords.txt @@ -30,9 +30,11 @@ Logging KEYWORD2 Logging library ####################################### # Constants (LITERAL1) ####################################### -LOG_LEVEL_NOOUTPUT LITERAL1 Constants -LOG_LEVEL_ERRORS LITERAL1 Constants -LOG_LEVEL_INFOS LITERAL1 Constants -LOG_LEVEL_DEBUG LITERAL1 Constants +LOG_LEVEL_SILENT LITERAL1 Constants +LOG_LEVEL_FATAL LITERAL1 Constants +LOG_LEVEL_ERROR LITERAL1 Constants +LOG_LEVEL_WARNING LITERAL1 Constants +LOG_LEVEL_NOTICE LITERAL1 Constants +LOG_LEVEL_TRACE LITERAL1 Constants LOG_LEVEL_VERBOSE LITERAL1 Constants From 2d05117455f24d44e00bb5c707128bbfa47b9b1a Mon Sep 17 00:00:00 2001 From: "Mikael Falkvidd git@mjo.se" Date: Thu, 26 Oct 2017 15:05:36 +0200 Subject: [PATCH 060/109] Remove trailing whitespace in example --- examples/Log/Log.ino | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index 36acb25..8f61e14 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -19,14 +19,14 @@ void setup() { Serial.begin(9600); while(!Serial && !Serial.available()){} randomSeed(analogRead(0)); - // Pass log level, whether to show log level, and print interface. - // Available levels are: + // Pass log level, whether to show log level, and print interface. + // Available levels are: // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, LOG_LEVEL_NOTICE, LOG_LEVEL_TRACE, LOG_LEVEL_VERBOSE // Note: if you want to fully remove all logging code, uncomment #define DISABLE_LOGGING in Logging.h // this will significantly reduce your project size - + Log.begin(LOG_LEVEL_VERBOSE, &Serial); - + //Start logging Log.notice(F(CR "******************************************" CR)); // Info string with Newline @@ -45,7 +45,7 @@ void loop() { boolValue2 = random(2)==1; floatValue = 12.34; doubleValue= 1234.56789; - + Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); Log.notice (F("Log as Info with hex values : %x, %X" CR ), intValue1, intValue1); Log.notice ( "Log as Info with hex values : %x, %X" CR , intValue2, intValue2); From fbf08a9aa44e899fdee32220b28a2e47cf397f63 Mon Sep 17 00:00:00 2001 From: "Mikael Falkvidd git@mjo.se" Date: Fri, 3 Nov 2017 23:17:25 +0100 Subject: [PATCH 061/109] Add prefix and suffix possibility My use case for prefix is to print a timestamp at start of each log line. The suffix function can be used to avoid having to add "CR" at the end of each log message. The varadic template used to clean up the code requires C++11. The Arduino IDE supports C++11 since Jul 16, 2015 (version 1.6.6 it seems) so I don'think it will cause problems, but feedback is welcome. --- ArduinoLog.cpp | 15 ++++---- ArduinoLog.h | 83 ++++++++++++++++++++++---------------------- examples/Log/Log.ino | 13 +++++++ keywords.txt | 2 ++ 4 files changed, 64 insertions(+), 49 deletions(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index cc7824d..6432f88 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -37,6 +37,14 @@ void Logging::begin(int level, Print* logOutput, bool showLevel){ _logOutput = logOutput; } +void Logging::setPrefix(printfunction f){ + _prefix = f; +} + +void Logging::setSuffix(printfunction f){ + _suffix = f; +} + void Logging::print(const __FlashStringHelper *format, va_list args) { #ifndef DISABLE_LOGGING PGM_P p = reinterpret_cast(format); @@ -146,10 +154,3 @@ void Logging::printFormat(const char format, va_list *args) { Logging Log = Logging(); - - - - - - - diff --git a/ArduinoLog.h b/ArduinoLog.h index e3185b3..8326f9e 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -21,6 +21,7 @@ Licensed under the MIT License . #else #include "WProgram.h" #endif +typedef void (*printfunction)(Print*); //#include //#include @@ -103,6 +104,16 @@ class Logging { */ void begin(int level, Print *output, bool showLevel = true); + /** + * Sets a function to be called before each log command. + */ + void setPrefix(printfunction); + + /** + * Sets a function to be called after each log command. + */ + void setSuffix(printfunction); + /** * Output a fatal error message. Output message contains * F: followed by original message @@ -113,14 +124,9 @@ class Logging { * \param ... any number of variables * \return void */ - template void fatal(T msg, ...){ + template void fatal(T msg, Args... args){ #ifndef DISABLE_LOGGING - if (LOG_LEVEL_FATAL <= _level) { - if (_showLevel) _logOutput->print("F: "); - va_list args; - va_start(args, msg); - print(msg,args); - } + printLevel(LOG_LEVEL_FATAL, msg, args...); #endif } @@ -134,14 +140,9 @@ class Logging { * \param ... any number of variables * \return void */ - template void error(T msg, ...){ + template void error(T msg, Args... args){ #ifndef DISABLE_LOGGING - if (LOG_LEVEL_ERROR <= _level) { - if (_showLevel) _logOutput->print("E: "); - va_list args; - va_start(args, msg); - print(msg,args); - } + printLevel(LOG_LEVEL_ERROR, msg, args...); #endif } /** @@ -155,14 +156,9 @@ class Logging { * \return void */ - template void warning(T msg, ...){ + template void warning(T msg, Args...args){ #ifndef DISABLE_LOGGING - if (LOG_LEVEL_WARNING <= _level) { - if (_showLevel) _logOutput->print("W: "); - va_list args; - va_start(args, msg); - print(msg,args); - } + printLevel(LOG_LEVEL_WARNING, msg, args...); #endif } /** @@ -176,14 +172,9 @@ class Logging { * \return void */ - template void notice(T msg, ...){ + template void notice(T msg, Args...args){ #ifndef DISABLE_LOGGING - if (LOG_LEVEL_NOTICE <= _level) { - if (_showLevel) _logOutput->print("N: "); - va_list args; - va_start(args, msg); - print(msg,args); - } + printLevel(LOG_LEVEL_NOTICE, msg, args...); #endif } /** @@ -196,14 +187,9 @@ class Logging { * \param ... any number of variables * \return void */ - template void trace(T msg, ...){ + template void trace(T msg, Args... args){ #ifndef DISABLE_LOGGING - if (LOG_LEVEL_TRACE <= _level) { - if (_showLevel) _logOutput->print("T: "); - va_list args; - va_start(args, msg); - print(msg,args); - } + printLevel(LOG_LEVEL_TRACE, msg, args...); #endif } @@ -217,14 +203,9 @@ class Logging { * \param ... any number of variables * \return void */ - template void verbose(T msg, ...){ + template void verbose(T msg, Args... args){ #ifndef DISABLE_LOGGING - if (LOG_LEVEL_VERBOSE <= _level) { - if (_showLevel) _logOutput->print("V: "); - va_list args; - va_start(args, msg); - print(msg,args); - } + printLevel(LOG_LEVEL_VERBOSE, msg, args...); #endif } @@ -232,6 +213,24 @@ class Logging { void print(const char *format, va_list args); void print(const __FlashStringHelper *format, va_list args); void printFormat(const char format, va_list *args); + printfunction _prefix = NULL; + printfunction _suffix = NULL; + template void printLevel(int level, T msg, ...){ +#ifndef DISABLE_LOGGING + if (level <= _level) { + if(_prefix != NULL) _prefix(_logOutput); + if (_showLevel) { + char levels[] = "FEWNTV"; + _logOutput->print(levels[level - 1]); + _logOutput->print(": "); + } + va_list args; + va_start(args, msg); + print(msg,args); + if(_suffix != NULL) _suffix(_logOutput); + } +#endif + } }; extern Logging Log; diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index 8f61e14..5a2c95e 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -26,6 +26,8 @@ void setup() { // this will significantly reduce your project size Log.begin(LOG_LEVEL_VERBOSE, &Serial); + //Log.setPrefix(printTimestamp); // Uncomment to get timestamps as prefix + //Log.setSuffix(printNewline); // Uncomment to get newline as suffix //Start logging @@ -68,3 +70,14 @@ void loop() { Log.verbose (F("Log as Verbose with bool value : %T" CR CR CR ), boolValue2); delay(5000); } + +void printTimestamp(Print* _logOutput) { + char c[12]; + int m = sprintf(c, "%10lu ", millis()); + _logOutput->print(c); +} + +void printNewline(Print* _logOutput) { + _logOutput->print('\n'); +} + diff --git a/keywords.txt b/keywords.txt index 24e2721..cd8146d 100644 --- a/keywords.txt +++ b/keywords.txt @@ -21,6 +21,8 @@ notice KEYWORD2 info output trace KEYWORD2 trace output verbose KEYWORD2 verbose output begin KEYWORD2 initialize library +setPrefix KEYWORD2 set prefix function +setSuffix KEYWORD2 set suffix function ####################################### # Instances (KEYWORD2) From cbb1dad6b890b42e13f87ebb96c195d69456865d Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 9 Sep 2018 02:55:48 -0700 Subject: [PATCH 062/109] Remove invalid reference link from keywords.txt The third field of keywords.txt is used to provide Arduino Language/Libraries Reference links, which are accessed from the Arduino IDE by highlighting the keyword and then selecting "Find in Reference" from the Help or right click menu. Adding values to this field that do not match any existing reference pages results in a "Could not open the URL" error. Reference: https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5:-Library-specification#keywordstxt-format --- keywords.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/keywords.txt b/keywords.txt index cd8146d..f338673 100644 --- a/keywords.txt +++ b/keywords.txt @@ -5,8 +5,8 @@ ####################################### # Instances (KEYWORD1) ####################################### -Logging KEYWORD1 Logging library -Log KEYWORD1 Logging library +Logging KEYWORD1 +Log KEYWORD1 ####################################### # Datatypes (KEYWORD1) ####################################### @@ -14,20 +14,20 @@ Log KEYWORD1 Logging library ####################################### # Methods and Functions (KEYWORD2) ####################################### -fatal KEYWORD2 fatal error output -error KEYWORD2 error output -warning KEYWORD2 warning output -notice KEYWORD2 info output -trace KEYWORD2 trace output -verbose KEYWORD2 verbose output -begin KEYWORD2 initialize library -setPrefix KEYWORD2 set prefix function -setSuffix KEYWORD2 set suffix function +fatal KEYWORD2 +error KEYWORD2 +warning KEYWORD2 +notice KEYWORD2 +trace KEYWORD2 +verbose KEYWORD2 +begin KEYWORD2 +setPrefix KEYWORD2 +setSuffix KEYWORD2 ####################################### # Instances (KEYWORD2) ####################################### -Logging KEYWORD2 Logging library +Logging KEYWORD2 ####################################### # Constants (LITERAL1) From 82da326de614bb305a6bb3b827399e21a3d21670 Mon Sep 17 00:00:00 2001 From: Bertrand Lemasle Date: Tue, 20 Nov 2018 14:27:16 +1300 Subject: [PATCH 063/109] Added a S format specifier for flash stored string --- ArduinoLog.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 6432f88..d03c7d5 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -88,6 +88,12 @@ void Logging::printFormat(const char format, va_list *args) { return; } + if( format == 'S' ) { + register __FlashStringHelper *s = (__FlashStringHelper *)va_arg( *args, int ); + _logOutput->print(s); + return; + } + if( format == 'd' || format == 'i') { _logOutput->print(va_arg( *args, int ),DEC); return; From bdcea4527dbe60260103ac8b9e3f6d2e07a3a9f2 Mon Sep 17 00:00:00 2001 From: Bertrand Lemasle Date: Wed, 21 Nov 2018 18:20:29 +1300 Subject: [PATCH 064/109] Updated README and example with S format specifier --- README.md | 19 +++++++++++++++++++ examples/Log/Log.ino | 11 ++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c1ae35..086bf75 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ where the format string can be used to format the log variables ``` * %s display as string (char*) +* %S display as string from flash memory (__FlashStringHelper* or char[] PROGMEM) * %c display as single character * %d display as integer value * %l display as long value @@ -120,9 +121,27 @@ examples Log.error ( "Log as Error with binary values : %b, %B"CR , 23 , 345808); Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); Log.notice ( "Log as Notice with hexadecimal values : %x, %X"CR , 21 , 348972); + Log.trace ( "Log as Trace with Flash string : %S"CR ) , F("value") ); Log.verbose (F("Log as Verbose with bool value from Flash : %t, %T"CR) , true, false ); ``` +Flash strings log variables can be stored and reused at several places to reduce final hex size. + +```c++ + const __FlashStringHelper * logAs = F("Log as"); + Log.fatal (F("%S Fatal with string value from Flash : %s"CR ) , logAs, "value" ); + Log.error ( "%S Error with binary values : %b, %B"CR , logAs, 23 , 345808); +``` + +If you want to declare that string globally (oustide of a function), you will need to use the PROGMEM macro instead. + +```c++ +const char LOG_AS[] PROGMEM = "Log as "; + +void logError() { + Log.error ( "%S Error with binary values : %b, %B"CR , PSTRPTR(LOG_AS), 23 , 345808); +} +``` ### Disable library (if your code is completely tested) all logging code can be compiled out. Do this by uncommenting diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index 5a2c95e..e783d2b 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -9,8 +9,9 @@ int intValue1 , intValue2; long longValue1, longValue2; bool boolValue1, boolValue2; -const char * charArray = "this is a string"; -String stringValue1 = "this is a string"; +const char * charArray = "this is a string"; +const char flashCharArray1[] PROGMEM = "this is a string"; +String stringValue1 = "this is a string"; float floatValue; double doubleValue; @@ -37,7 +38,6 @@ void setup() { } void loop() { - // set up some random variables intValue1 = random(100); intValue2 = random(10000); @@ -48,6 +48,9 @@ void loop() { floatValue = 12.34; doubleValue= 1234.56789; + //__FlashStringHelper cannot be declared oustide a function + const __FlashStringHelper * flashCharArray2 = F("this is a string"); + Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); Log.notice (F("Log as Info with hex values : %x, %X" CR ), intValue1, intValue1); Log.notice ( "Log as Info with hex values : %x, %X" CR , intValue2, intValue2); @@ -56,6 +59,8 @@ void loop() { Log.notice (F("Log as Info with long values : %l, %l" CR ), longValue1, longValue2); Log.notice ( "Log as Info with bool values : %t, %T" CR , boolValue1, boolValue2); Log.notice (F("Log as Info with string value : %s" CR ), charArray); + Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray1); + Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray2); Log.notice ( "Log as Info with string value : %s" CR , stringValue1.c_str()); Log.notice (F("Log as Info with float value : %F" CR ), floatValue); Log.notice ( "Log as Info with float value : %F" CR , floatValue); From 7f8a5bf994fc7ba41e6412b2e6c7a0788db80195 Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Thu, 22 Nov 2018 12:26:59 +1100 Subject: [PATCH 065/109] Update library.json --- library.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.json b/library.json index bbc53b6..7b61150 100644 --- a/library.json +++ b/library.json @@ -2,7 +2,7 @@ "name": "ArduinoLog", "keywords": "logging, debug, log, log levels, AVR, ESP8266", "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", - "version": "1.0.2", + "version": "1.0.3", "authors": { "name": "Thijs Elenbaas", "url": "https://github.com/thijse", From 5150c206cfc30cff8282acbbf00bee29fd4115c0 Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Thu, 22 Nov 2018 12:27:12 +1100 Subject: [PATCH 066/109] Update library.properties --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index c4865b3..a203815 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ArduinoLog -version=1.0.2 +version=1.0.3 author=Thijs Elenbaas maintainer=Thijs Elenbaas sentence=Small logging framework From 649ae0ffef313878826bd3b478059d7439c6c5ee Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 Dec 2018 12:27:51 +0100 Subject: [PATCH 067/109] Updated header to 1.0.3 --- ArduinoLog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index d03c7d5..8347dc8 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -5,7 +5,7 @@ /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| Log library for Arduino - version 1.0.0 + version 1.0.3 https://github.com/thijse/Arduino-Log Licensed under the MIT License . From 16aceb21b1029255c4577325bdefeaa8fb4a1110 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 Dec 2018 12:28:17 +0100 Subject: [PATCH 068/109] Updated header to 1.0.3 --- ArduinoLog.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ArduinoLog.h b/ArduinoLog.h index 8326f9e..23e3f61 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -5,7 +5,7 @@ /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| Log library for Arduino - version 1.0.0 + version 1.0.3 https://github.com/thijse/Arduino-Log Licensed under the MIT License . @@ -40,7 +40,7 @@ typedef void (*printfunction)(Print*); #define LOG_LEVEL_VERBOSE 6 #define CR "\n" -#define LOGGING_VERSION 1_0_0 +#define LOGGING_VERSION 1_0_3 /*! Logging is a helper class to output informations over From ac2046752579f7ed7db18d937a8e64a234925e31 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 Dec 2018 12:28:57 +0100 Subject: [PATCH 069/109] Updated license to 1.0.3 --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index f87a4ae..9445700 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands +Copyright (c) 2017,2018 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 7e3d1b3deb97a4a2010ae37382adbfdc79185cd9 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 Dec 2018 12:31:39 +0100 Subject: [PATCH 070/109] Added code submitters to license --- LICENSE.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 9445700..b4d0fa4 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,7 @@ MIT License -Copyright (c) 2017,2018 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands +Copyright (c) 2017,2018 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands, Josha + blemasle, mfalkvidd Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From b93ae0fa71306c28f4f977ac020909b5dc6d13aa Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 Dec 2018 12:33:53 +0100 Subject: [PATCH 071/109] Added contributors, updated license year --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 086bf75..b584b36 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,9 @@ Bugfixes & features by * [rahuldeo2047](https://github.com/rahuldeo2047) * [NOX73](https://github.com/NOX73) * [dhylands](https://github.com/dhylands) +* [Josha](https://github.com/Josha) +* [blemasle](https://github.com/blemasle) +* [mfalkvidd](https://github.com/mfalkvidd) ## On using and modifying libraries @@ -168,4 +171,4 @@ Bugfixes & features by ## Copyright -ArduinoLog is provided Copyright © 2017 under MIT License. +ArduinoLog is provided Copyright © 2017,2018 under MIT License. From fa3928ce465e37fa3454ff7471c9f5cc396ca4dc Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 Dec 2018 12:36:57 +0100 Subject: [PATCH 072/109] Updated contributor names --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b584b36..96a09ed 100644 --- a/README.md +++ b/README.md @@ -153,15 +153,15 @@ in `Logging.h`. This may significantly reduce your project size. ## Credit Based on library by -* [/mrRobot62](https://github.com/mrRobot62) +* [Bernd Klein](https://github.com/mrRobot62) Bugfixes & features by * [rahuldeo2047](https://github.com/rahuldeo2047) * [NOX73](https://github.com/NOX73) -* [dhylands](https://github.com/dhylands) -* [Josha](https://github.com/Josha) -* [blemasle](https://github.com/blemasle) -* [mfalkvidd](https://github.com/mfalkvidd) +* [Dave Hylands](https://github.com/dhylands) +* [Jos Hanon](https://github.com/Josha) +* [Bertrand Lemasle](https://github.com/blemasle) +* [Mikael Falkvidd](https://github.com/mfalkvidd) ## On using and modifying libraries From f8437530ae00f007807b0071dd7a33b830486433 Mon Sep 17 00:00:00 2001 From: RowanG077 Date: Wed, 20 Feb 2019 15:17:09 +0100 Subject: [PATCH 073/109] Fixed inconsistent styling --- ArduinoLog.cpp | 229 ++++++++++++++++---------------- ArduinoLog.h | 354 +++++++++++++++++++++++++++---------------------- 2 files changed, 313 insertions(+), 270 deletions(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 8347dc8..9bf06ca 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -31,132 +31,139 @@ SOFTWARE. #include "ArduinoLog.h" -void Logging::begin(int level, Print* logOutput, bool showLevel){ - _level = constrain(level,LOG_LEVEL_SILENT,LOG_LEVEL_VERBOSE); +void Logging::begin(int level, Print* logOutput, bool showLevel) +{ +#ifndef DISABLE_LOGGING + _level = constrain(level, LOG_LEVEL_SILENT, LOG_LEVEL_VERBOSE); _showLevel = showLevel; - _logOutput = logOutput; + _logOutput = logOutput; +#endif } -void Logging::setPrefix(printfunction f){ - _prefix = f; +void Logging::setPrefix(printfunction f) +{ +#ifndef DISABLE_LOGGING + _prefix = f; +#endif } -void Logging::setSuffix(printfunction f){ - _suffix = f; +void Logging::setSuffix(printfunction f) +{ +#ifndef DISABLE_LOGGING + _suffix = f; +#endif } -void Logging::print(const __FlashStringHelper *format, va_list args) { +void Logging::print(const __FlashStringHelper *format, va_list args) +{ #ifndef DISABLE_LOGGING - PGM_P p = reinterpret_cast(format); - char c = pgm_read_byte(p++); - for(;c != 0; c = pgm_read_byte(p++)){ - if (c == '%') { - c = pgm_read_byte(p++); - printFormat(c, &args); - } else { - _logOutput->print(c); - } - } -#endif + PGM_P p = reinterpret_cast(format); + char c = pgm_read_byte(p++); + for(;c != 0; c = pgm_read_byte(p++)) + { + if (c == '%') + { + c = pgm_read_byte(p++); + printFormat(c, &args); + } + else + { + _logOutput->print(c); + } + } +#endif } void Logging::print(const char *format, va_list args) { #ifndef DISABLE_LOGGING - for (; *format != 0; ++format) { - if (*format == '%') { - ++format; - printFormat(*format, &args); - } else { - _logOutput->print(*format); - } - } -#endif + for (; *format != 0; ++format) + { + if (*format == '%') + { + ++format; + printFormat(*format, &args); + } + else + { + _logOutput->print(*format); + } + } +#endif } void Logging::printFormat(const char format, va_list *args) { -#ifndef DISABLE_LOGGING - if (format == '\0') return; - - if (format == '%') { - _logOutput->print(format); - return; - } - - if( format == 's' ) { - register char *s = (char *)va_arg( *args, int ); - _logOutput->print(s); - return; - } - - if( format == 'S' ) { - register __FlashStringHelper *s = (__FlashStringHelper *)va_arg( *args, int ); - _logOutput->print(s); - return; - } - - if( format == 'd' || format == 'i') { - _logOutput->print(va_arg( *args, int ),DEC); - return; - } - - if( format == 'D' || format == 'F') { - _logOutput->print(va_arg( *args, double )); - return; - } - - if( format == 'x' ) { - _logOutput->print(va_arg( *args, int ),HEX); - return; - } - - if( format == 'X' ) { - _logOutput->print("0x"); - _logOutput->print(va_arg( *args, int ),HEX); - return; - } - - if( format == 'b' ) { - _logOutput->print(va_arg( *args, int ),BIN); - return; - } - - if( format == 'B' ) { - _logOutput->print("0b"); - _logOutput->print(va_arg( *args, int ),BIN); - return; - } - - if( format == 'l' ) { - _logOutput->print(va_arg( *args, long ),DEC); - return; - } - - if( format == 'c' ) { - _logOutput->print((char) va_arg( *args, int )); - return; - } - - if( format == 't' ) { - if (va_arg( *args, int ) == 1) { - _logOutput->print("T"); - } - else { - _logOutput->print("F"); - } - return; - } - - if( format == 'T' ) { - if (va_arg( *args, int ) == 1) { - _logOutput->print(F("true")); - } - else { - _logOutput->print(F("false")); - } - return; - } -#endif +#ifndef DISABLE_LOGGING + if (format == '%') + { + _logOutput->print(format); + } + else if (format == 's') + { + register char *s = (char *)va_arg(*args, int); + _logOutput->print(s); + } + else if (format == 'S') + { + register __FlashStringHelper *s = (__FlashStringHelper *)va_arg(*args, int); + _logOutput->print(s); + } + else if (format == 'd' || format == 'i') + { + _logOutput->print(va_arg(*args, int), DEC); + } + else if (format == 'D' || format == 'F') + { + _logOutput->print(va_arg(*args, double)); + } + else if (format == 'x') + { + _logOutput->print(va_arg(*args, int), HEX); + } + else if (format == 'X') + { + _logOutput->print("0x"); + _logOutput->print(va_arg(*args, int), HEX); + } + else if (format == 'b') + { + _logOutput->print(va_arg(*args, int), BIN); + } + else if (format == 'B') + { + _logOutput->print("0b"); + _logOutput->print(va_arg(*args, int), BIN); + } + else if (format == 'l') + { + _logOutput->print(va_arg(*args, long), DEC); + } + else if (format == 'c') + { + _logOutput->print((char) va_arg(*args, int)); + } + else if(format == 't') + { + if (va_arg(*args, int) == 1) + { + _logOutput->print("T"); + } + else + { + _logOutput->print("F"); + } + } + else if (format == 'T') + { + if (va_arg(*args, int) == 1) + { + _logOutput->print(F("true")); + } + else + { + _logOutput->print(F("false")); + } + } +#endif } Logging Log = Logging(); - diff --git a/ArduinoLog.h b/ArduinoLog.h index 23e3f61..6c27d77 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -30,7 +30,6 @@ typedef void (*printfunction)(Print*); // ************************************************************************ //#define DISABLE_LOGGING - #define LOG_LEVEL_SILENT 0 #define LOG_LEVEL_FATAL 1 #define LOG_LEVEL_ERROR 2 @@ -42,195 +41,232 @@ typedef void (*printfunction)(Print*); #define CR "\n" #define LOGGING_VERSION 1_0_3 -/*! - Logging is a helper class to output informations over - RS232. If you know log4j or log4net, this logging class - is more or less similar ;-)
- Different loglevels can be used to extend or reduce output - All methods are able to handle any number of output parameters. - All methods print out a formated string (like printf).
- To reduce output and program size, reduce loglevel. - - Output format string can contain below wildcards. Every wildcard - must be start with percent sign (\%) - -**** Wildcards - -* %s replace with an string (char*) -* %c replace with an character -* %d replace with an integer value -* %l replace with an long value -* %x replace and convert integer value into hex -* %X like %x but combine with 0x123AB -* %b replace and convert integer value into binary -* %B like %x but combine with 0b10100011 -* %t replace and convert boolean value into "t" or "f" -* %T like %t but convert into "true" or "false" - -**** Loglevels - -* 0 - LOG_LEVEL_SILENT no output -* 1 - LOG_LEVEL_FATAL fatal errors -* 2 - LOG_LEVEL_ERROR all errors -* 3 - LOG_LEVEL_WARNING errors and warnings -* 4 - LOG_LEVEL_NOTICE errors, warnings and notices -* 5 - LOG_LEVEL_TRACE errors, warnings, notices, traces -* 6 - LOG_LEVEL_VERBOSE all -*/ +/** + * Logging is a helper class to output informations over + * RS232. If you know log4j or log4net, this logging class + * is more or less similar ;-)
+ * Different loglevels can be used to extend or reduce output + * All methods are able to handle any number of output parameters. + * All methods print out a formated string (like printf).
+ * To reduce output and program size, reduce loglevel. + * + * Output format string can contain below wildcards. Every wildcard + * must be start with percent sign (\%) + * + * ---- Wildcards + * + * %s replace with an string (char*) + * %c replace with an character + * %d replace with an integer value + * %l replace with an long value + * %x replace and convert integer value into hex + * %X like %x but combine with 0x123AB + * %b replace and convert integer value into binary + * %B like %x but combine with 0b10100011 + * %t replace and convert boolean value into "t" or "f" + * %T like %t but convert into "true" or "false" + * + * ---- Loglevels + * + * 0 - LOG_LEVEL_SILENT no output + * 1 - LOG_LEVEL_FATAL fatal errors + * 2 - LOG_LEVEL_ERROR all errors + * 3 - LOG_LEVEL_WARNING errors and warnings + * 4 - LOG_LEVEL_NOTICE errors, warnings and notices + * 5 - LOG_LEVEL_TRACE errors, warnings, notices, traces + * 6 - LOG_LEVEL_VERBOSE all + */ -class Logging { -private: - int _level; - bool _showLevel; - Print* _logOutput; +class Logging +{ public: - /*! + /** * default Constructor */ - Logging() - : _level(LOG_LEVEL_SILENT), - _showLevel(true), - _logOutput(NULL) {} - - - /** - * Initializing, must be called as first. Note that if you use - * this variant of Init, you need to initialize the baud rate - * yourself, if printer happens to be a serial port. - * \param level - logging levels <= this will be logged. - * \param printer - place that logging output will be sent to. - * \return void - * - */ - void begin(int level, Print *output, bool showLevel = true); + Logging() +#ifndef DISABLE_LOGGING + : _level(LOG_LEVEL_SILENT), + _showLevel(true), + _logOutput(NULL) +#endif + { + + } + + /** + * Initializing, must be called as first. Note that if you use + * this variant of Init, you need to initialize the baud rate + * yourself, if printer happens to be a serial port. + * + * \param level - logging levels <= this will be logged. + * \param printer - place that logging output will be sent to. + * \return void + * + */ + void begin(int level, Print *output, bool showLevel = true); /** * Sets a function to be called before each log command. + * + * \param f - The function to be called + * \return void */ - void setPrefix(printfunction); + void setPrefix(printfunction f); /** * Sets a function to be called after each log command. + * + * \param f - The function to be called + * \return void */ - void setSuffix(printfunction); - - /** - * Output a fatal error message. Output message contains - * F: followed by original message - * Fatal error messages are printed out at - * loglevels >= LOG_LEVEL_FATAL - * - * \param msg format string to output - * \param ... any number of variables - * \return void - */ - template void fatal(T msg, Args... args){ + void setSuffix(printfunction f); + + /** + * Output a fatal error message. Output message contains + * F: followed by original message + * Fatal error messages are printed out at + * loglevels >= LOG_LEVEL_FATAL + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void fatal(T msg, Args... args) + { #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_FATAL, msg, args...); + printLevel(LOG_LEVEL_FATAL, msg, args...); #endif - } - - /** - * Output an error message. Output message contains - * E: followed by original message - * Error messages are printed out at - * loglevels >= LOG_LEVEL_ERROR - * - * \param msg format string to output - * \param ... any number of variables - * \return void - */ - template void error(T msg, Args... args){ + } + + /** + * Output an error message. Output message contains + * E: followed by original message + * Error messages are printed out at + * loglevels >= LOG_LEVEL_ERROR + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void error(T msg, Args... args){ #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_ERROR, msg, args...); + printLevel(LOG_LEVEL_ERROR, msg, args...); #endif - } - /** - * Output a warning message. Output message contains - * W: followed by original message - * Warning messages are printed out at - * loglevels >= LOG_LEVEL_WARNING - * - * \param msg format string to output - * \param ... any number of variables - * \return void - */ + } - template void warning(T msg, Args...args){ + /** + * Output a warning message. Output message contains + * W: followed by original message + * Warning messages are printed out at + * loglevels >= LOG_LEVEL_WARNING + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void warning(T msg, Args...args) + { #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_WARNING, msg, args...); + printLevel(LOG_LEVEL_WARNING, msg, args...); #endif - } - /** - * Output a notice message. Output message contains - * N: followed by original message - * Notice messages are printed out at - * loglevels >= LOG_LEVEL_NOTICE - * - * \param msg format string to output - * \param ... any number of variables - * \return void - */ + } - template void notice(T msg, Args...args){ + /** + * Output a notice message. Output message contains + * N: followed by original message + * Notice messages are printed out at + * loglevels >= LOG_LEVEL_NOTICE + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void notice(T msg, Args...args) + { #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_NOTICE, msg, args...); + printLevel(LOG_LEVEL_NOTICE, msg, args...); #endif - } - /** - * Output a trace message. Output message contains - * N: followed by original message - * Trace messages are printed out at - * loglevels >= LOG_LEVEL_TRACE - * - * \param msg format string to output - * \param ... any number of variables - * \return void + } + + /** + * Output a trace message. Output message contains + * N: followed by original message + * Trace messages are printed out at + * loglevels >= LOG_LEVEL_TRACE + * + * \param msg format string to output + * \param ... any number of variables + * \return void */ - template void trace(T msg, Args... args){ + template void trace(T msg, Args... args) + { #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_TRACE, msg, args...); + printLevel(LOG_LEVEL_TRACE, msg, args...); #endif - } - - /** - * Output a verbose message. Output message contains - * V: followed by original message - * Debug messages are printed out at - * loglevels >= LOG_LEVEL_VERBOSE - * - * \param msg format string to output - * \param ... any number of variables - * \return void - */ - template void verbose(T msg, Args... args){ + } + + /** + * Output a verbose message. Output message contains + * V: followed by original message + * Debug messages are printed out at + * loglevels >= LOG_LEVEL_VERBOSE + * + * \param msg format string to output + * \param ... any number of variables + * \return void + */ + template void verbose(T msg, Args... args) + { #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_VERBOSE, msg, args...); + printLevel(LOG_LEVEL_VERBOSE, msg, args...); #endif - } + } 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); - printfunction _prefix = NULL; - printfunction _suffix = NULL; - template void printLevel(int level, T msg, ...){ + void print(const char *format, va_list args); + + void print(const __FlashStringHelper *format, va_list args); + + void printFormat(const char format, va_list *args); + + template void printLevel(int level, T msg, ...) + { +#ifndef DISABLE_LOGGING + if (level > _level) + { + return; + } + + if (_prefix != NULL) + { + _prefix(_logOutput); + } + + if (_showLevel) { + static const char levels[] = "FEWNTV"; + _logOutput->print(levels[level - 1]); + _logOutput->print(": "); + } + + va_list args; + va_start(args, msg); + print(msg, args); + + if(_suffix != NULL) + { + _suffix(_logOutput); + } +#endif + } + #ifndef DISABLE_LOGGING - if (level <= _level) { - if(_prefix != NULL) _prefix(_logOutput); - if (_showLevel) { - char levels[] = "FEWNTV"; - _logOutput->print(levels[level - 1]); - _logOutput->print(": "); - } - va_list args; - va_start(args, msg); - print(msg,args); - if(_suffix != NULL) _suffix(_logOutput); - } + int _level; + bool _showLevel; + Print* _logOutput; + + printfunction _prefix = NULL; + printfunction _suffix = NULL; #endif - } }; extern Logging Log; From e77d51cd5a3fcee46f9eabc3768def290da2274f Mon Sep 17 00:00:00 2001 From: RowanG077 Date: Wed, 20 Feb 2019 15:37:05 +0100 Subject: [PATCH 074/109] Implemented getters and setters for log level and show level --- ArduinoLog.cpp | 34 +++++++++++++++++++++++++++++++++- ArduinoLog.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 9bf06ca..4dba1aa 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -33,10 +33,42 @@ SOFTWARE. void Logging::begin(int level, Print* logOutput, bool showLevel) { +#ifndef DISABLE_LOGGING + setLevel(level); + setShowLevel(showLevel); + _logOutput = logOutput; +#endif +} + +void Logging::setLevel(int level) +{ #ifndef DISABLE_LOGGING _level = constrain(level, LOG_LEVEL_SILENT, LOG_LEVEL_VERBOSE); +#endif +} + +int Logging::getLevel() const +{ +#ifndef DISABLE_LOGGING + return _level; +#else + return 0; +#endif +} + +void Logging::setShowLevel(bool showLevel) +{ +#ifndef DISABLE_LOGGING _showLevel = showLevel; - _logOutput = logOutput; +#endif +} + +bool Logging::getShowLevel() const +{ +#ifndef DISABLE_LOGGING + return _showLevel; +#else + return false; #endif } diff --git a/ArduinoLog.h b/ArduinoLog.h index 6c27d77..6cab7f0 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -105,6 +105,38 @@ class Logging */ void begin(int level, Print *output, bool showLevel = true); + /** + * Set the log level. + * + * \param level - The new log level. + * \return void + */ + void setLevel(int level); + + /** + * Get the log level. + * + * \return The current log level. + */ + int getLevel() const; + + /** + * Set whether to show the log level. + * + * \param showLevel - true if the log level should be shown for each log + * false otherwise. + * \return void + */ + void setShowLevel(bool showLevel); + + /** + * Get whether the log level is shown during logging + * + * \return true if the log level is be shown for each log + * false otherwise. + */ + bool getShowLevel() const; + /** * Sets a function to be called before each log command. * From c5bc8d9b86f7505dc01d9329cfd440b58e5a1122 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 19 Oct 2019 20:06:56 +0200 Subject: [PATCH 075/109] Update README.md --- README.md | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 96a09ed..36befe2 100644 --- a/README.md +++ b/README.md @@ -112,18 +112,9 @@ where the format string can be used to format the log variables * %D,%F display as double value ``` -The format string may come from flash memory. +The format string may come from flash memory. Newlines can be added using the CR keyword or by using the ...ln version of each of the log functions. -examples - -```c++ - Log.fatal (F("Log as Fatal with string value from Flash : %s"CR ) , "value" ); - Log.error ( "Log as Error with binary values : %b, %B"CR , 23 , 345808); - Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); - Log.notice ( "Log as Notice with hexadecimal values : %x, %X"CR , 21 , 348972); - Log.trace ( "Log as Trace with Flash string : %S"CR ) , F("value") ); - Log.verbose (F("Log as Verbose with bool value from Flash : %t, %T"CR) , true, false ); -``` +### Storing messages in Flash memory Flash strings log variables can be stored and reused at several places to reduce final hex size. @@ -142,6 +133,18 @@ void logError() { Log.error ( "%S Error with binary values : %b, %B"CR , PSTRPTR(LOG_AS), 23 , 345808); } ``` + +### Examples + +```c++ + Log.fatal (F("Log as Fatal with string value from Flash : %s"CR ) , "value" ); + Log.errorln ( "Log as Error with binary values : %b, %B" , 23 , 345808); + Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); + Log.notice ( "Log as Notice with hexadecimal values : %x, %X"CR , 21 , 348972); + Log.trace ( "Log as Trace with Flash string : %S"CR ) , F("value") ); + Log.verboseln (F("Log as Verbose with bool value from Flash : %t, %T" ) , true, false ); +``` + ### Disable library (if your code is completely tested) all logging code can be compiled out. Do this by uncommenting From 2cdacbbab14901c03057a3bcdcdeca544c564a41 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 19 Oct 2019 20:07:39 +0200 Subject: [PATCH 076/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 36befe2..b5c33f6 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ This package has been published to the Arduino & PlatformIO package managers, bu Log.begin (LOG_LEVEL_VERBOSE, &Serial); // Start logging text and formatted values - Log.error ( "Log as Error with binary values : %b, %B"CR , 23 , 345808); + Log.errorln ( "Log as Error with binary values : %b, %B" , 23 , 345808); Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); ``` From ae5358cca5e6d099bac9d6981a6dc7939ba0db4b Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 19 Oct 2019 20:08:51 +0200 Subject: [PATCH 077/109] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b5c33f6..f0a559a 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ where the format string can be used to format the log variables * %D,%F display as double value ``` -The format string may come from flash memory. Newlines can be added using the CR keyword or by using the ...ln version of each of the log functions. + Newlines can be added using the CR keyword or by using the ...ln version of each of the log functions. ### Storing messages in Flash memory @@ -124,7 +124,7 @@ Flash strings log variables can be stored and reused at several places to reduce Log.error ( "%S Error with binary values : %b, %B"CR , logAs, 23 , 345808); ``` -If you want to declare that string globally (oustide of a function), you will need to use the PROGMEM macro instead. +If you want to declare that string globally (outside of a function), you will need to use the PROGMEM macro instead. ```c++ const char LOG_AS[] PROGMEM = "Log as "; From 684302620dccfb0e0fed0ac8044be5ad351cada2 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 19 Oct 2019 20:09:24 +0200 Subject: [PATCH 078/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f0a559a..cd0bb23 100644 --- a/README.md +++ b/README.md @@ -174,4 +174,4 @@ Bugfixes & features by ## Copyright -ArduinoLog is provided Copyright © 2017,2018 under MIT License. +ArduinoLog is provided Copyright © 2017,2018, 2019 under MIT License. From 39b09167eb311e7edaf95020722b1bc0124ce03b Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Sun, 9 Feb 2020 13:45:46 +0100 Subject: [PATCH 079/109] add unsigned long format capability --- ArduinoLog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 4dba1aa..b66aa8b 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -169,6 +169,10 @@ void Logging::printFormat(const char format, va_list *args) { { _logOutput->print(va_arg(*args, long), DEC); } + else if (format == 'u') + { + _logOutput->print(va_arg(*args, unsigned long), DEC); + } else if (format == 'c') { _logOutput->print((char) va_arg(*args, int)); From a97f3eb6e2fa6baed12a89b9657f487007de2a56 Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Sun, 9 Feb 2020 14:00:07 +0100 Subject: [PATCH 080/109] add key for unsigned long values in help (%u) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cd0bb23..bf2ffaf 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ where the format string can be used to format the log variables * %c display as single character * %d display as integer value * %l display as long value +* %u display as unsigned long value * %x display as hexadecimal value * %X display as hexadecimal value prefixed by `0x` * %b display as binary number From d05e81f886b2db51ed84be0f18feaed2ad5e587e Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 17 May 2021 21:19:44 +0200 Subject: [PATCH 081/109] Updated to version 1.0.4 - Added ..ln functions (somehow got reverted) - Small fixes --- .gitignore | 359 +++++++++++++++++++++++++++++++++++++++++++ ArduinoLog.cpp | 17 +- ArduinoLog.h | 96 +++++++----- LICENSE.md | 2 +- examples/Log/Log.ino | 25 ++- keywords.txt | 11 ++ library.json | 2 +- library.properties | 2 +- 8 files changed, 469 insertions(+), 45 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15ead68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,359 @@ +#### Ignore file for Arduino as editted with Visual Micro + +## Windows +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows shortcuts +*.lnk + +## Linux +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +## MacOS +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +## Generated files +bin/ +gen/ +out/ +release/ + +## Visual Micro generated files +__vm/ + +# Local configuration file (sdk path, etc) +local.properties + +# Log Files +*.log + +##### Backup +*.bak +*.bck +*.gho +*.ori +*.orig +*.tmp + +##### Dropbox +# Dropbox settings and caches +.dropbox +.dropbox.attr +.dropbox.cache + +# Log file - the following switch allows to specify the file that will be +# used to write all messages from simulation: -l +*.log + +##### SVN +.svn/ + +##### TortoiseGit +# Project-level settings +/.tgitconfig + + +##### VisualStudioCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + + +##### VisualStudio +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual studio related SQlite files +*.db-shm +*.db-wal + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# Tabs Studio +*.tss + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +##### C++ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +##### C +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + + diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index b66aa8b..c66170c 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -5,7 +5,7 @@ /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| Log library for Arduino - version 1.0.3 + version 1.0.4 https://github.com/thijse/Arduino-Log Licensed under the MIT License . @@ -125,57 +125,70 @@ void Logging::print(const char *format, va_list args) { void Logging::printFormat(const char format, va_list *args) { #ifndef DISABLE_LOGGING + if (format == '\0') return; if (format == '%') { _logOutput->print(format); + return; } else if (format == 's') { register char *s = (char *)va_arg(*args, int); _logOutput->print(s); + return; } else if (format == 'S') { register __FlashStringHelper *s = (__FlashStringHelper *)va_arg(*args, int); _logOutput->print(s); + return; } else if (format == 'd' || format == 'i') { _logOutput->print(va_arg(*args, int), DEC); + return; } else if (format == 'D' || format == 'F') { _logOutput->print(va_arg(*args, double)); + return; } else if (format == 'x') { _logOutput->print(va_arg(*args, int), HEX); + return; } else if (format == 'X') { _logOutput->print("0x"); _logOutput->print(va_arg(*args, int), HEX); + return; } else if (format == 'b') { _logOutput->print(va_arg(*args, int), BIN); + return; } else if (format == 'B') { _logOutput->print("0b"); _logOutput->print(va_arg(*args, int), BIN); + return; } else if (format == 'l') { _logOutput->print(va_arg(*args, long), DEC); + return; } else if (format == 'u') { _logOutput->print(va_arg(*args, unsigned long), DEC); + return; } else if (format == 'c') { _logOutput->print((char) va_arg(*args, int)); + return; } else if(format == 't') { @@ -187,6 +200,7 @@ void Logging::printFormat(const char format, va_list *args) { { _logOutput->print("F"); } + return; } else if (format == 'T') { @@ -198,6 +212,7 @@ void Logging::printFormat(const char format, va_list *args) { { _logOutput->print(F("false")); } + return; } #endif } diff --git a/ArduinoLog.h b/ArduinoLog.h index 6cab7f0..eafdb3e 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -5,15 +5,13 @@ /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| Log library for Arduino - version 1.0.3 + version 1.0.4 https://github.com/thijse/Arduino-Log Licensed under the MIT License . */ - -#ifndef LOGGING_H -#define LOGGING_H +#pragma once #include #include #if defined(ARDUINO) && ARDUINO >= 100 @@ -39,7 +37,7 @@ typedef void (*printfunction)(Print*); #define LOG_LEVEL_VERBOSE 6 #define CR "\n" -#define LOGGING_VERSION 1_0_3 +#define LOGGING_VERSION 1_0_4 /** * Logging is a helper class to output informations over @@ -86,8 +84,8 @@ class Logging Logging() #ifndef DISABLE_LOGGING : _level(LOG_LEVEL_SILENT), - _showLevel(true), - _logOutput(NULL) + _showLevel(true), + _logOutput(NULL) #endif { @@ -163,12 +161,17 @@ class Logging * \param ... any number of variables * \return void */ - template void fatal(T msg, Args... args) - { + template void fatal(T msg, Args... args){ #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_FATAL, msg, args...); + printLevel(LOG_LEVEL_FATAL, false, msg, args...); #endif - } + } + + template void fatalln(T msg, Args... args){ +#ifndef DISABLE_LOGGING + printLevel(LOG_LEVEL_FATAL, true, msg, args...); +#endif + } /** * Output an error message. Output message contains @@ -180,12 +183,17 @@ class Logging * \param ... any number of variables * \return void */ - template void error(T msg, Args... args){ + template void error(T msg, Args... args){ #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_ERROR, msg, args...); + printLevel(LOG_LEVEL_ERROR, false, msg, args...); #endif - } - + } + + template void errorln(T msg, Args... args){ +#ifndef DISABLE_LOGGING + printLevel(LOG_LEVEL_ERROR, true, msg, args...); +#endif + } /** * Output a warning message. Output message contains * W: followed by original message @@ -196,12 +204,17 @@ class Logging * \param ... any number of variables * \return void */ - template void warning(T msg, Args...args) - { + template void warning(T msg, Args...args){ #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_WARNING, msg, args...); + printLevel(LOG_LEVEL_WARNING, false, msg, args...); #endif - } + } + + template void warningln(T msg, Args...args){ +#ifndef DISABLE_LOGGING + printLevel(LOG_LEVEL_WARNING, true, msg, args...); +#endif + } /** * Output a notice message. Output message contains @@ -213,12 +226,17 @@ class Logging * \param ... any number of variables * \return void */ - template void notice(T msg, Args...args) - { + template void notice(T msg, Args...args){ #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_NOTICE, msg, args...); + printLevel(LOG_LEVEL_NOTICE, false, msg, args...); #endif - } + } + + template void noticeln(T msg, Args...args){ +#ifndef DISABLE_LOGGING + printLevel(LOG_LEVEL_NOTICE, true, msg, args...); +#endif + } /** * Output a trace message. Output message contains @@ -230,10 +248,15 @@ class Logging * \param ... any number of variables * \return void */ - template void trace(T msg, Args... args) - { + template void trace(T msg, Args... args){ #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_TRACE, msg, args...); + printLevel(LOG_LEVEL_TRACE, false, msg, args...); +#endif + } + + template void traceln(T msg, Args... args){ +#ifndef DISABLE_LOGGING + printLevel(LOG_LEVEL_TRACE, true, msg, args...); #endif } @@ -247,12 +270,17 @@ class Logging * \param ... any number of variables * \return void */ - template void verbose(T msg, Args... args) - { + template void verbose(T msg, Args... args){ #ifndef DISABLE_LOGGING - printLevel(LOG_LEVEL_VERBOSE, msg, args...); + printLevel(LOG_LEVEL_VERBOSE, false, msg, args...); #endif - } + } + + template void verboseln(T msg, Args... args){ +#ifndef DISABLE_LOGGING + printLevel(LOG_LEVEL_VERBOSE, true, msg, args...); +#endif + } private: void print(const char *format, va_list args); @@ -261,7 +289,7 @@ class Logging void printFormat(const char format, va_list *args); - template void printLevel(int level, T msg, ...) + template void printLevel(int level, bool cr, T msg, ...) { #ifndef DISABLE_LOGGING if (level > _level) @@ -283,7 +311,7 @@ class Logging va_list args; va_start(args, msg); print(msg, args); - + if (cr) { _logOutput->print(CR); } if(_suffix != NULL) { _suffix(_logOutput); @@ -301,6 +329,4 @@ class Logging #endif }; -extern Logging Log; -#endif - +extern Logging Log; \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index b4d0fa4..2383777 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017,2018 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands, Josha +Copyright (c) 2017,2018,2021 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands, Josha blemasle, mfalkvidd Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index e783d2b..f534e72 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -1,8 +1,15 @@ #include +/* + _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ + /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| + / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | + /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| + + Log library example + Licensed under the MIT License . + + This example sketch shows most of the features of the ArduinoLog library -/*! -* This example sketch shows most of the features of the ArduinoLog library -* */ @@ -28,7 +35,7 @@ void setup() { Log.begin(LOG_LEVEL_VERBOSE, &Serial); //Log.setPrefix(printTimestamp); // Uncomment to get timestamps as prefix - //Log.setSuffix(printNewline); // Uncomment to get newline as suffix + //Log.setSuffix(printNewline); // Uncomment to get newline as suffix //Start logging @@ -48,7 +55,7 @@ void loop() { floatValue = 12.34; doubleValue= 1234.56789; - //__FlashStringHelper cannot be declared oustide a function + //__FlashStringHelper cannot be declared outside a function const __FlashStringHelper * flashCharArray2 = F("this is a string"); Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); @@ -68,11 +75,17 @@ void loop() { Log.notice ( "Log as Info with double value : %D" CR , doubleValue); Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR ), intValue1 , intValue2, longValue1, longValue2, boolValue1, boolValue2); + Log.noticeln ( "Log as Info with integer values : %d, %d" , intValue1, intValue2); Log.trace ( "Log as Trace with bool value : %T" CR , boolValue1); + Log.traceln ( "Log as Trace with bool value : %T" , boolValue1); Log.warning ( "Log as Warning with bool value : %T" CR , boolValue1); + Log.warningln( "Log as Warning with bool value : %T" , boolValue1); Log.error ( "Log as Error with bool value : %T" CR , boolValue1); + Log.errorln ( "Log as Error with bool value : %T" , boolValue1); Log.fatal ( "Log as Fatal with bool value : %T" CR , boolValue1); - Log.verbose (F("Log as Verbose with bool value : %T" CR CR CR ), boolValue2); + Log.fatalln ( "Log as Fatal with bool value : %T" , boolValue1); + Log.verboseln(F("Log as Verbose with bool value : %T" ), boolValue2); + Log.verbose (F("Log as Verbose with bool value : %T" CR CR CR ), boolValue2); delay(5000); } diff --git a/keywords.txt b/keywords.txt index f338673..f627cbc 100644 --- a/keywords.txt +++ b/keywords.txt @@ -15,12 +15,22 @@ Log KEYWORD1 # Methods and Functions (KEYWORD2) ####################################### fatal KEYWORD2 +fatalln KEYWORD2 error KEYWORD2 +errorln KEYWORD2 warning KEYWORD2 +warningln KEYWORD2 notice KEYWORD2 +noticeln KEYWORD2 trace KEYWORD2 +traceln KEYWORD2 verbose KEYWORD2 +verboseln KEYWORD2 begin KEYWORD2 +setLevel KEYWORD2 +getLevel KEYWORD2 +setShowLevel KEYWORD2 +getShowLevel KEYWORD2 setPrefix KEYWORD2 setSuffix KEYWORD2 @@ -28,6 +38,7 @@ setSuffix KEYWORD2 # Instances (KEYWORD2) ####################################### Logging KEYWORD2 +Log KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/library.json b/library.json index 7b61150..709a31b 100644 --- a/library.json +++ b/library.json @@ -2,7 +2,7 @@ "name": "ArduinoLog", "keywords": "logging, debug, log, log levels, AVR, ESP8266", "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", - "version": "1.0.3", + "version": "1.0.4", "authors": { "name": "Thijs Elenbaas", "url": "https://github.com/thijse", diff --git a/library.properties b/library.properties index a203815..8c9861f 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ArduinoLog -version=1.0.3 +version=1.0.4 author=Thijs Elenbaas maintainer=Thijs Elenbaas sentence=Small logging framework From f8c352cdfd6b59bf0e8ab9438f39d1f80194c8ee Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 17 May 2021 22:02:21 +0200 Subject: [PATCH 082/109] Updated prefix & suffix example Added ESP32 tested statement --- ArduinoLog.h | 6 +- LICENSE.md | 4 +- README.md | 3 +- examples/Log/Log.ino | 207 ++++++++++++++++++++++--------------------- 4 files changed, 115 insertions(+), 105 deletions(-) diff --git a/ArduinoLog.h b/ArduinoLog.h index eafdb3e..908ddc1 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -311,11 +311,15 @@ class Logging va_list args; va_start(args, msg); print(msg, args); - if (cr) { _logOutput->print(CR); } + if(_suffix != NULL) { _suffix(_logOutput); } + if (cr) + { + _logOutput->print(CR); + } #endif } diff --git a/LICENSE.md b/LICENSE.md index 2383777..554b7df 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,7 +1,7 @@ MIT License -Copyright (c) 2017,2018,2021 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands, Josha - blemasle, mfalkvidd +Copyright (c) 2017,2018,2021 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, + dhylands, Josha, blemasle, mfalkvidd Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index bf2ffaf..6ed9d2c 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ ArduinoLog is a minimalistic framework to help the programmer output log stateme * All Arduino boards (Uno, Due, Mini, Micro, Yun...) * ESP8266 +* ESP32 ## Downloading @@ -175,4 +176,4 @@ Bugfixes & features by ## Copyright -ArduinoLog is provided Copyright © 2017,2018, 2019 under MIT License. +ArduinoLog is provided Copyright © 2017,2018, 2019, 2021 under MIT License. diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index f534e72..8815aed 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -1,101 +1,106 @@ -#include -/* - _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ - /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| - / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | - /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| - - Log library example - Licensed under the MIT License . - - This example sketch shows most of the features of the ArduinoLog library - -*/ - - -int intValue1 , intValue2; -long longValue1, longValue2; -bool boolValue1, boolValue2; -const char * charArray = "this is a string"; -const char flashCharArray1[] PROGMEM = "this is a string"; -String stringValue1 = "this is a string"; -float floatValue; -double doubleValue; - -void setup() { - // Set up serial port and wait until connected - Serial.begin(9600); - while(!Serial && !Serial.available()){} - randomSeed(analogRead(0)); - // Pass log level, whether to show log level, and print interface. - // Available levels are: - // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, LOG_LEVEL_NOTICE, LOG_LEVEL_TRACE, LOG_LEVEL_VERBOSE - // Note: if you want to fully remove all logging code, uncomment #define DISABLE_LOGGING in Logging.h - // this will significantly reduce your project size - - Log.begin(LOG_LEVEL_VERBOSE, &Serial); - //Log.setPrefix(printTimestamp); // Uncomment to get timestamps as prefix - //Log.setSuffix(printNewline); // Uncomment to get newline as suffix - - //Start logging - - Log.notice(F(CR "******************************************" CR)); // Info string with Newline - Log.notice( "*** Logging example " CR); // Info string in flash memory - Log.notice(F("******************* ")); Log.notice("*********************** " CR); // two info strings without newline -} - -void loop() { - // set up some random variables - intValue1 = random(100); - intValue2 = random(10000); - longValue1 = random(1000000); - longValue2 = random(100000000); - boolValue1 = random(2)==0; - boolValue2 = random(2)==1; - floatValue = 12.34; - doubleValue= 1234.56789; - - //__FlashStringHelper cannot be declared outside a function - const __FlashStringHelper * flashCharArray2 = F("this is a string"); - - Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); - Log.notice (F("Log as Info with hex values : %x, %X" CR ), intValue1, intValue1); - Log.notice ( "Log as Info with hex values : %x, %X" CR , intValue2, intValue2); - Log.notice (F("Log as Info with binary values : %b, %B" CR ), intValue1, intValue1); - Log.notice ( "Log as Info with binary values : %b, %B" CR , intValue2, intValue2); - Log.notice (F("Log as Info with long values : %l, %l" CR ), longValue1, longValue2); - Log.notice ( "Log as Info with bool values : %t, %T" CR , boolValue1, boolValue2); - Log.notice (F("Log as Info with string value : %s" CR ), charArray); - Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray1); - Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray2); - Log.notice ( "Log as Info with string value : %s" CR , stringValue1.c_str()); - Log.notice (F("Log as Info with float value : %F" CR ), floatValue); - Log.notice ( "Log as Info with float value : %F" CR , floatValue); - Log.notice (F("Log as Info with double value : %D" CR ), doubleValue); - Log.notice ( "Log as Info with double value : %D" CR , doubleValue); - Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR ), intValue1 , intValue2, - longValue1, longValue2, boolValue1, boolValue2); - Log.noticeln ( "Log as Info with integer values : %d, %d" , intValue1, intValue2); - Log.trace ( "Log as Trace with bool value : %T" CR , boolValue1); - Log.traceln ( "Log as Trace with bool value : %T" , boolValue1); - Log.warning ( "Log as Warning with bool value : %T" CR , boolValue1); - Log.warningln( "Log as Warning with bool value : %T" , boolValue1); - Log.error ( "Log as Error with bool value : %T" CR , boolValue1); - Log.errorln ( "Log as Error with bool value : %T" , boolValue1); - Log.fatal ( "Log as Fatal with bool value : %T" CR , boolValue1); - Log.fatalln ( "Log as Fatal with bool value : %T" , boolValue1); - Log.verboseln(F("Log as Verbose with bool value : %T" ), boolValue2); - Log.verbose (F("Log as Verbose with bool value : %T" CR CR CR ), boolValue2); - delay(5000); -} - -void printTimestamp(Print* _logOutput) { - char c[12]; - int m = sprintf(c, "%10lu ", millis()); - _logOutput->print(c); -} - -void printNewline(Print* _logOutput) { - _logOutput->print('\n'); -} - +#include +/* + _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ + /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| + / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | + /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| + + Log library example + Licensed under the MIT License . + + This example sketch shows most of the features of the ArduinoLog library + +*/ + + +int intValue1 , intValue2; +long longValue1, longValue2; +bool boolValue1, boolValue2; +const char * charArray = "this is a string"; +const char flashCharArray1[] PROGMEM = "this is a string"; +String stringValue1 = "this is a string"; +float floatValue; +double doubleValue; + +void setup() { + // Set up serial port and wait until connected + Serial.begin(9600); + while(!Serial && !Serial.available()){} + randomSeed(analogRead(0)); + // Pass log level, whether to show log level, and print interface. + // Available levels are: + // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, LOG_LEVEL_NOTICE, LOG_LEVEL_TRACE, LOG_LEVEL_VERBOSE + // Note: if you want to fully remove all logging code, uncomment #define DISABLE_LOGGING in Logging.h + // this will significantly reduce your project size + + Log.begin(LOG_LEVEL_VERBOSE, &Serial); + + + //Start logging + + Log.notice(F(CR "******************************************" CR)); // Info string with Newline + Log.notice( "*** Logging example " CR); // Info string in flash memory + Log.notice(F("******************* ")); Log.notice("*********************** " CR); // two info strings without newline +} + +void loop() { + // set up some random variables + intValue1 = random(100); + intValue2 = random(10000); + longValue1 = random(1000000); + longValue2 = random(100000000); + boolValue1 = random(2)==0; + boolValue2 = random(2)==1; + floatValue = 12.34; + doubleValue= 1234.56789; + + //__FlashStringHelper cannot be declared outside a function + const __FlashStringHelper * flashCharArray2 = F("this is a string"); + + Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); + Log.notice (F("Log as Info with hex values : %x, %X" CR ), intValue1, intValue1); + Log.notice ( "Log as Info with hex values : %x, %X" CR , intValue2, intValue2); + Log.notice (F("Log as Info with binary values : %b, %B" CR ), intValue1, intValue1); + Log.notice ( "Log as Info with binary values : %b, %B" CR , intValue2, intValue2); + Log.notice (F("Log as Info with long values : %l, %l" CR ), longValue1, longValue2); + Log.notice ( "Log as Info with bool values : %t, %T" CR , boolValue1, boolValue2); + Log.notice (F("Log as Info with string value : %s" CR ), charArray); + Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray1); + Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray2); + Log.notice ( "Log as Info with string value : %s" CR , stringValue1.c_str()); + Log.notice (F("Log as Info with float value : %F" CR ), floatValue); + Log.notice ( "Log as Info with float value : %F" CR , floatValue); + Log.notice (F("Log as Info with double value : %D" CR ), doubleValue); + Log.notice ( "Log as Info with double value : %D" CR , doubleValue); + Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR ), intValue1 , intValue2, + longValue1, longValue2, boolValue1, boolValue2); + + Log.trace ( "Log as Trace with bool value : %T" CR , boolValue1); + Log.traceln ( "Log as Trace with bool value : %T" , boolValue1); + Log.warning ( "Log as Warning with bool value : %T" CR , boolValue1); + Log.warningln( "Log as Warning with bool value : %T" , boolValue1); + Log.error ( "Log as Error with bool value : %T" CR , boolValue1); + Log.errorln ( "Log as Error with bool value : %T" , boolValue1); + Log.fatal ( "Log as Fatal with bool value : %T" CR , boolValue1); + Log.fatalln ( "Log as Fatal with bool value : %T" , boolValue1); + Log.verboseln(F("Log as Verbose with bool value : %T" ), boolValue2); + Log.verbose (F("Log as Verbose with bool value : %T" CR ), boolValue2); + + Log.setPrefix(printTimestamp); // set timestamp as prefix + Log.setSuffix(printCarret); // set carret as suffix + Log.verboseln(F("Log with suffix & prefix")); + Log.setPrefix(NULL); // set timestamp as prefix + Log.setSuffix(NULL); // set carret as suffix + + delay(5000); +} + +void printTimestamp(Print* _logOutput) { + char c[12]; + int m = sprintf(c, "%10lu ", millis()); + _logOutput->print(c); +} + +void printCarret(Print* _logOutput) { + _logOutput->print('>'); +} From c0f9ec3d40158fdfb85118c9ba295e1cdcd11fab Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 17 May 2021 22:35:18 +0200 Subject: [PATCH 083/109] Added clearSuffix & clearPrefix --- ArduinoLog.cpp | 14 ++++++++++++++ ArduinoLog.h | 14 ++++++++++++++ keywords.txt | 2 ++ 3 files changed, 30 insertions(+) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index c66170c..304b30d 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -79,6 +79,13 @@ void Logging::setPrefix(printfunction f) #endif } +void Logging::clearPrefix() +{ +#ifndef DISABLE_LOGGING + _prefix = nullptr; +#endif +} + void Logging::setSuffix(printfunction f) { #ifndef DISABLE_LOGGING @@ -86,6 +93,13 @@ void Logging::setSuffix(printfunction f) #endif } +void Logging::clearSuffix() +{ +#ifndef DISABLE_LOGGING + _prefix = nullptr; +#endif +} + void Logging::print(const __FlashStringHelper *format, va_list args) { #ifndef DISABLE_LOGGING diff --git a/ArduinoLog.h b/ArduinoLog.h index 908ddc1..c35f34d 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -143,6 +143,13 @@ class Logging */ void setPrefix(printfunction f); + /** + * clears prefix. + * + * \return void + */ + void clearPrefix(); + /** * Sets a function to be called after each log command. * @@ -151,6 +158,13 @@ class Logging */ void setSuffix(printfunction f); + /** + * clears suffix. + * + * \return void + */ + void clearSuffix(); + /** * Output a fatal error message. Output message contains * F: followed by original message diff --git a/keywords.txt b/keywords.txt index f627cbc..2287ce6 100644 --- a/keywords.txt +++ b/keywords.txt @@ -33,6 +33,8 @@ setShowLevel KEYWORD2 getShowLevel KEYWORD2 setPrefix KEYWORD2 setSuffix KEYWORD2 +clearPrefix KEYWORD2 +clearSuffix KEYWORD2 ####################################### # Instances (KEYWORD2) From 2d9fdbe4e039f4fe34547ac4d101290142641484 Mon Sep 17 00:00:00 2001 From: kendall Date: Sun, 10 Jan 2021 14:09:19 -0800 Subject: [PATCH 084/109] Copy the va_list to a temporary variable to work around a problem where the call doesn't work, on some architectures, if one of the list items is an array. --- ArduinoLog.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 304b30d..5a08ad4 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -104,36 +104,62 @@ void Logging::print(const __FlashStringHelper *format, va_list args) { #ifndef DISABLE_LOGGING PGM_P p = reinterpret_cast(format); +// This copy is only necessary on some architectures (x86) to change a passed +// array in to a va_list. +#ifdef __x86_64__ + va_list args_copy; + va_copy(args_copy, args); +#endif char c = pgm_read_byte(p++); for(;c != 0; c = pgm_read_byte(p++)) { if (c == '%') { c = pgm_read_byte(p++); +#ifdef __x86_64__ + printFormat(c, &args_copy); +#else printFormat(c, &args); +#endif } else { _logOutput->print(c); } } +#ifdef __x86_64__ + va_end(args_copy); +#endif #endif } void Logging::print(const char *format, va_list args) { #ifndef DISABLE_LOGGING +// This copy is only necessary on some architectures (x86) to change a passed +// array in to a va_list. +#ifdef __x86_64__ + va_list args_copy; + va_copy(args_copy, args); +#endif for (; *format != 0; ++format) { if (*format == '%') { ++format; +#ifdef __x86_64__ + printFormat(*format, &args_copy); +#else printFormat(*format, &args); +#endif } else { _logOutput->print(*format); } } +#ifdef __x86_64__ + va_end(args_copy); +#endif #endif } From 0dd1d1c9b0ffa2b5e19ff4d0e715217453251fec Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 22 May 2021 14:17:52 +0200 Subject: [PATCH 085/109] Added ArduinoLog logo --- Images/logo.png | Bin 0 -> 27227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Images/logo.png diff --git a/Images/logo.png b/Images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..88f447565eac78196a4ef95ed2897ed668bb17f2 GIT binary patch literal 27227 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

=Wgw8Odv#I;^4pSs$5 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 kMf^`M)6o3?2i*EyWseL( Date: Sat, 22 May 2021 14:20:46 +0200 Subject: [PATCH 086/109] Added logo to README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6ed9d2c..ced2c66 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +![ArduinoLog logo](/Images/logo.png?raw=true ) ArduinoLog - C++ Log library for Arduino devices ==================== [![Build Status](https://travis-ci.org/thijse/Arduino-Log.svg?branch=master)](https://travis-ci.org/thijse/Arduino-Log) From 431792a7e91646b5112e43c29e4cdb65f5e4fc59 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 22 May 2021 18:52:33 +0200 Subject: [PATCH 087/109] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ced2c66..312d6db 100644 --- a/README.md +++ b/README.md @@ -115,8 +115,8 @@ where the format string can be used to format the log variables * %D,%F display as double value ``` - Newlines can be added using the CR keyword or by using the ...ln version of each of the log functions. - + Newlines can be added using the CR keyword or by using the `...ln` version of each of the log functions. The difference when using the `...ln` is that the newline is placed after suffix, and only a single newline can be added. + ### Storing messages in Flash memory Flash strings log variables can be stored and reused at several places to reduce final hex size. From 1e661cde4528fc515d2668ee1de74aa83592ab9e Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 22 May 2021 18:54:51 +0200 Subject: [PATCH 088/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 312d6db..079c62f 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ If you want to declare that string globally (outside of a function), you will ne const char LOG_AS[] PROGMEM = "Log as "; void logError() { - Log.error ( "%S Error with binary values : %b, %B"CR , PSTRPTR(LOG_AS), 23 , 345808); + Log.error ( "%S Error with binary values : %b, %B"CR , PSTRPTR(LOG_AS), 23 , 345808); } ``` From 47e03c226cfc694c48c6ff432996091af765a382 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 22 May 2021 22:52:12 +0200 Subject: [PATCH 089/109] - Added cmake, Intellibrains, PlatformIO folders to ignore file - Added PGM stubs - Use Arduino.h in most cases --- .gitignore | 8 ++++++++ ArduinoLog.h | 19 ++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 15ead68..b168b8c 100644 --- a/.gitignore +++ b/.gitignore @@ -356,4 +356,12 @@ Module.symvers Mkfile.old dkms.conf +# Cmake +cmake*/ +CMakeListsPrivate.txt +# PlatformIO IDE data +.pio/ + +# Jetbrains IDE configuration +.idea/ \ No newline at end of file diff --git a/ArduinoLog.h b/ArduinoLog.h index c35f34d..fd0f869 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -14,15 +14,24 @@ Licensed under the MIT License . #pragma once #include #include -#if defined(ARDUINO) && ARDUINO >= 100 - #include "Arduino.h" -#else + +// Non standard: Arduino.h also chosen if ARDUINO is not defined. To facilitate use in non-Arduino test environments +#if ARDUINO < 100 #include "WProgram.h" +#else + #include "Arduino.h" +#endif + +// PGM stubs to facilitate use in non-Arduino test environments +#ifndef PGM_P +#define PGM_P const char * +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#define PSTR(str) (str) +#define F(string_literal) (reinterpret_cast(PSTR(string_literal))) #endif typedef void (*printfunction)(Print*); -//#include -//#include + // ************************************************************************* // Uncomment line below to fully disable logging, and reduce project size // ************************************************************************ From 6b4e36061014bde89ebe8c7ad75a81f3197f1b20 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sat, 22 May 2021 23:28:00 +0200 Subject: [PATCH 090/109] Added additional formatting parameters --- ArduinoLog.cpp | 32 +++++++++++++++++--------------- README.md | 7 ++++--- examples/Log/Log.ino | 5 ++++- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 5a08ad4..dcbc257 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -169,40 +169,38 @@ void Logging::printFormat(const char format, va_list *args) { if (format == '%') { _logOutput->print(format); - return; } else if (format == 's') { register char *s = (char *)va_arg(*args, int); _logOutput->print(s); - return; } else if (format == 'S') { register __FlashStringHelper *s = (__FlashStringHelper *)va_arg(*args, int); _logOutput->print(s); - return; } else if (format == 'd' || format == 'i') { _logOutput->print(va_arg(*args, int), DEC); - return; } else if (format == 'D' || format == 'F') { _logOutput->print(va_arg(*args, double)); - return; } else if (format == 'x') { _logOutput->print(va_arg(*args, int), HEX); - return; } else if (format == 'X') - { + { _logOutput->print("0x"); - _logOutput->print(va_arg(*args, int), HEX); - return; + //_logOutput->print(va_arg(*args, int), HEX); + register uint16_t h = (uint16_t) va_arg( *args, int ); + if (h<0xFFF) _logOutput->print('0'); + if (h<0xFF ) _logOutput->print('0'); + if (h<0xF ) _logOutput->print('0'); + _logOutput->print(h,HEX); } else if (format == 'b') { @@ -213,23 +211,29 @@ void Logging::printFormat(const char format, va_list *args) { { _logOutput->print("0b"); _logOutput->print(va_arg(*args, int), BIN); - return; } else if (format == 'l') { _logOutput->print(va_arg(*args, long), DEC); - return; } else if (format == 'u') { _logOutput->print(va_arg(*args, unsigned long), DEC); - return; } else if (format == 'c') { _logOutput->print((char) va_arg(*args, int)); - return; } + else if( format == 'C' ) { + register char c = (char) va_arg( *args, int ); + if (c>=0x20 && c<0x7F) { + _logOutput->print(c); + } else { + _logOutput->print("0x"); + if (c<0xF) _logOutput->print('0'); + _logOutput->print(c, HEX); + } + } else if(format == 't') { if (va_arg(*args, int) == 1) @@ -240,7 +244,6 @@ void Logging::printFormat(const char format, va_list *args) { { _logOutput->print("F"); } - return; } else if (format == 'T') { @@ -252,7 +255,6 @@ void Logging::printFormat(const char format, va_list *args) { { _logOutput->print(F("false")); } - return; } #endif } diff --git a/README.md b/README.md index 079c62f..fb083dd 100644 --- a/README.md +++ b/README.md @@ -103,13 +103,14 @@ where the format string can be used to format the log variables * %s display as string (char*) * %S display as string from flash memory (__FlashStringHelper* or char[] PROGMEM) * %c display as single character +* %C display as single character or as hexadecimal value (prefixed by `0x`) if not a printable character * %d display as integer value * %l display as long value * %u display as unsigned long value * %x display as hexadecimal value -* %X display as hexadecimal value prefixed by `0x` +* %X display as hexadecimal value prefixed by `0x` and leading zeros * %b display as binary number -* %B display as binary number, prefixed by `0b' +* %B display as binary number, prefixed by `0b` * %t display as boolean value "t" or "f" * %T display as boolean value "true" or "false" * %D,%F display as double value @@ -168,7 +169,7 @@ Bugfixes & features by * [Jos Hanon](https://github.com/Josha) * [Bertrand Lemasle](https://github.com/blemasle) * [Mikael Falkvidd](https://github.com/mfalkvidd) - +* [bitli] https://github.com/bitli) ## On using and modifying libraries diff --git a/examples/Log/Log.ino b/examples/Log/Log.ino index 8815aed..bd638a0 100644 --- a/examples/Log/Log.ino +++ b/examples/Log/Log.ino @@ -16,6 +16,7 @@ int intValue1 , intValue2; long longValue1, longValue2; bool boolValue1, boolValue2; +const char charNotPrintable = 0x8B; const char * charArray = "this is a string"; const char flashCharArray1[] PROGMEM = "this is a string"; String stringValue1 = "this is a string"; @@ -64,6 +65,8 @@ void loop() { Log.notice ( "Log as Info with binary values : %b, %B" CR , intValue2, intValue2); Log.notice (F("Log as Info with long values : %l, %l" CR ), longValue1, longValue2); Log.notice ( "Log as Info with bool values : %t, %T" CR , boolValue1, boolValue2); + Log.notice (F("Log as Info with char value : %c" CR ), charArray[0]); + Log.notice ( "Log as Info with char value : %C" CR , charNotPrintable); Log.notice (F("Log as Info with string value : %s" CR ), charArray); Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray1); Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray2); @@ -103,4 +106,4 @@ void printTimestamp(Print* _logOutput) { void printCarret(Print* _logOutput) { _logOutput->print('>'); -} +} \ No newline at end of file From 6eba9553cf2a918c0b507d7f7d31f90ba73711cc Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 May 2021 11:56:13 +0200 Subject: [PATCH 091/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fb083dd..0fabe24 100644 --- a/README.md +++ b/README.md @@ -169,7 +169,7 @@ Bugfixes & features by * [Jos Hanon](https://github.com/Josha) * [Bertrand Lemasle](https://github.com/blemasle) * [Mikael Falkvidd](https://github.com/mfalkvidd) -* [bitli] https://github.com/bitli) +* [bitli] (https://github.com/bitli) ## On using and modifying libraries From c2df66a03aa597b4566ddd9c502900c925a41950 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 May 2021 15:28:07 +0200 Subject: [PATCH 092/109] Added ability to log Printable objects --- ArduinoLog.h | 10 ++++++++++ README.md | 8 ++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/ArduinoLog.h b/ArduinoLog.h index fd0f869..acb379e 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -310,6 +310,11 @@ class Logging void print(const __FlashStringHelper *format, va_list args); + void print(const Printable& obj, va_list& args) + { + _logOutput->print(obj); + } + void printFormat(const char format, va_list *args); template void printLevel(int level, bool cr, T msg, ...) @@ -319,6 +324,11 @@ class Logging { return; } + if (level < LOG_LEVEL_SILENT) + { + level = LOG_LEVEL_SILENT; + } + if (_prefix != NULL) { diff --git a/README.md b/README.md index fb083dd..a7ffc05 100644 --- a/README.md +++ b/README.md @@ -169,8 +169,12 @@ Bugfixes & features by * [Jos Hanon](https://github.com/Josha) * [Bertrand Lemasle](https://github.com/blemasle) * [Mikael Falkvidd](https://github.com/mfalkvidd) -* [bitli] https://github.com/bitli) - +* [Rowan Goemans] (https://github.com/rowanG077) +* [Nils Bokermann] (https://github.com/sanddorn) +* [Florian] (https://github.com/1technophile) +* [wrong-kendall] (https://github.com/wrong-kendall) +* [bitli] (https://github.com/bitli) +* [ChristianBauerAMDC] (https://github.com/bitli) ## On using and modifying libraries - [http://www.arduino.cc/en/Main/Libraries](http://www.arduino.cc/en/Main/Libraries) From 31fae5797fba89a578d87495361b1fdf8b7ede6a Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 May 2021 15:33:52 +0200 Subject: [PATCH 093/109] Updated README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 86a70ab..61fb8e5 100644 --- a/README.md +++ b/README.md @@ -169,12 +169,12 @@ Bugfixes & features by * [Jos Hanon](https://github.com/Josha) * [Bertrand Lemasle](https://github.com/blemasle) * [Mikael Falkvidd](https://github.com/mfalkvidd) -* [Rowan Goemans] (https://github.com/rowanG077) -* [Nils Bokermann] (https://github.com/sanddorn) -* [Florian] (https://github.com/1technophile) -* [wrong-kendall] (https://github.com/wrong-kendall) -* [bitli] (https://github.com/bitli) -* [ChristianBauerAMDC] (https://github.com/bitli) +* [Rowan Goemans](https://github.com/rowanG077) +* [Nils Bokermann](https://github.com/sanddorn) +* [Florian](https://github.com/1technophile) +* [wrong-kendall](https://github.com/wrong-kendall) +* [bitli](https://github.com/bitli) +* [ChristianBauerAMDC](https://github.com/bitli) ======= * [bitli] (https://github.com/bitli) From 28db4014af38b8f79c1edcbd93f5c25128cfb036 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 May 2021 16:29:46 +0200 Subject: [PATCH 094/109] Fix printable object Explanation printable object in README.md --- ArduinoLog.cpp | 8 ++++++-- ArduinoLog.h | 2 +- README.md | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index dcbc257..309f3ac 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -202,10 +202,14 @@ void Logging::printFormat(const char format, va_list *args) { if (h<0xF ) _logOutput->print('0'); _logOutput->print(h,HEX); } + else if (format == 'p') + { + register Printable *obj = (Printable *) va_arg(*args, int); + _logOutput->print(*obj); + } else if (format == 'b') { _logOutput->print(va_arg(*args, int), BIN); - return; } else if (format == 'B') { @@ -233,7 +237,7 @@ void Logging::printFormat(const char format, va_list *args) { if (c<0xF) _logOutput->print('0'); _logOutput->print(c, HEX); } - } + } else if(format == 't') { if (va_arg(*args, int) == 1) diff --git a/ArduinoLog.h b/ArduinoLog.h index acb379e..a22c575 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -310,7 +310,7 @@ class Logging void print(const __FlashStringHelper *format, va_list args); - void print(const Printable& obj, va_list& args) + void print(const Printable& obj, va_list args) { _logOutput->print(obj); } diff --git a/README.md b/README.md index 61fb8e5..cb10d9f 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ This package has been published to the Arduino & PlatformIO package managers, bu Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); ``` -[See examples/Log/Log.ino](examples/Log/Log.ino) +See [examples/Log/Log.ino](examples/Log/Log.ino) ## Usage @@ -114,9 +114,20 @@ where the format string can be used to format the log variables * %t display as boolean value "t" or "f" * %T display as boolean value "true" or "false" * %D,%F display as double value +* %p display a printable object. ``` Newlines can be added using the CR keyword or by using the `...ln` version of each of the log functions. The difference when using the `...ln` is that the newline is placed after suffix, and only a single newline can be added. + +### Displaying a printable object + +Some Arduino objects are printable. That is, they implement the `Printable` interface and are able for format their own representation +As an example, the IPadress object is printable: + +```c++ + IPAddress ipAddress(192, 168, 0, 1); + Log.verboseln ("ip address : %p", ipAddress); +``` ### Storing messages in Flash memory @@ -175,8 +186,6 @@ Bugfixes & features by * [wrong-kendall](https://github.com/wrong-kendall) * [bitli](https://github.com/bitli) * [ChristianBauerAMDC](https://github.com/bitli) -======= -* [bitli] (https://github.com/bitli) ## On using and modifying libraries From 92aa6be4e47aba8e2660c2474e199a18d1274248 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 May 2021 16:43:59 +0200 Subject: [PATCH 095/109] Updated manual --- README.md | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index cb10d9f..92f2ebd 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ The loglevels available are example ``` - Log.begin(LOG_LEVEL_ERROR, &Serial, true); +Log.begin(LOG_LEVEL_ERROR, &Serial, true); ``` if you want to fully remove all logging code, uncomment `#define DISABLE_LOGGING` in `ArduinoLog.h`, this may significantly reduce your sketch/library size. @@ -119,14 +119,35 @@ where the format string can be used to format the log variables Newlines can be added using the CR keyword or by using the `...ln` version of each of the log functions. The difference when using the `...ln` is that the newline is placed after suffix, and only a single newline can be added. +### Examples + +```c++ +Log.fatal (F("Log as Fatal with string value from Flash : %s"CR ) , "value" ); +Log.errorln ( "Log as Error with binary values : %b, %B" , 23 , 345808); +Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); +Log.notice ( "Log as Notice with hexadecimal values : %x, %X"CR , 21 , 348972); +Log.trace ( "Log as Trace with Flash string : %S"CR ) , F("value") ); +Log.verboseln (F("Log as Verbose with bool value from Flash : %t, %T" ) , true, false ); +``` + +### Disable library + +(if your code is completely tested) all logging code can be compiled out. Do this by uncommenting +```c++ +#define DISABLE_LOGGING +``` +in `Logging.h`. This may significantly reduce your project size. + +## Advanced usage + ### Displaying a printable object Some Arduino objects are printable. That is, they implement the `Printable` interface and are able for format their own representation As an example, the IPadress object is printable: ```c++ - IPAddress ipAddress(192, 168, 0, 1); - Log.verboseln ("ip address : %p", ipAddress); +IPAddress ipAddress(192, 168, 0, 1); +Log.verboseln ("ip address : %p", ipAddress); ``` ### Storing messages in Flash memory @@ -134,9 +155,9 @@ As an example, the IPadress object is printable: Flash strings log variables can be stored and reused at several places to reduce final hex size. ```c++ - const __FlashStringHelper * logAs = F("Log as"); - Log.fatal (F("%S Fatal with string value from Flash : %s"CR ) , logAs, "value" ); - Log.error ( "%S Error with binary values : %b, %B"CR , logAs, 23 , 345808); +const __FlashStringHelper * logAs = F("Log as"); +Log.fatal (F("%S Fatal with string value from Flash : %s"CR ) , logAs, "value" ); +Log.error ( "%S Error with binary values : %b, %B"CR , logAs, 23 , 345808); ``` If you want to declare that string globally (outside of a function), you will need to use the PROGMEM macro instead. @@ -149,25 +170,6 @@ void logError() { } ``` -### Examples - -```c++ - Log.fatal (F("Log as Fatal with string value from Flash : %s"CR ) , "value" ); - Log.errorln ( "Log as Error with binary values : %b, %B" , 23 , 345808); - Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); - Log.notice ( "Log as Notice with hexadecimal values : %x, %X"CR , 21 , 348972); - Log.trace ( "Log as Trace with Flash string : %S"CR ) , F("value") ); - Log.verboseln (F("Log as Verbose with bool value from Flash : %t, %T" ) , true, false ); -``` - -### Disable library - -(if your code is completely tested) all logging code can be compiled out. Do this by uncommenting -```c++ -#define DISABLE_LOGGING -``` -in `Logging.h`. This may significantly reduce your project size. - ## Credit Based on library by @@ -185,7 +187,7 @@ Bugfixes & features by * [Florian](https://github.com/1technophile) * [wrong-kendall](https://github.com/wrong-kendall) * [bitli](https://github.com/bitli) -* [ChristianBauerAMDC](https://github.com/bitli) +* [ChristianBauerAMDC](https://github.com/ChristianBauerAMDC) ## On using and modifying libraries From 9a0fd06eae858a35345c1c80b8059b09927df095 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Sun, 23 May 2021 16:44:58 +0200 Subject: [PATCH 096/109] spacing --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 92f2ebd..d6a3cb0 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ This package has been published to the Arduino & PlatformIO package managers, bu See [examples/Log/Log.ino](examples/Log/Log.ino) + ## Usage ### Initialisation @@ -138,6 +139,7 @@ Log.verboseln (F("Log as Verbose with bool value from Flash : %t, %T" ) , t ``` in `Logging.h`. This may significantly reduce your project size. + ## Advanced usage ### Displaying a printable object @@ -170,6 +172,7 @@ void logError() { } ``` + ## Credit Based on library by From ff0edc9587bef3de25623efc71f9599884b56462 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 24 May 2021 00:20:40 +0200 Subject: [PATCH 097/109] Slightly breaking change - suffix & Prefix now pass log level Added advanced example --- ArduinoLog.h | 12 ++-- README.md | 23 +++--- examples/Log-advanced/Log-advanced.ino | 97 ++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 examples/Log-advanced/Log-advanced.ino diff --git a/ArduinoLog.h b/ArduinoLog.h index a22c575..04557f1 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -29,7 +29,7 @@ Licensed under the MIT License . #define PSTR(str) (str) #define F(string_literal) (reinterpret_cast(PSTR(string_literal))) #endif -typedef void (*printfunction)(Print*); +typedef void (*printfunction)(Print*, int); // ************************************************************************* @@ -41,6 +41,7 @@ typedef void (*printfunction)(Print*); #define LOG_LEVEL_FATAL 1 #define LOG_LEVEL_ERROR 2 #define LOG_LEVEL_WARNING 3 +#define LOG_LEVEL_INFO 4 #define LOG_LEVEL_NOTICE 4 #define LOG_LEVEL_TRACE 5 #define LOG_LEVEL_VERBOSE 6 @@ -79,7 +80,8 @@ typedef void (*printfunction)(Print*); * 1 - LOG_LEVEL_FATAL fatal errors * 2 - LOG_LEVEL_ERROR all errors * 3 - LOG_LEVEL_WARNING errors and warnings - * 4 - LOG_LEVEL_NOTICE errors, warnings and notices + * 4 - LOG_LEVEL_INFO errors, warnings and notices + * 4 - LOG_LEVEL_NOTICE Same as INFO, kept for backward compatibility * 5 - LOG_LEVEL_TRACE errors, warnings, notices, traces * 6 - LOG_LEVEL_VERBOSE all */ @@ -332,11 +334,11 @@ class Logging if (_prefix != NULL) { - _prefix(_logOutput); + _prefix(_logOutput, level); } if (_showLevel) { - static const char levels[] = "FEWNTV"; + static const char levels[] = "FEWITV"; _logOutput->print(levels[level - 1]); _logOutput->print(": "); } @@ -347,7 +349,7 @@ class Logging if(_suffix != NULL) { - _suffix(_logOutput); + _suffix(_logOutput, level); } if (cr) { diff --git a/README.md b/README.md index d6a3cb0..b42afd0 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ArduinoLog - C++ Log library for Arduino devices [![Build Status](https://travis-ci.org/thijse/Arduino-Log.svg?branch=master)](https://travis-ci.org/thijse/Arduino-Log) [![License](https://img.shields.io/badge/license-MIT%20License-blue.svg)](http://doge.mit-license.org) -*An minimalistic Logging framework for Arduino-compatible embedded systems.* +*An minimalistic Logging framework for Arduino-compatible embedded systems.* ArduinoLog is a minimalistic framework to help the programmer output log statements to an output of choice, fashioned after extensive logging libraries such as log4cpp ,log4j and log4net. In case of problems with an application, it is helpful to enable logging so that the problem can be located. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and (if your code is completely tested) all logging code can be compiled out. @@ -110,12 +110,12 @@ where the format string can be used to format the log variables * %u display as unsigned long value * %x display as hexadecimal value * %X display as hexadecimal value prefixed by `0x` and leading zeros -* %b display as binary number -* %B display as binary number, prefixed by `0b` +* %b display as binary number +* %B display as binary number, prefixed by `0b` * %t display as boolean value "t" or "f" * %T display as boolean value "true" or "false" * %D,%F display as double value -* %p display a printable object. +* %p display a printable object ``` Newlines can be added using the CR keyword or by using the `...ln` version of each of the log functions. The difference when using the `...ln` is that the newline is placed after suffix, and only a single newline can be added. @@ -151,15 +151,17 @@ As an example, the IPadress object is printable: IPAddress ipAddress(192, 168, 0, 1); Log.verboseln ("ip address : %p", ipAddress); ``` + +[this example](https://forum.arduino.cc/t/printable-classes/438816) shows how to your own classes printable -### Storing messages in Flash memory + ### Storing messages in Flash memory Flash strings log variables can be stored and reused at several places to reduce final hex size. ```c++ const __FlashStringHelper * logAs = F("Log as"); -Log.fatal (F("%S Fatal with string value from Flash : %s"CR ) , logAs, "value" ); -Log.error ( "%S Error with binary values : %b, %B"CR , logAs, 23 , 345808); +Log.fatal (F("%S Fatal with string value from Flash : %s"CR ) , logAs, "value" ); +Log.error ( "%S Error with binary values : %b, %B"CR , logAs, 23 , 345808); ``` If you want to declare that string globally (outside of a function), you will need to use the PROGMEM macro instead. @@ -172,6 +174,11 @@ void logError() { } ``` +### Custom logging format + +You can modify your logging format by defining a custom prefix & suffix for each log line + + ## Credit @@ -199,4 +206,4 @@ Bugfixes & features by ## Copyright -ArduinoLog is provided Copyright © 2017,2018, 2019, 2021 under MIT License. +ArduinoLog Copyright © 2017,2018, 2019, 2021 is provided under MIT License. diff --git a/examples/Log-advanced/Log-advanced.ino b/examples/Log-advanced/Log-advanced.ino new file mode 100644 index 0000000..bf54b4f --- /dev/null +++ b/examples/Log-advanced/Log-advanced.ino @@ -0,0 +1,97 @@ +#include +#include + + +/* + _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ + /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| + / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | + /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| + + Log library example showing several advanced features + Licensed under the MIT License . + + This example sketch shows most of the features of the ArduinoLog library + +*/ + +const char * charArray = "this is a string"; +const char flashCharArray1[] PROGMEM = "this is a string"; +String stringValue1 = "this is a string"; +IPAddress ipAdress(192, 168, 0, 1); + +void setup() { + // Set up serial port and wait until connected + Serial.begin(9600); + while(!Serial && !Serial.available()){} + + + Log.setPrefix(printPrefix); // set prefix similar to NLog + Log.setSuffix(printSuffix); // set suffix + Log.begin(LOG_LEVEL_VERBOSE, &Serial); + Log.setShowLevel(false); // Do not show loglevel, we will do this in the prefix +} + +void loop() { + // set up some random variables + + + //__FlashStringHelper cannot be declared outside a function + const __FlashStringHelper * flashCharArray2 = F("this is a string"); + + Log.notice ( "Log global Flash string value : %S" CR, flashCharArray1 ); + Log.traceln ( "Log local Flash string value : %S" CR, flashCharArray2 ); + Log.notice ( "Log string value : %s" CR, stringValue1.c_str()); + Log.verboseln (F("Log ip adress : %p") , ipAdress ); + + delay(5000); +} + +void printPrefix(Print* _logOutput, int logLevel) { + printTimestamp(_logOutput); + printLogLevel (_logOutput, logLevel); +} + +void printTimestamp(Print* _logOutput) { + + // Division constants + const unsigned long MSECS_PER_SEC = 1000; + const unsigned long SECS_PER_MIN = 60; + const unsigned long SECS_PER_HOUR = 3600; + const unsigned long SECS_PER_DAY = 86400; + + // Total time + const unsigned long msecs = millis() ; + const unsigned long secs = msecs / MSECS_PER_SEC; + + // Time in components + const unsigned long MiliSeconds = msecs % MSECS_PER_SEC; + const unsigned long Seconds = secs % SECS_PER_MIN ; + const unsigned long Minutes = (secs / SECS_PER_MIN) % SECS_PER_MIN; + const unsigned long Hours = (secs % SECS_PER_DAY) / SECS_PER_HOUR; + + // Time as string + char timestamp[20]; + sprintf(timestamp, "%02d:%02d:%02d.%03d ", Hours, Minutes, Seconds, MiliSeconds); + _logOutput->print(timestamp); +} + + +void printLogLevel(Print* _logOutput, int logLevel) { + /// Show log description based on log level + switch (logLevel) + { + default: + case 0:_logOutput->print("SILENT " ); break; + case 1:_logOutput->print("FATAL " ); break; + case 2:_logOutput->print("ERROR " ); break; + case 3:_logOutput->print("WARNING "); break; + case 4:_logOutput->print("INFO " ); break; + case 5:_logOutput->print("TRACE " ); break; + case 6:_logOutput->print("VERBOSE "); break; + } +} + +void printSuffix(Print* _logOutput, int logLevel) { + _logOutput->print(""); +} From dd2a1030dba8d497624b6157e9adf558a4f7653f Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 24 May 2021 00:34:26 +0200 Subject: [PATCH 098/109] Updated advanced example README.md --- README.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b42afd0..2a6ae36 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,8 @@ in `Logging.h`. This may significantly reduce your project size. ## Advanced usage +Advanced features are demonstrated in example [examples/Log-advanced/Log-advanced.ino](examples/Log-advanced/Log-advanced.ino) + ### Displaying a printable object Some Arduino objects are printable. That is, they implement the `Printable` interface and are able for format their own representation @@ -176,9 +178,19 @@ void logError() { ### Custom logging format -You can modify your logging format by defining a custom prefix & suffix for each log line - +You can modify your logging format by defining a custom prefix & suffix for each log line. For example: +```c++ +void printPrefix(Print* _logOutput, int logLevel) { + printTimestamp(_logOutput); + printLogLevel (_logOutput, logLevel); +} +``` +will result in log timestamps very similar to e.g. NLOG: +``` +00:47:51.432 VERBOSE Log with suffix & prefix +``` +See ## Credit @@ -206,4 +218,4 @@ Bugfixes & features by ## Copyright -ArduinoLog Copyright © 2017,2018, 2019, 2021 is provided under MIT License. +ArduinoLog (Copyright © 2017,2018, 2019, 2021) is provided under MIT License. From 043a172903064179cd50c6740840aed3e5ff60ed Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 24 May 2021 12:13:30 +0200 Subject: [PATCH 099/109] Upgraded to version 1.1.1, because of minor interface change Renamed basic example Updated & cleaned up examples --- ArduinoLog.cpp | 2 +- ArduinoLog.h | 14 +- README.md | 8 +- examples/Log-advanced/Log-advanced.ino | 3 - .../{Log/Log.ino => Log-basic/Log-basic.ino} | 197 ++++++++---------- keywords.txt | 3 + library.json | 4 +- library.properties | 4 +- 8 files changed, 113 insertions(+), 122 deletions(-) rename examples/{Log/Log.ino => Log-basic/Log-basic.ino} (80%) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 309f3ac..2f06cfa 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -5,7 +5,7 @@ /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| Log library for Arduino - version 1.0.4 + version 1.1.1 https://github.com/thijse/Arduino-Log Licensed under the MIT License . diff --git a/ArduinoLog.h b/ArduinoLog.h index 04557f1..efb20f7 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -5,7 +5,7 @@ /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| Log library for Arduino - version 1.0.4 + version 1.1.1 https://github.com/thijse/Arduino-Log Licensed under the MIT License . @@ -263,6 +263,18 @@ class Logging #endif } + template void info(T msg, Args...args) { +#ifndef DISABLE_LOGGING + printLevel(LOG_LEVEL_INFO, false, msg, args...); +#endif + } + + template void infoln(T msg, Args...args) { +#ifndef DISABLE_LOGGING + printLevel(LOG_LEVEL_INFO, true, msg, args...); +#endif + } + /** * Output a trace message. Output message contains * N: followed by original message diff --git a/README.md b/README.md index 2a6ae36..c856445 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ This package has been published to the Arduino & PlatformIO package managers, bu Log.warning (F("Log as Warning with integer values from Flash : %d, %d"CR) , 34 , 799870); ``` -See [examples/Log/Log.ino](examples/Log/Log.ino) +See [Log-basic.ino](examples/Log-basic/Log-basic.ino) example ## Usage @@ -142,7 +142,7 @@ in `Logging.h`. This may significantly reduce your project size. ## Advanced usage -Advanced features are demonstrated in example [examples/Log-advanced/Log-advanced.ino](examples/Log-advanced/Log-advanced.ino) +Advanced features are demonstrated in [Log-advanced](examples/Log-advanced/Log-advanced.ino) example. ### Displaying a printable object @@ -187,11 +187,9 @@ void printPrefix(Print* _logOutput, int logLevel) { ``` will result in log timestamps very similar to e.g. NLOG: ``` -00:47:51.432 VERBOSE Log with suffix & prefix +00:47:51.432 VERBOSE Message to be logged ``` -See - ## Credit Based on library by diff --git a/examples/Log-advanced/Log-advanced.ino b/examples/Log-advanced/Log-advanced.ino index bf54b4f..d40256d 100644 --- a/examples/Log-advanced/Log-advanced.ino +++ b/examples/Log-advanced/Log-advanced.ino @@ -1,7 +1,5 @@ #include #include - - /* _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| @@ -35,7 +33,6 @@ void setup() { void loop() { // set up some random variables - //__FlashStringHelper cannot be declared outside a function const __FlashStringHelper * flashCharArray2 = F("this is a string"); diff --git a/examples/Log/Log.ino b/examples/Log-basic/Log-basic.ino similarity index 80% rename from examples/Log/Log.ino rename to examples/Log-basic/Log-basic.ino index bd638a0..181292b 100644 --- a/examples/Log/Log.ino +++ b/examples/Log-basic/Log-basic.ino @@ -1,109 +1,90 @@ -#include -/* - _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ - /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| - / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | - /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| - - Log library example - Licensed under the MIT License . - - This example sketch shows most of the features of the ArduinoLog library - -*/ - - -int intValue1 , intValue2; -long longValue1, longValue2; -bool boolValue1, boolValue2; -const char charNotPrintable = 0x8B; -const char * charArray = "this is a string"; -const char flashCharArray1[] PROGMEM = "this is a string"; -String stringValue1 = "this is a string"; -float floatValue; -double doubleValue; - -void setup() { - // Set up serial port and wait until connected - Serial.begin(9600); - while(!Serial && !Serial.available()){} - randomSeed(analogRead(0)); - // Pass log level, whether to show log level, and print interface. - // Available levels are: - // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, LOG_LEVEL_NOTICE, LOG_LEVEL_TRACE, LOG_LEVEL_VERBOSE - // Note: if you want to fully remove all logging code, uncomment #define DISABLE_LOGGING in Logging.h - // this will significantly reduce your project size - - Log.begin(LOG_LEVEL_VERBOSE, &Serial); - - - //Start logging - - Log.notice(F(CR "******************************************" CR)); // Info string with Newline - Log.notice( "*** Logging example " CR); // Info string in flash memory - Log.notice(F("******************* ")); Log.notice("*********************** " CR); // two info strings without newline -} - -void loop() { - // set up some random variables - intValue1 = random(100); - intValue2 = random(10000); - longValue1 = random(1000000); - longValue2 = random(100000000); - boolValue1 = random(2)==0; - boolValue2 = random(2)==1; - floatValue = 12.34; - doubleValue= 1234.56789; - - //__FlashStringHelper cannot be declared outside a function - const __FlashStringHelper * flashCharArray2 = F("this is a string"); - - Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); - Log.notice (F("Log as Info with hex values : %x, %X" CR ), intValue1, intValue1); - Log.notice ( "Log as Info with hex values : %x, %X" CR , intValue2, intValue2); - Log.notice (F("Log as Info with binary values : %b, %B" CR ), intValue1, intValue1); - Log.notice ( "Log as Info with binary values : %b, %B" CR , intValue2, intValue2); - Log.notice (F("Log as Info with long values : %l, %l" CR ), longValue1, longValue2); - Log.notice ( "Log as Info with bool values : %t, %T" CR , boolValue1, boolValue2); - Log.notice (F("Log as Info with char value : %c" CR ), charArray[0]); - Log.notice ( "Log as Info with char value : %C" CR , charNotPrintable); - Log.notice (F("Log as Info with string value : %s" CR ), charArray); - Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray1); - Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray2); - Log.notice ( "Log as Info with string value : %s" CR , stringValue1.c_str()); - Log.notice (F("Log as Info with float value : %F" CR ), floatValue); - Log.notice ( "Log as Info with float value : %F" CR , floatValue); - Log.notice (F("Log as Info with double value : %D" CR ), doubleValue); - Log.notice ( "Log as Info with double value : %D" CR , doubleValue); - Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR ), intValue1 , intValue2, - longValue1, longValue2, boolValue1, boolValue2); - - Log.trace ( "Log as Trace with bool value : %T" CR , boolValue1); - Log.traceln ( "Log as Trace with bool value : %T" , boolValue1); - Log.warning ( "Log as Warning with bool value : %T" CR , boolValue1); - Log.warningln( "Log as Warning with bool value : %T" , boolValue1); - Log.error ( "Log as Error with bool value : %T" CR , boolValue1); - Log.errorln ( "Log as Error with bool value : %T" , boolValue1); - Log.fatal ( "Log as Fatal with bool value : %T" CR , boolValue1); - Log.fatalln ( "Log as Fatal with bool value : %T" , boolValue1); - Log.verboseln(F("Log as Verbose with bool value : %T" ), boolValue2); - Log.verbose (F("Log as Verbose with bool value : %T" CR ), boolValue2); - - Log.setPrefix(printTimestamp); // set timestamp as prefix - Log.setSuffix(printCarret); // set carret as suffix - Log.verboseln(F("Log with suffix & prefix")); - Log.setPrefix(NULL); // set timestamp as prefix - Log.setSuffix(NULL); // set carret as suffix - - delay(5000); -} - -void printTimestamp(Print* _logOutput) { - char c[12]; - int m = sprintf(c, "%10lu ", millis()); - _logOutput->print(c); -} - -void printCarret(Print* _logOutput) { - _logOutput->print('>'); +#include +/* + _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ + /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| + / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | + /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| + + Log library basic example + Licensed under the MIT License . + + This example sketch shows most of the most used features of the ArduinoLog library + +*/ + +int intValue1 , intValue2; +long longValue1, longValue2; +bool boolValue1, boolValue2; +const char charNotPrintable = 0x8B; +const char * charArray = "this is a string"; +const char flashCharArray1[] PROGMEM = "this is a string"; +String stringValue1 = "this is a string"; +float floatValue; +double doubleValue; + +void setup() { + // Set up serial port and wait until connected + Serial.begin(9600); + while(!Serial && !Serial.available()){} + randomSeed(analogRead(0)); + // Pass log level, whether to show log level, and print interface. + // Available levels are: + // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, LOG_LEVEL_INFO, LOG_LEVEL_TRACE, LOG_LEVEL_VERBOSE + // Note: if you want to fully remove all logging code, uncomment #define DISABLE_LOGGING in Logging.h + // this will significantly reduce your project size + + Log.begin(LOG_LEVEL_VERBOSE, &Serial); + + + //Start logging + + Log.notice(F(CR "******************************************" CR)); // Info string with Newline + Log.notice( "*** Logging example " CR); // Info string in flash memory + Log.notice(F("******************* ")); Log.notice("*********************** " CR); // two info strings without newline will end up on same line +} + +void loop() { + // set up some random variables + intValue1 = random(100); + intValue2 = random(10000); + longValue1 = random(1000000); + longValue2 = random(100000000); + boolValue1 = random(2)==0; + boolValue2 = random(2)==1; + floatValue = 12.34; + doubleValue= 1234.56789; + + + Log.notice ( "Log as Info with integer values : %d, %d" CR , intValue1, intValue2); + Log.notice (F("Log as Info with hex values : %x, %X" CR ), intValue1, intValue1); + Log.notice ( "Log as Info with hex values : %x, %X" CR , intValue2, intValue2); + Log.notice (F("Log as Info with binary values : %b, %B" CR ), intValue1, intValue1); + Log.notice ( "Log as Info with binary values : %b, %B" CR , intValue2, intValue2); + Log.notice (F("Log as Info with long values : %l, %l" CR ), longValue1, longValue2); + Log.notice ( "Log as Info with bool values : %t, %T" CR , boolValue1, boolValue2); + Log.notice (F("Log as Info with char value : %c" CR ), charArray[0]); + Log.notice ( "Log as Info with char value : %C" CR , charNotPrintable); + Log.notice (F("Log as Info with string value : %s" CR ), charArray); + Log.notice ( "Log as Info with Flash string value : %S" CR , flashCharArray1); + Log.notice ( "Log as Info with string value : %s" CR , stringValue1.c_str()); + Log.notice (F("Log as Info with float value : %F" CR ), floatValue); + Log.notice ( "Log as Info with float value : %F" CR , floatValue); + Log.notice (F("Log as Info with double value : %D" CR ), doubleValue); + Log.notice ( "Log as Info with double value : %D" CR , doubleValue); + Log.notice (F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR ), intValue1 , intValue2 , + longValue1, longValue2, + boolValue1, boolValue2); + Log.trace ( "Log as Trace with bool value : %T" CR , boolValue1); + Log.traceln ( "Log as Trace with bool value : %T" , boolValue1); + Log.warning ( "Log as Warning with bool value : %T" CR , boolValue1); + Log.warningln( "Log as Warning with bool value : %T" , boolValue1); + Log.error ( "Log as Error with bool value : %T" CR , boolValue1); + Log.errorln ( "Log as Error with bool value : %T" , boolValue1); + Log.fatal ( "Log as Fatal with bool value : %T" CR , boolValue1); + Log.fatalln ( "Log as Fatal with bool value : %T" , boolValue1); + Log.verboseln(F("Log as Verbose with bool value : %T" ), boolValue2); + Log.verbose (F("Log as Verbose with bool value : %T" CR ), boolValue2); + + + delay(5000); } \ No newline at end of file diff --git a/keywords.txt b/keywords.txt index 2287ce6..9204507 100644 --- a/keywords.txt +++ b/keywords.txt @@ -20,6 +20,8 @@ error KEYWORD2 errorln KEYWORD2 warning KEYWORD2 warningln KEYWORD2 +info KEYWORD2 +infoln KEYWORD2 notice KEYWORD2 noticeln KEYWORD2 trace KEYWORD2 @@ -50,6 +52,7 @@ LOG_LEVEL_FATAL LITERAL1 Constants LOG_LEVEL_ERROR LITERAL1 Constants LOG_LEVEL_WARNING LITERAL1 Constants LOG_LEVEL_NOTICE LITERAL1 Constants +LOG_LEVEL_INFO LITERAL1 Constants LOG_LEVEL_TRACE LITERAL1 Constants LOG_LEVEL_VERBOSE LITERAL1 Constants diff --git a/library.json b/library.json index 709a31b..2afeaac 100644 --- a/library.json +++ b/library.json @@ -1,8 +1,8 @@ { "name": "ArduinoLog", "keywords": "logging, debug, log, log levels, AVR, ESP8266", - "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a chosen output target. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards.", - "version": "1.0.4", + "description": "ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a variety of output targets. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR, ESP8266 & ESP32 boards. Detailed instructions for use on Github page.", + "version": "1.1.1", "authors": { "name": "Thijs Elenbaas", "url": "https://github.com/thijse", diff --git a/library.properties b/library.properties index 8c9861f..1279f4a 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=ArduinoLog -version=1.0.4 +version=1.1.1 author=Thijs Elenbaas maintainer=Thijs Elenbaas sentence=Small logging framework -paragraph=ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a variety of output targets. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR and ESP8266 boards. +paragraph=ArduinoLog is a minimalistic logging framework to help the programmer output log statements to a variety of output targets. ArduinoLog is designed so that log statements can remain in the code with minimal performance cost. In order to facilitate this the loglevel can be adjusted, and if the code is completely tested all logging code can be compiled out. Tested for AVR, ESP8266 & ESP32 boards. Detailed instructions for use on Github page. category=Communication url=https://github.com/thijse/Arduino-Log/ architectures=* From ef41df45a559f8a1259c82fc73fca4f65c79eb23 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 24 May 2021 12:16:41 +0200 Subject: [PATCH 100/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c856445..ce012db 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,7 @@ IPAddress ipAddress(192, 168, 0, 1); Log.verboseln ("ip address : %p", ipAddress); ``` -[this example](https://forum.arduino.cc/t/printable-classes/438816) shows how to your own classes printable +[this example](https://forum.arduino.cc/t/printable-classes/438816) shows how to make your own classes printable ### Storing messages in Flash memory From 538ea9702ebbfff049f6364e882ec52bee695bb3 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 24 May 2021 12:51:22 +0200 Subject: [PATCH 101/109] - Added both examples to Travis test setup --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 167bd7b..fadfc49 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,14 +15,16 @@ "sudo cp -r arduino-1.6.13 /usr/local/share/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", - "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino", + "arduino --verify --board arduino:avr:uno $PWD/examples/Log-basic/Log-basic.ino" + "arduino --verify --board arduino:avr:uno $PWD/examples/Log-advanced/Log-advanced.ino" "sudo rm -rf /usr/local/share/arduino", "sudo cp -r arduino-1.8.1 /usr/local/share/arduino", "sudo rm /usr/local/bin/arduino", "sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino", "sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoLog", - "arduino --verify --board arduino:avr:uno $PWD/examples/Log/Log.ino" + "arduino --verify --board arduino:avr:uno $PWD/examples/Log-basic/Log-basic.ino" + "arduino --verify --board arduino:avr:uno $PWD/examples/Log-advanced/Log-advanced.ino" ], "group": "stable", "dist": "precise", From aa0831ad50f786e40d8d23e9265c4725406d176f Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 24 May 2021 12:54:24 +0200 Subject: [PATCH 102/109] Updated Travis build instructions for new examples --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fadfc49..992647a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,4 +29,4 @@ "group": "stable", "dist": "precise", "os": "linux" -} +} \ No newline at end of file From c88403e2f47f13f1737326322e49b6492199c0c5 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 24 May 2021 20:01:57 +0200 Subject: [PATCH 103/109] Update documentation in ArduinoLog.h --- ArduinoLog.h | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/ArduinoLog.h b/ArduinoLog.h index efb20f7..348b536 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -50,29 +50,29 @@ typedef void (*printfunction)(Print*, int); #define LOGGING_VERSION 1_0_4 /** - * Logging is a helper class to output informations over - * RS232. If you know log4j or log4net, this logging class - * is more or less similar ;-)
- * Different loglevels can be used to extend or reduce output - * All methods are able to handle any number of output parameters. - * All methods print out a formated string (like printf).
- * To reduce output and program size, reduce loglevel. - * - * Output format string can contain below wildcards. Every wildcard - * must be start with percent sign (\%) + * ArduinoLog is a minimalistic framework to help the programmer output log statements to an output of choice, + * fashioned after extensive logging libraries such as log4cpp ,log4j and log4net. In case of problems with an + * application, it is helpful to enable logging so that the problem can be located. ArduinoLog is designed so + * that log statements can remain in the code with minimal performance cost. In order to facilitate this the + * loglevel can be adjusted, and (if your code is completely tested) all logging code can be compiled out. * * ---- Wildcards * - * %s replace with an string (char*) - * %c replace with an character - * %d replace with an integer value - * %l replace with an long value - * %x replace and convert integer value into hex - * %X like %x but combine with 0x123AB - * %b replace and convert integer value into binary - * %B like %x but combine with 0b10100011 - * %t replace and convert boolean value into "t" or "f" - * %T like %t but convert into "true" or "false" + * %s display as string (char*) + * %S display as string from flash memory (__FlashStringHelper* or char[] PROGMEM) + * %c display as single character + * %C display as single character or as hexadecimal value (prefixed by `0x`) if not a printable character + * %d display as integer value + * %l display as long value + * %u display as unsigned long value + * %x display as hexadecimal value + * %X display as hexadecimal value prefixed by `0x` and leading zeros + * %b display as binary number + * %B display as binary number, prefixed by `0b` + * %t display as boolean value "t" or "f" + * %T display as boolean value "true" or "false" + * %D,%F display as double value + * %p display a printable object * * ---- Loglevels * From 158fd6157004cc139157f64ce83e179555e77008 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Mon, 24 May 2021 20:23:29 +0200 Subject: [PATCH 104/109] Added NL & LF characters --- ArduinoLog.h | 2 ++ README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ArduinoLog.h b/ArduinoLog.h index 348b536..33e7564 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -47,6 +47,8 @@ typedef void (*printfunction)(Print*, int); #define LOG_LEVEL_VERBOSE 6 #define CR "\n" +#define LF "\r" +#define NL "\n\r" #define LOGGING_VERSION 1_0_4 /** diff --git a/README.md b/README.md index ce012db..628cd76 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ where the format string can be used to format the log variables * %p display a printable object ``` - Newlines can be added using the CR keyword or by using the `...ln` version of each of the log functions. The difference when using the `...ln` is that the newline is placed after suffix, and only a single newline can be added. + Newlines can be added using the `CR` keyword or by using the `...ln` version of each of the log functions. The difference when using the `...ln` is that the newline is placed after suffix, and only a single newline can be added. Some terminals prefer `NL` (New line). ### Examples From fb8686dd772ab68b2fff2c4082a864d80b5c3e75 Mon Sep 17 00:00:00 2001 From: Thijs Elenbaas Date: Thu, 27 May 2021 22:16:37 +0200 Subject: [PATCH 105/109] Merge of @wrong-kendall "Create a PlatformIO example and unit test" & "Don't cast the va_arg for __FlashStringHelper* or char* because it crashes on x86" --- ArduinoLog.cpp | 4 +- examples/platformio-basic/platformio.ini | 37 ++ examples/platformio-basic/src/main.cpp | 121 +++++++ .../platformio-basic/test/test_native.cpp | 325 ++++++++++++++++++ 4 files changed, 485 insertions(+), 2 deletions(-) create mode 100644 examples/platformio-basic/platformio.ini create mode 100644 examples/platformio-basic/src/main.cpp create mode 100644 examples/platformio-basic/test/test_native.cpp diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 2f06cfa..538ea3d 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -172,12 +172,12 @@ void Logging::printFormat(const char format, va_list *args) { } else if (format == 's') { - register char *s = (char *)va_arg(*args, int); + register char *s = va_arg(*args, char *); _logOutput->print(s); } else if (format == 'S') { - register __FlashStringHelper *s = (__FlashStringHelper *)va_arg(*args, int); + register __FlashStringHelper *s = va_arg(*args, __FlashStringHelper *); _logOutput->print(s); } else if (format == 'd' || format == 'i') diff --git a/examples/platformio-basic/platformio.ini b/examples/platformio-basic/platformio.ini new file mode 100644 index 0000000..4e8559a --- /dev/null +++ b/examples/platformio-basic/platformio.ini @@ -0,0 +1,37 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +default_envs = adafruit_feather_m4 + +[env:adafruit_feather_m4] +platform = atmelsam +board = adafruit_feather_m4 +framework = arduino +lib_deps = + ; TODO(kendall): Remove if/when Arduino-Log is available through + ; PlatformIO's Library Manager + https://github.com/thijse/Arduino-Log.git +test_ignore = test_native + + +[env:native] +platform = native +build_flags = + ; TODO(kendall): Remove if/when + ; https://github.com/thijse/Arduino-Log/pull/13 is merged + -DARDUINO=101 +lib_compat_mode = off +lib_deps = + https://github.com/FabioBatSilva/ArduinoFake.git + ; TODO(kendall): Remove if/when Arduino-Log is available through + ; PlatformIO's Library Manager + https://github.com/thijse/Arduino-Log.git + diff --git a/examples/platformio-basic/src/main.cpp b/examples/platformio-basic/src/main.cpp new file mode 100644 index 0000000..0a87923 --- /dev/null +++ b/examples/platformio-basic/src/main.cpp @@ -0,0 +1,121 @@ +#ifndef UNIT_TEST +#include +#include +/* + _ ___ ___ _ _ ___ _ _ ___ _ ___ ___ + /_\ | _ \ \| | | |_ _| \| |/ _ \| | / _ \ / __| + / _ \| / |) | |_| || || .` | (_) | |_| (_) | (_ | + /_/ \_\_|_\___/ \___/|___|_|\_|\___/|____\___/ \___| + + Log library example + Licensed under the MIT License . + + This example sketch shows most of the features of the ArduinoLog library + +*/ + +int intValue1, intValue2; +long longValue1, longValue2; +bool boolValue1, boolValue2; +const char *charArray = "this is a string"; +const char flashCharArray1[] PROGMEM = "this is a string"; +String stringValue1 = "this is a string"; +float floatValue; +double doubleValue; + +void printTimestamp(Print *_logOutput) { + char c[12]; + int m = sprintf(c, "%10lu ", millis()); + _logOutput->print(c); +} + +void printCarret(Print *_logOutput) { _logOutput->print('>'); } + +void setup() { + // Set up serial port and wait until connected + Serial.begin(9600); + while (!Serial && !Serial.available()) { + } + randomSeed(analogRead(0)); + // Pass log level, whether to show log level, and print interface. + // Available levels are: + // LOG_LEVEL_SILENT, LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARNING, + // LOG_LEVEL_NOTICE, LOG_LEVEL_TRACE, LOG_LEVEL_VERBOSE Note: if you want to + // fully remove all logging code, uncomment #define DISABLE_LOGGING in + // Logging.h + // this will significantly reduce your project size + + Log.begin(LOG_LEVEL_VERBOSE, &Serial); + + // Start logging + + Log.notice( + F(CR "******************************************" CR)); // Info string + // with Newline + Log.notice( + "*** Logging example " CR); // Info string in + // flash memory + Log.notice(F("******************* ")); + Log.notice("*********************** " CR); // two info strings without newline +} + +void loop() { + // set up some random variables + intValue1 = random(100); + intValue2 = random(10000); + longValue1 = random(1000000); + longValue2 = random(100000000); + boolValue1 = random(2) == 0; + boolValue2 = random(2) == 1; + floatValue = 12.34; + doubleValue = 1234.56789; + + //__FlashStringHelper cannot be declared outside a function + const __FlashStringHelper *flashCharArray2 = F("this is a string"); + + Log.notice("Log as Info with integer values : %d, %d" CR, intValue1, + intValue2); + Log.notice(F("Log as Info with hex values : %x, %X" CR), intValue1, + intValue1); + Log.notice("Log as Info with hex values : %x, %X" CR, intValue2, + intValue2); + Log.notice(F("Log as Info with binary values : %b, %B" CR), intValue1, + intValue1); + Log.notice("Log as Info with binary values : %b, %B" CR, intValue2, + intValue2); + Log.notice(F("Log as Info with long values : %l, %l" CR), longValue1, + longValue2); + Log.notice("Log as Info with bool values : %t, %T" CR, boolValue1, + boolValue2); + Log.notice(F("Log as Info with string value : %s" CR), charArray); + Log.notice("Log as Info with Flash string value : %S" CR, flashCharArray1); + Log.notice("Log as Info with Flash string value : %S" CR, flashCharArray2); + Log.notice("Log as Info with string value : %s" CR, stringValue1.c_str()); + Log.notice(F("Log as Info with float value : %F" CR), floatValue); + Log.notice("Log as Info with float value : %F" CR, floatValue); + Log.notice(F("Log as Info with double value : %D" CR), doubleValue); + Log.notice("Log as Info with double value : %D" CR, doubleValue); + Log.notice(F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR), + intValue1, intValue2, longValue1, longValue2, boolValue1, + boolValue2); + + Log.trace("Log as Trace with bool value : %T" CR, boolValue1); + Log.traceln("Log as Trace with bool value : %T", boolValue1); + Log.warning("Log as Warning with bool value : %T" CR, boolValue1); + Log.warningln("Log as Warning with bool value : %T", boolValue1); + Log.error("Log as Error with bool value : %T" CR, boolValue1); + Log.errorln("Log as Error with bool value : %T", boolValue1); + Log.fatal("Log as Fatal with bool value : %T" CR, boolValue1); + Log.fatalln("Log as Fatal with bool value : %T", boolValue1); + Log.verboseln(F("Log as Verbose with bool value : %T"), boolValue2); + Log.verbose(F("Log as Verbose with bool value : %T" CR), boolValue2); + + Log.setPrefix(printTimestamp); // set timestamp as prefix + Log.setSuffix(printCarret); // set carret as suffix + Log.verboseln(F("Log with suffix & prefix")); + Log.setPrefix(NULL); // set timestamp as prefix + Log.setSuffix(NULL); // set carret as suffix + + delay(5000); +} +#endif \ No newline at end of file diff --git a/examples/platformio-basic/test/test_native.cpp b/examples/platformio-basic/test/test_native.cpp new file mode 100644 index 0000000..ce46efe --- /dev/null +++ b/examples/platformio-basic/test/test_native.cpp @@ -0,0 +1,325 @@ +#include "ArduinoLog.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace fakeit; +std::stringstream output_; + +void reset_output() { + output_.str(std::string()); + output_.clear(); +} + +std::string decimal_to_binary(int n) { + + std::string binary; + while (n != 0) { + binary = (n % 2 == 0 ? "0" : "1") + binary; + n /= 2; + } + return binary; +} + +void TEST_ASSERT_EQUAL_STRING_STREAM(std::stringstream const &expected_output, + std::stringstream const &actual_output) { + + TEST_ASSERT_EQUAL_STRING(expected_output.str().c_str(), + actual_output.str().c_str()); +} + +void set_up_logging_captures() { + When(OverloadedMethod(ArduinoFake(Serial), println, size_t(void))) + .AlwaysDo([&]() -> int { + output_ << "\n"; + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(char))) + .AlwaysDo([&](const char x) -> int { + output_ << x; + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(const char[]))) + .AlwaysDo([&](const char x[]) -> int { + output_ << x; + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(const String &))) + .AlwaysDo([&](const String &x) -> int { + output_ << x.c_str(); + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(unsigned char, int))) + .AlwaysDo([&](unsigned char x, int y) -> int { + if (y == 2) { + output_ << decimal_to_binary(x); + } else { + output_ << std::setbase(y) << (unsigned long)x; + } + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(unsigned long, int))) + .AlwaysDo([&](unsigned long x, int y) -> int { + output_ << std::fixed << std::setprecision(y) << x; + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(int, int))) + .AlwaysDo([&](int x, int y) -> int { + if (y == 2) { + output_ << decimal_to_binary(x); + } else { + output_ << std::setbase(y) << x; + } + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(unsigned int, int))) + .AlwaysDo([&](unsigned int x, int y) -> int { + if (y == 2) { + output_ << decimal_to_binary(x); + } else { + output_ << std::setbase(y) << x; + } + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(double, int))) + .AlwaysDo([&](double x, int y) -> int { + output_ << std::fixed << std::setprecision(y) << x; + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(long, int))) + .AlwaysDo([&](long x, int y) -> int { + if (y == 2) { + output_ << std::bitset(x).to_string(); + } else { + output_ << std::setbase(y) << x; + } + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(unsigned long, int))) + .AlwaysDo([&](unsigned long x, int y) -> int { + if (y == 2) { + output_ << std::bitset(x).to_string(); + } else { + output_ << std::setbase(y) << x; + } + return 1; + }); + When(OverloadedMethod(ArduinoFake(Serial), print, + size_t(const __FlashStringHelper *ifsh))) + .AlwaysDo([&](const __FlashStringHelper *x) -> int { + auto message = reinterpret_cast(x); + output_ << message; + return 1; + }); + + When(Method(ArduinoFake(Serial), flush)).AlwaysReturn(); +} + +void setUp(void) { + ArduinoFakeReset(); + Log.begin(LOG_LEVEL_VERBOSE, &Serial); + set_up_logging_captures(); +} +void test_int_values() { + reset_output(); + int int_value1 = 173; + int int_value2 = 65536; + Log.notice("Log as Info with integer values : %d, %d" CR, int_value1, + int_value2); + std::stringstream expected_output; + expected_output << "N: Log as Info with integer values : 173, 65536\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_int_hex_values() { + reset_output(); + int int_value1 = 152; + int int_value2 = 65010; + Log.notice(F("Log as Info with hex values : %x, %X" CR), int_value1, + int_value1); + Log.notice("Log as Info with hex values : %x, %X" CR, int_value2, + int_value2); + std::stringstream expected_output; + expected_output << "N: Log as Info with hex values : 98, 0x0098\n" + << "N: Log as Info with hex values : fdf2, 0xfdf2\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_int_binary_values() { + reset_output(); + int int_value1 = 2218; + int int_value2 = 17814; + Log.notice(F("Log as Info with binary values : %b, %B" CR), int_value1, + int_value2); + std::stringstream expected_output; + expected_output << "N: Log as Info with binary values : 100010101010, " + "0b100010110010110\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} +void test_long_values() { + reset_output(); + long long_value1 = 34359738368; + long long_value2 = 274877906944; + Log.notice(F("Log as Info with long values : %l, %l" CR), long_value1, + long_value2); + std::stringstream expected_output; + expected_output << "N: Log as Info with long values : " + "34359738368, 274877906944\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_bool_values() { + reset_output(); + bool true_value = true; + bool false_value = false; + Log.notice("Log as Info with bool values : %t, %T" CR, true_value, + true_value); + Log.notice("Log as Info with bool values : %t, %T" CR, false_value, + false_value); + std::stringstream expected_output; + expected_output << "N: Log as Info with bool values : T, true\n"; + expected_output << "N: Log as Info with bool values : F, false\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_char_string_values() { + reset_output(); + const char *charArray = "this is a string"; + Log.notice(F("Log as Info with string value : %s" CR), charArray); + std::stringstream expected_output; + expected_output << "N: Log as Info with string value : this is a string\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_flash_string_values() { + reset_output(); + //__FlashStringHelper cannot be declared outside a function + const __FlashStringHelper *flashCharArray2 = F("this is a string"); + + const char flashCharArray1[] PROGMEM = "this is a string"; + Log.notice("Log as Info with Flash string value : %S" CR, flashCharArray1); + std::stringstream expected_output; + expected_output + << "N: Log as Info with Flash string value : this is a string\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_string_values() { + reset_output(); + String stringValue1 = "this is a string"; + Log.notice("Log as Info with string value : %s" CR, stringValue1.c_str()); + std::stringstream expected_output; + expected_output << "N: Log as Info with string value : this is a string\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_float_values() { + reset_output(); + float float_value = 12.34; + Log.notice(F("Log as Info with float value : %F" CR), float_value); + Log.notice("Log as Info with float value : %F" CR, float_value); + std::stringstream expected_output; + expected_output << "N: Log as Info with float value : 12.34\n" + << "N: Log as Info with float value : 12.34\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_double_values() { + reset_output(); + double double_value = 1234.56789; + // Log.notice(F("%D" CR), double_value); + Log.notice(F("Log as Info with double value : %D" CR), double_value); + Log.notice("Log as Info with double value : %D" CR, double_value); + std::stringstream expected_output; + expected_output << "N: Log as Info with double value : 1234.57\n" + << "N: Log as Info with double value : 1234.57\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_mixed_values() { + reset_output(); + int int_value1 = 15826; + int int_value2 = 31477; + long long_value1 = 274877906944; + long long_value2 = 68719476743; + bool true_value = true; + bool false_value = false; + Log.notice(F("Log as Debug with mixed values : %d, %d, %l, %l, %t, %T" CR), + int_value1, int_value2, long_value1, long_value2, true_value, + false_value); + std::stringstream expected_output; + expected_output + << "N: Log as Debug with mixed values : 15826, 31477, 274877906944, " + "68719476743, T, false\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void test_log_levels() { + reset_output(); + bool true_value = true; + bool false_value = false; + Log.trace("Log as Trace with bool value : %T" CR, true_value); + Log.traceln("Log as Trace with bool value : %T", false_value); + Log.warning("Log as Warning with bool value : %T" CR, true_value); + Log.warningln("Log as Warning with bool value : %T", false_value); + Log.error("Log as Error with bool value : %T" CR, true_value); + Log.errorln("Log as Error with bool value : %T", false_value); + Log.fatal("Log as Fatal with bool value : %T" CR, true_value); + Log.fatalln("Log as Fatal with bool value : %T", false_value); + Log.verboseln(F("Log as Verbose with bool value : %T"), true_value); + Log.verbose(F("Log as Verbose with bool value : %T" CR), false_value); + std::stringstream expected_output; + expected_output << "T: Log as Trace with bool value : true\n" + "T: Log as Trace with bool value : false\n" + "W: Log as Warning with bool value : true\n" + "W: Log as Warning with bool value : false\n" + "E: Log as Error with bool value : true\n" + "E: Log as Error with bool value : false\n" + "F: Log as Fatal with bool value : true\n" + "F: Log as Fatal with bool value : false\n" + "V: Log as Verbose with bool value : true\n" + "V: Log as Verbose with bool value : false\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +void printTimestamp(Print *_logOutput) { + char c[12]; + int m = sprintf(c, "%10lu ", millis()); + _logOutput->print(c); +} +void printCarret(Print *_logOutput) { _logOutput->print('>'); } + +void test_prefix_and_suffix() { + reset_output(); + When(Method(ArduinoFake(), millis)).Return(1026); + Log.setPrefix(printTimestamp); // set timestamp as prefix + Log.setSuffix(printCarret); // set carret as suffix + Log.verboseln(F("Log with suffix & prefix")); + Log.setPrefix(NULL); // clear prefix + Log.setSuffix(NULL); // clear suffix + std::stringstream expected_output; + expected_output << " 1026 V: Log with suffix & prefix>\n"; + TEST_ASSERT_EQUAL_STRING_STREAM(expected_output, output_); +} + +int main(int argc, char **argv) { + UNITY_BEGIN(); + RUN_TEST(test_int_values); + RUN_TEST(test_int_hex_values); + RUN_TEST(test_int_binary_values); + RUN_TEST(test_long_values); + RUN_TEST(test_bool_values); + RUN_TEST(test_char_string_values); + RUN_TEST(test_flash_string_values); + RUN_TEST(test_string_values); + RUN_TEST(test_float_values); + RUN_TEST(test_double_values); + RUN_TEST(test_mixed_values); + RUN_TEST(test_log_levels); + RUN_TEST(test_prefix_and_suffix); + UNITY_END(); +} \ No newline at end of file From 80c86ba04a379dd729cfad3155235c5aa24e34b6 Mon Sep 17 00:00:00 2001 From: Thijs Triemstra Date: Wed, 16 Jun 2021 16:31:58 +0200 Subject: [PATCH 106/109] fix typo --- examples/Log-advanced/Log-advanced.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/Log-advanced/Log-advanced.ino b/examples/Log-advanced/Log-advanced.ino index d40256d..2d0c867 100644 --- a/examples/Log-advanced/Log-advanced.ino +++ b/examples/Log-advanced/Log-advanced.ino @@ -58,18 +58,18 @@ void printTimestamp(Print* _logOutput) { const unsigned long SECS_PER_DAY = 86400; // Total time - const unsigned long msecs = millis() ; + const unsigned long msecs = millis(); const unsigned long secs = msecs / MSECS_PER_SEC; // Time in components - const unsigned long MiliSeconds = msecs % MSECS_PER_SEC; + const unsigned long MilliSeconds = msecs % MSECS_PER_SEC; const unsigned long Seconds = secs % SECS_PER_MIN ; const unsigned long Minutes = (secs / SECS_PER_MIN) % SECS_PER_MIN; const unsigned long Hours = (secs % SECS_PER_DAY) / SECS_PER_HOUR; // Time as string char timestamp[20]; - sprintf(timestamp, "%02d:%02d:%02d.%03d ", Hours, Minutes, Seconds, MiliSeconds); + sprintf(timestamp, "%02d:%02d:%02d.%03d ", Hours, Minutes, Seconds, MilliSeconds); _logOutput->print(timestamp); } From 7f8aa992c4c897e2ff9c6805463fedafb78c73be Mon Sep 17 00:00:00 2001 From: katutxakurra Date: Tue, 13 Jul 2021 10:40:41 +0100 Subject: [PATCH 107/109] Private _logOutput conditional compilation when DISABLE_LOGGING This avoids error: '_logOutput' was not declared in this scope when DISABLE_LOGGING is defined. --- ArduinoLog.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ArduinoLog.h b/ArduinoLog.h index 33e7564..9ec9fb0 100644 --- a/ArduinoLog.h +++ b/ArduinoLog.h @@ -328,7 +328,9 @@ class Logging void print(const Printable& obj, va_list args) { +#ifndef DISABLE_LOGGING _logOutput->print(obj); +#endif } void printFormat(const char format, va_list *args); @@ -382,4 +384,4 @@ class Logging #endif }; -extern Logging Log; \ No newline at end of file +extern Logging Log; From 1e68cd9ef93f6a15cb26288cfb972eac900c5191 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 16 Feb 2023 20:38:20 +0100 Subject: [PATCH 108/109] Fix: clearSuffix was clearing the prefix Fix: clearSuffix was clearing the prefix instead of the suffix --- ArduinoLog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index 538ea3d..c4075fe 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -96,7 +96,7 @@ void Logging::setSuffix(printfunction f) void Logging::clearSuffix() { #ifndef DISABLE_LOGGING - _prefix = nullptr; + _suffix = nullptr; #endif } From 37c675c04189cdb9f5ce95e628eb8d0fdec13c0d Mon Sep 17 00:00:00 2001 From: jonasbjurel Date: Wed, 16 Aug 2023 12:14:44 +0200 Subject: [PATCH 109/109] Added an option to not automatically instantiate a Log object. In some cases you do not want the Log object to be instantiated automatically by the library. Reasons could be that you want to control the heap memory segment type that gets allocated for the log object, or that you want to inherit the log base to another derived class. This commit adds a flag "__DO_NOT_INSTANTIATE__" that if set omits the automatic instantiation. The change is backwards compatible. --- ArduinoLog.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ArduinoLog.cpp b/ArduinoLog.cpp index c4075fe..b9085d4 100644 --- a/ArduinoLog.cpp +++ b/ArduinoLog.cpp @@ -262,5 +262,8 @@ void Logging::printFormat(const char format, va_list *args) { } #endif } - + +#ifndef __DO_NOT_INSTANTIATE__ Logging Log = Logging(); +#endif +