⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmp_key_task_new.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -