Skip to content

Commit

Permalink
Fixes for disabling JSONCAN messages/alerts + improve FSM alerts (#1312)
Browse files Browse the repository at this point in the history
Fix my shitty code + add more FSM alerts so they give us more
information about brake OCSC.
  • Loading branch information
gtaharaedmonds authored Jun 11, 2024
1 parent 9010915 commit eee2839
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 46 deletions.
14 changes: 12 additions & 2 deletions can_bus/quadruna/FSM/FSM_alerts.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,17 @@
"id": 315,
"description": "Rear brake pressure out of range."
},
"BrakePressureSensorOCSC": {
"FrontBrakePressureOcSc": {
"id": 316,
"description": "Brake pressure sensor voltage out of acceptable range (OCSC)."
"description": "Front brake pressure sensor voltage out of acceptable range (OCSC)."
},
"RearBrakePressureOcSc": {
"id": 322,
"description": "Rear brake pressure sensor voltage out of acceptable range (OCSC)."
},
"BrakeOcScNotOk": {
"id": 323,
"description": "BRAKE_OCSC_OK line routed to BMS for BSPD is not OK."
},
"LeftSuspensionOCSC": {
"id": 317,
Expand All @@ -77,10 +85,12 @@
"description": "Right suspension sensor voltage out of acceptable range (OCSC)."
},
"LoadCell1OCSC": {
"disabled": true,
"id": 320,
"description": "Load cell 1 sensor voltage out of acceptable range (OCSC)."
},
"LoadCell2OCSC": {
"disabled": true,
"id": 321,
"description": "Load cell 2 sensor voltage out of acceptable range (OCSC)."
}
Expand Down
6 changes: 3 additions & 3 deletions firmware/quadruna/FSM/src/app/app_brake.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void app_brake_broadcast(void)
app_canTx_FSM_RearBrakePressure_set((uint32_t)roundf(rear_pressure));
app_canAlerts_FSM_Warning_RearBrakePressureOutOfRange_set(rear_pressure_status.status != VALUE_IN_RANGE);

const bool brake_pressure_ocsc =
io_brake_frontPressureSensorOCSC() || io_brake_rearPressureSensorOCSC() || io_brake_hwOCSC();
app_canAlerts_FSM_Warning_BrakePressureSensorOCSC_set(brake_pressure_ocsc);
app_canAlerts_FSM_Warning_FrontBrakePressureOcSc_set(io_brake_frontPressureSensorOCSC());
app_canAlerts_FSM_Warning_RearBrakePressureOcSc_set(io_brake_rearPressureSensorOCSC());
app_canAlerts_FSM_Warning_BrakeOcScNotOk_set(io_brake_hwOCSC());
}
4 changes: 2 additions & 2 deletions firmware/quadruna/FSM/src/app/app_loadCell.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ void app_loadCell_broadcast(void)
app_canTx_FSM_LoadCell1_set(io_loadCell_getMechanicalLoad1());
app_canTx_FSM_LoadCell2_set(io_loadCell_getMechanicalLoad2());

app_canAlerts_FSM_Warning_LoadCell1OCSC_set(io_loadCell_sensor1OCSC());
app_canAlerts_FSM_Warning_LoadCell2OCSC_set(io_loadCell_sensor2OCSC());
// app_canAlerts_FSM_Warning_LoadCell1OCSC_set(io_loadCell_sensor1OCSC());
// app_canAlerts_FSM_Warning_LoadCell2OCSC_set(io_loadCell_sensor2OCSC());
}
6 changes: 4 additions & 2 deletions firmware/quadruna/FSM/test/test_app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,12 @@ TEST_F(FsmAppTest, check_brake_can_signals)

// front pressure and rear pressure both cause "pressure OCSC" behaviour
CheckBinaryStatusCanSignal(
fake_io_brake_frontPressureSensorOCSC_returns, app_canAlerts_FSM_Warning_BrakePressureSensorOCSC_get);
fake_io_brake_frontPressureSensorOCSC_returns, app_canAlerts_FSM_Warning_FrontBrakePressureOcSc_get);

CheckBinaryStatusCanSignal(
fake_io_brake_rearPressureSensorOCSC_returns, app_canAlerts_FSM_Warning_BrakePressureSensorOCSC_get);
fake_io_brake_rearPressureSensorOCSC_returns, app_canAlerts_FSM_Warning_RearBrakePressureOcSc_get);

CheckBinaryStatusCanSignal(fake_io_brake_hwOCSC_returns, app_canAlerts_FSM_Warning_BrakeOcScNotOk_get);
}

TEST_F(FsmAppTest, check_steering_angle_can_signals)
Expand Down
62 changes: 31 additions & 31 deletions firmware/quadruna/FSM/test/test_faults.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -267,34 +267,34 @@ TEST_F(FsmFaultsTest, right_suspension_ocsc_sets_warning)
ASSERT_FALSE(app_canAlerts_FSM_Warning_RightSuspensionOCSC_get());
}

TEST_F(FsmFaultsTest, load_cell_1_ocsc_sets_warning)
{
fake_io_loadCell_sensor1OCSC_returns(true);
LetTimePass(10);
ASSERT_TRUE(app_canAlerts_FSM_Warning_LoadCell1OCSC_get());

// Confirm set indefinitely
LetTimePass(1000);
ASSERT_TRUE(app_canAlerts_FSM_Warning_LoadCell1OCSC_get());

// Clear condition, confirm warning resets
fake_io_loadCell_sensor1OCSC_returns(false);
LetTimePass(10);
ASSERT_FALSE(app_canAlerts_FSM_Warning_LoadCell1OCSC_get());
}

TEST_F(FsmFaultsTest, load_cell_2_ocsc_sets_warning)
{
fake_io_loadCell_sensor2OCSC_returns(true);
LetTimePass(10);
ASSERT_TRUE(app_canAlerts_FSM_Warning_LoadCell2OCSC_get());

// Confirm set indefinitely
LetTimePass(1000);
ASSERT_TRUE(app_canAlerts_FSM_Warning_LoadCell2OCSC_get());

// Clear condition, confirm warning resets
fake_io_loadCell_sensor2OCSC_returns(false);
LetTimePass(10);
ASSERT_FALSE(app_canAlerts_FSM_Warning_LoadCell2OCSC_get());
}
// TEST_F(FsmFaultsTest, load_cell_1_ocsc_sets_warning)
// {
// fake_io_loadCell_sensor1OCSC_returns(true);
// LetTimePass(10);
// ASSERT_TRUE(app_canAlerts_FSM_Warning_LoadCell1OCSC_get());

// // Confirm set indefinitely
// LetTimePass(1000);
// ASSERT_TRUE(app_canAlerts_FSM_Warning_LoadCell1OCSC_get());

// // Clear condition, confirm warning resets
// fake_io_loadCell_sensor1OCSC_returns(false);
// LetTimePass(10);
// ASSERT_FALSE(app_canAlerts_FSM_Warning_LoadCell1OCSC_get());
// }

// TEST_F(FsmFaultsTest, load_cell_2_ocsc_sets_warning)
// {
// fake_io_loadCell_sensor2OCSC_returns(true);
// LetTimePass(10);
// ASSERT_TRUE(app_canAlerts_FSM_Warning_LoadCell2OCSC_get());

// // Confirm set indefinitely
// LetTimePass(1000);
// ASSERT_TRUE(app_canAlerts_FSM_Warning_LoadCell2OCSC_get());

// // Clear condition, confirm warning resets
// fake_io_loadCell_sensor2OCSC_returns(false);
// LetTimePass(10);
// ASSERT_FALSE(app_canAlerts_FSM_Warning_LoadCell2OCSC_get());
// }
Original file line number Diff line number Diff line change
Expand Up @@ -446,20 +446,24 @@ def _parse_node_alerts(self, node: str, alerts_json: AlertsJson):
warnings = {
name: alert
for name, alert in alerts_json["warnings"].items()
if self._get_optional_value(data=alert, key="disabled", default=False)
if not self._get_optional_value(data=alert, key="disabled", default=False)[
0
]
}
faults = {
name: alert
for name, alert in alerts_json["faults"].items()
if self._get_optional_value(data=alert, key="disabled", default=False)
if not self._get_optional_value(data=alert, key="disabled", default=False)[
0
]
}

# Number of alerts can't exceed 21. This is because we transmit a "counts" message for faults and warnings
# that indicate the number of times an alert has been set. Each signal is allocated 3 bits, and so can count
# up to 8, meaning we can pack 21 alerts to fit inside a 64-bit CAN payload.
if max(len(warnings), len(faults)) > 21:
raise InvalidCanJson(
f"Number of alerts for node '{node}' cannot exceed 64."
f"Number of alerts for node '{node}' cannot exceed 21."
)

# Check alert messages ID are unique
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,36 @@ class AlertsJson(TypedDict):
alerts_schema = Schema(
Or(
{
Optional("disabled"): bool,
"warnings_id": And(int, lambda x: x >= 0),
"warnings_counts_id": And(int, lambda x: x >= 0),
"faults_id": And(int, lambda x: x >= 0),
"faults_counts_id": And(int, lambda x: x >= 0),
"warnings": Or({}, {str: Or({}, {"id": int, "description": str})}),
"faults": Or({}, {str: Or({}, {"id": int, "description": str})}),
"warnings": Or(
{},
{
str: Or(
{},
{
"id": int,
"description": str,
Optional("disabled"): bool,
},
)
},
),
"faults": Or(
{},
{
str: Or(
{},
{
"id": int,
"description": str,
Optional("disabled"): bool,
},
)
},
),
},
{},
)
Expand Down

0 comments on commit eee2839

Please sign in to comment.