#include "key_event_deal.h"
#include "key_driver.h"
#include "app_config.h"
#include "board_config.h"
#include "app_task.h"

//ad key
extern const u16 bt_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 music_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 fm_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 record_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 linein_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 rtc_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 pc_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 spdif_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 idle_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
extern const u16 lp_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX];
/***********************************************************
 *				adkey table 映射管理
 ***********************************************************/
typedef const u16(*type_key_ad_table)[KEY_EVENT_MAX];
static const type_key_ad_table ad_table[APP_TASK_MAX_INDEX] = {
#if TCFG_APP_BT_EN
    [APP_BT_TASK] 		= bt_key_ad_table,
#endif
#if TCFG_APP_MUSIC_EN
    [APP_MUSIC_TASK] 	= music_key_ad_table,
#endif
#if TCFG_APP_FM_EN
    [APP_FM_TASK] 		= fm_key_ad_table,
#endif
#if TCFG_APP_RECORD_EN
    [APP_RECORD_TASK] 	= record_key_ad_table,
#endif
#if TCFG_APP_LINEIN_EN
    [APP_LINEIN_TASK] 	= linein_key_ad_table,
#endif
#if TCFG_APP_LP_EN
    [APP_LP_TASK] 	= lp_key_ad_table,
#endif
#if TCFG_APP_RTC_EN
    [APP_RTC_TASK] 		= rtc_key_ad_table,
#endif
#if TCFG_APP_PC_EN
    [APP_PC_TASK] 		= pc_key_ad_table,
#endif
#if TCFG_APP_SPDIF_EN
    [APP_SPDIF_TASK] 	= spdif_key_ad_table,
#endif
    [APP_IDLE_TASK]     = idle_key_ad_table,
};

u16 adkey_event_to_msg(u8 cur_task, struct key_event *key)
{
    if (ad_table[cur_task] == NULL) {
        return KEY_NULL;
    }

    type_key_ad_table cur_task_ad_table = ad_table[cur_task];
    return	cur_task_ad_table[key->value][key->event];
}

//io key
extern const u16 bt_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 music_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 fm_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 record_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 linein_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 rtc_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 pc_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 spdif_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 idle_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
extern const u16 lp_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX];
/***********************************************************
 *				iokey table 映射管理
 ***********************************************************/
typedef const u16(*type_key_io_table)[KEY_EVENT_MAX];
static const type_key_io_table io_table[APP_TASK_MAX_INDEX] = {
#if TCFG_APP_BT_EN
    [APP_BT_TASK] 		= bt_key_io_table,
#endif
#if TCFG_APP_MUSIC_EN
    [APP_MUSIC_TASK] 	= music_key_io_table,
#endif
#if TCFG_APP_FM_EN
    [APP_FM_TASK] 		= fm_key_io_table,
#endif
#if TCFG_APP_RECORD_EN
    [APP_RECORD_TASK] 	= record_key_io_table,
#endif
#if TCFG_APP_LINEIN_EN
    [APP_LINEIN_TASK] 	= linein_key_io_table,
#endif
#if TCFG_APP_LP_EN
    [APP_LP_TASK] 	= lp_key_io_table,
#endif
#if TCFG_APP_RTC_EN
    [APP_RTC_TASK] 		= rtc_key_io_table,
#endif
#if TCFG_APP_PC_EN
    [APP_PC_TASK] 		= pc_key_io_table,
#endif
#if TCFG_APP_SPDIF_EN
    [APP_SPDIF_TASK] 	= spdif_key_io_table,
#endif
    [APP_IDLE_TASK] 	= idle_key_io_table,
};

u16 iokey_event_to_msg(u8 cur_task, struct key_event *key)
{
    if (io_table[cur_task] == NULL) {
        return KEY_NULL;
    }

    type_key_io_table cur_task_io_table = io_table[cur_task];
    return	cur_task_io_table[key->value][key->event];
}

//ir key
extern const u16 bt_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 music_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 fm_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 record_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 linein_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 rtc_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 pc_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 spdif_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 idle_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
extern const u16 lp_key_ir_table[KEY_IR_NUM_MAX][KEY_EVENT_MAX];
/***********************************************************
 *				irkey table 映射管理
 ***********************************************************/
typedef const u16(*type_key_ir_table)[KEY_EVENT_MAX];
static const type_key_ir_table ir_table[APP_TASK_MAX_INDEX] = {
#if TCFG_APP_BT_EN
    [APP_BT_TASK] 		= bt_key_ir_table,
#endif
#if TCFG_APP_MUSIC_EN
    [APP_MUSIC_TASK] 	= music_key_ir_table,
#endif
#if TCFG_APP_FM_EN
    [APP_FM_TASK] 		= fm_key_ir_table,
#endif
#if TCFG_APP_RECORD_EN
    [APP_RECORD_TASK] 	= record_key_ir_table,
#endif
#if TCFG_APP_LINEIN_EN
    [APP_LINEIN_TASK] 	= linein_key_ir_table,
#endif
#if TCFG_APP_LP_EN
    [APP_LP_TASK] 	= lp_key_ir_table,
#endif
#if TCFG_APP_RTC_EN
    [APP_RTC_TASK] 		= rtc_key_ir_table,
#endif
#if TCFG_APP_PC_EN
    [APP_PC_TASK] 		= pc_key_ir_table,
#endif
#if TCFG_APP_SPDIF_EN
    [APP_SPDIF_TASK] 	= spdif_key_ir_table,
#endif
    [APP_IDLE_TASK] 	= idle_key_ir_table,
};

u16 irkey_event_to_msg(u8 cur_task, struct key_event *key)
{
    if (ir_table[cur_task] == NULL) {
        return KEY_NULL;
    }

    type_key_ir_table cur_task_ir_table = ir_table[cur_task];
    return	cur_task_ir_table[key->value][key->event];
}

//rdec key
extern const u16 bt_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 music_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 fm_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 record_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 linein_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 rtc_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 pc_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 spdif_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 idle_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
extern const u16 lp_key_rdec_table[KEY_RDEC_NUM_MAX][KEY_EVENT_MAX];
/***********************************************************
 *				rdec_key table 映射管理
 ***********************************************************/
typedef const u16(*type_key_rdec_table)[KEY_EVENT_MAX];
static const type_key_rdec_table rdec_table[APP_TASK_MAX_INDEX] = {
#if TCFG_APP_BT_EN
    [APP_BT_TASK] 		= bt_key_rdec_table,
#endif
#if TCFG_APP_MUSIC_EN
    [APP_MUSIC_TASK] 	= music_key_rdec_table,
#endif
#if TCFG_APP_FM_EN
    [APP_FM_TASK] 		= fm_key_rdec_table,
#endif
#if TCFG_APP_RECORD_EN
    [APP_RECORD_TASK] 	= record_key_rdec_table,
#endif
#if TCFG_APP_LINEIN_EN
    [APP_LINEIN_TASK] 	= linein_key_rdec_table,
#endif
#if TCFG_APP_LP_EN
    [APP_LP_TASK] 	= lp_key_rdec_table,
#endif
#if TCFG_APP_RTC_EN
    [APP_RTC_TASK] 		= rtc_key_rdec_table,
#endif
#if TCFG_APP_PC_EN
    [APP_PC_TASK] 		= pc_key_rdec_table,
#endif
#if TCFG_APP_SPDIF_EN
    [APP_SPDIF_TASK] 	= spdif_key_rdec_table,
#endif
    [APP_IDLE_TASK] 	= idle_key_rdec_table,
};

u16 rdec_key_event_to_msg(u8 cur_task, struct key_event *key)
{
    if (rdec_table[cur_task] == NULL) {
        return KEY_NULL;
    }

    type_key_rdec_table cur_task_rdec_table = rdec_table[cur_task];
    return	cur_task_rdec_table[key->value][key->event];
}

//touch key
extern const u16 bt_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 music_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 fm_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 record_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 linein_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 rtc_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 pc_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 spdif_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 idle_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
extern const u16 lp_key_touch_table[KEY_TOUCH_NUM_MAX][KEY_EVENT_MAX];
/***********************************************************
 *				touch_key table 映射管理
 ***********************************************************/
typedef const u16(*type_key_touch_table)[KEY_EVENT_MAX];
static const type_key_touch_table touch_table[APP_TASK_MAX_INDEX] = {
#if TCFG_APP_BT_EN
    [APP_BT_TASK] 		= bt_key_touch_table,
#endif
#if TCFG_APP_MUSIC_EN
    [APP_MUSIC_TASK] 	= music_key_touch_table,
#endif
#if TCFG_APP_FM_EN
    [APP_FM_TASK] 		= fm_key_touch_table,
#endif
#if TCFG_APP_RECORD_EN
    [APP_RECORD_TASK] 	= record_key_touch_table,
#endif
#if TCFG_APP_LINEIN_EN
    [APP_LINEIN_TASK] 	= linein_key_touch_table,
#endif
#if TCFG_APP_LP_EN
    [APP_LP_TASK] 	= lp_key_touch_table,
#endif
#if TCFG_APP_RTC_EN
    [APP_RTC_TASK] 		= rtc_key_touch_table,
#endif
#if TCFG_APP_PC_EN
    [APP_PC_TASK] 		= pc_key_touch_table,
#endif
#if TCFG_APP_SPDIF_EN
    [APP_SPDIF_TASK] 	= spdif_key_touch_table,
#endif
    [APP_IDLE_TASK] 	= idle_key_touch_table,
};

u16 touch_key_event_to_msg(u8 cur_task, struct key_event *key)
{
    if (touch_table[cur_task] == NULL) {
        return KEY_NULL;
    }

    type_key_touch_table cur_task_touch_table = touch_table[cur_task];
    return	cur_task_touch_table[key->value][key->event];
}
