#include "Common_Interface.h"
#include "CAN_Communication_Matrix.h"
#include "CAN_Lib.h"
#include "Data_VehicleSpeed.h"
#include "Data_EngineSpeed.h"
#include "System_Monitor.h"
#include "GaugesInterface.h"
#include "Gauges.h"
#include "dr7f701441.dvf.h"
#include "GPIO.h"
#include "Data_Voltmeter.h"

#include "Line_in.h"

#include "Maintenance.h"
#include "Menu.h"
#include "GUI.h"

#include "Emulated_EEPROM.h"
#include "Watchdog.h"
#include "UDS_Common.h"
#include "kwp2000_service.h"

/*修饰变量static*/

/*ig on off时间线*/
static uint32_t PowerIgnOnTimeLine;
static uint32_t PowerIgnOffTimeLine;

static COMMON_PowerStatus_t PowerSts; /*1 ON ;  0 OFF*/
static uint16_t Act_V_Speed;          /*实际值,十倍的*/
static uint16_t Act_E_Speed;          /*实际值*/
static uint16_t Disp_V_Speed;         /*显示值,十倍的*/
static uint16_t Disp_E_Speed;         /*显示值*/

/*数据有效 1 ;数据无效 0 /0xff */
static DataValid_t PowerSts_Valid;
static DataValid_t Act_V_Speed_Valid;
static DataValid_t Act_E_Speed_Valid;
static DataValid_t Disp_V_Speed_Valid;
static DataValid_t Disp_E_Speed_Valid;

static void Common_Set_Act_V_Speed(uint16_t Val);
static void Common_Set_Act_E_Speed(uint16_t Val);
static void Common_Set_Disp_V_Speed(uint16_t Val);
static void Common_Set_Disp_E_Speed(uint16_t Val);

static void Common_Set_Act_V_Speed_Valid(DataValid_t Val);
static void Common_Set_Act_E_Speed_Valid(DataValid_t Val);
static void Common_Set_Disp_V_Speed_Valid(DataValid_t Val);
static void Common_Set_Disp_E_Speed_Valid(DataValid_t Val);

static uint16_t SysRollingCounter;

static uint8_t CanFirstEvent[ID_TOTAL_MAX];
static void Individual_ECU_Communication(void);

extern _EOL_K_LINE_SET K_Line_Set;

/**/
static uint32_t User_FDJYLQQ_Time;
static uint32_t User_RYLQQ_Time;
static uint32_t User_BSXY_Time;
static uint32_t User_CSQY_Time;
static uint32_t User_LHQY_Time;
static uint32_t User_KQGZJ_Time;
static uint32_t User_DLZXY_Time;
static uint32_t User_LT_Time;

static uint32_t CRUISE_1_Time;
static uint32_t CRUISE_STUDY_Time;
static uint32_t CRUISE_SLD1_Time;
static uint32_t CRUISE_SLD2_Time;

static uint32_t VolWarning_Time;

static uint32_t LOW_VOLTAGE_TIME1;
static uint32_t LOW_VOLTAGE_TIME2;
static uint32_t HIGH_VOLTAGE_TIME1;
static uint32_t HIGH_VOLTAGE_TIME2;

static uint32_t HIGH_VOLTAGE;
static uint32_t LOW_VOLTAGE;

static uint32_t TPMS_TEST_OFF_TIME;
static uint32_t Menu_FacDea_Time;
static uint32_t Menu_Off_Time;

