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

📄 pmp_key_task_new.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
// 秒计数器
static UINT16 gSecondCount;

// 用于检测是否长时间按下的计数器
static UINT16 gLongPushCount = ON_OFF_KEY_CNT;

// 保存热键状态的寄存器
static UINT16 gHotKeyStatus = 0;
/*
		BIT0 --  1  power off 被按下
		BIT1 -- BIT7  reserved 
 */


// 保存上次的物理键值
static UINT16 LastKey;
// key TASK 的序列
static UINT32 keyDrvQueBuf[KEY_DRV_QUE_SIZE];


// 定时器进行按键的处理
static void process_powersave_period(  void );

// 按键对节电模式的处理
static void process_powersave_key( void );


static UINT32 SPMP_KeyScan_Enable_Flag=1;
extern UINT32 g_uiStartFlag;	//add for nes game

static UINT16 gkeycount = 0;
static UINT16 gkeyconfirm  = 0;

static UINT16 gPwrStatus = 0;

/*
 *	物理按键 和 GUI 消息的对应表	(用户可以修改)
 */
static const UINT8 key_map_table[13][2] = 
{
//  物理扫描值  GUI 按键值
	{KEY_UP,	GUI_KEY_UP},
	{KEY_DOWN,	GUI_KEY_DOWN},
	{KEY_LEFT,	GUI_KEY_LEFT},
	{KEY_RIGHT, GUI_KEY_RIGHT},

	{KEY_OK,	GUI_KEY_OK},
	{KEY_ESC,	GUI_KEY_ESC},
	{KEY_A,		GUI_KEY_F1},	
	{KEY_B,		GUI_KEY_F2},

	// 【10/25/2006】 17:27  lanzhu 根据 5K 键盘对应关系进行整理
	{KEY_TELE,	GUI_KEY_MENU},
	{KEY_WIDE,	GUI_KEY_TAB},
	{KEY_M,		GUI_KEY_F3},
	{KEY_RESET, GUI_KEY_F4},
	{KEY_START, GUI_KEY_START},
};

/*
 *	 按键与按键音转换表		(用户可以修改)
 */
static const UINT8 key_tone_table[8][2] = 
{
//  物理键值	在配置表中的偏移    
	{KEY_UP,		0},
	{KEY_DOWN,		1},
	{KEY_LEFT,		2},
	{KEY_RIGHT,		3},
	{KEY_ESC,		4},
	{KEY_OK,		5},
	{KEY_WIDE,		6},	
	{KEY_TELE,		7},
};	

/*
 *	物理按键 和 NES GAME 内在键值的对应表格 (用户可以修改)
 */

#define KEY_POWER			(0x1111)
#define PMP_NES_EXIT		(0x1112)
#define NES_KEY_NUM			(10)

static const UINT32 nes_game_key_table[10][2] = 
{
//	物理键值	NES GAME 键值
	{DUMMY_KEY,	0x00					},		// 按键的释放动作, 用户不能改动

	{KEY_UP,	MCATCH_EVENT_KEY_UP		},
	{KEY_DOWN,	MCATCH_EVENT_KEY_DOWN	},
	{KEY_LEFT,	MCATCH_EVENT_KEY_LEFT	},
	{KEY_RIGHT,	MCATCH_EVENT_KEY_RIGHT	},

	{KEY_OK,	MCATCH_EVENT_KEY_START	},
	{KEY_ESC,	MCATCH_EVENT_KEY_SELECT },	
	{KEY_TELE,	MCATCH_EVENT_KEY_A		},
	{KEY_WIDE,	MCATCH_EVENT_KEY_B		},

	{KEY_POWER,	PMP_NES_EXIT		},
};
static const UINT32 log_nes_game_key[9] = 
{
#if 1
/*	MCATCH_EVENT_KEY_UP,		// 0x00//*/MCATCH_EVENT_KEY_A,
/*	MCATCH_EVENT_KEY_RIGHT,     // 0x01	*/MCATCH_EVENT_KEY_B,
	/*MCATCH_EVENT_KEY_LEFT,      // 0x02	*/MCATCH_EVENT_KEY_START	,	
/*	MCATCH_EVENT_KEY_DOWN,		// 0x03*/MCATCH_EVENT_KEY_SELECT,

	/*MCATCH_EVENT_KEY_A,			*/MCATCH_EVENT_KEY_UP,
/*	MCATCH_EVENT_KEY_SELECT,	// 0x05 */ MCATCH_EVENT_KEY_LEFT,
	/*MCATCH_EVENT_KEY_START,		// 0x06	*/MCATCH_EVENT_KEY_DOWN,
/*	MCATCH_EVENT_KEY_B,			// 0x07  */ MCATCH_EVENT_KEY_RIGHT,
	#else
MCATCH_EVENT_KEY_A,
MCATCH_EVENT_KEY_B,
MCATCH_EVENT_KEY_SELECT,
MCATCH_EVENT_KEY_START,

MCATCH_EVENT_KEY_RIGHT,
MCATCH_EVENT_KEY_DOWN,
MCATCH_EVENT_KEY_LEFT,
MCATCH_EVENT_KEY_UP,
	#endif

	
};
/*
 *	逻辑按键 和 NES 内在键值的对应表格	( 用户可以修改 )
 */
