nt9856x/code/application/source/cardv/SrcCode/Gx/GxInput/Key/GxKey.c
2023-10-27 16:53:48 +08:00

473 lines
13 KiB
C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
Copyright Novatek Microelectronics Corp. 2009. All rights reserved.
@file DetKey.c
@ingroup mIPRJAPKeyIO
@brief Scan key, modedial
Scan key, modedial
@note Nothing.
@date 2009/04/22
*/
/** \addtogroup mIPRJAPKeyIO */
//@{
#include "kwrap/type.h"
#include "KeyInLog.h"
#include "GxInput.h"
#include "DxInput.h"
#include "GxKey_int.h"
//extern volatile BOOL g_bKeyScanResetSleeping;
#define KEYSCAN_PWROFF_INIT_STATE 0
#define KEYSCAN_PWROFF_RELEASE_STATE 1
#define KEYSCAN_PWROFF_PRESS_STATE 2
#define KEYSCAN_PWRKEY_UNKNOWN 0xFFFFFFFF
#define KEYSCAN_PWRKEY_RELEASED 0
#define KEYSCAN_PWRKEY_PRESSED 1
// -------------------------------------------------------------------
// Static variables
// -------------------------------------------------------------------
static UINT32 g_uiLastKeyStatus = 0;
static UINT32 g_uiStableKeyStatus = 0;
//#NT#2010/08/02#Ben Wang -begin
static UINT32 g_uiFirstKeyInvalidPress = 0;
static UINT32 g_uiFirstKeyInvalidRelease = 0;
static UINT32 g_uiFirstKeyInvalidContinue = 0;
//#NT#2010/08/02#Ben Wang -end
static UINT32 g_uiSimKeyStatus = 0;
//#NT#2010/02/23#Ben Wang -begin
//#NT#Refine code for continue key
//static UINT32 uiLastStableKeyStatus = 0;
static UINT32 g_uiLastMDStatus[STATUS_KEY_GROUP_MAX] = {0};
static UINT32 g_uiStableMDStatus[STATUS_KEY_GROUP_MAX] = {0};
BOOL g_bDumpKey = FALSE;
#if(KEYINLOG_FUNCTION == ENABLE)
static UINT32 g_uiKeyScanTimerCnt = 0;
#endif
#define KEY_TIMER_CNT 10//10x20=200ms
#define KEY_CONTINUE_DEBOUNCE 25// 25 x 20=500ms
static GX_CALLBACK_PTR g_fpKeyCB = NULL;
static UINT32 g_uiRepeatCnt = KEY_TIMER_CNT;
static UINT32 g_uiDebounceCnt = KEY_CONTINUE_DEBOUNCE;
void GxKey_RegCB(GX_CALLBACK_PTR pFuncKeyCB)
{
g_fpKeyCB = pFuncKeyCB;
}
void GxKey_SetRepeatInterval(UINT32 RepeatCnt)
{
g_uiRepeatCnt = RepeatCnt;
}
void GxKey_SetContDebounce(UINT32 DebounceCnt)
{
g_uiDebounceCnt = DebounceCnt;
}
static void DetKey_ShowKeyName(UINT32 uiKeyCode, CHAR *pStr)
{
if (g_bDumpKey == FALSE) {
return;
}
DBG_DUMP("KeyCode 0x%x ", uiKeyCode);
#if 0
if (uiKeyCode & FLGKEY_UP) {
DBG_DUMP("DETKEY %s KEY UP\r\n", pStr);
}
if (uiKeyCode & FLGKEY_DOWN) {
DBG_DUMP("DETKEY %s KEY DOWN\r\n", pStr);
}
if (uiKeyCode & FLGKEY_LEFT) {
DBG_DUMP("DETKEY %s KEY LEFT\r\n", pStr);
}
if (uiKeyCode & FLGKEY_RIGHT) {
DBG_DUMP("DETKEY %s KEY RIGHT\r\n", pStr);
}
if (uiKeyCode & FLGKEY_ENTER) {
DBG_DUMP("DETKEY %s KEY ENTER\r\n", pStr);
}
if (uiKeyCode & FLGKEY_MENU) {
DBG_DUMP("DETKEY %s KEY MENU\r\n", pStr);
}
if (uiKeyCode & FLGKEY_DEL) {
DBG_DUMP("DETKEY %s KEY DEL\r\n", pStr);
}
if (uiKeyCode & FLGKEY_MODE) {
DBG_DUMP("DETKEY %s KEY MODE\r\n", pStr);
}
if (uiKeyCode & FLGKEY_ZOOMOUT) {
DBG_DUMP("DETKEY %s KEY ZOOMOUT\r\n", pStr);
}
if (uiKeyCode & FLGKEY_ZOOMIN) {
DBG_DUMP("DETKEY %s KEY ZOOMIN\r\n", pStr);
}
if (uiKeyCode & FLGKEY_SHUTTER1) {
DBG_DUMP("DETKEY %s KEY SHUTTER1\r\n", pStr);
}
if (uiKeyCode & FLGKEY_SHUTTER2) {
DBG_DUMP("DETKEY %s KEY SHUTTER2\r\n", pStr);
}
if (uiKeyCode & FLGKEY_FACEDETECT) {
DBG_DUMP("DETKEY %s KEY FACEDETECT\r\n", pStr);
}
if (uiKeyCode & FLGKEY_MOVIE) {
DBG_DUMP("DETKEY %s KEY FLGKEY_MOVIE\r\n", pStr);
}
if (uiKeyCode & FLGKEY_I) {
DBG_DUMP("DETKEY %s KEY FLGKEY_I\r\n", pStr);
}
#endif
}
void GxKey_RaiseSimKey(UINT32 key)
{
g_uiSimKeyStatus |= key;
}
void GxKey_Init(void)
{
DrvKey_Init();
}
void GxKey_DetNormalKey(void)
{
UINT32 uiCurKeyStatus, uiTempKeyStatus;
UINT32 uiKeyChanged;
UINT32 uiKeyPressed, uiKeyReleased, uiKeyContinue;
static UINT32 uiContineKeyDebounce = 0;
static UINT32 uiContinueKeyCount = 0 ;
//#NT#2010/08/02#Ben Wang -begin
static BOOL bIsFirstPressKey = TRUE;
static BOOL bIsFirstReleaseKey = TRUE;
//#NT#2010/08/02#Ben Wang -end
/*
<09>ϥΤ覡 :
<09><>Key:
1. <20>ק<EFBFBD> #define KEYINLOG_FUNCTION ENABLE
2. Update F/W <20><>, <20>N Log <20>s<EFBFBD>U<EFBFBD><55> (Ex:KeyLog.log)
3. <20><><EFBFBD><EFBFBD> KlTxtToHex KeyLog.log <20><><EFBFBD><EFBFBD> TransLog.hex
4. <20>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>H<EFBFBD><48>
<09><>Key:
1. <20>ק<EFBFBD> #define KEYINLOG_FUNCTION ENABLE
2. <20>Ѱ<EFBFBD><D1B0>b KeyScanTsk.c <20><><EFBFBD><EFBFBD> //Keylog_EnableRuningKeyLog(); <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3. Copy TransLog.hex <20><> SD Card <20><><EFBFBD>ڥؿ<DAA5>
4. <20>}<7D><>
*/
#if(KEYINLOG_FUNCTION == ENABLE)
/*------------------------------------------------------------*
* *
* KeyIn Log Play Section *
* *
*------------------------------------------------------------*/
g_uiKeyScanTimerCnt ++;
if (Keylog_IsRuningKeyLog()) {
uiCurKeyStatus =
uiTempKeyStatus = Keylog_Play_DetKey();
//#NT#2009/04/07#Niven Cho -begin
//#NT#Added., Stop Play Record after playing finished.
Keylog_ScanRecordEnd();
//#NT#2009/04/07#Niven Cho -end
}
/*------------------------------------------------------------*
* End Section
*------------------------------------------------------------*/
else
#endif
{
uiCurKeyStatus =
uiTempKeyStatus = DrvKey_DetNormalKey();
if(g_uiSimKeyStatus){
g_uiLastKeyStatus |= g_uiSimKeyStatus;
uiCurKeyStatus |= g_uiSimKeyStatus;
uiTempKeyStatus |= g_uiSimKeyStatus;
g_uiSimKeyStatus = 0;
}
}
uiCurKeyStatus &= g_uiLastKeyStatus;
uiKeyChanged = uiCurKeyStatus ^ g_uiStableKeyStatus;
uiKeyPressed = uiKeyChanged & uiCurKeyStatus;
uiKeyReleased = uiKeyChanged & (~uiCurKeyStatus);
//#NT#2010/02/23#Ben Wang -begin
//#NT#Refine code for continue key
//uiKeyContinue = uiCurKeyStatus & g_uiStableKeyStatus & uiLastStableKeyStatus;
//uiLastStableKeyStatus = g_uiStableKeyStatus & ~(uiKeyContinue);
//ContinueKey is equal to StableKey ?
uiKeyContinue = uiCurKeyStatus;
//#NT#2010/02/23#Ben Wang -end
g_uiStableKeyStatus = uiCurKeyStatus;
g_uiLastKeyStatus = uiTempKeyStatus;
#if(KEYINLOG_FUNCTION == ENABLE)
/*------------------------------------------------------------*
* *
* KeyIn Log Section *
* *
*------------------------------------------------------------*/
if (Keylog_IsRecordingKeyLog()) {
Keylog_Record_DetKey(uiCurKeyStatus);
}
/*------------------------------------------------------------*
* End Section
*------------------------------------------------------------*/
#endif
if (uiKeyPressed) {
DetKey_ShowKeyName(uiKeyPressed, "PRESS");
//#NT#2010/08/02#Ben Wang -begin
if (bIsFirstPressKey) {
bIsFirstPressKey = FALSE;
uiKeyPressed &= ~ g_uiFirstKeyInvalidPress;
}
//#NT#2010/08/02#Ben Wang -end
if (g_fpKeyCB) {
g_fpKeyCB(KEY_CB_NORMAL, KEY_PRESS, uiKeyPressed);
}
}
if (uiKeyReleased) {
uiContineKeyDebounce = 0;
DetKey_ShowKeyName(uiKeyReleased, "RELEASE");
//#NT#2010/08/02#Ben Wang -begin
if (bIsFirstReleaseKey) {
bIsFirstReleaseKey = FALSE;
uiKeyReleased &= ~ g_uiFirstKeyInvalidRelease;
}
//#NT#2010/08/02#Ben Wang -end
if (g_fpKeyCB) {
g_fpKeyCB(KEY_CB_NORMAL, KEY_RELEASE, uiKeyReleased);
}
}
if (uiKeyContinue) {
//#NT#2010/02/23#Ben Wang -begin
//#NT#Refine code for continue key
if (uiContineKeyDebounce < g_uiDebounceCnt) {
uiContineKeyDebounce++;
} else {
uiContinueKeyCount++;
}
if ((uiContineKeyDebounce == g_uiDebounceCnt) && (uiContinueKeyCount == g_uiRepeatCnt)) {
uiContinueKeyCount = 0;
DetKey_ShowKeyName(uiKeyContinue, "CONTINUE");
//#NT#2010/08/02#Ben Wang -begin
//it will always be "first continue" before first released key
if (bIsFirstReleaseKey) {
uiKeyContinue &= ~ g_uiFirstKeyInvalidContinue;
}
//#NT#2010/08/02#Ben Wang -end
if (g_fpKeyCB) {
g_fpKeyCB(KEY_CB_NORMAL, KEY_CONTINUE, uiKeyContinue);
}
}
//#NT#2010/02/23#Ben Wang -end
}
//-----------------------------------------------------------------------------------------------
// Start to set flag
//-----------------------------------------------------------------------------------------------
}
void GxKey_DetPwrKey(void)
{
static UINT32 uiPowerKey = KEYSCAN_PWRKEY_UNKNOWN;
static UINT32 uiPWRState = KEYSCAN_PWROFF_INIT_STATE;
static UINT32 uiDxPwrKeyFlag = 0;
UINT32 uiPwrKey = DrvKey_DetPowerKey();
//DBG_DUMP("^YPwrKey = %08x\r\n", uiPwrKey);
// Detect power off key
if (uiPwrKey) {
uiDxPwrKeyFlag = uiPwrKey;
// Debounce
if (uiPowerKey == KEYSCAN_PWRKEY_PRESSED) {
if (uiPWRState == KEYSCAN_PWROFF_RELEASE_STATE) {
uiPWRState = KEYSCAN_PWROFF_PRESS_STATE;
if (g_fpKeyCB) {
g_fpKeyCB(KEY_CB_POWER, KEY_PRESS, uiDxPwrKeyFlag);
}
} else if (uiPWRState == KEYSCAN_PWROFF_PRESS_STATE) {
if (g_fpKeyCB) {
g_fpKeyCB(KEY_CB_POWER, KEY_CONTINUE, uiDxPwrKeyFlag);
}
}
} else {
uiPowerKey = KEYSCAN_PWRKEY_PRESSED;
}
} else {
// Debounce
if (uiPowerKey == KEYSCAN_PWRKEY_RELEASED) {
if (uiPWRState == KEYSCAN_PWROFF_INIT_STATE) {
uiPWRState = KEYSCAN_PWROFF_RELEASE_STATE;
} else if (uiPWRState == KEYSCAN_PWROFF_PRESS_STATE) {
uiPWRState = KEYSCAN_PWROFF_RELEASE_STATE;
if (g_fpKeyCB) {
g_fpKeyCB(KEY_CB_POWER, KEY_RELEASE, uiDxPwrKeyFlag);
}
}
} else {
uiPowerKey = KEYSCAN_PWRKEY_RELEASED;
}
}
}
void GxKey_DetStatusKey(void)
{
UINT32 uiCurMDStatus, uiTempMDStatus, uiMDChanged, uiModedial;
UINT32 Group;
for (Group = STATUS_KEY_GROUP1; Group < STATUS_KEY_GROUP_MAX; Group++) {
//#NT#2009/03/19#Elvis Chuang - begin
#if 0//(KEYINLOG_FUNCTION == ENABLE)
/*------------------------------------------------------------*
* *
* KeyIn Log Play Section *
* *
*------------------------------------------------------------*/
if (Keylog_IsRuningKeyLog()) {
uiCurMDStatus = Keylog_Play_DetModedial();
}
/*------------------------------------------------------------*
* End Section
*------------------------------------------------------------*/
else
#endif
{
uiCurMDStatus = DrvKey_DetStatusKey((STATUS_KEY_GROUP)Group);
}
//#NT#2009/03/19#Elvis Chuang - end
uiTempMDStatus = uiCurMDStatus;
uiCurMDStatus &= g_uiLastMDStatus[Group];
uiMDChanged = uiCurMDStatus ^ g_uiStableMDStatus[Group];
uiModedial = uiMDChanged & uiCurMDStatus;
g_uiStableMDStatus[Group] = uiCurMDStatus;
g_uiLastMDStatus[Group] = uiTempMDStatus;
if (uiModedial != 0) {
#if 0//(KEYINLOG_FUNCTION == ENABLE)
/*------------------------------------------------------------*
* *
* KeyIn Log Section *
* *
*------------------------------------------------------------*/
if (Keylog_IsRecordingKeyLog()) {
Keylog_Record_DetModedial(uiModedial);
}
/*------------------------------------------------------------*
* End Section
*------------------------------------------------------------*/
#endif
if (g_fpKeyCB) {
g_fpKeyCB(KEY_CB_STATUS, Group, uiModedial);
}
}
}
}
void GxKey_ForceStatusKeyDet(STATUS_KEY_GROUP Group)
{
UINT32 uiCurMDStatus;
uiCurMDStatus = DrvKey_DetStatusKey(Group);
if (uiCurMDStatus != 0) {
g_uiStableMDStatus[Group] = g_uiLastMDStatus[Group] = uiCurMDStatus;
if (g_fpKeyCB) {
g_fpKeyCB(KEY_CB_STATUS, (UINT32)Group, uiCurMDStatus);
}
}
}
//#NT#2010/08/02#Ben Wang -begin
void GxKey_SetFirstKeyInvalid(KEY_STATUS status, UINT32 uiKey)
{
switch (status) {
case KEY_PRESS:
g_uiFirstKeyInvalidPress = uiKey;
break;
case KEY_RELEASE:
g_uiFirstKeyInvalidRelease = uiKey;
break;
case KEY_CONTINUE:
g_uiFirstKeyInvalidContinue = uiKey;
break;
default:
break;
}
}
//#NT#2010/08/02#Ben Wang -end
void Key_OnSystem(int cmd)
{
switch (cmd) {
case SYSTEM_CMD_POWERON:
if (g_fpKeyCB) {
(*g_fpKeyCB)(SYSTEM_CB_CONFIG, 0, 0);
}
//#NT#2010/08/02#Ben Wang -begin
GxKey_DetStatusKey();
//#NT#2010/08/02#Ben Wang -end
break;
case SYSTEM_CMD_POWEROFF:
break;
default:
break;
}
}
UINT32 GxKey_GetData(GX_KEY_DATA attribute)
{
switch (attribute) {
case GXKEY_NORMAL_KEY:
return (DrvKey_DetPowerKey() | DrvKey_DetNormalKey());
case GXKEY_STS_KEY1:
return DrvKey_DetStatusKey(STATUS_KEY_GROUP1);
case GXKEY_STS_KEY2:
return DrvKey_DetStatusKey(STATUS_KEY_GROUP2);
case GXKEY_STS_KEY3:
return DrvKey_DetStatusKey(STATUS_KEY_GROUP3);
case GXKEY_STS_KEY4:
return DrvKey_DetStatusKey(STATUS_KEY_GROUP4);
case GXKEY_STS_KEY5:
return DrvKey_DetStatusKey(STATUS_KEY_GROUP5);
default:
DBG_ERR("[GxKey_GetData]no this attribute");
return 0;
}
}