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

📄 dvb_fp.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
	if ( DVB_DetectKey()==TRUE )
	{
		return FALSE;
	}
	else
	{
//        CT_OS_MS_GetClock(&u32CurrentTick);
        u32CurrentTick = DVB_TimerGet();
        u32TimeoutTick = u32CurrentTick+u16Timeout;
    
        while( DVB_TimerAfter(u32TimeoutTick,u32CurrentTick) )
        {
            if( DVB_DetectKey()==TRUE )
            {
                return FALSE;
            }
            CT_OS_MS_Delay(5);
                
            u32CurrentTick = DVB_TimerGet();
        }
        return TRUE;
	}
	
}
/*******************************************************************************************/          

u8 DVB_GetKey (void)// get key, and it will remove the key form key buffer
{
	u8 u8KeyCode;
	u8 i = 0;

	if (FALSE ==_bKeyEnable)
	{
		if(_is_dvbmain_task()==TRUE)
		{
			DVB_TimerRunEvent(0);
		}
		return KEY_NO_KEY;
	}
	else
	{
		while(DVB_DetectKey() == FALSE) // run timer in detect key.
		{
			CT_OS_MS_Delay(5);
		}
	}

	CT_OS_WaitOnSemaphore(&NewKey_Semaphore,CTOS_WAIT);

	if (EN_CTOS_SUCCESS != CT_OS_WaitOnSemaphore(&Key_Semaphore,CTOS_WAIT))
	{
		FP_MSG(("DVB_FP_WARNING: CT_OS_WaitOnSemaphore Error\n"));
	}

	if(_u8KeyInFrontOfQueue != KEY_NO_KEY)
	{
		u8KeyCode = _u8KeyInFrontOfQueue;
		_u8KeyInFrontOfQueue = KEY_NO_KEY;

		if(_b8CleanKeyInQueue == TRUE)
		{
			_b8CleanKeyInQueue = FALSE;

			for (i=0; i<KEY_BUFFER_SIZE; i++)
			{
				KeyBuffer[i] = KEY_NO_KEY;
			}
			_u8KeybufferIndex_Top = _u8KeybufferIndex_Bottom = 0;
		}
	}
	else
	{
		u8KeyCode = (u8)KeyBuffer[_u8KeybufferIndex_Top];
//		FP_DBG(("get key = 0x%08hx\n", KeyBuffer[_u8KeybufferIndex_Top]));

		KeyBuffer[_u8KeybufferIndex_Top] = KEY_NO_KEY;
		_u8KeybufferIndex_Top++;
		if( _u8KeybufferIndex_Top >= KEY_BUFFER_SIZE)
		{
			_u8KeybufferIndex_Top = 0;
		}
	}

	if (EN_CTOS_SUCCESS != CT_OS_FreeSemaphore(&Key_Semaphore))
	{
		FP_MSG(("DVB_FP_WARNING: CT_OS_FreeSemaphore Error\n"));
	}

	return u8KeyCode;
}
/*******************************************************************************************/          

void DVB_CleanKey(void)
{
	u8 i;

	if (EN_CTOS_SUCCESS != CT_OS_WaitOnSemaphore(&Key_Semaphore,CTOS_WAIT))
	{
		FP_MSG(("DVB_FP_WARNING: CT_OS_WaitOnSemaphore Error\n"));
	}
	for (i=0; i<KEY_BUFFER_SIZE; i++)
	{
		KeyBuffer[i] = KEY_NO_KEY;
	}
	_u8KeybufferIndex_Top = _u8KeybufferIndex_Bottom = 0;
	CT_OS_ResetSemaphore(&NewKey_Semaphore, 0);

	if (EN_CTOS_SUCCESS != CT_OS_FreeSemaphore(&Key_Semaphore))
	{
		FP_DBG(("DVB_FP_WARNING: CT_OS_FreeSemaphore Error\n"));
	}
	return;
}
/*******************************************************************************************/          

void DVB_SendKey(u8 u8Key)
{
	if (FALSE ==_bKeyEnable)
	{
		return;
	}
	KeyBuffer[_u8KeybufferIndex_Bottom] = (u32)u8Key;
	_u8KeybufferIndex_Bottom++;

	if( _u8KeybufferIndex_Bottom >= KEY_BUFFER_SIZE)
	{
		_u8KeybufferIndex_Bottom = 0;
	}
	if (_u8KeybufferIndex_Bottom == _u8KeybufferIndex_Top)
	{
		if (_u8KeybufferIndex_Bottom == 0)
		{
			_u8KeybufferIndex_Bottom = KEY_BUFFER_SIZE - 1;
		}	
		else
		{
			_u8KeybufferIndex_Bottom--;
		}	
	}	
	else
	{
		CT_OS_FreeSemaphore(&NewKey_Semaphore);
	}	
	return;
	
}
/*******************************************************************************************/          

