/*===========================================================
 * Copyright (c)      Realtek Semiconductor Corporation, 2005
 * All rights reserved.
 * ========================================================== */

/*==================== File Description ===================== */
/**
 * @file
 * 	This file osd message process is for osd related functions.
 *
 * @author 	$Author: hillwang $
 * @date 	$Date: 2006-07-26 17:16:38 +0800 (?Ÿæ?ä¸? 26 ä¸ƒæ? 2006) $
 * @version 	$Revision: 1133 $
 */

/**
 * @addtogroup osd
 * @{
 */

#define _OSDMESSAGE_C
/*===================== Module dependency  ================== */
#include "Core\Header\Include.h"

/*======================= Private Types ===================== */


/*======================== Definitions ====================== */

/*========================== Variables ====================== */
BYTE xdata ucOsdMessage;
BYTE xdata ucOsdPreMessage;
UINT8 xdata ucOsdMessageControl;
static UINT8 xdata ucOsdMsgQueueRd = 0;
static UINT8 xdata ucOsdMsgQueueWr = 0;
UINT8 xdata ucOsdMsgQueue[_MESSAGE_QUEUE_SIZE];
UINT8 xdata ucRepeatKeyCount = 0;
UINT8 xdata ucKeyPadMessage = 0;		// for KEY Pad used.

UINT16 idata usItemStart;

/*=================== Local Functions Phototype ==============*/
BIT COsdMessageGetInternal(void);
static void COsdMessagePowerCtrl(void);

/*=========================== Functions ===================== */

void COsdMessageHandler(void)
{
	BYTE ucAcceptMessage;

	ucAcceptMessage = CKeyRead();
	if(ucAcceptMessage == _NONE_KEY_MESSAGE)
		{
			if(GET_INPUTPORT_TYPE(stSystemData.InputSource) == _YPBPR_A0_PORT)		//add by lbh 20090916
				ucAcceptMessage = CDVDIRKeyScan();						
			else
			      ucAcceptMessage = CIRKeyScan();
		}
	//if(ucAcceptMessage != _NONE_KEY_MESSAGE)
      //DebugPrintf("\ucAcceptMessage==%d\n", ucAcceptMessage);
	
//	DebugPrintf("\IrHandlerEnable==%d\n", IrHandlerEnable);
#if( 0) 
	if(GET_INPUTPORT_TYPE(stSystemData.InputSource) == _DTV_PORT)
		ucAcceptMessage=DTVCommandFunc(ucAcceptMessage);
#endif

	if(ucAcceptMessage != _NONE_KEY_MESSAGE) 
	{
		if(ucAcceptMessage == _POWER_KEY_MESSAGE) 
		{
			//cancel factory status while soft power down
			if (GET_FACTORYSTATUS() && GET_POWERSTATUS()) 
			{
				//save factory status
				CLR_FACTORYSTATUS();
				CEepromSaveSystemData();
	#if 1//(_FACTORY_COLSE_BY_POWER)
				COsdFxDisableOsd();
				COsdMessageInitial();
				COsdCoreInitialze();
				return;
	#endif
			}	

#if _TIMER_PAGE_SUPPORT
			if (ucOsdState == _SHOW_TIMESTOP_TIMEOVER_HINT_STATE)
			{
				stTimeData.ucTimeHourStop = stTimeData.ucTimeMinStop = 0;
				ucTimerPowerOffMinTickCnt = 0;
				CTimerCancelTimerEvent(COsdReckonTimerPowerOffEvent);
				COsdFxDisableOsd();
				return;
			}
#endif	//#if _TIMER_PAGE_SUPPORT

 		#if 1	
			CTimerWaitForEvent(_EVENT_DEN_STOP);
			CTimerWaitForEvent(_EVENT_DEN_STOP);
			CTimerWaitForEvent(_EVENT_DEN_STOP);
			CTimerWaitForEvent(_EVENT_DEN_STOP);
			COsdCoreSetState(_IDLE_STATE);  
		#endif	
			ucSleepType = 0;  // set Sleep mode disable
			SET_POWERSWITCH();
			COsdMessageInitial();
			return;
		}
	#if (_PCB_TYPE == _PCB_TEST)
		else if(ucAcceptMessage == _LCDONOFF_KEY_MESSAGE)
		{
			if(GET_LIGHTPOWERSTATUS())
			{
				CPowerLightPowerOff();
    				CTimerDelayXms(200);
#ifndef DERUN_805_AT080
				CPowerPanelPowerOff();
				CTimerDelayXms(200);
#endif				
				bForcePanelOff = 1;
			}
			else
			{
			
				if(GET_POWERSTATUS())
				{
					CPowerPanelPowerOn();
			       	CTimerDelayXms(600);
					CPowerLightPowerOn();
					bForcePanelOff = 0;
				}
			}
			COsdMessageInitial();		//add 20091123
			return;
		}
	#endif										//disable by lbh 20091014
		else if (GET_POWERSTATUS())  // Ken
			COsdMessagePush(ucAcceptMessage);
		else
			ucOsdMessage = _NONE_KEY_MESSAGE;   //Ken
	}

	if (ucAcceptMessage == _EXIT_KEY_MESSAGE)
		SET_DONT_ENABLE_OSD_WHEN_CHANGE_SRC();
	
	if(GET_OSDMESSAGE_REMAINDER()) 
	{
		ucAcceptMessage = COsdMessagePop();
		if(ucAcceptMessage != _REPEAT_KEY_MESSAGE)
		{
			ucOsdPreMessage = ucAcceptMessage;
			ucRepeatKeyCount = 0;
		}
		//debug after press left or right key to adjust parameter,then press invalid keys will deal with repeat key 20081016 
		else if(ucAcceptMessage == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _INVALID_KEY_MESSAGE/*_NONE_KEY_MESSAGE*/)	//change  by lbh 20090916
			ucAcceptMessage = _INVALID_KEY_MESSAGE/*_NONE_KEY_MESSAGE*/;		//change  by lbh 20090916
		//20081016

		else
		{
			ucRepeatKeyCount++;

			if(ucRepeatKeyCount == 255)
				ucRepeatKeyCount = 5;
		}

		ucOsdMessage = ucAcceptMessage;
		return;
	}

	ucOsdMessage = _NONE_KEY_MESSAGE;

#if 0
	if(COsdMessageGetInternal()){
		return;
	} else {
		CLR_OSDMESSAGESCANREADY();
		ucAcceptMessage = CKeyRead();
		if(ucAcceptMessage == _NONE_KEY_MESSAGE)
			ucAcceptMessage = CIRKeyScan();

		if(ucAcceptMessage != _NONE_KEY_MESSAGE) {
			ucOsdMessage = ucAcceptMessage;
			if(ucOsdMessage != _REPEAT_KEY_MESSAGE)
				ucOsdPreMessage = ucOsdMessage;

			if(ucOsdMessage == _POWER_KEY_MESSAGE)
				if(GET_POWERSTATUS())
					SET_POWERSWITCH();
				else
					SET_POWERSWITCH();

			return;
		}
	}
	ucOsdMessage = _NONE_KEY_MESSAGE;
#endif
}

