#include "PowerManag_User.h"
#include "GPIO.h"
#include "Mileage.h"
#include "Mileage_user.h"
#include "Buzzer_Play_User.h"
#include "Sound_Alarm_User.h"
#include "Key.h"
#include "Key_user.h"
#include "api_tft.h"
#include "CAN_CH0_CAN_Communication_Matrix.h"
#include "RTE_PWM.h"
#include "Task.h"
#include "Hysteresis.h"
#include "Hysteresis_user.h"
#include "Watchdog.h"
#include "LCD_BUS.h"
#include "LCD_MonoTFT.h"
#include "LCBI_DMA.h"
#include "RTE_CAN.h"
#include "Rscan.h"
#include "LED_Driver.h"
#include "Simulated_IIC_Master.h"
#include "Non_volatile_Memorys.h"
#include "EEPROM_24Cxx_Remap.h"
#include "Line_In_user.h"
#include "Telltales_user.h"
// #include "imag_Map.h"
#include "PIC_Comm.h"
// #include "Imag_TFT.h"
#include "RTC.h"
#include "Sys_Tick.h"
#include "CAN_1939.h"
#include "CAN_1939_user.h"

#include "NM_Config.h"
#include "CAN_CFG.h"
#include "NMUserControl.h"
#include "Gauges.h"

#include "Analog_Signals.h"

#include "LED_Driver_Interface.h"
#include "GUI.h"


extern void FDL_Init(void);
uint16_t u16PoMaSleepDelay = 0;
void     PoMa_Sleep_Delay_Time_Clean(void)
{
    u16PoMaSleepDelay   = 0UL;
    PowerIgnOffTimeLine = 0;
}
void PoMa_Sleep_Delay_Time_Handle(void)
{
    if ( u16PoMaSleepDelay < 6000 )
    {
        u16PoMaSleepDelay++;
    }
}

void PoMa_KL30_Init(void)
{
    Sys_Tick_Timer_Call_Back_Reg(SYS_TICK_50us_CB, Sys_Process_ISR);
    IIC_Init( );
    NVM_Init( );
    //RTI_Init( );
    FDL_Init( );
    OsekNMInit( );
    SendMsg30Init( );
    COM_CAN_Init( );
    __EI( );
    Sys_Tick_Timer_Start( );
    RTC_Pre_Init( );    // 首次上电
    Draw_ClearVramCalFlag( );
    WDT_Clear( );
    PWM_Init( );

#ifndef INNER_PIC_ON
    BSP_QSPI_Init( );
// Gui_LoadFontInfo();
#endif
    LCD_BUS_Init( );
    LCD_Panel_Start_Up( );
    LED_Driver_Init_Example( );
    Mileage_KL30_Init_Example( );
    Maint_Init( );
    Key_KL30_Init_EXample( );
    Hys_KL30_Init_EXample( );
    Buzzer_Play_Init_Example( );
    Pop_Alarm_Init_Example( );
    Sound_Alarm_Init_Example( );
    CAN_J1939_Init_Example( );
    Gauges_KL30_Init( );
    LINE_IN_Init( );
    Telltales_Init( );
    Vehicle_Speed_Init( );
    Engine_Speed_Init( );
    Coolant_Init( );
    Menu_User_Init(POMA_RESET_KL30);
    GUI_Light_Init( );
    GUI_Sound_Init( );
    Data_AvgFuel_KL30_Init( );
    Can_AvgFuel_KL30_WakeUp_Init( );
    Data_AvgFuel_A_KL30_Init( );
    SetFuelInit( );
    Data_Fuel_Display_Init( );
    ExecFuel_Init( );
    COM_CAN_Init( );
    Flash_Init( );
    Data_30KL_Init( );
    Data_AverageSpeed_KL30_Init( );
    Data_TPMS_30_15KL_Processing( );
    Display_Ctrl_Init( );
}
void PoMa_IG_OFF_Init(void)
{
    NM_SetIgnState(0); /* 网络管理IGN OFF */
    Mileage_IG_OFF_Init( );
    Gauges_KL15OFF_Init( );
    Popups_Alarm_Trigger_OFF_Init( );
    Sound_Alarm_Trigger_OFF_Init( );
    Display_Ctrl_OFF_Init( );
    SetPowerSt(0);
    Line_In_KL15_OFF_Init( );
    //RTI_Timing_Service( );
}
void PoMa_IG_ON_Init(void)
{
    Osek_APP_TX_Init( );
    NM_SetIgnState(1); /* 网络管理IGN ON*/
    Mileage_IG_ON_Init( );
    Gauges_KL15ON_Init( );
    Popups_Alarm_Trigger_ON_Init( );
    Sound_Alarm_Trigger_ON_Init( );
    Display_Ctrl_Init( );
    Vehicle_Speed_Init( );
    Engine_Speed_Init( );
    Line_In_KL15_ON_Init( );
    Telltales_KL15_Init( );
    Data_TPMS_30_15KL_Processing( );
    Flash_Init( );
    Data_15KL_Init( );
    Data_Fuel_Display_Init( );
    Hys_KL30_Init_EXample( );
}
void PoMa_Wakeup_Init(void)
{
    Sys_Tick_Timer_Call_Back_Reg(SYS_TICK_50us_CB, Sys_Process_ISR);
    FDL_Init( );
    OsekNMInit( );
    SendMsg30Init( );
    COM_CAN_Init( );
    Mileage_Wakeup_Init_Example( );
    Gauges_Wake_Up_Init( );
    __EI( );
    Sys_Tick_Timer_Start( );
    Popups_Alarm_Trigger_WakeUp_Init( );
    Draw_ClearVramCalFlag( );
    WDT_Clear( );
    PWM_Init( );
    FuelWake( );

#ifndef INNER_PIC_ON
    BSP_QSPI_Init( );
// Gui_LoadFontInfo();
#endif
    LCD_BUS_Init( );
    LCD_Panel_Start_Up( );
    Maint_Init( );
    LED_Driver_Init_Example( );
    Key_KL30_Init_EXample( );
    PoMa_Sleep_Delay_Time_Clean( );
    LINE_IN_Init( );
    Telltales_Init( );
    Menu_User_Init(POMA_RESET_WAKEUP);
    Hys_Wakeup_Init_EXample( );
    Buzzer_Play_Init_Example( );
    Pop_Alarm_Init_Example( );
    Sound_Alarm_Init_Example( );
    CAN_J1939_Init_Example( );
    Data_TPMS_30_15KL_Processing( );
    Line_In_KL15_ON_Init( );
    COM_CAN_Init( );
    Display_Ctrl_Init( );
}
void PoMa_Sleep_Init(void)
{
    LCD_Panel_Shut_Down( );
    LED_Driver_Shutdown_Pin_Set(0);
    Simulated_IIC_2_Stop( );
    WDT_Clear( );
    AbortAllCanTx( );
    RSCAN0_Sleep_Init( );
    Gauges_Sleep_Init( );
    LED_Driver_Init_Sleep( );
    FuelSleep( );
}
void PoMa_Sleep_Loop(void)
{
    WDT_Clear( );
    Sys_Enter_Sleep_Mode( ); /*休眠函数*/
}
PoMa_uint16_t PoMa_Read_KL30_Voltage_Force(void)
{
    PoMa_uint16_t u16Voltage;
    u16Voltage = ADC_Conv_Single_Channel(ADC_CH_KL30_VOLTAGE);
    return u16Voltage;
}
PoMa_uint16_t PoMa_Read_KL15_Voltage_Force(void)
{
    PoMa_uint16_t u16Voltage;
    u16Voltage = ADC_Conv_Single_Channel(ADC_CH_KL15_VOLTAGE);
    return u16Voltage;
}
PoMa_uint16_t PoMa_Read_KL30_Voltage(void)
{
    PoMa_uint16_t u16Voltage;
    u16Voltage = ADC_Read_Signal(ADC_CH_KL30_VOLTAGE);
    return u16Voltage;
}
PoMa_uint16_t PoMa_Read_KL15_Voltage(void)
{
    PoMa_uint16_t u16Voltage;
    u16Voltage = ADC_Read_Signal(ADC_CH_KL15_VOLTAGE);
    return u16Voltage;
}
PoMa_uint16_t PoMa_Read_KL15_Line(void)
{
    PoMa_uint16_t u8PoMaStatus = 0U;
    if ( GPIO_IN_PORT0_PIN0 )
    {
        u8PoMaStatus = 1U;
    }
    return u8PoMaStatus;
}

