Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
06a490f
inverter retry logic for fault handling
setaremalekiii Sep 19, 2025
a245961
adding a fault handling state to the sm
setaremalekiii Sep 27, 2025
b8c5968
moving handling stuff to the state
setaremalekiii Sep 27, 2025
a62d3da
cleaning up
setaremalekiii Oct 3, 2025
0aa7e6f
clean up for build
setaremalekiii Oct 3, 2025
05eadac
formatting
setaremalekiii Oct 3, 2025
f97c565
quick delete
setaremalekiii Oct 3, 2025
af1720e
cleaning up retry
setaremalekiii Oct 4, 2025
66991dd
deleting extra files
setaremalekiii Oct 4, 2025
d26ef3d
adding timer and removing enum
setaremalekiii Oct 5, 2025
d600984
removing all trnsition states to fault retry
setaremalekiii Oct 5, 2025
c6b1809
small changing for build
setaremalekiii Oct 11, 2025
4f7ae4c
adding tests
setaremalekiii Oct 11, 2025
07fa72c
inverter retry logic for fault handling
setaremalekiii Sep 19, 2025
06b20cb
adding a fault handling state to the sm
setaremalekiii Sep 27, 2025
db6548f
moving handling stuff to the state
setaremalekiii Sep 27, 2025
d384d4d
cleaning up
setaremalekiii Oct 3, 2025
22a34e4
clean up for build
setaremalekiii Oct 3, 2025
8a39e75
formatting
setaremalekiii Oct 3, 2025
77f5355
quick delete
setaremalekiii Oct 3, 2025
2167001
cleaning up retry
setaremalekiii Oct 4, 2025
85d4a30
deleting extra files
setaremalekiii Oct 4, 2025
f8eec9a
adding timer and removing enum
setaremalekiii Oct 5, 2025
a063a43
removing all trnsition states to fault retry
setaremalekiii Oct 5, 2025
a587f4f
small changing for build
setaremalekiii Oct 11, 2025
b46b45c
adding tests
setaremalekiii Oct 11, 2025
6475703
merge conflict haha
setaremalekiii Oct 11, 2025
84571e2
Merge branch 'master' into setaremalekiii/inverter_fault_handling
setaremalekiii Oct 12, 2025
939e21f
clean up
setaremalekiii Oct 12, 2025
e6bff2b
inverter retry logic for fault handling
setaremalekiii Sep 19, 2025
7b04e0c
adding a fault handling state to the sm
setaremalekiii Sep 27, 2025
1b41f25
moving handling stuff to the state
setaremalekiii Sep 27, 2025
4ec7589
cleaning up
setaremalekiii Oct 3, 2025
316a26c
clean up for build
setaremalekiii Oct 3, 2025
95debf6
formatting
setaremalekiii Oct 3, 2025
0269cfa
quick delete
setaremalekiii Oct 3, 2025
9b93d4d
cleaning up retry
setaremalekiii Oct 4, 2025
59ce46d
deleting extra files
setaremalekiii Oct 4, 2025
dbcc4f3
adding timer and removing enum
setaremalekiii Oct 5, 2025
28bb5ec
removing all trnsition states to fault retry
setaremalekiii Oct 5, 2025
8c7b16e
small changing for build
setaremalekiii Oct 11, 2025
9c4b782
adding tests
setaremalekiii Oct 11, 2025
9c10e28
inverter retry logic for fault handling
setaremalekiii Sep 19, 2025
75d3eed
adding a fault handling state to the sm
setaremalekiii Sep 27, 2025
ea7abd3
moving handling stuff to the state
setaremalekiii Sep 27, 2025
55ccefb
cleaning up
setaremalekiii Oct 3, 2025
d90399b
clean up for build
setaremalekiii Oct 3, 2025
ea7e3d8
formatting
setaremalekiii Oct 3, 2025
2dd3cb8
cleaning up retry
setaremalekiii Oct 4, 2025
d28e910
deleting extra files
setaremalekiii Oct 4, 2025
0768ee3
adding timer and removing enum
setaremalekiii Oct 5, 2025
d420004
small changing for build
setaremalekiii Oct 11, 2025
9801fba
clean up
setaremalekiii Oct 12, 2025
5fb4f5f
Merge branch 'setaremalekiii/inverter_fault_handling' of https://gith…
setaremalekiii Oct 25, 2025
76f2ac7
Fixing some of the retry logic
setaremalekiii Nov 2, 2025
331228d
formatting
setaremalekiii Nov 2, 2025
6a331b9
suggested changes
setaremalekiii Nov 5, 2025
1881244
final changes
setaremalekiii Nov 10, 2025
9d54b4a
cleaning up
setaremalekiii Nov 10, 2025
64f473c
Merge branch 'master' into setaremalekiii/inverter_fault_handling
setaremalekiii Nov 10, 2025
ae15289
removing nanopb
setaremalekiii Nov 11, 2025
e51858a
CI fix
setaremalekiii Nov 11, 2025
f4d8d23
applying requested changes
setaremalekiii Nov 19, 2025
67a0b46
adding warning handling back
setaremalekiii Nov 22, 2025
4995506
formatting
setaremalekiii Nov 22, 2025
a49f12f
adding logic for state recovering to
setaremalekiii Dec 1, 2025
ddfe399
final changes and formatting
setaremalekiii Dec 1, 2025
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
6 changes: 4 additions & 2 deletions can_bus/quintuna/VC/VC_enum.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"VC_HV_ON_STATE": 5,
"VC_DRIVE_STATE": 6,
"VC_DRIVE_WARNING_STATE": 7,
"VC_FAULT_STATE": 8
"VC_FAULT_STATE": 8,
"VC_INV_FAUTLED": 9
},
"TsimColor": {
"TSIM_RED": 0,
Expand All @@ -28,7 +29,8 @@
"INV_DC_ON":1,
"INV_ENABLE":2,
"INV_INVERTER_ON":3,
"INV_READY_FOR_DRIVE":4
"INV_READY_FOR_DRIVE":4,
"INV_ERROR_RETRY":5
},

"EllipseErrorCode": {
Expand Down
2 changes: 1 addition & 1 deletion firmware/quintuna/VC/src/app/app_faultHandling.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
// function to get all board faults
#include <stdbool.h>

bool app_faultHandling_air_minus_closed(void);
bool app_faultHandling_air_minus_closed(void);
84 changes: 84 additions & 0 deletions firmware/quintuna/VC/src/app/app_inverter.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#include "app_inverter.h"
#include "app_signal.h"
#include "app_canAlerts.h"
#include "app_canRx.h"
#include "app_canTx.h"
#include "states/app_states.h"
#include "io_log.h"

const State *state_to_recover_after_fault;

const InverterHandle inverter_handle_FL = {
.can_enable_inv = app_canTx_VC_INVFLbEnable_set,
.can_invOn = app_canTx_VC_INVFLbInverterOn_set,
.can_dcOn = app_canTx_VC_INVFLbDcOn_set,
.can_error_info = app_canRx_INVFL_ErrorInfo_get,
.error_reset = app_canTx_VC_INVFLbErrorReset_set,
.can_error_bit = app_canRx_INVFL_bError_get,
.can_inv_warning = app_canAlerts_VC_Warning_FrontLeftInverterFault_set,
};
const InverterHandle inverter_handle_FR = {
.can_enable_inv = app_canTx_VC_INVFRbEnable_set,
.can_invOn = app_canTx_VC_INVFRbInverterOn_set,
.can_dcOn = app_canTx_VC_INVFRbDcOn_set,
.can_error_info = app_canRx_INVFR_ErrorInfo_get,
.error_reset = app_canTx_VC_INVFRbErrorReset_set,
.can_error_bit = app_canRx_INVFR_bError_get,
.can_inv_warning = app_canAlerts_VC_Warning_FrontRightInverterFault_set,
};
const InverterHandle inverter_handle_RL = {
.can_enable_inv = app_canTx_VC_INVRLbEnable_set,
.can_invOn = app_canTx_VC_INVRLbInverterOn_set,
.can_dcOn = app_canTx_VC_INVRLbDcOn_set,
.can_error_info = app_canRx_INVRL_ErrorInfo_get,
.error_reset = app_canTx_VC_INVRLbErrorReset_set,
.can_error_bit = app_canRx_INVRL_bError_get,
.can_inv_warning = app_canAlerts_VC_Warning_RearLeftInverterFault_set,
};
const InverterHandle inverter_handle_RR = {
.can_enable_inv = app_canTx_VC_INVRRbEnable_set,
.can_invOn = app_canTx_VC_INVRRbInverterOn_set,
.can_dcOn = app_canTx_VC_INVRRbDcOn_set,
.can_error_info = app_canRx_INVRR_ErrorInfo_get,
.error_reset = app_canTx_VC_INVRRbErrorReset_set,
.can_error_bit = app_canRx_INVRR_bError_get,
.can_inv_warning = app_canAlerts_VC_Warning_RearRightInverterFault_set,
};

bool app_inverter_inverterStatus(void)
{
const bool invrr_error = app_canRx_INVRR_bError_get() == true;
const bool invrl_error = app_canRx_INVRL_bError_get() == true;
const bool invfl_error = app_canRx_INVFL_bError_get() == true;
const bool invfr_error = app_canRx_INVFR_bError_get() == true;

app_canAlerts_VC_Warning_RearLeftInverterFault_set(invrl_error);
app_canAlerts_VC_Warning_FrontRightInverterFault_set(invfr_error);
app_canAlerts_VC_Warning_FrontLeftInverterFault_set(invfl_error);
app_canAlerts_VC_Warning_RearRightInverterFault_set(invrr_error);

return invfl_error || invrl_error || invrr_error || invfr_error;
}

void app_stateMachine_inverterFaultHandling(void)
{
const State *curr = app_stateMachine_getCurrentState();

if (!app_inverter_inverterStatus() || curr == &inverter_fault_handling_state)
{
return;
}

// We do not want to go back to HV or Drive while we haven't passed HV_INIT again
if (curr == &hv_state || curr == &drive_state)
{
state_to_recover_after_fault = &hvInit_state;
}
else
{
state_to_recover_after_fault = curr;
}

LOG_INFO("inverter state in appinv %s", state_to_recover_after_fault->name);
app_stateMachine_setNextState(&inverter_fault_handling_state);
}
45 changes: 45 additions & 0 deletions firmware/quintuna/VC/src/app/app_inverter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#pragma once
#include "stdbool.h"
#include <stdint.h>
#include "app_stateMachine.h"

extern const State *state_to_recover_after_fault;
typedef enum
{
CAN_ISSUES = 3587,
DC_BUS_ISSUES,
} Inverter_Fault_Info;
typedef enum
{
INVERTER_FL,
INVERTER_FR,
INVERTER_RL,
INVERTER_RR,
NUM_INVERTERS
} InverterConfig;

typedef enum
{
INV_FAULT_RETRY,
INV_FAULT_LOCKOUT,
INV_FAULT_RECOVERED,
} VCInverterFaults;
typedef struct
{
void (*can_enable_inv)(bool);
void (*can_invOn)(bool);
void (*can_dcOn)(bool);
uint32_t (*can_error_info)(void);
void (*error_reset)(bool);
bool (*can_error_bit)(void);
void (*can_inv_warning)(bool);
} InverterHandle;

extern const InverterHandle inverter_handle_FL;
extern const InverterHandle inverter_handle_FR;
extern const InverterHandle inverter_handle_RL;
extern const InverterHandle inverter_handle_RR;

// inverters
bool app_inverter_inverterStatus(void);
void app_stateMachine_inverterFaultHandling(void);
76 changes: 3 additions & 73 deletions firmware/quintuna/VC/src/app/app_warningHandling.c
Original file line number Diff line number Diff line change
@@ -1,81 +1,21 @@
#include "app_warningHandling.h"

#include "app_warningHandling.h"
#include "app_signal.h"

#include "app_canAlerts.h"
#include "app_canRx.h"
#include "app_canTx.h"

#include <stdbool.h>
#include <stdint.h>

#define APPS_BRAKE_DISAGREEMENT_TIME_TO_FAULT (10u)
#define APPS_BRAKE_DISAGREEMENT_TIME_TO_CLEAR (10u)

static Signal apps_brake_disagreement_signal;
typedef enum
{
INVERTER_FL,
INVERTER_FR,
INVERTER_RL,
INVERTER_RR,
NUM_INVERTERS
} InverterConfig;

bool app_warningHandling_boardWarningCheck(void)
bool app_warningHandlin_boardWarningCheck(void)
{
return app_canAlerts_AnyBoardHasWarning();
}

typedef struct
{
void (*can_enable_inv)(bool);
void (*can_invOn)(bool);
void (*can_dcOn)(bool);
uint32_t (*can_error_info)(void);
void (*error_reset)(bool);
} InverterWarningHandling;

static InverterWarningHandling inverter_reset_handle[NUM_INVERTERS] = {
[INVERTER_FL] = { .can_enable_inv = app_canTx_VC_INVFLbEnable_set,
.can_invOn = app_canTx_VC_INVFLbInverterOn_set,
.can_dcOn = app_canTx_VC_INVFLbDcOn_set,
.can_error_info = app_canRx_INVFL_ErrorInfo_get,
.error_reset = app_canTx_VC_INVFLbErrorReset_set },
[INVERTER_FR] = { .can_enable_inv = app_canTx_VC_INVFRbEnable_set,
.can_invOn = app_canTx_VC_INVFRbInverterOn_set,
.can_dcOn = app_canTx_VC_INVFRbDcOn_set,
.can_error_info = app_canRx_INVFR_ErrorInfo_get,
.error_reset = app_canTx_VC_INVFRbErrorReset_set },
[INVERTER_RL] = { .can_enable_inv = app_canTx_VC_INVRLbEnable_set,
.can_invOn = app_canTx_VC_INVRLbInverterOn_set,
.can_dcOn = app_canTx_VC_INVRLbDcOn_set,
.can_error_info = app_canRx_INVRL_ErrorInfo_get,
.error_reset = app_canTx_VC_INVRLbErrorReset_set },
[INVERTER_RR] = { .can_enable_inv = app_canTx_VC_INVRRbEnable_set,
.can_invOn = app_canTx_VC_INVRRbInverterOn_set,
.can_dcOn = app_canTx_VC_INVRRbDcOn_set,
.can_error_info = app_canRx_INVRR_ErrorInfo_get,
.error_reset = app_canTx_VC_INVRRbErrorReset_set },
};

bool app_warningHandling_inverterStatus(void)
{
const bool invrr_error = app_canRx_INVRR_bError_get() == true;
const bool invrl_error = app_canRx_INVRL_bError_get() == true;
const bool invfl_error = app_canRx_INVFL_bError_get() == true;
const bool invfr_error = app_canRx_INVFR_bError_get() == true;

app_canAlerts_VC_Warning_RearLeftInverterFault_set(invrl_error);
app_canAlerts_VC_Warning_FrontRightInverterFault_set(invrr_error);
app_canAlerts_VC_Warning_FrontLeftInverterFault_set(invfl_error);
app_canAlerts_VC_Warning_RearRightInverterFault_set(invfr_error);

return invfl_error || invrl_error || invrr_error || invfr_error;
}

// TODO: integrate with warnings (will have to make compatible with regen)
bool app_warningHandling_checkSoftwareBspd(float papps_pedal_percentage)
bool app_warningHandlin_checkSoftwareBspd(float papps_pedal_percentage)
{
// Accelerator Brake Plausibility (bad user input safety issues)
// Protect against brake/apps active at same time
Expand All @@ -95,16 +35,6 @@ bool app_warningHandling_checkSoftwareBspd(float papps_pedal_percentage)
return apps_brake_disagreement_active;
}

void app_warningHandling_inverterReset(void)
{
for (uint8_t inverter = 0; inverter < NUM_INVERTERS; inverter++)
{
inverter_reset_handle[inverter].can_invOn(false);
inverter_reset_handle[inverter].can_dcOn(false);
inverter_reset_handle[inverter].can_enable_inv(false);
inverter_reset_handle[inverter].error_reset(true);
}
}
void app_softwareBspd_init(void)
{
app_signal_init(
Expand Down
18 changes: 4 additions & 14 deletions firmware/quintuna/VC/src/app/app_warningHandling.h
Original file line number Diff line number Diff line change
@@ -1,19 +1,9 @@
#pragma once
#include "stdbool.h"

typedef enum
{
CAN_ISSUES = 3587,
DC_BUS_ISSUES,
} Inverter_Fault_Info;

// board warnings
bool app_warningHandling_boardWarningCheck(void);

// inverters
bool app_warningHandling_inverterStatus(void);
void app_warningHandling_inverterReset(void);
#include <stdint.h>

// bspd
void app_softwareBspd_init(void);
bool app_warningHandling_checkSoftwareBspd(float papps_pedal_percentage);
bool app_warningHandlin_checkSoftwareBspd(float papps_pedal_percentage);
// board warnings
bool app_warningHandlin_boardWarningCheck(void);
Loading
Loading