/* * EventManager.cpp * * Created on: 22 maj 2019 * Author: robert */ #include "EventManager.hpp" #include "log/log.hpp" #include "keyboard/keyboard.hpp" #include "WorkerEvent.hpp" #include "messages/EVMessages.hpp" #include "vfs.hpp" #include "service-db/api/DBServiceAPI.hpp" EventManager::EventManager(const std::string& name) : sys::Service(name) { LOG_INFO("[EventManager] Initializing"); busChannels.push_back(sys::BusChannels::ServiceDatabaseAlarmNotifications); } EventManager::~EventManager(){ LOG_INFO("[EventManager] Cleaning resources"); if( EventWorker != nullptr) { EventWorker->deinit(); delete EventWorker; } } // Invoked upon receiving data message sys::Message_t EventManager::DataReceivedHandler(sys::DataMessage* msgl) { bool handled = false; if(msgl->messageType == static_cast(MessageType::DBAlarmUpdateNotification)) { LOG_INFO("DB updated"); AlarmsRecord record = DBServiceAPI::AlarmGetNext(this, 0); LOG_INFO("Received alarm record ID: %d", record.ID); LOG_INFO("Path %s", record.path.c_str()); } if(msgl->messageType == static_cast(MessageType::KBDKeyEvent) && msgl->sender == this->GetName()) { sevm::KbdMessage* msg = reinterpret_cast(msgl); auto message = std::make_shared(MessageType::KBDKeyEvent); message->keyCode = msg->keyCode; message->keyState = msg->keyState; message->keyPressTime = msg->keyPressTime; message->keyRelaseTime = msg->keyRelaseTime; if( targetApplication.empty() == false ) { sys::Bus::SendUnicast(message, targetApplication, this); } if(msg->keyState == sevm::KeyboardEvents::keyPressed) { AlarmsRecord alarma; alarma.time=12; alarma.snooze=34; alarma.status=56; alarma.path = "78"; DBServiceAPI::AlarmAdd(this, alarma); } handled = true; } else if(msgl->messageType == static_cast(MessageType::EVMFocusApplication) ) { sevm::EVMFocusApplication* msg = reinterpret_cast( msgl ); if( msg->sender == "ApplicationManager" ) { targetApplication = msg->getApplication(); handled = true; } } else if(msgl->messageType == static_cast(MessageType::EVMBatteryLevel) && msgl->sender == this->GetName()) { sevm::BatteryLevelMessage* msg = reinterpret_cast(msgl); auto message = std::make_shared(MessageType::EVMBatteryLevel); message->levelPercents = msg->levelPercents; message->fullyCharged = msg->fullyCharged; if( targetApplication.empty() == false ) { sys::Bus::SendUnicast(message, targetApplication, this); } handled = true; } else if(msgl->messageType == static_cast(MessageType::EVMChargerPlugged) && msgl->sender == this->GetName()) { sevm::BatteryPlugMessage* msg = reinterpret_cast(msgl); auto message = std::make_shared(MessageType::EVMChargerPlugged); message->plugged = msg->plugged; if( targetApplication.empty() == false ) { sys::Bus::SendUnicast(message, targetApplication, this); } handled = true; } else if(msgl->messageType == static_cast(MessageType::EVMMinuteUpdated) && msgl->sender == this->GetName() ){ sevm::RtcMinuteAlarmMessage* msg = reinterpret_cast(msgl); auto message = std::make_shared(MessageType::EVMMinuteUpdated); message->timestamp = msg->timestamp; if( targetApplication.empty() == false ){ sys::Bus::SendUnicast(message, targetApplication, this); } } if( handled ) return std::make_shared(); else return std::make_shared(sys::ReturnCodes::Unresolved); } // Invoked during initialization sys::ReturnCodes EventManager::InitHandler() { //initialize keyboard worker EventWorker = new WorkerEvent( this ); //create queues for worker //keyboard irq queue sys::WorkerQueueInfo qIrq = {"qIrq", sizeof(uint8_t), 10 }; //battery manager queue sys::WorkerQueueInfo qBattery = {"qBattery", sizeof(uint8_t), 10 }; //RTC irq queue sys::WorkerQueueInfo qRTC = {"qRTC", sizeof(uint8_t), 20 }; std::list list; list.push_back(qIrq); list.push_back(qBattery); list.push_back(qRTC); EventWorker->init( list ); EventWorker->run(); std::vector set = EventWorker->getQueues(); return sys::ReturnCodes::Success; } sys::ReturnCodes EventManager::DeinitHandler() { EventWorker->deinit(); return sys::ReturnCodes::Success; } sys::ReturnCodes EventManager::WakeUpHandler() { return sys::ReturnCodes::Success; } sys::ReturnCodes EventManager::SleepHandler() { return sys::ReturnCodes::Success; } bool EventManager::messageSetApplication( sys::Service* sender, const std::string& applicationName ) { auto msg = std::make_shared( applicationName ); // auto ret = sys::Bus::SendUnicast(msg, "EventManager", sender, 200 ); // return (ret.first == sys::ReturnCodes::Success )?true:false; sys::Bus::SendUnicast(msg, "EventManager", sender ); return true; }