mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-01-21 04:18:08 -05:00
Cleanup and refactor for eink code. Changed turning on/off procedure. Add error handling.
130 lines
3.8 KiB
C++
130 lines
3.8 KiB
C++
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
|
|
#include <memory>
|
|
|
|
#include "LinuxEinkDisplay.hpp"
|
|
#include "ED028TC1.h"
|
|
|
|
namespace hal::eink
|
|
{
|
|
EinkStatus translateStatus(const EinkStatus_e status_e)
|
|
{
|
|
switch (status_e) {
|
|
case EinkOK:
|
|
return EinkStatus::EinkOK;
|
|
case EinkError:
|
|
return EinkStatus::EinkError;
|
|
case EinkSPIErr:
|
|
return EinkStatus::EinkSPIErr;
|
|
case EinkSPINotInitializedErr:
|
|
return EinkStatus::EinkSPINotInitializedErr;
|
|
case EinkDMAErr:
|
|
return EinkStatus::EinkDMAErr;
|
|
case EinkInitErr:
|
|
return EinkStatus::EinkInitErr;
|
|
case EinkTimeout:
|
|
return EinkStatus::EinkTimeout;
|
|
case EinkNoMem:
|
|
return EinkStatus::EinkNoMem;
|
|
case EinkWaveformsFileOpenFail:
|
|
return EinkStatus::EinkWaveformsFileOpenFail;
|
|
default:
|
|
return EinkStatus::EinkUnknown;
|
|
}
|
|
}
|
|
|
|
LinuxEinkDisplay::LinuxEinkDisplay(FrameSize size) : size{size}
|
|
{}
|
|
|
|
void LinuxEinkDisplay::setMode(const EinkDisplayColorMode mode) noexcept
|
|
{
|
|
displayColorMode = mode;
|
|
}
|
|
|
|
EinkDisplayColorMode LinuxEinkDisplay::getMode() const noexcept
|
|
{
|
|
return displayColorMode;
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::showImageUpdate(const std::vector<EinkFrame> &updateFrames,
|
|
const std::uint8_t *frameBuffer)
|
|
{
|
|
for (const EinkFrame &frame : updateFrames) {
|
|
const std::uint8_t *buffer = frameBuffer + frame.pos_y * frame.size.width;
|
|
const auto status = translateStatus(
|
|
EinkUpdateFrame({frame.pos_x, frame.pos_y, frame.size.width, frame.size.height}, buffer));
|
|
if (status != EinkStatus::EinkOK) {
|
|
return status;
|
|
}
|
|
}
|
|
return EinkStatus::EinkOK;
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::showImageRefresh(const EinkFrame &refreshFrame, const EinkRefreshMode refreshMode)
|
|
{
|
|
return EinkStatus::EinkOK;
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::showImage(const std::vector<EinkFrame> &updateFrames,
|
|
const EinkFrame &refreshFrame,
|
|
const std::uint8_t *frameBuffer,
|
|
const EinkRefreshMode refreshMode)
|
|
{
|
|
return showImageUpdate(updateFrames, frameBuffer);
|
|
}
|
|
|
|
void LinuxEinkDisplay::prepareEarlyRequest([[maybe_unused]] const EinkRefreshMode refreshMode,
|
|
[[maybe_unused]] const WaveformTemperature behaviour)
|
|
{}
|
|
|
|
EinkStatus LinuxEinkDisplay::dither()
|
|
{
|
|
return EinkStatus::EinkOK;
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::powerOn()
|
|
{
|
|
EinkPowerOn();
|
|
return EinkStatus::EinkOK;
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::powerOff()
|
|
{
|
|
EinkPowerOff();
|
|
return EinkStatus::EinkOK;
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::shutdown()
|
|
{
|
|
return EinkStatus::EinkOK;
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::wipeOut()
|
|
{
|
|
return translateStatus(EinkFillScreenWithColor(EinkDisplayColorFilling_e::EinkDisplayColorWhite));
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::resetAndInit()
|
|
{
|
|
EinkResetAndInitialize();
|
|
return EinkStatus::EinkOK;
|
|
}
|
|
|
|
EinkStatus LinuxEinkDisplay::reinitAndPowerOn()
|
|
{
|
|
resetAndInit();
|
|
return EinkStatus::EinkOK;
|
|
}
|
|
|
|
[[nodiscard]] auto LinuxEinkDisplay::getDevice() const noexcept -> std::shared_ptr<devices::Device>
|
|
{
|
|
return {};
|
|
}
|
|
|
|
std::unique_ptr<AbstractEinkDisplay> AbstractEinkDisplay::Factory::create(FrameSize size)
|
|
{
|
|
return std::make_unique<LinuxEinkDisplay>(size);
|
|
}
|
|
} // namespace hal::eink
|