
#include "Key.h"
#include "Menu.h"
#include "Services_ODO_User.h"

#include "DisplaySch_user.h"
#include "Sound_Scheduler.h"
#include "System_Monitor.h"
#include "RTE_ADC.h"

#include "CAN_Communication_Matrix.h"

/*-------------------------------------------------------*/
/*无车速限制值*/
#define DISPSPEEDNULLMAX   66
/*----------按键具体功能执行的回调函数-----------------------*/


void Key_Operation_Enter(Key_Event_en_t enKeyEvent);
void Key_Operation_Return(Key_Event_en_t enKeyEvent);
void Key_Operation_Up(Key_Event_en_t enKeyEvent);
void Key_Operation_Down(Key_Event_en_t enKeyEvent);
void Key_Operation_Menu(Key_Event_en_t enKeyEvent);

Key_IGN_en_t Key_Get_IGN_Status(void);

struct
{
    /* data */
    uint8_t Up ;
    uint8_t Down ;
    uint8_t Enter ;
    uint8_t Menu ;
    uint8_t Return ;

} KeyTest;

/*******************************UP***********************************************
  Function： Key_Operation_Up
  Description：
  Input:
  Output:
 *******************************UP***********************************************/
void Key_Operation_Up(Key_Event_en_t enKeyEvent)
{
    uint8_t CanStatus1 = 0u;
    uint16_t DispVSpeed = 0u;
    KeyTest.Up ++ ;
    HMI_Set_KEY_UP(enKeyEvent);

    DispVSpeed =  Common_Get_Disp_V_Speed();
    CanStatus1 = CAN_MSG_Status(ID_CanMsg0CF00400_Msg_Count);

    if (DispVSpeed <= DISPSPEEDNULLMAX)
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
            /*主界面*/
            if ((bCurMenuIDX >= _MN_DSP_LEVEL1MENU_1) && (bCurMenuIDX <= _MN_DSP_LEVEL1MENU_6))
            {
                NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_UP);
            }
            /*一级菜单*/
            else if ((bCurMenuIDX >= _MN_DSP_LEVEL2MENU_1) && (bCurMenuIDX <= _MN_DSP_LEVEL2MENU_6))
            {
                if ((CanStatus1 == CAN_SIG_LOST) && (bCurMenuIDX == _MN_DSP_LEVEL2MENU_2))
                    NextMenu(_MN_DSP_LEVEL2MENU_1);
                else
                    NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_UP);
            }
        }
    }
    else
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
        }
    }
}

/*******************************DOWN***********************************************
  Function： Key_Operation_Down
  Description：
  Input:
  Output:
 *******************************DOWN***********************************************/
void Key_Operation_Down(Key_Event_en_t enKeyEvent)
{
    uint16_t DispVSpeed = 0u;
    KeyTest.Down ++ ;
    HMI_Set_KEY_DOWN(enKeyEvent);
    DispVSpeed =  Common_Get_Disp_V_Speed();

    if (DispVSpeed <= DISPSPEEDNULLMAX)
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
            /*主界面*/
            if ((bCurMenuIDX >= _MN_DSP_LEVEL1MENU_1) && (bCurMenuIDX <= _MN_DSP_LEVEL1MENU_6))
            {
                NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_DOWN);
            }
            /*一级菜单*/
            else if ((bCurMenuIDX >= _MN_DSP_LEVEL2MENU_1) && (bCurMenuIDX <= _MN_DSP_LEVEL2MENU_6))
            {
                NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_DOWN);
            }
        }
    }
    else
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
        }
    }
}
/*******************************ENTER***********************************************
  Function： Key_Operation_Enter
  Description：
  Input:
  Output:
 *******************************ENTER***********************************************/
