#include "CAN_Lib.h"
#include "CAN_APP.h"
#include "CAN_APP_TX.h"
#include "DataProcess.h"
#include "CAN_CH0_CAN_Communication_Matrix.h"


#include "Analog_Signals.h"


#include "Line_In.h"

#include "Key.h"
#include "g_includes.h"


/*uint8_t CrcCheckSum(uint8_t *data, uint8_t len)
{
    uint8_t crc        = 0xff;
    uint8_t CRC_POLY   = 0x2f;
    uint8_t crcxor     = 0xff;
    uint8_t bit_index  = 0;
    uint8_t byte_index = 0;

    for ( byte_index = 0; byte_index < len; ++byte_index )
    {
        crc ^= data [ byte_index ];
        for ( bit_index = 0; bit_index < 8; ++bit_index )
        {
            if ( (crc & 0x80) != 0 )
                crc = (crc << 1) ^ CRC_POLY;
            else
                crc = (crc << 1);
        }
    }

    crc = crc ^ crcxor;

    return crc;
}*/

void Can_Set_Buff_18FEC1EE(canlib_uint8_t CopyData [])
{
    uint32_t             odo_Val, trip_Val;
    CANMsg18FEC1EEUnion *p18FEC1EE;
    uint8_t              i = 0;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }
    p18FEC1EE = ( CANMsg18FEC1EEUnion * )CopyData;
    if ( p18FEC1EE != ( void * )0 )
    {
        odo_Val        = Mile_Get_Index_Value(MILE_INDEX_ODO)*20u;
        trip_Val       = Mile_Get_Index_Value(MILE_INDEX_TRAP_A)*20u;
        CopyData [ 0 ] = ( canlib_uint8_t )((odo_Val >> 0) & 0x000000FFul);
        CopyData [ 1 ] = ( canlib_uint8_t )((odo_Val >> 8) & 0x000000FFul);
        CopyData [ 2 ] = ( canlib_uint8_t )((odo_Val >> 16) & 0x000000FFul);
        CopyData [ 3 ] = ( canlib_uint8_t )((odo_Val >> 24) & 0x000000FFul);

        CopyData [ 4 ] = ( canlib_uint8_t )((trip_Val >> 0) & 0x000000FFul);
        CopyData [ 5 ] = ( canlib_uint8_t )((trip_Val >> 8) & 0x000000FFul);
        CopyData [ 6 ] = ( canlib_uint8_t )((trip_Val >> 16) & 0x000000FFul);
        CopyData [ 7 ] = ( canlib_uint8_t )((trip_Val >> 24) & 0x000000FFul);
    }
}

void Can_Set_Buff_18FEFC17(canlib_uint8_t CopyData [])
{
    CANMsg18FEFC17Union *p18FEFC17;
    uint16_t              IC_FuelLevel        = 0u;
    uint8_t              i = 0;

    IC_FuelLevel = GetFuelCapacity_Val(); 
    IC_FuelLevel *= 5;
    IC_FuelLevel /= 2;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }
    p18FEFC17 = ( CANMsg18FEC1EEUnion * )CopyData;
    if ( p18FEFC17 != ( void * )0 )
    {
        CopyData [ 0 ] = 0xffu;
        p18FEFC17->Sig.FuelLevel = IC_FuelLevel;
        CopyData [ 2 ] = 0xffu;
        CopyData [ 3 ] = 0xffu;
        CopyData [ 4 ] = 0xffu;
        CopyData [ 5 ] = 0xffu;
        CopyData [ 6 ] = 0xffu;
        CopyData [ 7 ] = 0xffu;
    }
}

void Can_Set_Buff_10FF4117(canlib_uint8_t CopyData [])
{
    CANMsg10FF4117Union *p10FF4117;
    uint16_t             IC_LowFuelWarningSts        = 0u;
    uint8_t              i = 0;
    IC_LowFuelWarningSts = Get_LowFuelWarningSts();
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }
    p10FF4117 = ( CANMsg10FF4117Union * )CopyData;
    if ( p10FF4117 != ( void * )0 )
    {
        
        if(Line_In_Get_Status (LINE_IN_Safety_Belt) == 1) 
        {
            p10FF4117->Sig.Seatbeltsts = 1;
        }
        else
        {
            p10FF4117->Sig.Seatbeltsts = 0;
        }
        
        if(Line_In_Get_Status (LINE_IN_Handbrake) == 1) 
        {
            p10FF4117->Sig.HandBrakeSts = 1;
        }
        else
        {
            p10FF4117->Sig.HandBrakeSts = 0;
        }

        if(Common_GetIgnOnTime() < SELF_CHECK_TIME)
        {
            p10FF4117->Sig.AirBaglampFailSts = 0;
        }
        else
        {
            if(Get_TelltalesLedSts(m_LED_AIRBAG_Lamp) == 1)
            {
                p10FF4117->Sig.AirBaglampFailSts = 2;
            }
            else
            {
                p10FF4117->Sig.AirBaglampFailSts = 0;
            }
        }
        

        if (SYS_OPR_STAT_IGN_ON)
        {
            if(Common_GetIgnOnTime() >= SELF_CHECK_TIME)
            {
                p10FF4117->Sig.LowFuelWarningSts = IC_LowFuelWarningSts;
            }
            else
            {
                p10FF4117->Sig.LowFuelWarningSts = 1;
            }
        }
        else
        {
            p10FF4117->Sig.LowFuelWarningSts = 0;
        }
        
        p10FF4117->Sig.HydraulicBrakePressureSts = 3;
        p10FF4117->Sig.EngineWaterLevel = 3;
        p10FF4117->Sig.BrakePadWearSts = 3;
        p10FF4117->Sig.AirFilterblockingSts = 3;
        p10FF4117->Sig.FuelFilterblockingSts = 1;
        p10FF4117->Sig.k_value_L = 0;
        p10FF4117->Sig.k_value_M = 0;
        p10FF4117->Sig.k_value_H = 0;
        p10FF4117->Sig.fueltank = 0;
        p10FF4117->Sig.IC_Reserved_2 = 0;
    }
}

void Can_Set_Buff_0CFE6CEE(canlib_uint8_t CopyData [])
{
    CANMsg0CFE6CEEUnion *p0CFE6CEE;
    uint32_t             vSpeed_Val = 0;
    uint8_t              i = 0;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }

    p0CFE6CEE = ( CANMsg0CFE6CEEUnion * )CopyData;
    if ( p0CFE6CEE != ( void * )0 )
    {
        if (SYS_OPR_STAT_IGN_ON)
        {
            if ( (DataVSpeedValid) && (CAN_MSG_Status(&CAN_CH0_CanMsgOp, CAN_CH0_ID_can0A18A006_Msg_Count) == CAN_SIG_NORMAL) )
            {
                vSpeed_Val =  Get_CAN_CH0_ID_0A18A006_Sig_VehSpeed_ESP();
                vSpeed_Val = vSpeed_Val << 4;
                if(vSpeed_Val <= 0xf0)
                {
                    vSpeed_Val = 0;
                }

                if(vSpeed_Val >= 0xB400)
                {
                    vSpeed_Val = 0xB400;
                }

                CopyData [ 6 ] = ( canlib_uint8_t )(vSpeed_Val & 0x00FF);
                CopyData [ 7 ] = ( canlib_uint8_t )((vSpeed_Val >> 8) & 0x00ffu);
            }
            else
            {
                CopyData [ 6 ] = 0x00u;
                CopyData [ 7 ] = 0x00u;
            }
        }
        else
        {
            CopyData [ 6 ] = 0x00u;
            CopyData [ 7 ] = 0x00u;
        }

        p0CFE6CEE->Sig.Driver1WorkingState = 7;
        p0CFE6CEE->Sig.Driver2WorkingState = 7;

        p0CFE6CEE->Sig.DriveRecognize = 3;
        p0CFE6CEE->Sig.SystemEvent = 3;
        p0CFE6CEE->Sig.HandlingInformation = 3;
        p0CFE6CEE->Sig.TachographPerformance = 3;

        p0CFE6CEE->Sig.TachographOutputShaftSpeed_L = 0xff;
        p0CFE6CEE->Sig.TachographOutputShaftSpeed_H = 0xff;
    }
}

void Can_Set_Buff_0810A000(canlib_uint8_t CopyData [])
{
    CANMsg0810A000Union *p0810A000;
    uint8_t             i = 0;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }

    p0810A000 = ( CANMsg0810A000Union * )CopyData;
    if ( p0810A000 != ( void * )0 )
    {
        if(CAN_MSG_Status(CAN_CH0, CAN_CH0_ID_can18FEF100_Msg_Count) == CAN_MSG_LOST)
        {
            p0810A000->Sig.BrkPedNoSw = 0;
            p0810A000->Sig.BrkPedNcSw = 1;
        }
        else
        {
            if((Get_CAN_CH0_ID_18FEF100_Sig_BrkSw() == 1)||
               (Get_CAN_CH0_ID_18FEF100_Sig_BrkSw() == 2)||
               (Get_CAN_CH0_ID_18FEF100_Sig_BrkSw() == 3))
            {
                p0810A000->Sig.BrkPedNoSw = 1;
                p0810A000->Sig.BrkPedNcSw = 0;
            }
            else 
            {
                p0810A000->Sig.BrkPedNoSw = 0;
                p0810A000->Sig.BrkPedNcSw = 1;
            }
        }
        p0810A000->Sig.CcValData = 0;
        p0810A000->Sig.CcFail = 0;
        p0810A000->Sig.ResSw = 0;
        p0810A000->Sig.CcCoastDecelSw = 0;
        p0810A000->Sig.CcAccelSw = 0;
        p0810A000->Sig.CcSetSw = 0;
        p0810A000->Sig.CcOn_OffSts = 0;
        p0810A000->Sig.CcDataIntegr = 0;
        p0810A000->Sig.BcmcmdMsgSafCnt = 0;
        p0810A000->Sig.CrkReqSts = 0;
    }
}


