Added ability to intercept log data for future GUI live log viewer.
This commit is contained in:
parent
8d5d5add73
commit
f445a6ef57
3 changed files with 58 additions and 30 deletions
|
@ -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();
|
||||
|
|
60
shared/log.c
60
shared/log.c
|
@ -23,13 +23,29 @@
|
|||
|
||||
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_list args = { 0 };
|
||||
va_list args2 = { 0 };
|
||||
uint16_t length = 0;
|
||||
|
||||
if (_log) {
|
||||
va_start(args, format);
|
||||
va_copy(args2, 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.
|
||||
va_list args2;
|
||||
va_copy(args2, args);
|
||||
vfprintf(stdout, format, args2);
|
||||
fprintf(stdout, "%s", _logBuffer);
|
||||
fflush(stdout);
|
||||
va_end(args2);
|
||||
#endif
|
||||
|
||||
if (_log) {
|
||||
vfprintf(_log, format, args);
|
||||
fflush(_log);
|
||||
}
|
||||
if (_logCallback) _logCallback(_logBuffer);
|
||||
|
||||
fprintf(_log, "%s", _logBuffer);
|
||||
fflush(_log);
|
||||
|
||||
va_end(args2);
|
||||
va_end(args);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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, ...);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue