/***************************************************************************
 *
 * Copyright 2015-2019 BES.
 * All rights reserved. All unpublished rights reserved.
 *
 * No part of this work may be used or reproduced in any form or by any
 * means, or stored in a database or retrieval system, without prior written
 * permission of BES.
 *
 * Use of this work is governed by a license granted by BES.
 * This work contains confidential and proprietary information of
 * BES. which is protected by copyright, trade secret,
 * trademark and other intellectual property rights.
 *
 ****************************************************************************/
#include "hal_key.h"

#ifndef __APP_KEY_H__
#define __APP_KEY_H__

#ifdef __cplusplus
extern "C" {
#endif

#define APP_KEY_SET_MESSAGE(appevt, code, evt)                                 \
  (appevt = (((uint32_t)code & 0xffffff) << 8) | (evt & 0xff))
#define APP_KEY_GET_CODE(appevt, code) (code = (appevt >> 8) & 0xffffff)
#define APP_KEY_GET_EVENT(appevt, evt) (evt = appevt & 0xff)

#define APP_KEY_CODE_GOOGLE APP_KEY_CODE_FN15
#define APP_KEY_CODE_VOICEPATH APP_KEY_CODE_FN15
#define APP_KEY_CODE_TILE APP_KEY_CODE_FN15

enum APP_KEY_CODE_T {
  APP_KEY_CODE_NONE = HAL_KEY_CODE_NONE,
  APP_KEY_CODE_PWR = HAL_KEY_CODE_PWR,
  APP_KEY_CODE_FN1 = HAL_KEY_CODE_FN1,
  APP_KEY_CODE_FN2 = HAL_KEY_CODE_FN2,
  APP_KEY_CODE_FN3 = HAL_KEY_CODE_FN3,
  APP_KEY_CODE_FN4 = HAL_KEY_CODE_FN4,
  APP_KEY_CODE_FN5 = HAL_KEY_CODE_FN5,
  APP_KEY_CODE_FN6 = HAL_KEY_CODE_FN6,
  APP_KEY_CODE_FN7 = HAL_KEY_CODE_FN7,
  APP_KEY_CODE_FN8 = HAL_KEY_CODE_FN8,
  APP_KEY_CODE_FN9 = HAL_KEY_CODE_FN9,
  APP_KEY_CODE_FN10 = HAL_KEY_CODE_FN10,
  APP_KEY_CODE_FN11 = HAL_KEY_CODE_FN11,
  APP_KEY_CODE_FN12 = HAL_KEY_CODE_FN12,
  APP_KEY_CODE_FN13 = HAL_KEY_CODE_FN13,
  APP_KEY_CODE_FN14 = HAL_KEY_CODE_FN14,
  APP_KEY_CODE_FN15 = HAL_KEY_CODE_FN15,
};

enum APP_KEY_EVENT_T {
  APP_KEY_EVENT_NONE = HAL_KEY_EVENT_NONE,
  APP_KEY_EVENT_DOWN = HAL_KEY_EVENT_DOWN,
  APP_KEY_EVENT_FIRST_DOWN = HAL_KEY_EVENT_FIRST_DOWN,
  APP_KEY_EVENT_CONTINUED_DOWN = HAL_KEY_EVENT_CONTINUED_DOWN,
  APP_KEY_EVENT_UP = HAL_KEY_EVENT_UP,
  APP_KEY_EVENT_UP_AFTER_LONGPRESS = HAL_KEY_EVENT_UP_AFTER_LONGPRESS,
  APP_KEY_EVENT_LONGPRESS = HAL_KEY_EVENT_LONGPRESS,
  APP_KEY_EVENT_LONGLONGPRESS = HAL_KEY_EVENT_LONGLONGPRESS,
  APP_KEY_EVENT_CLICK = HAL_KEY_EVENT_CLICK,
  APP_KEY_EVENT_DOUBLECLICK = HAL_KEY_EVENT_DOUBLECLICK,
  APP_KEY_EVENT_TRIPLECLICK = HAL_KEY_EVENT_TRIPLECLICK,
  APP_KEY_EVENT_ULTRACLICK = HAL_KEY_EVENT_ULTRACLICK,
  APP_KEY_EVENT_RAMPAGECLICK = HAL_KEY_EVENT_RAMPAGECLICK,
  APP_KEY_EVENT_SIXTHCLICK = HAL_KEY_EVENT_SIXTHCLICK,
  APP_KEY_EVENT_SEVENTHCLICK = HAL_KEY_EVENT_SEVENTHCLICK,
  APP_KEY_EVENT_EIGHTHCLICK = HAL_KEY_EVENT_EIGHTHCLICK,
  APP_KEY_EVENT_NINETHCLICK = HAL_KEY_EVENT_NINETHCLICK,
  APP_KEY_EVENT_TENTHCLICK = HAL_KEY_EVENT_TENTHCLICK,
  APP_KEY_EVENT_REPEAT = HAL_KEY_EVENT_REPEAT,
  APP_KEY_EVENT_GROUPKEY_DOWN = HAL_KEY_EVENT_GROUPKEY_DOWN,
  APP_KEY_EVENT_GROUPKEY_REPEAT = HAL_KEY_EVENT_GROUPKEY_REPEAT,
  APP_KEY_EVENT_INITDOWN = HAL_KEY_EVENT_INITDOWN,
  APP_KEY_EVENT_INITUP = HAL_KEY_EVENT_INITUP,
  APP_KEY_EVENT_INITLONGPRESS = HAL_KEY_EVENT_INITLONGPRESS,
  APP_KEY_EVENT_INITLONGLONGPRESS = HAL_KEY_EVENT_INITLONGLONGPRESS,
  APP_KEY_EVENT_INITFINISHED = HAL_KEY_EVENT_INITFINISHED,

  APP_KEY_EVENT_NUM = HAL_KEY_EVENT_NUM,
};

typedef struct {
  uint32_t code;
  uint8_t event;
} APP_KEY_STATUS;

typedef void (*APP_KEY_HANDLE_CB_T)(APP_KEY_STATUS *, void *param);

typedef struct {
  APP_KEY_STATUS key_status;
  const char *string;
  APP_KEY_HANDLE_CB_T function;
  void *param;
} APP_KEY_HANDLE;

int app_key_open(int checkPwrKey);

int app_key_close(void);

uint32_t app_key_read_status(uint32_t code);

int app_key_handle_registration(const APP_KEY_HANDLE *key_handle);

void app_key_handle_clear(void);

void app_key_simulate_key_event(uint32_t key_code, uint8_t key_event);

#if defined(_AUTO_TEST_)
int simul_key_event_process(uint32_t key_code, uint8_t key_event);
#endif

#ifdef __cplusplus
};
#endif
#endif //__FMDEC_H__
