#include "RTE_GPIO.h"
#include "Key.h"
#include "Display_Info.h"
#include "Check_Ctrl.h"
#include "Barcode_Scanner.h"
#include "Task.h"
#include "string.h"

uint8_t Confirmkeycount;
void Key_Operation_SW5(Key_Event_en_t enKeyEvent)       //下一步
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )
    {
        if(firstpowerflag == 2)
        {
            if(saomafinish == 3)
            { 
                zhenduansendStep = 0;
                zhenduanflag = Data_Mode_Dot;
                memset(erweima, 0, 64);
                memset(barcode_Msg, 0, 64);
                saomafinish = 4;
            }
            else if(saomafinish == 4)
            {
                MENU_CHECK_STEP_ADD( ); 
            }
        }
        MENU_CHECK_STEP_ADD( ); 
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )
    {
        
        if(firstpowerflag == 2)
        {
            if(AutoFlag == 1)
            {
                AutoFlag = 0;
            }
            else
            {
                AutoFlag = 1;
            }
        }
    }
    else
    {
    }
}
void Key_Operation_SW4(Key_Event_en_t enKeyEvent)       //上一步
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )
    {
        if(firstpowerflag == 2)
        {
            MENU_CHECK_STEP_SUB();
        }
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )
    {
        
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {
        if ( (LED_Waring == 1) || (UDS_Warning_Voltage == 1))
        {
            ;
        }
        else
        {
            Display_Sub( );
            Display_TFT_Clear( );  
        }  
             
        
    }
    else
    {
    }
}
void Key_Operation_SW7(Key_Event_en_t enKeyEvent)
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )
    {
        if(firstpowerflag == 2)
        {
            if(zhenduanflag == Data_Mode_Write)
            {
                if(saomafinish == 1)
                {
                    zhenduansendStep = 5;
                }
            }
            else if(((zhenduansendStep == 4) && (zhenduanflag == Data_Mode_Read)))
            {
                zhenduansendStep = 5;
            }
        }
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )
    {
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {
    }
    else
    {
    }
}
void Key_Operation_SW8(Key_Event_en_t enKeyEvent)
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )
    {
        zhenduanflag = Data_Mode_Write;
        zhenduansendStep = 0;
        saomafinish = 0;
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )
    {
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {
    }
    else
    {
    }
}
void Key_Operation_SW9(Key_Event_en_t enKeyEvent)
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )       //下移位
    {
        downkeyflag = 1;
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )          //P2P模式
    {
        OTAMode = 2;
        name1 = (devicename) & 0xFF;
        name2 = (devicename >> 8) & 0xFF;
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {
    }
    else
    {
    }
}
void Key_Operation_SW2(Key_Event_en_t enKeyEvent)
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )
    {
        if(LINE_OUT_NEG_04 == 1U)       //上下ACC电
        {
            LINE_OUT_NEG_04 = 0U;
            Auto_ONOFF = 3;
        }
        else
        {
            LINE_OUT_NEG_04 = 1U;
            Auto_ONOFF = 0;
        }
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )
    {
        Auto_ONOFF = 1;     //自动断电
        LINE_OUT_NEG_04 = 0U;
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {
    }
    else
    {
    }
}
void Key_Operation_SW3(Key_Event_en_t enKeyEvent)
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )
    {
        if(firstpowerflag == 2)
        {
            if(clearOdoFlag == 0)
            {
                clearOdoFlag = 1;
            }
            else
            {
                queren = 1;
            }
        }
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )
    {
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {
        if(Get_Display_Type( ) == 2)
        {
            MENU_CHECK_STEP_SUB( ); 
        }
    }
    else
    {
    }
}
void Key_Operation_SW1(Key_Event_en_t enKeyEvent)
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )           //上移位
    {
        upkeyflag = 1;
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )          //AP模式
    {
        OTAMode = 1; 
        name1 = (devicename) & 0xFF;
        name2 = (devicename >> 8) & 0xFF;
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {

    }
    else
    {

    }
}

void Key_Operation_SW6(Key_Event_en_t enKeyEvent)
{
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )
    {
        Confirmkeyflag = 1;
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )
    {
        if(menumondel == 0)
        {
            menumondel = 1;
            Display_TFT_Clear();
        }
        else
        {
            menumondel = 0;
        }
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {

    }
    else
    {

    }
}
uint8_t upkeytime;
uint8_t downkeytime;
uint8_t Confirmkeytime;
uint8_t upkeyflag;
uint8_t downkeyflag;
uint8_t Confirmkeyflag;
void upkeyserve(void)
{
    if(upkeyflag == 1)
    {
        if(upkeytime<=10)
        {
            upkeytime++;
            Press_to_up = 1;
        }
        else
        {
            upkeytime = 0;
            Press_to_up = 0;
            upkeyflag = 0;
        }
    }
    else
    {
        upkeytime = 0;
        Press_to_up = 0;
    }
}

void downkeyserve(void)
{
    if(downkeyflag == 1)
    {
        if(downkeytime<=10)
        {
            downkeytime++;
            Press_to_down = 1;
        }
        else
        {
            downkeytime = 0;
            Press_to_down = 0;
            downkeyflag = 0;
        }
    }
    else
    {
        downkeytime = 0;
        Press_to_down = 0;
    }
}

void confirmkeyserve(void)
{
    if(Confirmkeyflag == 1)
    {
        if(Confirmkeytime<=10)
        {
            Confirmkeytime++;
            queren = 1;
        }
        else
        {
            Confirmkeytime = 0;
            Confirmkeyflag = 0;
            queren = 0;
        }
    }
    else
    {
        Confirmkeytime = 0;
        queren = 0;
    }
}
uint8_t KeyStep = 0;
void PasswordUnlock(void)
{
    if(MENU_CHECK_STEP == 6)
    {
        if(KeyStep == 0)
        {
            if(upkeyflag)
            {
                KeyStep = 1;
            }
        }
        else if(KeyStep == 1)
        {
            if(downkeyflag)
            {
                KeyStep = 2;
            }
        }
        else if(KeyStep == 2)
        {
            if(Confirmkeyflag)
            {
                KeyStep = 3;
                Display_TFT_Clear();
            }
        }
        else
        {
            ;
        }
    }
    else
    {
        KeyStep = 0;
    }
}

uint8_t OpenOTATime;
void OpenOTASercice(void)
{
    if (((OTAMode != 1) && (OTAMode != 2)) || (OTAModeBegin != 1))
    {
        return;
    }
    
    if (OpenOTATime > 240)
    {
        OTAMode = 0;
        OpenOTATime = 0;
        OTAModeBegin = 0;
        OTAModeBeginTime = 0;
        return;
    }
    
    OpenOTATime++;
    
    if (OpenOTATime <= 120)
    {
        Press_to_up = ((OpenOTATime / 10) % 2) == 0 ? 1 : 0;
        Press_to_down = 0;
    }
    else
    {
        uint16_t relativeTime = OpenOTATime - 120;
        Press_to_down = ((relativeTime / 10) % 2) == 0 ? 1 : 0;
        Press_to_up = 0;
    }
}

