~aleteoryx/muditaos

4f9cd7a11fc2b352b8db038237c7b137fa8f9a25 — Mateusz Grzywacz 5 years ago 9e79202
[EGD-5394] Eink - reuse temperature for waveforms

Do not waste time right before refresh of the eink
display to measure new temperature. Assume that
the measurement from early frame prepare stage is valid.
It has only to be valid for only <time of rendering the frame>,
which is less than a 1000ms.
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);