📄 key_io_portable.c
字号:
const BYTE gpio[4]={21,22,23,72};
#define MAX_DELAY 120
#define MAX_KEY 10
#endif
#ifdef ALCO_PVS8712
//const BYTE gpio[7]={14,13,12,21,22,23,72};
const BYTE gpio[5]={16,72,21,22,23};
#define MAX_DELAY 120
#define MAX_KEY 10
#endif
#ifdef ALCO_PVS1090
const BYTE gpio[8]={16,21,22,23,12,13,14,15};
#define MAX_DELAY 120
#define MAX_KEY 16
#endif
#ifdef ALCO_PVS1090_AVIN
const BYTE gpio[8]={59,21,22,23,55,56,57,29};
#define MAX_DELAY 120
#define MAX_KEY 16
#endif
#ifdef USE_COMBINED_KEY
#define LONG_PRESS_KEY_TIME 8
#ifdef CONTINUOUS_PRESS_ACTION
#define OPEN_STATE_LONG_PRESS_KEY_TIME 4
#endif
#endif
//#define PORTABLE_IOKEY_DEBUG
UINT16 get_portable_panel_key(void)
{
UINT16 iRet=0;
BYTE temp=0;
#ifdef IO_CHECK_GET_DELAY
BYTE delay_cnt=0;
#endif
#ifdef CHECK_PORTABLE_OPCLSW
#ifdef PORTABLE_8202D
regs0->sft_cfg4&= ~((0x1)<<6);//added 05/08/23
#endif
GPIO_M_SET(PDVD_OPCLSW_GPIO,1);
GPIO_E_SET(PDVD_OPCLSW_GPIO,0); //input
#ifdef IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<20;delay_cnt++)
;
#endif
temp=GPIO_I_GET(PDVD_OPCLSW_GPIO);
if(temp)
iRet=IRC_EJECT;
#endif //end #ifdef CHECK_PORTABLE_OPCLSW
return iRet;
}
void check_portable_key(void)
{
#ifdef IO_CHECK_GET_DELAY
UINT16 delay_cnt;
#endif
#ifdef VIDEO_IN_CONTROL
if(AVin_step)
return;
#endif
#ifdef USE_COMBINED_KEY
#ifdef ALCO_PVS19251
BYTE i,j,keydata,press_flag;
static BYTE keyprev = 0;
static BYTE key_press_times = 0 ;
static BYTE long_press_flag = 0;
#ifdef HOLD_KEY_DETECT
if(hold_state)
return;
#endif
regs0->gpio_master[1]|= 0x00e1; //GPIO 16,21,22,23
for(i=0;i<3;i++)
{
press_flag = 0;
if(i == 0)
{
for(j=0;j<4;j++)
GPIO_E_SET(gpio[j],0);
#ifdef IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<MAX_DELAY;delay_cnt++)
;
#endif
for(j=0;j<4;j++)
{
keydata=GPIO_I_GET(gpio[j]);
if(!keydata)
{
press_flag = 1;
goto KeyProcess;
}
}
}
else if(i == 1)
{
//two in
for(j=0;j<2;j++)
GPIO_E_SET(gpio[j],0);
//two out
for(;j<4;j++)
GPIO_E_SET(gpio[j],1);
GPIO_O_SET(gpio[j-2],0);
GPIO_O_SET(gpio[j-1],1);
#ifdef IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<MAX_DELAY;delay_cnt++)
;
#endif
for(j=0;j<2;j++)
{
keydata=GPIO_I_GET(gpio[j]);
if(!keydata)
{
press_flag = 1;
goto KeyProcess;
}
}
}
else if(i == 2)
{
//ont in
GPIO_E_SET(gpio[0],0);
//three out
for(j=1;j<4;j++)
GPIO_E_SET(gpio[j],1);
GPIO_O_SET(gpio[j-3],0);
GPIO_O_SET(gpio[j-2],1);
GPIO_O_SET(gpio[j-1],1);
#ifdef IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<MAX_DELAY;delay_cnt++)
;
#endif
j = 0;
keydata=GPIO_I_GET(gpio[j]);
if(!keydata)
{
press_flag = 1;
goto KeyProcess;
}
}
}
KeyProcess:
if(press_flag)
{
keydata = 4*i+j+1;
if(keyprev != keydata)
{//first press key!
keyprev = keydata;
#ifdef PORTABLE_IOKEY_DEBUG
printf("%d key press at the first time\n",keydata);
#endif
}
else
{//count the key press times
#ifdef CONTINUOUS_PRESS_ACTION
key_press_times++;
if((key_press_times>=LONG_PRESS_KEY_TIME)
||((play_state==VCD_STATE_OPEN)&&(key_press_times>=OPEN_STATE_LONG_PRESS_KEY_TIME))
)
{
if((vfd_keycode[keyprev - 1]!=IRC_NULL) && (keyprev<=MAX_KEY))
call_ir_func(vfd_keycode[keyprev - 1]);
key_press_times = 0;
long_press_flag = 1;
}
#ifdef PORTABLE_IOKEY_DEBUG
printf("key press times:---->%d\n",key_press_times);
#endif
#endif //end #ifdef CONTINUOUS_PRESS_ACTION
}
}
else
{
if(keyprev && !long_press_flag)
{
if((vfd_keycode[keyprev - 1]!=IRC_NULL) && (keyprev<=MAX_KEY))
{
//shenyj add for alco repeat_ab issue 1104
if ((rep_ab_mode==REPEAT_FIND_B) &&
(sys_cmd==(CMD_FUNC|CMD_FUNC_REPAB)) &&
(cd_type_loaded != CDROM)) // Robert 2004/02/06
{
//printf_w("!!!!waiting for navigator\n");
goto reset_key_para;
}
call_ir_func(vfd_keycode[keyprev - 1]);
}
}
//printf_w("reset key para............\n");
reset_key_para:
keyprev = 0;
press_flag = 0;
long_press_flag = 0;
key_press_times = 0;
}
#elif defined(ALCO_PVS1262)
BYTE i,j,keydata,press_flag;
static BYTE keyprev = 0;
static BYTE key_press_times = 0 ;
static BYTE long_press_flag = 0;
#ifdef PORTABLE_8202D
regs0->sdc_data_cnt[6][0] |= (0x0e);
#endif
regs0->gpio_master[1]|= 0x00e0; //GPIO 21,22,23
GPIO_M_SET(72,1);//GPIO 72
for(i=0;i<4;i++)
{
press_flag = 0;
//current detected GPIO is set input
GPIO_E_SET(gpio[i],0);
keydata = 1;
//others GPIOs output 1
for(j=0;j<4;j++)
{
if(j!=i)
{
GPIO_E_SET(gpio[j],1);
GPIO_O_SET(gpio[j],1);
}
}
if(i == 0)
{
GPIO_O_SET(gpio[j-1],0);
#ifdef IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<MAX_DELAY;delay_cnt++)
;
#endif
keydata=GPIO_I_GET(gpio[i]);
if(!keydata)
{
press_flag = 1;
keydata = 1;
goto KeyProcess;
}
}
else if(i == 1)
{
for(j=i;j<4;j++)
{
if(j>i)
GPIO_O_SET(gpio[j],0);
#ifdef IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<MAX_DELAY;delay_cnt++)
;
#endif
keydata=GPIO_I_GET(gpio[i]);
if(!keydata)
{
press_flag = 1;
keydata = i+(j-1)+1;
goto KeyProcess;
}
}
}
else if(i == 2)
{
for(j=i;j<4;j++)
{
if(j>i)
GPIO_O_SET(gpio[j],0);
#ifdef IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<MAX_DELAY;delay_cnt++)
;
#endif
keydata=GPIO_I_GET(gpio[i]);
if(!keydata)
{
press_flag = 1;
keydata = i+j+1;
goto KeyProcess;
}
}
}
else
{
#ifdef IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<MAX_DELAY;delay_cnt++)
;
#endif
keydata=1;
keydata=GPIO_I_GET(gpio[i]);
if(!keydata)
{
press_flag = 1;
keydata = 7;
goto KeyProcess;
}
}
}
KeyProcess:
if(press_flag)
{
if(keyprev != keydata)
{//first press key!
keyprev = keydata;
#ifdef PORTABLE_IOKEY_DEBUG
printf("%d key press at the first time\n",keydata);
#endif
}
else
{//count the key press times
#ifdef CONTINUOUS_PRESS_ACTION
key_press_times++;
if((key_press_times>=LONG_PRESS_KEY_TIME)
||((play_state==VCD_STATE_OPEN)&&(key_press_times>=OPEN_STATE_LONG_PRESS_KEY_TIME))
)
{
#ifdef PANEL_NEXT_FOWARD_IN_ONE_KEY
if(keyprev == 2)
{
call_ir_func(IRC_FORWARD);
}
else if(keyprev == 7)
{
//printf_w(".............\n");
call_ir_func(IRC_BACKWARD);
}
else
#endif
if((vfd_keycode[keyprev - 1]!=IRC_NULL) && (keyprev<=MAX_KEY))
call_ir_func(vfd_keycode[keyprev - 1]);
key_press_times = 0;
long_press_flag = 1;
}
#ifdef PORTABLE_IOKEY_DEBUG
printf("key press times:---->%d\n",key_press_times);
#endif
#endif //end #ifdef CONTINUOUS_PRESS_ACTION
}
}
else
{
if(keyprev && !long_press_flag)
{
if((vfd_keycode[keyprev - 1]!=IRC_NULL) && (keyprev<=MAX_KEY))
{
//shenyj add for alco repeat_ab issue 1104
if ((rep_ab_mode==REPEAT_FIND_B) &&
(sys_cmd==(CMD_FUNC|CMD_FUNC_REPAB)) &&
(cd_type_loaded != CDROM)) // Robert 2004/02/06
{
//printf_w("!!!!waiting for navigator\n");
goto reset_key_para;
}
call_ir_func(vfd_keycode[keyprev - 1]);
}
}
//printf_w("reset key para............\n");
reset_key_para:
keyprev = 0;
press_flag = 0;
long_press_flag = 0;
key_press_times = 0;
}
#elif defined(ALCO_PVS8712)
BYTE i,j,k,keydata,press_key=0;
static BYTE keyprev=0;
regs0->gpio_master[1]|= 0x00e0; //GPIO 21,22,23
regs0->sdc_data_cnt[6][0] |= (0x0e);
GPIO_M_SET(72,1);//GPIO 72
regs0->sft_cfg1&= ~((0x1)<<3); //GPIO 16 PIN66
GPIO_M_SET(16,1);//GPIO 16 PIN66
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
GPIO_O_SET(gpio[j],1);
GPIO_O_SET(gpio[i],0);
#if 0//def IO_CHECK_GET_DELAY
for(delay_cnt=0;delay_cnt<200;delay_cnt++)
;
#endif
for(k=2;k<5;k++)
{
keydata=GPIO_I_GET(gpio[k]);
if(keydata==0)
{
press_key=1;
if(i==0)//shenyj modify for alco 8712 0928
keydata=k-1;
if(i==1)
keydata=k+2;
//printf_w("key:%d i:%d k:%d.........\n",keydata,i,k);
if(keyprev!=keydata)
{
keyprev=keydata;
if ((rep_ab_mode==REPEAT_FIND_B) &&
(sys_cmd==(CMD_FUNC|CMD_FUNC_REPAB)) &&
(cd_type_loaded != CDROM)) // Robert 2004/02/06
{
//printf_w("!!!!waiting for navigator\n");
goto reset_key_para;
}
call_ir_func(vfd_keycode[keydata - 1]);
//printf("key %d SW %d,%d.\n",keydata,i,k-4);
}
break;
}
}
reset_key_para:
press_key=0;
keyprev=0;
}
if(press_key==0) keyprev=0;
#elif defined(ALCO_PVS1090)||defined(ALCO_PVS1090_AVIN)
BYTE i,j,keydata,press_key=0;
static BYTE keyprev=0;
regs0->gpio_master[1]|= 0x00e0; //GPIO 21,22,23
#ifdef ALCO_PVS1090_AVIN
#if !defined(ARCHT16_USE_64M_ESP)//shenyj add for alco 2006/02/28
regs0->sft_cfg0&= ~((0x1)<<6); //enalbe gpio29 pin125
#endif
regs0->sft_cfg3&= ~((0x4b)<<3);//enable gpio55,56,57,59 pin175,176,177,180
//////////for input
GPIO_M_SET(55,1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -