Skip to content

State Machine

BL-CZY edited this page Sep 3, 2026 · 3 revisions

Flow

The state machine running on the telemetry board follows this sequence of actions

flowchart TD
  idle["`IdleState`"]
  precharge["Precharge"]
  readyForPropulsion["ReadyForPropulsion"]
  accelerate["Accelerate"]
  brake["Brake"]
  stopped["Stopped"]
  emergency["Emergency"]
  setupMotor["SetupMotor"]

  emergencyStopOperatorCommand{{"`Received **Emergency stop**`"}}
  idleOperatorCommand{{"Received Force transition to idle"}}
  prechargeOperatorCommand{{"`Received **PrechargeOperatorCommand**: Idle -> SetupMotor`"}}
  accelerateOperatorCommand{{"Received AccelerateOperatorCommand: ReadyForPropulsion -> Accelerate"}}
  brakeOperatorCommand{{"Received BrakeOperatorCommand: Accelerate -> Brake"}}
  startRunOperatorCommand{{"Received StartRunOperatorCommand: SetupMotor -> Precharge"}}
  readyForPropulsionOperatorCommand{{"Received ReadyForPropulsionOperatorCommand: Precharge -> ReadyForPropulsion"}}

  idle2(["`Received *BrakesClamped*`"])
  idle1(["`Sent *OpenPrechargeRelaysCommand* and *ClampBrakesCommand*`"])

  setupMotor1(["`Received *BatteryPrechargeRelayOpen*`"])
  setupMotor2(["`Received *MotorControllerRelayOpen*`"])
  setupMotor3(["`Sent *MotorControllerSetupCommand*`"])
  setupMotor4(["`Received *MotorControllerSetupComplete*`"])

  precharge1(["`Sent *StartPrechargeCommand*`"])
  precharge2(["`Received *PrechargeVoltageOK*`"])
  precharge3(["`Received *PrechargeComplete*`"])

  precharge4dot0(["`set precharge_step to PrechargeStep::Initial`"])
  precharge4(["`Received *ShutdownCircuitryRelayClosed*`"])
  precharge4dot1(["`set precharge_step to ShutdownClosed`"])
  precharge5(["`Received *BatteryPrechargeRelayClosed*`"])
  precharge5dot1(["`set precharge_step to BatteryPrechargeClosed`"])
  precharge6(["`Received *MotorControllerRelayClosed*`"])
  precharge6dot1(["`set precharge_step to *AllClosed*`"])

  readyForPropulsion1(["`Sent *MotorControllerSetOperationalCommand*`"])
  readyForPropulsion2(["`Received *MotorControllerOperational*`"])
  readyForPropulsion3(["`Sent *UnclampBrakesCommand*`"])
  readyForPropulsion4(["`Received *BrakesUnclamped*`"])

  accelerate1(["`Received *EndOfTrackBrakeCommand*`"]);
  brake1(["`Received *PropulsionStatus* and velocity is 0`"])

  classDef opCmd stroke:#bc8cff;
  class prechargeOperatorCommand,emergencyStopOperatorCommand,idleOperatorCommand,accelerateOperatorCommand,brakeOperatorCommand,startRunOperatorCommand,readyForPropulsionOperatorCommand opCmd;
  classDef state stroke:#56d364;
  class idle,precharge,readyForPropulsion,accelerate,brake,stopped,emergency,setupMotor state
  classDef recv stroke:#79c0ff;
  class idle2,setupMotor1,setupMotor2,setupMotor4,precharge2,precharge3,precharge4,precharge5,precharge6,readyForPropulsion2,readyForPropulsion4,accelerate1,brake1 recv;

  idle-->idle1
  idle2-->prechargeOperatorCommand
  idle1-->idle2
  prechargeOperatorCommand-->setupMotor

  setupMotor-->|AND|setupMotor1
  setupMotor-->|AND|setupMotor2
  setupMotor1-->setupMotor3
  setupMotor2-->setupMotor3
  setupMotor3-->setupMotor4
  setupMotor4-->startRunOperatorCommand
  startRunOperatorCommand-->precharge
  
  precharge-->precharge1
  precharge1-->|AND|precharge4dot0-->precharge4-->precharge4dot1-->precharge5-->precharge5dot1-->precharge6-->precharge6dot1-->readyForPropulsionOperatorCommand
  precharge1-->|AND|precharge2-->readyForPropulsionOperatorCommand
  precharge1-->|AND|precharge3-->readyForPropulsionOperatorCommand
  readyForPropulsionOperatorCommand-->readyForPropulsion

  readyForPropulsion-->readyForPropulsion1-->readyForPropulsion2-->readyForPropulsion3-->readyForPropulsion4-->accelerateOperatorCommand-->accelerate

  accelerate-->|OR|brakeOperatorCommand-->brake
  accelerate-->|OR|accelerate1-->brake

  brake-->brake1-->stopped
  emergencyStopOperatorCommand-->emergency
  idleOperatorCommand-->a(["Send Idle state and go to idle"])
Loading

Clone this wiki locally