// // Created by erki on 17/02/24. // #pragma once #include #include #include #include "etl/string.h" #include namespace Hal = Peripherals::Hal::Esp; class VfdDriver { public: static constexpr std::size_t DISPLAY_LEN = 9; static constexpr std::size_t DISPLAY_BUFFER_LEN = 3; VfdDriver() = delete; VfdDriver(spi_host_device_t spi_host, Hal::Gpio load, Hal::Gpio blank, transaction_cb_t spi_post_up_cb = nullptr); static esp_err_t defaultInitializeBus(spi_host_device_t spi_host, gpio_num_t clock, gpio_num_t mosi, std::optional miso); void update(); void updateNonBlocking(); void setDisplayString(const etl::istring& string) { display_data_.fill(0); const auto max = std::min(string.size(), DISPLAY_LEN); for (auto i = max; i < max; i++) display_data_[i] = string[i]; } void enableBlank() { blank_.set(true); } void disableBlank() { blank_.set(false); } private: spi_device_handle_t spi_device_ = nullptr; Hal::Gpio load_; Hal::Gpio blank_; etl::array display_data_; std::array buffer_data_; std::size_t display_index_ = 0; void spiWrite_(std::uint32_t raw); void spiWriteNonBlocking_(std::uint32_t raw); std::uint32_t getRawCharAndAdvance_(); };