You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

64 lines
1.9 KiB

/*
* LogCommand.cpp
*
* Created on: Jul 8, 2021
* Author: Andreas Berthoud
*/
#include <stdarg.h>
#include <string.h>
#include <string>
#include <algorithm>
#include "LogCommand.hpp"
void log_debug(const char * logger_name, const char * format, int nargs, ...) {
va_list args;
va_start(args, nargs);
push_command(new LogCommand(logger_name, format, args, LOG_LEVEL_DEBUG));
va_end(args);
}
void log_info(const char * logger_name, const char * format, int nargs, ...) {
va_list args;
va_start(args, nargs);
push_command(new LogCommand(logger_name, format, args, LOG_LEVEL_INFO));
va_end(args);
}
void log_warning(const char * logger_name, const char * format, int nargs, ...) {
va_list args;
va_start(args, nargs);
push_command(new LogCommand(logger_name, format, args, LOG_LEVEL_WARNING));
va_end(args);
}
void log_error(const char * logger_name, const char * format, int nargs, ...) {
va_list args;
va_start(args, nargs);
push_command(new LogCommand(logger_name, format, args, LOG_LEVEL_ERROR));
va_end(args);
}
LogCommand::LogCommand(
const char * logger_name,
const char * format,
va_list args,
LoggingLevel logging_level) : Notification(com_channel_type_usb) /* send it always over USB */ {
uint16_t max_payload_size = NOTIFICATION_COMMAND_FREE_BUFFER - this->get_payload_size();
uint8_t logger_name_length = std::min(30, (int)strlen(logger_name));
this->payload_ptr[0] = logging_level;
this->payload_ptr[1] = logger_name_length;
char * name = (char *)(this->payload_ptr + 2);
char * message = (char *)(this->payload_ptr + 2 + logger_name_length);
uint16_t message_length = max_payload_size - 2 - logger_name_length;
memcpy(name, logger_name, logger_name_length);
vsnprintf(message, message_length, format, args);
this->add_to_payload_size(strlen(message) + 2 + logger_name_length);
}