#include "PowerManagement.h"
#include "PowerManag_user.h"
#include "Components.h"
#include "Application.h"
#include "RTE.h"
#include "UDS_ISO14229_Services.h"
#include "timm.h"

RTC_Information_st_t RTCInformation;

static void Power_KL30_Init(void);
static void Power_Wakeup_Init(void);
static void Power_LVP_Init(void);
static void Power_OVP_Init(void);
static void Power_IG_OFF_Init(void);
static void Power_IG_ON_Init(void);
static void Power_Sleep_Init(void);

static Power_Status_em Power_Stay_ON(void);
static Power_Status_em Power_Stay_OFF(void);
static Power_Status_em Power_Stay_Protect(void);
static Power_Status_em Power_Stay_Sleep(void);

extern uint8_t u8LEDDriverCheckCount;


static const st_PowerGroup g_stPwrTasks = {
    Power_KL30_Init,
    Power_IG_OFF_Init,
    Power_Stay_OFF,
    Power_Sleep_Init,
    Power_Stay_Sleep,
    Power_Wakeup_Init,
    Power_IG_ON_Init,
    Power_Stay_ON,
    Power_LVP_Init,
    Power_OVP_Init,
    Power_Stay_Protect,
};

void PwrMemInit(void)
{
    PowerMemInit(&g_stPwrTasks);
}

extern uint8_t Power_KL30_Init_flag;
extern uint8_t AliveCount_KL30_ResettingFlag;
static void Power_KL30_Init(void)
{
    CAN_TX_Flag_Init();
    ClearODO_Flag = 0;
    Gpio_Init(Gpio_KL30_Init);
    Simulated_IIC_2_Init();
    eeprom_StoreInfo_Init();

    Can_Init();
    Data_TPMS_KL30_Init ();
    CAN_TX_Init();
    //CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Enable);
    DFlash_init();
    Data_Read_DiagPara();
    Analog_Signal_Conv_Init();
    BU98R10_Init();   
    Uart0_Init(115200);
    Protocol_KL30_Wakeup_Init();
    BlueTooth_KL30_KL15_Wakeup_Init();
    Sys_KL30_Init();
    Checkself_Init();
    Data_Vehicle_Speed_KL30_Init();
    Data_Engine_Speed_KL30_Wakeup_Init();
    Data_Coolant_Temp_KL30_Init();
    LINE_IN_Init();
    Key_KL30_Init_EXample();
    //Light_Sensor_Init_Example();//注意顺序1
    LED_Driver_Init_Example();//注意顺序2
    LED_Driver_Service_Immediate();
    Data_User_Mileage_KL30Init();
    Fuel_KL30_Init();
    Data_Voltage_Init();
//    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER0, 400, 64000000);
    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER1, 1260, 64000000);
//    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER0, 400);
//    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER1, 400);
//    TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHB, ActiveLevel_High);
//    TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHC, ActiveLevel_High);
//    TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHD, ActiveLevel_High);
    TimerM_PWM_CH_Output_init(TIMERM_COUNTER1, TIMERM_CHB, ActiveLevel_High);
    Service_Interval_User_KL30Init();
    Telltales_Init();
    Telltales_UserInit();
    MenuData_Unit_Init();
    
    RTCInformation.u8RTCSecond = 0;
	RTCInformation.u8RTCMinute = 0;
	RTCInformation.u8RTCHour = 0;          
	RTCInformation.u8RTCDayOfMonth = 1;
	RTCInformation.u8RTCMonth = 1;   
	RTCInformation.u8RTCYear = 20; 
    RTE_RTC_Init(RTCInformation);
    RTE_DEEPSLEEP_GPIO_Interrupt_Enable(WAKEUP_KL15_In,Trigger_Rising);
    FaultCode_Init();