/**
	This is the call back function for OSD menu time-out.
	When the time-out occur, we send the fake _EXIT_KEY_MESSAGE
	mesage to close the OSD menu.
*/

void COsdMessageInitial(void)
{
	UINT8 ucCnt;
	// Initial key scan status
	CKeyInitial();
//	CRemoteCtrlInitial();
	for(ucCnt = 0; ucCnt < _MESSAGE_QUEUE_SIZE; ucCnt++)
		ucOsdMsgQueue[ucCnt] = _NONE_KEY_MESSAGE;

	ucOsdMessage = _NONE_KEY_MESSAGE;
	ucOsdPreMessage = _NONE_KEY_MESSAGE;
}

#if 0
BIT COsdMessageGetInternal(void)
{
	if(GET_OSDMESSAGESCANREADY()) {
		CLR_OSDMESSAGESCANREADY();
		return _TRUE;
	}
	ucOsdMessage = _NONE_KEY_MESSAGE;
	return _FALSE;
}

void COsdMessageSend(BYTE message)
{
	ucOsdMessage = message;
	COsdCoreSetState(_IDLE_STATE);
//	COsdCoreResetLayer();
	CTimerCancelTimerEvent(COsdFxExitEvent);
	SET_OSDMESSAGESCANREADY();
}
#endif

void COsdMessagePush(UINT8 message)
{
	ucOsdMsgQueue[ucOsdMsgQueueWr] = message;
	ucOsdMsgQueueWr = (ucOsdMsgQueueWr + 1) % _MESSAGE_QUEUE_SIZE;
	SET_OSDMESSAGE_REMAINDER();
}

UINT8 COsdMessagePop(void)
{
	UINT8 xdata ucRetMessage;
	if(GET_OSDMESSAGE_REMAINDER()) {
		ucRetMessage = ucOsdMsgQueue[ucOsdMsgQueueRd];
		ucOsdMsgQueueRd = (ucOsdMsgQueueRd + 1) % _MESSAGE_QUEUE_SIZE;
		if(ucOsdMsgQueueRd == ucOsdMsgQueueWr)
			CLR_OSDMESSAGE_REMAINDER();
		return ucRetMessage;
	}
	return _NONE_KEY_MESSAGE;
}


/*
void COsdMessageClr()
{
	ucOsdMessage = _NONE_KEY_MESSAGE;
}
*/
/**
 *
 * @}
 */


