📄 pmp_key_task_new.c
字号:
UINT16 ret;
// 默认为 PMP PROG 状态
ret = STATUS_PMP_PROG;
// 如果对应 BIT 为 1
if ( gGameFlag & GAME_STATUS_MASK )
{
ret = STATUS_NES_GAME; // 已经进入游戏状态
}
return ret;
}
/************************************************************************/
/* 输入一个物理键值, 获得在 NES 中应该对应的键值
input:
key_value [in] UINT16 物理扫描值
output:
NES Game 中应该使用的键值
func:
输入一个物理键值, 在预先设定的表格中进行寻找
如果不能找到对应的
*/
/************************************************************************/
static UINT32 phy_2_nes_key( UINT16 phy_key )
{
UINT32 i,j;
j = 0x00;
for(i = 0x00; i<NES_KEY_NUM; i++ )
{
if ( phy_key == nes_game_key_table[i][0] )
{
j = nes_game_key_table[i][1];
break;
}
}
return j;
}
/************************************************************************/
/* 设置 POWER 键被按下的标志
input:
data [in] UINT16
0 表示没有按下
非0值表示按下
output:
void
func:
note:
使用全局变量 gGameFlag 中的 BIT1
*/
/************************************************************************/
static void set_power_key_status( UINT16 data )
{
gGameFlag &= ~GAME_POWER_KEY_MASK;
if (data ) {
gGameFlag |= GAME_POWER_KEY_MASK;
}
return;
}
/************************************************************************/
/* 获得POWER 键被按下的标志
input:
void
output:
0 power 键没有被按下
非0值 已经被按下
func:
note:
*/
/************************************************************************/
static UINT16 get_power_key_status( void )
{
return (gGameFlag & GAME_POWER_KEY_MASK);
}
/************************************************************************/
/* NES 游戏处理POWER 键
input:
data [in] UINT16
0 按键被释放
非0值 按键被按下
output:
func:
*/
/************************************************************************/
static void nes_power_process( UINT16 data )
{
UINT16 i;
MCATCH_GAME_EVENT_ATTR gameEvent;
// 如果当前是 PMP 程序状态, 直接返回
if ( STATUS_PMP_PROG == SPMP_Get_GameFlag() ) {
return;
}
memset(&gameEvent, 0x00, sizeof(MCATCH_GAME_EVENT_ATTR));
// 设定EVENT 的类型
gameEvent.ulType = MCATCH_KEYPRESS_EVENT;
// 获得上次 POWER 键的状态
i = get_power_key_status();
// 如果上次没有按下, 现在有按下
if ( !i && data )
{
set_power_key_status( data ); // 记住此次的状态!
// 发送命令,离开 NES 游戏状态
SPMP_SendSignal_T(MCATCH_CMD_GAME_EXIT, (UINT8*)&gameEvent, sizeof(gameEvent));
SPMP_Set_GameFlag( STATUS_PMP_PROG ); // 设置回到 PMP 普通状态
}
// 只处理变化的状况
if ( i && !data ) {
set_power_key_status( data );
// 进行信号量的发送动作
SPMP_SendSignal_T(MCATCH_CMD_GAME_EVENTSEND, (UINT8*)&gameEvent, sizeof(gameEvent));
}
return;
}
/************************************************************************/
/*
input:
LastBitMap [in] UINT32 上次的 key bitmap
NowBitMap [in] UINT32 当前的 key bitmap
pLogKey [out] UINT16 * 存放逻辑键值的数组
output:
按键的总数, 0x00 没有键的动作
非 0值表示 按键的总数
func:
对 bitmap 进行处理
LAST NOW
0 0 不作任何处理
0 1 key down
1 0 key up
1 1 key down
(last == 0x00) && (now == 0x00) 直接返回
last|now = temp1
寻找 temp 中为 1 的位置, 表示该键有效
键的当前状态 = now 中该位置的值
*/
/************************************************************************/
#define BIT_KEY_DOWN_MASK (1<<15)
#ifdef BIG_APPLE
static UINT16 key_status_process (UINT32 LastBitMap,
UINT32 NowBitMap,
UINT16 *pLogKey )
{
UINT16 i,j,k,temp;
UINT16 count;
UINT16 keystatus = 0;
// 如果上次为空, 当前为空, (最大量的情形) 直接返回
if ( !LastBitMap && !NowBitMap ) {
return 0x00; // 没有键按下, 直接返回
}
count = 0x00;
//temp = LastBitMap | NowBitMap;
#if 1
temp = LastBitMap;
//printf("last=%lx,%lx\r\n",LastBitMap,NowBitMap);
if(LastBitMap==NowBitMap)
{//no new key
if(gkeycount==10)
{//lomg key
gPowerOff = 0;
keystatus |= 0x2000;
}else if(gkeycount>13)
{//repeat key
gkeycount = 10;
keystatus |= 0x1000;
}
gkeycount++;
//sio_printf("count=%x\r\n",gkeycount);
gkeyconfirm=0;
}
else{//new key
if(gkeyconfirm>0)
{
gPowerOff = 0;
if(NowBitMap == 0)
{//key up
keystatus |= 0x4000;
if(gkeycount<10)
{//key press
keystatus |= 0x800;
}
}else{//key down
temp = NowBitMap;
keystatus |= 0x8000;
}
gkeyconfirm=0;
gkeycount = 0;
}else
{
gkeyconfirm++;
if(NowBitMap == 0)
{//第一次检测到有按键放开,更新temp的值,使得LastBitMap不被更新
temp = NowBitMap; // 补丁,由于变量LastBitMap为局部变量,导致无法操作
}
}
}
#endif
for(j=0x01,i=0x00; i<0x20; i++, j<<=1)
{
// 如果该位置为 0x00, 不需要进行处理
if ( !(temp&j) ) { continue; }
k = i;
k |= keystatus;
*pLogKey = k;
pLogKey++;
count ++;
}
return count; // 返回逻辑键值的总数
}
#else
static UINT16 key_status_process (UINT32 LastBitMap,
UINT32 NowBitMap,
UINT16 *pLogKey )
{
UINT16 i,j,k,temp;
UINT16 count;
// 如果上次为空, 当前为空, (最大量的情形) 直接返回
if ( !LastBitMap && !NowBitMap ) {
return 0x00; // 没有键按下, 直接返回
}
count = 0x00;
temp = LastBitMap | NowBitMap;
for(j=0x01,i=0x00; i<0x20; i++, j<<=1)
{
// 如果该位置为 0x00, 不需要进行处理
if ( !(temp&j) ) { continue; }
k = i;
if ( NowBitMap & j ) { // 键被按下!
k |= BIT_KEY_DOWN_MASK;
}
*pLogKey = k;
pLogKey++;
count ++;
}
return count; // 返回逻辑键值的总数
}
#endif
/************************************************************************/
/*
input:
logkey [in] UINT16 逻辑键状态
bit15 表示 按下/抬起
0 释放
1 按下
bit7-0 逻辑键值
output:
0 成功, 非0值失败
func:
输入逻辑键盘值, 进行相关GUI 处理
history:
[01/28/2007] 加入键盘锁 机制
*/
/************************************************************************/
#define LOG_KEY_PRESS (0x800)
#define LOG_KEY_REPEAT (0x1000)
#define LOG_KEY_LONG (0x2000)
#define LOG_KEY_UP (0x4000)
#define LOG_KEY_DOWN (0x8000)
#ifdef BIG_APPLE
static UINT16 new_gui_key_process( UINT16 logkey )
{
UINT16 ret, GUIKeyValue;
UINT32 GUIMsg;
UINT16 key_up_flag = 0x00;
#if SUPPORT_KEY_LOCK
// 如果键盘处于锁定状态, 不做任何处理,直接返回
if ( SPMP_Get_KeyLockFlag() ) {
return APP_DRV_OK; // 返回成功
}
#endif
// 如果不能获得正确的GUI消息, 返回失败
ret = SPMP_KEY_GetGUIKey(logkey, &GUIKeyValue );
if ( ret ) {
return ret;
}
if(logkey&0xf800)
{
//sio_printf("logkey=%x\r\n",logkey);
if ( logkey & LOG_KEY_DOWN ){
GUIMsg = MSG_KEYBOARD; // 默认为 按下
SPMP_KeyTone_Play( logkey&0xff ); // 播放按键音
}/*else if(logkey&LOG_KEY_UP){
//GUIMsg = MSG_KEYBOARD_UP; // 按键抬起
key_up_flag++;
}*/
else if(logkey & LOG_KEY_LONG)
{
if(GUIKeyValue!=GUI_KEY_MENU)
{
GUIMsg = MSG_KEYBOARD;
}else{
//sio_printf("menu keu \r\n");
GUIMsg = MSG_KEYBOARD_UP;
}
}else if(logkey&LOG_KEY_REPEAT)
{
GUIMsg = MSG_KEYBOARD;
}
else if(logkey&LOG_KEY_PRESS){
GUIMsg = MSG_KEYBOARD_UP;
}else{
GUIMsg = 0xff;
}
//sio_printf("GUIMsg=%lx\r\n",GUIMsg);
if ( judge_gui_msg( (UINT16) GUIMsg ) )
{
GUIMsg <<= 28;
GUIMsg |= GUIKeyValue;
osQuePost(aptask_q, (void*)GUIMsg); // 向GUI发送消息
#if SUPPORT_KEY_LOCK
// 如果是UP消息, 进行键盘的锁定
if ( key_up_flag ) {
SPMP_Set_keyLockFlag( FLAG_KEY_LOCK );
}
#endif
}
}
return APP_DRV_OK; // 返回成功
}
#else
static UINT16 new_gui_key_process( UINT16 logkey )
{
UINT16 ret, GUIKeyValue;
UINT32 GUIMsg;
UINT16 key_up_flag = 0x00;
#if SUPPORT_KEY_LOCK
// 如果键盘处于锁定状态, 不做任何处理,直接返回
if ( SPMP_Get_KeyLockFlag() ) {
return APP_DRV_OK; // 返回成功
}
#endif
// 如果不能获得正确的GUI消息, 返回失败
ret = SPMP_KEY_GetGUIKey(logkey&0xff, &GUIKeyValue );
if ( ret ) {
return ret;
}
if ( logkey & LOG_KEY_DOWN ){
GUIMsg = MSG_KEYBOARD; // 默认为 按下
SPMP_KeyTone_Play( logkey&0xff ); // 播放按键音
}
else{
GUIMsg = MSG_KEYBOARD_UP; // 按键抬起
key_up_flag++;
}
if ( judge_gui_msg( (UINT16) GUIMsg ) )
{
GUIMsg <<= 28;
GUIMsg |= GUIKeyValue;
osQuePost(aptask_q, (void*)GUIMsg); // 向GUI发送消息
#if SUPPORT_KEY_LOCK
// 如果是UP消息, 进行键盘的锁定
if ( key_up_flag ) {
SPMP_Set_keyLockFlag( FLAG_KEY_LOCK );
}
#endif
}
return APP_DRV_OK; // 返回成功
}
#endif
/************************************************************************/
/* new_nes_key_process
input:
key_cnt [in] UINT16 存放按键的数量
key_buf [in] UINT16 * 存放逻辑按键值
output:
0 成功, 非0值失败
func:
将键值转换为 NES 对应的SIGNAL, 发送给相应的任务
*/
/************************************************************************/
static UINT16 new_nes_key_process( UINT16 key_cnt, UINT16 *pkey )
{
UINT16 i,j;
UINT32 nes_key;
MCATCH_GAME_EVENT_ATTR gameEvent;
// 判断是否处于游戏的状态, 不是游戏状态,直接返回
if ( !SPMP_Get_GameFlag() )
{
#ifdef QLZ_DEBUG_00_X
sio_printf("\r\n --- 不在游戏状态,直接返回\r\n");
#endif
return APP_DRV_OK; // 0 表示 有关机键被按下
}
memset(&gameEvent, 0x00, sizeof(MCATCH_GAME_EVENT_ATTR));
// 设定EVENT 的类型
gameEvent.ulType = MCATCH_KEYPRESS_EVENT;
nes_key = 0x00; // 默认为 0x00
for(i=0x00; i<key_cnt; i++)
{
j = *pkey++;
// 判断是否为按键抬起
if ( !(j&LOG_KEY_DOWN) ) { continue; }
// 得到了 NES 键值
nes_key |= log_nes_game_key[ j& ~LOG_KEY_DOWN];
}
gameEvent.ulKey = nes_key;
// 进行信号量的发送动作
SPMP_SendSignal_T(MCATCH_CMD_GAME_EVENTSEND, (UINT8*)&gameEvent, sizeof(gameEvent));
return APP_DRV_OK;
}
/************************************************************************/
/* 定时对低电关机进行检测
input:
output:
func:
note:
*/
/************************************************************************/
static void process_lowpower_period( void )
{
if((0==SPMP_GetPwrStatus())&&(!gPwrStatus))
{
/*
sio_printf("\n电量不足,关机!\n");
SPMP_LCM_LightCtrl( LCM_LIGHT_DISABLE );
SPMP_PowerControl( 0 ); // 关掉电源 */
gPwrStatus++;
SPMP_SendGUIMessage((UINT8)MSG_OTHER,(UINT32)POWER_DOWN_PREPARE, (UINT8)NULL);
SPMP_SendGUIMessage((UINT8)MSG_OTHER,(UINT32)LOW_BATTERY, (UINT8)NULL);
SPMP_SendGUIMessage((UINT8)MSG_OTHER,(UINT32)POWER_DOWN_DO, (UINT8)NULL);
}
}
UINT16 spmp_getlowbat(void)
{
return gPwrStatus;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -