f4ll/inc/f4ll/console_handler.h
2025-06-29 21:54:20 +02:00

84 lines
2.5 KiB
C++

/*
* ll_consolehandler.h
*
* Created on: Nov 7, 2019
* Author: abody
*/
#pragma once
#include <f4ll/initialized_singleton.h>
#include <f4ll/output_stream.h>
#include <f4ll/ringbuffer.h>
#include <f4ll/usart_core.h>
#include <platform/dma_ll.h>
namespace f4ll {
class console_handler : public initialized_singleton<console_handler>, public usart_core, public ioutput_stream
{
friend class initialized_singleton<console_handler>;
public:
using size_type = iringbuffer::size_type;
class iconsole_input
{
public:
virtual void input_available(size_type len) = 0;
};
void print(char const *s);
void flush();
size_type append(char const *s);
iringbuffer &get_rx_buffer() { return m_rx_buffer; }
private:
console_handler(
USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t stream_rx, uint32_t stream_tx, uint8_t *rx_buffer, size_type x_buffer_size,
uint8_t *tx_buffer, size_type tx_buffer_size, iconsole_input *rx_callback);
void setup_receive(void);
// usart_core pure virtual function implementations
void receiver_idle(void) override;
void transmission_complete(void) override;
void framing_error(void) override;
void overrun(void) override;
void rx_dma_transfer_complete(void) override;
void rx_dma_half_transfer(void) override;
void rx_dma_error(dma_helper::dma_error_type reason) override;
void tx_dma_transfer_complete(void) override;
void tx_dma_half_transfer(void) override;
void tx_dma_error(dma_helper::dma_error_type reason) override;
// ioutput_stream interface implementations
ioutput_stream &operator<<(ioutput_stream::format fmt) override;
ioutput_stream &operator<<(char const *str) override;
ioutput_stream &operator<<(char chr) override;
ioutput_stream &operator<<(uint8_t byte) override;
ioutput_stream &operator<<(uint16_t ui16) override;
ioutput_stream &operator<<(int16_t i16) override;
ioutput_stream &operator<<(uint32_t ui32) override;
ioutput_stream &operator<<(int32_t i32) override;
// iotput_stream-related member variables
ioutput_stream::format m_fmt = ioutput_stream::format::dec;
// iotput_stream-related helper functions
template <typename T> void print_unsigned(T input);
template <typename T> void print_signed(T input);
//
ringbuffer_ext m_tx_buffer;
size_type m_bytes_sent = 0;
ringbuffer_ext m_rx_buffer;
size_type m_bytes_requested = 0;
size_type m_reqd_bytes_registered = 0;
iconsole_input *m_rx_callback;
};
} /* namespace f4ll */