~aleteoryx/muditaos

c057799904af66f397d28a2a2cd667b0b1c1c6e2 — Lefucjusz 2 years ago e6adfdb
[MOS-887] Fix black screen left after power off

Fix of the issue that after powering off
the phone with dark mode enabled the
screen remained black instead of being
cleared to white.
M module-bsp/board/linux/eink/LinuxEinkDisplay.cpp => module-bsp/board/linux/eink/LinuxEinkDisplay.cpp +8 -7
@@ 1,11 1,6 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <board.h>

#include <log/log.hpp>

#include <cstring>
#include <memory>

#include "LinuxEinkDisplay.hpp"


@@ 47,6 42,11 @@ namespace hal::eink
        displayColorMode = mode;
    }

    EinkDisplayColorMode LinuxEinkDisplay::getMode() const noexcept
    {
        return displayColorMode;
    }

    EinkStatus LinuxEinkDisplay::showImageUpdate(const std::vector<EinkFrame> &updateFrames,
                                                 const std::uint8_t *frameBuffer)
    {


@@ 54,8 54,9 @@ namespace hal::eink
            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)
            if (status != EinkStatus::EinkOK) {
                return status;
            }
        }
        return EinkStatus::EinkOK;
    }

M module-bsp/board/linux/eink/LinuxEinkDisplay.hpp => module-bsp/board/linux/eink/LinuxEinkDisplay.hpp +3 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 15,6 15,8 @@ namespace hal::eink

      private:
        void setMode(const EinkDisplayColorMode mode) noexcept override;
        EinkDisplayColorMode getMode() const noexcept override;

        EinkStatus showImageUpdate(const std::vector<EinkFrame> &updateFrames,
                                   const std::uint8_t *frameBuffer) override;
        EinkStatus showImageRefresh(const EinkFrame &refreshFrame, const EinkRefreshMode refreshMode) override;

M module-bsp/board/rt1051/bsp/eink/EinkDisplay.cpp => module-bsp/board/rt1051/bsp/eink/EinkDisplay.cpp +6 -4
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "EinkDisplay.hpp"


@@ 283,14 283,11 @@ namespace hal::eink

            switch (currentWaveform.mode) {
            case EinkWaveformA2:
                [[fallthrough]];
            case EinkWaveformDU2:
                temperatureFine = abs(newTemperature - currentWaveform.temperature) <= 3;
                break;
            case EinkWaveformINIT:
                [[fallthrough]];
            case EinkWaveformGLD16:
                [[fallthrough]];
            case EinkWaveformGC16:
                temperatureFine = abs(newTemperature - currentWaveform.temperature) <= 2;
                break;


@@ 365,6 362,11 @@ namespace hal::eink
        displayMode = mode;
    }

    EinkDisplayColorMode EinkDisplay::getMode() const noexcept
    {
        return displayMode;
    }

    std::int32_t EinkDisplay::getLastTemperature() const noexcept
    {
        return currentWaveform.temperature;

M module-bsp/board/rt1051/bsp/eink/EinkDisplay.hpp => module-bsp/board/rt1051/bsp/eink/EinkDisplay.hpp +3 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 26,6 26,8 @@ namespace hal::eink
        ~EinkDisplay() noexcept;

        void setMode(EinkDisplayColorMode mode) noexcept override;
        EinkDisplayColorMode getMode() const noexcept override;

        EinkStatus showImageUpdate(const std::vector<EinkFrame> &updateFrames,
                                   const std::uint8_t *frameBuffer) override;
        EinkStatus showImageRefresh(const EinkFrame &refreshFrame, const EinkRefreshMode refreshMode) override;

M module-bsp/hal/include/hal/eink/AbstractEinkDisplay.hpp => module-bsp/hal/include/hal/eink/AbstractEinkDisplay.hpp +2 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 69,6 69,7 @@ namespace hal::eink
        virtual ~AbstractEinkDisplay() = default;

        virtual void setMode(const EinkDisplayColorMode mode) noexcept                                        = 0;
        virtual EinkDisplayColorMode getMode() const noexcept                                                 = 0;
        virtual EinkStatus showImageUpdate(const std::vector<EinkFrame> &updateFrames,
                                           const std::uint8_t *frameBuffer)                                   = 0;
        virtual EinkStatus showImageRefresh(const EinkFrame &refreshFrame, const EinkRefreshMode refreshMode) = 0;

M module-services/service-eink/ServiceEink.cpp => module-services/service-eink/ServiceEink.cpp +19 -6
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <board.h>


@@ 6,7 6,6 @@
#include "internal/StaticData.hpp"
#include "messages/EinkModeMessage.hpp"
#include "messages/PrepareDisplayEarlyRequest.hpp"
#include <time/ScopedTime.hpp>
#include <Timers/TimerFactory.hpp>

#include <log/log.hpp>


@@ 22,8 21,6 @@
#include <gsl/util>
#include "Utils.hpp"

#include <service-gui/Common.hpp>

namespace service::eink
{
    namespace


@@ 119,16 116,32 @@ namespace service::eink

    sys::ReturnCodes ServiceEink::DeinitHandler()
    {
        // Eink must be turn on before wiping out the display
        // Eink must be turned on before wiping out the display
        display->powerOn();
        if (exitAction == ExitAction::WipeOut) {

        if ((exitAction == ExitAction::WipeOut) ||
            ((display->getMode() == hal::eink::EinkDisplayColorMode::EinkDisplayColorModeInverted) &&
             (systemCloseReason != sys::CloseReason::FactoryReset))) {
            LOG_INFO("Performing low-level display wipeout");
            display->wipeOut();
        }

        display->shutdown();
        settings->deinit();
        return sys::ReturnCodes::Success;
    }

    void ServiceEink::ProcessCloseReason(sys::CloseReason closeReason)
    {
        systemCloseReason = closeReason;
        sendCloseReadyMessage(this);
    }

    void ServiceEink::ProcessCloseReasonHandler(sys::CloseReason closeReason)
    {
        ProcessCloseReason(closeReason);
    }

    sys::ReturnCodes ServiceEink::SwitchPowerModeHandler(const sys::ServicePowerMode mode)
    {
        LOG_INFO("PowerModeHandler: %s", c_str(mode));

M module-services/service-eink/ServiceEink.hpp => module-services/service-eink/ServiceEink.hpp +5 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 40,6 40,8 @@ namespace service::eink
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *response) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;
        void ProcessCloseReason(sys::CloseReason closeReason) override;
        void ProcessCloseReasonHandler(sys::CloseReason closeReason) override;
        sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override;

      private:


@@ 85,6 87,8 @@ namespace service::eink
        hal::eink::EinkFrame refreshFramesSum;
        hal::eink::EinkRefreshMode refreshModeSum = hal::eink::EinkRefreshMode::REFRESH_NONE;
        bool isRefreshFramesSumValid              = false;

        sys::CloseReason systemCloseReason = sys::CloseReason::RegularPowerDown;
    };
} // namespace service::eink