Added ability to intercept log data for future GUI live log viewer.

This commit is contained in:
Scott Duensing 2021-12-08 20:15:37 -06:00
parent 8d5d5add73
commit f445a6ef57
3 changed files with 58 additions and 30 deletions

View file

@ -251,8 +251,8 @@ int main(int argc, char *argv[]) {
__packetThreadData = packetThreadDataCreate(NULL); __packetThreadData = packetThreadDataCreate(NULL);
packetSenderRegister(comPacketSender); packetSenderRegister(comPacketSender);
taskCreate(taskComDebugLoop, NULL); //taskCreate(taskComDebugLoop, NULL);
//taskCreate(taskWelcome, NULL); taskCreate(taskWelcome, NULL);
taskCreate(taskGuiEventLoop, NULL); taskCreate(taskGuiEventLoop, NULL);
taskRun(); taskRun();

View file

@ -21,15 +21,31 @@
#include "log.h" #include "log.h"
static FILE *_log = NULL; static FILE *_log = NULL;
static uint8_t _ourHandle = 0; 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) { uint8_t logOpen(char *filename, uint8_t append) {
_log = fopen(filename, append ? "a" : "w"); _log = fopen(filename, append ? "a" : "w");
if (_log) { if (_log) {
return 1;
_ourHandle = 1; _ourHandle = 1;
return 1;
} }
return 0; return 0;
} }
@ -40,34 +56,42 @@ void logOpenByHandle(FILE *handle) {
} }
void logClose(void) {
if (_log && _ourHandle) {
fclose(_log);
_ourHandle = 0;
}
}
void logWrite(char *format, ...) { void logWrite(char *format, ...) {
va_list args; va_list args = { 0 };
va_list args2 = { 0 };
va_start(args, format); uint16_t length = 0;
#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
if (_log) { if (_log) {
vfprintf(_log, format, args); va_start(args, format);
fflush(_log); 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);
}
} }

View file

@ -25,9 +25,13 @@
#include "os.h" #include "os.h"
typedef void (*logCallback)(char *message);
void logCallbackSet(logCallback callback);
void logClose(void);
uint8_t logOpen(char *filename, uint8_t append); uint8_t logOpen(char *filename, uint8_t append);
void logOpenByHandle(FILE *handle); void logOpenByHandle(FILE *handle);
void logClose(void);
void logWrite(char *format, ...); void logWrite(char *format, ...);
void logWriteToFileOnly(char *format, ...); void logWriteToFileOnly(char *format, ...);