diff --git a/Frontend/src/Components/Faults/FaultsView.js b/Frontend/src/Components/Faults/FaultsView.js
index 06afa925..320d02fa 100644
--- a/Frontend/src/Components/Faults/FaultsView.js
+++ b/Frontend/src/Components/Faults/FaultsView.js
@@ -1,10 +1,10 @@
-import {Box, Tooltip, Image, SimpleGrid, useColorMode} from "@chakra-ui/react";
+import {Box, Tooltip, Image, SimpleGrid, Center, useColorMode} from "@chakra-ui/react";
import { FaultsViewImages } from "./Images/Images";
import CONSTANTS from "../../data-constants.json";
export default function Faults(props) {
const fitType = "scale-down";
- const imageHeight = "7vh";
+ const imageHeight = "5vh";
const { colorMode } = useColorMode();
@@ -23,7 +23,7 @@ export default function Faults(props) {
*/
const _checkBooleanData = (dataLabel) => {
return (
- (props.data?.[dataLabel][0] ?? CONSTANTS[dataLabel].MIN) !==
+ (props.data?.[dataLabel][0] ?? CONSTANTS[dataLabel].MIN) !=
CONSTANTS[dataLabel].MIN
);
};
@@ -89,47 +89,153 @@ export default function Faults(props) {
};
/**
- * Checks all of the BMS failsafe statuses.
+ * Checks all of the BMS failure statuses.
*
- * @returns {boolean} true if any of the BMS failsafe statuses are true; false otherwise
+ * @returns {boolean} true if any of the BMS failure statuses are true; false otherwise
*/
- const checkBMSFailsafes = () => {
+ const checkBMSFailures = () => {
return (
_checkBooleanData("voltage_failsafe") ||
_checkBooleanData("current_failsafe") ||
+ _checkBooleanData("relay_failsafe") ||
+ _checkBooleanData("cell_balancing_active") ||
+ _checkBooleanData("charge_interlock_failsafe") ||
+ _checkBooleanData("thermistor_b_value_table_invalid") ||
_checkBooleanData("input_power_supply_failsafe") ||
- _checkBooleanData("relay_failsafe")
+ _checkBooleanData("discharge_limit_enforcement_fault") ||
+ _checkBooleanData("charger_safety_relay_fault") ||
+ _checkBooleanData("internal_hardware_fault") ||
+ _checkBooleanData("internal_heatsink_fault") ||
+ _checkBooleanData("internal_software_fault") ||
+ _checkBooleanData("highest_cell_voltage_too_high_fault") ||
+ _checkBooleanData("lowest_cell_voltage_too_low_fault") ||
+ _checkBooleanData("pack_too_hot_fault") ||
+ _checkBooleanData("internal_communication_fault") ||
+ _checkBooleanData("cell_balancing_stuck_off_fault") ||
+ _checkBooleanData("weak_cell_fault") ||
+ _checkBooleanData("low_cell_voltage_fault") ||
+ _checkBooleanData("open_wiring_fault") ||
+ _checkBooleanData("current_sensor_fault") ||
+ _checkBooleanData("highest_cell_voltage_over_5V_fault") ||
+ _checkBooleanData("cell_asic_fault") ||
+ _checkBooleanData("weak_pack_fault") ||
+ _checkBooleanData("fan_monitor_fault") ||
+ _checkBooleanData("thermistor_fault") ||
+ _checkBooleanData("external_communication_fault") ||
+ _checkBooleanData("redundant_power_supply_fault") ||
+ _checkBooleanData("high_voltage_isolation_fault") ||
+ _checkBooleanData("input_power_supply_fault") ||
+ _checkBooleanData("charge_limit_enforcement_fault")
);
};
/**
- * Creates a string of all BMS failsafes that have been triggered
+ * Creates a string of all BMS failures that have been triggered
*
- * @returns {string|*} A string listing all of the BMS failsafes that are currently triggered
+ * @returns {string|*} A string listing all of the BMS failures that are currently triggered
*/
- const getBMSFailsafeString = () => {
- let failsafeStrings = [];
+ const getBMSFailureString = () => {
+ let failureStrings = [];
- // Add any triggered BMS failsafes to failsafeStrings
- // The first element pushed to failsafeStrings/added to the list of failsafes should be capitalized, and any
+ // Add any triggered BMS failures to failureStrings
+ // The first element pushed to failureStrings/added to the list of failures should be capitalized, and any
// additional failsafes should not be capitalized
if (_checkBooleanData("voltage_failsafe")) {
- failsafeStrings.push("Voltage");
+ failureStrings.push("Voltage failsafe");
}
if (_checkBooleanData("current_failsafe")) {
- failsafeStrings.push(
- failsafeStrings.length === 0 ? "Current" : "current"
- );
+ failureStrings.push(failureStrings.length === 0 ? "Current failsafe" : "current failsafe");
+ }
+ if (_checkBooleanData("relay_failsafe")) {
+ failureStrings.push(failureStrings.length === 0 ? "Relay failsafe" : "relay failsafe");
+ }
+ if (_checkBooleanData("cell_balancing_active")) {
+ failureStrings.push(failureStrings.length === 0 ? "Cell balancing inactive" : "cell balancing inactive");
+ }
+ if (_checkBooleanData("charge_interlock_failsafe")) {
+ failureStrings.push(failureStrings.length === 0 ? "Charge interlock failsafe" : "charge interlock failsafe");
+ }
+ if (_checkBooleanData("thermistor_b_value_table_invalid")) {
+ failureStrings.push(failureStrings.length === 0 ? "Thermistor B-value table invalid" : "thermistor B-value table invalid");
}
if (_checkBooleanData("input_power_supply_failsafe")) {
- failsafeStrings.push(failsafeStrings.length === 0 ? "Supply" : "supply");
+ failureStrings.push(failureStrings.length === 0 ? "Input power supply failsafe" : "input power supply failsafe");
}
- if (_checkBooleanData("relay_failsafe")) {
- failsafeStrings.push(failsafeStrings.length === 0 ? "Relay" : "relay");
+ if (_checkBooleanData("discharge_limit_enforcement_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Discharge limit enforcement fault" : "discharge limit enforcement fault");
+ }
+ if (_checkBooleanData("charger_safety_relay_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Charger safety relay fault" : "charger safety relay fault");
+ }
+ if (_checkBooleanData("internal_hardware_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Internal hardware fault" : "internal hardware fault");
+ }
+ if (_checkBooleanData("internal_heatsink_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Internal heatsink fault" : "internal heatsink fault");
+ }
+ if (_checkBooleanData("internal_software_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Internal software fault" : "internal software fault");
+ }
+ if (_checkBooleanData("highest_cell_voltage_too_high_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Highest cell voltage too high fault" : "highest cell voltage too high fault");
+ }
+ if (_checkBooleanData("lowest_cell_voltage_too_low_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Lowest cell voltage too low fault" : "lowest cell voltage too low fault");
+ }
+ if (_checkBooleanData("pack_too_hot_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Pack too hot fault" : "pack too hot fault");
+ }
+ if (_checkBooleanData("internal_communication_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Internal communication fault" : "internal communication fault");
+ }
+ if (_checkBooleanData("cell_balancing_stuck_off_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Cell balancing stuck off fault" : "cell balancing stuck off fault");
+ }
+ if (_checkBooleanData("weak_cell_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Weak cell fault" : "weak cell fault");
+ }
+ if (_checkBooleanData("low_cell_voltage_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Low cell voltage fault" : "low cell voltage fault");
+ }
+ if (_checkBooleanData("open_wiring_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Open wiring fault" : "open wiring fault");
+ }
+ if (_checkBooleanData("current_sensor_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Current sensor fault" : "current sensor fault");
+ }
+ if (_checkBooleanData("highest_cell_voltage_over_5V_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Highest cell voltage over 5V fault" : "highest cell voltage over 5V fault");
+ }
+ if (_checkBooleanData("cell_asic_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Cell ASIC fault" : "cell ASIC fault");
+ }
+ if (_checkBooleanData("weak_pack_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Weak pack fault" : "weak pack fault");
+ }
+ if (_checkBooleanData("fan_monitor_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Fan monitor fault" : "fan monitor fault");
+ }
+ if (_checkBooleanData("thermistor_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Thermistor fault" : "thermistor fault");
+ }
+ if (_checkBooleanData("external_communication_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "External communication fault" : "external communication fault");
+ }
+ if (_checkBooleanData("redundant_power_supply_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Redundant power supply fault" : "redundant power supply fault");
+ }
+ if (_checkBooleanData("high_voltage_isolation_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "High voltage isolation fault" : "high voltage isolation fault");
+ }
+ if (_checkBooleanData("input_power_supply_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Input power supply fault" : "input power supply fault");
+ }
+ if (_checkBooleanData("charge_limit_enforcement_fault")) {
+ failureStrings.push(failureStrings.length === 0 ? "Charge limit enforcement fault" : "charge limit enforcement fault");
}
- // Create and return a formatted string containing a list of the triggered BMS failsafes
- return _formFaultString(failsafeStrings, " failsafe", " failsafes");
+ // Create and return a formatted string containing a list of the triggered BMS failures
+ return _formFaultString(failureStrings, " occurred", " occurred");
};
/**
@@ -141,19 +247,32 @@ export default function Faults(props) {
return (
props.data?.motor_temp[0] > CONSTANTS.motor_temp.MAX ||
props.data?.motor_temp[0] < CONSTANTS.motor_temp.MIN ||
+ props.data?.motor_controller_temp[0] > CONSTANTS.motor_controller_temp.MAX ||
+ props.data?.motor_controller_temp[0] < CONSTANTS.motor_controller_temp.MIN ||
+ props.data?.dcdc_temp[0] > CONSTANTS.dcdc_temp.MAX ||
+ props.data?.dcdc_temp[0] < CONSTANTS.dcdc_temp.MIN ||
props.data?.driverIO_temp[0] > CONSTANTS.driverIO_temp.MAX ||
props.data?.driverIO_temp[0] < CONSTANTS.driverIO_temp.MIN ||
props.data?.mainIO_temp[0] > CONSTANTS.mainIO_temp.MAX ||
props.data?.mainIO_temp[0] < CONSTANTS.mainIO_temp.MIN ||
props.data?.cabin_temp[0] > CONSTANTS.cabin_temp.MAX ||
props.data?.cabin_temp[0] < CONSTANTS.cabin_temp.MIN ||
+ props.data?.road_temp[0] > CONSTANTS.road_temp.MAX ||
+ props.data?.road_temp[0] < CONSTANTS.road_temp.MIN ||
+ props.data?.brake_temp[0] > CONSTANTS.brake_temp.MAX ||
+ props.data?.brake_temp[0] < CONSTANTS.brake_temp.MIN ||
+ props.data?.air_temp[0] > CONSTANTS.air_temp.MAX ||
+ props.data?.air_temp[0] < CONSTANTS.air_temp.MIN ||
props.data?.string1_temp[0] > CONSTANTS.string1_temp.MAX ||
props.data?.string1_temp[0] < CONSTANTS.string1_temp.MIN ||
props.data?.string2_temp[0] > CONSTANTS.string2_temp.MAX ||
props.data?.string2_temp[0] < CONSTANTS.string2_temp.MIN ||
props.data?.string3_temp[0] > CONSTANTS.string3_temp.MAX ||
props.data?.string3_temp[0] < CONSTANTS.string3_temp.MIN ||
- props.data?.pack_temp[0] > CONSTANTS.pack_temp.MAX
+ props.data?.pack_temp[0] < CONSTANTS.pack_temp.MIN ||
+ props.data?.pack_temp[0] > CONSTANTS.pack_temp.MAX ||
+ props.data?.pack_internal_temp[0] < CONSTANTS.pack_internal_temp.MIN ||
+ props.data?.pack_internal_temp[0] > CONSTANTS.pack_internal_temp.MAX
);
};
@@ -217,6 +336,20 @@ export default function Faults(props) {
"Motor",
"motor"
);
+ _updateTempArrays(
+ lowTempStrings,
+ highTempStrings,
+ "motor_controller_temp",
+ "Motor controller",
+ "motor controller"
+ );
+ _updateTempArrays(
+ lowTempStrings,
+ highTempStrings,
+ "dcdc_temp",
+ "DCDC",
+ "DCDC"
+ );
_updateTempArrays(
lowTempStrings,
highTempStrings,
@@ -238,6 +371,27 @@ export default function Faults(props) {
"Cabin",
"cabin"
);
+ _updateTempArrays(
+ lowTempStrings,
+ highTempStrings,
+ "road_temp",
+ "Road",
+ "road"
+ );
+ _updateTempArrays(
+ lowTempStrings,
+ highTempStrings,
+ "brake_temp",
+ "Brake",
+ "brake"
+ );
+ _updateTempArrays(
+ lowTempStrings,
+ highTempStrings,
+ "air_temp",
+ "Air",
+ "air"
+ );
_updateTempArrays(
lowTempStrings,
highTempStrings,
@@ -259,11 +413,20 @@ export default function Faults(props) {
"Cell string 3",
"cell string 3"
);
- if (props.data?.pack_temp[0] > CONSTANTS.pack_temp.MAX) {
- highTempStrings.push(
- highTempStrings.length === 0 ? "Battery pack" : "battery pack"
- );
- }
+ _updateTempArrays(
+ lowTempStrings,
+ highTempStrings,
+ "pack_temp",
+ "Battery pack",
+ "battery pack"
+ );
+ _updateTempArrays(
+ lowTempStrings,
+ highTempStrings,
+ "pack_internal_temp",
+ "Internal pack",
+ "internal pack"
+ );
// Create formatted strings containing lists of items with high and low temperatures
const highTempString = _formFaultString(highTempStrings, " temp", " temps");
@@ -274,196 +437,406 @@ export default function Faults(props) {
<>
{highTempString !== "" ? (
<>
- High: {highTempString}
+ High: {highTempString}
+
+ >
+ ) : (
+ ""
+ )}
+ {lowTempString !== "" ? (
+ <>
+ Low: {lowTempString}
+ >
+ ) : (
+ ""
+ )}
+ >
+ );
+ };
+
+ const getHeartbeatString = () => {
+ let heartbeatStrings = [];
+
+ // Add any failing heartbeats
+ if (_checkBooleanData("mainIO_heartbeat")) {
+ heartbeatStrings.push("Main IO");
+ }
+ if (_checkBooleanData("mppt_can_heartbeat")) {
+ heartbeatStrings.push("MPPT CAN");
+ }
+ if (_checkBooleanData("mcc_can_heartbeat")) {
+ heartbeatStrings.push("MCC CAN");
+ }
+ if (_checkBooleanData("bms_can_heartbeat")) {
+ heartbeatStrings.push("BMS CAN");
+ }
+
+ // Create and return a formatted string containing a list of heartbeat failures
+ return _formFaultString(
+ heartbeatStrings,
+ " heartbeat was not detected",
+ " heartbeats were not detected"
+ );
+ };
+
+ const getMCUString = () => {
+ let MCUStrings = [];
+
+ if (_checkBooleanData("mcu_check")) {
+ MCUStrings.push("MCU check");
+ }
+ if (_checkBooleanData("mcu_stat_fdbk")) {
+ MCUStrings.push("MCU status feedback");
+ }
+ if (_checkBooleanData("mcu_hv_en")) {
+ MCUStrings.push("MCU HV enable");
+ }
+
+ // Create and return a formatted string containing a list of MCU errors
+ return _formFaultString(
+ MCUStrings,
+ " error was found",
+ " errors were found"
+ );
+ };
+
+ const getMainDriverPowerString = () => {
+ let mainDriverPowerStrings = [];
+
+ // Add any erroneous main or driver power values to the tooltip
+ // The first element pushed should be capitalized, and any additional
+ // parts of the string should not be
+ if (_checkBooleanData("main_power_warning")) {
+ mainDriverPowerStrings.push("Main power warning");
+ }
+ if (_checkBooleanData("main_power_critical")) {
+ mainDriverPowerStrings.push(mainDriverPowerStrings.length === 0 ? "Main power critical" : "main power critical");
+ }
+ if (_checkBooleanData("main_power_valid")) {
+ mainDriverPowerStrings.push(mainDriverPowerStrings.length === 0 ? "Main power invalid" : "main power invalid");
+ }
+ if (_checkBooleanData("driver_power_warning")) {
+ mainDriverPowerStrings.push(mainDriverPowerStrings.length === 0 ? "Driver power warning" : "driver power warning");
+ }
+ if (_checkBooleanData("driver_power_critical")) {
+ mainDriverPowerStrings.push(mainDriverPowerStrings.length === 0 ? "Driver power critical" : "driver power critical");
+ }
+ if (_checkBooleanData("driver_power_valid")) {
+ mainDriverPowerStrings.push(mainDriverPowerStrings.length === 0 ? "Driver power invalid" : "driver power invalid");
+ }
+
+ // Create and return a formatted string containing a list of board power errors
+ return _formFaultString(
+ mainDriverPowerStrings,
+ " error was found",
+ " errors were found"
+ );
+ };
+
+ const getMotorControllerString = () => {
+ let motorControllerString;
+
+ /**
+ * Generates a string correlating an overheating status to the actual temperature value and
+ * displays the action that the motor controller is taking in response
+ */
+ const getTempActionString = () => {
+ let motorControllerTemperature = props.data?.motor_controller_temp[0];
+ let overheatAction = "";
+ if (motorControllerTemperature >= 105) {
+ overheatAction = "drive will stop";
+ } else if (motorControllerTemperature >= 95) {
+ overheatAction = "controller will reduce power to 1/4";
+ } else if (motorControllerTemperature >= 85) {
+ overheatAction = "controller will reduce power to 1/2"
+ } else {
+ overheatAction = "no action taken";
+ }
+ return "MC temp: " + motorControllerTemperature + " -> " + overheatAction;
+ }
+
+ // Set the motor controller status issue for the tooltip
+ switch(props.data?.mc_status[0]) {
+ case 0:
+ // Non-error code. Pass
+ break;
+ case 1:
+ motorControllerString = "Over current (motor or battery current too high)";
+ break;
+ case 2:
+ motorControllerString = "Unused error code 2, possibly 'Over current (motor or battery current too high)' or 'Hole sensor fault'";
+ break;
+ case 3:
+ motorControllerString = "Hole sensor fault";
+ break;
+ case 4:
+ motorControllerString = "Motor locked";
+ break;
+ case 5:
+ motorControllerString = "Sensor fault 1 (current sensor, thermistor, voltage sensor)";
+ break;
+ case 6:
+ motorControllerString = "Sensor fault 2 (accelerator voltage out of range)";
+ break;
+ case 7:
+ motorControllerString = "Unused error code 7, possibly 'Sensor fault 2 (accelerator voltage out of range)' or 'High battery voltage'";
+ break;
+ case 8:
+ motorControllerString = "High battery voltage";
+ break;
+ case 9:
+ motorControllerString = "Controller overheating (" + getTempActionString() + ")";
+ break;
+ default:
+ motorControllerString = "Controller overheating (error code " + props.data?.mc_status[0] + ", " + getTempActionString() + ")";
+ break;
+ }
+
+ // Create and return a string indicating the motor controller error
+ return motorControllerString;
+ };
+
+ const checkCellGroupVoltages = () => {
+ for (let i = 1; i < 32; i++) {
+ if (props.data?.[`cell_group${i}_voltage`][0] < CONSTANTS[`cell_group${i}_voltage`].MIN
+ || props.data?.[`cell_group${i}_voltage`][0] > CONSTANTS[`cell_group${i}_voltage`].MAX) {
+ return true;
+ }
+ }
+ };
+
+ const getCellGroupVoltageString = () => {
+ let highCellGroupVoltageStrings = [];
+ let lowCellGroupVoltageStrings = [];
+
+ for (let i = 1; i < 32; i++) {
+ if (props.data?.[`cell_group${i}_voltage`][0] > CONSTANTS[`cell_group${i}_voltage`].MAX) {
+ highCellGroupVoltageStrings.push(i);
+ } else if (props.data?.[`cell_group${i}_voltage`][0] < CONSTANTS[`cell_group${i}_voltage`].MIN) {
+ lowCellGroupVoltageStrings.push(i);
+ }
+ }
+
+ // Create formatted strings containing lists of cell groups with high and low voltages
+ const highCellGroupVoltageString = highCellGroupVoltageStrings.length === 0 ?
+ "" : "Cell group " + _formFaultString(highCellGroupVoltageStrings, " voltage", " voltages");
+ const lowCellGroupVoltageString = lowCellGroupVoltageStrings.length === 0 ?
+ "" : "Cell group " + _formFaultString(lowCellGroupVoltageStrings, " voltage", " voltages");
+
+ // Add each string to its own line (if the string is not empty) and return the resulting lines for the tooltip
+ return (
+ <>
+ {highCellGroupVoltageString !== "" ? (
+ <>
+ High: {highCellGroupVoltageString}
>
) : (
""
)}
- {lowTempString !== "" ? "Low: " + lowTempString : ""}
+ {lowCellGroupVoltageString !== "" ? (
+ <>
+ Low: {lowCellGroupVoltageString}
+ >
+ ) : (
+ ""
+ )}
>
);
};
return (
-
- {_checkBooleanData("mppt_contactor") ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("low_contactor") ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("motor_controller_contactor") ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("driver_eStop") ||
- _checkBooleanData("external_eStop") ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("door") ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("crash") ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("mcu_check") ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("imd_status") ? (
-
-
-
- ) : (
-
- )}
- {checkBMSFailsafes() ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("bps_fault") ? (
-
-
-
- ) : (
-
- )}
- {props.data?.soc[0] < CONSTANTS.soc.MIN ? (
-
-
-
- ) : (
-
- )}
- {props.data?.mppt_current_out[0] > CONSTANTS.mppt_current_out.MAX ? (
-
-
-
- ) : props.data?.mppt_current_out[0] < CONSTANTS.mppt_current_out.MIN ? (
-
-
-
- ) : (
-
- )}
- {props.data?.pack_current[0] > CONSTANTS.pack_current.MAX ? (
-
-
-
- ) : props.data?.pack_current[0] < CONSTANTS.pack_current.MIN ? (
-
-
-
- ) : (
-
- )}
- {props.data?.pack_voltage[0] > CONSTANTS.pack_voltage.MAX ? (
-
-
-
- ) : props.data?.pack_voltage[0] < CONSTANTS.pack_voltage.MIN ? (
-
-
-
- ) : (
-
- )}
- {!(props.data?.solar_car_connection[0] ?? false) ? (
-
-
-
- ) : (
-
- )}
- {_checkBooleanData("mainIO_heartbeat") ? (
-
-
-
- ) : (
-
- )}
- {props.data?.bms_input_voltage[0] > CONSTANTS.bms_input_voltage.MAX ? (
-
-
-
- ) : props.data?.bms_input_voltage[0] < CONSTANTS.bms_input_voltage.MIN ? (
-
-
-
- ) : (
-
- )}
- {checkTemps() ? (
-
-
-
- ) : (
+
+
+ {!(props.data?.solar_car_connection[0] ?? false) ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("mainIO_heartbeat")
+ || _checkBooleanData("mppt_can_heartbeat")
+ || _checkBooleanData("mcc_can_heartbeat")
+ || _checkBooleanData("bms_can_heartbeat") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("mppt_contactor") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("low_contactor") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("motor_controller_contactor") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("crash") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("mcu_check")
+ || _checkBooleanData("mcu_stat_fdbk")
+ || _checkBooleanData("mcu_hv_en") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("door") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("driver_eStop") ||
+ _checkBooleanData("external_eStop") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("main_power_warning")
+ || _checkBooleanData("main_power_critical")
+ || _checkBooleanData("main_power_valid")
+ || _checkBooleanData("driver_power_warning")
+ || _checkBooleanData("driver_power_critical")
+ || _checkBooleanData("driver_power_valid") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("bps_fault") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("discharge_enable") ? (
+
+
+
+ ) : (
+
+ )}
+ {_checkBooleanData("imd_status") ? (
+
+
+
+ ) : (
+
+ )}
+ {checkBMSFailures() ? (
+
+
+
+ ) : (
+
+ )}
+ {props.data?.mc_status[0] > CONSTANTS.mc_status.MIN ? (
+
+
+
+ ) : (
+
+ )}
+ {props.data?.pack_current[0] > CONSTANTS.pack_current.MAX ? (
+
+
+
+ ) : props.data?.pack_current[0] < CONSTANTS.pack_current.MIN ? (
+
+
+
+ ) : (
+
+ )}
+ {/* Box to horizontally center the lowest row of faults */}
- )}
-
+ {props.data?.pack_voltage[0] > CONSTANTS.pack_voltage.MAX ? (
+
+
+
+ ) : props.data?.pack_voltage[0] < CONSTANTS.pack_voltage.MIN ? (
+
+
+
+ ) : (
+
+ )}
+ {props.data?.mppt_current_out[0] > CONSTANTS.mppt_current_out.MAX ? (
+
+
+
+ ) : props.data?.mppt_current_out[0] < CONSTANTS.mppt_current_out.MIN ? (
+
+
+
+ ) : (
+
+ )}
+ {props.data?.bms_input_voltage[0] > CONSTANTS.bms_input_voltage.MAX ? (
+
+
+
+ ) : props.data?.bms_input_voltage[0] < CONSTANTS.bms_input_voltage.MIN ? (
+
+
+
+ ) : (
+
+ )}
+ {props.data?.soc[0] < CONSTANTS.soc.MIN ? (
+
+
+
+ ) : (
+
+ )}
+ {checkCellGroupVoltages() ? (
+
+
+
+ ) : (
+
+ )}
+ {checkTemps() ? (
+
+
+
+ ) : (
+
+ )}
+
+
);
}
diff --git a/Frontend/src/Components/Faults/Images/BMS Failures Dark.png b/Frontend/src/Components/Faults/Images/BMS Failures Dark.png
new file mode 100644
index 00000000..1f1637f0
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/BMS Failures Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/BMS Failures.png b/Frontend/src/Components/Faults/Images/BMS Failures.png
new file mode 100644
index 00000000..e1f2f306
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/BMS Failures.png differ
diff --git a/Frontend/src/Components/Faults/Images/BMS Input Voltage Dark.png b/Frontend/src/Components/Faults/Images/BMS Input Voltage Dark.png
index 32a673fc..b63c58ea 100644
Binary files a/Frontend/src/Components/Faults/Images/BMS Input Voltage Dark.png and b/Frontend/src/Components/Faults/Images/BMS Input Voltage Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/BMS Input Voltage.png b/Frontend/src/Components/Faults/Images/BMS Input Voltage.png
index bb3cce68..f2f0addc 100644
Binary files a/Frontend/src/Components/Faults/Images/BMS Input Voltage.png and b/Frontend/src/Components/Faults/Images/BMS Input Voltage.png differ
diff --git a/Frontend/src/Components/Faults/Images/BPS Fault Dark.png b/Frontend/src/Components/Faults/Images/BPS Fault Dark.png
new file mode 100644
index 00000000..0b768ebe
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/BPS Fault Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/BPS Fault.png b/Frontend/src/Components/Faults/Images/BPS Fault.png
index 68f56f49..15ce00c9 100644
Binary files a/Frontend/src/Components/Faults/Images/BPS Fault.png and b/Frontend/src/Components/Faults/Images/BPS Fault.png differ
diff --git a/Frontend/src/Components/Faults/Images/Battery Failsafe Dark.png b/Frontend/src/Components/Faults/Images/Battery Failsafe Dark.png
deleted file mode 100644
index e7864081..00000000
Binary files a/Frontend/src/Components/Faults/Images/Battery Failsafe Dark.png and /dev/null differ
diff --git a/Frontend/src/Components/Faults/Images/Battery Failsafe.png b/Frontend/src/Components/Faults/Images/Battery Failsafe.png
deleted file mode 100644
index e6d05f49..00000000
Binary files a/Frontend/src/Components/Faults/Images/Battery Failsafe.png and /dev/null differ
diff --git a/Frontend/src/Components/Faults/Images/Cell Group Voltage Dark.png b/Frontend/src/Components/Faults/Images/Cell Group Voltage Dark.png
new file mode 100644
index 00000000..c66b592e
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/Cell Group Voltage Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/Cell Group Voltage.png b/Frontend/src/Components/Faults/Images/Cell Group Voltage.png
new file mode 100644
index 00000000..d8d4402c
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/Cell Group Voltage.png differ
diff --git a/Frontend/src/Components/Faults/Images/Discharge Enable Dark.png b/Frontend/src/Components/Faults/Images/Discharge Enable Dark.png
new file mode 100644
index 00000000..b96fcaf2
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/Discharge Enable Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/Discharge Enable.png b/Frontend/src/Components/Faults/Images/Discharge Enable.png
new file mode 100644
index 00000000..cd96c2de
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/Discharge Enable.png differ
diff --git a/Frontend/src/Components/Faults/Images/Door Dark.png b/Frontend/src/Components/Faults/Images/Door Dark.png
index 74c76e8d..b25e52ec 100644
Binary files a/Frontend/src/Components/Faults/Images/Door Dark.png and b/Frontend/src/Components/Faults/Images/Door Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/Door.png b/Frontend/src/Components/Faults/Images/Door.png
index 553babf3..80361de4 100644
Binary files a/Frontend/src/Components/Faults/Images/Door.png and b/Frontend/src/Components/Faults/Images/Door.png differ
diff --git a/Frontend/src/Components/Faults/Images/IMD Status Dark.png b/Frontend/src/Components/Faults/Images/IMD Status Dark.png
index 55467653..ed542959 100644
Binary files a/Frontend/src/Components/Faults/Images/IMD Status Dark.png and b/Frontend/src/Components/Faults/Images/IMD Status Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/IMD Status.png b/Frontend/src/Components/Faults/Images/IMD Status.png
index 6da37ac7..79081cb6 100644
Binary files a/Frontend/src/Components/Faults/Images/IMD Status.png and b/Frontend/src/Components/Faults/Images/IMD Status.png differ
diff --git a/Frontend/src/Components/Faults/Images/Images.js b/Frontend/src/Components/Faults/Images/Images.js
index b9be0078..35df6a3a 100644
--- a/Frontend/src/Components/Faults/Images/Images.js
+++ b/Frontend/src/Components/Faults/Images/Images.js
@@ -1,10 +1,13 @@
-import BPSFaultImage from "./BPS Fault.png";
import EStopImage from "./E-Stop.png";
+
+import BPSFaultImageLight from "./BPS Fault.png";
+import CellGroupVoltageImageLight from "./Cell Group Voltage.png";
+import DischargeEnableLight from "./Discharge Enable.png";
import MPPTContactorImageLight from "./MPPT Contactor.png";
import LowContactorImageLight from "./Low Contactor.png";
import MotorControllerContactorImageLight from "./Motor Controller Contactor.png";
import DoorImageLight from "./Door.png";
-import BatteryFailsafeImageLight from "./Battery Failsafe.png";
+import BMSFailuresImageLight from "./BMS Failures.png";
import IMDStatusImageLight from "./IMD Status.png";
import CrashImageLight from "./Crash.png";
import HighCurrentImageLight from "./High Current.png";
@@ -14,15 +17,22 @@ import LowVoltageImageLight from "./Low Voltage.png";
import LowBatteryImageLight from "./Low Battery.png";
import MCUCheckImageLight from "./MCU Check.png";
import MPPTCurrentImageLight from "./MPPT Current.png";
+import MCStatusImageLight from "./MC Status.png";
import BMSInputVoltageImageLight from "./BMS Input Voltage.png";
import PhysicalConnectionImageLight from "./Physical Connection Lost.png";
import WirelessCommsLostImageLight from "./Wireless Comms Lost.png";
-import HighTemperatureImageLight from "./High Temperature.png";
+import TemperatureImageLight from "./Temperature.png";
+import PackPowerImageLight from "./Pack Power.png";
+import PowerWarningsImageLight from "./Power Warnings.png";
+
+import BPSFaultImageDark from "./BPS Fault Dark.png";
+import CellGroupVoltageImageDark from "./Cell Group Voltage Dark.png";
+import DischargeEnableDark from "./Discharge Enable Dark.png";
import MPPTContactorImageDark from "./MPPT Contactor Dark.png";
import LowContactorImageDark from "./Low Contactor Dark.png";
import MotorControllerContactorImageDark from "./Motor Controller Contactor Dark.png";
import DoorImageDark from "./Door Dark.png";
-import BatteryFailsafeImageDark from "./Battery Failsafe Dark.png";
+import BMSFailuresImageDark from "./BMS Failures Dark.png";
import IMDStatusImageDark from "./IMD Status Dark.png";
import CrashImageDark from "./Crash Dark.png";
import HighCurrentImageDark from "./High Current Dark.png";
@@ -32,20 +42,26 @@ import LowVoltageImageDark from "./Low Voltage Dark.png";
import LowBatteryImageDark from "./Low Battery Dark.png";
import MCUCheckImageDark from "./MCU Check Dark.png";
import MPPTCurrentImageDark from "./MPPT Current Dark.png";
+import MCStatusImageDark from "./MC Status Dark.png";
import BMSInputVoltageImageDark from "./BMS Input Voltage Dark.png";
import PhysicalConnectionImageDark from "./Physical Connection Lost Dark.png";
import WirelessCommsLostImageDark from "./Wireless Comms Lost Dark.png";
-import HighTemperatureImageDark from "./High Temperature Dark.png";
+import TemperatureImageDark from "./Temperature Dark.png";
+import PackPowerImageDark from "./Pack Power Dark.png";
+import PowerWarningsImageDark from "./Power Warnings Dark.png";
+
const FaultsViewImages = {
"light": {
- "BPSFault": BPSFaultImage,
+ "BPSFault": BPSFaultImageLight,
+ "CellGroupVoltage": CellGroupVoltageImageLight,
+ "DischargeEnable": DischargeEnableLight,
"EStop": EStopImage,
"MPPTContactor": MPPTContactorImageLight,
"LowContactor": LowContactorImageLight,
"MotorControllerContactor": MotorControllerContactorImageLight,
"Door": DoorImageLight,
- "BatteryFailsafe": BatteryFailsafeImageLight,
+ "BMSFailures": BMSFailuresImageLight,
"IMDStatus": IMDStatusImageLight,
"Crash": CrashImageLight,
"HighCurrent": HighCurrentImageLight,
@@ -55,19 +71,24 @@ const FaultsViewImages = {
"LowBattery": LowBatteryImageLight,
"MCUCheck": MCUCheckImageLight,
"MPPTCurrent": MPPTCurrentImageLight,
+ "MCStatus": MCStatusImageLight,
"BMSInputVoltage": BMSInputVoltageImageLight,
"PhysicalConnection": PhysicalConnectionImageLight,
"WirelessCommsLost": WirelessCommsLostImageLight,
- "HighTemperature": HighTemperatureImageLight
+ "Temperature": TemperatureImageLight,
+ "PackPower": PackPowerImageLight,
+ "PowerWarnings": PowerWarningsImageLight
},
"dark": {
- "BPSFault": BPSFaultImage,
+ "BPSFault": BPSFaultImageDark,
+ "CellGroupVoltage": CellGroupVoltageImageDark,
+ "DischargeEnable": DischargeEnableDark,
"EStop": EStopImage,
"MPPTContactor": MPPTContactorImageDark,
"LowContactor": LowContactorImageDark,
"MotorControllerContactor": MotorControllerContactorImageDark,
"Door": DoorImageDark,
- "BatteryFailsafe": BatteryFailsafeImageDark,
+ "BMSFailures": BMSFailuresImageDark,
"IMDStatus": IMDStatusImageDark,
"Crash": CrashImageDark,
"HighCurrent": HighCurrentImageDark,
@@ -77,11 +98,14 @@ const FaultsViewImages = {
"LowBattery": LowBatteryImageDark,
"MCUCheck": MCUCheckImageDark,
"MPPTCurrent": MPPTCurrentImageDark,
+ "MCStatus": MCStatusImageDark,
"BMSInputVoltage": BMSInputVoltageImageDark,
"PhysicalConnection": PhysicalConnectionImageDark,
"WirelessCommsLost": WirelessCommsLostImageDark,
- "HighTemperature": HighTemperatureImageDark
+ "Temperature": TemperatureImageDark,
+ "PackPower": PackPowerImageDark,
+ "PowerWarnings": PowerWarningsImageDark
}
-}
+};
export { FaultsViewImages };
diff --git a/Frontend/src/Components/Faults/Images/Low Battery Dark.png b/Frontend/src/Components/Faults/Images/Low Battery Dark.png
index 1ae2935c..da110949 100644
Binary files a/Frontend/src/Components/Faults/Images/Low Battery Dark.png and b/Frontend/src/Components/Faults/Images/Low Battery Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/Low Battery.png b/Frontend/src/Components/Faults/Images/Low Battery.png
index e45539b2..0e3b8585 100644
Binary files a/Frontend/src/Components/Faults/Images/Low Battery.png and b/Frontend/src/Components/Faults/Images/Low Battery.png differ
diff --git a/Frontend/src/Components/Faults/Images/MC Status Dark.png b/Frontend/src/Components/Faults/Images/MC Status Dark.png
new file mode 100644
index 00000000..7790adec
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/MC Status Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/MC Status.png b/Frontend/src/Components/Faults/Images/MC Status.png
new file mode 100644
index 00000000..608885fa
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/MC Status.png differ
diff --git a/Frontend/src/Components/Faults/Images/Pack Power Dark.png b/Frontend/src/Components/Faults/Images/Pack Power Dark.png
new file mode 100644
index 00000000..6d519b9d
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/Pack Power Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/Pack Power.png b/Frontend/src/Components/Faults/Images/Pack Power.png
new file mode 100644
index 00000000..41e25f68
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/Pack Power.png differ
diff --git a/Frontend/src/Components/Faults/Images/Power Warnings Dark.png b/Frontend/src/Components/Faults/Images/Power Warnings Dark.png
new file mode 100644
index 00000000..5d47deef
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/Power Warnings Dark.png differ
diff --git a/Frontend/src/Components/Faults/Images/Power Warnings.png b/Frontend/src/Components/Faults/Images/Power Warnings.png
new file mode 100644
index 00000000..587da8de
Binary files /dev/null and b/Frontend/src/Components/Faults/Images/Power Warnings.png differ
diff --git a/Frontend/src/Components/Faults/Images/High Temperature Dark.png b/Frontend/src/Components/Faults/Images/Temperature Dark.png
similarity index 100%
rename from Frontend/src/Components/Faults/Images/High Temperature Dark.png
rename to Frontend/src/Components/Faults/Images/Temperature Dark.png
diff --git a/Frontend/src/Components/Faults/Images/High Temperature.png b/Frontend/src/Components/Faults/Images/Temperature.png
similarity index 100%
rename from Frontend/src/Components/Faults/Images/High Temperature.png
rename to Frontend/src/Components/Faults/Images/Temperature.png