---
# System prepended metadata

title: Status Controller
tags: [NTURT, electrical_system, firmware_hardware]

---

# Status Controller
###### tags: `firmware_hardware` `electrical_system` `NTURT`

## Introduction

Status controller checks if the states of the vehicle fufills **safe** condition and controls the RTD feature required by FSAE rule.

## Status

- Init: Initial state, checking RTD condition.
- Ready: Ready state, waiting RTD command to run.
- RTD: Transition state, playing RTD sound.
- Running: Running state, motor torque enabled.
- Error: Error state, motor torque disabled, error handling.

:::warning
There is currtnely no BMS CAN signal, so following requirements for BMS is ingored for now.
:::

## Safe condition

- APPS signal normal. (Checked by no APPS error handler being called.)
- BSE signal normal. (Checked by no BSE error handler being called.)
- Pedal plausibility ckeck passes.
- Able to send CAN signal. (Checked by no CAN TX timeout error handler being called.)
- Receiving CAN signals from: (Checked by no CAN RX timeout error handler being called.)
    - Inverter
    - BMS
    - Rear box
- Inverter, BMS, rear box status safe.
- Inverter DC bus voltage higher than minium battery voltage.

## RTD

If **Safe Condition** is fufilled, and the vehicle has not yet RTDed:
Check if brake is engaged:

- Yes: Able to RTD, turn on RTD light, when pressed, transition to RTD status.
- No: Blink RTD light.

## Status Flow Chart

```graphviz

digraph status_controller_status_flow {
    graph [fontname="Times"];
    node [shape=ellipse style=filled fontname="Times"];
    edge[fontname=Times];
    
    StatusInit;
    StatusReady;
    StatusRTD[shape=rectangle];
    StatusRunning;
    StatusError;
    
    StatusInit->StatusReady[label="Safe"];
    StatusReady->StatusRTD[label="RTD Button"];
    StatusReady->StatusError[label="Unsafe"];
    StatusRTD->StatusReady[label="Reset"];
    StatusRTD->StatusRunning[label="Finished RTD"];
    StatusRunning->StatusReady[label="Reset"];
    StatusRunning->StatusError[label="Unsafe"];
    StatusError->StatusReady[label="Safe"];
}

```
