Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions Core/Inc/Tasks/SessionController/FiniteStateMachine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,8 @@ struct State
{
INIT_STATE = 0,
USB_LOGGING_OPTION_DISPLAYED = 0,
USB_LOGGING_OPTION_EDIT,
SD_LOGGING_OPTION_DISPLAYED,
SD_LOGGING_OPTION_EDIT,
PID_ENABLE_DISPLAYED,
PID_ENABLE_EDIT,
PID_DESIRED_RPM_DISPLAYED,
PID_DESIRED_RPM_EDIT
};
Expand Down Expand Up @@ -95,15 +92,18 @@ class FSM
private:
// Methods which are called when a state change is done
void IdleState();
void USBLoggingOptionDisplayedSettingsState();
void USBLoggingOptionEditSettingsState();
void USBLoggingOptionDisplayedSettingsState();
void SDLoggingOptionDisplayedSettingsState();
void SDLoggingOptionEditSettingsState();
void PIDOptionDisplayedSettingsState();
void PIDOptionEditSettingsState();
void PIDDesiredRPMOptionDisplayedSettingsState();
void PIDDesiredRPMOptionEditSettingsState(bool clearDisplay);
void InSessionState();

// Renders an on/off settings option: title on row 0, ENABLED/DISABLED on row 1.
void ShowToggleOption(State::SettingsState settingsState, const char* title, uint8_t titleColumn, bool enabled);

// Writes a null-terminated string to the LCD (length derived from the string).
void WriteLine(uint8_t row, uint8_t column, const char* str);

// user input handlers
void HandleRotaryEncoderInput(bool positiveTick);
Expand Down
24 changes: 20 additions & 4 deletions Core/Inc/Tasks/SessionController/SessionController.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

#include "FiniteStateMachine.hpp"

#include "MessagePassing/messages_public.h"
#include "MessagePassing/messages_public.h"
#include "MessagePassing/osqueue_helpers.h"

Expand Down Expand Up @@ -44,16 +43,33 @@ class SessionController
session_controller_os_task_queues* _task_queues;
osMutexId_t _usart1Mutex;

// Latest sensor readings (drained from the circular buffers each loop iteration).
forcesensor_output_data _force_data;
optical_encoder_output_data _optical_encoder_data;

// Previous values, used for change-detection so we only act/transmit on a change.
bool _prevUSBLoggingEnabled;
bool _prevSDLoggingEnabled;
bool _prevPIDEnabled;
bool _prevInSession;
bool _pidAckReceived;
float _prevThrottleDutyCycle;
float _prevBpmDutyCycle;
float _prevForce;
float _prevAngularVelocity;

bool CheckTaskQueuesValid();

inline float CalculateTorque(float angularAcceleration, float force, float angularVelocity);
inline float CalculatePower(float torque, float angularVelocity);
inline float CalculateMechanicalLosses(float angularAcceleration, float angularVelocity);
// Run() loop steps (see Run() for ordering).
void SyncLoggingState(); // notify USB/SD controllers when logging enable changes
void HandleSessionEdge(); // enable/disable sensors + BPM on session start/stop
void SyncPidState(); // push PID enable/target changes and handle the ack
void HandleManualControl(); // push manual throttle/BPM duty cycle while in session
void UpdateMetrics(); // drain sensors, compute torque/power, refresh the display

float CalculateTorque(float angularAcceleration, float force, float angularVelocity);
float CalculatePower(float torque, float angularVelocity);
float CalculateMechanicalLosses(float angularAcceleration, float angularVelocity);

};

Expand Down
183 changes: 26 additions & 157 deletions Core/Src/Tasks/SessionController/FiniteStateMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,26 +76,14 @@ void FSM::HandleRotaryEncoderInput(bool positiveTick)
if (positiveTick) SDLoggingOptionDisplayedSettingsState();
else PIDDesiredRPMOptionDisplayedSettingsState();
break;
case State::SettingsState::USB_LOGGING_OPTION_EDIT:
// _usbLoggingEnabled = positiveTick;
// USBLoggingOptionEditSettingsState();
break;
case State::SettingsState::SD_LOGGING_OPTION_DISPLAYED:
if (positiveTick) PIDOptionDisplayedSettingsState();
else USBLoggingOptionDisplayedSettingsState();
break;
case State::SettingsState::SD_LOGGING_OPTION_EDIT:
// _sdLoggingEnabled = positiveTick;
// SDLoggingOptionEditSettingsState();
break;
case State::SettingsState::PID_ENABLE_DISPLAYED:
if (positiveTick) PIDDesiredRPMOptionDisplayedSettingsState();
else SDLoggingOptionDisplayedSettingsState();
break;
case State::SettingsState::PID_ENABLE_EDIT:
// _pidOptionToggleableEnabled = positiveTick;
// PIDOptionEditSettingsState();
break;
case State::SettingsState::PID_DESIRED_RPM_DISPLAYED:
if (positiveTick) USBLoggingOptionDisplayedSettingsState();
else PIDOptionDisplayedSettingsState();
Expand Down Expand Up @@ -129,30 +117,7 @@ void FSM::HandleRotaryEncoderInput(bool positiveTick)
}
void FSM::HandleRotaryEncoderSwInput(void)
{
// Was not working, will debug later
// _inSession = true;
// InSessionState();


// switch(_state.mainState)
// {
// case State::MainDynoState::IDLE:
// // InSessionState();
// break;
// case State::MainDynoState::SETTINGS_MENU:
// // InSessionState();
// switch(_state.settingsState)
// {
// case State::SettingsState::PID_DESIRED_RPM_EDIT:
// break;
// default:
// break;
// }
// break;
// case State::MainDynoState::IN_SESSION:
// break;
// }

// Rotary-encoder switch press is currently unused. Brake button drives session start/stop.
}
void FSM::HandleButtonBackInput(void)
{
Expand All @@ -166,21 +131,12 @@ void FSM::HandleButtonBackInput(void)
case State::SettingsState::USB_LOGGING_OPTION_DISPLAYED:
IdleState();
break;
case State::SettingsState::USB_LOGGING_OPTION_EDIT:
USBLoggingOptionDisplayedSettingsState();
break;
case State::SettingsState::SD_LOGGING_OPTION_DISPLAYED:
IdleState();
break;
case State::SettingsState::SD_LOGGING_OPTION_EDIT:
SDLoggingOptionDisplayedSettingsState();
break;
case State::SettingsState::PID_ENABLE_DISPLAYED:
IdleState();
break;
case State::SettingsState::PID_ENABLE_EDIT:
PIDOptionDisplayedSettingsState();
break;
case State::SettingsState::PID_DESIRED_RPM_DISPLAYED:
IdleState();
break;
Expand Down Expand Up @@ -218,30 +174,15 @@ void FSM::HandleButtonSelectInput(void)
{
case State::SettingsState::USB_LOGGING_OPTION_DISPLAYED:
_usbLoggingEnabled = !_usbLoggingEnabled;
USBLoggingOptionEditSettingsState();
// We don't actually want to change state, should remove the USB_LOGGING_OPTION_EDIT state later
_state.settingsState = State::SettingsState::USB_LOGGING_OPTION_DISPLAYED;
break;
case State::SettingsState::USB_LOGGING_OPTION_EDIT:
// USBLoggingOptionEditSettingsState();
USBLoggingOptionDisplayedSettingsState();
break;
case State::SettingsState::SD_LOGGING_OPTION_DISPLAYED:
_sdLoggingEnabled = !_sdLoggingEnabled;
SDLoggingOptionEditSettingsState();
// We don't actually want to change state, should remove the SD_LOGGING_OPTION_EDIT state later
_state.settingsState = State::SettingsState::SD_LOGGING_OPTION_DISPLAYED;
SDLoggingOptionDisplayedSettingsState();
break;
case State::SettingsState::SD_LOGGING_OPTION_EDIT:
// SDLoggingOptionEditSettingsState();
break;
case State::SettingsState::PID_ENABLE_DISPLAYED:
_pidOptionToggleableEnabled = !_pidOptionToggleableEnabled;
PIDOptionEditSettingsState();
// We don't actually want to change state, should remove the PID_ENABLE_EDIT state later
_state.settingsState = State::SettingsState::PID_ENABLE_DISPLAYED;
break;
case State::SettingsState::PID_ENABLE_EDIT:
// PIDOptionEditSettingsState();
PIDOptionDisplayedSettingsState();
break;
case State::SettingsState::PID_DESIRED_RPM_DISPLAYED:
PIDDesiredRPMOptionEditSettingsState(true);
Expand Down Expand Up @@ -278,29 +219,16 @@ void FSM::HandleButtonSelectInput(void)

void FSM::HandleButtonBrakeInput(bool isEnabled)
{
if (isEnabled)
{
_inSession = true;
InSessionState();
}
else
{
_inSession = false;
IdleState();
}

// switch(_state.mainState)
// {
// case State::MainDynoState::IDLE:
// break;
// case State::MainDynoState::SETTINGS_MENU:
// _inSession = true;
// DisplayInSessionScreen();
// break;
// case State::MainDynoState::IN_SESSION:
// break;
// }

if (isEnabled)
{
_inSession = true;
InSessionState();
}
else
{
_inSession = false;
IdleState();
}
}

int FSM::ConvertDesiredRpmUnitsStateToIncrement()
Expand Down Expand Up @@ -352,94 +280,35 @@ void FSM::IdleState()
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 2, "PRESS SELECT", sizeof("PRESS SELECT") - 1);
}

void FSM::USBLoggingOptionDisplayedSettingsState()
{
_state.mainState = State::MainDynoState::SETTINGS_MENU;
_state.settingsState = State::SettingsState::USB_LOGGING_OPTION_DISPLAYED;

ClearDisplay();

AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 0, 2, "USB LOGGING", sizeof("USB LOGGING") - 1);

if (_usbLoggingEnabled)
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "ENABLED", sizeof("ENABLED") - 1);
else
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "DISABLED", sizeof("DISABLED") - 1);
}

void FSM::USBLoggingOptionEditSettingsState()
void FSM::WriteLine(uint8_t row, uint8_t column, const char* str)
{
_state.mainState = State::MainDynoState::SETTINGS_MENU;
_state.settingsState = State::SettingsState::USB_LOGGING_OPTION_EDIT;

ClearDisplay();

AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 0, 2, "USB LOGGING", sizeof("USB LOGGING") - 1);

if (_usbLoggingEnabled)
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "ENABLED", sizeof("ENABLED") - 1);
else
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "DISABLED", sizeof("DISABLED") - 1);
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, row, column, str, strlen(str));
}

void FSM::SDLoggingOptionDisplayedSettingsState()
void FSM::ShowToggleOption(State::SettingsState settingsState, const char* title, uint8_t titleColumn, bool enabled)
{
_state.mainState = State::MainDynoState::SETTINGS_MENU;
_state.settingsState = State::SettingsState::SD_LOGGING_OPTION_DISPLAYED;
_state.settingsState = settingsState;

ClearDisplay();

AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 0, 3, "SD LOGGING", sizeof("SD LOGGING") - 1);

if (_sdLoggingEnabled)
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "ENABLED", sizeof("ENABLED") - 1);
else
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "DISABLED", sizeof("DISABLED") - 1);
WriteLine(0, titleColumn, title);
WriteLine(1, 4, enabled ? "ENABLED" : "DISABLED");
}

void FSM::SDLoggingOptionEditSettingsState()
void FSM::USBLoggingOptionDisplayedSettingsState()
{
_state.mainState = State::MainDynoState::SETTINGS_MENU;
_state.settingsState = State::SettingsState::SD_LOGGING_OPTION_EDIT;

ClearDisplay();

AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 0, 3, "SD LOGGING", sizeof("SD LOGGING") - 1);

if (_sdLoggingEnabled)
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "ENABLED", sizeof("ENABLED") - 1);
else
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "DISABLED", sizeof("DISABLED") - 1);
ShowToggleOption(State::SettingsState::USB_LOGGING_OPTION_DISPLAYED, "USB LOGGING", 2, _usbLoggingEnabled);
}

void FSM::PIDOptionDisplayedSettingsState()
void FSM::SDLoggingOptionDisplayedSettingsState()
{
_state.mainState = State::MainDynoState::SETTINGS_MENU;
_state.settingsState = State::SettingsState::PID_ENABLE_DISPLAYED;

ClearDisplay();

AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 0, 2, "PID LOGGING", sizeof("PID LOGGING") - 1);

if (_pidOptionToggleableEnabled)
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "ENABLED", sizeof("ENABLED") - 1);
else
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "DISABLED", sizeof("DISABLED") - 1);
ShowToggleOption(State::SettingsState::SD_LOGGING_OPTION_DISPLAYED, "SD LOGGING", 3, _sdLoggingEnabled);
}

void FSM::PIDOptionEditSettingsState()
void FSM::PIDOptionDisplayedSettingsState()
{
_state.mainState = State::MainDynoState::SETTINGS_MENU;
_state.settingsState = State::SettingsState::PID_ENABLE_EDIT;

ClearDisplay();

AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 0, 2, "PID LOGGING", sizeof("PID LOGGING") - 1);

if (_pidOptionToggleableEnabled)
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "ENABLED", sizeof("ENABLED") - 1);
else
AddToLumexLCDMessageQueue(WRITE_TO_DISPLAY, 1, 4, "DISABLED", sizeof("DISABLED") - 1);
ShowToggleOption(State::SettingsState::PID_ENABLE_DISPLAYED, "PID LOGGING", 2, _pidOptionToggleableEnabled);
}

void FSM::PIDDesiredRPMOptionDisplayedSettingsState()
Expand Down
Loading
Loading