PoMa_uint16_t PoMa_Check_Sleep(void)
{

    PoMa_uint16_t u8PoMaStatus = 1;

    if ( Pop_Alarm_Get_Current( ) < POP_ALARM_MAX )
    {
        u16PoMaSleepDelay = 0;
        u8PoMaStatus      = 0;
    }
    if ( Sound_Alarm_Current_Read( ) < SOUND_ALARM_MAX )
    {
        u16PoMaSleepDelay = 0;
        u8PoMaStatus      = 0;
    }

    if ( Get_OFF_FUEL_Dely_Time( ) <= 300 )
    {
        u8PoMaStatus      = 0;
        u16PoMaSleepDelay = 0;
    }

    if ( DMA_GetTransferStatus( ) != notOnGoing )
    {
        u8PoMaStatus      = 0;
        u16PoMaSleepDelay = 0;
    }

    if ( GetNmBusSleepSt( ) != 1 )
    {
        u8PoMaStatus      = 0;
        u16PoMaSleepDelay = 0;
    }
    if ( Common_GetIgnOffTime( ) <= 20000 )
    {
        u8PoMaStatus      = 0;
        u16PoMaSleepDelay = 0;
    }
    if ( u16PoMaSleepDelay < 50 )
    {
        u8PoMaStatus = 0;
    }

    return u8PoMaStatus;
}
PoMa_uint16_t PoMa_Check_Wakeup(void)
{
    PoMa_uint16_t u8PoMaStatus = 0;
    return u8PoMaStatus;
}
#define Hard_Delay_1MS_16843 24000UL
void PoMa_Delay(PoMa_uint16_t u16DelayMs)
{

    uint32_t u32DelayCount = 0;
    uint32_t i             = 0;
    WDT_Clear( );
    for ( u32DelayCount = 0; u32DelayCount < u16DelayMs; u32DelayCount++ )
    {
        for ( i = 0; i < Hard_Delay_1MS_16843; i++ )
        {
        }
    }
    WDT_Clear( );
}
void PoMa_Voltage_High_Init(void)
{
    uint8_t i = 0;
    uint8_t j = 0;
    uint8_t k = 0;
    for ( k = 0; k < LED_Max; k++ )
    {
        Telltales_DiagCtrl(k, 0);
    }
    LED_Driver_Channel_Set(0, LED_TurnLeft_Lamp, 0);
    LED_Driver_Channel_Set(0, LED_TurnRight_Lamp, 0);

    for ( j = 0; j < SOUND_ALARM_MAX; j++ )
    {
        Sound_Alarm_Delete_Normal(j);
    }
    for ( j = 0; j < POP_ALARM_MAX; j++ )
    {
        Pop_Alarm_Delete_Normal(j, POP_DELAY_NULL);
    }
    PWM_Channel_Set_Duty(1, 0);    // 表盘
    PWM_Channel_Set_Duty(3, 0);    // 指针
    PWM_Channel_Set_Duty(5, 0);    // 3.5
}
void PoMa_Voltage_Low_Init(void)
{
    uint8_t i = 0;
    uint8_t j = 0;
    uint8_t k = 0;
    for ( k = 0; k < LED_Max; k++ )
    {
        Telltales_DiagCtrl(k, 0);
    }
    LED_Driver_Channel_Set(0, LED_TurnLeft_Lamp, 0);
    LED_Driver_Channel_Set(0, LED_TurnRight_Lamp, 0);

    for ( j = 0; j < SOUND_ALARM_MAX; j++ )
    {
        Sound_Alarm_Delete_Normal(j);
    }

    for ( j = 0; j < POP_ALARM_MAX; j++ )
    {
        Pop_Alarm_Delete_Normal(j, POP_DELAY_NULL);
    }
    PWM_Channel_Set_Duty(1, 0);    // 表盘
    PWM_Channel_Set_Duty(3, 0);    // 指针
    PWM_Channel_Set_Duty(5, 0);    // 3.5
}
void PoMa_Voltage_Normal_Init(void)
{
    uint8_t i = 0;
    for ( i = 0; i < LED_Max; i++ )
    {
        Telltales_DiagRelease(i);
    }
}
const PoMa_Voltage_Attribute_st_t stPoMaVoltageAttribute [ POMA_VOLTAGE_NUM ] = {
    {0UL, 7500UL, 60000UL, PoMa_Voltage_Low_Init, 0},
    {8000UL, 17500UL, 0UL, PoMa_Voltage_Normal_Init, 0},
    {18000UL, 0XFFFFUL, 60000UL, PoMa_Voltage_High_Init, 0},
};
const PoMa_Init_st_t stPoMaInit = {
    PoMa_KL30_Init,
    PoMa_IG_OFF_Init,
    PoMa_IG_ON_Init,
    PoMa_Wakeup_Init,
    PoMa_Sleep_Init,
    PoMa_Sleep_Loop,
    POMA_IG_LINE,
    6500,
    6000,
    120,
    100,
    PoMa_Read_KL15_Line,
    PoMa_Read_KL15_Voltage,
    PoMa_Read_KL30_Voltage,
    PoMa_Read_KL15_Voltage_Force,
    PoMa_Read_KL30_Voltage_Force,
    PoMa_Check_Sleep,
    PoMa_Check_Wakeup,
    PoMa_Delay,
    200U,
    POMA_VOLTAGE_NUM,
};
/************************************************/
#pragma ghs section bss = ".myNonInitArea"
/*放在休眠唤醒后不丢失的区域*/
#pragma alignvar(8)
PoMa_uint8_t        u8PoMaRamData [ POMA_RAM_DATA_LEN ];
#pragma ghs section bss = default
void                PoMa_Init_Example(PoMa_uint8_t u8ResetSource)
{
    PoMa_Init(u8ResetSource, u8PoMaRamData, &stPoMaInit, &stPoMaVoltageAttribute);
}