// Data_TPMS_Processing_Service();
    Common_DataInit();

    Power_KL30_Init_flag = 1;
    AliveCount_KL30_ResettingFlag = 1;
}
extern uint32_t PowerIgnOffTimeLine;
static void Power_Wakeup_Init(void)
{
    CAN_Send_Cound = 0;
    PowerIgnOffTimeLine = 0;
    //RTE_CLOCK_Select_Start();
    Gpio_Init(Gpio_WakeUp_Init);
    Simulated_IIC_2_Init();
    Can_Init();

    DFlash_init();
    Data_Read_DiagPara();
    eeprom_StoreInfo_Init();
    Analog_Signal_Conv_Init();
    Data_User_Mileage_WakeupInit();
    BU98R10_Init();    
    Sys_WakeUp_Init();
    Data_TPMS_KL15_WAKE_UP_Init();
    
    CAN_TX_Count_Init();
    CAN_TX_Init();
    
    //CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Enable);

    Data_Vehicle_Speed_KL30_Init();
    Data_Vehicle_Speed_Wakeup_Init();
    Data_Engine_Speed_KL30_Wakeup_Init();
    LINE_IN_Init();
    Key_KL30_Init_EXample();
    Line_In_KL15_ON_Init();
    MenuData_TCS_Init();
    //Light_Sensor_Init_Example();//注意顺序1
    LED_Driver_Init_Example();//注意顺序2
    LED_Driver_Service_Immediate();
    Protocol_KL30_Wakeup_Init();
    Uart0_Init(115200);
    BlueTooth_KL30_KL15_Wakeup_Init();
    Fuel_KL30_Init();
    Data_Voltage_Init();
//    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER0, 400, 64000000);
    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER1, 1260, 64000000);
//	  TimerM_PWM_counter_Output_Init(TIMERM_COUNTER0, 400);
//    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER1, 400);
//    TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHB, ActiveLevel_High);
//    TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHC, ActiveLevel_High);
//    TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHD, ActiveLevel_High);
    TimerM_PWM_CH_Output_init(TIMERM_COUNTER1, TIMERM_CHB, ActiveLevel_High);
    Telltales_Init();
    Telltales_UserInit();
    
    RTE_DEEPSLEEP_GPIO_Interrupt_Enable(WAKEUP_KL15_In,Trigger_Rising);
    FaultCode_Init();
    Service_Interval_User_WakeupInit();

    Common_DataInit();

    Power_KL30_Init_flag = 1;
    AliveCount_KL30_ResettingFlag = 1;
}

static void Power_LVP_Init(void)
{
    
}
static void Power_OVP_Init(void)
{
    
}

static void Power_IG_OFF_Init(void)
{
    Line_In_KL15_OFF_Init();
    Checkself_Init();
    Common_Input_Para();
    //CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Disable);
}

static void Power_IG_ON_Init(void)
{       
    CAN_TX_Count_Init();
    Checkself_Init();
    Line_In_KL15_ON_Init();
    Telltales_KL15_Init();
    Telltales_UserInit();
    Fuel_KL15_Init();
    Data_Voltage_Init();
    MenuData_TCS_Init();         
    Data_Coolant_Temp_KL15_Init();
    BlueTooth_KL30_KL15_Wakeup_Init(); 
    Data_TPMS_KL15_WAKE_UP_Init();   
    CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Enable);
    DFlash_init();
    Data_Read_DiagPara();
    FaultCode_Init();
    
    
}

static void Power_Sleep_Init(void)
{
//    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER0, 400, 0);
//    TimerM_PWM_counter_Output_Init(TIMERM_COUNTER1, 400, 0);
	//TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHB, ActiveLevel_High);
    //TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHC, ActiveLevel_High);
    //TimerM_PWM_CH_Output_init(TIMERM_COUNTER0, TIMERM_CHD, ActiveLevel_High);
    //TimerM_PWM_CH_Output_init(TIMERM_COUNTER1, TIMERM_CHB, ActiveLevel_High);
	//RTC_Stop();
    rte_can_deinit(CAN_CH_0);
	TMM0_Stop();
	TMM1_Stop();
    TMM_All_Stop();
    RTE_ADC_DeInit();
	//CGC->CSC = 1 ;   //HIOSTOP = 1
	BU98R10_Shutdown();
    Gpio_Init(Gpio_Sleep_Init);
    u8LEDDriverCheckCount = 0;
    LED_Driver_Service_Immediate();
    LED_Driver_Init_Sleep();
    LED_Driver_Service();
    Analog_Signal_Conv_Stop();
    UART_DeInit(UART0);
    
}

