// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ServiceTime.hpp" #include "service-time/CalendarTimeEvents.hpp" #include "service-time/TimeMessage.hpp" #include #include #include #include #include #include #include #include #include #include namespace stm { ServiceTime::ServiceTime() : sys::Service(service::name::service_time, "", StackDepth), calendarEvents(this) { LOG_INFO("[ServiceTime] Initializing"); bus.channels.push_back(sys::BusChannel::ServiceDBNotifications); } ServiceTime::~ServiceTime() { LOG_INFO("[ServiceTime] Cleaning resources"); } sys::ReturnCodes ServiceTime::InitHandler() { return sys::ReturnCodes::Success; } sys::ReturnCodes ServiceTime::DeinitHandler() { return sys::ReturnCodes::Success; } void ServiceTime::ProcessCloseReason(sys::CloseReason closeReason) { sendCloseReadyMessage(this); } sys::ReturnCodes ServiceTime::SwitchPowerModeHandler(const sys::ServicePowerMode mode) { LOG_FATAL("[ServiceTime] PowerModeHandler: %s", c_str(mode)); return sys::ReturnCodes::Success; } sys::MessagePointer ServiceTime::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) { std::shared_ptr responseMsg = nullptr; switch (static_cast(msgl->messageType)) { case MessageType::DBServiceNotification: { auto msg = dynamic_cast(msgl); if (msg == nullptr) { responseMsg = std::make_shared(false); break; } if (msg->interface == db::Interface::Name::Events && msg->dataModified()) { calendarEvents.processNextEvent(); return responseMsg; } } break; case MessageType::ReloadTimers: { calendarEvents.processNextEvent(); return std::make_shared(); } break; case MessageType::TimersProcessingStart: { calendarEvents.startProcessing(); return std::make_shared(); } break; case MessageType::TimersProcessingStop: { calendarEvents.stopProcessing(); return std::make_shared(); } break; default: break; } if (responseMsg != nullptr) { responseMsg->responseTo = msgl->messageType; return responseMsg; } bool responseHandled = false; if (resp != nullptr) { if (auto msg = dynamic_cast(resp)) { auto result = msg->getResult(); if (dynamic_cast(result.get())) { calendarEvents.receiveNextEventQuery(std::move(result)); responseHandled = true; } } if (responseHandled) { return std::make_shared(); } else { return std::make_shared(sys::ReturnCodes::Unresolved); } } else { return std::make_shared(); } } } /* namespace stm */