#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_LEVEL2_6_MENU_2))
            {
                /*故障码*/
                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_LEVEL2_6_MENU_2))
            {
                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)
{
    uint16_t DispVSpeed = 0u;
    KeyTest.Enter ++ ;
    HMI_Set_KEY_CONFIRM(enKeyEvent);

    DispVSpeed =  Common_Get_Disp_V_Speed();

    if (DispVSpeed <= DISPSPEEDNULLMAX)
    {
        if (enKeyEvent == KEY_EVENT_SHORT_PRESS)
        {
            /*一级菜单--二级菜单*/
            if ((bCurMenuIDX >= _MN_DSP_LEVEL2MENU_1) && (bCurMenuIDX <= _MN_DSP_LEVEL2_6_MENU_2))
            {
                NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_ENTER);
            }
            /*三级菜单保养设定*/
            else if ((bCurMenuIDX >= _MN_DSP_LEVEL3_3_MENU_1) && (bCurMenuIDX <= _MN_DSP_LEVEL3_3_MENU_7))
            {
                MenuFlag.Menu_Return = 1;
                NextMenu(MenuOptTab[bCurMenuIDX].VK_IDX_ENTER);
            }









            /*Go Return*/
            else if (bCurMenuIDX == _MN_DSP_ENTER_MENU)
            {
                MenuFlag.Menu_Return = 1;
                NextMenu(_MN_DSP_RETURN_MENU);
            }
        }
    }
    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_LEVEL4_4_MENU_1 ) && (bCurMenuIDX <= _MN_DSP_LEVEL4_4_MENU_7))  /*省油设定子菜单*/
                )
                {
                    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)
{
    uint8_t CanStatus1 = 0u;
    uint16_t DispVSpeed = 0u;
    KeyTest.Menu ++ ;

    HMI_Set_KEY_MENU(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)
        {
        }
    }
}



/*------------读按键实时状态的回调函数-------------------------------------------*/
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;
}