void Key_Operation_Enter(Key_Event_en_t enKeyEvent)
{
    uint8_t CanStatus1 = 0u;
    uint16_t DispVSpeed = 0u;
    KeyTest.Enter ++ ;
    HMI_Set_KEY_CONFIRM(enKeyEvent);

    DispVSpeed =  Common_Get_Disp_V_Speed();
    CanStatus1 = CAN_MSG_Status(ID_CanMsg0CF00400_Msg_Count);

    if (DispVSpeed <= DISPSPEEDNULLMAX)
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
            /*记录进入MENU菜单的位置*/
            if ((bCurMenuIDX >= _MN_DSP_LEVEL1MENU_1) && (bCurMenuIDX <= _MN_DSP_LEVEL1MENU_6))
            {
                MenuFlag.Menu_Flag =  bCurMenuIDX;

                if (CanStatus1 == CAN_SIG_LOST) /*有故障码*/
                {
                    NextMenu(_MN_DSP_LEVEL2MENU_1);
                }
                else  /*无故障码*/
                {
                    NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_ENTER);
                }
            }
            /*无论从哪都能回去*/
            else if ((bCurMenuIDX >= _MN_DSP_LEVEL2MENU_1) && (bCurMenuIDX <= _MN_DSP_RETURN_MENU))
            {
                if (bCurMenuIDX == _MN_DSP_LEVEL3_4_MENU_A) /*胎压设置界面*/
                {
                    NextMenu(_MN_DSP_LEVEL2MENU_4);           /*menu回到用户设置界面*/
                }
                else
                {
                    NextMenu(MenuFlag.Menu_Flag);
                }
            }
        }
    }
    else
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
        }
    }
}

/*******************************RETURN***********************************************
  Function： Key_Operation_Return
  Description：
  Input:
  Output:
 *******************************RETURN***********************************************/
void Key_Operation_Return(Key_Event_en_t enKeyEvent)
{
    uint16_t DispVSpeed = 0u;
    KeyTest.Return ++ ;
    HMI_Set_KEY_CANCEL(enKeyEvent);
    DispVSpeed =  Common_Get_Disp_V_Speed();

    if (DispVSpeed <= DISPSPEEDNULLMAX)
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
            if ((bCurMenuIDX >= _MN_DSP_LEVEL2_1_MENU_1) && (bCurMenuIDX < _MN_DSP_ENTER_MENU))
            {
                if (
                    ( bCurMenuIDX == _MN_DSP_LEVEL3_4_MENU_3 ) ||                                            /*显示设置*/
                    ( bCurMenuIDX == _MN_DSP_LEVEL3_4_MENU_7 ) ||                                            /*语言设定*/
                    ( bCurMenuIDX == _MN_DSP_LEVEL3_4_MENU_9 ) ||                                            /*单位设定*/
                    ( bCurMenuIDX == _MN_DSP_LEVEL3_4_MENU_8 ) ||                                            /*亮度调节*/
                    ( bCurMenuIDX == _MN_DSP_LEVEL4_1_MENU_1 ) ||                                            /*日期设置退出*/
                    ( bCurMenuIDX == _MN_DSP_LEVEL4_1_MENU_2 ) ||                                            /*日期格式设置退出*/
                    ( bCurMenuIDX == _MN_DSP_LEVEL4_2_MENU_1 ) ||                                            /*时间设置退出*/
                    ( bCurMenuIDX == _MN_DSP_LEVEL4_2_MENU_2 ) ||                                            /*时间格式退出*/
                    ((bCurMenuIDX >= _MN_DSP_LEVEL4_4_MENU_1 ) && (bCurMenuIDX <= _MN_DSP_LEVEL4_4_MENU_5))  /*省油设定子菜单*/
                )
                {
                    MenuFlag.Menu_Return = 0;
                    NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_EXIT);
                }
                else if (bCurMenuIDX == _MN_DSP_LEVEL3_4_MENU_A )                /*胎压设置界面返回操作*/
                {
                    //if (User_set_Num.User_TpmsStatus != 2)                      /*不是正在匹配状态*/
                    //{
                    //    NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_EXIT);
                    //}
                    //else
                    //{
                    //    User_set_Num.User_TpmsStatus  = 1;                      /*退出匹配界面*/
                    //    if (User_set_Num.User_Temp_Return == 0)
                    //    {
                    //        User_set_Num.User_Temp_Return = 1;                    /*取消配对标记*/
                    //        User_set_Num.User_TpmsSend = 3;                       /*报文外发次数*/
                    //    }
                    //    else
                    //    {
                    //        ; /* do nonthing*/
                    //    }
                    //}
                }
                else
                {
                    NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_EXIT);
                }
            }
            /*Enter Go*/
            else if (bCurMenuIDX == _MN_DSP_ENTER_MENU)
            {
                MenuFlag.Menu_Return = 0;
                NextMenu(MenuFlag.Menu_Enter_Return);
            }
            else
            {
                ;/*do nothing*/
            }
        }
    }
    else
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
        }
    }
}

