#pragma once namespace uart { enum class Mode { ASYNCHRONOUS, ASYNCHRONOUS_2X, SYNCHRONOUS_MASTER, SYNCHRONOUS_SLAVE, SPI, }; enum class DataBits { FIVE, SIX, SEVEN, EIGHT, NINE, }; enum class StopBits { ONE, TWO, }; enum class Parity { NONE, ODD, EVEN, }; namespace detail { template struct choose_data_size { using type = uint8_t; }; template <> struct choose_data_size { using type = uint16_t; }; } // namespace detail template class settings { public: static constexpr auto BAUD_RATE = baudRate; static constexpr auto DATA_BITS = dataBits; static constexpr auto PARITY = parity; static constexpr auto STOP_BITS = stopBits; using data_t = typename detail::choose_data_size::type; }; } // namespace uart