Files
Cognitive_Agent/firmware/t2g/Seat_Controller_demo/App/main_cm0plus.c
T
2026-07-30 08:45:38 +08:00

100 lines
2.9 KiB
C
Executable File

/***************************************************************************//**
* \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 */