/***************************************************************************//** * \file main_cm0plus.c * * CYT4BFBCJE rev_d CM0+ entry point for the four-motor seat movement ECU. *******************************************************************************/ #include "cy_project.h" #include "cy_device_headers.h" #include "bsp_seat_move_can.h" #include "motor_control.h" #include "safety_manager.h" #include "seat_move_application.h" #include "seat_move_config.h" #include "bsp_seat_backrest_heater.h" #include "bsp_seat_fan.h" #include "seat_controller_thermal.h" volatile uint32_t g_seatMoveResetReason = 0u; volatile uint32_t g_seatMoveInitResult = MOTOR_API_FAILURE; static void SeatMove_HoldSafeOff(void) { for(;;) { Motor_ForceSafeOff(); SeatControllerThermal_ForceSafeOff(); SafetyManager_KickWatchdog(); Cy_SysTick_DelayInUs(SEAT_MOVE_TASK_PERIOD_US); } } int main(void) { bool startupInhibited; (void)BspSeatBackrestHeater_ForceOff(); (void)BspSeatFan_ForceOff(); SystemInit(); /* DRVOFF is asserted and IN1..IN4 are GPIO-low before any motor clock, * SPI transaction or CAN command can enable a bridge. */ Motor_ForceSafeOff(); if(!BspSeatBackrestHeater_ForceOff() || !BspSeatFan_ForceOff()) { SeatMove_HoldSafeOff(); } g_seatMoveResetReason = Cy_SysReset_GetResetReason(); Cy_SysReset_ClearAllResetReasons(); SafetyManager_Init(g_seatMoveResetReason); startupInhibited = SafetyManager_IsInhibited(); __enable_irq(); g_seatMoveInitResult = Motor_Init(); if(g_seatMoveInitResult != MOTOR_API_SUCCESS) { SafetyManager_LatchFault(SAFETY_FAULT_DRIVER); } /* A retained reset/debug fault must remain fail-safe, but it must not * suppress CAN diagnostics. Motor_Init() establishes the timer and SPI * state needed by status reporting, so re-apply the inhibit afterwards. */ if(startupInhibited) { Motor_LatchSafetyInhibitFromIsr(0u); Motor_ForceSafeOff(); } Motor_SetWatchdogServiceEnabled(true); if(!SeatControllerThermal_Init()) { SafetyManager_LatchFault(SAFETY_FAULT_DRIVER); } if(!SeatMoveApplication_Init()) { /* When CAN itself could not initialize there is no diagnostic path to * preserve. Other startup failures remain visible through identity * and inhibited status frames while every actuator stays safe-off. */ if(g_bspSeatMoveCanInitStatus != (uint32_t)CY_CANFD_SUCCESS) { SeatMove_HoldSafeOff(); } } for(;;) { SeatMoveApplication_Service(); SeatControllerThermal_Service1ms(); if(SafetyManager_IsInhibited()) { Motor_ForceSafeOff(); SeatControllerThermal_ForceSafeOff(); } SafetyManager_KickWatchdog(); Cy_SysTick_DelayInUs(SEAT_MOVE_TASK_PERIOD_US); } } /* [] END OF FILE */