System info & network
This commit is contained in:
73
code/debug/log_viewer.cpp
Normal file
73
code/debug/log_viewer.cpp
Normal file
@@ -0,0 +1,73 @@
|
||||
#include "log_viewer.h"
|
||||
|
||||
#include "../lib/math.h"
|
||||
#include <stdio.h>
|
||||
#include "../gui/gui.h"
|
||||
|
||||
LogViewer LogViewer::Init(Logger *logger)
|
||||
{
|
||||
LogViewer viewer;
|
||||
viewer.logger = logger;
|
||||
return viewer;
|
||||
}
|
||||
|
||||
void LogViewer::Print_New_Messages_On_Console()
|
||||
{
|
||||
u64 message_count = Logger_MessageCount(logger);
|
||||
if(message_count <= 0)
|
||||
return;
|
||||
|
||||
u64 last_message_index = message_count - 1;
|
||||
LogEntry *last_message = Logger_MessageAt(logger, last_message_index);
|
||||
u64 id_diff = last_message->id - next_id_to_print_on_console;
|
||||
u64 index_start = (last_message_index > id_diff) ? (last_message_index - id_diff) : 0;
|
||||
|
||||
u64 max_id = next_id_to_print_on_console;
|
||||
for(int i = index_start; i < message_count; i++)
|
||||
{
|
||||
LogEntry *entry = Logger_MessageAt(logger, i);
|
||||
if(entry->id >= next_id_to_print_on_console)
|
||||
{
|
||||
// printf("%lu ", entry->id);
|
||||
// if (entry->level >= LOG_DEBUG) printf("DEBUG");
|
||||
// else if(entry->level >= LOG_INFO) printf("INFO");
|
||||
// else if(entry->level >= LOG_WARNING) printf("WARNING");
|
||||
// else if(entry->level >= LOG_ERROR) printf("ERROR");
|
||||
// printf(": ");
|
||||
fprintf((entry->level < LOG_INFO ? stderr : stdout), "%s\n", entry->message);
|
||||
|
||||
max_id = maximum(max_id, entry->id + 1);
|
||||
}
|
||||
}
|
||||
next_id_to_print_on_console = max_id;
|
||||
}
|
||||
|
||||
void LogViewer::Draw_New_Messages_On_GUI()
|
||||
{
|
||||
u64 messages_to_draw = 5;
|
||||
|
||||
u64 message_count = Logger_MessageCount(logger);
|
||||
if(message_count <= 0)
|
||||
return;
|
||||
|
||||
Rect r = { .position = {0, (f32)global_gui_state.default_context.height}, .size = {0,0} };
|
||||
messages_to_draw = minimum(messages_to_draw, message_count);
|
||||
for(u64 i = 0; i < messages_to_draw; i++)
|
||||
{
|
||||
u64 index = message_count - 1 - i;
|
||||
LogEntry *entry = Logger_MessageAt(logger, index);
|
||||
char id_string[24]; sprintf(id_string, "%lu: ", entry->id);
|
||||
|
||||
v2 id_size = gui_text_compute_size(id_string);
|
||||
v2 message_size = gui_text_compute_size(entry->message);
|
||||
|
||||
r.position.y -= maximum(id_size.y, message_size.y);
|
||||
r.position.x = 0;
|
||||
r.size = id_size;
|
||||
gui_text(r, id_string);
|
||||
|
||||
r.position.x += id_size.x;
|
||||
r.size = message_size;
|
||||
gui_text(r, entry->message);
|
||||
}
|
||||
}
|
||||
20
code/debug/log_viewer.h
Normal file
20
code/debug/log_viewer.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#ifndef _PIUMA_LOG_VIEWER_H_
|
||||
#define _PIUMA_LOG_VIEWER_H_
|
||||
|
||||
#include "logger.h"
|
||||
|
||||
struct LogViewer
|
||||
{
|
||||
Logger *logger = NULL;
|
||||
|
||||
LogId next_id_to_print_on_console = 0;
|
||||
|
||||
|
||||
|
||||
static LogViewer Init(Logger *logger);
|
||||
|
||||
void Print_New_Messages_On_Console();
|
||||
void Draw_New_Messages_On_GUI();
|
||||
};
|
||||
|
||||
#endif
|
||||
94
code/debug/logger.cpp
Normal file
94
code/debug/logger.cpp
Normal file
@@ -0,0 +1,94 @@
|
||||
#include "logger.h"
|
||||
#include "../platform.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
struct Logger global_logger;
|
||||
|
||||
void Logger_Init(struct Logger *logger)
|
||||
{
|
||||
assert(logger != NULL);
|
||||
|
||||
u32 initial_capacity = 512;
|
||||
|
||||
logger->message_queue = Queue_Alloc(p_alloc, struct LogEntry, initial_capacity);
|
||||
}
|
||||
|
||||
void Logger_Deinit(struct Logger *logger)
|
||||
{
|
||||
assert(logger != NULL);
|
||||
|
||||
Logger_Clear(logger);
|
||||
Queue_Free(p_free, logger->message_queue);
|
||||
}
|
||||
|
||||
void Logger_Clear(struct Logger *logger)
|
||||
{
|
||||
assert(logger != NULL);
|
||||
|
||||
while(Queue_Size(logger->message_queue) > 0)
|
||||
{
|
||||
Logger_RemoveOldestMessage(logger);
|
||||
}
|
||||
}
|
||||
|
||||
void Logger_AddMessage(struct Logger *logger, LogSourceInfo source_info, LogLevel level, const char *format_message, ...)
|
||||
{
|
||||
assert(logger != NULL);
|
||||
|
||||
// Build formatted message
|
||||
char *message;
|
||||
va_list var_args;
|
||||
va_start(var_args, format_message);
|
||||
int bytes_size = vsnprintf(NULL, 0, format_message, var_args) + 1;
|
||||
va_end(var_args);
|
||||
message = (char *) p_alloc(bytes_size * sizeof(char));
|
||||
va_start(var_args, format_message);
|
||||
int written = vsnprintf(message, bytes_size, format_message, var_args) + 1;
|
||||
va_end(var_args);
|
||||
|
||||
// Add log entry to queue, checking if we have enough space
|
||||
struct LogEntry entry = {
|
||||
.level = level,
|
||||
.message = message,
|
||||
.id = logger->last_id++,
|
||||
.source = source_info
|
||||
};
|
||||
|
||||
// fprintf(stderr, message);
|
||||
// fprintf(stderr, "\n");
|
||||
|
||||
if(Queue_Size(logger->message_queue) >= QUEUE_HEADER_PTR(logger->message_queue)->capacity)
|
||||
{
|
||||
logger->overflow_count++;
|
||||
Logger_RemoveOldestMessage(logger);
|
||||
}
|
||||
Queue_Push(logger->message_queue, entry);
|
||||
}
|
||||
|
||||
void Logger_RemoveOldestMessage(struct Logger *logger)
|
||||
{
|
||||
assert(logger != NULL);
|
||||
assert(Queue_Size(logger->message_queue) > 0);
|
||||
|
||||
struct LogEntry entry = Queue_Pop(logger->message_queue);
|
||||
p_free(entry.message);
|
||||
}
|
||||
|
||||
|
||||
u64 Logger_MessageCount(struct Logger *logger)
|
||||
{
|
||||
assert(logger != NULL);
|
||||
|
||||
return Queue_Size(logger->message_queue);
|
||||
}
|
||||
|
||||
struct LogEntry *Logger_MessageAt(struct Logger *logger, u64 index)
|
||||
{
|
||||
assert(logger != NULL);
|
||||
assert(Queue_Size(logger->message_queue) > index);
|
||||
|
||||
return &Queue_At(logger->message_queue, index);
|
||||
}
|
||||
59
code/debug/logger.h
Normal file
59
code/debug/logger.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#ifndef _PIUMA_LOGGER_H_
|
||||
#define _PIUMA_LOGGER_H_
|
||||
|
||||
#include "../lib/types.h"
|
||||
#include "../lib/queue.h"
|
||||
|
||||
|
||||
typedef u8 LogLevel;
|
||||
#define LOG_ERROR 0
|
||||
#define LOG_WARNING 50
|
||||
#define LOG_INFO 100
|
||||
#define LOG_DEBUG 150
|
||||
|
||||
struct LogSourceInfo
|
||||
{
|
||||
const char *filename;
|
||||
u32 line;
|
||||
const char *function;
|
||||
};
|
||||
|
||||
typedef u64 LogId;
|
||||
struct LogEntry
|
||||
{
|
||||
LogLevel level;
|
||||
char *message;
|
||||
|
||||
LogId id;
|
||||
LogSourceInfo source;
|
||||
};
|
||||
|
||||
struct Logger
|
||||
{
|
||||
QUEUE_TYPE(struct LogEntry) message_queue = NULL;
|
||||
|
||||
LogId last_id = 0;
|
||||
u64 overflow_count = 0; // Number of times the buffer was full, but we added a message anyway removing the oldest one
|
||||
};
|
||||
|
||||
void Logger_Init(struct Logger *logger);
|
||||
void Logger_Deinit(struct Logger *logger);
|
||||
|
||||
void Logger_Clear(struct Logger *logger);
|
||||
void Logger_AddMessage(struct Logger *logger, LogSourceInfo source_info, LogLevel level, const char *format_message, ...);
|
||||
void Logger_RemoveOldestMessage(struct Logger *logger);
|
||||
|
||||
u64 Logger_MessageCount(struct Logger *logger);
|
||||
struct LogEntry *Logger_MessageAt(struct Logger *logger, u64 index);
|
||||
|
||||
|
||||
extern struct Logger global_logger;
|
||||
|
||||
|
||||
#define LOG_INIT() Logger_Init(&global_logger)
|
||||
#define LOG_DEINIT() Logger_Deinit(&global_logger)
|
||||
#define LOG_CLEAR() Logger_Clear(&global_logger)
|
||||
#define LOG(level, /*format_message,*/ ...) Logger_AddMessage(&global_logger, LogSourceInfo{.filename = __FILE__, .line = __LINE__, .function = __func__}, level, /*format_message,*/ __VA_ARGS__)
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user