/*******************************Menu***********************************************
  Function： Key_Operation_Menu
  Description：
  Input:
  Output:
 *******************************Menu***********************************************/
void Key_Operation_Menu(Key_Event_en_t enKeyEvent)
{
    uint16_t DispVSpeed = 0u;
    KeyTest.Menu ++ ;
    HMI_Set_KEY_MENU(enKeyEvent);
    DispVSpeed =  Common_Get_Disp_V_Speed();

    if (DispVSpeed <= DISPSPEEDNULLMAX)
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
            /*记录进入menu菜单的位置*/
            if ((bCurMenuIDX >= _MN_DSP_LEVEL1MENU_1) && (bCurMenuIDX <= _MN_DSP_LEVEL1MENU_6))
            {
                MenuFlag.Menu_Flag =  bCurMenuIDX;

                if (0) /*有故障码*/
                {
                    NextMenu(_MN_DSP_LEVEL2MENU_1);
                }
                else  /*无故障码*/
                {
                    NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_ENTER);
                }
            }
            /*无论从哪里都能回去*/
            else if ((bCurMenuIDX >= _MN_DSP_LEVEL2MENU_1) && (bCurMenuIDX <= _MN_DSP_RETURN_MENU))
            {
                if (bCurMenuIDX == _MN_DSP_LEVEL3_4_MENU_A) /*胎压设置界面*/
                {
                    NextMenu(_MN_DSP_LEVEL2MENU_4);           /*menu回到用户设置界面*/
                }
                else
                {
                    NextMenu(MenuFlag.Menu_Flag);
                }
            }
        }
    }
    else
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
        }
    }
}



/*------------读按键实时状态的回调函数-------------------------------------------*/
Key_Real_Status_en_t Key_Real_Status_Read_Enter(void);
Key_Real_Status_en_t Key_Real_Status_Read_Return(void);
Key_Real_Status_en_t Key_Real_Status_Read_Up(void);
Key_Real_Status_en_t Key_Real_Status_Read_Down(void);
Key_Real_Status_en_t Key_Real_Status_Read_Menu(void) ;
/*-------------------------------------------------*/

//Menu_R   = 24000*470 / (24000 + 470) =  460.97Ω
//Enter_R  = 24000*6800 / (24000 + 6800) =  5298.7Ω
//Return_R = 24000*15000 / (24000 + 15000) =  9230.77Ω
//Up_R     = 24000*1200 / (24000 + 1200) =  1142.86Ω
//Down_R   = 24000*3300 / (24000 + 3300) =  2901.1Ω

//Menu_R   = 16000*470 / (16000 + 470) =  456.59Ω
//Enter_R  = 16000*6800 / (16000 + 6800) =  4771.9Ω
//Return_R = 16000*15000 / (16000 + 15000) =  7741.94Ω
//Up_R     = 16000*1200 / (16000 + 1200) =  1116.28Ω
//Down_R   = 16000*3300 / (16000 + 3300) =  2736Ω

//实际按键测试
//无操作     21000~24000Ω
//Menu_R        640~680Ω
//Enter_R       5300~5700Ω
//Return_R      9000~9500Ω
//Up_R          1300~1400Ω
//Down_R        3000~3200Ω


/*上*/
Key_Real_Status_en_t Key_Real_Status_Read_Up(void)
{
    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;
    uint16_t Key_R = 0;

    Key_R = (uint16_t)RTE_Read_KEY_R();

    if (RTE_Read_KEY_R_Valid() == 0)
    {
        enKeyRealStatus = KEY_LINE_LOOSEN;
    }
    else
    {
        if ((Key_R >= (1200 - 300)) && (Key_R <= (1200 + 300)))
        {
            enKeyRealStatus = KEY_LINE_PRESS;
        }
        else
        {
            enKeyRealStatus = KEY_LINE_LOOSEN;
        }
    }

    return enKeyRealStatus;
}

