Logger

From Embedded Workshop
Jump to navigation Jump to search
// Module: log.c
//
// logging library
// ANSI escape codes:
// gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include "log.h"
#include <unistd.h>

#ifndef u8
#define u8 uint8_t
#define s8 int8_t
#endif

// Define ANSI colors, to be used within printf() text
// The foreground colors 30 - 38, are the "normal" darker colors
// The foreground colors 90 - 98, are the "bright" lighter colors
// These #defines rely on string concatenation to function as desired
#define COLOR_YELLOW_ON_BLACK "\033[93m\033[40m"
#define COLOR_YELLOW_ON_BLUE  "\033[93m\033[44m"
#define COLOR_YELLOW_ON_GREEN "\033[93m\033[42m"
#define COLOR_YELLOW_ON_RED   "\033[93m\033[41m"
#define COLOR_YELLOW_ON_VIOLET "\033[93m\033[45m"
#define COLOR_WHITE
#define COLOR_RED
#define COLOR_GREEN  "\033[92m"   /* Bright Green text */
#define COLOR_VIOLET "\033[95m"   /* Bright Violet text */
#define COLOR_YELLOW "\033[93m"   /* Bright Yellow text */
#define COLOR_RESET  "\033[0m"    /* Reset text color to previous color */

#define TEXT_ADMIN "\e[31m"
#define TEXT_ORANGE "\e[38;5;202m"
#define TEXT_BROWN "\e[38;5;130m"
#define TEXT_YELLOW "\e[93m"
#define TEXT_PUKE "\e[33m"
#define TEXT_LIME "\e[92m"
#define TEXT_GREEN "\e[32m"`
#define TEXT_AQUA "\e[96m"

#define MAX_LOG_ITEM  150   // maximum number of bytes for a log (with length, time, level, and text
// Definition of a "log item":
typedef struct {
	u8 length;  // includes sizeof(time), sizeof(level), strlen(text)
	u8 time[4]; // 32 bits, stored in network byte order, MSB first (index 0)
	u8 level;
	char text[MAX_LOG_ITEM-6];  // log text
} log_item_t;

// Implementation rules / notes:
// 1) Use a "staging buffer" of some max length to write formatted text into
//    This buffer will NOT contain ANSI color escapes or line termination.
// 2) A small data structure is used on the front of the "log item" to
//    contain time stamp, log level, and string length.
//    u8 length - bytes following

uint32_t get_time(void)
{
	uint32_t milliseconds;
	struct timespec ts;
	if (clock_gettime(CLOCK_MONOTONIC_RAW /*CLOCK_MONOTONIC*/, &ts) == -1) {
		perror("clock_gettime");
       exit(EXIT_FAILURE);
  }
  milliseconds = (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000); // convert seconds into milliseconds & nanoseconds into milliseconds
  printf("%s: %u\n",__func__,milliseconds);
  return milliseconds;
}
          
int main(int argc, const char* argv[])
{
	get_time();
	printf(COLOR_VIOLET "COLOR_VIOLET" COLOR_RESET "\n");

	for(int ansi = 30; ansi<=37; ansi++)
		printf("\033[%dm Foreground Color: %d\033[0m\n",ansi,ansi);

	for(int ansi = 90; ansi<=97; ansi++)
		printf("\033[%dm Foreground Color: %d\033[0m\n",ansi,ansi);
	
	for(int ansi = 40; ansi<=47; ansi++)
		printf("\033[%dm Background Color: %d\033[0m\n",ansi,ansi);

	for(int ansi = 100; ansi<=107; ansi++)
		printf("\033[%dm Background Color: %d\033[0m\n",ansi,ansi);
		
	usleep(1000);
	get_time();	
	return 0;
}