// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include #include #include #include #include #include #include "messages/RenderingFinished.hpp" #include "ContextPool.hpp" #include "DrawCommandsQueue.hpp" #include "Common.hpp" #include #include #include namespace gui { class Context; class DrawCommand; } // namespace gui namespace service::gui { class WorkerGUI; class ServiceGUI : public sys::Service { friend WorkerGUI; public: explicit ServiceGUI(const std::string &name = service::name::gui, std::string parent = {}); ~ServiceGUI() noexcept override; sys::ReturnCodes InitHandler() override; sys::ReturnCodes DeinitHandler() override; sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override; sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override; private: struct CachedRender { int contextId; ::gui::RefreshModes refreshMode; }; enum class State { NotInitialised, Idle, Busy, Suspended }; static void initAssetManagers(); void registerMessageHandlers(); void cacheRender(int contextId, ::gui::RefreshModes refreshMode); void invalidateCache(); void prepareDisplayEarly(::gui::RefreshModes refreshMode); void notifyRenderer(std::list> &&commands, ::gui::RefreshModes refreshMode); void notifyRenderColorSchemeChange(::gui::ColorScheme &&scheme); void enqueueDrawCommands(DrawCommandsQueue::QueueItem &&item); void sendOnDisplay(::gui::Context *context, int contextId, ::gui::RefreshModes refreshMode); void scheduleContextRelease(int contextId); bool isNextFrameReady() const noexcept; void trySendNextFrame(); void setState(State state) noexcept; bool isInState(State state) const noexcept; sys::MessagePointer handleDrawMessage(sys::Message *message); sys::MessagePointer handleGUIRenderingFinished(sys::Message *message); sys::MessagePointer handleEinkInitialized(sys::Message *message); sys::MessagePointer handleImageDisplayedNotification(sys::Message *message); sys::MessagePointer handleChangeColorScheme(sys::Message *message); std::unique_ptr contextPool; std::unique_ptr worker; std::unique_ptr commandsQueue; std::unique_ptr<::gui::ColorScheme> colorSchemeUpdate; std::optional cachedRender; std::unique_ptr contextReleaseTimer; State currentState; }; } // namespace service::gui namespace sys { template <> struct ManifestTraits { static auto GetManifest() -> ServiceManifest { ServiceManifest manifest; manifest.name = service::name::gui; manifest.dependencies = {service::name::db}; return manifest; } }; } // namespace sys