/*每次唤醒调用*/
void Common_DataInit(void)
{
    PowerSts = COMMON_POWER_UNKNOW;
    Act_V_Speed = 0xffffu;
    Act_E_Speed = 0xffffu;
    Disp_V_Speed = 0xffffu;
    Disp_E_Speed = 0xffffu;

    PowerSts_Valid = COMMON_Valid_UNKNOW;
    Act_V_Speed_Valid = COMMON_Valid_UNKNOW;
    Act_E_Speed_Valid = COMMON_Valid_UNKNOW;
    Disp_V_Speed_Valid = COMMON_Valid_UNKNOW;
    Disp_E_Speed_Valid = COMMON_Valid_UNKNOW;
    PowerIgnOnTimeLine = 0x0ul;
    PowerIgnOffTimeLine = 0x0ul;

    /**/
    User_FDJYLQQ_Time = 0x00u;
    User_RYLQQ_Time = 0x00u;
    User_BSXY_Time = 0x00u;
    User_CSQY_Time = 0x00u;
    User_LHQY_Time = 0x00u;
    User_KQGZJ_Time = 0x00u;
    User_DLZXY_Time = 0x00u;
    User_LT_Time = 0x00u;

    CRUISE_1_Time = 0x00u;
    CRUISE_STUDY_Time = 0x00u;
    CRUISE_SLD1_Time = 0x00u;
    CRUISE_SLD2_Time = 0x00u;

    VolWarning_Time = 0x00u;
    LOW_VOLTAGE_TIME1 = 0x00u;
    LOW_VOLTAGE_TIME2 = 0x00u;
    HIGH_VOLTAGE_TIME1 = 0x00u;
    HIGH_VOLTAGE_TIME2 = 0x00u;
    HIGH_VOLTAGE = 0x0u;
    LOW_VOLTAGE = 0x0u;

    TPMS_TEST_OFF_TIME = 0x00u;
    Menu_FacDea_Time = 0x00u;

    Menu_Off_Time = 0x00u;
}

/*以下由各个处理模块按需调用*/
/*使用数据之前,需要先判断数据是否有效,如果无效,则不可以使用*/

COMMON_PowerStatus_t Common_Get_IG_Sts(void)
{
    return PowerSts;
}

uint16_t Common_Get_Act_V_Speed(void)
{
    return Act_V_Speed;
}
uint16_t Common_Get_Act_E_Speed(void)
{
    return Act_E_Speed;
}
uint16_t Common_Get_Disp_V_Speed(void)
{
    return Disp_V_Speed;
}
uint16_t Common_Get_Disp_E_Speed(void)
{
    return Disp_E_Speed;
}

/*获取超速报警状态*/
uint8_t Common_Get_OverSpeed_Status(void)
{
    uint8_t OverSpeedStatus = 0u;
    uint16_t DispVSpeed = 0u;
    DispVSpeed = Common_Get_Disp_V_Speed();

    if (DispVSpeed >= 1000u)
    {
        OverSpeedStatus = 1u;
    }
    else if (DispVSpeed <= 960u)
    {
        OverSpeedStatus = 0u;
    }

    return OverSpeedStatus;
}

uint8_t Common_Get_OverSpeedLine_Status(void)
{
    uint8_t OverSpeedStatus = 0u;
    uint16_t DispVSpeed = 0u;
    uint16_t DataOverSpeedValue = 0u;

    DataOverSpeedValue = K_Line_Set.K_Line_LID44;
    DataOverSpeedValue *= 10u;

    DispVSpeed = Common_Get_Disp_V_Speed();

    if (K_Line_Set.K_Line_LID44 != 0xFF)
    {
        if (DispVSpeed >= (DataOverSpeedValue + 20))
        {
            OverSpeedStatus = 1u;
        }
        else if (DispVSpeed <= DataOverSpeedValue)
        {
            OverSpeedStatus = 0u;
        }
    }
    else
    {
        OverSpeedStatus = 0u;
    }

    return OverSpeedStatus;
}

static void Common_Set_IG_Sts(COMMON_PowerStatus_t Val)
{
    PowerSts = Val;
}
static void Common_Set_Act_V_Speed(uint16_t Val)
{
    Act_V_Speed = Val;
}
static void Common_Set_Act_E_Speed(uint16_t Val)
{
    Act_E_Speed = Val;
}
static void Common_Set_Disp_V_Speed(uint16_t Val)
{
    Disp_V_Speed = Val;
}
static void Common_Set_Disp_E_Speed(uint16_t Val)
{
    Disp_E_Speed = Val;
}