uint8_t Version_number_key_time;
uint8_t Version_number_begin;
uint16_t enterdelaytime;
uint8_t entermenutime;
void EnterVersionNumber(void)
{
    LeftturnSignal = 1;
    RightturnSignal = 1;
    Lowbeam = 1;

    uint8_t up_key_press_time = (up_key_press_number * 20);

    if(enterdelaytime <= 600)           //等待开机动画
    {
        if(jiaoyan == 1)
        {
            if(entermenutime <= 200)
            {
                entermenutime++;
            }

            if(entermenutime >= 110)
            {
                queren = 0;
            }
            else if(entermenutime >= 100)
            {
                queren = 1;
            }
        }

        enterdelaytime++;
    }
    else
    {
        if(Version_number_key_time <= 200)
        {
            Version_number_key_time++;
        }
        else
        {
            Press_to_down = 0;
            Version_number_begin = 1;
        }

        if(Version_number_key_time <= up_key_press_time)
        {
            Press_to_up = ((Version_number_key_time / 10) % 2) == 0 ? 1 : 0;
        }
        else if(Version_number_key_time < (up_key_press_time + 20))
        {
            queren = ((Version_number_key_time / 10) % 2) == 0 ? 1 : 0;
        }
        else if(Version_number_key_time <= (up_key_press_time + 40))
        {
            Press_to_up = ((Version_number_key_time / 10) % 2) == 0 ? 1 : 0;
        }
        else if(Version_number_key_time <= 200)
        {
            Press_to_down = 1;
        }
    }
}
/*-------------------------------------------------*/
Key_Real_Status_en_t Key_Real_sw5(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;
    if ( SW5 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    else
    {
        enKeyRealStatus = KEY_LINE_LOOSEN;
    }
    return enKeyRealStatus;
}
Key_Real_Status_en_t Key_Real_sw4(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW4 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    return enKeyRealStatus;
}
Key_Real_Status_en_t Key_Real_sw7(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW7 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    else
    {
        enKeyRealStatus = KEY_LINE_LOOSEN;
    }
    return enKeyRealStatus;
}
Key_Real_Status_en_t Key_Real_sw8(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW8 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    return enKeyRealStatus;
}
Key_Real_Status_en_t Key_Real_sw9(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW9 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    return enKeyRealStatus;
}
Key_Real_Status_en_t Key_Real_sw2(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW2 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    return enKeyRealStatus;
}
Key_Real_Status_en_t Key_Real_sw1(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW1 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    return enKeyRealStatus;
}

Key_Real_Status_en_t Key_Real_sw3(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW3 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    return enKeyRealStatus;
}

Key_Real_Status_en_t Key_Real_sw10(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW10 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    return enKeyRealStatus;
}

Key_Real_Status_en_t Key_Real_sw6(void)
{

    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;

    if ( SW6 == 0U )
    {
        enKeyRealStatus = KEY_LINE_PRESS;
    }
    return enKeyRealStatus;
}

void Key_Operation_SW10(Key_Event_en_t enKeyEvent)
{
        /*清零ODO*/
    if ( enKeyEvent == KEY_EVENT_SHORT_PRESS )
    {
        if((saomafinish == 3) || (saomafinish == 4))
        {
            if(BlueTooth == 0)
            {
                BlueTooth = 1;
                name1 = (devicename) & 0xFF;
                name2 = (devicename >> 8) & 0xFF;
            }
            else
            {
                BlueTooth = 0;
            }
        }
    }
    else if ( enKeyEvent == KEY_EVENT_LONG_PRESS )
    {
    }
    else if ( enKeyEvent == KEY_EVENT_SUPER_LONG_PRESS )
    {
        connectbleFlag = 0;
    }
    else
    {
    }
}
/*---------------------------------------------------------------------------------------*/
const Key_Attribute_st_t stKeyAttribute [ KEY_NUM_MAX ] = {
    {KEY_TYPE_LINE, Key_Real_sw5, Key_Operation_SW5},    //SW5
    {KEY_TYPE_LINE, Key_Real_sw4, Key_Operation_SW4},    //SW4
    {KEY_TYPE_LINE, Key_Real_sw7, Key_Operation_SW7},
    {KEY_TYPE_LINE, Key_Real_sw8, Key_Operation_SW8},
    {KEY_TYPE_LINE, Key_Real_sw2, Key_Operation_SW2},      //SW2-
    {KEY_TYPE_LINE, Key_Real_sw1, Key_Operation_SW1},    //SW1+
    {KEY_TYPE_LINE, Key_Real_sw10, Key_Operation_SW10},
    {KEY_TYPE_LINE, Key_Real_sw3, Key_Operation_SW3},    //SW1+
    {KEY_TYPE_LINE, Key_Real_sw6, Key_Operation_SW6},    //SW1+
    {KEY_TYPE_LINE, Key_Real_sw9, Key_Operation_SW9},    //SW1+
};
