Files
MinumelArmMCU/StateMachine.cpp
T

99 lines
2.4 KiB
C++
Raw Normal View History

#include "StateMachine.hpp"
#include "UartHandler.hpp"
2025-12-14 18:57:28 +01:00
constexpr uint8_t ERROR_INDICATOR_LED_PIN = 3;
StateMachine::StateMachine() noexcept
{
pinMode(ERROR_INDICATOR_LED_PIN, OUTPUT);
digitalWrite(ERROR_INDICATOR_LED_PIN, LOW);
}
StateMachine& StateMachine::getInstance() noexcept
{
static StateMachine instance;
return instance;
}
2025-12-15 20:13:05 +01:00
bool StateMachine::setState(const STATE newState) noexcept
{
if (canSwitchToState(newState)) {
state = newState;
return true;
}
return false;
}
2025-12-15 20:13:05 +01:00
bool StateMachine::canSwitchToState(const STATE newState) const noexcept
{
// Error state is final
2025-12-15 22:39:25 +01:00
if (state == STATE::FAULT) {
return false;
}
// Error state only settable via raiseError()
2025-12-15 22:39:25 +01:00
if (newState == STATE::FAULT) {
return false;
}
// Allow same-to-same transition
if (state == newState) {
return true;
}
switch (state) {
2025-12-15 20:13:05 +01:00
case StateMachine::STATE::INITIALIZING:
switch (newState) {
// Can go to idle
2025-12-15 20:13:05 +01:00
case STATE::IDLING:
return true;
// Can't go straight to moving
2025-12-15 20:13:05 +01:00
case STATE::MOVING:
return false;
default:
return false;
}
break;
2025-12-15 20:13:05 +01:00
case StateMachine::STATE::IDLING:
switch (newState) {
// Can't initialize again
2025-12-15 20:13:05 +01:00
case STATE::INITIALIZING:
return false;
// Can enter move state
2025-12-15 20:13:05 +01:00
case STATE::MOVING:
return true;
default:
return false;
}
break;
2025-12-15 20:13:05 +01:00
case StateMachine::STATE::MOVING:
switch (newState) {
// Can't initialize again
2025-12-15 20:13:05 +01:00
case STATE::INITIALIZING:
return false;
// Can go into idling
2025-12-15 20:13:05 +01:00
case STATE::IDLING:
return true;
default:
return false;
}
break;
}
return false;
}
bool StateMachine::raiseError(const String &reason) noexcept
{
2025-12-15 22:39:25 +01:00
state = STATE::FAULT;
lastError = reason;
2025-12-14 18:57:28 +01:00
digitalWrite(ERROR_INDICATOR_LED_PIN, HIGH);
UartHandler& uart = UartHandler::getInstance();
if (uart.isOpen()) {
uart.send(String("Error!: ") + reason);
2025-12-14 18:57:28 +01:00
}
}