void Can_Set_Buff_0A18A000(canlib_uint8_t CopyData [])
{
    CANMsg0A18A000Union *p0A18A000;
    uint8_t             i = 0;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }

    p0A18A000 = ( CANMsg0A18A000Union * )CopyData;
    if ( p0A18A000 != ( void * )0 )
    {
        if (SYS_OPR_STAT_IGN_ON)
        {
            if(Line_In_Get_Status (LINE_IN_Start_Detect) == 1) 
            {
                p0A18A000->Sig.KeySts = 0x0C;
            }
            else
            {
                p0A18A000->Sig.KeySts = 0x04;
            }

            if (Common_GetIgnOnTime() <= 3000)
            {
                p0A18A000->Sig.EbdLampFail = 2;
                p0A18A000->Sig.AbsLampFail = 2;
            }
            else
            {
                if( CAN_MSG_Status(&CAN_CH0_CanMsgOp, CAN_CH0_ID_can0A18A006_Msg_Count) == CAN_SIG_LOST )
                {
                    p0A18A000->Sig.EbdLampFail = 2;
                    p0A18A000->Sig.AbsLampFail = 2;
                }
                else
                {
                    if(Get_CAN_CH0_ID_0A18A006_Sig_EbdFail() == 1)
                    {
                        p0A18A000->Sig.EbdLampFail = 2;
                    }
                    else
                    {
                        p0A18A000->Sig.EbdLampFail = 0;
                    }

                    if(Get_CAN_CH0_ID_0A18A006_Sig_AbsFail() == 1)
                    {
                        p0A18A000->Sig.AbsLampFail = 2;
                    }
                    else
                    {
                        p0A18A000->Sig.AbsLampFail = 0;
                    }
                }
            }  
        }
        else
        {
            p0A18A000->Sig.KeySts = 1;
            p0A18A000->Sig.EbdLampFail = 0;
            p0A18A000->Sig.AbsLampFail = 0;
        }

        if(Line_In_Get_Status (LINE_IN_Handbrake) == 1) 
        {
            p0A18A000->Sig.HandBrkSts = 1;
        }
        else
        {
            p0A18A000->Sig.HandBrkSts = 0;
        }

        p0A18A000->Sig.VdcLampFail = 3;
        p0A18A000->Sig.AsrLampFail = 3;
        p0A18A000->Sig.ComprAcReqSts = 1;
        p0A18A000->Sig.LowBeamSts = 1;
        p0A18A000->Sig.DoorStsDriv = 1;
        p0A18A000->Sig.ExtTemp = 0xff;
        p0A18A000->Sig.RechargeSts = 1;
        p0A18A000->Sig.DrivStyleSts = 7;
    }
}

