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

📄 osdhandler.c

📁 GM5621原代码
💻 C
字号:
/*
	$Workfile:   osdhandler.c  $
	$Revision:   1.80  $
	$Date:   Dec 09 2005 06:38:28  $
*/

//******************************************************************
//
//		Copyright (C) 2003.  GENESIS MICROCHIP INC.
// All rights reserved.  No part of this program may be reproduced
//
//	Genesis Microchip Inc., 165 Commerce Valley Dr. West
//		Thornhill, Ontario, Canada, L3T 7V8
//
//==============================================================================
//
// MODULE:      osdhandler.c
//
// USAGE:
//
//******************************************************************************

//******************************************************************************
//  I N C L U D E    F I L E S
//******************************************************************************
#include ".\inc\all.h"
#if ENSURE_SYSTEMTIME
   #include "math.h"
#endif

//******************************************************************************
//  L O C A L    D E F I N I T I O N S
//******************************************************************************
#define		OSD_WB_USED
#define		xDEBUG_OSD_HANDLER

#define		GRANULARITY		8
//******************************************************************************
//  E X T E R N A L    D E F I N I T I O N S
//******************************************************************************
extern BYTE  ROM* ROM EmbeddedPointersArray[];

//******************************************************************************
//  G L O B A L    V A R I A B L E S
//******************************************************************************
DWORD D_PrevSysTimer = 0;				// prev. time
static BYTE ROM hwControlSelType = 0;
static BYTE ROM osdStretch = 0;

//******************************************************************************
//  S T A T I C    F U N C T I O N    P R O T O T Y P E S
//******************************************************************************
static BYTE SystemMsgToOsdEvent(void);
static void CheckOSDTimers(void);
#ifdef _CUSTOMER_D_SPECIFIC_IN_52XX_
	static void	ProcessIdleEvent (void);
#endif

//******************************************************************************
//  C O D E
//******************************************************************************

// System messages to OsdEvent translation table
BYTE ROM SysMsgToEvent [] =
{
		OE_None,
		OE_None,					//MTO_POWER_ON					= 1
		OE_None,					//MTO_POWER_STANDBY			= 2
		OE_None,					//MTO_POWER_SUSPEND			= 3
		OE_RemoveOSD,			//MTO_POWER_DOWN_NOTICE		= 4
		OE_Sleep,				//MTO_POWER_DOWN				= 5
		OE_NoSync,				//MTO_NO_SYNC					= 6
		OE_NoCable,				//MTO_NO_CABLE					= 7
		OE_ValidMode,			//MTO_VALID_MODE				= 8
		OE_RemoveOSD,			//MTO_MODE_CHANGE				= 9
		OE_OutOfRange,			//MTO_OUT_OF_RANGE			= 10
		OE_ValidMode,			//MTO_SUBSAMPLE				= 11
		OE_SplashScreen,		//MTO_SPLASH_SCREEN			= 12
		OE_AutoAdjustComplete,//MTO_AUTO_ADJ				= 13
		OE_None,					 //MTO_SYNC_STANDBY        = 14
		OE_None,					 // MTO_SYNC_SUSPEND       = 15
		OE_StartPowerDown,  	//MTO_REQ_HARD_POWER_DOWN	= 16
		OE_AnalogInput,		//MTO_INPUT_RGB
		OE_DigitalInput,		//MTO_INPUT_DVI
		OE_AutoAdjustStart,		   //MTO_START_AUTO
		OE_AutoAdjustComplete,	   //MTO_AUTO_COMPLETE
		OE_AutoAdjSuccess,			//MTO_AUTO_SUCCESS
		OE_AutoAdjustFailed,			//MTO_AUTO_FAILED
#if THEFT_DETERRENCE_SUPPORT
  		OE_TheftDeterrence,			//MTO_THEFT_DETERRENCE     //THEFT_DETERRENCE_SUPPORT
#endif
};


#ifdef	DEBUG_OSD_HANDLER
static const char B_pSysEvents[][23] =
{
	"MTO_NONE",
	"MTO_POWER_ON",
	"MTO_POWER_STANDBY",
	"MTO_POWER_SUSPEND",
	"MTO_POWER_DOWN_NOTICE",
	"MTO_POWER_DOWN",
	"MTO_NO_SYNC",
	"MTO_NO_CABLE",
	"MTO_VALID_MODE",
	"MTO_MODE_CHANGE",
	"MTO_OUT_OF_RANGE",
	"MTO_SUBSAMPLE",
	"MTO_SPLASH_SCREEN",
	"MTO_AUTO_ADJ",
	"MTO_REQ_HARD_POWER_DOWN"
   "MTO_INPUT_RGB",
   "MTO_INPUT_DVI",
	"MTO_START_AUTO",
   "MTO_AUTO_COMPLETE",
   "MTO_AUTO_SUCCESS",
   "MTO_AUTO_FAILED",
#if THEFT_DETERRENCE_SUPPORT
	"MTO_THEFT_DETERRENCE"		//THEFT_DETERRENCE_SUPPORT
#endif
};
#endif

