From f445a6ef5755d83dc9e9eb0534f56a0eca2deb0f Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Wed, 8 Dec 2021 20:15:37 -0600 Subject: [PATCH] Added ability to intercept log data for future GUI live log viewer. --- client/src/main.c | 4 +-- shared/log.c | 78 +++++++++++++++++++++++++++++++---------------- shared/log.h | 6 +++- 3 files changed, 58 insertions(+), 30 deletions(-) diff --git a/client/src/main.c b/client/src/main.c index 0b56c85..2fd8537 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -251,8 +251,8 @@ int main(int argc, char *argv[]) { __packetThreadData = packetThreadDataCreate(NULL); packetSenderRegister(comPacketSender); - taskCreate(taskComDebugLoop, NULL); - //taskCreate(taskWelcome, NULL); + //taskCreate(taskComDebugLoop, NULL); + taskCreate(taskWelcome, NULL); taskCreate(taskGuiEventLoop, NULL); taskRun(); diff --git a/shared/log.c b/shared/log.c index ade5384..caaf820 100644 --- a/shared/log.c +++ b/shared/log.c @@ -21,15 +21,31 @@ #include "log.h" -static FILE *_log = NULL; -static uint8_t _ourHandle = 0; +static FILE *_log = NULL; +static uint8_t _ourHandle = 0; +static char *_logBuffer = NULL; +static uint16_t _logBufferSize = 0; +static logCallback _logCallback = NULL; + +void logCallbackSet(logCallback callback) { + _logCallback = csallback; +} + + +void logClose(void) { + if (_log && _ourHandle) { + fclose(_log); + _ourHandle = 0; + } + DEL(_logBuffer); +} uint8_t logOpen(char *filename, uint8_t append) { _log = fopen(filename, append ? "a" : "w"); if (_log) { - return 1; _ourHandle = 1; + return 1; } return 0; } @@ -40,34 +56,42 @@ void logOpenByHandle(FILE *handle) { } -void logClose(void) { - if (_log && _ourHandle) { - fclose(_log); - _ourHandle = 0; - } -} - - void logWrite(char *format, ...) { - va_list args; - - va_start(args, format); - -#ifdef __linux__ - // Also output to stdout on Linux. - va_list args2; - va_copy(args2, args); - vfprintf(stdout, format, args2); - fflush(stdout); - va_end(args2); -#endif + va_list args = { 0 }; + va_list args2 = { 0 }; + uint16_t length = 0; if (_log) { - vfprintf(_log, format, args); - fflush(_log); - } + va_start(args, format); + va_copy(args2, args); - va_end(args); + // Attempt to write into current log buffer. + length = vsnprintf(_logBuffer, _logBufferSize, format, args); + + // Did it fit? + if (length >= _logBufferSize) { + // Nope. Resize buffer to fit plus a bit more. + if (_logBuffer) free(_logBuffer); + _logBufferSize = length + 32; + _logBuffer = (char *)malloc(_logBufferSize); + // Do it again. + vsnprintf(_logBuffer, _logBufferSize, format, args2); + } + +#ifdef __linux__ + // Also output to stdout on Linux. + fprintf(stdout, "%s", _logBuffer); + fflush(stdout); +#endif + + if (_logCallback) _logCallback(_logBuffer); + + fprintf(_log, "%s", _logBuffer); + fflush(_log); + + va_end(args2); + va_end(args); + } } diff --git a/shared/log.h b/shared/log.h index 378eefa..07a3674 100644 --- a/shared/log.h +++ b/shared/log.h @@ -25,9 +25,13 @@ #include "os.h" +typedef void (*logCallback)(char *message); + + +void logCallbackSet(logCallback callback); +void logClose(void); uint8_t logOpen(char *filename, uint8_t append); void logOpenByHandle(FILE *handle); -void logClose(void); void logWrite(char *format, ...); void logWriteToFileOnly(char *format, ...);