#include "PowerManagement.h"
#include "System_Monitor.h"
#include "Common_Interface.h"
#include "Data_CoolantTemperature.h"
#include "Data_VehicleSpeed.h"
#include "Data_EngineSpeed.h"
#include "Service_TPMS.h"
#include "Services_Mileage.h"
#include "Data_Gear.h"
#include "Data_Time.h"
#include "AC_TEMP.h"
#include "Service_OFF_Time.h"
#include "RTE_CAN_NM.h"
#include "Telltales.h"
#include "Line_in.h"
#include "Seg_Ref.h"
#include "Seatbelt.h"
#include "Door.h"
#include "Data_AirPressure.h"
#include "Key.h"
#include "Key_user.h"
#include "Menu.h"
#include "Services_ODO_User.h"
#include "AvgSpeed.h"
#include "Maintenance.h"
#include "GaugesInterface.h"
#include "Popup_Scheduler.h"
#include "GPIO.h"
#include "dr7f701441.dvf.h"
#include "Sound_Scheduler.h"
#include "Sound_Player.h"
#include "RTE_PWM_OUT.h"
#include "BackLight_APP.h"
#include "Clock.h"
#include "TimerB.h"
#include "SEG_DISPLAY.h"
#include "CD4051.h"
#include "GaugesInterface.h"
#include "DisplaySch_user.h"
#include "Data_FuelConsump.h"
#include "LED_Driver.h"
#include "LED_Driver_Interface.h"

#include "GUI.h"
#include "Data_Fuel_User.h"

#include "app_Service.h"
#include "UART.h"
#include "kwp2000_tp.h"
#include "kwp2000_protocol.h"
#include "kwp2000_service.h"

#include "RTE_TIME.h"
#include "Watchdog.h"
#include "GenDelay.h"
#include "DoCAN_ISO15765.h"
#include "UDS_ISO14229_Server.h"
#include "Analog_Signals.h"
#include "BGLInterface.h"
#include "BU98R10.h"
#include "RSCAN.h"
#include "RSCAN_Table.h"

#define POWER_NM_SLEEP  0U
#define POWER_NM_WAKEUP 1U

static uint8_t PowerGetNMStatus(void);
extern void SEG_LCD_Window_Switch(uint8_t Sw);

Power_Status_t Power_KL30_Init ( void )
{
    Power_Status_t u8PowerSts;
    RTE_RTC_KL30_Init();
    CD4051B_KL15Init();

    ClearNoInitArea();
    Common_DataInit();
    Sys_KL30_Init();
    Line_In_KL30_Init();
    Telltales_Left_Right_KL30_Init();
    Telltales_KL30_Init();
    SEG_BUFF_Init();
    DispSch_TotalInit();

    UserGaugeK30Init();

    Service_OFF_Timing_KL30Init();
    Data_User_Mileage_KL30Init();
    Data_AvgSpeed_KL30_Init();
    Data_Maintenance_Service_KL30_Init();

    Data_AC_Temp_KL30_Init();
    Data_TPMS_KL30_Init();
    Data_Gear_KL30_Init();
    Data_ODO_Clear_KL30Init();

    SeatbeltInit();
    Door_WakeUpInit();

    Key_KL30_Init_EXample();
    Key_Parameter_Set_Short_Press_1_Time(40, 800);
    Key_Parameter_Set_Long_Press_2_Time(4000);

    LED_Driver_Init();
    Sound_Scheduler_Init();
    Sound_Player_Init();
    RTE_PWM_Init();

    Popup_Scheduler_Init();

    /*5s不按按键计时清零*/
    //LongTimeNoKey_Operation_TimeRest();
    BL_Init();

    /*****油耗类****/
    Fuel_User_KL30_Init();
    u8PowerSts = m_IGN_OFF_Init;
    return  u8PowerSts;
}


