#include "Telltales_Lib.h"
#include "Telltales_user.h"
#include "Line_In\Line_In_user.h"
#include "Application.h"
#include "CAN_APP\CAN_CH0_CAN_Communication_Matrix.h"
#include "Components.h"

static Tellib_uint16_t LED_High_Beam_Judgement(void);
static void            LED_High_Beam_Execution(Tellib_uint16_t led_status);
static Tellib_uint16_t LED_Efi_Fault_Judgement(void);
static void            LED_Efi_Fault_Execution(Tellib_uint16_t led_status);
static Tellib_uint16_t LED_Auto_Start_Stop_Judgement(void);
static void            LED_Auto_Start_Stop_Execution(Tellib_uint16_t led_status);
static Tellib_uint16_t LED_Voltage_Judgement(void);
static void            LED_Voltage_Execution(Tellib_uint16_t led_status);

static Tellib_uint16_t LED_Fuel_Judgement(void);
static void            LED_Fuel_Execution(Tellib_uint16_t led_status);

static Tellib_uint16_t LED_Atmosphere_Judgement(void);
static void            LED_Atmosphere_Execution(Tellib_uint16_t led_status);
uint8_t u8CanId401Flag = 0;
const LED_Attribute_st LED_Attribute [ LED_Max ] = {
    /*  指示灯索引                  是否自检          外部信号自检           工作电源状态       自检开始时间    自检持续时间       指示灯点亮条件                           指示灯执行函数               */
    
    {em_LED_High_Beam,            SelfCheck,     NoExterNalCheck,        LED_IGN_ON,             0u,         3000ul,         LED_High_Beam_Judgement,            LED_High_Beam_Execution },
    {em_LED_Efi_Fault,            SelfCheck,     NoExterNalCheck,        LED_IGN_ON,             0u,         3000ul,         LED_Efi_Fault_Judgement,            LED_Efi_Fault_Execution },
    {em_LED_Auto_Start_Stop,      SelfCheck,     NoExterNalCheck,        LED_IGN_ON,             0u,         3000ul,         LED_Auto_Start_Stop_Judgement,      LED_Auto_Start_Stop_Execution },
    {em_LED_Voltage,              SelfCheck,     NoExterNalCheck,        LED_IGN_ON,             0u,         3000ul,         LED_Voltage_Judgement,              LED_Voltage_Execution },    
    {em_LED_Fuel,                 SelfCheck,     NoExterNalCheck,        LED_IGN_ON,             0u,         3000ul,         LED_Fuel_Judgement,                 LED_Fuel_Execution },
    {em_LED_Atmosphere,           SelfCheck,     NoExterNalCheck,        LED_IGN_ON,             0u,         3000ul,         LED_Atmosphere_Judgement,           LED_Atmosphere_Execution},
};


Tellib_uint8_t Tel_Mem [ Tel_MEM_Block_Size * LED_Max + Tel_MEM_Block_Addition ];

void Telltales_Init(void)
{
    TelExtPara m_ExtPara;
    m_ExtPara.TotalLength           = LED_Max;
    m_ExtPara.LED_PowerOFF_TimerCbk = Common_GetIgnOffTime;
    m_ExtPara.LED_PowerON_TimerCbk  = Common_GetIgnOnTime;
    m_ExtPara.LED_PowerCbk          = Common_Get_IG_Sts;
    u8CanId401Flag = 0;
    Telltales_KL30_Wakeup_Init(Tel_Mem, LED_Attribute, &m_ExtPara);
}


void Can_ID_401(uint8_t CopyData [])
{
    u8CanId401Flag = 1;
}

  
static Tellib_uint16_t LED_High_Beam_Judgement(void)
{
    Tellib_uint16_t LED_STATE = 0u;
    if (Line_In_Get_Status(LINE_IN_HighBeam))
    {
        LED_STATE = 1;
    }
    else
    {
        LED_STATE = 0;
    }
    return LED_STATE;
}
static void LED_High_Beam_Execution(Tellib_uint16_t led_status)
{
    if ( led_status == 1u )
    {
        RTE_GPIO_Set_Level(HighBeam_MUC_OUT, LED_LINEOUT_High);
    }
    else
    {
        RTE_GPIO_Set_Level(HighBeam_MUC_OUT, LED_LINEOUT_Low);
    }
}
static Tellib_uint16_t LED_Efi_Fault_Judgement(void)
{
    Tellib_uint16_t LED_STATE = 0u;
    if (CAN_MSG_Status(&CAN_CH0_CanMsgOp, CAN_CH0_ID_CAN_0x402_Msg_Count) == CAN_SIG_LOST)
    {
        LED_STATE = 0u;
    }
    else
    {
        if(Get_CAN_CH0_ID_402_Sig_ECU_Warning_Lamp() == 1)
        {
            LED_STATE = 1u;
        }
        else
        {
            LED_STATE = 0u;
        }
    }
    return LED_STATE;
}
static void LED_Efi_Fault_Execution(Tellib_uint16_t led_status)
{
    if ( led_status == 1u )
    {
        RTE_GPIO_Set_Level(EFI_FAULT_OUT, LED_LINEOUT_High);
    }
    else
    {
        RTE_GPIO_Set_Level(EFI_FAULT_OUT, LED_LINEOUT_Low);
    }
}

Tellib_uint8_t Auto_Start_Stop      = 0u;
Tellib_uint8_t Key_ISTOP            = 0u;
void Telltales_Auto_Start_Stop(void)
{
    Auto_Start_Stop = 0;
    
}
void Telltales_Auto_Start_Stop_Setting(void)
{
    if (Auto_Start_Stop == 0)
    {
        Auto_Start_Stop = 1;
    }
    else if (Auto_Start_Stop == 1)
    {
        Auto_Start_Stop = 0;
    }
    else
    {
        ;
    }
}
static Tellib_uint16_t LED_Auto_Start_Stop_Judgement(void)
{
    Tellib_uint16_t LED_STATE = 0u;
    
    if (Auto_Start_Stop == 1)
    {
        if (Line_In_Get_Status(LINE_IN_Auto_Start_Stop))
        {
            LED_STATE = 1;            
        }
        else
        {
            LED_STATE = 0;            
        }
    }
    else 
    {
        LED_STATE = 0;        
    }
    
    return LED_STATE;
}
static void LED_Auto_Start_Stop_Execution(Tellib_uint16_t led_status)
{
    if ( led_status == 1u )
    {
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_07_Key_ISTOP, LED_ON);        
        SEG_SET_LED_STS(1,1);  
    }
    else
    {
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_07_Key_ISTOP, LED_OFF); 
        SEG_SET_LED_STS(1,0);   
    }
}

Tellib_uint8_t Telltales_Voltage_Date(void)
{
    Tellib_uint8_t Voltage = 0;
    Voltage = Get_CAN_CH0_ID_401_Sig_ECU_Battery_Voltage();    
    return Voltage;
} 
static Tellib_uint16_t LED_Voltage_Judgement(void)
{
    Tellib_uint16_t LED_STATE = 0u;
    Tellib_uint16_t Voltage    = 0u;
    Voltage = Telltales_Voltage_Date();
    if ((CAN_MSG_Status(&CAN_CH0_CanMsgOp, CAN_CH0_ID_CAN_0x401_Msg_Count) == CAN_SIG_LOST) || (u8CanId401Flag != 1))
    {
        u8CanId401Flag = 0;
        LED_STATE = 0u;
    }
    else
    {
        if ((Voltage < 120) || (Voltage > 150)) 
        {
            LED_STATE = 1u;
        }
        else 
        {
            LED_STATE = 2u;
        }
    }
    return LED_STATE;
}
static void LED_Voltage_Execution(Tellib_uint16_t led_status)
{
    if ( led_status == 1u )
    {
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_03_High_Low_Voltage, LED_ON);  
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_02_Normal_Voltage, LED_OFF); 
        SEG_SET_LED_STS(0,1);        
    }
    else if ( led_status == 2u )
    {
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_02_Normal_Voltage, LED_ON); 
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_03_High_Low_Voltage, LED_OFF); 
        SEG_SET_LED_STS(0,1);
    }
    else
    {
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_03_High_Low_Voltage, LED_OFF);  
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_02_Normal_Voltage, LED_OFF); 
        SEG_SET_LED_STS(0,0);  
    }
}

static Tellib_uint16_t LED_Fuel_Judgement(void)
{
    Tellib_uint16_t LED_STATE = 0u;
    if (Common_GetIgnOnTime() >= 3000)
    {
        if(Get_Fuel_Sensor_State() == FuelSensorNormal)
        {
            if(Get_CurFuelSetp() > 1)
            {
                LED_STATE = 3;//白灯
            }
            else 
            {
                LED_STATE = 2;//格小于等于1
            }
        }
        else
        {
            LED_STATE = 2;//开路
        }
    }
    else
    {
        LED_STATE = 1;//自检只亮黄
    }
    return LED_STATE;
}
static void LED_Fuel_Execution(Tellib_uint16_t led_status)
{
    if ( led_status == 3u )
    {
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_04_Fuel_W, LED_ON);  
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_05_Fuel_Y, LED_OFF);  
        SEG_SET_LED_STS(2,1);      
    }
    else if ( led_status == 2u )
    {
        if (FLASH_SYNC_1Hz)
        {
            LED_Driver_Channel_Set(LampChannel_0, LampCh0_05_Fuel_Y, LED_ON);
            SEG_SET_LED_STS(2,1);
        }
        else
        {
            LED_Driver_Channel_Set(LampChannel_0, LampCh0_05_Fuel_Y, LED_OFF);
            SEG_SET_LED_STS(2,0);
        }
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_04_Fuel_W, LED_OFF);  
        
    }
    else if ( led_status == 1u )
    {
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_05_Fuel_Y, LED_ON);
        SEG_SET_LED_STS(2,1);
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_04_Fuel_W, LED_OFF);  
    }
    else 
    {
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_04_Fuel_W, LED_OFF); 
        LED_Driver_Channel_Set(LampChannel_0, LampCh0_05_Fuel_Y, LED_OFF);
        SEG_SET_LED_STS(2,0);
    }
}

static Tellib_uint16_t LED_Atmosphere_Judgement(void)
{
    Tellib_uint16_t LED_STATE = 0u;
    LED_STATE = 1;
    return LED_STATE;
}
static void LED_Atmosphere_Execution(Tellib_uint16_t led_status)
{
    if (led_status == 1)
    {
        RTE_GPIO_Set_Level(AMBIENT_LIGHT_B, LED_LINEOUT_High);        
    }
    else
    {
        RTE_GPIO_Set_Level(AMBIENT_LIGHT_B, LED_LINEOUT_Low);        
    }
}

void Turn_Left_Right_Lamp(void)
{
    if ( SYS_OPR_STAT_IGN_ON )
    {
        if (Common_GetIgnOnTime() >= 3000)
        {
            if (Line_In_Get_Status(LINE_IN_TurnLeft))
            {
                RTE_GPIO_Set_Level(LeftTurn_MUC_OUT, LED_LINEOUT_High);
            }
            else
            {
                RTE_GPIO_Set_Level(LeftTurn_MUC_OUT, LED_LINEOUT_Low);
            }
            if (Line_In_Get_Status(LINE_IN_TurnRight))
            {
                RTE_GPIO_Set_Level(RightTurn_MUC_OUT, LED_LINEOUT_High);
            }
            else
            {
                RTE_GPIO_Set_Level(RightTurn_MUC_OUT, LED_LINEOUT_Low);
            }
        }
        else
        {
            RTE_GPIO_Set_Level(RightTurn_MUC_OUT, LED_LINEOUT_High);
            RTE_GPIO_Set_Level(LeftTurn_MUC_OUT, LED_LINEOUT_High);
        }
    }
    else
    {
        RTE_GPIO_Set_Level(RightTurn_MUC_OUT, LED_LINEOUT_Low);
        RTE_GPIO_Set_Level(LeftTurn_MUC_OUT, LED_LINEOUT_Low);
    }
}