62 lines
1.3 KiB
C++
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_();
|
|
};
|