void Can_Set_Buff_18FFC321(canlib_uint8_t CopyData [])
{
    CANMsg18FFC321Union *p18FFC321;
    uint8_t             i = 0;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }

    p18FFC321 = ( CANMsg18FFC321Union * )CopyData;
    if ( p18FFC321 != ( void * )0 )
    {
        if (SYS_OPR_STAT_IGN_ON)
        {
            if(Line_In_Get_Status (LINE_IN_Start_Detect) == 1) 
            {
                p18FFC321->Sig.KeySts_1 = 0x0C;
            }
            else
            {
                p18FFC321->Sig.KeySts_1 = 0x04;
            }
        }
        else
        {
            p18FFC321->Sig.KeySts_1 = 1;
        }

        if(Line_In_Get_Status (LINE_IN_Handbrake) == 1) 
        {
            p18FFC321->Sig.HandBrakeSts_1 = 1;
        }
        else
        {
            p18FFC321->Sig.HandBrakeSts_1 = 0;
        }

        p18FFC321->Sig.Emergencylightsrequest = 1;
        p18FFC321->Sig.LHSIndicatorlightsstatus = 1;
        p18FFC321->Sig.RHSIndicatorlightsstatus = 1;
        p18FFC321->Sig.LHSIndicatorlightsrequest = 1;
        p18FFC321->Sig.RHSIndicatorlightsrequest = 1;
        p18FFC321->Sig.Highbeamflashlightsrequest = 1;
        p18FFC321->Sig.Highbeamlightsrequest = 1;
        p18FFC321->Sig.LowBeamlightsrequest = 1;
        p18FFC321->Sig.Ignitionkey = 1;

        p18FFC321->Sig.Reverselightsrequest = 0;

        p18FFC321->Sig.Stoplightsrequest = 1;
        p18FFC321->Sig.Additionallightsrequest = 1;
        p18FFC321->Sig.Workinglightsrequest = 1;
        p18FFC321->Sig.Position_parkinglightsrequest = 1;
        p18FFC321->Sig.Rearfoglightsrequest = 1;
        p18FFC321->Sig.Frontfoglightsrequest = 1;
        p18FFC321->Sig.Airfilterblocked = 1;
        p18FFC321->Sig.Oilfilterblocked = 1;
        p18FFC321->Sig.Dieselfilterblocked = 1;
        p18FFC321->Sig.Enginestatus = 1;
        p18FFC321->Sig.CDLdriverdoorlockfeedback = 1;
        p18FFC321->Sig.CDLpassengerdoorlockfeedback = 1;
        p18FFC321->Sig.Driverdooropenswitch = 1;
        p18FFC321->Sig.Passengerdooropenswitch = 1;
        p18FFC321->Sig.Hatchstatusfeedback = 1;
        p18FFC321->Sig.LHRdoorstatusfeedback = 1;
        p18FFC321->Sig.RHRdoorstatusfeedback = 1;
        p18FFC321->Sig.Hatchstatus = 1;
        p18FFC321->Sig.LHRdoorstatus = 1;
        p18FFC321->Sig.RHRdoorstatus = 1;
        p18FFC321->Sig.Longdifferentiallocktransferbox = 1;

        p18FFC321->Sig.VPSRFTxUnlockButtonCntrl = 15;
        p18FFC321->Sig.VPSRFTxLockButtonCntrl = 15;
        p18FFC321->Sig.VPSRFTxTrunkUnlockButtonCntrl = 15;

        p18FFC321->Sig.Ambientairtemperature = 255;

        p18FFC321->Sig.BatteryVoltageLevel = 127;
    }
}

void Can_Set_Buff_18FF6121(canlib_uint8_t CopyData [])
{
    CANMsg18FF6121Union *p18FF6121;
    uint8_t              i = 0;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }
    p18FF6121 = ( CANMsg18FF6121Union * )CopyData;
    if ( p18FF6121 != ( void * )0 )
    {
        p18FF6121->Sig.MainBrkSw = 3;
        p18FF6121->Sig.RedundantBrkSw = 3;
        p18FF6121->Sig.MechPTOEngaed = 3;
        p18FF6121->Sig.SecondSpeedLimRequest = 3;
        p18FF6121->Sig.AuxEneShutdowSw = 3;
    }
}