#if	0
static const UINT32 log_nes_game_key[9] = 
{
	MCATCH_EVENT_KEY_UP,		// 0x00
	MCATCH_EVENT_KEY_RIGHT,     // 0x01		
	MCATCH_EVENT_KEY_LEFT,      // 0x02			
	MCATCH_EVENT_KEY_DOWN,		// 0x03

	MCATCH_EVENT_KEY_A,			// 0x04
	MCATCH_EVENT_KEY_SELECT,	// 0x05
	MCATCH_EVENT_KEY_START,		// 0x06	
	MCATCH_EVENT_KEY_B,			// 0x07
};
#endif
 /**************************************************************************
 *                 E X T E R N A L   R E F E R E N C E S                  *
 **************************************************************************/
extern	void* aptask_q;

extern UINT32 SPMP_GetHoldKeyStatus(void);
/**************************************************************************
 *               F U N C T I O N   D E C L A R A T I O N S                *
 **************************************************************************/

static void clr_PowerDown( void );			// set gPowerDown 0x00;
static UINT16 get_PowerDown( void );		// get gPowerDown
static void increase_PowerDown( void );		// gPowerDown ++


// 定时器对自动关机的处理
static void process_autooff_period(  void );
// 按键对自动关机的处理
static void process_autooff_key( void );

// 检测 关机键是否被按下
static UINT16 power_off_detect( void );
// 初始化 功能端口
static void function_port_initial( void );


#ifndef EVB_SN_V10
	static void  key_port_initial( void );// 初始化 键盘端口的 硬件设置	( S+MM开发板)
	static UINT16 get_key_value( void );	// 获得键盘端口的值 (S+MM EVB )	
#endif


// 初始化 键盘端口的 硬件设置	( 北阳 开发板 V10 )
//static void  key_port_initial_snv10( void );

// 北阳 SN-6047B 开发板的初始化程序
static void  key_port_initial_sn6047b( void );	



// 扫描端口的值( SN EVB V10)
static UINT16 get_key_value_snv10( void );



// 检查一个数据中 "0" 的个数
static UINT16 get_zero_bits( UINT32 data, UINT16 len );

// 输入一个数值和需要检查的位数, 返回第一个0的在该数值中的偏移值
static UINT16 get_zero_position( UINT32 data, UINT16 len );

// 将键盘扫描码 转换为 GUI 能够识别的键值编码
static UINT16 phy2gui_value( UINT16 physical_value);

// 启动键盘任务的程序
void SPMP_KeyDriverTimerFunc( void );

static void set_reg_bit(UINT32 RegAddr, UINT16 BitOffset, UINT16 Flag);

//获取键扫描开启/关闭状态
UINT32 SPMP_KeyScan_EnableStatusGet(void);

// 关掉系统电源
//void SPMP_PowerControl ( UINT16 flag );