DataValid_t Common_Get_IG_Sts_Valid(void)
{
    return PowerSts_Valid;
}
DataValid_t Common_Get_Act_V_Speed_Valid(void)
{
    return Act_V_Speed_Valid;
}
DataValid_t Common_Get_Act_E_Speed_Valid(void)
{
    return Act_E_Speed_Valid;
}
DataValid_t Common_Get_Disp_V_Speed_Valid(void)
{
    return Disp_V_Speed_Valid;
}
DataValid_t Common_Get_Disp_E_Speed_Valid(void)
{
    return Disp_E_Speed_Valid;
}

static void Common_Set_IG_Sts_Valid(DataValid_t Val)
{
    PowerSts_Valid = Val;
}
static void Common_Set_Act_V_Speed_Valid(DataValid_t Val)
{
    Act_V_Speed_Valid = Val;
}
static void Common_Set_Act_E_Speed_Valid(DataValid_t Val)
{
    Act_E_Speed_Valid = Val;
}
static void Common_Set_Disp_V_Speed_Valid(DataValid_t Val)
{
    Disp_V_Speed_Valid = Val;
}
static void Common_Set_Disp_E_Speed_Valid(DataValid_t Val)
{
    Disp_E_Speed_Valid = Val;
}

/*2MS任务*/
static uint16_t wbyTest = 0;
void Common_Input_Para(void)
{
    /*    if (SYS_OPR_STAT_IGN_ON)
        {*/
    uint32_t V_Speed_Convert = 0ul;
    uint32_t u32IG_ON_Timer = 0u;
    uint16_t OilValue = 0u; /*机油压力数值*/
    uint32_t EBC2_Speed_Value = 0u;
    uint8_t LineStatus1 = 0u;
    uint8_t LineStatus2 = 0u;

    u32IG_ON_Timer = Common_GetIgnOnTime();

    if (SYS_OPR_STAT_IGN_ON)
    {
        Common_Set_IG_Sts(COMMON_POWER_ON);
        Common_Set_IG_Sts_Valid(COMMON_Valid);

        OilValue = Common_Get_Disp_E_Speed();

        //车速
        wbyTest = Speed_Get_Display_Value();
        Common_Set_Disp_V_Speed(wbyTest);
        Common_Set_Act_V_Speed(Speed_Get_ActualValue());

        if (Speed_Get_Valid())
        {
            Common_Set_Act_V_Speed_Valid(COMMON_Valid);
            Common_Set_Disp_V_Speed_Valid(COMMON_Valid);
        }
        else
        {
            Common_Set_Act_V_Speed_Valid(COMMON_InValid);
            Common_Set_Disp_V_Speed_Valid(COMMON_InValid);
        }

        Common_Set_Act_E_Speed(RevSpeedManage(Tacho_Get_ActualValue()));

        PowerIgnOffTimeLine = 0ul;
        if (PowerIgnOnTimeLine < 0x7ffffffful)
        {
            PowerIgnOnTimeLine += 2u;
        }

        /*电压计报警时间*/
        if (Gui_Get_Voltmeter_DisplayMode() <= 3u)
        {
            if (VolWarning_Time <= 5100)
            {
                VolWarning_Time++;
            }
        }
        else
        {
            VolWarning_Time = 0;
        }

        /**/
        if (RTE_Read_KL15_Voltage() <= (23500 - 800)) /*A2*/
        {
            if (LOW_VOLTAGE_TIME1 <= 3500)
                LOW_VOLTAGE_TIME1++;
            else
                LOW_VOLTAGE = 1;
        }
        else
        {
            LOW_VOLTAGE_TIME1 = 0;
        }

        if (RTE_Read_KL15_Voltage() >= (25000 - 800)) /*A2*/
        {
            if (LOW_VOLTAGE_TIME2 <= 5000)
                LOW_VOLTAGE_TIME2++;
            else
                LOW_VOLTAGE = 0;
        }
        else
        {
            LOW_VOLTAGE_TIME2 = 0;
        }
        //
        if (RTE_Read_KL15_Voltage() >= (30400 - 800)) /*A2*/
        {
            if (HIGH_VOLTAGE_TIME1 <= 3500)
                HIGH_VOLTAGE_TIME1++;
            else
                HIGH_VOLTAGE = 1;
        }
        else
        {
            HIGH_VOLTAGE_TIME1 = 0;
        }

        if (RTE_Read_KL15_Voltage() <= (29400 - 800)) /*A2*/
        {
            if (HIGH_VOLTAGE_TIME2 <= 5000)
                HIGH_VOLTAGE_TIME2++;
            else
                HIGH_VOLTAGE = 0;
        }
        else
        {
            HIGH_VOLTAGE_TIME2 = 0;
        }

        /*胎压匹配3分钟有效计时*/
        if ((TPMS_TEST_OFF_TIME <= 90000u) && (User_set_Num.User_TpmsStatus == 2u))
        {
            TPMS_TEST_OFF_TIME++;
        }
        else
        {
            TPMS_TEST_OFF_TIME = 0;
        }

        /**/
        if ((bCurMenuIDX == _FAC_DSP_LEVEL1_2MENU_3) || (bCurMenuIDX == _DEA_DSP_LEVEL1_2MENU_3) || (MenuFlag.Menu_StaFlag != 0x01u))
        {
            if (Menu_FacDea_Time < 15000u)
            {
                Menu_FacDea_Time++;
            }
            else
            {
                ;/*Do Nothing!*/
            }
        }
        /**/
        if ((State_Flag.User_FDJYLQQ_FLAG == 1) || (State_Flag.User_FDJYLQQ_FLAG == 2))
        {
            if (User_FDJYLQQ_Time < 30001)
                User_FDJYLQQ_Time++;
        }
        else
        {
            User_FDJYLQQ_Time = 0;
        }

        if ((State_Flag.User_RYLQQ_FLAG == 1) || (State_Flag.User_RYLQQ_FLAG == 2))
        {
            if (User_RYLQQ_Time < 30001)
                User_RYLQQ_Time++;
        }
        else
        {
            User_RYLQQ_Time = 0;
        }

        if ((State_Flag.User_BSXY_FLAG == 1) || (State_Flag.User_BSXY_FLAG == 2))
        {
            if (User_BSXY_Time < 30001)
                User_BSXY_Time++;
        }
        else
        {
            User_BSXY_Time = 0;
        }

        if ((State_Flag.User_CSQY_FLAG == 1) || (State_Flag.User_CSQY_FLAG == 2))
        {
            if (User_CSQY_Time < 30001)
                User_CSQY_Time++;
        }
        else
        {
            User_CSQY_Time = 0;
        }

        if ((State_Flag.User_LHQY_FLAG == 1) || (State_Flag.User_LHQY_FLAG == 2))
        {
            if (User_LHQY_Time < 30001)
                User_LHQY_Time++;
        }
        else
        {
            User_LHQY_Time = 0;
        }

        if ((State_Flag.User_KQGZJ_FLAG == 1) || (State_Flag.User_KQGZJ_FLAG == 2))
        {
            if (User_KQGZJ_Time < 30001)
                User_KQGZJ_Time++;
        }
        else
        {
            User_KQGZJ_Time = 0;
        }

        if ((State_Flag.User_DLZXY_FLAG == 1) || (State_Flag.User_DLZXY_FLAG == 2))
        {
            if (User_DLZXY_Time < 30001)
                User_DLZXY_Time++;
        }
        else
        {
            User_DLZXY_Time = 0;
        }

        if ((State_Flag.User_LT_FLAG == 1) || (State_Flag.User_LT_FLAG == 2))
        {
            if (User_LT_Time < 30001)
                User_LT_Time++;
        }
        else
        {
            User_LT_Time = 0;
        }

        /**/
        if (Get_ID_18FF4100_Sig_Cruise_VariableSLD_Disp() == 1u)
        {
            if (CRUISE_1_Time < 1501u)
            {
                CRUISE_1_Time++;
            }
        }
        else
        {
            CRUISE_1_Time = 0;
        }
        if (Get_ID_18FF4100_Sig_Cruise_VariableSLD_Disp() == 2u)
        {
            if (CRUISE_STUDY_Time < 1501u)
            {
                CRUISE_STUDY_Time++;
            }
        }
        else
        {
            CRUISE_STUDY_Time = 0;
        }
        if (Get_ID_18FF4100_Sig_Cruise_VariableSLD_Disp() == 3u)
        {
            if (CRUISE_SLD1_Time < 1501u)
            {
                CRUISE_SLD1_Time++;
            }
        }
        else
        {
            CRUISE_SLD1_Time = 0;
        }

        Menu_Off_Time = 0u;
    }
    else
    {
        PowerIgnOnTimeLine = 0ul;
        if (PowerIgnOffTimeLine < 0x7ffffffful)
        {
            PowerIgnOffTimeLine += 2u;
        }

        if (Menu_Off_Time <= 300000u )
        {
            Menu_Off_Time ++;
        }
        Common_Set_IG_Sts(COMMON_POWER_OFF);
        Common_Set_IG_Sts_Valid(COMMON_Valid);

        /*车转真实值OFF为0*/
        Common_Set_Act_V_Speed(0u);
        Common_Set_Act_E_Speed(0u);
        Common_Set_Disp_V_Speed(0u);
        Common_Set_Disp_E_Speed(0u);

        /*----*/
        User_FDJYLQQ_Time = 0x00u;
        User_RYLQQ_Time = 0x00u;
        User_BSXY_Time = 0x00u;
        User_CSQY_Time = 0x00u;
        User_LHQY_Time = 0x00u;
        User_KQGZJ_Time = 0x00u;
        User_DLZXY_Time = 0x00u;
        User_LT_Time = 0x00u;

        CRUISE_1_Time = 0x00u;
        CRUISE_STUDY_Time = 0x00u;
        CRUISE_SLD1_Time = 0x00u;
        CRUISE_SLD2_Time = 0x00u;

        VolWarning_Time = 0x00u;
        LOW_VOLTAGE_TIME1 = 0x00u;
        LOW_VOLTAGE_TIME2 = 0x00u;
        HIGH_VOLTAGE_TIME1 = 0x00u;
        HIGH_VOLTAGE_TIME2 = 0x00u;
        HIGH_VOLTAGE = 0x0u;
        LOW_VOLTAGE = 0x0u;

        Menu_FacDea_Time = 0u;
    }
}

