/* * LogCommand.cpp * * Created on: Jul 8, 2021 * Author: Andreas Berthoud */ #include #include #include #include "usbd_cdc_if.h" #include "LogCommand.hpp" void log_debug(const char * format, int nargs, ...) { va_list args; va_start(args, nargs); push_command(new LogCommand(format, args, LOG_LEVEL_DEBUG)); va_end(args); } void log_info(const char * format, int nargs, ...) { va_list args; va_start(args, nargs); push_command(new LogCommand(format, args, LOG_LEVEL_INFO)); va_end(args); } void log_warning(const char * format, int nargs, ...) { va_list args; va_start(args, nargs); push_command(new LogCommand(format, args, LOG_LEVEL_WARNING)); va_end(args); } void log_error(const char * format, int nargs, ...) { va_list args; va_start(args, nargs); push_command(new LogCommand(format, args, LOG_LEVEL_ERROR)); va_end(args); } LogCommand::LogCommand(const char * format, va_list args, LoggingLevel logging_level) : Command(COMMAND_LOG) { *this->payload_ptr = logging_level; vsnprintf((char *)this->payload_ptr + 1, this->max_payload_length - 1, format, args); this->set_payload_length(strlen((char *)this->payload_ptr) + 1); // strlen + log level } bool LogCommand::execute() { uint16_t size = this->get_payload_length() + 5; // number of bytes to be sent over USB this->data[size-1] = 0xff; // set stop byte uint8_t result = CDC_Transmit_FS(this->data, size); return result == USBD_OK || result == USBD_BUSY; }