//******************************************************************************
//
// FUNCTION     :   void OsdInit(void)
// USAGE        :   initialize the OSD data and pointers
//
// INPUT        :   None
// OUTPUT       :   None
// GLOBALS      :   None
// USED_REGS    :	None
//
//******************************************************************************

#if (defined NUMBER_OF_THREADS) && (NUMBER_OF_THREADS > 1)

		#define gm_OsdEventHandler gm_OsdEventHandler

		#define SM_THREAD_CONTEXT	SmThreadCntx

		#define THREADS_NUM	NUMBER_OF_THREADS

		BYTE ROM B_NumberOfThreads  = NUMBER_OF_THREADS;

		SmThreadContextType SmThreadCntx[NUMBER_OF_THREADS];
		gmt_KEY_THREAD gmv_KeyThreadArray [NUMBER_OF_THREADS];
#else
	#define gm_OsdEventHandler gm_OsdEventHandler_ST

	#define SM_THREAD_CONTEXT	(SmThreadContextType*)0

	#define THREADS_NUM 0
	gmt_KEY_THREAD gmv_KeyThreadArray [1];

	BYTE ROM B_NumberOfThreads  = 1;

OSD_THREAD ROM GlobalThreadSet[] =
{
	{GlobalStateSet, 0}
};

#endif //#ifdef NUMBER_OF_THREADS


void Osd_Init(void)
{
#ifdef OSD_WB_USED

	{
		  // Inititalize the OSD state machine
		  SmPtrType S_SmPointers =
		  {
				SM_EventTable,
				ActionOpSet,
				ActionSet,
				ActTableSet,
				THREADS_NUM, //set to 0 to use single thread version of the osd state machine
				GlobalThreadSet,
				SM_THREAD_CONTEXT  //null pointer for single thread version
		  };
		  gm_InitSm ( &S_SmPointers );
	}

	gm_KeypadOsdInit();

	// Inititalize the OSD adjuster engine
	 {
		AdjEngineInitType S_AdjEngineInit =
        {
        	UserDefAdjusterProperty,
            AdjusterFuncSet,
            MinMaxFuncSet,
            StepFuncSet,
            UserPrefStructureDefenitions,
            ModeSwitchers
        };
		gm_InitAe( &S_AdjEngineInit );
	}

    #ifdef ADJUSTER_OSDDIRECTION_DECLARED
    OsdC_Init (
        Font_X,                        //BYTE fontX,
        Font_Y,                        //BYTE fontY,
        UserPrefOsdDirection			//BYTE osdDir,
        );    
	#else
    OsdC_Init (
        Font_X,                        //BYTE fontX,
        Font_Y,                        //BYTE fontY,
        OSD_DIR_NORMAL             		//BYTE osdDir,
        );
    #endif
        
	{
        ControlsInitType S_ControlsInit = 
        {
            (WORD far*) &W_SrcModeWidth,
            (WORD far*) &gmvw_InputHeightMain,
            (WORD far*) &gmvw_InputVFreqMain,
            (WORD far*) &gmvw_InputHFreqMain,
            OsdDialogs,
            (BYTE ROM**) EmbeddedPointersArray,
            GRANULARITY,
            GlyphTblSet,
            (BYTE far*)&ModeIndependentUserPreferences.OSDLanguage,
            (BYTE far*)&osdStretch,
            (BYTE far*)&hwControlSelType,
            0xFF,
				0x00,
				0x00,
            NUM_OSD_POSITIONS, // logical screen size
        };
			S_ControlsInit.PanelHRes = PanelWidth;
			S_ControlsInit.PanelVRes = PanelHeight;

        InitControls( &S_ControlsInit);
	}
    
    // Init Blend levels 0-8 as required by the application
    OsdC_BlendLevel(0, 3);
    OsdC_BlendLevel(1, 10);

    // Init Blink periods
    OsdC_SetBlinkOnOffPeriods ( 30, 30 );

    #ifdef PORT_IR_USED
    	IRInit((DWORD)CPU_CLK_KHZ*1000UL);
    #endif
    
    #ifdef PORT_GPIO_1_USED || PORT_GPIO_2_USED
	    InitGpioKeyMap();
    #endif

	#ifdef PHOENIX
		#ifdef ROM_FONT_USED
		gm_SetRegBitsByte(OSD_R1_CHARMAP_CTRL, BIT5);
		gm_SetRegBitsByte(OSD_R2_CHARMAP_CTRL, BIT5);
		#endif
	#endif
#endif //#ifdef OSD_WB_USED
}

