Merge pull request #48 from vas-dav/event-rewrite-46

Event rewrite 46
This commit is contained in:
RedHawk 2023-05-19 00:11:42 +03:00 committed by GitHub
commit f8f7354917
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 55 additions and 101 deletions

View File

@ -8,11 +8,7 @@
#ifndef THREADS_COMMON_EVENT_H_ #ifndef THREADS_COMMON_EVENT_H_
#define THREADS_COMMON_EVENT_H_ #define THREADS_COMMON_EVENT_H_
#include <string>
#include <map>
typedef short int EventRawData; typedef short int EventRawData;
const EventRawData ERROR_RETURN = -999;
class Event class Event
{ {
@ -27,40 +23,31 @@ public:
NotifyUI NotifyUI
}; };
typedef struct _EventPair
{
EventRawData rd;
EventType et;
} EventPair;
Event(Event::EventType type, EventRawData data) Event(Event::EventType type, EventRawData data)
{ {
events.insert({type, data}); setEvent(type, data);
} }
void inline addData(Event::EventType type, EventRawData data) void setEvent(Event::EventType type, EventRawData data)
{ {
const auto pos = events.find(type); _type = type;
// No duplicates _data = data;
if (pos == events.end())
events.insert({type, data});
} }
EventRawData getDataOf(Event::EventType e) const Event::EventType inline getType() const
{ {
const auto pos = events.find(e); return _type;
if (pos == events.end())
return ERROR_RETURN;
return pos->second;
} }
void inline setDataOf(Event::EventType e, EventRawData data) EventRawData inline getData() const
{ {
events[e] = data; return _data;
} }
private: private:
std::map <Event::EventType, EventRawData> events; Event::EventType _type;
EventRawData _data;
}; };

View File

@ -20,33 +20,13 @@ Manager::~Manager()
LOG_ERROR("Deleting Manager"); LOG_ERROR("Deleting Manager");
} }
Event::EventPair Manager::parseEvent(Event* e)
{
EventRawData raw_data;
for(Event::EventType i :
{Event::Rotary, Event::InternalTemp,
Event::ExternalTemp})
{
raw_data = e->getDataOf(i);
if(raw_data != ERROR_RETURN)
{
Event::EventPair p = {raw_data, i};
return p;
}
}
LOG_WARNING("Event is empty");
return {ERROR_RETURN, Event::Null};
}
void Manager::taskFunction() void Manager::taskFunction()
{ {
Event data(Event::Null, 0); Event data(Event::Null, 0);
Event::EventPair event_pair = {0, Event::EventType::Null};
for(;;) for(;;)
{ {
_qm->receive<Event>(ThreadCommon::QueueManager::manager_event_master, &data, portMAX_DELAY); _qm->receive<Event>(ThreadCommon::QueueManager::manager_event_master, &data, portMAX_DELAY);
event_pair= this->parseEvent(&data); _menu.parseEvent(&data);
_menu.HandleEventPair(&event_pair);
} }
} }

View File

@ -20,7 +20,6 @@ public:
virtual ~Manager(); virtual ~Manager();
void taskFunction(); void taskFunction();
private: private:
Event::EventPair parseEvent(Event* e);
ThreadCommon::QueueManager* _qm; ThreadCommon::QueueManager* _qm;
Menu _menu; Menu _menu;

View File

@ -38,14 +38,14 @@ Menu::readSetPointFromEEPROM (void)
} }
} }
void Menu::HandleEventPair (Event::EventPair *ep) void Menu::parseEvent (Event *ep)
{ {
switch(ep->et/*EventType*/) switch(ep->getType()/*EventType*/)
{ {
case Event::Rotary: case Event::Rotary:
// can be wrapped in a function, but this was found to be more clear solution, // can be wrapped in a function, but this was found to be more clear solution,
// since we are still handling eventpair here, although nested // since we are still handling eventpair here, although nested
switch(static_cast<ThreadCommon::RotaryAction>(ep->rd)/*RawData*/) switch(static_cast<ThreadCommon::RotaryAction>(ep->getData())/*RawData*/)
{ {
case ThreadCommon::RotaryAction::Right: case ThreadCommon::RotaryAction::Right:
this->HandleObj(MenuObjEvent (MenuObjEvent::eRollClockWise)); this->HandleObj(MenuObjEvent (MenuObjEvent::eRollClockWise));
@ -68,7 +68,7 @@ void Menu::HandleEventPair (Event::EventPair *ep)
break; break;
case Event::ExternalTemp: case Event::ExternalTemp:
//Change ExternalTemp value. -99 <= ext_temp <= 99 //Change ExternalTemp value. -99 <= ext_temp <= 99
this->ext_temp.setCurrent(ep->rd); this->ext_temp.setCurrent(ep->getData());
//Refresh the menu screen. //Refresh the menu screen.
this->HandleObj(MenuObjEvent (MenuObjEvent::eRefresh)); this->HandleObj(MenuObjEvent (MenuObjEvent::eRefresh));
break; break;
@ -179,7 +179,7 @@ void Menu::sSetPointMod(const MenuObjEvent &e)
// Write to EEPROM // Write to EEPROM
eeprom.write_to(EEPROM_START_ADDR, (void*)&sp, sizeof(EventRawData)); eeprom.write_to(EEPROM_START_ADDR, (void*)&sp, sizeof(EventRawData));
event_sp.setDataOf(Event::EventType::SetPoint, sp); event_sp.setEvent(Event::EventType::SetPoint, sp);
_qm->send<Event>(ThreadCommon::QueueManager::master_event_all, &event_sp, 1); _qm->send<Event>(ThreadCommon::QueueManager::master_event_all, &event_sp, 1);
this->SetState(&Menu::sMainView); this->SetState(&Menu::sMainView);

View File

@ -22,7 +22,7 @@ class Menu
public: public:
Menu (ThreadCommon::QueueManager* qm); Menu (ThreadCommon::QueueManager* qm);
virtual ~Menu (); virtual ~Menu ();
void HandleEventPair (Event::EventPair *ep); void parseEvent (Event *ep);
private: private:
/* Variables and objects */ /* Variables and objects */

View File

@ -36,17 +36,19 @@ Master::~Master()
LOG_ERROR("Master was deleted"); LOG_ERROR("Master was deleted");
} }
void Master::HandleEventType(Event* e, Event::EventType type) void Master::HandleEventType(Event* e)
{ {
switch (type) EventRawData rd = e->getData();
switch (e->getType())
{ {
case Event::Null: case Event::Null:
LOG_ERROR("Master recieved Event::Null with data: %d", rd);
break; break;
case Event::Rotary: case Event::Rotary:
//Comes from rotary, goes to manager //Comes from rotary, goes to manager
_qm->send<Event>(ThreadCommon::QueueManager::manager_event_master, e, 0); _qm->send<Event>(ThreadCommon::QueueManager::manager_event_master, e, 0);
//LOG_WARNING("Timestamp: %zus, Clock: %zu, Chip freq: %zu", LPC_SCT1->COUNT_U / Chip_Clock_GetMainClockRate(), LPC_SCT1->COUNT_U, Chip_Clock_GetMainClockRate()); //LOG_WARNING("Timestamp: %zus, Clock: %zu, Chip freq: %zu", LPC_SCT1->COUNT_U / Chip_Clock_GetMainClockRate(), LPC_SCT1->COUNT_U, Chip_Clock_GetMainClockRate());
LOG_DEBUG("Rotary: %s has been forwarded to manager", rotary_direction[e->getDataOf(type)]); LOG_DEBUG("Rotary: %s has been forwarded to manager", rotary_direction[rd]);
break; break;
case Event::InternalTemp: case Event::InternalTemp:
// TODO remove (deprecated) // TODO remove (deprecated)
@ -55,14 +57,15 @@ void Master::HandleEventType(Event* e, Event::EventType type)
//Comes from sensors, goes to relay & manager //Comes from sensors, goes to relay & manager
_qm->send<Event>(ThreadCommon::QueueManager::relay_event_master, e, 0); _qm->send<Event>(ThreadCommon::QueueManager::relay_event_master, e, 0);
_qm->send<Event>(ThreadCommon::QueueManager::manager_event_master, e, 0); _qm->send<Event>(ThreadCommon::QueueManager::manager_event_master, e, 0);
LOG_DEBUG("ExtTemp: %d has been forwarded to manager and relay", e->getDataOf(type)); LOG_DEBUG("ExtTemp: %d has been forwarded to manager and relay", rd);
break; break;
case Event::SetPoint: case Event::SetPoint:
//Comes from manager, goes to relay //Comes from manager, goes to relay
_qm->send<Event>(ThreadCommon::QueueManager::relay_event_master, e, 0); _qm->send<Event>(ThreadCommon::QueueManager::relay_event_master, e, 0);
LOG_DEBUG("SetPoint: %d has been forwarded to relay", e->getDataOf(type)); LOG_DEBUG("SetPoint: %d has been forwarded to relay", rd);
break; break;
default: default:
LOG_ERROR("Unknown EventType");
assert(0); assert(0);
break; break;
} }
@ -70,22 +73,15 @@ void Master::HandleEventType(Event* e, Event::EventType type)
void Master::taskFunction() { void Master::taskFunction() {
Event data(Event::Null, 0); Event data(Event::Null, 0);
for (;;) { for (;;)
{
if(!_qm->receive<Event>(ThreadCommon::QueueManager::master_event_all, &data, 10000)) if(!_qm->receive<Event>(ThreadCommon::QueueManager::master_event_all, &data, 10000))
data.setDataOf(Event::Rotary, ThreadCommon::RotaryAction::Idle); {
data.setEvent(Event::Rotary, ThreadCommon::RotaryAction::Idle);
}
HandleEventType(&data);
for(Event::EventType i :
{Event::Null,
Event::Rotary,
Event::InternalTemp,
Event::ExternalTemp,
Event::SetPoint})
{
if (data.getDataOf(i) != ERROR_RETURN)
{
HandleEventType(&data, i);
}
}
global_clock->updateClock(); global_clock->updateClock();
} }
} }

View File

@ -26,7 +26,7 @@ public:
private: private:
Event* message; Event* message;
ThreadCommon::QueueManager* _qm; ThreadCommon::QueueManager* _qm;
void HandleEventType(Event* e, Event::EventType type); void HandleEventType(Event* e);
}; };
void thread_master(void* pvParams); void thread_master(void* pvParams);

View File

@ -87,16 +87,10 @@ void Relay::taskFunction()
} }
} }
void Relay::parseEvent(Event* d) void Relay::parseEvent(Event* e)
{ {
for (uint8_t i = Event::ExternalTemp; i <= Event::SetPoint; i++) EventRawData rd = e->getData();
{ switch(e->getType() /* EventType */)
EventRawData rd = d->getDataOf(static_cast<Event::EventType>(i));
if(rd == ERROR_RETURN)
{
continue;
}
switch(i /* EventType */)
{ {
case Event::ExternalTemp: case Event::ExternalTemp:
ext_temp = rd; ext_temp = rd;
@ -108,8 +102,6 @@ void Relay::parseEvent(Event* d)
assert(0); assert(0);
break; break;
} }
}
} }
void Relay::utilizeEventData() void Relay::utilizeEventData()

View File

@ -51,7 +51,7 @@ private:
RelayDevice relays [2] = {{0, 24, 0}, RelayDevice relays [2] = {{0, 24, 0},
{0, 26, 1}}; {0, 26, 1}};
void parseEvent(Event * d); void parseEvent(Event * e);
int8_t setpoint, ext_temp; int8_t setpoint, ext_temp;
}; };

View File

@ -70,13 +70,13 @@ Rotary::~Rotary()
void Rotary::taskFunction() void Rotary::taskFunction()
{ {
auto action_from_rotary_isr = ThreadCommon::RotaryAction::Idle; auto action_from_rotary_isr = ThreadCommon::RotaryAction::Idle;
Event * p_e= new Event(Event::EventType::Rotary, action_from_rotary_isr); Event data(Event::EventType::Rotary, action_from_rotary_isr);
for (;;) for (;;)
{ {
xQueueReceive(*p_rotary_isr_q, &action_from_rotary_isr, portMAX_DELAY); xQueueReceive(*p_rotary_isr_q, &action_from_rotary_isr, portMAX_DELAY);
p_e->setDataOf(Event::EventType::Rotary, action_from_rotary_isr); data.setEvent(Event::EventType::Rotary, action_from_rotary_isr);
_qm->send<Event>(ThreadCommon::QueueManager::master_event_all, p_e, 10); _qm->send<Event>(ThreadCommon::QueueManager::master_event_all, &data, 10);
} }
} }