diff --git a/can_library/configs/nodes/DASHBOARD.json b/can_library/configs/nodes/DASHBOARD.json index c6285b165..5cf8a68f7 100644 --- a/can_library/configs/nodes/DASHBOARD.json +++ b/can_library/configs/nodes/DASHBOARD.json @@ -93,6 +93,18 @@ }, { "msg_name": "igbt_temps" + }, + { + "msg_name": "inva_diagnostics" + }, + { + "msg_name": "invb_diagnostics" + }, + { + "msg_name": "invc_diagnostics" + }, + { + "msg_name": "invd_diagnostics" } ] }, diff --git a/can_library/configs/nodes/MAIN_MODULE.json b/can_library/configs/nodes/MAIN_MODULE.json index 3e94928aa..cfc73754c 100644 --- a/can_library/configs/nodes/MAIN_MODULE.json +++ b/can_library/configs/nodes/MAIN_MODULE.json @@ -125,6 +125,118 @@ ], "msg_priority": 5, "msg_period": 5000 + }, + { + "msg_name": "inva_diagnostics", + "msg_desc": "VCAN diagnostics for inverter A", + "signals": [ + { + "sig_name": "inverter_state", + "sig_desc": "Current inverter state", + "type": "uint8_t" + }, + { + "sig_name": "bError", + "sig_desc": "AMK status error bit", + "type": "bool" + }, + { + "sig_name": "diagnostic_number", + "sig_desc": "AMK diagnostic number", + "type": "uint32_t" + }, + { + "sig_name": "InverterOn", + "sig_desc": "AMK inverter on status", + "type": "bool" + } + ], + "msg_period": 2000, + "msg_priority": 4 + }, + { + "msg_name": "invb_diagnostics", + "msg_desc": "VCAN diagnostics for inverter B", + "signals": [ + { + "sig_name": "inverter_state", + "sig_desc": "Current inverter state", + "type": "uint8_t" + }, + { + "sig_name": "bError", + "sig_desc": "AMK status error bit", + "type": "bool" + }, + { + "sig_name": "diagnostic_number", + "sig_desc": "AMK diagnostic number", + "type": "uint32_t" + }, + { + "sig_name": "InverterOn", + "sig_desc": "AMK inverter on status", + "type": "bool" + } + ], + "msg_period": 2000, + "msg_priority": 4 + }, + { + "msg_name": "invc_diagnostics", + "msg_desc": "VCAN diagnostics for inverter C", + "signals": [ + { + "sig_name": "inverter_state", + "sig_desc": "Current inverter state", + "type": "uint8_t" + }, + { + "sig_name": "bError", + "sig_desc": "AMK status error bit", + "type": "bool" + }, + { + "sig_name": "diagnostic_number", + "sig_desc": "AMK diagnostic number", + "type": "uint32_t" + }, + { + "sig_name": "InverterOn", + "sig_desc": "AMK inverter on status", + "type": "bool" + } + ], + "msg_period": 2000, + "msg_priority": 4 + }, + { + "msg_name": "invd_diagnostics", + "msg_desc": "VCAN diagnostics for inverter D", + "signals": [ + { + "sig_name": "inverter_state", + "sig_desc": "Current inverter state", + "type": "uint8_t" + }, + { + "sig_name": "bError", + "sig_desc": "AMK status error bit", + "type": "bool" + }, + { + "sig_name": "diagnostic_number", + "sig_desc": "AMK diagnostic number", + "type": "uint32_t" + }, + { + "sig_name": "InverterOn", + "sig_desc": "AMK inverter on status", + "type": "bool" + } + ], + "msg_period": 2000, + "msg_priority": 4 } ], "rx": [ diff --git a/source/dashboard/lcd/Dashboard26.HMI b/source/dashboard/lcd/Dashboard26.HMI index 69b8f1596..85e10ea7b 100644 Binary files a/source/dashboard/lcd/Dashboard26.HMI and b/source/dashboard/lcd/Dashboard26.HMI differ diff --git a/source/dashboard/lcd/lcd.c b/source/dashboard/lcd/lcd.c index e9969331e..84fd74f5a 100644 --- a/source/dashboard/lcd/lcd.c +++ b/source/dashboard/lcd/lcd.c @@ -16,6 +16,7 @@ #include "pages/race.h" #include "pages/calibration.h" #include "pages/faults.h" +#include "pages/amk.h" volatile page_t curr_page = PAGE_PREFLIGHT; // Current page displayed on the LCD volatile page_t prev_page = PAGE_PREFLIGHT; // Previous page displayed on the LCD @@ -45,6 +46,14 @@ const page_handler_t page_handlers[NUM_PAGES] = { // Order must match page_t enu .select = nullptr, .telemetry = calibration_telemetry_update, .string = CALIBRATION_STRING + }, + [PAGE_AMK] = { + .update = nullptr, + .move_up = nullptr, + .move_down = nullptr, + .select = nullptr, + .telemetry = amk_telemetry_update, + .string = AMK_STRING } }; diff --git a/source/dashboard/lcd/lcd.h b/source/dashboard/lcd/lcd.h index 3dd94585c..35dcf0e18 100644 --- a/source/dashboard/lcd/lcd.h +++ b/source/dashboard/lcd/lcd.h @@ -14,6 +14,7 @@ typedef enum : uint8_t { PAGE_RACE = 0, PAGE_FAULTS = 1, PAGE_CALIBRATION = 2, + PAGE_AMK = 3, NUM_PAGES, // leave as auto to count number of pages PAGE_PREFLIGHT, // not selectable, only shown on power on } page_t; diff --git a/source/dashboard/lcd/pages/amk.c b/source/dashboard/lcd/pages/amk.c new file mode 100644 index 000000000..ed5bb4458 --- /dev/null +++ b/source/dashboard/lcd/pages/amk.c @@ -0,0 +1,91 @@ +/** + * @file amk.c + * @brief AMK page implementation + * + * @author Amruth Nadimpally (nadimpaa@purdue.edu) + * @author Aditya Saini (sain91@purdue.edu) + */ + +#include "amk.h" + +#include "can_library/generated/DASHBOARD.h" +#include "nextion.h" +#include "colors.h" + +static void update_inverter_telemetry( + char *status_id, + char *error_id, + char *diagnostic_id, + char *on_id, + bool is_stale, + uint8_t inverter_state, + bool has_error, + uint32_t diagnostic_number, + bool inverter_on +) { + NXT_setFontColor(error_id, WHITE); + NXT_setFontColor(diagnostic_id, WHITE); + NXT_setFontColor(on_id, WHITE); + + if (is_stale) { + NXT_setFontColor(status_id, RED); + NXT_setText(status_id, "STALE"); + NXT_setText(error_id, "--"); + NXT_setText(diagnostic_id, "--"); + NXT_setText(on_id, "--"); + return; + } + + NXT_setFontColor(status_id, has_error ? RED : GREEN); + NXT_setTextFormatted(status_id, "%u", (unsigned int) inverter_state); + NXT_setText(error_id, has_error ? "ERROR" : "OK"); + NXT_setTextFormatted(diagnostic_id, "%lu", (unsigned int) diagnostic_number); + NXT_setText(on_id, inverter_on ? "ON" : "OFF"); +} + +void amk_telemetry_update() { + update_inverter_telemetry( + INVA_STATUS, + INVA_ERROR, + INVA_DIAGNOSTIC, + INVA_ON, + can_data.inva_diagnostics.is_stale(), + can_data.inva_diagnostics.inverter_state, + can_data.inva_diagnostics.bError, + can_data.inva_diagnostics.diagnostic_number, + can_data.inva_diagnostics.InverterOn + ); + update_inverter_telemetry( + INVB_STATUS, + INVB_ERROR, + INVB_DIAGNOSTIC, + INVB_ON, + can_data.invb_diagnostics.is_stale(), + can_data.invb_diagnostics.inverter_state, + can_data.invb_diagnostics.bError, + can_data.invb_diagnostics.diagnostic_number, + can_data.invb_diagnostics.InverterOn + ); + update_inverter_telemetry( + INVC_STATUS, + INVC_ERROR, + INVC_DIAGNOSTIC, + INVC_ON, + can_data.invc_diagnostics.is_stale(), + can_data.invc_diagnostics.inverter_state, + can_data.invc_diagnostics.bError, + can_data.invc_diagnostics.diagnostic_number, + can_data.invc_diagnostics.InverterOn + ); + update_inverter_telemetry( + INVD_STATUS, + INVD_ERROR, + INVD_DIAGNOSTIC, + INVD_ON, + can_data.invd_diagnostics.is_stale(), + can_data.invd_diagnostics.inverter_state, + can_data.invd_diagnostics.bError, + can_data.invd_diagnostics.diagnostic_number, + can_data.invd_diagnostics.InverterOn + ); +} \ No newline at end of file diff --git a/source/dashboard/lcd/pages/amk.h b/source/dashboard/lcd/pages/amk.h new file mode 100644 index 000000000..53e22db97 --- /dev/null +++ b/source/dashboard/lcd/pages/amk.h @@ -0,0 +1,34 @@ +#ifndef AMK_H +#define AMK_H + +/** + * @file amk.h + * @brief AMK page implementation + * + * @author Amruth Nadimpally (nadimpaa@purdue.edu) + * @author Aditya Saini (sain91@purdue.edu) + */ + +#define AMK_STRING "amk" + +// Nextion object names +#define INVA_STATUS "A" +#define INVB_STATUS "B" +#define INVC_STATUS "C" +#define INVD_STATUS "D" +#define INVA_ERROR "aberror" +#define INVB_ERROR "bberror" +#define INVC_ERROR "cberror" +#define INVD_ERROR "dberror" +#define INVA_DIAGNOSTIC "da" +#define INVB_DIAGNOSTIC "db" +#define INVC_DIAGNOSTIC "dc" +#define INVD_DIAGNOSTIC "dd" +#define INVA_ON "ia" +#define INVB_ON "ib" +#define INVC_ON "ic" +#define INVD_ON "id" + +void amk_telemetry_update(); + +#endif // AMK_H \ No newline at end of file diff --git a/source/main_module/state_machine.c b/source/main_module/state_machine.c index a92e5e84c..db4f72852 100644 --- a/source/main_module/state_machine.c +++ b/source/main_module/state_machine.c @@ -114,6 +114,36 @@ void report_telemetry() { ); } +void report_telemetry_5hz() { + CAN_SEND_inva_diagnostics( + g_car.front_right.state, + g_car.front_right.info->AMK_Status_bError, + g_car.front_right.err1->AMK_DiagnosticNumber, + g_car.front_right.info->AMK_Status_bInverterOn + ); + + CAN_SEND_invb_diagnostics( + g_car.front_left.state, + g_car.front_left.info->AMK_Status_bError, + g_car.front_left.err1->AMK_DiagnosticNumber, + g_car.front_left.info->AMK_Status_bInverterOn + ); + + CAN_SEND_invc_diagnostics( + g_car.rear_left.state, + g_car.rear_left.info->AMK_Status_bError, + g_car.rear_left.err1->AMK_DiagnosticNumber, + g_car.rear_left.info->AMK_Status_bInverterOn + ); + + CAN_SEND_invd_diagnostics( + g_car.rear_right.state, + g_car.rear_right.info->AMK_Status_bError, + g_car.rear_right.err1->AMK_DiagnosticNumber, + g_car.rear_right.info->AMK_Status_bInverterOn + ); +} + void fsm_periodic() { // set default states g_car.current_state = g_car.next_state; @@ -203,6 +233,7 @@ void fsm_periodic() { AMK_set_torque(&g_car.rear_right, g_torque_request.rear_right); report_telemetry(); + report_telemetry_5hz(); // flush the internal state PHAL_writeGPIO(BRAKE_LIGHT_PORT, BRAKE_LIGHT_PIN, g_car.brake_light);