diff --git a/src/trace.cpp b/src/trace.cpp index 19f8893..86e718e 100644 --- a/src/trace.cpp +++ b/src/trace.cpp @@ -4,21 +4,20 @@ #define MAX_TRACE_LINES 15 #define MAX_LINE_LEN 50 -struct TraceLine -{ - char _text[MAX_LINE_LEN + 1]; - uint32_t _time; - uint8_t _severity; +struct TraceLine { + char _text[MAX_LINE_LEN + 1]; + uint32_t _time; + uint8_t _severity; - TraceLine(uint8_t severity, const char *str, uint16_t len) - { - strncpy(_text, str, sizeof(_text)); - _text[MAX_LINE_LEN] = 0; - _time = millis(); - _severity = severity; - } + TraceLine(uint8_t severity, const char *str, uint16_t len) + { + strncpy(_text, str, sizeof(_text)); + _text[MAX_LINE_LEN] = 0; + _time = millis(); + _severity = severity; + } - TraceLine(void) {} + TraceLine(void) {} }; static TraceLine _lines[MAX_TRACE_LINES]; @@ -26,50 +25,48 @@ static uint16_t _lines_index = 0; static uint16_t _lines_count = 0; static volatile int _modified = 0; static AsyncWebSocket *_wss = NULL; // webovy soket pro trasovani -static Interval _tint; // interval pro casovani stopare +static Interval _tint(TRACE_CHECK_INTERVAL); // interval pro casovani stopare static void (*message_cb)(const char *) = NULL; static int modulo(int a, int b) { - int r = a % b; + int r = a % b; - return ((r < 0) ? r + b : r); + return ((r < 0) ? r + b : r); } static TraceLine &trace_line(uint16_t index) { - int start = _lines_index - _lines_count; - int idx = modulo(start + index, _lines_count); + int start = _lines_index - _lines_count; + int idx = modulo(start + index, _lines_count); - return (_lines[idx]); + return (_lines[idx]); } static void print(uint8_t severity, const char *buffer, int length) { - char lin[MAX_LINE_LEN + 1]; - unsigned int lineptr = 0; + char lin[MAX_LINE_LEN + 1]; + unsigned int lineptr = 0; - while ((0 != *buffer) && (lineptr < (sizeof(lin) - 1))) - { - if (*buffer > 0x1f) - lin[lineptr] = *buffer; - else - lin[lineptr] = '?'; - ++lineptr; - ++buffer; - } - lin[lineptr] = 0; // ukoncime retezec + while ((0 != *buffer) && (lineptr < (sizeof(lin) - 1))) { + if (*buffer > 0x1f) + lin[lineptr] = *buffer; + else + lin[lineptr] = '?'; + ++lineptr; + ++buffer; + } + lin[lineptr] = 0; // ukoncime retezec - TraceLine line(severity, lin, lineptr); + TraceLine line(severity, lin, lineptr); - _lines[_lines_index++] = line; - _lines_index %= MAX_TRACE_LINES; - if (_lines_count < MAX_TRACE_LINES) - { - ++_lines_count; - } - ++_modified; + _lines[_lines_index++] = line; + _lines_index %= MAX_TRACE_LINES; + if (_lines_count < MAX_TRACE_LINES) { + ++_lines_count; + } + ++_modified; } void trace_init(void) @@ -79,218 +76,207 @@ void trace_init(void) static String _getText(const char *buffer) { - String res; + String res; - res.reserve(MAX_LINE_LEN * 4); + res.reserve(MAX_LINE_LEN * 4); - while (0 != *buffer) - { - switch (*buffer)// uprava escape sekvenci pro JSON/HTML - { - case '"': - res.concat(F("\\\"")); - break; + while (0 != *buffer) { + switch (*buffer) { // uprava escape sekvenci pro JSON/HTML + case '"': + res.concat(F("\\\"")); + break; - case '\\': - res.concat(F("\\\\")); - break; + case '\\': + res.concat(F("\\\\")); + break; - case '/': - res.concat(F("\\/")); - break; + case '/': + res.concat(F("\\/")); + break; - case '<': - res.concat(F("<")); - break; + case '<': + res.concat(F("<")); + break; - case '>': - res.concat(F(">")); - break; + case '>': + res.concat(F(">")); + break; - default: - if (*buffer < 128) - res.concat(*buffer); - else - { - char chr[3]; - res.concat(F("\\u00")); - sprintf_P(chr, PSTR("%02X"), *buffer); - res.concat(chr); - } - break; + default: + if (*buffer < 128) + res.concat(*buffer); + else { + char chr[3]; + res.concat(F("\\u00")); + sprintf_P(chr, PSTR("%02X"), *buffer); + res.concat(chr); + } + break; + } + ++buffer; } - ++buffer; - } - return res; + return res; } void trace_dumpJSON(String &str) { - for (int i=0; i<_lines_count; i++) - { - TraceLine line = trace_line(i); + for (int i = 0; i < _lines_count; i++) { + TraceLine line = trace_line(i); - if (0 != i) - str.concat(F(",")); - str.concat(F("{\"t\":")); - str.concat(line._time); - str.concat(F(",\"s\":")); - str.concat(line._severity); - str.concat(F(",\"d\":\"")); - str.concat(_getText(line._text)); - str.concat(F("\"}")); - } + if (0 != i) + str.concat(F(",")); + str.concat(F("{\"t\":")); + str.concat(line._time); + str.concat(F(",\"s\":")); + str.concat(line._severity); + str.concat(F(",\"d\":\"")); + str.concat(_getText(line._text)); + str.concat(F("\"}")); + } } void trace_clear(void) { - _lines_index = 0; - _lines_count = 0; - _modified = 1; + _lines_index = 0; + _lines_count = 0; + _modified = 1; } void trace_end(void) { - trace_clear(); + trace_clear(); } void trace_print(uint8_t severity, const __FlashStringHelper *fmt, ...) { - char buffer[MAX_LINE_LEN + 1]; - va_list args; - int length; + char buffer[MAX_LINE_LEN + 1]; + va_list args; + int length; - va_start(args, fmt); - length = vsnprintf_P(buffer, sizeof (buffer), (const char *)fmt, args); - va_end(args); + va_start(args, fmt); + length = vsnprintf_P(buffer, sizeof (buffer), (const char *)fmt, args); + va_end(args); - print(severity, buffer, length); + print(severity, buffer, length); } void trace_print(uint8_t severity, const char *fmt, ...) { - char buffer[MAX_LINE_LEN + 1]; - va_list args; - int length; + char buffer[MAX_LINE_LEN + 1]; + va_list args; + int length; - va_start(args, fmt); - length = vsnprintf(buffer, sizeof(buffer), fmt, args); - va_end(args); + va_start(args, fmt); + length = vsnprintf(buffer, sizeof(buffer), fmt, args); + va_end(args); - print(severity, buffer, length); + print(severity, buffer, length); } void trace_registermessagecb(void (*cb)(const char *)) { - message_cb = cb; + message_cb = cb; } void trace_addweb(AsyncWebSocket *socket) { - _wss = socket; + _wss = socket; } static char hexascii(uint8_t n) { - n &= 0xf; - if (n > 9) - return n + ('A' - 10); - else - return n + '0'; + n &= 0xf; + if (n > 9) + return n + ('A' - 10); + else + return n + '0'; } void trace_dump(uint8_t severity, const char *prefix, uint8_t *address, size_t size) { - char buffer[MAX_LINE_LEN + 1 + 3]; - int idx = 0; + char buffer[MAX_LINE_LEN + 1 + 3]; + int idx = 0; - if (prefix) - idx = snprintf_P(buffer, MAX_LINE_LEN, PSTR("%s"), prefix); + if (prefix) + idx = snprintf_P(buffer, MAX_LINE_LEN, PSTR("%s"), prefix); - while ((idx < MAX_LINE_LEN) && size) - { - buffer[idx] = hexascii(*address >> 4); - ++idx; - buffer[idx] = hexascii(*address); - ++idx; - buffer[idx] = 0x20; - ++idx; - ++address; - --size; - } - buffer[idx] = 0; - print(severity, buffer, idx); + while ((idx < MAX_LINE_LEN) && size) { + buffer[idx] = hexascii(*address >> 4); + ++idx; + buffer[idx] = hexascii(*address); + ++idx; + buffer[idx] = 0x20; + ++idx; + ++address; + --size; + } + buffer[idx] = 0; + print(severity, buffer, idx); } void trace_dump(uint8_t severity, const __FlashStringHelper *prefix, uint8_t *address, size_t size) { - char buffer[MAX_LINE_LEN + 1 + 3]; - int idx = 0; + char buffer[MAX_LINE_LEN + 1 + 3]; + int idx = 0; - if (prefix) - { - char dummy[64]; + if (prefix) { + char dummy[64]; - strcpy_P(dummy, (const char *)prefix); - idx = snprintf_P(buffer, MAX_LINE_LEN, PSTR("%s"), dummy); - } + strcpy_P(dummy, (const char *)prefix); + idx = snprintf_P(buffer, MAX_LINE_LEN, PSTR("%s"), dummy); + } - while ((idx < MAX_LINE_LEN) && size) - { - buffer[idx] = hexascii(*address >> 4); - ++idx; - buffer[idx] = hexascii(*address); - ++idx; - buffer[idx] = 0x20; - ++idx; - ++address; - --size; - } - buffer[idx] = 0; - print(severity, buffer, idx); + while ((idx < MAX_LINE_LEN) && size) { + buffer[idx] = hexascii(*address >> 4); + ++idx; + buffer[idx] = hexascii(*address); + ++idx; + buffer[idx] = 0x20; + ++idx; + ++address; + --size; + } + buffer[idx] = 0; + print(severity, buffer, idx); } void trace_forceupdate(void) { - ++_modified; // vynutime odeslani informaci + ++_modified; // vynutime odeslani informaci } void trace_poll() { - if (NULL != _wss) - { // je definovany webovy soket - if (_modified) - { // mame nejakou zmenu - if (_wss->count() != 0) - { // mame klienty - if (_tint.expired()) - { // .. a vyprsel timeout pro obcerstvovani - String log; + if (NULL != _wss) { + // je definovany webovy soket + if (_modified) { + // mame nejakou zmenu + if (_wss->count() != 0) { + // mame klienty + if (_tint.expired()) { + // .. a vyprsel timeout pro obcerstvovani + String log; - _modified = 0; // rusime pozadavek na odeslani novych dat - if (log.reserve((MAX_TRACE_LINES * MAX_LINE_LEN) + (MAX_TRACE_LINES * 50))) - { - log = F("{\"type\":\"trace\",\"data\":["); - trace_dumpJSON(log); - log.concat(F("]}")); - _wss->textAll(log); - } - else - _wss->textAll(F("{\"type\":\"trace\",\"text\":\"Memory error\"}")); - _tint.set(TRACE_CHECK_INTERVAL); + _modified = 0; // rusime pozadavek na odeslani novych dat + if (log.reserve((MAX_TRACE_LINES * MAX_LINE_LEN) + (MAX_TRACE_LINES * 50))) { + log = F("{\"type\":\"trace\",\"data\":["); + trace_dumpJSON(log); + log.concat(F("]}")); + _wss->textAll(log); + } else + _wss->textAll(F("{\"type\":\"trace\",\"text\":\"Memory error\"}")); + } + } else + _modified = 0; // zadny pripojeny klient - po pripojeni stejne musime vyzadat stav, takze ted muzeme modifikaci klidne ignorovat } - } - else - _modified = 0; // zadny pripojeny klient - po pripojeni stejne musime vyzadat stav, takze ted muzeme modifikaci klidne ignorovat } - } } // EOF diff --git a/src/trace.h b/src/trace.h index 0641f9c..f63ba62 100644 --- a/src/trace.h +++ b/src/trace.h @@ -2,7 +2,7 @@ * @file trace.h * @author Pavel Brychta, http://www.xpablo.cz * - * Copyright (c) 2016-18 Pavel Brychta. All rights reserved. + * Copyright (c) 2016-19 Pavel Brychta. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,9 +22,6 @@ #ifndef _TRACE_H_ #define _TRACE_H_ -#include -#include - // Definice jednotlivych typu hlaseni do trasovani #define TRACE_ERROR 0 // chybova zprava = cervena #define TRACE_WARNING 1 // varovani - zluta @@ -34,6 +31,11 @@ #define TRACE_CHECK_INTERVAL 200 // interval [ms], po kterem je testovano odesilani stopare +#ifndef DONT_USE_TRACE + +#include +#include + /** * @brief Inicializace modulu */ @@ -120,4 +122,25 @@ void trace_dump(uint8_t severity, const __FlashStringHelper *prefix, uint8_t *ad */ void trace_forceupdate(void); +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) + +#define TRACE(severity, ...) trace_print(severity, __VA_ARGS__) +#define TRACEFUNC(severity, ...) trace_printfunc(severity, __func__, __FILE__, TOSTRING(__LINE__), __VA_ARGS__) +#define TRACEDUMP(severity, prefix, address, size) trace_dump(severity, prefix, address, size) +#define TRACE_INIT trace_init() +#define TRACE_ADDWEB(srv) trace_addweb(srv) +#define TRACE_POLL trace_poll() +#define TRACE_FORCEUPDATE(a) trace_forceupdate() + +#else // DONT_USE_TRACE +#define TRACE(...) ((void)0) // from assert.h "NOP" - http://stackoverflow.com/questions/9187628/c-empty-function-macros +#define TRACEFUNC(...) ((void)0) +#define TRACEDUMP(...) ((void)0) +#define TRACE_INIT ((void)0) +#define TRACE_ADDWEB(a) ((void)0) +#define TRACE_POLL ((void)0) +#define TRACE_FORCEUPDATE(a) ((void)0) +#endif // DONT_USE_TRACE + #endif // _TRACE_H_