void Power_Sleep_Init(void)
{
    /*数据*/
    Speed_Sleep_Init();
    Tacho_Sleep_Init();
    Coolant_Sleep_Init();

    /*燃油库睡眠前需要调用 ----20220503----*/
    Fuel_User_Sleep_Init();

    /*外设*/
    Seg_Display_OFF();

    UART_Sleep_Init();
    Buzzer_Shutdown(); /*蜂鸣器*/
    TimerB_PWM_Channel_Sleep(TIMERB_0_CH15);
    TimerB_PWM_Channel_Sleep(TIMERB_2_CH1);
    TimerB_PWM_Channel_Sleep(TIMERB_2_CH7);
    TimerB_PWM_Channel_Sleep(TIMERB_1_CH15);
    TimerB_PWM_Channel_Sleep(TIMERB_0_CH7);

    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_0);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_1);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_2);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_3);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_4);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_5);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_6);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_7);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_8);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_9);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_10);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_11);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_12);
    RSCAN0_CH0_Abort(RSCAN_CHANNEL_BUF_13);

    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_0);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_1);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_2);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_3);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_4);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_5);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_6);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_7);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_8);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_9);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_10);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_11);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_12);
    RSCAN0_CH2_Abort(RSCAN_CHANNEL_BUF_13);

    RSCAN0_Sleep_Init();

    VCC12V0_OUT_EN = 0u;        /*12V 电源使能*/
    VCC05V0_OUT_EN = 0u;        /*外设5V 电源使能*/
    D1530_EN_MCU_OUT = 0u;      /*1530 使能*/
    //BL_ACC_EN = 1U;             /*8867 使能*/
    Fuel_VCC05V_OUT_EN = 0u ;   /*燃油电源 使能*/
    AIR_5V_OUT_EN = 0u;         /*气压 5V*/
    ACC5V_LED_PWM_MCU = 0u;
    BUZZER_ACC_OUT_EN = 0u;

    GPIO_Init(GPIO_SLEEP_MODE );
}


Power_Status_t Power_Wakeup_Init ( void )
{
    Kwp2000_Init();

    Power_Status_t u8PowerSts;

    Common_DataInit();
    Sys_WakeUp_Init();
    Line_In_KL30_Init();
    Telltales_Left_Right_KL30_Init();
    Telltales_KL30_Init();
    SEG_BUFF_Init();
    DispSch_TotalInit();

    Telltales_Wakeup_Init();
    Data_Time_WakeUp_Init();

    UserGaugeK30Init();

    Data_User_Mileage_KL15Init();
    Maintenance_WakeUp_Init();

    SeatbeltInit();
    Door_WakeUpInit();

    RTE_PWM_Init();
    Key_Wakeup_Init_EXample();

    /*燃油新增 ----20220503----*/
    Fuel_User_Wakeup_Init();

    LED_Driver_Init();
    /*报警调度初始化*/
    Popup_Scheduler_Init();
    /*报警调度初始化*/
    Sound_Scheduler_Init();
    Sound_Player_Init();
    u8PowerSts = m_IGN_OFF_Init;
    return  u8PowerSts;
}




void Power_IG_OFF_Init(void)
{
    Line_In_KL15_OFF_Init();
    Speed_KL15_OFF_Init();
    Tacho_KL15_OFF_Init();
    Coolant_KL15_OFF_Init();
    //Maintenance_KL15_OFF_Init();
    /*表头参数初始OFF下调用 added by yutian*/
    GaugesK15Init_OFF() ;/*仪表IGOFF调用*/
    /*end*/
    /*报警调度*/
    Popup_Scheduler_OFF();
    //Menu_Init_IG(0u);
    GUI_Display_KL15_OFF_Init();

    /*关闭所有断码*/
    Seg_Display_OFF();
    Key_Set_IG_Status(KEY_IG_OFF);
}
void Power_IG_ON_Init(void)
{
    Kwp2000_Init();
    DiagnosisInit_main();
    Data_ODO_Clear_KL15Init();
    Telltales_KL15_Init();
    Line_In_KL15_ON_Init();
    Coolant_KL15_ON_Init();
    Data_Time_KL15_Init();
    Data_AC_Temp_KL15_Init();
    Data_TPMS_KL15_ON_Init();
    Service_OFF_Timing_KL15Init();
    Tacho_KL15_ON_Init();
    Speed_KL15_ON_Init();
    Data_Gear_KL15_Init();
    /*表头数据处理 added by yutian*/
    UserGaugeK15Init() ;/*仪表IGON调用*/
    /*end*/
    CD4051B_KL15Init();
    Key_Set_IG_Status(KEY_IG_ON);
    /*5s不按按键计时清零*/
    //LongTimeNoKey_Operation_TimeRest();

    DispSch_TotalInit();
    GUI_Display_KL15_ON_Init();

    /*气压1 气压2 WET气压数据初始化*/
    AirPressure_KL15_ON_Init();
}

