mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-07-04 05:06:58 -04:00
169 lines
4.3 KiB
C++
169 lines
4.3 KiB
C++
/*
|
|
* WorkerEvent.cpp
|
|
*
|
|
* Created on: May 31, 2019
|
|
* Author: kuba
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
extern "C" {
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
}
|
|
|
|
#include "Service/Service.hpp"
|
|
#include "Service/Message.hpp"
|
|
#include "Service/Worker.hpp"
|
|
#include "MessageType.hpp"
|
|
|
|
|
|
|
|
#include "WorkerEvent.hpp"
|
|
#include "EventManager.hpp"
|
|
#include "service-evtmgr/messages/EVMessages.hpp"
|
|
|
|
#include "module-bsp/bsp/keyboard/keyboard.hpp"
|
|
#include "module-bsp/bsp/battery-charger/battery_charger.hpp"
|
|
#include "module-bsp/bsp/rtc/rtc.hpp"
|
|
|
|
bool WorkerEvent::handleMessage( uint32_t queueID ) {
|
|
|
|
QueueHandle_t queue = queues[queueID];
|
|
|
|
//service queue
|
|
if( queueID == static_cast<uint32_t>(WorkerEventQueues::queueService) ) {
|
|
sys::WorkerCommand wcmd;
|
|
if( xQueueReceive(queue, &wcmd, 0 ) != pdTRUE ) {
|
|
return false;
|
|
}
|
|
wcmd.command = 1;
|
|
//place some code here to handle messages from service
|
|
}
|
|
|
|
if( queueID == static_cast<uint32_t>(WorkerEventQueues::queueKeyboardIRQ) )
|
|
{
|
|
uint8_t notification;
|
|
if( xQueueReceive(queue, ¬ification, 0 ) != pdTRUE ) {
|
|
return false;
|
|
}
|
|
uint8_t state, code;
|
|
bsp::keyboard_get_data(notification, state, code);
|
|
|
|
processKeyEvent(static_cast<bsp::KeyEvents>(state), static_cast<bsp::KeyCodes>(code));
|
|
|
|
}
|
|
|
|
if( queueID == static_cast<uint32_t>(WorkerEventQueues::queueBattery) )
|
|
{
|
|
uint8_t notification;
|
|
if( xQueueReceive(queue, ¬ification, 0 ) != pdTRUE ) {
|
|
return false;
|
|
}
|
|
if(notification & static_cast<uint8_t>(bsp::batteryIRQSource::INTB))
|
|
{
|
|
uint8_t battLevel;
|
|
|
|
bsp::battery_getBatteryLevel(battLevel);
|
|
bsp::battery_ClearAllIRQs();
|
|
auto message = std::make_shared<sevm::BatteryLevelMessage>(MessageType::EVMBatteryLevel);
|
|
message->levelPercents = battLevel;
|
|
message->fullyCharged = false;
|
|
sys::Bus::SendUnicast(message, "EventManager", this->service);
|
|
}
|
|
if(notification & static_cast<uint8_t>(bsp::batteryIRQSource::INOKB))
|
|
{
|
|
bool status;
|
|
bsp::battery_getChargeStatus(status);
|
|
bsp::battery_ClearAllIRQs();
|
|
auto message = std::make_shared<sevm::BatteryPlugMessage>(MessageType::EVMChargerPlugged);
|
|
message->plugged = status;
|
|
sys::Bus::SendUnicast(message, "EventManager", this->service);
|
|
}
|
|
}
|
|
|
|
if( queueID == static_cast<uint32_t>(WorkerEventQueues::queueRTC) )
|
|
{
|
|
uint8_t notification;
|
|
if( xQueueReceive(queue, ¬ification, 0 ) != pdTRUE ) {
|
|
return false;
|
|
}
|
|
|
|
bsp::rtc_SetMinuteAlarm();
|
|
|
|
time_t timestamp;
|
|
bsp::rtc_GetCurrentTimestamp(×tamp);
|
|
auto message = std::make_shared<sevm::RtcMinuteAlarmMessage>(MessageType::EVMMinuteUpdated);
|
|
message->timestamp = timestamp;
|
|
sys::Bus::SendUnicast(message, "EventManager", this->service);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool WorkerEvent::init( std::list<sys::WorkerQueueInfo> queues )
|
|
{
|
|
Worker::init(queues);
|
|
std::vector<xQueueHandle> qhandles = this->getQueues();
|
|
bsp::keyboard_Init(qhandles[static_cast<int32_t>(WorkerEventQueues::queueKeyboardIRQ)]);
|
|
bsp::battery_Init(qhandles[static_cast<int32_t>(WorkerEventQueues::queueBattery)]);
|
|
bsp::rtc_Init(qhandles[static_cast<int32_t>(WorkerEventQueues::queueRTC)]);
|
|
|
|
bsp::rtc_SetDateTimeFromTimestamp(1563436000);
|
|
bsp::rtc_SetMinuteAlarm();
|
|
return true;
|
|
}
|
|
|
|
bool WorkerEvent::deinit(void)
|
|
{
|
|
Worker::stop();
|
|
Worker::deinit();
|
|
bsp::keyboard_Deinit();
|
|
bsp::battery_Deinit();
|
|
|
|
return true;
|
|
}
|
|
|
|
void WorkerEvent::processKeyEvent(bsp::KeyEvents event, bsp::KeyCodes code)
|
|
{
|
|
auto message = std::make_shared<sevm::KbdMessage>(MessageType::KBDKeyEvent);
|
|
|
|
message->keyCode = code;
|
|
|
|
if(event == bsp::KeyEvents::Pressed)
|
|
{
|
|
if(lastState == bsp::KeyEvents::Pressed) {
|
|
return;
|
|
}
|
|
|
|
message->keyState = sevm::KeyboardEvents::keyPressed;
|
|
message->keyPressTime = xTaskGetTickCount();
|
|
message->keyRelaseTime = 0;
|
|
|
|
// Slider sends only press, not release state so it would block the entire keyboard
|
|
if( (code != bsp::KeyCodes::SSwitchUp) && (code != bsp::KeyCodes::SSwitchMid) && (code != bsp::KeyCodes::SSwitchDown) ) {
|
|
lastPressed = code;
|
|
lastState = event;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( lastState != bsp::KeyEvents::Pressed)
|
|
{
|
|
return;
|
|
}
|
|
if( lastPressed != code)
|
|
{
|
|
return;
|
|
}
|
|
|
|
lastState = bsp::KeyEvents::Released;
|
|
{
|
|
message->keyState = sevm::KeyboardEvents::keyReleasedShort;
|
|
message->keyRelaseTime = xTaskGetTickCount();
|
|
}
|
|
}
|
|
sys::Bus::SendUnicast(message, "EventManager", this->service);
|
|
}
|
|
|