//Local function
//put in keycode in circle
static void FP_Key_Notification( u32 u32key_code )//This function is call from ISR.
{
    u32 u32KeyTimeInterval = 0;
	u8 u8APkey;
#ifdef HOLD_POWER_RESET_DEFAULT
	static u32  PushTime=0;
#endif
   
	if (FALSE ==_bKeyEnable)
	{
		return;
	}
	switch(u32key_code)
	{
		case 0x01:	u32key_code=0; break;
		case 0x02:	u32key_code=1; break;
		case 0x04:	u32key_code=2; break;
		case 0x08:	u32key_code=3; break;
		case 0x10:	u32key_code=4; break;
		case 0x20:	u32key_code=5; break;
		case 0x40:	u32key_code=6; break;
		case 0x80:	u32key_code=7; break;

		case 0x0100:	u32key_code=8; break;
		case 0x0200:	u32key_code=9; break;
		case 0x0400:	u32key_code=10; break;
		case 0x0800:	u32key_code=11; break;
		case 0x1000:	u32key_code=12; break;

		case 0x010000:	u32key_code=13; break;
		case 0x020000:	u32key_code=14; break;
		case 0x040000:	u32key_code=15; break;
		case 0x080000:	u32key_code=16; break;
		case 0x100000:	u32key_code=17; break;
		default:
			return;
	}

	u8APkey = au8FPKeyMap[u32key_code];
   
#if	(defined(CT216S) || defined(CT216T) || defined (CT216H))
	if(_u8FPKeyPrev == u8APkey && (u32KeyTimeInterval = DVB_TimerMinus(DVB_TimerGet(),_u32TimeISRFPKeyPrev)) < 350)
#else
	if(_u8FPKeyPrev == u8APkey && (u32KeyTimeInterval = DVB_TimerMinus(DVB_TimerGet(),_u32TimeISRFPKeyPrev)) < 300)
#endif	//#if	(defined(CT216S) || defined(CT216T))
	{
#ifdef ENABLE_UI_J_PROJECT
			if ( u8APkey!=KEY_RIGHT && u8APkey!=KEY_LEFT && u8APkey!=KEY_UP && u8APkey!=KEY_DOWN 
				&& u8APkey!=KEY_P_DOWN && u8APkey!=KEY_P_UP && u8APkey!=KEY_VOL_DOWN && u8APkey!=KEY_VOL_UP)//repeate key list;

#else

#ifdef HOLD_POWER_RESET_DEFAULT
			if ( u8APkey!=KEY_RIGHT && u8APkey!=KEY_LEFT && u8APkey!=KEY_UP && u8APkey!=KEY_DOWN&&u8APkey!=KEY_POWER)//repeate key list;
#else
			if ( u8APkey!=KEY_RIGHT && u8APkey!=KEY_LEFT && u8APkey!=KEY_UP && u8APkey!=KEY_DOWN )//repeate key list;
#endif

#endif
			{	
			
                if(u32KeyTimeInterval < 100)
                {
				    _u32TimeISRFPKeyPrev = DVB_TimerGet();
                }	
				//FP_DBG(("Key repeate %d\n", u8APkey));
				return;
			}
            else
            {
#if	(defined(CT216T))            
           	    if(u32KeyTimeInterval < 150)
                    return;
#elif(defined(CT216S) || defined (CT216H))
                if(u32KeyTimeInterval < 180)
                    return;
#endif

#ifdef HOLD_POWER_RESET_DEFAULT
			if(u8APkey==KEY_POWER)
			{
				if(DVB_TimerMinus(DVB_TimerGet(),PushTime)>=10000)
				{
					CT_OS_ControlTimer(& HoldKeyTimer, EN_CTOS_TIMER_DISABLE);
					if(b8Defaultflag==FALSE)
					DVB_SendKey(KEY_SETDEFAULT);
					_u8FPKeyPrev = u8APkey;	
					PushTime= DVB_TimerGet();
					_u32TimeISRFPKeyPrev =PushTime;
					b8Defaultflag=TRUE;
					return;
				}
				else
				{
					_u32TimeISRFPKeyPrev=DVB_TimerGet();
					ResetHoldKeyTimer();
					return;
				}
					
			}
#endif


            }
	}	

#ifdef HOLD_POWER_RESET_DEFAULT
	else
	{
		if(u8APkey==KEY_POWER)
		{
			PushTime=DVB_TimerGet();
			_u32TimeISRFPKeyPrev=PushTime;
			_u8FPKeyPrev = u8APkey;
			ResetHoldKeyTimer();
			return;
		}
	}
#endif

    //FP_DBG(("Key Code = %d\n", u32key_code));

	KeyBuffer[_u8KeybufferIndex_Bottom] = u8APkey;
	_u8KeybufferIndex_Bottom++;
	if( _u8KeybufferIndex_Bottom >= KEY_BUFFER_SIZE)
	{
		_u8KeybufferIndex_Bottom = 0;
	}
	if (_u8KeybufferIndex_Bottom == _u8KeybufferIndex_Top)
	{
		if (_u8KeybufferIndex_Bottom == 0)
		{
			_u8KeybufferIndex_Bottom = KEY_BUFFER_SIZE - 1;
		}	
		else
		{
			_u8KeybufferIndex_Bottom--;
		}	
	}	
	else
	{
		CT_OS_FreeSemaphore(&NewKey_Semaphore);
	}
	
	//reset 
	_u8FPKeyPrev = u8APkey;	
	_u32TimeISRFPKeyPrev = DVB_TimerGet();		//reset timer
	return;	
}
/*******************************************************************************************/          

