#include <MyProject.h>

bool data isCtrlPowOn = false;
bool data TickFlag = false;


Loop_Control_t xdata loopCtrl;          // 环路控制
Estimated_Data_t xdata estData;         // 数据采集


Fault_Check_t xdata faultCheck;

Fault_Type_e xdata FaultSource;
Sys_State_e xdata sysState;

FOCCTRL xdata mcFocCtrl;

/**
    @brief     硬件初始化，初始化需要使用的硬件设备配置，FOC必须配置的是运放电压、运放初始化、ADC初始化、Driver初始化
              其他的可根据实际需求加。
    @date      2022-07-14
*/
void HardwareInit(void)
{
    CMP3_Init();
    GPIO_Init();
    LED_GPIO_Init();
    ADC_Init();
    AMP_Init();
    // 附加配置 处理程序丢失问题 !>待验证
    Config_Init();
    Driver_Init();
    PWM_Timer_Init();
    // 硬件过流中断初始化
    CMP3_Interrupt_Init();
    // 调试串口初始化
    UART1_Init();
    // Systick定时器 使能与中断优先级配置
    ClrBit(IP2, PSYSTICK1 | PSYSTICK0);
    SetBit(DRV_SR, SYSTIE);
    EA = 1;
}



/**
    @brief        部分变量初始化，上电运行一次
    @date         2022-07-14
*/
void SoftwareInit(void)
{
    memset(&mcFocCtrl, 0, sizeof(FOCCTRL));
    McStaSet.SetMode = 0;
    mcCurOffset.IuOffsetSum = 16383;
    mcCurOffset.IvOffsetSum = 16383;
    mcCurOffset.Iw_busOffsetSum = 16383;
}

/**
    @function     main
    @brief        主函数
    @date         2025-04-17
*/
void main(void)
{
    uint16_t PowerUpCnt = 0;
    
    for (PowerUpCnt = 0; PowerUpCnt < 55000; PowerUpCnt++);
    
    SoftwareInit();
    HardwareInit();
    
    while (1)
    {
        if (!mcCurOffset.OffsetFlag)
        {
            GetCurrentOffset();
        }
        else
        {
            Motor_Control_State();
            
            if (TickFlag)
            {
                // 喂狗
                SetBit(WDT_CR, WDTRF);
                // 获取滤波数据
                Get_LPF_Value();
                // 输入命令处理
                Get_Target_Ref();
                // 故障处理与故障恢复
                Motor_Fault_Handle();
                
                // 环路响应
                if ((sysState == MOTOR_RUN) || (sysState == MOTOR_STOP))
                { Loop_Control(); }
                
                // 故障指示
                LED_State_Display(FaultSource);
                
                // 滤波器带宽动态调整
                if (sysState == MOTOR_RUN)
                { ATORamp(); }
                
                TickFlag = false;
            }
        }
    }
}