esp-vfd-clock/firmware/main/vfd_driver.hpp

62 lines
1.3 KiB
C++

//
// Created by erki on 17/02/24.
//
#pragma once
#include <peripherals_hal_esp.hpp>
#include <array>
#include <optional>
#include "etl/string.h"
#include <driver/spi_master.h>
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<gpio_num_t> 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<char, DISPLAY_LEN> display_data_;
std::array<std::uint8_t, DISPLAY_BUFFER_LEN> buffer_data_;
std::size_t display_index_ = 0;
void spiWrite_(std::uint32_t raw);
void spiWriteNonBlocking_(std::uint32_t raw);
std::uint32_t getRawCharAndAdvance_();
};