Allow image and LUT to be located either in ram or flash

This commit is contained in:
BlackMark 2022-06-03 16:55:01 +02:00
parent 8d8369440c
commit 3d45d2a4b3

View File

@ -157,9 +157,11 @@ class Eink {
}
constexpr auto sendImageChannel = [](const auto command, const auto &image) {
using image_t = std::remove_cvref_t<decltype(image)>;
sendCommand(command);
for (auto j = std::size_t{0}; j < image.size(); ++j) {
const auto [count, data] = flash::load(image[j]);
for (auto j = std::size_t{0}; j < std::tuple_size_v<image_t>; ++j) {
const auto [count, data] = flash::loadLike<RleImage>(image[j]);
for (auto i = std::uint16_t{0}; i < count; ++i) {
if (command == Cmd::WRITE_RAM_BLACK) {
sendData(data);
@ -170,8 +172,8 @@ class Eink {
}
};
sendImageChannel(Cmd::WRITE_RAM_BLACK, std::get<0>(rleImage));
sendImageChannel(Cmd::WRITE_RAM_RED, std::get<1>(rleImage));
sendImageChannel(Cmd::WRITE_RAM_BLACK, std::get<0>(rleImage.value));
sendImageChannel(Cmd::WRITE_RAM_RED, std::get<1>(rleImage.value));
sendCommand(Cmd::DISPLAY_UPDATE_CONTROL_2);
sendData(USE_ORIGINAL_LUT ? 0xF7 : 0xC7);
@ -210,13 +212,15 @@ class Eink {
waitUntilIdle();
}
static void writeLut(const Waveform &lut)
template <typename Lut>
static void writeLut(const Lut &lut)
{
const auto flashLutPtr = reinterpret_cast<const std::byte *>(&lut);
static_assert(sizeof(lut) == sizeof(Waveform), "Invalid LUT size");
sendCommand(Cmd::WRITE_LUT);
for (auto i = std::size_t{0}; i < sizeof(lut); ++i) {
const auto lutByte = flash::load(flashLutPtr[i]);
const auto lutByte = lut[i];
static_assert(std::is_same_v<std::byte, std::remove_cvref_t<decltype(lutByte)>>, "Invalid LUT value type");
sendData(static_cast<word_t>(lutByte));
}
}