/**
 * @file KeyboardConfig.h
 * @brief Header file of keyboard configuration.
 *
 * @verbatim
 * ==============================================================================
 *                        ##### How to use #####
 * ==============================================================================
 *
 *
 @ endverbatim
 *
 * @author HiView SoC Software Team
 * @version 1.0.0
 * @date 2023-05-30
 */
#ifdef HV_CONFIG_ARCH_RISC
#include "hv_comm_DataType.h"
#include "hv_comm_Define.h"
#include "hv_comm_Event.h"
#if (HV_PROJECT_CONFIG_OSD_ROTATION == HV_CONFIG_ON)
#if (HV_PROJECT_CONFIG_OSD_KEY_ROTATION == HV_CONFIG_ON)
#include "hv_drv_OsdRotate.h"
#endif
#endif
#endif

#ifdef HV_CONFIG_ARCH_C51
#include "hv_pm51_Base.h"
#endif
#include "Keyboard.h"
#include "KeyboardConfig.h"

/* 配置ADC按键对应键值
    第一列表示按键键值的Index，根据Keyboard.h选择枚举AdcKeyVal 中定义的ADC0或ADC1保留的键值Index；
    第二列表示具体的ADC采样的按键键值，一般为多次测量均值；不同按键键值在物理上决定了对应的是哪一个实体按键，
    第三列表示按键键值的Offset，用于软件按键防抖处理，Offset的数值需要保证不同按键的键值不能产生重叠；
*/
#ifdef HV_CONFIG_ARCH_C51
xUSHORT16
#else
USHORT16
#endif
 g_asAdcDataMap[ADC_KEY_NUMS][ADCDATAMAPMAX] =
{
    {E_ADC0_KEY_VAL_0,  2300,    112}, /* MENU */
    {E_ADC0_KEY_VAL_1,  1680,    112}, /* DOWN */
    {E_ADC0_KEY_VAL_2,  1180,    112}, /* UP */  
    {E_ADC0_KEY_VAL_3,  2880,    50}, /* EXIT */
};

#if ADC_COMBO_KEY_ENABLE
/* 配置组合按键
    组合按键只支持两路ADC按键同时开启的情况，在每一路ADC中选择一个按键，然后组合在一起定义一个组合按键。
    第一列表示在ADC0中选择的按键键值的Index；
    第二列表示在ADC1中选择的按键键值的Index；
    第三列表示组合后对应的组合按键的Index，在Keyboard.h的 AdcKeyVal枚举中选择即可;
*/
AdcComboKeyMap g_stAdcComboKeyMap[ADC_COMBO_KEY_NUMS] =
{
    {E_ADC0_KEY_VAL_0, E_ADC1_KEY_VAL_0, E_COMBO_KEY_VAL_0},
    {E_ADC0_KEY_VAL_1, E_ADC1_KEY_VAL_1, E_COMBO_KEY_VAL_1},
};
#endif

#ifdef HV_CONFIG_ARCH_RISC
/* 配置按键键值映射
    将PM51的ADC按键键值映射成主CPU OSD Event按键消息
    第一列表示PM51的ADC按键键值
    第二列表示需要映射的主CPU OSD Event按键消息
*/
OsdEvtKeyValue g_enKeyValueMapping[] =
{
    [E_ADC0_KEY_VAL_0] = OSDEVT_KEY_ENTER ,
    [E_ADC0_KEY_VAL_1] = OSDEVT_KEY_DOWN,
    [E_ADC0_KEY_VAL_2] = OSDEVT_KEY_UP,
    [E_ADC0_KEY_VAL_3] = OSDEVT_KEY_EXIT,
    [E_COMBO_KEY_VAL_0] = OSDEVT_KEY_HOTKEY1,
    [E_COMBO_KEY_VAL_1] = OSDEVT_KEY_HOTKEY2,
};

#if (HV_PROJECT_CONFIG_OSD_ROTATION == HV_CONFIG_ON)
#if (HV_PROJECT_CONFIG_OSD_KEY_ROTATION == HV_CONFIG_ON)
/* 90, 180, 270 mapping */
OsdEvtKeyValue g_enKeyRotateMapping[OSDEVT_KEY_MAX][3] =
{
    /* OSDEVT_KEY_UP */
    {OSDEVT_KEY_LEFT, OSDEVT_KEY_DOWN, OSDEVT_KEY_RIGHT},
    /* OSDEVT_KEY_DOWN */
    {OSDEVT_KEY_RIGHT, OSDEVT_KEY_UP, OSDEVT_KEY_LEFT},
    /* OSDEVT_KEY_LEFT */
    {OSDEVT_KEY_DOWN, OSDEVT_KEY_RIGHT, OSDEVT_KEY_UP},
    /* OSDEVT_KEY_RIGHT */
    {OSDEVT_KEY_UP, OSDEVT_KEY_LEFT, OSDEVT_KEY_DOWN},
    /* OSDEVT_KEY_ENTER */
    {OSDEVT_KEY_ENTER, OSDEVT_KEY_ENTER, OSDEVT_KEY_ENTER},
    /* OSDEVT_KEY_EXIT */
    {OSDEVT_KEY_EXIT, OSDEVT_KEY_EXIT, OSDEVT_KEY_EXIT},
    /* OSDEVT_KEY_HOTKEY1 */
    {OSDEVT_KEY_HOTKEY1, OSDEVT_KEY_HOTKEY1, OSDEVT_KEY_HOTKEY1},
    /* OSDEVT_KEY_HOTKEY2 */
    {OSDEVT_KEY_HOTKEY2, OSDEVT_KEY_HOTKEY2, OSDEVT_KEY_HOTKEY2},
    /* OSDEVT_KEY_HOTKEY3 */
    {OSDEVT_KEY_HOTKEY3, OSDEVT_KEY_HOTKEY3, OSDEVT_KEY_HOTKEY3},
};
#endif
#endif

UINT32 GetAdcMappedValue(UINT32 uiAdcValue)
{
    UINT32 uiArrayNum = 0;

    uiArrayNum = sizeof(g_enKeyValueMapping) / sizeof(g_enKeyValueMapping[0]);
    if (uiAdcValue >= uiArrayNum)
    {
        return 0;
    }
#if (HV_PROJECT_CONFIG_OSD_ROTATION == HV_CONFIG_ON)
#if (HV_PROJECT_CONFIG_OSD_KEY_ROTATION == HV_CONFIG_ON)
    OsdRotationType enRotate = Hv_Drv_OsdGetRotateType();
    OsdEvtKeyValue enKey = g_enKeyValueMapping[uiAdcValue];
    if (OSD_ROTATION_NONE != enRotate)
    {
        if (enKey < OSDEVT_KEY_MAX)
        {
            return g_enKeyRotateMapping[enKey][enRotate - 1];
        }
    }
#endif
#endif
    return g_enKeyValueMapping[uiAdcValue];
}
#endif