void Set_Can18FF5510_FirstRecv_Event(void)
{
    CanFirstEvent[ID_CanMsg18FF5510_Msg_Count] = 1;
}

void Set_Can18FF2300_FirstRecv_Event(void)
{
    CanFirstEvent[ID_CanMsg18FF2300_Msg_Count] = 1;
}

uint8_t Get_CanFirstRecv_Event(uint8_t ID)
{
    return CanFirstEvent[ID];
}

void Common_RollingCounterAdd(void)
{
    SysRollingCounter++;
}

void Common_RollingCounterClear(void)
{
    SysRollingCounter = 0u;
}

uint16_t Common_ReadRollingCounter(void)
{
    return SysRollingCounter;
}

void Common_BlockDelay(uint16_t m_MS)
{
    uint16_t RocBackup;
    uint16_t Counter;
    uint16_t DIMCounter;

    DIMCounter = m_MS * 20u;
    Common_RollingCounterClear();
    RocBackup = Common_ReadRollingCounter();
    do
    {
        Counter = Common_ReadRollingCounter();

        if (Counter >= RocBackup)
        {
            Counter -= RocBackup;
        }
        else
        {
            Counter = 65535u - RocBackup + Counter + 1u;
        }

    }
    while (Counter < DIMCounter);
}

uint32_t Common_GetIgnOnTime(void)
{
    return PowerIgnOnTimeLine;
}

uint32_t Common_GetIgnOffTime(void)
{
    return PowerIgnOffTimeLine;
}

#pragma diag_suppress = Pm064
int32_t SEGGER_RTT_printf(uint16_t BufferIndex, const char *sFormat, ...);
int32_t SEGGER_RTT_printf(uint16_t BufferIndex, const char *sFormat, ...)
{
    return 0;
}

uint8_t Common_Get_Cruise_TimeSta(void)
{
    uint8_t Time_Sta = 0u;

    if ((CRUISE_1_Time > 0u) && (CRUISE_1_Time < 1500u))
    {
        Time_Sta = 1u;
    }
    else
    {
        Time_Sta = 0u;
    }

    return Time_Sta;
}

uint8_t Common_Get_Cruise_SLD_TimeSta(void)
{
    uint8_t Time_Sta = 0u;

    if ((CRUISE_SLD1_Time > 0u) && (CRUISE_SLD1_Time < 1500u))
    {
        Time_Sta = 1u;
    }
    else
    {
        Time_Sta = 0u;
    }

    return Time_Sta;
}

uint8_t Common_Get_VolWarning_Sta(void)
{
    uint8_t DataHiCollantVolWarning = 0u;

    if (VolWarning_Time >= 5000u)
    {
        DataHiCollantVolWarning = 1u;
    }
    else
    {
        DataHiCollantVolWarning = 0u;
    }

    return DataHiCollantVolWarning;
}