void OSD_Handler (void)
{
	BYTE	B_OsdEvent = OE_None;

	// System message
	B_OsdEvent = SystemMsgToOsdEvent();
	if(B_OsdEvent)
	{
		#ifdef DEBUG_OSD_HANDLER
			gm_Print("System Event = %d", B_OsdEvent);
		#endif
		gm_OsdEventHandler(B_OsdEvent);
	}

	if(SystemFlags.StartAutoAdjust  == gmd_TRUE)
		gm_OsdEventHandler(OE_AutoAdjustStart);
	// Get and process a keypad message
	gm_ProcessKeypadOsdEvent();

    // get user event and process if it's not OE_None
    if((B_OsdEvent = GetOsdUserEvent()) != OE_None)
    {
		#ifdef DEBUG_OSD_HANDLER
			gm_Print("User Event = %d", B_OsdEvent);
		#endif
	    gm_OsdEventHandler(B_OsdEvent);
    }

   CheckOSDTimers();
#ifdef _CUSTOMER_D_SPECIFIC_IN_52XX_
	ProcessIdleEvent ();
#endif
}



//******************************************************************************
//
// FUNCTION:  	BYTE SystemMsgToOsdEvent (void)
// USAGE:       Get system message from queue and re-map to OSD
//
// INPUT:		None.
// OUTPUT:		OSD event number.
// GLOBALS:		None
// USED_REGS: 	None.
//
//******************************************************************************
static BYTE SystemMsgToOsdEvent(void)
{
	BYTE	B_SysMsg;

   B_SysMsg = GetSysMsgToOsd();
   #ifdef DEBUG_OSD_HANDLER
   	if(B_SysMsg)
      {
      	gm_Print("SystemMsgToOsdEvent = %d", B_SysMsg);
      	gm_Print(B_pSysEvents[B_SysMsg],0);
   	}
   #endif

   
	return SysMsgToEvent[B_SysMsg];
}


static void CheckOSDTimers(void)
{
	BYTE	B_DecTimer;			// tick count
	BYTE	B_TimerCounter;
	DWORD D_CurTime = gm_ReadSystemTime();	// current time

#if ENSURE_SYSTEMTIME
	B_DecTimer = (BYTE)(labs(D_CurTime - D_PrevSysTimer) / (W_OsdTimerResolution * 10));
#else
	B_DecTimer = (BYTE)((D_CurTime - D_PrevSysTimer) / (W_OsdTimerResolution * 10));
#endif

	if(B_DecTimer)
	{
	#if ENSURE_SYSTEMTIME
		D_PrevSysTimer  = D_CurTime / (W_OsdTimerResolution * 10);
      D_PrevSysTimer *= W_OsdTimerResolution * 10;
   #else
		D_PrevSysTimer += B_DecTimer * (W_OsdTimerResolution * 10);
   #endif

		B_TimerCounter = OSD_TIMERS_NUM;
		while(B_TimerCounter--)
		{
			if( gW_OsdTimers[B_TimerCounter] == 0 )
				continue;

			if(gW_OsdTimers[B_TimerCounter] <= B_DecTimer)
			{
				gW_OsdTimers[B_TimerCounter] = 0;
				gm_OsdEventHandler(gB_OsdTimerEvents[B_TimerCounter]);
			}
			else
			{
				gW_OsdTimers[B_TimerCounter] -= B_DecTimer;
			}
		}
	}
}

#ifdef _CUSTOMER_D_SPECIFIC_IN_52XX_

#define IdleEventRateUnitMS 20  
static void	ProcessIdleEvent (void)
{
	static DWORD DW_Time;
   
 	if (UserPrefIdleEventRate != 0)
   {	
   	if ((gm_ReadSystemTime () - DW_Time) / IdleEventRateUnitMS > UserPrefIdleEventRate) 
      {
//gm_Print (" ***** ProcessIdleEvent UserPrefIdleEventRate %d",UserPrefIdleEventRate);
//gm_Print (" ***** ProcessIdleEvent DW_Time %d ", (WORD)DW_Time);      
      	DW_Time = gm_ReadSystemTime ();
		 	gm_OsdEventHandler(OE_Idle);
      }
      
   }
}
#endif

#if ENSURE_SYSTEMTIME
DWORD ReadSystemTime(void)
{
	DWORD D_CurTime1, D_CurTime2;
	
	// If upper and lower WORDs from the system timer is inconsistent due to interrupted
	// WORD reads, two consecutive gm_ReadSystemTime() calls return non-contiguous numbers
	// (i.e. delta > 1).  In that case, make third gm_ReadSystemTime() call to get correct number.
	// All gm_ReadSystemTime() calls except for inside this function are redirected to 
	// this function to patch.
	#ifdef gm_ReadSystemTime
	#undef gm_ReadSystemTime
	#endif
	D_CurTime1 = gm_ReadSystemTime();
	D_CurTime2 = gm_ReadSystemTime();
	if (labs(D_CurTime1 - D_CurTime2) > 0x8000)
	{
		D_CurTime1 = gm_ReadSystemTime();
	}
	#define gm_ReadSystemTime		ReadSystemTime
	return D_CurTime1;
}
#endif

⌨️ 快捷键说明

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