/* * utility_asyncaurtlogger.hpp * * Created on: Mar 20, 2021 * Author: erki */ #ifndef SKULLC_UTILITY_ASYNCAURTLOGGER_HPP_ #define SKULLC_UTILITY_ASYNCAURTLOGGER_HPP_ #include "utility_ilogger.hpp" #include "utility_ringbuffer.hpp" #include "usart.h" namespace Utility { class AsyncUARTLogger : public ILogger { public: explicit AsyncUARTLogger(UART_HandleTypeDef* huart); AsyncUARTLogger() = delete; AsyncUARTLogger(const AsyncUARTLogger&) = delete; AsyncUARTLogger(AsyncUARTLogger&&) = delete; void log(const char* format, ...); private: struct _Data { std::array buffer; std::int32_t length; }; Ringbuffer<_Data, 10> _buffer_queue; UART_HandleTypeDef* _huart; bool _in_flight = false; static AsyncUARTLogger* _this; static void _txCompleteCallback(UART_HandleTypeDef* huart); void _sendNextLog(); }; } #endif /* SKULLC_UTILITY_ASYNCAURTLOGGER_HPP_ */