/*下*/
Key_Real_Status_en_t Key_Real_Status_Read_Down(void)
{
    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;
    uint16_t Key_R = 0;

    Key_R = (uint16_t)RTE_Read_KEY_R();

    if (RTE_Read_KEY_R_Valid() == 0)
    {
        enKeyRealStatus = KEY_LINE_LOOSEN;
    }
    else
    {
        if ((Key_R >= (2900 - 300)) && (Key_R <= (2900 + 300)))
        {
            enKeyRealStatus = KEY_LINE_PRESS;
        }
        else
        {
            enKeyRealStatus = KEY_LINE_LOOSEN;
        }
    }

    return enKeyRealStatus;
}

/*Enter*/
Key_Real_Status_en_t Key_Real_Status_Read_Enter(void)
{
    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;
    uint16_t Key_R = 0;

    Key_R = (uint16_t)RTE_Read_KEY_R();

    if (RTE_Read_KEY_R_Valid() == 0)
    {
        enKeyRealStatus = KEY_LINE_LOOSEN;
    }
    else
    {
        if ((Key_R >= (5500 - 300)) && (Key_R <= (5500 + 300)))
        {
            enKeyRealStatus = KEY_LINE_PRESS;
        }
        else
        {
            enKeyRealStatus = KEY_LINE_LOOSEN;
        }
    }
    return enKeyRealStatus;
}

/*Return*/
Key_Real_Status_en_t Key_Real_Status_Read_Return(void)
{
    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;
    uint16_t Key_R = 0;

    Key_R = (uint16_t)RTE_Read_KEY_R();

    if (RTE_Read_KEY_R_Valid() == 0)
    {
        enKeyRealStatus = KEY_LINE_LOOSEN;
    }
    else
    {
        if ((Key_R >= (9150 - 300)) && (Key_R <= (9150 + 300)))
        {
            enKeyRealStatus = KEY_LINE_PRESS;
        }
        else
        {
            enKeyRealStatus = KEY_LINE_LOOSEN;
        }
    }

    return enKeyRealStatus;
}

/*Menu*/
Key_Real_Status_en_t Key_Real_Status_Read_Menu(void)
{
    Key_Real_Status_en_t enKeyRealStatus = KEY_LINE_LOOSEN;
    uint16_t Key_R = 0;

    Key_R = (uint16_t)RTE_Read_KEY_R();

    if (RTE_Read_KEY_R_Valid() == 0)
    {
        enKeyRealStatus = KEY_LINE_LOOSEN;
    }
    else
    {
        if ((Key_R >= (550 - 300)) && (Key_R <= (550 + 300)))
        {
            enKeyRealStatus = KEY_LINE_PRESS;
        }
        else
        {
            enKeyRealStatus = KEY_LINE_LOOSEN;
        }
    }

    return enKeyRealStatus;
}

/*---------------------------------------------------------------------------------------*/
const Key_Attribute_st_t stKeyAttribute[KEY_NUM_MAX] =
{
    {KEY_NEED_DEBOUNCE_NORMAL, Key_Real_Status_Read_Up, Key_Operation_Up},
    {KEY_NEED_DEBOUNCE_NORMAL, Key_Real_Status_Read_Down, Key_Operation_Down},
    {KEY_NEED_DEBOUNCE_NORMAL, Key_Real_Status_Read_Enter, Key_Operation_Enter},
    {KEY_NEED_DEBOUNCE_NORMAL, Key_Real_Status_Read_Return, Key_Operation_Return},
    {KEY_NEED_DEBOUNCE_NORMAL, Key_Real_Status_Read_Menu, Key_Operation_Menu},
};

Key_IGN_en_t Key_Get_IGN_Status(void)
{
    Key_IGN_en_t ret = KEY_IG_INVALID;
    if (SYS_OPR_STAT_IGN_ON)
    {
        ret = KEY_IG_ON;
    }
    else
    {
        ret = KEY_IG_OFF;
    }
    return ret;
}