Power_Status_t Power_Stay_ON(void)
{
    Power_Status_t u8PowerSts;
    uint8_t u8Condition1;
    uint8_t u8Condition2;
    uint8_t u8Condition3;
    u8Condition1 = Common_Get_IG_Sts() ;
    u8Condition2 = Common_Get_IG_Sts_Valid();
    u8Condition3 = System_FUN_KL30_Status_Get();
    if ((u8Condition1 == COMMON_POWER_ON ) && ( u8Condition2 == COMMON_Valid))
    {
        u8PowerSts = m_IGN_ON;
    }
    else
    {
        if ((u8Condition1 == COMMON_POWER_OFF ) && (u8Condition2 == COMMON_Valid))
        {
            u8PowerSts = m_IGN_OFF_Init;
        }
        else
        {
            u8PowerSts = m_IGN_ON;
        }
    }
    if (((u8Condition3 == 1u) || (u8Condition3 >= 7u)))
    {
        u8PowerSts = m_IGN_LIMIT;
    }
    return  u8PowerSts;
}

Power_Status_t Power_Stay_OFF(void)
{
    Power_Status_t u8PowerSts;
    uint8_t u8Condition1;
    uint8_t u8Condition2;
    uint32_t Get_Menu_Off_Time;

    u8Condition1 = Common_Get_IG_Sts() ;
    u8Condition2 = Common_Get_IG_Sts_Valid();
    Get_Menu_Off_Time = Coom_Get_Menu_Off_Time();

    if ((u8Condition1 == COMMON_POWER_ON ) && (u8Condition2 == COMMON_Valid))
    {
        u8PowerSts = m_IGN_ON_Init;
    }
    else
    {
        if ((u8Condition1 == COMMON_POWER_OFF ) && (u8Condition2 == COMMON_Valid))
        {
            if (
                (PowerGetNMStatus() == POWER_NM_SLEEP) &&
                (LED_WAKEUP == LEVEL_LOW) &&
                (Get_Menu_Off_Time >= 150050)
            )
            {
                u8PowerSts = m_IGN_Sleep_Init;
            }
            else
            {
                u8PowerSts = m_IGN_OFF;
            }
        }
        else
        {
            u8PowerSts = m_IGN_OFF;
        }
    }
    return  u8PowerSts;
}



Power_Status_t  Power_Stay_Protect(void)
{
    Power_Status_t u8PowerSts = m_IGN_OFF_Init;
    uint32_t Delaycnt = 0;

    /*关应用关闭了段码,所有背光,CAN 屏幕显示没有关闭 123……*/
    Seg_Display_OFF();
    BackLightSchedu(0, 0);
    SEG_LCD_Window_Switch(0);
    BU98R10_Shutdown();
    Line_In_KL15_OFF_Init();

    for (;;)
    {
        /*喂狗*/
        WDT_Clear( );
        CAN_TX_SetEnable(0);

        /*一定周期调用2ms*/
        Gen_TimeDelay(2000u, 50u);
        DoCAN_Communication_Service( );
        UDS_Server_Application_Service( );
        UDS_10ms_Service( );
        Analog_Signal_Conv_Service();
        Sys_Status_Update_Service( );

        Seg_Buffer_Commit();

        Delaycnt++;
        if ( Delaycnt >= 5u )
        {
            Delaycnt = 0u;
            CAN_BUSOFF_Recover();
            //Can_BusOff_Fun();
        }

        /*- 电源模式正常,退出 -*/
        if ( SYS_OPR_STAT_RUN )
        {
            CAN_TX_SetEnable(0x55);
            CD4051B_KL15Init();
            Line_In_KL15_ON_Init();
            SEG_BUFF_Init();
            BU98R10_Init();

            return u8PowerSts;
        }
    }

    return  u8PowerSts;
}



Power_Status_t Power_Stay_Sleep ( void )
{
    Power_Status_t u8PowerSts;

    Sys_Enter_Sleep_Mode();




    u8PowerSts = m_IGN_OFF_Init;
    return  u8PowerSts;
}


static uint8_t PowerGetNMStatus(void)
{
    uint8_t u8NMStatus = 0U;
    NM_Mode_t m_condition;
    m_condition = RTE_CAN_NM_GetStatus();

    if (m_condition == NM_Mode_Sleep)
    {
        u8NMStatus = POWER_NM_SLEEP;
    }
    else
    {
        u8NMStatus = POWER_NM_WAKEUP;
    }




    return u8NMStatus;
}




void ClearNoInitArea(void)
{
    uint32_t  *pRam;
    uint32_t  p;
    pRam = (unsigned int*)0x3FCE4000ul;
    for (p = 0ul; p < 4096ul; p ++)
    {
        pRam[ p ] = 0ul;
    }
}