Implement uploading custom waveform lut
This commit is contained in:
parent
6218cdfc51
commit
8d8369440c
28
eink.hpp
28
eink.hpp
@ -21,6 +21,9 @@ template <std::uint16_t Width, std::uint16_t Height, typename Spi, io::P RstPin,
|
||||
class Eink {
|
||||
using word_t = typename Spi::word_t;
|
||||
|
||||
struct original_lut_tag {
|
||||
};
|
||||
|
||||
static io::Pin<RstPin> m_rst;
|
||||
static io::Pin<BusyPin> m_busy;
|
||||
|
||||
@ -37,6 +40,7 @@ class Eink {
|
||||
WRITE_RAM_RED = 0x26,
|
||||
READ_RAM = 0x27,
|
||||
LOAD_OTP_TO_RAM = 0x31,
|
||||
WRITE_LUT = 0x32,
|
||||
BORDER_WAVEFORM_CONTROL = 0x3C,
|
||||
READ_RAM_CHANNEL = 0x41,
|
||||
SET_RAM_X_ADDR_POSITIONS = 0x44,
|
||||
@ -141,6 +145,17 @@ class Eink {
|
||||
template <typename RleImage>
|
||||
static void draw(const RleImage &rleImage)
|
||||
{
|
||||
draw(rleImage, original_lut_tag{});
|
||||
}
|
||||
|
||||
template <typename RleImage, typename Lut = original_lut_tag>
|
||||
static void draw(const RleImage &rleImage, const Lut &lut)
|
||||
{
|
||||
constexpr auto USE_ORIGINAL_LUT = std::is_same_v<Lut, original_lut_tag>;
|
||||
if constexpr (!USE_ORIGINAL_LUT) {
|
||||
writeLut(lut);
|
||||
}
|
||||
|
||||
constexpr auto sendImageChannel = [](const auto command, const auto &image) {
|
||||
sendCommand(command);
|
||||
for (auto j = std::size_t{0}; j < image.size(); ++j) {
|
||||
@ -159,7 +174,7 @@ class Eink {
|
||||
sendImageChannel(Cmd::WRITE_RAM_RED, std::get<1>(rleImage));
|
||||
|
||||
sendCommand(Cmd::DISPLAY_UPDATE_CONTROL_2);
|
||||
sendData(0xF7);
|
||||
sendData(USE_ORIGINAL_LUT ? 0xF7 : 0xC7);
|
||||
sendCommand(Cmd::UPDATE_DISPLAY);
|
||||
waitUntilIdle();
|
||||
}
|
||||
@ -195,6 +210,17 @@ class Eink {
|
||||
waitUntilIdle();
|
||||
}
|
||||
|
||||
static void writeLut(const Waveform &lut)
|
||||
{
|
||||
const auto flashLutPtr = reinterpret_cast<const std::byte *>(&lut);
|
||||
|
||||
sendCommand(Cmd::WRITE_LUT);
|
||||
for (auto i = std::size_t{0}; i < sizeof(lut); ++i) {
|
||||
const auto lutByte = flash::load(flashLutPtr[i]);
|
||||
sendData(static_cast<word_t>(lutByte));
|
||||
}
|
||||
}
|
||||
|
||||
static void autoPatternFill()
|
||||
{
|
||||
constexpr auto RED_PATTERN_FILL_CMD = static_cast<Cmd>(0x46);
|
||||
|
Loading…
Reference in New Issue
Block a user