// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md #include "GuiTimer.hpp" #include "Item.hpp" // for Item #include // for Application #include "Timers/SystemTimer.hpp" // for Timer, Timer::Type, Timer::Ty... #include "Timers/TimerFactory.hpp" #include namespace app { namespace { auto guiTypeToSysType(GuiTimer::Type type) noexcept { if (type == GuiTimer::Type::Periodic) { return sys::timer::Type::Periodic; } return sys::timer::Type::SingleShot; } } // namespace class GuiTimer::Impl { public: Impl(ApplicationCommon *parent, gui::Item *item, const std::string &name, std::chrono::milliseconds timeout, Type type); std::unique_ptr timer; }; GuiTimer::Impl::Impl(ApplicationCommon *parent, gui::Item *item, const std::string &name, std::chrono::milliseconds timeout, Type type) : timer{std::make_unique(parent, name, timeout, guiTypeToSysType(type))} { timer->connect([item](sys::Timer &self) { item->onTimer(self); }); } GuiTimer::GuiTimer(ApplicationCommon *parent, gui::Item *item, const std::string &name, std::chrono::milliseconds timeout, Type type) : pimpl(std::make_unique(parent, item, name, timeout, type)), item{item} {} GuiTimer::~GuiTimer() noexcept { item->detachTimer(*(pimpl->timer)); } void GuiTimer::start() { pimpl->timer->start(); } void GuiTimer::stop() { pimpl->timer->stop(); } void GuiTimer::restart(std::chrono::milliseconds newInterval) { pimpl->timer->restart(newInterval); } bool GuiTimer::isActive() const noexcept { return pimpl->timer->isActive(); } sys::TimerHandle GuiTimerFactory::createSingleShotTimer(ApplicationCommon *parent, gui::Item *item, const std::string &name, std::chrono::milliseconds interval) { return createGuiTimer(parent, item, name, interval, GuiTimer::Type::SingleShot); } sys::TimerHandle GuiTimerFactory::createPeriodicTimer(ApplicationCommon *parent, gui::Item *item, const std::string &name, std::chrono::milliseconds interval) { return createGuiTimer(parent, item, name, interval, GuiTimer::Type::Periodic); } sys::TimerHandle GuiTimerFactory::createGuiTimer(ApplicationCommon *parent, gui::Item *item, const std::string &name, std::chrono::milliseconds interval, GuiTimer::Type type) { auto timer = new GuiTimer{parent, item, name, interval, type}; parent->connect(timer, item); return sys::TimerHandle{timer}; } } // namespace app