uint8_t Common_Get_HIGH_VOLTAGE(void)
{
    return HIGH_VOLTAGE;
}

uint8_t Common_Get_LOW_VOLTAGE(void)
{
    return LOW_VOLTAGE;
}

uint8_t Common_Get_FDJYLQQ_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (User_FDJYLQQ_Time < 30000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return ValueSta;
}

uint8_t Common_Get_RYLQQ_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (User_RYLQQ_Time < 30000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return ValueSta;
}

uint8_t Common_Get_BSXY_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (User_BSXY_Time < 30000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return ValueSta;
}

uint8_t Common_Get_CSQY_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (User_CSQY_Time < 30000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return ValueSta;
}

uint8_t Common_Get_LHQY_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (User_LHQY_Time < 30000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return ValueSta;
}

uint8_t Common_Get_KQGZJ_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (User_KQGZJ_Time < 30000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return ValueSta;
}

uint8_t Common_Get_DLZXY_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (User_DLZXY_Time < 30000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return ValueSta;
}

uint8_t Common_Get_LT_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (User_LT_Time < 30000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return ValueSta;
}

uint8_t Common_Get_TPMS_TEST_OFF_Time_Sta(void)
{
    uint8_t ValueSta = 0u;

    if (TPMS_TEST_OFF_TIME >= 90000u)
    {
        ValueSta = 1u;
    }
    else
    {
        ValueSta = 0u;
    }

    return 0u;
}

void Common_Set_Menu_FacDea_Time_Sta(uint32_t Value)
{
    Menu_FacDea_Time = Value;
}
uint32_t Common_Get_Menu_FacDea_Time_Sta(void)
{
    return Menu_FacDea_Time;
}

uint32_t Coom_Get_Menu_Off_Time(void)
{
    return Menu_Off_Time;
}

/*EOL诊断配置数据转换为仪表配置数据*/
void ReadDTCEOLValue_Meter_K_LINE(void)
{
    /*获取所有存储数据*/
    ReadDFlashData(EEPROM_BLOCK_EOL_K_LINE, (uint32_t *)&K_Line_Set.Flag, (sizeof(K_Line_Set) / 4u), K_LINE_EOL_InitVal);
}

void Common_Set_K_Line_Value(void)
{
    uint8_t K_Line_Set_Flag = 0u;
    EEPROM_RW_Result_en_t enResult = EEPROM_RW_FAIL;

    K_Line_Set_Flag = Common_Get_DTCstatusCHGFFK_Flag();

    if (K_Line_Set_Flag == 1u)
    {
        Common_Set_DTCstatusCHGFFK_Flag(0);
        /*存储*/
        if (EEPROM_Get_Block_Status (EEPROM_BLOCK_EOL_K_LINE) != EEPROM_STAT_ERROR)
        {
            while (EEPROM_Get_Status() == EEPROM_STAT_BUSY)
            {
                WDT_Clear();
            }
            enResult = EEPROM_Write_Data(EEPROM_BLOCK_EOL_K_LINE, &K_Line_Set, (sizeof(K_Line_Set) / 4u));
        }
    }
}