//Local function
//put in keycode in circle
static void IR_Key_Notification (u32 u32key_code)//This function is call from ISR.
{
	bool8 b8Repeat;
	u8 u8APkey;
	static u32 u32TimeISRKeyPrev=0;
	static u16 u16RepeatCount;

	if (FALSE ==_bKeyEnable)
	{
		return;
	}
	u8APkey=au8IRKeyMap[u32key_code&0xFF];

	if ( (u32key_code&0x100) !=0 )
	{
		b8Repeat=TRUE;
		u16RepeatCount++;

	}
	else
	{
		b8Repeat=FALSE;
		u16RepeatCount=0;
	}
	if ( b8Repeat==TRUE )
	{
		if ( (u16RepeatCount>3) )
		{
#ifdef ENABLE_UI_J_PROJECT
			if ( u8APkey==KEY_RIGHT || u8APkey==KEY_LEFT || u8APkey==KEY_UP || u8APkey==KEY_DOWN 
				|| u8APkey==KEY_P_DOWN || u8APkey==KEY_P_UP || u8APkey==KEY_VOL_DOWN || u8APkey==KEY_VOL_UP)//repeate key list;

#else

			if ( u8APkey==KEY_RIGHT || u8APkey==KEY_LEFT || u8APkey==KEY_UP || u8APkey==KEY_DOWN )//repeate key list;
#endif
			{
				if(DVB_TimerMinus(DVB_TimerGet(),u32TimeISRKeyPrev) >= 1000)
				{
					return;
				}	
			}
			else
			{
				return;
			}
		}
		else
		{
			return;
		}
	}

	KeyBuffer[_u8KeybufferIndex_Bottom] = u8APkey;
	_u8KeybufferIndex_Bottom++;
	
	if( _u8KeybufferIndex_Bottom >= KEY_BUFFER_SIZE)
	{
		_u8KeybufferIndex_Bottom = 0;
	}
	if (_u8KeybufferIndex_Bottom == _u8KeybufferIndex_Top)
	{
		if (_u8KeybufferIndex_Bottom == 0)
		{
			_u8KeybufferIndex_Bottom = KEY_BUFFER_SIZE - 1;
		}	
		else
		{
			_u8KeybufferIndex_Bottom--;
		}	
	}	
	else
	{
		CT_OS_FreeSemaphore(&NewKey_Semaphore);
	}	
	u32TimeISRKeyPrev = DVB_TimerGet();
}
/*******************************************************************************************/          

void DVB_FP_Standby (void)
{
    extern void DEV_IR_Standby (void);
    extern void DEV_FD_Standby(void);
    
	DEV_IR_Standby();
	DEV_FD_Standby();
	return;
}
/*******************************************************************************************/          

void DVB_FP_PowerOn (void)
{
    extern void DEV_FD_PowerOn(void);
    extern void DEV_IR_PowerOn (void);
    
	DEV_IR_PowerOn();
	DEV_FD_PowerOn();
	return;
}	
/*******************************************************************************************/          

void DVB_SendKeyInFrontOfQueue(u8 u8Key, bool8 b8CleanKeyInQueue)
{
	if(u8Key != KEY_NO_KEY)
	{
		_u8KeyInFrontOfQueue = u8Key;
		_b8CleanKeyInQueue = b8CleanKeyInQueue;
		CT_OS_FreeSemaphore(&NewKey_Semaphore);
	}
}
/*******************************************************************************************/          

⌨️ 快捷键说明

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