commit
f8f7354917
@ -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 setEvent(Event::EventType type, EventRawData data)
|
||||||
|
{
|
||||||
|
_type = type;
|
||||||
|
_data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void inline addData(Event::EventType type, EventRawData data)
|
Event::EventType inline getType() const
|
||||||
{
|
{
|
||||||
const auto pos = events.find(type);
|
return _type;
|
||||||
// No duplicates
|
|
||||||
if (pos == events.end())
|
|
||||||
events.insert({type, data});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EventRawData getDataOf(Event::EventType e) const
|
EventRawData inline getData() const
|
||||||
{
|
{
|
||||||
const auto pos = events.find(e);
|
return _data;
|
||||||
if (pos == events.end())
|
|
||||||
return ERROR_RETURN;
|
|
||||||
return pos->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
void inline setDataOf(Event::EventType e, EventRawData data)
|
|
||||||
{
|
|
||||||
events[e] = data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map <Event::EventType, EventRawData> events;
|
Event::EventType _type;
|
||||||
|
EventRawData _data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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 */
|
||||||
|
|||||||
@ -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);
|
||||||
for(Event::EventType i :
|
}
|
||||||
{Event::Null,
|
|
||||||
Event::Rotary,
|
HandleEventType(&data);
|
||||||
Event::InternalTemp,
|
|
||||||
Event::ExternalTemp,
|
|
||||||
Event::SetPoint})
|
|
||||||
{
|
|
||||||
if (data.getDataOf(i) != ERROR_RETURN)
|
|
||||||
{
|
|
||||||
HandleEventType(&data, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
global_clock->updateClock();
|
global_clock->updateClock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -87,29 +87,21 @@ 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)
|
case Event::ExternalTemp:
|
||||||
{
|
ext_temp = rd;
|
||||||
continue;
|
break;
|
||||||
}
|
case Event::SetPoint:
|
||||||
switch(i /* EventType */)
|
setpoint = rd;
|
||||||
{
|
break;
|
||||||
case Event::ExternalTemp:
|
default:
|
||||||
ext_temp = rd;
|
assert(0);
|
||||||
break;
|
break;
|
||||||
case Event::SetPoint:
|
}
|
||||||
setpoint = rd;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relay::utilizeEventData()
|
void Relay::utilizeEventData()
|
||||||
|
|||||||
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user