// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include #include #include #include namespace sys { class Service; } // namespace sys namespace stm { constexpr static const int eventTimerInitInterval = 1000; TimeEvents::TimeEvents(sys::Service *service) : serv(service) {} TimeEvents::~TimeEvents() { stopTimer(); } sys::TimerHandle &TimeEvents::timer() { if (!fireEventTimer.isValid()) { fireEventTimer = sys::TimerFactory::createSingleShotTimer( service(), timerName(), std::chrono::milliseconds{eventTimerInitInterval}, [this](sys::Timer &) { fireEventTimerCallback(); }); } return fireEventTimer; } void TimeEvents::startProcessing() { timersProcessingStarted = true; processNextEvent(); } void TimeEvents::stopProcessing() { stopTimer(); timersProcessingStarted = false; } void TimeEvents::processNextEvent() { stopTimer(); if (!isStarted()) { return; } sendNextEventQuery(); } void TimeEvents::stopTimer() { timer().stop(); } void TimeEvents::recreateTimer(uint32_t interval) { stopTimer(); if (!isStarted()) { return; } timer().restart(std::chrono::milliseconds{interval}); } void TimeEvents::fireEventTimerCallback() { if (!isStarted()) { return; } invokeEvent(); sendEventFiredQuery(); } bool TimeEvents::receiveNextEventQuery(std::unique_ptr nextEventQueryResult) { if (!isStarted()) { return true; } if (nextEventQueryResult == nullptr) { return false; } uint32_t interval = calcToNextEventInterval(std::move(nextEventQueryResult)); if (interval > 0) { recreateTimer(interval); } return true; } } // namespace stm