static Power_Status_em Power_Stay_ON(void)
{
    Power_Status_em u8PowerSts;
    u8PowerSts = EM_IGN_ON;

    if (SYS_OPR_STAT_IGN_OFF)
    {
        u8PowerSts = EM_IGN_OFF_Init;
    }

    if (SYS_OPR_STAT_HALT)
    {
        u8PowerSts = EM_IGN_LIMIT;
    }

    return u8PowerSts;
}
static Power_Status_em Power_Stay_OFF(void)
{
    Power_Status_em u8PowerSts;
    u8PowerSts = EM_IGN_OFF;

    if (Common_Get_IG_Sts( ) == COMMON_POWER_ON)
    {
        u8PowerSts = EM_IGN_ON_Init;
    }
    else
    {
        if ((Common_GetIgnOffTime() < 5000))
        {
            u8PowerSts = EM_IGN_OFF;
        }
        else
        {
            u8PowerSts = EM_IGN_Sleep_Init;
        }
    }

    return u8PowerSts;
}

extern uint16_t AliveCountTimer;
static Power_Status_em Power_Stay_Protect(void)
{
    Power_Status_em u8PowerSts;
    static uint8_t  i;
    static uint8_t  Delaycnt;
    static uint8_t LED;
    static uint8_t LEDDriverCheckCount = 0U;
    /* 关闭所有外设,坪保留AD采集,电溝状思切�? */
    {
        for(LED = 0u; LED < LampCh0_MAX; LED++)
        {
            LED_Driver_Channel_Set(0u, LED, 0u);
        }

        for ( i = 0; i < LED_Max; i++ )
        {
            Telltales_DiagCtrl(i, 0x00u);
        }

        LED_Driver_Scan_Refresh( );
        LED_Driver_Service_Immediate();

        BU98R10_Shutdown( );
        TimerM_PWM_set_duty(TIMERM_COUNTER1, TIMERM_CHB, 0);
        CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Disable);
        AliveCountTimer = 0;
    }
    u8PowerSts = EM_IGN_OFF_Init;
    /* 电溝模弝正常 */
    for ( ;; )
    {
        RTE_WDT_Clear();
        Gen_TimeDelay(2000u, 50u);
        for(LED = 0u; LED < LampCh0_MAX; LED++)
        {
            LED_Driver_Channel_Set(0u, LED, 0u);
        }

        for ( i = 0; i < LED_Max; i++ )
        {
            Telltales_DiagCtrl(i, 0x00u);
        }
        LED_Driver_Service( );
        Analog_Signal_Conv_Service();
        Sys_Status_Update_Service();

        Delaycnt++;
        if ( Delaycnt >= 5u )
        {
            Delaycnt = 0u;
            LED_Driver_Scan_Refresh( );
            if ( LEDDriverCheckCount >= 10U )
            {
                LEDDriverCheckCount = 0U;
                LED_Driver_Work_Check( );
            }
            else
            {
                LEDDriverCheckCount++;
            }
        }

        if ( SYS_OPR_STAT_RUN )
        {
            for ( i = 0; i < LED_Max; i++ )
            {
                Telltales_DiagRelease(i);
            }
            BU98R10_Init( );
            CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Enable);
            Common_DataInit();
            return u8PowerSts;
        }
    }
}

static Power_Status_em Power_Stay_Sleep(void)
{
    Power_Status_em u8PowerSts = EM_IGN_Sleep;
    
    
    while (1)
    {
        RTE_WDT_Clear();
        if(RTE_GPIO_Get_Level(WAKEUP_KL15_In) == 0)
        {
            RTE_DEEPSLEEP_Enable();
        }
        else //(RTE_GPIO_Get_Level(WAKEUP_KL15_In))/* KL15 */
        {
            u8PowerSts = EM_IGN_Wakeup;
            break;
        }
    }

    return u8PowerSts;
}


void Sys_Startup_Init(void)
{
    uint8_t u8StartuoMode = 0;
    PwrMemInit( );
    Power_Management_Init(u8StartuoMode);
    }