M module-services/service-eink/EinkDisplay.cpp => module-services/service-eink/EinkDisplay.cpp +5 -0
@@ 232,6 232,11 @@ namespace service::eink
displayMode = mode;
}
+ std::int32_t EinkDisplay::getLastTemperature() const noexcept
+ {
+ return currentWaveform.temperature;
+ }
+
::gui::Size EinkDisplay::getSize() const noexcept
{
return size;
M module-services/service-eink/EinkDisplay.hpp => module-services/service-eink/EinkDisplay.hpp +1 -0
@@ 35,6 35,7 @@ namespace service::eink
bool setWaveform(EinkWaveforms_e mode, std::int32_t temperature);
void setMode(EinkDisplayColorMode_e mode) noexcept;
+ std::int32_t getLastTemperature() const noexcept;
::gui::Size getSize() const noexcept;
private:
M module-services/service-eink/ServiceEink.cpp => module-services/service-eink/ServiceEink.cpp +6 -5
@@ 1,4 1,4 @@
-// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "ServiceEink.hpp"
@@ 121,7 121,7 @@ namespace service::eink
void ServiceEink::updateDisplay(std::uint8_t *frameBuffer, ::gui::RefreshModes refreshMode)
{
- prepareDisplay(refreshMode);
+ prepareDisplay(refreshMode, WaveformTemperature::KEEP_CURRENT);
if (const auto status = display.update(frameBuffer); status != EinkOK) {
LOG_FATAL("Failed to update frame");
@@ 135,11 135,12 @@ namespace service::eink
}
}
- void ServiceEink::prepareDisplay(::gui::RefreshModes refreshMode)
+ void ServiceEink::prepareDisplay(::gui::RefreshModes refreshMode, WaveformTemperature behaviour)
{
display.powerOn();
- const auto temperature = EinkGetTemperatureInternal();
+ const auto temperature = behaviour == WaveformTemperature::KEEP_CURRENT ? display.getLastTemperature()
+ : EinkGetTemperatureInternal();
if (refreshMode == ::gui::RefreshModes::GUI_REFRESH_DEEP) {
display.setWaveform(EinkWaveforms_e::EinkWaveformGC16, temperature);
display.dither();
@@ 152,7 153,7 @@ namespace service::eink
sys::MessagePointer ServiceEink::handlePrepareEarlyRequest(sys::Message *message)
{
const auto waveformUpdateMsg = static_cast<service::eink::PrepareDisplayEarlyRequest *>(message);
- prepareDisplay(waveformUpdateMsg->getRefreshMode());
+ prepareDisplay(waveformUpdateMsg->getRefreshMode(), WaveformTemperature::MEASURE_NEW);
return sys::MessageNone{};
}
M module-services/service-eink/ServiceEink.hpp => module-services/service-eink/ServiceEink.hpp +9 -1
@@ 31,13 31,21 @@ namespace service::eink
Running,
Suspended
};
+
+ /// It takes 25ms to get a new measurement
+ enum class WaveformTemperature
+ {
+ KEEP_CURRENT,
+ MEASURE_NEW,
+ };
+
void setState(State state) noexcept;
bool isInState(State state) const noexcept;
void enterActiveMode();
void suspend();
void updateDisplay(std::uint8_t *frameBuffer, ::gui::RefreshModes refreshMode);
- void prepareDisplay(::gui::RefreshModes refreshMode);
+ void prepareDisplay(::gui::RefreshModes refreshMode, WaveformTemperature behaviour);
sys::MessagePointer handleEinkModeChangedMessage(sys::Message *message);
sys::MessagePointer handleImageMessage(sys::Message *message);