// 设定和获得 是否需要进行POWER 键的扫描
extern void SPMP_Set_ScanPowerKey( UINT16 value );
extern UINT16 SPMP_Get_ScanPowerKey( void );


// 判断是否需要进行GUI 消息的发送
static UINT16 judge_gui_msg( UINT16 msg );

// 内部函数 NES 键盘的处理 
//static UINT16 nes_key_process( UINT16 key_value );
// 内部函数 GUI 键盘的处理
//static UINT16 gui_key_process( UINT16 LastKey, UINT16 PhyKeyValue );

// 获得 POWER 是否被按下的状况
static UINT16 get_power_key_status( void );
// 设置 POWER 是否被按下的状况
static void set_power_key_status( UINT16  data );

// 在 NES状态下对 POWER 键的处理
static void nes_power_process( UINT16 data );

// 将一个物理键值转换为NES 键值
static UINT32 phy_2_nes_key( UINT16 phy_key );

// 处理逻辑键盘值的状态
static UINT16 key_status_process (UINT32 LastBitMap, 
								  UINT32 NowBitMap, 
								  UINT16 *pLogKey );


extern UINT16 SPMP_Power_Detect( void  );

// 输入一个逻辑键值获得一个GUI键值
extern UINT16 SPMP_KEY_GetGUIKey( UINT16 log_key, UINT16 *pGUI );

// 新的 GUI 键值处理程序
static UINT16 new_gui_key_process( UINT16 logkey );
// 新的 NES 键值处理程序
static UINT16 new_nes_key_process( UINT16 key_cnt, UINT16 *pkey );


extern UINT32 SPMP_GetPwrStatus( void);
static void process_lowpower_period(  void );



/************************************************************************/
/*		输入一个按键值, 得到按键音的位置索引值
  input:
			key_value	[in]	UINT16
  output:
			按键音的位置索引值
  func:
                                                                        */
/************************************************************************/
UINT16 SPMP_KeyTone_GetIndex( UINT16 key_value )
{

#ifdef NEW_IO_DEBUG

	return key_value;

#else

	UINT16 i;

	for(i=0x00; i<0x08; i++)
	{
		if ( key_tone_table[i][0] == key_value ) 
		{
			return key_tone_table[i][1];
		}
	}
	return (-1);

#endif
	
}

/************************************************************************/
/*			设定是否需要进行开关机键的扫描

  input:
			value	0 不需要扫描
					非0值需要进行扫描
  output:
			void 
                                                                       */
/************************************************************************/
void SPMP_Set_ScanPowerKey( UINT16 value )
{	
	gScanPowerKey = value;
	return;
}

UINT16 SPMP_Get_ScanPowerKey( void )
{
	return gScanPowerKey;
}

/************************************************************************/
/*			设定自动关机计数器的值
  input:
			value	[in]	UINT32
  output:
			void 
  func:
                                                                        */
/************************************************************************/
void SPMP_Set_AutoOffCnt(UINT32 value)
{
	gBakAutoOffCount = value;		// 备份值
	gNowAutoOffCount = value;		// 当前值
	return;
}

/************************************************************************/
/*			键盘对节电的处理
  input:
  output:
  func:		按键对节电模式的处理
  note:
                                                                        */
/************************************************************************/
static void process_powersave_key( void )
{
	// 如果是 不需要进行节电,直接返回
	if ( DISABLE_POWER_SAVE == SPMP_Get_PowerSaveFlag() ) {
		return;
	}

	// 如果当前计数值为0, 说明已经熄灭掉了
	if( !SPMP_Get_PowerSaveCount() )	
	{
		SPMP_LCM_LightCtrl( LCM_LIGHT_ENABLE );	// 点亮屏幕的背光
	}

	SPMP_Reset_PowerSaveCount();	// 将当前的节电值进行复位

	return;
}


/************************************************************************/
/*			定时对自动关机进行检测
  input:
  output:
  func:
  note:
	                                                                    */
/************************************************************************/
static void process_autooff_period(  void )
{
	// 如果是禁止自动关机, 返回不用处理
	if( SPMP_AUTO_POWER_OFF_DISABLE == SPMP_Get_AutoPowerOff()){
		return;
	}

	if ( gNowAutoOffCount ) {
		gNowAutoOffCount --;							// 计数值减一
	}
	else
	{
		increase_PowerDown();
		// 点亮屏幕的背光	
		SPMP_LCM_LightCtrl( LCM_LIGHT_ENABLE );
		// 启动关机流程
		SPMP_SendGUIMessage((UINT8)MSG_OTHER,(UINT32)POWER_DOWN_PREPARE, (UINT8)NULL); 		
	}	
	return;
}

/*
 *		按键对自动关机的处理, 每次收到自动关机后, 复位计数值
 */
static void process_autooff_key( void )
{
	gNowAutoOffCount = gBakAutoOffCount;		// 使用备份值
	return;
}

/************************************************************************/
/*			定时对进行节电的处理
  input:
  output:
  func:
                                                                        */
/************************************************************************/
static void process_powersave_period(  void )
{
	UINT16	i;	
	
	// 如果是 不需要进行节电,直接返回成功
	if ( DISABLE_POWER_SAVE == SPMP_Get_PowerSaveFlag() ) {
		return;
	}

	// 获取当前的计数值
	i = SPMP_Get_PowerSaveCount();

	if(!i){ // 如果已经是 0 了,直接返回, 不需要继续处理 
		return;
	}

	// 计数值减一
	SPMP_Dec_PowerSaveCount();

	if ( 1 == i ) 
	{
		SPMP_LCM_LightCtrl( LCM_LIGHT_DISABLE );	// 关掉系统的背光.
	}
	
	return;
}

/************************************************************************/
/*			控制EVB 电路的电源开关
  input:
			flag	[in]	UINT16  
							SPMP_POWER_OFF
							SPMP_POWER_ON
  output:	void 	
  func:
  note:
			如果是关闭系统电源, 程序不返回
										                                */
/************************************************************************/

#ifndef NEW_IO_DEBUG

void SPMP_PowerControl ( UINT16 flag )
{
	UINT16 i;

	i = 0;
	if ( SPMP_POWER_OFF != flag) {
		i ++;
	}
	
#ifndef PMP3050_EVB_SN_V10
	// set LCM GPIO 25 OUTPUT VALUE
	set_reg_bit( REG_LCM_GPIO_OUTPUT_VALUE + LCM_GPIO_25/8, LCM_GPIO_25%8, i);
	// set output enable 
	set_reg_bit( REG_LCM_GPIO_OUTPUT_ENABLE + LCM_GPIO_25/8, LCM_GPIO_25%8, 1);
	// set LCM OUTPUT SELECT 1 
	set_reg_bit( REG_LCM_GPIO_OUTPUT_SELECT + LCM_GPIO_25/8, LCM_GPIO_25%8, 1);
	if ( SPMP_POWER_OFF == flag) {
		// disable pull high 
		set_reg_bit( REG_LCM_GPIO_PULL_ENABLE + LCM_GPIO_25/8, LCM_GPIO_25%8, 0);		
	}
#else
	/*PMP3050_EVB_SN_V10 used HGPIO1 as Power_EN*/
	//disable HGPIO1 input
	set_reg_bit( REG_HGPIO_INPUT_ENABLE, 1, 0);
	//enable HGPIO1 output
	set_reg_bit( REG_HGPIO_OUTPUT_ENABLE, 1, 1);
	//set HGPIO1 output value
	set_reg_bit( REG_HGPIO_OUTPUT_VALUE, 1, i);

	if ( SPMP_POWER_OFF == flag) {
		// disable pull enable
		set_reg_bit( REG_HGPIO_PULL_ENABLE, 1, 0);		
	}
#endif

	
	while (1);
	
	return;
}

#endif

/************************************************************************/
/*			获得当前热键的状态的数据
  input:
			void 
  output:
			0		没有关机键 按下 
			非0值	关机键 按下
  func:
			获得当前热键的状态信息
                                                                        */
/************************************************************************/
UINT16 SPMP_Get_PowerStatus( void )
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -