This repository has been archived on 2024-01-25. You can view files and clone it, but cannot push or open issues or pull requests.
ButtonManager/src/xf/core/XFState.cpp

104 lines
2.1 KiB
C++
Raw Normal View History

2023-11-26 20:19:58 +01:00
/*
* XFState.cpp
*
* Created on: 23 nov. 2023
* Author: remi.heredero
*/
#include "xf/XFState.h"
#include "xf/include/xf/behavior.h"
#include <cassert>
#include "xf/event.h"
#include "trace/trace.h"
XFState::XFState(XFBehavior* behavior)
: pBehavior(behavior) {
assert(behavior != nullptr);
cbState_ = nullptr;
cbEntry_ = nullptr;
cbExit_ = nullptr;
cbEvState_ = nullptr;
cbEvEntry_ = nullptr;
cbEvExit_ = nullptr;
2023-11-26 20:19:58 +01:00
}
void XFState::addTransition(XFEvent::XFEventType type, const int evid, const int time, XFState* state) {
2023-11-26 20:19:58 +01:00
assert(state != nullptr);
transition t;
t.evid = evid;
t.time = time;
t.evType = type;
t.nextState = state;
transitions_.push_back(t);
}
XFEventStatus XFState::onState(const XFEvent* ev) {
2023-11-27 08:06:53 +01:00
if(cbState_ != nullptr) {
(pBehavior->*cbState_)();
}
if(cbEvState_ != nullptr) {
(pBehavior->*cbEvState_)(ev);
}
2023-11-26 20:19:58 +01:00
for(transition t : transitions_) {
if(t.evType == XFEvent::XFEventType::Initial){
pBehavior->curentXFState_ = t.nextState;
pBehavior->changeXFState = true;
return XFEventStatus::Consumed;
}
if(t.evType == XFEvent::XFEventType::Timeout) {
pBehavior->curentXFState_ = t.nextState;
pBehavior->changeXFState = true;
return XFEventStatus::Consumed;
}
if(t.evid == ev->getId()) {
pBehavior->curentXFState_ = t.nextState;
pBehavior->changeXFState = true;
return XFEventStatus::Consumed;
}
}
return XFEventStatus::NotConsumed;
}
void XFState::onEntry(const XFEvent* ev) {
if(cbEntry_ != nullptr) {
2023-11-27 08:06:53 +01:00
(pBehavior->*cbEntry_)();
}
2023-11-27 08:06:53 +01:00
if(cbEvEntry_ != nullptr) {
(pBehavior->*cbEvEntry_)(ev);
2023-11-26 20:19:58 +01:00
}
for(transition t : transitions_) {
if(t.evType == XFEvent::XFEventType::Timeout) {
pBehavior->scheduleTimeout(XFEvent::Timeout, t.time);
}
}
}
void XFState::onExit(const XFEvent* ev) {
if(cbExit_ != nullptr) {
2023-11-27 08:06:53 +01:00
(pBehavior->*cbExit_)();
}
2023-11-27 08:06:53 +01:00
if(cbEvExit_ != nullptr) {
(pBehavior->*cbEvExit_)(ev);
2023-11-26 20:19:58 +01:00
}
for(transition t: transitions_) {
if(t.evType == XFEvent::XFEventType::Timeout) {
if(ev->getEventType() != XFEvent::XFEventType::Timeout) {
pBehavior->unscheduleTimeout(XFEvent::Timeout);
}
}
}
2023-11-26 20:19:58 +01:00
}