diff --git a/libraries/ms-common/inc/exported_enums.h b/libraries/ms-common/inc/exported_enums.h index 022635219..2a0e3c140 100644 --- a/libraries/ms-common/inc/exported_enums.h +++ b/libraries/ms-common/inc/exported_enums.h @@ -79,6 +79,7 @@ typedef enum { // POWER DISTRIBUTION (TODO) typedef enum { EE_POWER_OFF_STATE = 0, + EE_POWER_TRANSMIT_CLOSE_RELAYS, EE_POWER_ON_STATE, EE_POWER_DRIVE_STATE, } PowerDistributionPowerState; diff --git a/libraries/ms-common/src/fsm.c b/libraries/ms-common/src/fsm.c index f37e49c52..70b7e6296 100644 --- a/libraries/ms-common/src/fsm.c +++ b/libraries/ms-common/src/fsm.c @@ -51,7 +51,7 @@ void _fsm_task(void *context) { LOG_DEBUG("FSM timeout\n"); } // Indicate that a fsm_cycle is finished - send_task_end(); // TODO: should it send task end if fsm times out? + send_task_end(); } } diff --git a/projects/fsm_demo/src/main.c b/projects/fsm_demo/src/main.c index 1eacdf57e..cc52c1a36 100644 --- a/projects/fsm_demo/src/main.c +++ b/projects/fsm_demo/src/main.c @@ -3,8 +3,8 @@ #include "fsm1.h" #include "fsm2.h" #include "log.h" -#include "tasks.h" #include "master_task.h" +#include "tasks.h" // TASK(master_task, TASK_STACK_512) { // while (true) { diff --git a/projects/leds/src/main.c b/projects/leds/src/main.c index 08876e6d1..658ba6aa5 100644 --- a/projects/leds/src/main.c +++ b/projects/leds/src/main.c @@ -22,9 +22,9 @@ TASK(leds_task, TASK_STACK_512) { } while (true) { -// #ifdef MS_PLATFORM_X86 + // #ifdef MS_PLATFORM_X86 LOG_DEBUG("blink\n"); -// #endif + // #endif for (uint8_t i = 0; i < SIZEOF_ARRAY(leds); i++) { gpio_toggle_state(&leds[i]); delay_ms(50); diff --git a/projects/power_distribution/inc/outputs.h b/projects/power_distribution/inc/outputs.h index 5323982e3..61f4bfbf3 100644 --- a/projects/power_distribution/inc/outputs.h +++ b/projects/power_distribution/inc/outputs.h @@ -24,28 +24,28 @@ typedef enum { SOLAR_SENSE_2, PEDAL, STEERING, - LEFT_TURN, - RIGHT_TURN, DRL_LIGHT, - BRAKE_LIGHT, - CENTER_CONSOLE, BMS_DCDC, MCI, - BPS_LIGHT, - SPARE_12V_1, SPARE_12V_2, BMS_AUX, DRIVER_FAN, REAR_CAM_LCD, SPARE_5V_DCDC, - TELEMETRY, SPARE_5V_AUX, + NUM_POWER_FSM_OUTPUTS, +} OutputPowerFsm; +typedef enum { + BPS_LIGHT = NUM_POWER_FSM_OUTPUTS, + RIGHT_TURN, + LEFT_TURN, + BRAKE_LIGHT, NUM_OUTPUTS, -} Output; +} OutputLights; typedef enum { OUTPUT_STATE_OFF = 0, @@ -57,15 +57,14 @@ typedef enum { typedef enum { OUTPUT_GROUP_ALL = 0, // Reserved Value // Lights - OUTPUT_GROUP_LEFT_TURN, - OUTPUT_GROUP_RIGHT_TURN, - OUTPUT_GROUP_HAZARD, + OUTPUT_GROUP_LIGHTS_LEFT_TURN, + OUTPUT_GROUP_LIGHTS_RIGHT_TURN, + OUTPUT_GROUP_LIGHTS_HAZARD, // Power States - OUTPUT_GROUP_BMS_RELAYS, OUTPUT_GROUP_POWER_OFF, OUTPUT_GROUP_POWER_ON, - OUTPUT_GROUP_DRIVE, - OUTPUT_GROUP_TEST, + OUTPUT_GROUP_POWER_DRIVE, + OUTPUT_GROUP_POWER_FAULT, NUM_OUTPUT_GROUPS, } OutputGroup; @@ -75,7 +74,7 @@ typedef struct OutputMeasurementConfig { typedef struct OutputGroupDef { uint8_t num_outputs; - Output outputs[]; + uint8_t outputs[]; } OutputGroupDef; extern BtsLoadSwitchOutput g_output_config[NUM_OUTPUTS]; diff --git a/projects/power_distribution/inc/pd_fault.h b/projects/power_distribution/inc/pd_fault.h index 199edfaec..41360365f 100644 --- a/projects/power_distribution/inc/pd_fault.h +++ b/projects/power_distribution/inc/pd_fault.h @@ -1,9 +1,10 @@ #pragma once -#include "status.h" +#include +#include "status.h" /* * @brief Checks for PD fault states and updates fault bitset CAN message * @return STATUS_CODE_OK on success or appropriate error code */ -StatusCode check_pd_fault(void); +uint8_t check_pd_fault(void); diff --git a/projects/power_distribution/inc/power_seq_fsm.h b/projects/power_distribution/inc/power_seq_fsm.h index f5e963f8b..d15a8191a 100644 --- a/projects/power_distribution/inc/power_seq_fsm.h +++ b/projects/power_distribution/inc/power_seq_fsm.h @@ -10,16 +10,6 @@ #define BMS_RESPONSE_TIMEOUT_MS 10000 #define MCI_RESPONSE_TIMEOUT_MS 12000 -#define DCDC_VALID \ - { GPIO_PORT_A, 15 } - -#define check_pd_fault(fsm) \ - power_context.fault = prv_fault_check(); - // if (power_context.fault != NO_ERROR) { - // fsm_transition(fsm, POWER_STATE_FAULT); - // return; - // } - #define NUM_POWER_STATES 6 DECLARE_FSM(power_seq); @@ -36,7 +26,7 @@ typedef struct { PowerSeqStateId target_state; PowerSeqStateId latest_state; TickType_t timer_start_ticks; - GlobalErrorCode fault; + uint8_t fault; } PowerFsmContext; StatusCode init_power_seq(void); diff --git a/projects/power_distribution/src/lights_fsm.c b/projects/power_distribution/src/lights_fsm.c index a965fface..2465f7fac 100644 --- a/projects/power_distribution/src/lights_fsm.c +++ b/projects/power_distribution/src/lights_fsm.c @@ -21,19 +21,19 @@ static void prv_lights_signal_blinker(SoftTimerId id) { switch (light_id_callback) { case EE_LIGHT_TYPE_SIGNAL_LEFT: left_signal_state ^= 1; - pd_set_output_group(OUTPUT_GROUP_LEFT_TURN, left_signal_state); + pd_set_output_group(OUTPUT_GROUP_LIGHTS_LEFT_TURN, left_signal_state); if (right_signal_state == OUTPUT_STATE_ON) { right_signal_state = OUTPUT_STATE_OFF; - pd_set_output_group(OUTPUT_GROUP_RIGHT_TURN, right_signal_state); + pd_set_output_group(OUTPUT_GROUP_LIGHTS_RIGHT_TURN, right_signal_state); } soft_timer_start(&s_timer_single); break; case EE_LIGHT_TYPE_SIGNAL_RIGHT: right_signal_state ^= 1; - pd_set_output_group(OUTPUT_GROUP_RIGHT_TURN, right_signal_state); + pd_set_output_group(OUTPUT_GROUP_LIGHTS_RIGHT_TURN, right_signal_state); if (left_signal_state == OUTPUT_STATE_ON) { left_signal_state = OUTPUT_STATE_OFF; - pd_set_output_group(OUTPUT_GROUP_LEFT_TURN, left_signal_state); + pd_set_output_group(OUTPUT_GROUP_LIGHTS_LEFT_TURN, left_signal_state); } soft_timer_start(&s_timer_single); break; @@ -44,13 +44,13 @@ static void prv_lights_signal_blinker(SoftTimerId id) { } left_signal_state ^= 1; right_signal_state ^= 1; - pd_set_output_group(OUTPUT_GROUP_HAZARD, left_signal_state); + pd_set_output_group(OUTPUT_GROUP_LIGHTS_HAZARD, left_signal_state); soft_timer_start(&s_timer_single); break; default: left_signal_state = OUTPUT_STATE_OFF; right_signal_state = OUTPUT_STATE_OFF; - pd_set_output_group(OUTPUT_GROUP_HAZARD, left_signal_state); + pd_set_output_group(OUTPUT_GROUP_LIGHTS_HAZARD, left_signal_state); } } diff --git a/projects/power_distribution/src/main.c b/projects/power_distribution/src/main.c index 1058ce417..757cace7c 100644 --- a/projects/power_distribution/src/main.c +++ b/projects/power_distribution/src/main.c @@ -34,6 +34,7 @@ void pre_loop_init() { pd_output_init(); pd_sense_init(); adc_init(); + pd_set_active_output_group(OUTPUT_GROUP_POWER_OFF); } void run_fast_cycle() {} @@ -41,11 +42,10 @@ void run_medium_cycle() { run_can_rx_cycle(); wait_tasks(1); - fsm_run_cycle(power_seq); - // fsm_run_cycle(lights); - wait_tasks(1); - adc_run(); + fsm_run_cycle(power_seq); + fsm_run_cycle(lights); + wait_tasks(2); run_can_tx_cycle(); wait_tasks(1); @@ -56,15 +56,15 @@ void run_slow_cycle() {} int main() { tasks_init(); log_init(); - gpio_init(); interrupt_init(); + gpio_init(); i2c_init(I2C_PORT_1, &i2c_settings); pca9555_gpio_init(I2C_PORT_1); can_init(&s_can_storage, &can_settings); - set_master_cycle_time(250); // Give it enough time to run an entire medium cycle - set_medium_cycle_count(2); // adjust medium cycle count to run once per 500ms + // set_master_cycle_time(250); // Give it enough time to run an entire medium cycle + // set_medium_cycle_count(2); // adjust medium cycle count to run once per 500ms init_power_seq(); - // init_lights(); + init_lights(); LOG_DEBUG("Welcome to PD!\n"); init_master_task(); diff --git a/projects/power_distribution/src/output_config.c b/projects/power_distribution/src/output_config.c index 0e169f8b3..0c1729daa 100644 --- a/projects/power_distribution/src/output_config.c +++ b/projects/power_distribution/src/output_config.c @@ -310,12 +310,29 @@ static OutputGroupDef s_output_group_hazards = { .outputs = { LEFT_TURN, RIGHT_TURN }, }; +static OutputGroupDef s_output_group_power_off = { .num_outputs = 2, + .outputs = { CENTER_CONSOLE, BMS_DCDC } }; + +static OutputGroupDef s_output_group_power_on = { + .num_outputs = 7, + .outputs = { CENTER_CONSOLE, BMS_DCDC, BMS_AUX, PEDAL, STEERING, SOLAR_SENSE_1, SOLAR_SENSE_2 } +}; + +static OutputGroupDef s_output_group_power_drive = { + .num_outputs = 13, + .outputs = { CENTER_CONSOLE, BMS_DCDC, BMS_AUX, PEDAL, STEERING, SOLAR_SENSE_1, SOLAR_SENSE_2, + MCI, DRL_LIGHT, DRIVER_FAN, TELEMETRY, REAR_CAM_LCD, SPARE_5V_DCDC } +}; + +static OutputGroupDef s_output_group_power_fault = { + .num_outputs = 4, .outputs = { CENTER_CONSOLE, BMS_DCDC, PEDAL, STEERING } +}; + static OutputGroupDef s_output_group_test = { .num_outputs = 2, .outputs = { STEERING, PEDAL } }; const OutputGroupDef *g_output_group_map[NUM_OUTPUT_GROUPS] = { [OUTPUT_GROUP_ALL] = NULL, // Special case - [OUTPUT_GROUP_LEFT_TURN] = &s_output_group_left_signal, - [OUTPUT_GROUP_RIGHT_TURN] = &s_output_group_right_signal, - [OUTPUT_GROUP_HAZARD] = &s_output_group_hazards, - [OUTPUT_GROUP_TEST] = &s_output_group_test, + [OUTPUT_GROUP_LIGHTS_LEFT_TURN] = &s_output_group_left_signal, + [OUTPUT_GROUP_LIGHTS_RIGHT_TURN] = &s_output_group_right_signal, + [OUTPUT_GROUP_LIGHTS_HAZARD] = &s_output_group_hazards, }; diff --git a/projects/power_distribution/src/output_current_sense.c b/projects/power_distribution/src/output_current_sense.c index c49dee923..1e4879e0a 100644 --- a/projects/power_distribution/src/output_current_sense.c +++ b/projects/power_distribution/src/output_current_sense.c @@ -53,7 +53,7 @@ StatusCode pd_sense_output_group(OutputGroup group) { } for (uint8_t out = 0; out < grp->num_outputs; out++) { - Output output = grp->outputs[out]; + uint8_t output = grp->outputs[out]; status_ok_or_return(prv_set_sense_mux(g_output_config[output].mux_val)); status_ok_or_return( bts_output_get_current(&g_output_config[output], &(g_output_config[output].reading_out))); diff --git a/projects/power_distribution/src/outputs.c b/projects/power_distribution/src/outputs.c index c314b42b8..55e968571 100644 --- a/projects/power_distribution/src/outputs.c +++ b/projects/power_distribution/src/outputs.c @@ -34,7 +34,7 @@ StatusCode pd_set_output_group(OutputGroup group, OutputState state) { } for (uint8_t out = 0; out < grp->num_outputs; out++) { - Output output = grp->outputs[out]; + uint8_t output = grp->outputs[out]; if (state == OUTPUT_STATE_ON) { status_ok_or_return(bts_output_enable_output(&g_output_config[output])); } else { @@ -57,7 +57,7 @@ StatusCode pd_set_active_output_group(OutputGroup group) { if (grp == NULL) { return STATUS_CODE_UNINITIALIZED; } - for (Output output = 0; output < NUM_OUTPUTS; output++) { + for (OutputPowerFsm output = 0; output < NUM_POWER_FSM_OUTPUTS; output++) { bool found = false; for (OutputGroup i = 0; i < grp->num_outputs; i++) { if (grp->outputs[i] == output) { @@ -67,7 +67,7 @@ StatusCode pd_set_active_output_group(OutputGroup group) { } } if (!found) { - status_ok_or_return(bts_output_enable_output(&g_output_config[output])); + status_ok_or_return(bts_output_disable_output(&g_output_config[output])); } } return STATUS_CODE_OK; diff --git a/projects/power_distribution/src/pd_fault.c b/projects/power_distribution/src/pd_fault.c index 903bf16a3..01fa19211 100644 --- a/projects/power_distribution/src/pd_fault.c +++ b/projects/power_distribution/src/pd_fault.c @@ -23,38 +23,33 @@ static void prv_set_fault_bit(uint8_t mask, bool condition) { } } -static StatusCode prv_check_aux_fault(void) { +static bool prv_check_aux_fault(void) { GpioState aux_gpio_1_state; GpioState aux_gpio_2_state; - status_ok_or_return(gpio_get_state(&aux_fault_gpio_1, &aux_gpio_1_state)); - status_ok_or_return(gpio_get_state(&aux_fault_gpio_2, &aux_gpio_2_state)); - - bool aux_fault = (aux_gpio_1_state == GPIO_STATE_LOW || aux_gpio_2_state == GPIO_STATE_LOW); - prv_set_fault_bit(EE_PD_STATUS_FAULT_BITSET_AUX_FAULT_MASK, aux_fault); - - return STATUS_CODE_OK; + if (!status_ok(gpio_get_state(&aux_fault_gpio_1, &aux_gpio_1_state)) || + !status_ok(gpio_get_state(&aux_fault_gpio_2, &aux_gpio_2_state))) { + return true; + } + return (aux_gpio_1_state == GPIO_STATE_LOW || aux_gpio_2_state == GPIO_STATE_LOW); } -static StatusCode prv_check_dcdc_fault(void) { +static bool prv_check_dcdc_fault(void) { GpioState dcdc_gpio_1_state; GpioState dcdc_gpio_2_state; GpioState dcdc_gpio_3_state; - status_ok_or_return(gpio_get_state(&dcdc_fault_gpio_1, &dcdc_gpio_1_state)); - status_ok_or_return(gpio_get_state(&dcdc_fault_gpio_2, &dcdc_gpio_2_state)); - status_ok_or_return(gpio_get_state(&dcdc_fault_gpio_3, &dcdc_gpio_3_state)); - - bool dcdc_fault = (dcdc_gpio_1_state == GPIO_STATE_LOW || dcdc_gpio_2_state == GPIO_STATE_LOW || - dcdc_gpio_3_state == GPIO_STATE_HIGH); - prv_set_fault_bit(EE_PD_STATUS_FAULT_BITSET_DCDC_FAULT_MASK, dcdc_fault); + if (!status_ok(gpio_get_state(&dcdc_fault_gpio_1, &dcdc_gpio_1_state)) || + !status_ok(gpio_get_state(&dcdc_fault_gpio_2, &dcdc_gpio_2_state)) || + !status_ok(gpio_get_state(&dcdc_fault_gpio_3, &dcdc_gpio_3_state))) { + return true; + } - return STATUS_CODE_OK; + return (dcdc_gpio_1_state == GPIO_STATE_LOW || dcdc_gpio_2_state == GPIO_STATE_LOW || + dcdc_gpio_3_state == GPIO_STATE_HIGH); } -StatusCode check_pd_fault() { - status_ok_or_return(prv_check_aux_fault()); - status_ok_or_return(prv_check_dcdc_fault()); - +uint8_t check_pd_fault(void) { + prv_set_fault_bit(EE_PD_STATUS_FAULT_BITSET_AUX_FAULT_MASK, prv_check_aux_fault()); + prv_set_fault_bit(EE_PD_STATUS_FAULT_BITSET_DCDC_FAULT_MASK, prv_check_dcdc_fault()); set_pd_status_fault_bitset(s_fault_bitset); - - return STATUS_CODE_OK; + return s_fault_bitset; } diff --git a/projects/power_distribution/src/power_seq_fsm.c b/projects/power_distribution/src/power_seq_fsm.c index ae7832e44..7510de7c1 100644 --- a/projects/power_distribution/src/power_seq_fsm.c +++ b/projects/power_distribution/src/power_seq_fsm.c @@ -1,21 +1,20 @@ #include "power_seq_fsm.h" #include "outputs.h" +#include "pd_fault.h" #include "power_distribution_getters.h" #include "power_distribution_setters.h" +#define pd_fault_ok_or_transition(fsm) \ + power_context.fault = check_pd_fault(); \ + if (check_battery_status_msg_watchdog() || get_battery_status_fault()) { \ + fsm_transition(fsm, POWER_STATE_FAULT); \ + return; \ + } + FSM(power_seq, NUM_POWER_STATES); static PowerFsmContext power_context = { 0 }; -static const GpioAddress dcdc_valid_pin = DCDC_VALID; - -static GlobalErrorCode prv_fault_check() { - if (check_battery_status_msg_watchdog()) { - return PD_BMS_LOSS; - } - // TODO(devAdhiraj): Call PD fault checks function - return NO_ERROR; -} static void prv_off_state_output(void *context) { LOG_DEBUG("Transitioned to OFF STATE\n"); @@ -25,7 +24,7 @@ static void prv_off_state_output(void *context) { } static void prv_off_state_input(Fsm *fsm, void *context) { - // TODO: Do we need to check fault here? + pd_fault_ok_or_transition(fsm); LOG_DEBUG("IN off state - %d\n", get_received_cc_power_control()); if (!get_received_cc_power_control()) { return; @@ -42,18 +41,16 @@ static void prv_off_state_input(Fsm *fsm, void *context) { static void prv_close_relays_state_output(void *context) { LOG_DEBUG("Transitioned to CLOSE RELAYS STATE\n"); - pd_set_output_group(OUTPUT_GROUP_BMS_RELAYS, OUTPUT_STATE_ON); + set_power_info_power_state() pd_set_output_group(OUTPUT_GROUP_POWER_ON, OUTPUT_STATE_ON); power_context.latest_state = TRANSMIT_BMS_CLOSE_RELAYS; power_context.timer_start_ticks = xTaskGetTickCount(); } static void prv_close_relays_state_input(Fsm *fsm, void *context) { - check_pd_fault(fsm); + pd_fault_ok_or_transition(fsm); uint8_t bms_relay_state = get_battery_relay_info_state(); if (bms_relay_state == EE_RELAY_STATE_CLOSE) { - GpioState dcdc_state; - if (gpio_get_state(&dcdc_valid_pin, &dcdc_state) == STATUS_CODE_OK && - dcdc_state == GPIO_STATE_HIGH) { + if (power_context.fault == 0) { fsm_transition(fsm, POWER_STATE_ON); } else { fsm_transition(fsm, POWER_STATE_OFF); @@ -68,11 +65,11 @@ static void prv_on_state_output(void *context) { LOG_DEBUG("Transitioned to ON STATE\n"); pd_set_active_output_group(OUTPUT_GROUP_POWER_ON); power_context.latest_state = POWER_STATE_ON; - set_power_info_power_state(EE_POWER_ON_STATE); + set_power_info_power_state(EE_POWER_TRANSMIT_CLOSE_RELAYS); } static void prv_on_state_input(Fsm *fsm, void *context) { - check_pd_fault(fsm); + pd_fault_ok_or_transition(fsm); if (power_context.target_state == POWER_STATE_OFF) { fsm_transition(fsm, POWER_STATE_OFF); return; @@ -97,7 +94,7 @@ static void prv_on_state_input(Fsm *fsm, void *context) { static void prv_turn_on_drive_outputs_state_output(void *context) { LOG_DEBUG("Transitioned to TURN ON DRIVE STATE\n"); - pd_set_active_output_group(OUTPUT_GROUP_DRIVE); + pd_set_active_output_group(OUTPUT_GROUP_POWER_DRIVE); power_context.latest_state = TURN_ON_DRIVE_OUTPUTS; power_context.timer_start_ticks = xTaskGetTickCount(); } @@ -119,7 +116,7 @@ static void prv_drive_state_output(void *context) { } static void prv_drive_state_input(Fsm *fsm, void *context) { - check_pd_fault(fsm); + pd_fault_ok_or_transition(fsm); if (!get_received_cc_power_control()) { return; } @@ -132,11 +129,7 @@ static void prv_drive_state_input(Fsm *fsm, void *context) { static void prv_fault_state_output(void *context) { LOG_DEBUG("Transitioned to FAULT STATE\n"); - if (power_context.latest_state == POWER_STATE_DRIVE || - power_context.latest_state == TURN_ON_DRIVE_OUTPUTS) { - pd_set_output_group(OUTPUT_GROUP_DRIVE, OUTPUT_STATE_OFF); - } - pd_set_output_group(OUTPUT_GROUP_POWER_ON, OUTPUT_STATE_ON); + pd_set_active_output_group(OUTPUT_GROUP_POWER_FAULT); set_power_info_pd_fault(power_context.fault); // TODO(devAdhiraj): start bps strobe } @@ -172,5 +165,5 @@ static bool s_power_seq_transitions[NUM_POWER_STATES][NUM_POWER_STATES] = { StatusCode init_power_seq(void) { fsm_init(power_seq, s_power_seq_state_list, s_power_seq_transitions, POWER_STATE_OFF, NULL); - return gpio_init_pin(&dcdc_valid_pin, GPIO_INPUT_FLOATING, GPIO_STATE_LOW); + return STATUS_CODE_OK; } diff --git a/smoke/power_distribution/src/main.c b/smoke/power_distribution/src/main.c index 907819076..07832d49b 100644 --- a/smoke/power_distribution/src/main.c +++ b/smoke/power_distribution/src/main.c @@ -11,7 +11,7 @@ #include "interrupt.h" static const OutputGroup output_groups_to_test[] = { - OUTPUT_GROUP_TEST + OUTPUT_GROUP_LIGHTS_LEFT_TURN }; static const GpioAddress test_gpio = { .port = GPIO_PORT_B, .pin = 5 }; @@ -25,7 +25,7 @@ void pd_print_adc_readings(OutputGroup group) { // Get specific group, iterate through set of pins OutputGroupDef *grp = g_output_group_map[group]; for (uint8_t out = 0; out < grp->num_outputs; out++) { - Output output = grp->outputs[out]; + uint8_t output = grp->outputs[out]; LOG_DEBUG("sense group: %d, value: %d\n", output, g_output_config[output].reading_out); } }