Program Listing for File KPStateMachine.cpp¶
↰ Return to documentation for file (src/KPStateMachine.cpp)
#include <KPState.hpp>
#include <KPStateMachine.hpp>
void KPStateMachine::setup() {
// do nothing
}
void KPStateMachine::update() {
if (!currentState) {
return;
}
if (!currentState->didEnter) {
currentState->didEnter = true;
currentState->enter(*this);
}
for (size_t i = 0; i < currentState->numberOfSchedules; i++) {
auto & s = currentState->schedules[i];
if (s.activated || !s.condition()) {
continue;
}
s.activated = true;
s.callback();
}
currentState->update(*this);
}
void KPStateMachine::next(int code) const {
auto entry = mapNameToMiddleware.find(currentState->name);
if (entry != mapNameToMiddleware.end()) {
entry->second(code);
}
}
void KPStateMachine::restart() {
transitionTo(currentState ? currentState->name : nullptr);
}
void KPStateMachine::transitionTo(const char * name) {
// Leave the current state
if (currentState) {
currentState->leave(*this);
}
// Move to new state
auto next = mapNameToState[name];
if (next) {
println("Begin ", next->getName());
currentState = next;
currentState->begin();
updateObservers(&KPStateMachineObserver::stateDidBegin, currentState);
}
}