uint16_t LocalMinOfs_TBOX = 0;
uint16_t LocalHrOfs_TBOX = 0;
void Can_Set_Buff_18FEE6EE(canlib_uint8_t CopyData [])
{
    CANMsg18FEE6EEUnion *p18FEE6EE;
   
    uint8_t              i = 0; 
    
    LocalMinOfs_TBOX = Get_CAN_CH0_ID_18FF9DF1_Sig_LocalMinOfs_TBOX();
    LocalHrOfs_TBOX = Get_CAN_CH0_ID_18FF9DF1_Sig_LocalHrOfs_TBOX();
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }
    p18FEE6EE = ( CANMsg18FEE6EEUnion * )CopyData;
    if ( p18FEE6EE != ( void * )0 )
    {
        p18FEE6EE->Sig.Year = (RTC_YEAR+15);
        p18FEE6EE->Sig.Month = RTC_MONTH;
        p18FEE6EE->Sig.Day = (RTC_DATE*4);
        p18FEE6EE->Sig.Hours = RTC_HOUR;
        p18FEE6EE->Sig.Minutes = RTC_MINUTE;
        p18FEE6EE->Sig.Seconds = (RTC_SECOND*4);

        if(/*(Get_CAN_CH0_ID_18FF9CF1_Sig_TBOXFILSts() == 1)||*/
		   ((CAN_MSG_Status(&CAN_CH0_CanMsgOp, CAN_CH0_ID_can18FF9DF1_Msg_Count) == CAN_SIG_LOST)||
           (CAN_MSG_Status(&CAN_CH0_CanMsgOp, CAN_CH0_ID_can18FF9CF1_Msg_Count) == CAN_SIG_LOST)||
	   	   (CanReceive.Can_18FF9DF1 != 1)||(CanReceive.Can_18FF9CF1 != 1)||
	   	   (Get_CAN_CH0_ID_18FF9DF1_Sig_Sec_TBOX() > 0XEC) || 
	   	   (Get_CAN_CH0_ID_18FF9DF1_Sig_Min_TBOX() > 0X3B) || 
	   	   (Get_CAN_CH0_ID_18FF9DF1_Sig_Hr_TBOX() > 0X17) || 
	   	   (Get_CAN_CH0_ID_18FF9DF1_Sig_Month_TBOX() > 0x0C)||
	   	   (Get_CAN_CH0_ID_18FF9DF1_Sig_Month_TBOX() < 1)|| 
	   	   (Get_CAN_CH0_ID_18FF9DF1_Sig_Day_TBOX() > 0x7C)||
	   	   (Get_CAN_CH0_ID_18FF9DF1_Sig_Day_TBOX() < 1)|| 
	   	   (Get_CAN_CH0_ID_18FF9DF1_Sig_Yr_TBOX() > 0xFA)))
        {
            p18FEE6EE->Sig.LocalMinuteOffset = 125;
            p18FEE6EE->Sig.LocalHourOffset = 125;
        }
        else
        {
            if((LocalMinOfs_TBOX > 0xb8)||(LocalMinOfs_TBOX < 0x42))
            {
                p18FEE6EE->Sig.LocalHourOffset = 125;
                p18FEE6EE->Sig.LocalMinuteOffset = 125;
            }
            else
            {
                p18FEE6EE->Sig.LocalMinuteOffset = Get_CAN_CH0_ID_18FF9DF1_Sig_LocalMinOfs_TBOX();
            }
            
            if((LocalHrOfs_TBOX > 0x94)||(LocalHrOfs_TBOX < 0x66))
            {
                p18FEE6EE->Sig.LocalHourOffset = 125;
                p18FEE6EE->Sig.LocalMinuteOffset = 125;
            }
            else
            {
                p18FEE6EE->Sig.LocalHourOffset = Get_CAN_CH0_ID_18FF9DF1_Sig_LocalHrOfs_TBOX();
            }
        }
    }
}

void Can_Set_Buff_18D00017(canlib_uint8_t CopyData [])
{
    CANMsg18D00017Union *p18D00017;
    uint16_t              IC_ILLUMINATION = 0;
    uint8_t              i = 0;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }
    p18D00017 = ( CANMsg18D00017Union * )CopyData;
    if ( p18D00017 != ( void * )0 )
    {
        if(Get_TelltalesLedSts(m_LED_Park_Lamp) == 1)
        {
            if(g_Light.Duty == 150)
            {
                IC_ILLUMINATION = 15;
            }
            else if(g_Light.Duty == 200)
            {
                IC_ILLUMINATION = 20;
            }
            else if(g_Light.Duty == 250)
            {
                IC_ILLUMINATION = 27;
            }
            else if(g_Light.Duty == 300)
            {
                IC_ILLUMINATION = 35;
            }
            else if(g_Light.Duty == 350)
            {
                IC_ILLUMINATION = 45;
            }
            else if(g_Light.Duty == 400)
            {
                IC_ILLUMINATION = 58;
            }
            else if(g_Light.Duty == 450)
            {
                IC_ILLUMINATION = 73;
            }
            else if(g_Light.Duty == 500)
            {
                IC_ILLUMINATION = 100;
            }
            else
            {
                IC_ILLUMINATION = 0;
            }
        }
        else
        {
            IC_ILLUMINATION = 0;
        }
        p18D00017->Sig.ILLUMINATION = (IC_ILLUMINATION*10)/4;
    }
}

void Can_Set_Buff_18A97121(canlib_uint8_t CopyData [])
{
    CANMsg18A97121Union *p18A97121;
    uint8_t              i = 0;
    for ( i = 0; i < 8; i++ )
    {
        CopyData [ i ] = 0xFFU;
    }
    p18A97121 = ( CANMsg18A97121Union * )CopyData;
    if ( p18A97121 != ( void * )0 )
    {
        if((Get_NodeConfig_LWDS() == 1)&&(MenuData.Ldws == 2))
        {
            p18A97121->Sig.LaneDepWarnEnaCmd = 1;
        }
        else
        {
            p18A97121->Sig.LaneDepWarnEnaCmd = 0;
        }
    }
}