/*===========================================================
 * Copyright (c)      Realtek Semiconductor Corporation, 2005
 * All rights reserved.
 * ========================================================== */

/*==================== File Description ===================== */
/**
 * @file
 * 	This file is osd control declaration related functions.
 *
 * @author 	$Author: hillwang $
 * @date 	$Date: 2006-08-07 16:36:23 +0800 (?Ÿæ?ä¸€, 07 ?«æ? 2006) $
 * @version $Revision: 1155 $
 * @ingroup osd
 */

/**
 * @addtogroup osd
 * @{
 */

#define _OSDCONTROL_C
/*===================== Module dependency  ================== */
#include "Core\Header\Include.h"

/*======================= Private Types ===================== */

/*======================== Definitions ====================== */
//#define _MOVIE_MODE			0
//#define _TEXT_MODE			1
//#define _USER_MODE			2
//#define _NORMAL_MODE		3

#define NOR_FACTOR_CONSTANT		0x3FC00000

/*========================== Variables ====================== */
	// AutoScan

UINT8 * idata pGetGainOffsetTarget;

BYTE code tDCC_Control1[] =
{
	0x84,  0x66,  0xc3,
	0x7c,  0xce,  0x1e,
	0x10,  0x10,  0x14,
};

BYTE code tDCC_Control2[] =
{
	0x84,  0x66,  0xc3,
	0x5c,  0xce,  0x1e,
	0x10,  0x10,  0x14,
};

BYTE code tDCC_Control3[] =
{
	0x84,  0x66,  0xc3,
	0x7c,  0xce,  0x1e,
	0x10,  0x10,  0x14,
};

BYTE code tDCC_Control4[] =
{
    0x84,  0x66,  0xc3,
    0xb4,  0xe6,  0x1e,
    0x10,  0x00,  0xff,

};

BYTE code tDCC_Control5[] =
{
    0x84,  0x66,  0xc3,
    0xb4,  0xe6,  0x1e,
    0x10,  0x00,  0xff,

};

BYTE code tDCC_Control6[] =
{
	0x84,  0x66,  0xc3,
	0x64,  0xce,  0x1e,
	0x10,  0x10,  0x14,
};

BYTE code tDCC_UserCurve1[] =
{
	0x05,  0x10,  0x1f,  0x30,
	0x43,  0x57,  0x6d,  0x80,
	0x95,  0xa9,  0xbd,  0xce,
	0xe0,  0xed,  0xf7,  0x10,  0x00,
	0x80,  0x14,  0x34,
};

BYTE code tDCC_UserCurve2[] =
{
	0x0e,  0x1d,  0x2d,  0x3d,
	0x4d,  0x5d,  0x6d,  0x7d,
	0x8e,  0x9d,  0xad,  0xbc,
	0xca,  0xdb,  0xeb,  0x10,  0x00,
	0x41,  0x14,  0x34,
};

BYTE code tDCC_UserCurve3[] =
{
	0x0f,  0x1d,  0x2d,  0x3e,
	0x4b,  0x5c,  0x6d,  0x80,
	0x91,  0xa2,  0xb3,  0xc4,
	0xd4,  0xe3,  0xf2,  0x10,  0x00,
	0x5d,  0x14,  0x30,
};

BYTE code tDCC_UserCurve4[] =
{
    0x07,  0x11,  0x21,  0x35,
    0x50,  0x60,  0x70,  0x80,
    0x9a,  0xad,  0xbf,  0xcb,
    0xd8,  0xe3,  0xf0,  0x10,  0x00,
    0x50,  0x14,  0x34,
};

BYTE code tDCC_UserCurve5[] =
{
   	0x07,  0x11,  0x21,  0x35,
   	0x50,  0x69,  0x7e,  0x8f,
   	0x9e,  0xad,  0xbf,  0xcb,
   	0xd8,  0xe3,  0xf0,  0x10,  0x00,
   	0x50,  0x14,  0x34,
};

BYTE code tDCC_UserCurve6[] =
{
	0x18,  0x2c,  0x3f,  0x50,
	0x61,  0x73,  0x85,  0x99,
	0xad,  0xc0,  0xd2,  0xe0,
	0xeb,  0xf5,  0xfc,  0x10,  0x00,
	0x64,  0x14,  0x3a,
};

code BYTE *tDCC_Control[6] =
{
	tDCC_Control2, tDCC_Control3, tDCC_Control1, tDCC_Control4, tDCC_Control5, tDCC_Control6
};

code BYTE  *tDCC_UserCurve[6] =
{
	tDCC_UserCurve2, tDCC_UserCurve3, tDCC_UserCurve1, tDCC_UserCurve4, tDCC_UserCurve5, tDCC_UserCurve6
};

UINT8 xdata ucSleepTimeMin;
UINT8 xdata ucSleepTimeSec;
UINT8 xdata ucSleepType = 0x00;

BIT bDoAspectRatioFlag = _FALSE;



void COsdFxChangeInputSrc(UINT8 ucSrcNo)
{
	UINT8	ucAudioNo;

	if((ucSrcNo >= _INPUT_PORT_MAX))	//if((ucSrcNo > 5))
		return;



	SET_OSD_CHANGE_SOURCE();

	stSystemData.InputSource = ucSrcNo;

	// close OSD first to avoid dirty screen.
	//COsdFxDisableOsd();
	
	ucAudioNo = GET_INPUTPORT_TYPE(stSystemData.InputSource);
	switch(ucAudioNo)
	{
		case _DSUB_A0_PORT:
			CScalerSetBit(_IPH_ACT_WID_H_16, ~_BIT5, 0x00);
			SET_INPUTSOURCE_TYPE(_SOURCE_VGA);
			CVideoOutputDisable();
			TV_Power_Down();//add by xyw 070903
					//20080823 ccy add	
#if (_PCB_TYPE == _PCB_TEST)
		CLR_DVD_POWERONOFF();
#endif
//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
			SET_HOTPLUG_HDMI(_OFF);
			SET_HOTPLUG_HDMI2(_OFF);
#endif
			break;
	#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))			
		case _HDMI_PORT:
		case _HDMI_PORT2:

//20080421, HDMI update RT080321. start...
			CScalerPageSelect(_PAGE2);
    			CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT1 | _BIT0), 0);	//ch0/ch1 Z0 OFF
			CTimerDelayXms(100);
//20080421, HDMI update RT080321. end...

			SET_INPUTSOURCE_TYPE(_SOURCE_DVI);
			CVideoOutputDisable();
			TV_Power_Down();//add by xyw 070903
			//20080823 ccy add	
#if (_PCB_TYPE == _PCB_TEST)
		CLR_DVD_POWERONOFF();
#endif
//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
			if (GET_INPUTPORT_TYPE(stSystemData.InputSource)==_HDMI_PORT)
			{
				SET_HOTPLUG_HDMI(_ON);
				SET_HOTPLUG_HDMI2(_OFF);
			}
			else
			{
				SET_HOTPLUG_HDMI(_OFF);
				SET_HOTPLUG_HDMI2(_ON);
			}
//080319,test hdmi
			CTimerDelayXms(200);
//080319,test hdmi

#endif
			break;
	#endif
	
#if _DVI_SUPPORT
	#if(_TMDS_SUPPORT == _ON)			
		case _DVI_I_A0_PORT:	//DVI port
		    SET_INPUTSOURCE_TYPE(_SOURCE_DVI);
			CVideoOutputDisable();
			TV_Power_Down();//add by xyw 070903
					//20080823 ccy add	
#if (_PCB_TYPE == _PCB_TEST)
		CLR_DVD_POWERONOFF();
#endif
//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
			SET_HOTPLUG_HDMI(_ON);
			SET_HOTPLUG_HDMI2(_ON);
#endif
			break;
	#endif
#endif

		case _YPBPR_A0_PORT:
			#if (_PCB_TYPE == _PCB_TEST)
			SET_DVD_POWERONOFF();
			CTimerDelayXms(2000);//20070714 gary for HDMI compatibility problem
			#endif
			CScalerSetBit(_IPH_ACT_WID_H_16, ~_BIT5, 0x00);	//adc input R/B swap disable.
		    SET_INPUTSOURCE_TYPE(_SOURCE_YPBPR);
#if DINISHI_CHANGESOURCE_DVD_TV_MUTE			
  		       CAudioChipWrVolumeGradual(stAudioData.Volume, 1);			
			CTimerDelayXms(100);			
#endif						   
			
			CVideoOutputDisable();
			TV_Power_Down();//add by xyw 070903
					//20080823 ccy add	
			//SET_DMB_VIDEO();
			CTimerDelayXms(20);

//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
			SET_HOTPLUG_HDMI(_OFF);
			SET_HOTPLUG_HDMI2(_OFF);
#endif
		    break;
		case _VIDEO_TV_PORT:
			SET_INPUTSOURCE_TYPE(_SOURCE_VIDEO8);
			TV_Power_ON();//add by xyw 070903
			//20080823 ccy add
			#if (_PCB_TYPE == _PCB_TEST)
#if DINISHI_CHANGESOURCE_DVD_TV_MUTE			
  		       CAudioChipWrVolumeGradual(stAudioData.Volume, 1);			
			CTimerDelayXms(300);			
#endif
			CLR_DVD_POWERONOFF();			
			#endif
			CTimerDelayXms(100);
			CVideoOutputEnable();
//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
			SET_HOTPLUG_HDMI(_OFF);
			SET_HOTPLUG_HDMI2(_OFF);
#endif
			SET_TV_VIDEO();
			CTimerDelayXms(20);

			break;
//20080823 ccy modify
#if (_PCB_TEST == _PCB_TYPE)
		case _VIDEO_AV_PORT:
	
		case _VIDEO_YCBCR_PORT:
		case _VIDEO_AV_SV_PORT1:
		case _VIDEO_SCART_PORT:
			SET_INPUTSOURCE_TYPE(_SOURCE_VIDEO8);
			CVideoOutputEnable();
#if DINISHI_CHANGESOURCE_DVD_TV_MUTE			
  		       CAudioChipWrVolumeGradual(stAudioData.Volume, 1);			
			CTimerDelayXms(300);			
#endif						
			TV_Power_Down();//add by xyw 070903
			//20080823 ccy add
			#if (_PCB_TYPE == _PCB_TEST)
			CLR_DVD_POWERONOFF();
			#endif	
			
			SET_AV_VIDEO();
			CTimerDelayXms(20);

//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
			SET_HOTPLUG_HDMI(_OFF);
			SET_HOTPLUG_HDMI2(_OFF);
#endif
 			break;
case _VIDEO_SV_PORT:
			SET_INPUTSOURCE_TYPE(_SOURCE_VIDEO8);
			TV_Power_Down();//add by xyw 070903
			//20080823 ccy add
			#if (_PCB_TYPE == _PCB_TEST)
			CLR_DVD_POWERONOFF();
			#endif	
			//20080922 ccy modify
			//CTimerDelayXms(1000);
			CVideoOutputEnable();

//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
			SET_HOTPLUG_HDMI(_OFF);
			SET_HOTPLUG_HDMI2(_OFF);
#endif
 			
	break;

#else
		case _VIDEO_AV_PORT:
		case _VIDEO_SV_PORT:
		case _VIDEO_YCBCR_PORT:
		case _VIDEO_AV_SV_PORT1:
		case _VIDEO_SCART_PORT:
			SET_INPUTSOURCE_TYPE(_SOURCE_VIDEO8);
			CVideoOutputEnable();
			TV_Power_Down();//add by xyw 070903
			
//20080215, Pioneer DVD HDMI cause YPBPR can't be shown.
#if (_HDCP_SUPPORT == _ON)
			SET_HOTPLUG_HDMI(_OFF);
			SET_HOTPLUG_HDMI2(_OFF);
#endif
 			break;
#endif
	}

 
   	 CModeResetMode();//added by frank change to this position to get correct input source
     	//CAudioSetSource(ucAudioNo); //fjyang070531 remove to avoid, change source that sounds are too fast.
	CLR_SOURCE_AUTOCHANGE();
	CEepromLoadBriConData();
	//if (GET_PICT_EFFECT()==_PICT_EFFECT_USER) // modified by xyw 070815
	//{
	//	CEepromLoadBriConData();
	//}
	//else
	//{
	//	stConBriData.Brightness=COsdCtrlGetBrightness();
	//	stConBriData.Contrast=COsdCtrlGetContrast();
	//}

	
	CEepromLoadHueSatData();
	CEepromSaveSystemData();
	CEepromSaveTvData();

#if _CGT_DELAY_PC_MUTE
	CLR_PC_AUDIO_ACTIVE();
#endif	//#if _CGT_DELAY_PC_MUTE

}


UINT8 COsdFxCalcMenuSelSource()
{
//!!! according to _INPUT_PORT_MAX !!!
#if (_PCB_TYPE==_PCB_PT2662A)
	switch(stSystemData.InputSource)
	{
		case 0: 		// D-sub
			return 1;
		case 1:  		// DVI
		case 2: 
			return 2;
		 		// CVBS(2533 + 2613)
		case 3:	 		// S-Video(2533 + 2613)
			return 4;
		case 4:  		// YPBPr
			return 3;
		case 5:  		// TV
			return 0;
			break;
	};
#endif

#if _PCB_TYPE == _PCB_PT2662C1B
#if _TYPEOF_INPUT==_TYPEOF_INPUT_6SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// TV
			return 1;
		case 1: 		// av
		case 2: 		// sv
			return 2;
		case 3: 		// ypbpr
			return 4;
		case 4: 		// hdmi
			return 3;
		case 5: 		// pc
			return 0;
		default: 		// 
			return 0;
	};
#elif _TYPEOF_INPUT==_TYPEOF_INPUT_7SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// TV
			return 1;
		case 1: 		// av
		case 2: 		// sv
			return 2;
		case 3: 		// ypbpr
			return 4;
		case 4: 		// hdmi 1
		case 5: 		// hdmi 2
			return 3;
		case 6: 		// pc
			return 0;
		default: 		// 
			return 0;
	};
#endif	//#if _TYPEOF_INPUT==_TYPEOF_INPUT_7SRC
#endif	//#if _PCB_TYPE == _PCB_PT2662C1B


#if (_PCB_TYPE==_PCB_PT2660A1A)
	switch(stSystemData.InputSource)
	{
		case 0:	 		// TV
			return 1;
		case 1:  		// CVBS
		case 2:         // S-Video
			return 2;
		case 3: 		// D-sub
			return 0;

	};
#endif

#if (_PCB_TYPE==_PCB_PT2660_KTC57924G)
	switch(stSystemData.InputSource)
	{
		case 0:	 		// PC
			return 0;
		case 1:  			// CVBS
		case 2:         		// S-Video
			return 2;

	};
#endif
//20080818 ccy add
#if (_PCB_TYPE==_PCB_TEST)
	switch(stSystemData.InputSource)
	{
		case 3:	 		// PC
			return 0;
		case 1:  			// CVBS
		case 2:         		// S-Video
			return 2;
		case 0:			//TV	
			return 1;

	};
#endif


#if _PCB_TYPE==_PCB_PT2662F1A
#if _TYPEOF_INPUT==_TYPEOF_INPUT_6SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// TV
			return 1;
		case 1: 		// av
		case 2: 		// sv
			return 2;
		case 3: 		// ypbpr
			return 4;
		case 4: 		// hdmi
			return 3;
		case 5: 		// pc
			return 0;
		default: 		// 
			return 0;
	};
#elif _TYPEOF_INPUT==_TYPEOF_INPUT_7SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// TV
			return 1;
		case 1: 		// av
		case 2: 		// sv
			return 2;
		case 3: 		// ypbpr
			return 4;
		case 4: 		// hdmi 1
		case 5: 		// hdmi 2
			return 3;
		case 6: 		// pc
			return 0;
		default: 		// 
			return 0;
	};
#elif _TYPEOF_INPUT==_TYPEOF_INPUT_8SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// TV
			return 1;
		case 1: 		// av
		case 2: 		// sv
			return 2;
		case 3: 		// ypbpr
		case 4: 		// ypbpr
			return 4;
		case 5: 		// hdmi 1
		case 6: 		// hdmi 2
			return 3;
		case 7: 		// pc
			return 0;
		default: 		// 
			return 0;
	};
#endif	//#if _TYPEOF_INPUT==_TYPEOF_INPUT_7SRC
#endif	//#if _PCB_TYPE==_PCB_PT2662F1A

#if _PCB_TYPE==_PCB_PT2662F1C


#if _TYPEOF_INPUT==_TYPEOF_INPUT_6SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// TV
			return 1;
		case 1: 		// av
		case 2: 		// sv
			return 2;
		case 3: 		// ypbpr
			return 4;
		case 4: 		// hdmi
			return 3;
		case 5: 		// pc
			return 0;
		default: 		// 
			return 0;
	};
#elif _TYPEOF_INPUT==_TYPEOF_INPUT_7SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// TV
			return 1;
		case 1: 		// av
		case 2: 		// sv
			return 2;
		case 3: 		// ypbpr
			return 4;
		case 4: 		// hdmi 1
		case 5: 		// hdmi 2
			return 3;
		case 6: 		// pc
			return 0;
		default: 		// 
			return 0;
	};
#elif _TYPEOF_INPUT==_TYPEOF_INPUT_8SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// TV
			return 1;
		case 1: 		// av
		case 2: 		// sv
			return 2;
		case 3: 		// ypbpr
		case 4: 		// ypbpr
			return 4;
		case 5: 		// hdmi 1
		case 6: 		// hdmi 2
			return 3;
		case 7: 		// pc
			return 0;
		default: 		// 
			return 0;
	};
#endif	//#if _TYPEOF_INPUT==_TYPEOF_INPUT_7SRC
#endif	//#if _PCB_TYPE==_PCB_PT2662F1C


#if (_PCB_TYPE==_PCB_PT2662B1C)
#if _TYPEOF_INPUT==_TYPEOF_INPUT_6SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// D-sub
			return 1;
		case 1:  		// DVI
		case 2: 
			return 2;
		 		// CVBS(2533 + 2613)
		case 3:	 		// S-Video(2533 + 2613)
			return 4;
		case 4:  		// YPBPr
			return 3;
		case 5:  		// TV
			return 0;
			break;
	};
#elif _TYPEOF_INPUT==_TYPEOF_INPUT_5SRC
	switch(stSystemData.InputSource)
	{
		case 0: 		// D-sub
			return 1;
		case 1:  		// DVI
		case 2: 
			return 2;
		 		// CVBS(2533 + 2613)
		case 3:	 		// S-Video(2533 + 2613)
			return 4;
		case 4:  		// tv
			return 0;
			break;
		default:
			return 0;
			break;
			
	};
#endif
#endif

}

void COsdCtrlSetSingalSource(UINT8 message)
{	
	// if the same source, don't need to change.
	if (stSystemData.InputSource == message)
		return;

	CAdjustBackgroundColor(0x00,0x00,0x00);			//setup black background color
	//20081016 ccy cancel 			 
	CScalerSetBit(_VDISP_CTRL_28, ~_BIT5, _BIT5);
	//CScalerSetBit(_VDISP_CTRL_28, ~_BIT3, _BIT5);
	SET_MUTE_PROCESS(_ENABLE);	//add 20091126
	COsdFxDisableOsd();
	COsdFxChangeInputSrc(message);
	
	//20080825 ccy add
//	CAudioSetSource(GET_INPUTPORT_TYPE(stSystemData.InputSource));
	ucMenuSelect =COsdFxCalcMenuSelSource();
	COsdCoreInitialze();//add by xyw

}
#if 0
void COsdCtrlSetSingalSourceMainMenu(void)
{
	if (ucExtendMenuRow>_INPUT_PORT_MAX)
		return;
	if (ucExtendMenuRow==0)
		return;
	
#if _PCB_TYPE==_PCB_PT2662F1A
#if _TYPEOF_INPUT == _TYPEOF_INPUT_8SRC
	COsdCtrlSetSingalSource(tSrcMap[(ucExtendMenuCol-1)*5+ucExtendMenuRow-1][2]);
#else
	COsdCtrlSetSingalSource(ucExtendMenuRow-1);
#endif

#elif _PCB_TYPE==_PCB_PT2662F1C
#if _TYPEOF_INPUT == _TYPEOF_INPUT_8SRC
	COsdCtrlSetSingalSource(tSrcMap[(ucExtendMenuCol-1)*5+ucExtendMenuRow-1][2]);
#else
	COsdCtrlSetSingalSource(ucExtendMenuRow-1);
#endif

#else
	COsdCtrlSetSingalSource(ucExtendMenuRow-1);
#endif
}
#endif
UINT8 COsdCtrlGetColorTemp()
{
	return GET_COLOR_TEMP_TYPE();
}

void COsdCtrlSetColorTemp()
{
	if (GET_INPUTSOURCE_TYPE()==_SOURCE_VGA)
		SET_COLOR_TEMP_TYPE((GET_COLOR_TEMP_TYPE() + 1) % _CT_TYPE_TOTAL);
	else if (GET_INPUTSOURCE_TYPE()==_SOURCE_DVI)
		SET_COLOR_TEMP_TYPE((GET_COLOR_TEMP_TYPE() + 1) % _CT_TYPE_DVI_TOTAL);
	else 
		SET_COLOR_TEMP_TYPE((GET_COLOR_TEMP_TYPE() + 1) % _CT_TYPE_VIDEO_TOTAL);
	
	CEepromLoadColorTempData();
	CAdjustContrast();
	CEepromSaveColorTempModeData();
}

UINT8 COsdCtrlGetModeSelect()
{
	return (BYTE)GET_MODESELECT_TYPE();
}

void COsdCtrlSetModeSelect()
{
	SET_MODESELECT_TYPE(((BYTE)GET_MODESELECT_TYPE() + 1) % 2);
	CEepromSaveSystemData();
	CModeResetMode();
	COsdCoreInitialze();
}
#if 0
//------------source --------------------------------
UINT8 COsdCtrlGetSource()
{
  return stSystemData.InputSource;
}
 
#endif
#define WIN_ID(x)			(x)
#define WIN_EXT_BG		WIN_ID(0)
#define WIN_EXT_FG		WIN_ID(1)
#define WIN_EXT_MV		WIN_ID(5)

#define _TVSCANBG_WINDOW_HSTART		(0)		//	{0, 0, 12 * 45, 32+18+18 * 8+ 9},
#define _TVSCANBG_WINDOW_HEND		(12 * 45)
#define _TVSCANBG_WINDOW_VSTART		(0)
#define _TVSCANBG_WINDOW_VEND			(32+18+18 * 6+ 8)

#define _TVSCANFG_WINDOW_HSTART		(_TVSCANBG_WINDOW_HSTART+12)
#define _TVSCANFG_WINDOW_HEND			(_TVSCANBG_WINDOW_HEND-12)
#define _TVSCANFG_WINDOW_VSTART		(_TVSCANBG_WINDOW_VSTART+48)
#define _TVSCANFG_WINDOW_VEND			(_TVSCANBG_WINDOW_VEND-36)

// tv scan extend page skin1
WindowStyle code tOsdAutoScan_BackgroundWindow1 =
{
	WIN_EXT_BG,
	//{_WIN_TVSCAN_H_START, 0, 12 * 45, 32+18+18 * 6+ 9},
	{_TVSCANBG_WINDOW_HSTART, _TVSCANBG_WINDOW_VSTART, _TVSCANBG_WINDOW_HEND, _TVSCANBG_WINDOW_VEND},
	{0, 0, 0x00},
	{0x00, 0x10 | _CP_3, 1}
};

WindowStyle code tOsdAutoScan_ForegroundWindow1 = 
{
	WIN_EXT_FG,
	//{_Win_Gap, 32 + 18, 12 * 45-_Win_Gap, 32+18+18 * 4+ 9},
	{_TVSCANFG_WINDOW_HSTART, _TVSCANFG_WINDOW_VSTART, _TVSCANFG_WINDOW_HEND, _TVSCANFG_WINDOW_VEND},
	{0, 0, 0x00},
	{0x00, 0x10 | _CP_3, 1}
};

#if 0
//we not use item move window for tv scan
WindowStyle code tOsdAutoScan_MoveWindow1 =
{	
	WIN_EXT_MV,
	{2*10, 0, _DISP_WID-2*10, 32},
	{0, 0, 0x00},
	{0x00, 0x10 | _CP_3, 1}
};
void COsdMenuAutoScan()
{
#if 0
//to be defined
	COsdFxDisableOsd();
	COsdFxMapSetting(_OSD_MAP1);
	COsdFxDrawWindow(&tOsdAutoScan_BackgroundWindow1);
	COsdFxDrawWindow(&tOsdAutoScan_ForegroundWindow1);
	//usItemStart = tOsdAutoScan_ForegroundWindowArray[GET_OSDSKIN()]->stPosition.usXStart + 20;
	usItemStart = tOsdAutoScan_ForegroundWindow1.stPosition.usXStart + 20;
	COsdFxLoadText(0, 0, usItemStart, _CP_3, _CP_1, GET_LANGUAGE(), tOsdAutoScanStr);
	//COsdFxLoadText(1, 0, usItemStart, _CP_3, _CP_1, GET_LANGUAGE(), tAutoScanMsgDialog.pNoteString);
	//COsdFxLoadText(5, 0, usItemStart, _CP_3, _CP_1, GET_LANGUAGE(), tOsdKeyDirStr_MExit);
	COsdFxEnableOsd();
	CTimerCancelTimerEvent(COsdFxExitEvent);
	//CTvAutoScanStart();
	//COsdCoreSetState(_AUTOSCANCHANNEL_STATE);

	CTvAutoScan();

	//premier, add, review???
	CTimerCancelNosignal_Icon_Powersaving();

#endif
//to be defined
	COsdFxMapSetting(_OSD_MAP9); 

	COsdFxDrawWindow(&tExtAdjWindowStyle);


	//usItemStart = tOsdAutoScan_ForegroundWindowArray[GET_OSDSKIN()]->stPosition.usXStart + 20;
	usItemStart = tOsdAutoScan_ForegroundWindow1.stPosition.usXStart + 20;
	COsdFxLoadText(0, 0, usItemStart, _CP_3, _CP_1, GET_LANGUAGE(), tOsdAutoScanStr);
	//COsdFxLoadText(1, 0, usItemStart, _CP_3, _CP_1, GET_LANGUAGE(), tAutoScanMsgDialog.pNoteString);
	//COsdFxLoadText(5, 0, usItemStart, _CP_3, _CP_1, GET_LANGUAGE(), tOsdKeyDirStr_MExit);
	COsdFxEnableOsd();
	CTimerCancelTimerEvent(COsdFxExitEvent);
	//CTvAutoScanStart();
	//COsdCoreSetState(_AUTOSCANCHANNEL_STATE);

	CTvAutoScan();

	//premier, add, review???
	CTimerCancelNosignal_Icon_Powersaving();

}
#endif
//-----------------sva---------------------------------
#if 0
void COsdSMenuAdjustlANGUAGE0()
{
  UINT8 ucLanguage;

   ucLanguage = 0;
   SET_LANGUAGE(ucLanguage);

   //COsdFxDisableOsd();// test by xyw 071019
   CEepromSaveOsdUserData();
   COsdResetMenu();
}
void COsdSMenuAdjustlANGUAGE1()
{
  UINT8 ucLanguage;

   ucLanguage = 1;
   SET_LANGUAGE(ucLanguage);

#if _ADD_CHINESE
#if(_CHINESE_FONT_TYPE == _CH_FONT_2X1)
	COsdLoadfontLoadChineseBankFont(4);
#else
	COsdDispLoadFont(GET_LANGUAGE());
#endif
#endif
   //COsdFxDisableOsd();// test by xyw 071019
   CEepromSaveOsdUserData();
   COsdResetMenu();
}
#endif
UINT8 COsdCtrlGetLanguage(void)
{
	return (GET_LANGUAGE());
}

void COsdCtrlSetLanguage(UINT8 message)
{
	UINT8 mode = GET_LANGUAGE();
	
	if (message == _LEFT_KEY_MESSAGE)
	{
		if (mode<=_LANGUAGE_FIRST)
			mode = _LANGUAGE_LAST;
		else
			mode -= 1;
	}
	else if (message == _RIGHT_KEY_MESSAGE)
	{
		if (mode >= _LANGUAGE_LAST)
			mode = _LANGUAGE_FIRST;
		else
			mode = mode + 1;
	}
	else
		return;

	SET_LANGUAGE(mode);
	CEepromSaveOsdUserData();
	
#if 0//_ADD_CHINESE
	#if(_CHINESE_FONT_TYPE == _CH_FONT_2X1)
	COsdLoadfontLoadChineseBankFont(4);
	#else
	COsdDispLoadFont(GET_LANGUAGE());
	#endif
#endif
	//COsdResetMenu();
}

void COsdSMenuAdjustColorTemp()
{


      CEepromSaveColorTempModeData();



	//CLR_KEYREPEATENABLE();

	//COsdIconItemSelection(&ucOsdItemIndex0, ucOsdMessage, _COLORTEMP_NUM+1, _COLORTEMP_NUM, _OSD_ITEM_1, COsdDispItemSelect);

	//SET_COLOR_TEMP_TYPE(ucOsdItemIndex0 -1);
	
	//CEepromLoadColorTempData();
    	//CAdjustContrast();	
}


//----------------------------------------------
void COsdMenuAutoColor()
{
	ucOsdisAutoMenu=1;// modified finish auto ,menu error  by xyw  071022 ; 
	COsdFxShowStatus(_SHOW_AUTOCOLOR);
	CAutoDoWhiteBalance();
	COsdFxDisableOsd();
//	COsdCoreAutoColorProc();
	COsdCoreSetState(_USER_DEFINED_STATE);
	CTimerCancelTimerEvent(COsdFxExitEvent);
	CTimerActiveTimerEvent(0.01, COsdFxExitEvent);
}
//#if 0
void COsdMenuAutoAdjust(void) //tommy change
{
	//ucOsdisAutoMenu=1;// modified finish auto ,menu error  by xyw  071022 ; 
	//COsdFxShowStatus(_SHOW_AUTOADJUST);
	CAutoDoAutoConfig();
	CTimerDelayXms(20);
	
	CAutoDoWhiteBalance();
	//COsdFxDisableOsd();
//	COsdCoreAutoProc();
	//COsdCoreSetState(_USER_DEFINED_STATE);
	//CTimerCancelTimerEvent(COsdFxExitEvent);
	//CTimerActiveTimerEvent(0.01, COsdFxExitEvent);
}
//#endif

UINT8 COsdCtrlGetOsdTimeOutSystem()
{
	return GET_OSDTIMEOUT();
}

void COsdCtrlSetOsdTimeOutSystem(UINT8 message)
{
	if(message < 5)
		message = 5;
	else if(message > 60)
			message = 60;
	SET_OSDTIMEOUT(message);
	CEepromSaveOsdUserData();
}

UINT8 COsdCtrlGetOsdBlend(void)
{
	return GET_OSDBLENDING();
}

void COsdCtrlSetOsdBlend(UINT8 message)
{
	SET_OSDBLENDING(message);
	CScalerSetBit(_OVERLAY_CTRL_6C, 0x23, ((message & 0x07) << 2));
	CEepromSaveOsdUserData();
}

UINT8 COsdCtrlGetGamma()
{
	return GET_GAMMA();
}

void COsdCtrlSetGamma()
{
	UINT8 mode;
	mode = GET_GAMMA();
	mode = (mode + 1) % 4;

    CAdjustGammaTable(mode);

	SET_GAMMA(mode);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetSharpness()
{
	return GET_PEAKING_CORING();
}

void COsdCtrlSetSharpness(UINT8 message)
{
	SET_PEAKING_CORING(message);
	CAdjustPeakingCoding();
#if _SHARPNESS_REWRITE
	CEepromSavePeakingCoringData();
#else	//#if _SHARPNESS_REWRITE
	CEepromSaveSystemData();
#endif	//#if _SHARPNESS_REWRITE
}

UINT8 COsdCtrlGetHue()
{
	//return GET_HUE();
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
		//20070324, if ypbpr hue is used, we must apply GET_PICT_EFFECT()
 		return GET_HUE();
	else
	{
		//return GET_HUE();
		//pal hue use default value
		if (GET_VIDEO8_V_RATE_IS_50())
		{
			//return 40;//_HUE;
			return 50;	//set video hue as default
		}
		else
		{
			//20070324
			//return GET_HUE();
			switch (GET_PICT_EFFECT())
			{
				case _PICT_EFFECT_MOVIE:
				case _PICT_EFFECT_PLAY:
				case _PICT_EFFECT_DV:
				case _PICT_EFFECT_SPORT:
					return 50;	//set video hue as default
					break;
				case _PICT_EFFECT_USER:
				default:
					return GET_HUE();
					break;
			}

		}
	}
}

void COsdCtrlSetHue(UINT8 message)
{
       SET_HUE(message);
       if(GET_INPUTSOURCE_TYPE() == _SOURCE_VIDEO8)
          CVideoSetHuee(message);
	else
	   CAdjustYpbprhue(message);

	CTimerDelayXms(10);
	CEepromSaveHueSatData();
}

UINT8 COsdCtrlGetBacklight(void)
{
	return GET_BACKLIGHT();
}

void COsdCtrlSetBacklight(UINT8 message)
{
	SET_BACKLIGHT(message);
	CEepromSaveBacklightData();
	CAdjustBacklight();
}

UINT8 COsdCtrlGetISFilter(void)
{
	return GET_ISFILTER();
}

void COsdCtrlSetISFilter(UINT8 message)
{
	SET_ISFILTER(message);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetSaturation()
{
	switch (GET_PICT_EFFECT())
	{
		case _PICT_EFFECT_MOVIE:
			return _PICT_EFFECT_MOVIE_SAT;
			break;
		case _PICT_EFFECT_PLAY:
			return _PICT_EFFECT_PLAY_SAT;
			break;
		case _PICT_EFFECT_DV:
			return _PICT_EFFECT_DV_SAT;
			break;
		case _PICT_EFFECT_SPORT:
			return _PICT_EFFECT_SPORT_SAT;
			break;
		case _PICT_EFFECT_USER:
		default:
			//if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
			//	return GET_YPbPrSaturation();
			//else
				return GET_SATURATION();
			break;
	}
}

void COsdCtrlSetSaturation(UINT8 message)
{
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
	{
		SET_SATURATION(message);
		CAdjustYpbprSaturation(message);
	}
	else
	{
	
	if(GET_PICT_EFFECT()){
		switch (GET_PICT_EFFECT())
		{//the hue is always 50
			case _PICT_EFFECT_MOVIE:
				SET_PICT_EFFECT(0);
				COsdCtrlSetContrast(_PICT_EFFECT_MOVIE_CON);
				COsdCtrlSetBrightness(_PICT_EFFECT_MOVIE_BRI);
				break;
			case _PICT_EFFECT_PLAY:
				SET_PICT_EFFECT(0);
				COsdCtrlSetContrast(_PICT_EFFECT_PLAY_CON);
				COsdCtrlSetBrightness(_PICT_EFFECT_PLAY_BRI);
				break;
			case _PICT_EFFECT_DV:
				SET_PICT_EFFECT(0);
				COsdCtrlSetContrast(_PICT_EFFECT_DV_CON);
				COsdCtrlSetBrightness(_PICT_EFFECT_DV_BRI);
				break;
			case _PICT_EFFECT_SPORT:
				SET_PICT_EFFECT(0);
				COsdCtrlSetContrast(_PICT_EFFECT_SPORT_CON);
				COsdCtrlSetBrightness(_PICT_EFFECT_SPORT_BRI);
				break;
		}
		CEepromSavePictModeData();
	}	
		SET_SATURATION(message);
		CVideoSetSaturation(COsdCtrlGetSaturation());
	}

	CTimerDelayXms(10);
	CEepromSaveHueSatData();
	
}

UINT8 COsdCtrlGetContrast(void)
{
	switch (GET_PICT_EFFECT())
	{
		case _PICT_EFFECT_MOVIE:
			return _PICT_EFFECT_MOVIE_CON;
			break;
		case _PICT_EFFECT_PLAY:
			return _PICT_EFFECT_PLAY_CON;
			break;
		case _PICT_EFFECT_DV:
			return _PICT_EFFECT_DV_CON;
			break;
		case _PICT_EFFECT_SPORT:
			return _PICT_EFFECT_SPORT_CON;
			break;
		case _PICT_EFFECT_USER:
		default:
			return GET_MODE_CONTRAST();
			break;
	}
}

void COsdCtrlSetContrast(UINT8 message)
{
	SET_MODE_CONTRAST(message);
	CAdjustContrast();
	CEepromSaveBriConData();
/*
	if(GET_PICT_EFFECT()){
		switch (GET_PICT_EFFECT())
		{//the hue is always 50
			case _PICT_EFFECT_MOVIE:
				SET_PICT_EFFECT(0);
				COsdCtrlSetBrightness(_PICT_EFFECT_MOVIE_BRI);
				COsdCtrlSetSaturation(_PICT_EFFECT_MOVIE_SAT);
				break;
			case _PICT_EFFECT_PLAY:
				SET_PICT_EFFECT(0);
				COsdCtrlSetBrightness(_PICT_EFFECT_PLAY_BRI);
				COsdCtrlSetSaturation(_PICT_EFFECT_PLAY_SAT);
				break;
			case _PICT_EFFECT_DV:
				SET_PICT_EFFECT(0);
				COsdCtrlSetBrightness(_PICT_EFFECT_DV_BRI);
				COsdCtrlSetSaturation(_PICT_EFFECT_DV_SAT);
				break;
			case _PICT_EFFECT_SPORT:
				SET_PICT_EFFECT(0);
				COsdCtrlSetBrightness(_PICT_EFFECT_SPORT_BRI);
				COsdCtrlSetSaturation(_PICT_EFFECT_SPORT_SAT);
				break;
		}
		CEepromSavePictModeData();
		
	}	

	SET_MODE_CONTRAST(message);
	CAdjustContrast();

	CEepromSaveBriConData();
*/
}

void COsdCtrlReset(void)
{
	bit factory;
	UINT8 src;
#if _CUSTOMER_HPC
	UINT8 language;
#endif	

#if _CUSTOMER_HPC
	language = GET_LANGUAGE();
#endif	
	factory = GET_FACTORYSTATUS();

	src = stSystemData.InputSource;
//20080825 ccy modify
#if (_PCB_TYPE == _PCB_TEST)
	SET_MUTE_PROCESS(_ENABLE);
#else
    CAudioSetVolume(0);
#endif
	//COsdFxDisableOsd();
	//SET_DISPLAYRATIO(_RATIO_16X9);
	
	if (factory)
	{
		CAdjustBackgroundColor(0x00,0x00,0x00);			//setup black background color
		CScalerSetBit(_VDISP_CTRL_28, ~_BIT5,_BIT5);
		CEepromLoadDefault();
		SET_FACTORYSTATUS();

	       stSystemData.InputSource = src;
		CEepromSaveSystemData();

		//COsdFxChangeInputSrc(stSystemData.InputSource);		//alter 20091026
		ucMenuSelect =COsdFxCalcMenuSelSource();
		COsdCoreInitSubWindow();    //dong add 20080923
		if(ucVideoProcessState==_ACTIVE_STATE||ucSyncProcessState==_ACTIVE_STATE)
			CScalerSetBit(_VDISP_CTRL_28, ~_BIT5,0x00);
		else
		{
			if(GET_INPUTPORT_TYPE(stSystemData.InputSource)==_VIDEO_TV_PORT)
			{
				if(GET_TV_BACKGROUND())
					CAdjustBackgroundColor(0, 0, 0xff);
				else
					CScalerSetBit(_VDISP_CTRL_28, ~_BIT5,0x00);
			}
			else
			{
				if(GET_TV_BACKGROUND())
					CAdjustBackgroundColor(0x00, 0x00, 0xff);	
				else
					CAdjustBackgroundColor(0x00, 0x00, 0x00);
			}		
		}	
	}
	else
	{
		CEepromLoadDefaultSource();

	       stSystemData.InputSource = src;
		CEepromSaveSystemData();

		//redraw video parameters:
		//if (ucVideoProcessState == _ACTIVE_STATE || ucSyncProcessState == _ACTIVE_STATE)
			//SET_MUTE_PROCESS(_DISABLE);//delete by xyw 080219 at jpe

		if (GET_INPUTSOURCE_TYPE() == _SOURCE_VIDEO8)
		{
				//adjust customer color mode
			#if(_AdjustCustomerColorMode == _ENABLE)
			CAdjustCustomerColorMode();
			#endif
			CAdjustContrast();
			CAdjustBrightness();
			CAdjustBacklight();
			//20080421, move
			//CAdjustPeakingCoding();
			CVideoSetSaturation(GET_SATURATION());//eric 20070703 for sat move here
			if (GET_INPUTPORT_TYPE(stSystemData.InputSource)==_VIDEO_TV_PORT)
			{
				CVideoSetVDCContrast(_VDC_CON_DEFAULT_TV);
				CVideoSetVDCBrightness(_VDC_BRI_DEFAULT_TV);	//0x84: dark noise for TV src can't be see
			}
			else
			{
				CVideoSetVDCContrast(_VDC_CON_DEFAULT_AV);
				CVideoSetVDCBrightness(_VDC_BRI_DEFAULT_AV);	//0x84: dark noise for TV src can't be see
			}

			CAccAdjust(_DISABLE);  // set DCC mode
			//20080421, add
			CAdjustPeakingCoding();
			
			//czl 071206
			CVideoSetHuee(0x32);
#if (_DCC_FUNC==_ENABLE)
			//OSD_SRCChg = 1;
			CVideoDCCProcess();
#endif

#if _DEBUG_USE_ICM
			//enable icm	
			if (GET_ICM_on_off())
			{
				CLR_ICM_on_off();
				COsdCtrlSetICMswitch();
			}
#endif	//#if _DEBUG_USE_ICM

			CAdjustEnableHLWindow();

		}
		else if (GET_INPUTSOURCE_TYPE() == _SOURCE_VGA)
		{
			// Setup color processing
			CModeSetupColorProcess();

#if _DEBUG_USE_ICM
			//enable icm	
			if (GET_ICM_on_off())
			{
				CLR_ICM_on_off();
				COsdCtrlSetICMswitch();
			}
#endif	//#if _DEBUG_USE_ICM

#if _BACKLIGHT_SUPPORT
			CAdjustBacklight();
#endif

			CAdjustAdcGainOffset();
			CAdjustAdcClock(stModeUserData.Clock);
			//CAdjustPhase(stModeUserData.Phase);
			CAdjustHPosition();
			CModeModifyVTotal();
			CAdjustVPosition();
			CAdjustPeakingCoding();
			
		}
		else if (GET_INPUTSOURCE_TYPE() == _SOURCE_DVI)
		{
			// Setup color processing
			CModeSetupColorProcess();
			CAdjustBacklight();
			//20080421, move
			//CAdjustPeakingCoding();
			CAdjustYpbprSaturation(GET_SATURATION());
			CAdjustYpbprhue(GET_HUE());
			CScalerSetBit(_COLOR_CTRL_62,~_BIT2,_BIT2);   	//  Enable SRGB
			CAccAdjust(_DISABLE);  // set DCC mode
			//20080421, add
			CAdjustPeakingCoding();

#if _DEBUG_USE_ICM
			//enable icm	
			if (GET_ICM_on_off())
			{
				CLR_ICM_on_off();
				COsdCtrlSetICMswitch();
			}
#endif	//#if _DEBUG_USE_ICM

		}
		else if (GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
		{
			// Load mode user data from eeprom
			CEepromLoadModeDataYPbPr(stModeInfo.ModeCurr);

			CEepromLoadYPbPrData();
			CAdjustAdcGainOffset(); //V304 modify
			CAdjustAdcClock(stModeUserData.Clock);
			CAdjustPhase(stModeUserData.Phase);
			CAdjustHPosition();
			CAdjustVPosition();
			CScalerSetByte(_P1_I_CODE_M_A1,0x00);//eric 20070613 for DVD player 	

			CAdjustYpbprSaturation(GET_SATURATION());
			CAdjustYpbprhue(GET_HUE());

#if _BACKLIGHT_SUPPORT
			CAdjustBacklight();
#endif

			CAdjustBrightness();
			CAdjustContrast();
			CScalerSetByte(_COLOR_CTRL_62, 0x03);

			CScalerSetBit(_COLOR_CTRL_62,~_BIT2,_BIT2);   	//  Enable SRGB
			CAccAdjust(_DISABLE);  // set DCC mode

			CAdjustPeakingCoding();
#if(_AdjustCustomerColorMode == _ENABLE)
			CAdjustCustomerColorMode();
#endif

#if _DEBUG_USE_ICM
			//enable icm	
			if (GET_ICM_on_off())
			{
				CLR_ICM_on_off();
				COsdCtrlSetICMswitch();
			}
#endif	//#if _DEBUG_USE_ICM

			CAdjustEnableHLWindow();
		}

	}
	
#if _CUSTOMER_HPC
	if (language != GET_LANGUAGE())
		COsdRedrawSignalMenu();
#endif

	if (!GET_FACTORYSTATUS())//(ucOsdTypeFlag==_OSD_MAP0)//main osd menu
	{
	#if _TYPEOF_OSD_KONSTA
		if(GET_OSDSIZEDOUBLE())
			COsdFxSetOsdSizeDouble(1);
		else
			COsdFxSetOsdSizeDouble(2);
	#else
		COsdFxSetOsdSizeDouble(GET_OSDSIZEDOUBLE()+1);
	#endif
	}

	COsdMessageInitial();
	CLR_AUDIO_MUTE();

#if _PANEL_DISPLAY_RATIO==_PANEL_16_9
	//--------------------------add by xyw 080229 
	if(GET_DISPLAYRATIO()==_RATIO_4X3)
	{
	    CModeResetMode();
		SET_DISPLAYRATIO(_RATIO_16X9);
		CEepromSaveSystemData();
		
	}
	else
#endif	//#if _PANEL_DISPLAY_RATIO==_PANEL_16_9

	{
		//----------------------add by xyw 080219
		if (ucVideoProcessState == _ACTIVE_STATE || ucSyncProcessState == _ACTIVE_STATE)
		{
			if (GET_AUDIO_MUTE())
				SET_MUTE_PROCESS(_ENABLE);
			else
				SET_MUTE_PROCESS(_DISABLE);
		}	
		CEepromSaveAudioData();
	}

}

UINT8 COsdCtrlGetAudioMute()
{
	return (UINT8)(GET_AUDIO_MUTE());
}

void COsdCtrlSetAudioMute()
{
	if(!GET_AUDIO_MUTE())
		SET_AUDIO_MUTE();
	else
		CLR_AUDIO_MUTE();
	
	if (ucVideoProcessState==_ACTIVE_STATE || ucSyncProcessState==_ACTIVE_STATE || ucCurrState == _BURNIN_STATE)
	{
		if (GET_AUDIO_MUTE())
			SET_MUTE_PROCESS(_ENABLE);
		else
			SET_MUTE_PROCESS(_DISABLE);
	}
	
	CEepromSaveAudioData();
}


UINT8 COsdCtrlGetAudioVolume()
{
	return GET_VOLUME();
}

void COsdCtrlSetAudioVolume(UINT8 message)
{
	SET_VOLUME(message);
	if (ucVideoProcessState==_ACTIVE_STATE || ucSyncProcessState==_ACTIVE_STATE || ucCurrState == _BURNIN_STATE)
	{
		if (ucOsdMessage==_RIGHT_KEY_MESSAGE)
		{
			if(GET_AUDIO_MUTE())
			{
				CLR_AUDIO_MUTE();
				SET_MUTE_PROCESS(_DISABLE);
			}
			//20070330 add, for 0 --> 1
			else if (message == 1)	// only from 0 and right key can arrive here!!!
			{
				SET_MUTE_PROCESS(_DISABLE);
			}
		}
		CAudioSetVolume(message);
	}
	else
	{
		if (ucOsdMessage==_RIGHT_KEY_MESSAGE)
		{
			if(GET_AUDIO_MUTE())
			{
				CLR_AUDIO_MUTE();
			}
		}
	}
	CEepromSaveAudioData();

}

#if _VOLUME_PT2314_SUPPORT
UINT8 COsdCtrlGetAudioBass(void)
{
#if (_AUDIO_EFFECT_SUPPORT)
	switch (GET_AUDIO_EFFECT())
	{
		case _AUDIO_EFFECT_USER:
			return GET_BASS();
			break;
		case _AUDIO_EFFECT_MOVIE:
			//return tEEPROM_AUDIO_DATA_MOVIE.Bass;
			return _AUDIO_EFFECT_MOVIE_BASS;
			break;
		case _AUDIO_EFFECT_MUSIC:
			//return tEEPROM_AUDIO_DATA_MUSIC.Bass;
			return _AUDIO_EFFECT_MUSIC_BASS;
			break;
		case _AUDIO_EFFECT_NEWS:
			//return tEEPROM_AUDIO_DATA_NEWS.Bass;
			return _AUDIO_EFFECT_NEWS_BASS;
			break;
		default:
			return GET_BASS();
			break;
	}
#else
	return GET_BASS();
#endif
}

void COsdCtrlSetAudioBass(UINT8 message)
{
	SET_BASS(message);
	/*
	if(GET_AUDIO_MUTE())
	{
		CLR_AUDIO_MUTE();
		SET_MUTE_PROCESS(_DISABLE);
	}
	*/
	CPt2314WrBass();
	CEepromSaveAudioData();
}

UINT8 COsdCtrlGetAudioTreble(void)
{
#if (_AUDIO_EFFECT_SUPPORT)
	switch (GET_AUDIO_EFFECT())
	{
		case _AUDIO_EFFECT_USER:
			return GET_TREBLE();
			break;
		case _AUDIO_EFFECT_MOVIE:
			return _AUDIO_EFFECT_MOVIE_TREBLE;
			//return tEEPROM_AUDIO_DATA_MOVIE.Treble;
			break;
		case _AUDIO_EFFECT_MUSIC:
			return _AUDIO_EFFECT_MUSIC_TREBLE;
			//return tEEPROM_AUDIO_DATA_MUSIC.Treble;
			break;
		case _AUDIO_EFFECT_NEWS:
			return _AUDIO_EFFECT_NEWS_TREBLE;
			//return tEEPROM_AUDIO_DATA_NEWS.Treble;
			break;
		default:
			return GET_TREBLE();
			break;
	}
#else
	return GET_TREBLE();
#endif
}

void COsdCtrlSetAudioTreble(UINT8 message)
{
	SET_TREBLE(message);
	/*
	if(GET_AUDIO_MUTE())
	{
		CLR_AUDIO_MUTE();
		SET_MUTE_PROCESS(_DISABLE);
	}
	*/
	CPt2314WrTreble();
	CEepromSaveAudioData();
}

UINT8 COsdCtrlGetAudioBalance(void)
{
	return GET_BALANCE();
}

void  COsdCtrlSetAudioBalance(UINT8 message)
{
	SET_BALANCE(message);
	/*
	if(GET_AUDIO_MUTE())
	{
		CLR_AUDIO_MUTE();
		SET_MUTE_PROCESS(_DISABLE);
	}
	*/
	#if _VOLUME_PT2314_SUPPORT
	CPt2314WrBalance();
	#endif
	CEepromSaveAudioData();
}

#endif

UINT8 COsdCtrlGetKey(void)
{
	if(ucOsdMessage == _REPEAT_KEY_MESSAGE){
		if(ucOsdPreMessage == _LEFT_KEY_MESSAGE)
			ucOsdMessage = _LEFT_KEY_MESSAGE;
		else if(ucOsdPreMessage == _RIGHT_KEY_MESSAGE)
			ucOsdMessage = _RIGHT_KEY_MESSAGE;
	}
	return ucOsdMessage;
}
UINT16 COsdFxGetHPositionRange(BYTE ucPar)
{
    if(ucPar == _GET_HPOSITIONRANGE_MAX)
        return (stModeUserCenterData.CenterHPos + _HPOSITION_BIAS);
    else if(ucPar == _GET_HPOSITIONRANGE_MIN)
        return (stModeUserCenterData.CenterHPos - _HPOSITION_BIAS);
}


UINT8 COsdCtrlGetHPosition()
{
		
	if((GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)||
		((GET_INPUTSOURCE_TYPE() == _SOURCE_VGA)&&((ucSyncProcessState==_SEARCH_STATE)||(ucSyncProcessState==_NOSIGNAL_STATE))))//20070606
	{
		return 50;
  	}
	else
	{
		return (50 + stModeUserData.HPosition - stModeUserCenterData.CenterHPos);
	}
}

void COsdCtrlSetHPosition(UINT8 message)
{
	if(GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)
		return;
	message = COsdCtrlGetKey();
	if((message==_LEFT_KEY_MESSAGE) && (stModeUserData.HPosition>COsdFxGetHPositionRange(_GET_HPOSITIONRANGE_MIN)))
	   	stModeUserData.HPosition-=1;
	else if((message==_RIGHT_KEY_MESSAGE) && (stModeUserData.HPosition<COsdFxGetHPositionRange(_GET_HPOSITIONRANGE_MAX)))
	   	stModeUserData.HPosition+=1;
	CAdjustHPosition();
	CEepromSaveModeData(stModeInfo.ModeCurr);
}

UINT16 COsdFxGetVPositionRange(BYTE ucPar)
{
    if(ucPar == _GET_VPOSITIONRANGE_MAX)
        return (stModeUserCenterData.CenterVPos + _VPOSITION_BIAS);
    else if(ucPar == _GET_VPOSITIONRANGE_MIN)
        return (stModeUserCenterData.CenterVPos - _VPOSITION_BIAS);
}

UINT8 COsdCtrlGetVPosition()
{
	if((GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)||
		((GET_INPUTSOURCE_TYPE() == _SOURCE_VGA)&&((ucSyncProcessState==_SEARCH_STATE)||(ucSyncProcessState==_NOSIGNAL_STATE))))//20070606
		return 50;
	else		
		return 100-(stModeUserData.VPosition-COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MIN))*100/(COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MAX)-COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MIN));
	
		

}

void COsdCtrlSetVPosition(UINT8 message)
{
	if(GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)
		return;
	message = COsdCtrlGetKey();
	if((message==_RIGHT_KEY_MESSAGE) && (stModeUserData.VPosition>COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MIN)))
		stModeUserData.VPosition-=1;
	else if ((message==_LEFT_KEY_MESSAGE) && (stModeUserData.VPosition<COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MAX)))
		stModeUserData.VPosition+=1;
	CAdjustVPosition();
	CEepromSaveModeData(stModeInfo.ModeCurr);
}


//----------------Osd Menu position------------------------------------------------------

UINT8 COsdMenuCtrlGetHPosition()
{
    return stOsdUserData.OsdHPos;
}

void COsdMenuCtrlSetHPosition(UINT8 message)
{
#if 1
	stOsdUserData.OsdHPos=message;
//20080901 ccy modify
//20081008 ccy modify
		CScalerSetOsdPosition(WIDTH(_OSD_UMAIN_DH_END), HEIGHT(_OSD_UMAIN_DV_END), stOsdUserData.OsdHPos, ((stOsdUserData.OsdVPos)), 0x01);
	CEepromSaveOsdUserData();
#else
	stOsdUserData.OsdHPos=message;
	CScalerSetOsdPosition(WIDTH(360), HEIGHT(320), stOsdUserData.OsdHPos, stOsdUserData.OsdVPos, 0x01);
	CEepromSaveOsdUserData();
#endif
}

UINT8 COsdMenuCtrlGetVPosition()
{
  return stOsdUserData.OsdVPos;
}

void COsdMenuCtrlSetVPosition(UINT8 message)
{
#if 1
	stOsdUserData.OsdVPos=message;
//20080901 ccy modify
//20081008 ccy modify
		CScalerSetOsdPosition(WIDTH(_OSD_UMAIN_DH_END), HEIGHT(_OSD_UMAIN_DV_END), stOsdUserData.OsdHPos, ((stOsdUserData.OsdVPos)), 0x01);
	CEepromSaveOsdUserData();
#else
	stOsdUserData.OsdVPos=message;
	CScalerSetOsdPosition(WIDTH(360), HEIGHT(320), stOsdUserData.OsdHPos, stOsdUserData.OsdVPos, 0x01);
	CEepromSaveOsdUserData();
#endif
}


//---OSD zoom


void COsdCtrlSetZoom(UINT8 message)
{
	if(GET_OSDSIZEDOUBLE() == _OSD_ZOOM_X1-1)
	{
		message = _OSD_ZOOM_X2;
	}
	else
	{
		message = _OSD_ZOOM_X1;
	}  
	
	SET_OSDSIZEDOUBLE(message-1);
	COsdFxDisableOsd();	//for fix OSD noise error while do zoom process.
	COsdFxSetOsdSizeDouble(GET_OSDSIZEDOUBLE()+1);
	// osd resize, move this function after redraw
	//COsdFxEnableOsd();
	CEepromSaveOsdUserData();
}

UINT8 COsdCtrlGetZoom()
{
	return GET_OSDSIZEDOUBLE();

}



//-------------------------------------------------------------------------------------

UINT16 COsdFxGetAdcClockRange(BYTE ucPar)
{
    WORD delta;

    if(ucPar == _GET_CLOCKRANGE_MAX)
    {
       //CAdjustCheckAdcClockRange(stModeUserCenterData.CenterClock, &delta);
    	delta   = (stModeInfo.IHTotal - stModeInfo.IHWidth * 8 / 10) / 2;
	//DebugPrintf("\n delta= %d ", delta);
		
        if(delta > _CLOCK_BIAS)
            return (stModeUserCenterData.CenterClock + _CLOCK_BIAS);
        else
            return (stModeUserCenterData.CenterClock + delta);
    }
    else if(ucPar == _GET_CLOCKRANGE_MIN)
    {
        //CAdjustCheckAdcClockRange(stModeUserCenterData.CenterClock, &delta);
    	delta   = (stModeInfo.IHTotal - stModeInfo.IHWidth * 8 / 10) / 2;


        if(delta > _CLOCK_BIAS)
            return (stModeUserCenterData.CenterClock - _CLOCK_BIAS);
        else
            return (stModeUserCenterData.CenterClock - delta);
    }
}

UINT8 COsdCtrlGetClock() 
{
#if 0
	UINT16 xdata tmpMin,tmpMax,result;

	tmpMin = COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN);	//1294
	tmpMax = COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MAX);//1394
	result = stModeUserData.Clock-tmpMin;//1353-1294=59
	//result *= 100;
	//result /=(tmpMax - tmpMin);
	result *= 100;
	result /=(tmpMax - tmpMin);
	usAdcClockResult= result;
	//result = ((stModeUserData.Clock-tmpMin)*100)/(tmpMax - tmpMin);
	if (GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)
	  	return 50;
  	else
  		//return ((stModeUserData.Clock-COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN))*100)/(COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MAX) - COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN));
  		return result&0x00ff;
#else
	if((GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)||
		((GET_INPUTSOURCE_TYPE() == _SOURCE_VGA)&&((ucSyncProcessState==_SEARCH_STATE)||(ucSyncProcessState==_NOSIGNAL_STATE))))//20070606
	  	return 50;
  	else
  		return ((stModeUserData.Clock-COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN))*100)/(COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MAX) - COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN));
#endif
}

void COsdCtrlSetClock(UINT8 message)
{
#if 0
	UINT8 msg;
	if (GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)
		return;

	msg = COsdCtrlGetKey();

	if((msg==_LEFT_KEY_MESSAGE) && (stModeUserData.Clock>COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN)))
	{
		stModeUserData.Clock-=1;
	}
	else if((msg==_RIGHT_KEY_MESSAGE) && (stModeUserData.Clock<COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MAX)))
	{
		stModeUserData.Clock+=1;
	}

	CAdjustAdcClock(stModeUserData.Clock);
	CEepromSaveModeData(stModeInfo.ModeCurr);

#else

	if((GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)||
		((GET_INPUTSOURCE_TYPE() == _SOURCE_VGA)&&((ucSyncProcessState==_SEARCH_STATE)||(ucSyncProcessState==_NOSIGNAL_STATE))))//20070606
		return;

	message = COsdCtrlGetKey();
	if((message==_LEFT_KEY_MESSAGE) && (stModeUserData.Clock>COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN)))
	   stModeUserData.Clock-=1;
	else if((message==_RIGHT_KEY_MESSAGE) && (stModeUserData.Clock<COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MAX)))
	   stModeUserData.Clock+=1;
	CAdjustAdcClock(stModeUserData.Clock);
	#if(_MEMORY_LOCATION == _FLASH)
		bClockFlag = _ENABLE;
		CTimerReactiveTimerEvent(SEC(0.5), COsdSaveFlashDataEvent);
	#else
		CEepromSaveModeData(stModeInfo.ModeCurr);
	#endif

#endif
}

UINT8 COsdCtrlGetPhase()
{
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_VGA){

		if((ucSyncProcessState==_SEARCH_STATE)||(ucSyncProcessState==_NOSIGNAL_STATE))

			return 50;			
		
		else 
			return ((WORD)stModeUserData.Phase*100/63);
		
	}else		// source DVI
		return 32;
}

void COsdCtrlSetPhase(UINT8 message)
{
	if(GET_INPUTSOURCE_TYPE() != _SOURCE_VGA)
		return;

	message = COsdCtrlGetKey();
	if((message==_LEFT_KEY_MESSAGE) && stModeUserData.Phase>0)
	  	stModeUserData.Phase-=1;
	else if((message==_RIGHT_KEY_MESSAGE) && stModeUserData.Phase<63)
	  	stModeUserData.Phase+=1;

	CAdjustPhase(stModeUserData.Phase);
	#if(_MEMORY_LOCATION == _FLASH)
		bPhaseFlag = _ENABLE;
		CTimerReactiveTimerEvent(SEC(0.5), COsdSaveFlashDataEvent);
	#else
		CEepromSaveModeData(stModeInfo.ModeCurr);
	#endif
}

UINT8 COsdCtrlGetColorRed(void)
{
	//return stColorTempData.ColorTemp[_RED+3];
	return stColorTempData.ColorTemp[_RED];//modified by xyw 070830
}

void COsdCtrlSetColorRed(UINT8 message)
{
	//stColorTempData.ColorTemp[_RED+3] = message;
	stColorTempData.ColorTemp[_RED] = message;//modified by xyw 070830
	CAdjustContrast();
	CEepromSaveColorTempData();
}

UINT8 COsdCtrlGetColorGreen(void)
{
	//return stColorTempData.ColorTemp[_GREEN+3];
	return stColorTempData.ColorTemp[_GREEN];//modified by xyw 070830
}


void COsdCtrlSetColorGreen(UINT8 message)
{
	//stColorTempData.ColorTemp[_GREEN+3] = message;
	stColorTempData.ColorTemp[_GREEN] = message;//modified by xyw 070830
	CAdjustContrast();
	CEepromSaveColorTempData();
}

UINT8 COsdCtrlGetColorBlue(void)
{
	//return stColorTempData.ColorTemp[_BLUE+3];
	return stColorTempData.ColorTemp[_BLUE];//modified by xyw 070830
}

void COsdCtrlSetColorBlue(UINT8 message)
{
	//stColorTempData.ColorTemp[_BLUE+3] = message;
	stColorTempData.ColorTemp[_BLUE] = message;//modified by xyw 070830
	CAdjustContrast();
	CEepromSaveColorTempData();
}
void CAccAdjust (BYTE mode)
{
	BYTE *DCCContol,*DCCCurve;
	BYTE i,j;

	// Set DCC Normal_Factor
//	((DWORD*)pData)[1] = ((DWORD)stDisplayInfo.DHWidth * stDisplayInfo.DVHeight);
	((DWORD*)pData)[1] = ((DWORD) Panel[ucPanelSelect].DHWidth * Panel[ucPanelSelect].DVHeight);
	((DWORD*)pData)[0] = (NOR_FACTOR_CONSTANT / ((DWORD*)pData)[1]);
	CScalerSetByte(_DCC_ACCESS_PORT_E6, 0x00);
	CScalerSetByte(_DCC_DATA_PORT_E7, pData[1]);
	CScalerSetByte(_DCC_DATA_PORT_E7, pData[2]);
	CScalerSetByte(_DCC_DATA_PORT_E7, pData[3]);

	if(mode == 0)
	{

#if(_DCC_FUNC==_ENABLE)//Modify:2006.4.25D jerry
		CScalerSetByte(_DCC_CTRL0_E4, 0x90);  //set manual mode
		CScalerSetByte(_DCC_CTRL1_E5, 0x80);  //DCC gain control enable	
#else	
		CScalerSetByte(_DCC_CTRL0_E4, 0x00);  //disable dcc, page0
		CScalerSetByte(_DCC_CTRL1_E5, 0x00);  //disable
#endif

		
        return;
	}
	else
	{
	     DCCContol = tDCC_Control[mode - 1];
		 DCCCurve = tDCC_UserCurve[mode - 1];
	}

	CScalerRead(_DCC_CTRL0_E4, 1, &i, _NON_AUTOINC);
	i = i & 0xfc;
	CScalerRead(_DCC_CTRL1_E5, 1, &j, _NON_AUTOINC);
	CScalerSetByte(_DCC_CTRL0_E4, i);
	CScalerSetByte(_DCC_CTRL1_E5, j);


	CScalerSetByte(_DCC_ACCESS_PORT_E6, 0x03);
	for (i=0; i<9; i++) {
		CScalerSetByte(_DCC_DATA_PORT_E7, *DCCContol );
		DCCContol++;
	}

	CScalerRead(_DCC_CTRL0_E4, 1, &i, _NON_AUTOINC);
	i = (i & 0xfc) | 0x01;
	CScalerSetByte(_DCC_CTRL0_E4, i);

	CScalerSetByte(_DCC_ACCESS_PORT_E6, 0x00);
	for (i=0; i<20; i++) {
		CScalerSetByte(_DCC_DATA_PORT_E7, *DCCCurve);
		DCCCurve++;
	}

	CTimerWaitForEvent(_EVENT_DEN_STOP);
	CScalerSetByte(_DCC_CTRL0_E4, 0xac);  //enable dcc
	CScalerSetByte(_DCC_CTRL1_E5, 0x80);

	CScalerSetByte(_HW_ACCESS_PORT_60, 0x00);         // disable Hightlight Window

}

UINT8 COsdCtrlGetDcc(void)
{
	return GET_DCC_MODE();
}

void COsdCtrlSetDcc()
{
	BYTE mode;
	mode = GET_DCC_MODE();
    mode = (mode + 1) % 7;
	CAccAdjust(mode);
	SET_DCC_MODE(mode);
	CEepromSaveSystemData();
}

//leo 20060613 add black level
#if(_BLACK_LEVEL ==  _ENABLE)
void COsdCtrlSetBlackLevel(UINT8 message)
{
	SET_BLACKLEVEL(message);
	message = message*255/100;
	CScalerSetByte(_DCC_CTRL0_E4, 0xBD);  //enable dcc manual mode,page 1
	CScalerSetByte(_DCC_ACCESS_PORT_E6, 0x0f);
	CScalerSetByte(_DCC_DATA_PORT_E7, message);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetBlackLevel()
{
	return GET_BLACKLEVEL();
}

void COsdCtrlSetWhiteLevel(UINT8 message)
{
	SET_WHITELEVEL(message);
	message = message*255/100;
	CScalerSetByte(_DCC_CTRL0_E4, 0xBD);  //enable dcc manual mode,page 1
	CScalerSetByte(_DCC_ACCESS_PORT_E6, 0x10);
	CScalerSetByte(_DCC_DATA_PORT_E7, message);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetWhiteLevel()
{
	return GET_WHITELEVEL();
}
#endif

UINT8 COsdCtrlGetICMswitch(void)
{
	return GET_ICM_on_off();
}

void COsdCtrlSetICMswitch(void)
{
	int i;
	
	if(GET_ICM_on_off()){
#if(_SCALER_TYPE==_RTD2662)
		CScalerPageSelect(_PAGE7);
		CScalerSetByte(_P7_ICM_CTRL_D0, 0x00);
#else
		CScalerSetByte(_ICM_CTRL_E0, 0x00);
#endif
		CLR_ICM_on_off();
	}
	else{
		if(GET_INPUTSOURCE_TYPE()>1){ //RGBYC or RGB
#if(_SCALER_TYPE==_RTD2662)
			CScalerPageSelect(_PAGE7);
			CScalerSetByte(_P7_ICM_CTRL_D0, 0xdf);
#else
			CScalerSetByte(_ICM_CTRL_E0,0xdf);
#endif
			i=4;
		}
		else{
#if(_SCALER_TYPE==_RTD2662)
			CScalerPageSelect(_PAGE7);
			CScalerSetByte(_P7_ICM_CTRL_D0, 0xdc);
#else
			CScalerSetByte(_ICM_CTRL_E0,0xdc);
#endif
			i=2;
		}
		for(i; i>=0; i--)
			CAdjustMZHueSat(i); //initial ICM
		SET_ICM_on_off();
	}

	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetHueICMR(void)
{
	return GET_ICM_HUE_R();
}

void COsdCtrlSetHueICMR(UINT8 message)
{
	SET_ICM_HUE_R(message);
	CAdjustMZHueSat(0);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetHueICMG(void)
{
	return GET_ICM_HUE_G();
}

void COsdCtrlSetHueICMG(UINT8 message)
{
	SET_ICM_HUE_G(message);
	CAdjustMZHueSat(1);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetHueICMB(void)
{
	return GET_ICM_HUE_B();
}

void COsdCtrlSetHueICMB(UINT8 message)
{
	SET_ICM_HUE_B(message);
	CAdjustMZHueSat(2);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetHueICMY(void)
{
	return GET_ICM_HUE_Y();
}

void COsdCtrlSetHueICMY(UINT8 message)
{
	SET_ICM_HUE_Y(message);
	CAdjustMZHueSat(3);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetHueICMC(void)
{
	return GET_ICM_HUE_C();
}

void COsdCtrlSetHueICMC(UINT8 message)
{
	SET_ICM_HUE_C(message);
	CAdjustMZHueSat(4);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetSatICMR(void)
{
	return GET_ICM_SAT_R();
}

void COsdCtrlSetSatICMR(UINT8 message)
{
	SET_ICM_SAT_R(message);
	CAdjustMZHueSat(0);
	CEepromSaveSystemData();
}
UINT8 COsdCtrlGetSatICMG(void)
{
	return GET_ICM_SAT_G();
}

void COsdCtrlSetSatICMG(UINT8 message)
{
	SET_ICM_SAT_G(message);
	CAdjustMZHueSat(1);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetSatICMB(void)
{
	return GET_ICM_SAT_B();
}

void COsdCtrlSetSatICMB(UINT8 message)
{
        SET_ICM_SAT_B(message);
	CAdjustMZHueSat(2);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetSatICMY(void)
{
	return GET_ICM_SAT_Y();
}

void COsdCtrlSetSatICMY(UINT8 message)
{
	SET_ICM_SAT_Y(message);
	CAdjustMZHueSat(3);
	CEepromSaveSystemData();
}

UINT8 COsdCtrlGetSatICMC(void)
{
	return GET_ICM_SAT_C();
}

void COsdCtrlSetSatICMC(UINT8 message)
{
	SET_ICM_SAT_C(message);
	CAdjustMZHueSat(4);
	CEepromSaveSystemData();
}

BYTE code SatPlus[8]  = { 41, 44, 43, 39, 31, 22, 11, 0 }; // by 1/256
BYTE code SatMinus[8] = { 24, 35, 40, 41, 36, 28, 16, 0 }; // by 1/256

int CAdjustColorGammaCal(BYTE color, BYTE n) // n = 1~8
{
	BYTE temp;

	if (color == 0)		//R
		temp = GET_ICM_SAT_R();
	else if (color== 1)	//G
		temp = GET_ICM_SAT_G();
	else if (color == 2)//B
		temp = GET_ICM_SAT_B();
	else if (color == 3)//Y
		temp = GET_ICM_SAT_Y();
	else if (color == 4)//C
		temp = GET_ICM_SAT_C();
    temp *= 2;  //Since the scale for OSD(from 0~16) and cloor(from 0~32) is different, we will have to multiply
			   //temp by 2 to make up the difference
    if (temp >= 16){
		return ((int)(512*n) + (int)((temp-16)*(int)SatPlus[n-1])) / 64 ;
    }
    else{
		return ((int)(512*n) - (int)((16-temp)*(int)SatMinus[n-1])) / 64 ;
    }
}

#define CENTER    0x00
#define RIGHT     0x10
#define LEFT      0x20

void CAdjustMZHueSat(BYTE color)
{
	//Value  0~4095 => angle 0~359
	//R / G / B / Y /C
	//range  256 => 22.5  degree
	//buffer 128 => 11.25 degree
	//R / G / B
	//range  512 => 45    degree
	//buffer 128 => 11.25 degree
	CTimerWaitForEvent(_EVENT_DEN_STOP);
	CAdjustSetHueUVDelta(color, CENTER);
	CAdjustSetHueUVDelta(color, RIGHT);
	CAdjustSetHueUVDelta(color, LEFT);

#if(_SCALER_TYPE==_RTD2662)
	CScalerPageSelect(_PAGE7);
	CScalerSetBit(_P7_ICM_CTRL_D0, ~_BIT7, _BIT7);
#else
  	CScalerSetBit(_ICM_CTRL_E0, ~_BIT7, _BIT7);
#endif

}

void COsdCtrlSetSleepMode(void)
{

	//ucSleepType = (ucSleepType - 1) % _TIMER_SLEEP_MODE_MAX;
//modified by xyw 080312 at jpe
	if(ucOsdMessage == _RIGHT_KEY_MESSAGE ||ucOsdMessage == _SLEEP_KEY_MESSAGE)

	//ucSleepType = (ucSleepType + 1) % _TIMER_SLEEP_MODE_MAX;
	ucSleepType= (ucSleepType>=_TIMER_SLEEP_MODE_MAX-1)?(0):(ucSleepType+1);
	else
	//ucSleepType = (ucSleepType - 1) % _TIMER_SLEEP_MODE_MAX;
	ucSleepType= (ucSleepType==0)?(_TIMER_SLEEP_MODE_MAX-1):(ucSleepType-1);

	if(ucSleepType == 0) {
		CTimerCancelTimerEvent(COsdReckonTimeEvent);
		return;
	} else if(ucSleepType == 1)
		ucSleepTimeMin = _TIMER_SLEEP_T_1;
	else if(ucSleepType == 2)
		ucSleepTimeMin = _TIMER_SLEEP_T_2;
	else if(ucSleepType == 3)
		ucSleepTimeMin = _TIMER_SLEEP_T_3;
	else if(ucSleepType == 4)
		ucSleepTimeMin = _TIMER_SLEEP_T_4;
	else if(ucSleepType == 5)
		ucSleepTimeMin = _TIMER_SLEEP_T_5;
else if(ucSleepType == 6)
	ucSleepTimeMin = _TIMER_SLEEP_T_6;
	//else if(ucSleepType == 6)
		//ucSleepTimeMin = _TIMER_SLEEP_T_6;
	
//czl 071126
#if 0//(!_CUSTOMER_HPC)
	else if(ucSleepType == 5)
		ucSleepTimeMin = _TIMER_SLEEP_T_5;
#endif
	//test line
	//else if(ucSleepType == 6)
	//	ucSleepTimeMin = _TIMER_SLEEP_T_6;

	ucSleepTimeSecCnt = 60;
	
	CTimerCancelTimerEvent(COsdReckonTimeEvent);
	CTimerActiveTimerEvent(SEC(1), COsdReckonTimeEvent);
}

UINT8 COsdCtrlGetSleepMode(void)
{
	return ucSleepType;
}

void COsdCtrlSetChannelStatus(UINT8 message)
{
	message = message;
	if(CTvGetChStatus(stTvInfo.CurChn))
		CTvSetChStatus(stTvInfo.CurChn, _DISABLE);
	else
		CTvSetChStatus(stTvInfo.CurChn,_ENABLE);

	//premier, add
	CEepromSaveTvChStatusOfChn(stTvInfo.CurChn);

	//prevent from doing repeat action of IR key
	//SET_IR_CLEAR_REQ();
	
}

UINT8 COsdCtrlGetChannelStatus(void)
{
	//premier, update
	if(CTvGetChStatus(stTvInfo.CurChn))
		//return 0;
		return 1;
	else
		//return 1;
		return 0;
}

void COsdCtrlSetOsdClock(UINT8 message)
{
	if((message == _REPEAT_KEY_MESSAGE)&&(ucRepeatKeyCount<5))//20070621 for IR too celerity.
		return;
	ucSec = 0;
	if((message == _LEFT_KEY_MESSAGE) || ((message == _REPEAT_KEY_MESSAGE) && (ucOsdPreMessage == _LEFT_KEY_MESSAGE)))
		ucHour = (ucHour + 1) % 24;
	else
		ucMin = (ucMin + 1) % 60;
	ucSec = 0;
}

UINT8 COsdCtrlGetOsdClock(void)
{
	return 0;
}

UINT8 COsdCtrlGetTvAudioType(void)
{
	return GET_CURR_AUDIO_SYS();
}

void COsdCtrlSetTvAudioType(UINT8 message)
{
	UINT8 audio;

	audio = GET_CURR_AUDIO_SYS();

	//prevent from doing repeat action of IR key
	if (message==_LEFT_KEY_MESSAGE)
	{

	//20080827 ccy modify
	#if (_PCB_TYPE == _PCB_TEST)
	audio = (audio == _TV_AUDIO_SYS_DK) ? (_TV_AUDIO_SYS_N) : (audio-1);//modified by xyw 080115 at jpe
	#else
	audio = (audio == _TV_AUDIO_SYS_DK) ? (_TV_AUDIO_SYS_AUTO) : (audio-1);//modified by xyw 080115 at jpe
	#endif
		SET_CURR_AUDIO_SYS(audio);
	}
	else if (message==_RIGHT_KEY_MESSAGE)
	{
	//20080827 ccy modify
	#if (_PCB_TYPE == _PCB_TEST)
	audio = (audio == _TV_AUDIO_SYS_N) ? (_TV_AUDIO_SYS_DK) : (audio+1);//modified by xyw 080115 at jpe
	#else
	audio = ((audio + 1) % _TV_AUDIO_SYS_MAX);
	#endif
		SET_CURR_AUDIO_SYS(audio);
	}
	else 
		return;

	CEepromSaveTvPdbData(stTvInfo.CurChn, &stTvPdb.chinfo);
	
#if (_TUNER_TYPE==_JS6H1_111 ||_TUNER_TYPE==_GDC8F1D_QF106L ||_TUNER_TYPE==_GDC8F2E_106L ||_TUNER_TYPE==_ET5C511_TDA9886ST ||_TUNER_TYPE==_ET6T1E_TDA9886ST||_TUNER_TYPE == _GDC8F2D_106L)
#if 0
	if (GET_CURR_AUDIO_SYS()==_TV_AUDIO_SYS_AUTO)
	{
		if (ucVideoProcessState == _ACTIVE_STATE)
		{
			audio = CTunerSoundAutoDetect();
			//--------20080317 at jpe  ------------------------------------------
			//CModeResetMode();
			//----------------------------------------------------------------
		}
		else
			audio = _TV_AUDIO_SYS_DEFAULT;
	}
	else
	{
		audio = GET_CURR_AUDIO_SYS();

//--------20080317 at jpe  ------------------------------------------		
		if(GET_CURR_AUDIO_SYS()>=_TV_AUDIO_SYS_DK && GET_CURR_AUDIO_SYS()<=_TV_AUDIO_SYS_BG)
			{//CScalerCodeW(RTD2610_PAL_I_ini);
		        CScalerPageSelect(_PAGE8);
				//CScalerSetBit(_P8_YCSEP_CTRL_E0,(~_BIT7),0x00);
				CScalerSetByte(_P8_YCSEP_CTRL_E0,(0x02));
				CScalerSetByte(_P8_YC_BW_CTRL_EA,(0x49));
				CScalerSetByte(_P8_VIDEO_CTRL0_A0,(0x02));
				CScalerSetByte(_P8_CMAG_STATUS_CA,(0xA3));
				CScalerPageSelect(_PAGEA);
				CScalerSetByte(_PA_SECAM_CTRL_C4,0x82);
				//------------------080320
                CScalerPageSelect(_PAGE8);
				CScalerSetBit(_P8_MANUAL_MODE_D2,(~_BIT7),0x00);
			    CScalerSetByte(_P8_MANUAL_MODE_D2,(0x06));
				//-----------------------------------------
			}
		   else if(GET_CURR_AUDIO_SYS()>=_TV_AUDIO_SYS_SECAM_DK && GET_CURR_AUDIO_SYS()<=_TV_AUDIO_SYS_SECAM_BG)
		   	{
		   	//CScalerCodeW(RTD2610_SECAM_ini);
			CScalerPageSelect(_PAGE8);
			//CScalerSetBit(_P8_YCSEP_CTRL_E0,(~_BIT7),0x00);
			CScalerSetByte(_P8_YCSEP_CTRL_E0,(0x00));
			CScalerSetByte(_P8_YC_BW_CTRL_EA,(0x07));
			CScalerSetByte(_P8_VIDEO_CTRL0_A0,(0x08));
			CScalerSetByte(_P8_CMAG_STATUS_CA,(0x00));
			CScalerPageSelect(_PAGEA);
			CScalerSetByte(_PA_SECAM_CTRL_C4,0xc2);
			//------------------080320
            CScalerPageSelect(_PAGE8);
			CScalerSetBit(_P8_MANUAL_MODE_D2,(~_BIT7),0x00);
		    CScalerSetByte(_P8_MANUAL_MODE_D2,(0x07));
			//--------------------------------------
		   	}

		    //CScalerPageSelect(_PAGE8);
            //CScalerSetBit(_P8_MANUAL_MODE_D2,(~_BIT7),0x00);
		    //CScalerSetByte(_P8_MANUAL_MODE_D2,(0x06));
			//CScalerSetByte(_P8_MANUAL_MODE_D2,(0x80));

			

			//--------20080317 at jpe  ------------------------------------------
			//CModeResetMode();//
			//----------------------------------------------------------------
//-------------------------------------------------------------------------------------		   
	}
	#endif
	SET_MUTE_PROCESS(1);
	CTunerSetSound(audio);
	SET_MUTE_PROCESS(0);
	#if 1
//	CSetVideoParameterTVSetVideo(GET_TV_VIDEO_SYS());

	CTunerSetColor(GET_TV_VIDEO_SYS());
	//	if (ucVideoProcessState == _ACTIVE_STATE)
	//CModeResetMode();
	#endif
  CEepromSaveTvPdbData(stTvInfo.CurChn, &stTvPdb.chinfo);
  //CTvTunerChangeChannelApplyNewData();

  	//CModeResetMode();
#if 0
//--------20080317 at jpe  ------------------------------------------
if(message == _RIGHT_KEY_MESSAGE)
{
	if ((GET_CURR_AUDIO_SYS() == _TV_AUDIO_SYS_DK)||\
		(GET_CURR_AUDIO_SYS() == _TV_AUDIO_SYS_SECAM_L)||\
		(GET_CURR_AUDIO_SYS() == _TV_AUDIO_SYS_M))	
    CModeResetMode();
}
else if (message == _LEFT_KEY_MESSAGE)
{
	if((GET_CURR_AUDIO_SYS() == _TV_AUDIO_SYS_BG)||\
		(GET_CURR_AUDIO_SYS() == _TV_AUDIO_SYS_SECAM_LL)||\
		(GET_CURR_AUDIO_SYS()  == _TV_AUDIO_SYS_N))
	CModeResetMode();
}
  #endif        
//---------------------------------------------------------------------	
#endif	//#if (_TUNER_TYPE==_JS6H1_111 ||_TUNER_TYPE==_GDC8F1D_QF106L ||_TUNER_TYPE==_GDC8F2E_106L ||_TUNER_TYPE==_TSN3311_S25)

}

UINT8 COsdCtrlGetVideoSys(void)
{

	return GET_TV_VIDEO_SYS();

}

void COsdCtrlSetVideoSys(UINT8 message)
{
	UINT8 color;

color = GET_TV_VIDEO_SYS();


	//prevent from doing repeat action of IR key
	if (message==_LEFT_KEY_MESSAGE)
	{
		color = (color <= _TV_VIDEO_SYS_MIN) ? (_TV_VIDEO_SYS_MAX-1) : (color-1);//modified by xyw 080115 at jpe
		SET_TV_VIDEO_SYS(color);
	
	}
	else if (message==_RIGHT_KEY_MESSAGE)
	{
	
		color = ((color + 1) % _TV_VIDEO_SYS_MAX);
		SET_TV_VIDEO_SYS(color);
	
	}
	//else 
	//	return;
//20080827 ccy add
	color = GET_TV_VIDEO_SYS();
	//CTimerDelayXms(10);
		CTunerSetSound(GET_CURR_AUDIO_SYS());

	CSetVideoParameterTVSetVideo(GET_TV_VIDEO_SYS());
	CTunerSetColor(color);
	//CScalerSetBit(_VDISP_CTRL_28, (~_BIT5), _BIT5);
	//CVideoSoftReset();
	
//	CTimerDelayXms(10);
//20080927 ccy modify
	CEepromSaveTvPdbData(stTvInfo.CurChn, &stTvPdb.chinfo);
	#if 0
		if (ucVideoProcessState == _ACTIVE_STATE)   //add  by dengyi  on 20100107
	  	CModeResetMode();
		#endif

}

void COsdCtrlSetTvFinetuneScanPdb(UINT8 message)
{
#if 0
	//20070407, save finetune data
	bit bAfcStatusLast;

	bAfcStatusLast = GET_TV_AFC_ENABLE();

	ucTvFinetuneData=(message>100) ? 50 : message;

	//if (stTvPdb.pdb + ucTvFinetuneData-50 > _UHF_END)			stTvPdb.pdb=_UHF_END;
	//if (stTvPdb.pdb + ucTvFinetuneData-50 < _VH_LOW_STAR)	stTvPdb.pdb=_VH_LOW_STAR;

	//CTunerSetFreq(stTvPdb.pdb);
	//20070407, finetune don't use afc data
	//CTunerSetFreq(stTvPdb.pdb , stTvPdb.Afc);
	CTunerSetFreq(stTvPdb.pdb + ucTvFinetuneData-50 , 0);
	if (bAfcStatusLast){
		SET_TV_AFC_ENABLE(0);
		CEepromSaveTvPdbData(stTvInfo.CurChn, &stTvPdb.chinfo);
	}
	//20070407, save finetune data
	CEepromSaveTvFinetuneData(stTvInfo.CurChn, &ucTvFinetuneData);
#endif
	//20070407, save finetune data
	bit bAfcStatusLast;
	UINT8 msg;

	msg = ucOsdMessage;//COsdCtrlGetKey();

	bAfcStatusLast = GET_TV_AFC_ENABLE();

	
	if (message == _LEFT_KEY_MESSAGE || (message==_REPEAT_KEY_MESSAGE && ucOsdPreMessage==_LEFT_KEY_MESSAGE))
	{
		if (stTvPdb.pdb>_VH_LOW_STAR)
			stTvPdb.pdb--;
	}
	else if (message == _RIGHT_KEY_MESSAGE || (message==_REPEAT_KEY_MESSAGE && ucOsdPreMessage==_RIGHT_KEY_MESSAGE))
	{
		if (stTvPdb.pdb<_UHF_END)
			stTvPdb.pdb++;
	}
	else
		return;

	CTunerSetFreq(stTvPdb.pdb + ucTvFinetuneData-50, 0);
	
	if (bAfcStatusLast)
	{
		//disable AFC, then save it
		SET_TV_AFC_ENABLE(0);
		CEepromSaveTvPdbData(stTvInfo.CurChn, &stTvPdb.chinfo);
	}
	//20070407, save finetune data
	CEepromSaveTvFinetuneData(stTvInfo.CurChn, &ucTvFinetuneData);
}

UINT8 COsdCtrlGetTvFinetuneScanPdb(void)
{
	return stTvPdb.pdb&0x00ff;
}
#if 0//(_TV_SWAP_SUPPORT)

UINT8* COsdCoreGetTvSwapSrcChannelStr(void)
{
#if _TV_SWAP_BY_NUMBER
	return COsdCoreGetNumberStr3(GET_TV_SWAP_SRC_CHANNEL(), GET_TV_SWAP_SRC_LEN());
#else
	return COsdCoreGetNumberStr(GET_TV_SWAP_SRC_CHANNEL(), 0);
#endif	
}

UINT8* COsdCoreGetTvSwapDestChannelStr(void)
{
#if _TV_SWAP_BY_NUMBER
	return COsdCoreGetNumberStr3(GET_TV_SWAP_DEST_CHANNEL(), GET_TV_SWAP_DEST_LEN());
#else
	return COsdCoreGetNumberStr(GET_TV_SWAP_DEST_CHANNEL(), 0);
#endif	
}

UINT8* COsdCoreGetTvSwapExecuteStr(void)
{
	if (!bTvSwapExecuteDone)
		return tOsdSelectSet[0];	//no
	else
		return tOsdSelectSet[1];
}

#if 1//(_TV_SWAP_SUPPORT)

#if _TV_SWAP_BY_NUMBER

//target: 	0--source channel
//			1--dest channel
void COsdTvSwapAddNum(UINT8 target, UINT8 num)
{
	StructTVHyperLinkKeyDataType * ptr;

	ptr = (target) ? (&stTvSwapDestKeyData) : (&stTvSwapSrcKeyData);
	
	ptr->nNumbers= (ptr->nNumbers+1)%4;

	if (ptr->nNumbers==0)
	{
		ptr->Numbers[0] = 0;
		ptr->Numbers[1] = 0;
		ptr->Numbers[2] = 0;
	}
	else
	{
		ptr->Numbers[0] = ptr->Numbers[1];
		ptr->Numbers[1] = ptr->Numbers[2];
		ptr->Numbers[2] = num;
	}
}
#else
//target: 	0--source channel
//			1--dest channel
void COsdTvSwapAddNum(UINT8 target, UINT8 message)
{
	UINT8 * ptr;

	ptr = (target) ? (&ucTvSwapDestKeyData) : (&ucTvSwapSrcKeyData);
	
	//check input data is in the range:
	if (message == _LEFT_KEY_MESSAGE)
	{
		if (*ptr <= _FIRST_CHANNEL)
			*ptr = GET_TV_MAX_CH()-1;
		else
			*ptr -= 1;
	}
	else if (message == _RIGHT_KEY_MESSAGE)
	{
		if (*ptr >=GET_TV_MAX_CH()-1)
			*ptr = _FIRST_CHANNEL;
		else
			*ptr += 1;
	}
	else
		return;		

}
#endif
/*
//target: 	0--source channel
//			1--dest channel
//increase:	0--dec
//			1--inc
void COsdTvSwapIncNum(UINT8 target, bit increase)
{
	StructTVHyperLinkKeyDataType * ptr;
	UINT8 ch;

	ptr = (target) ? (&stTvSwapDestKeyData) : (&stTvSwapSrcKeyData);
	
	ch =(target==0) ? GET_TV_SWAP_SRC_CHANNEL() : GET_TV_SWAP_DEST_CHANNEL();
	if (increase)
	{
		ch=(ch>=GET_TV_MAX_CH()) ? (_FIRST_CHANNEL) : (ch+1);
	}
	else
	{
		ch=(ch<=_FIRST_CHANNEL) ? (GET_TV_MAX_CH()) : (ch-1);
	}
	
	ptr->Numbers[0] = ch%100;
	ptr->Numbers[1] = (ch/100)%10;
	ptr->Numbers[2] = ch/10;
}
*/

void COsdCtrlSetTvSwapSrcChannel(UINT8 message)
{
#if _TV_SWAP_BY_NUMBER
	if (message>=_0_KEY_MESSAGE && message <= _9_KEY_MESSAGE)
	{
		COsdTvSwapAddNum(0, message-_0_KEY_MESSAGE);
		if (bTvSwapExecuteDone)
		{
			bTvSwapExecuteDone = _FALSE;
			bTvSwapExecuteDoneUpdateRelativeItem = _TRUE;
		}
	}
	/*
	else if (message==_UP_KEY_MESSAGE || message == _DOWN_KEY_MESSAGE)
	{
		COsdTvSwapIncNum(0, (message==_UP_KEY_MESSAGE)?(1):(0));
		if (bTvSwapExecuteDone)
		{
			bTvSwapExecuteDone = _FALSE;
			bTvSwapExecuteDoneUpdateRelativeItem = _TRUE;
		}
	}
	*/
	else if (message == _RIGHT_KEY_MESSAGE)
	{
		CTvSetChannel(GET_TV_SWAP_SRC_CHANNEL());
		CEepromSaveTvData();
	}
#else
	if (message == _RIGHT_KEY_MESSAGE || message == _LEFT_KEY_MESSAGE)
	{
		COsdTvSwapAddNum(0, message);
		if (bTvSwapExecuteDone)
		{
			bTvSwapExecuteDone = _FALSE;
			bTvSwapExecuteDoneUpdateRelativeItem = _TRUE;
		}
	}
#endif
}

UINT8 COsdCtrlGetTvSwapSrcChannel(void)
{
#if _TV_SWAP_BY_NUMBER
	return 1;
#else
	return GET_TV_SWAP_SRC_CHANNEL();
#endif
}

void COsdCtrlSetTvSwapDestChannel(UINT8 message)
{
#if _TV_SWAP_BY_NUMBER
	if (message>=_0_KEY_MESSAGE && message <= _9_KEY_MESSAGE)
	{
		COsdTvSwapAddNum(1, message-_0_KEY_MESSAGE);
		if (bTvSwapExecuteDone)
		{
			bTvSwapExecuteDone = _FALSE;
			bTvSwapExecuteDoneUpdateRelativeItem = _TRUE;
		}
	}
	/*
	else if (message==_UP_KEY_MESSAGE || message == _DOWN_KEY_MESSAGE)
	{
		COsdTvSwapIncNum(1, (message==_UP_KEY_MESSAGE)?(1):(0));
	}
	*/
#else
	if (message == _RIGHT_KEY_MESSAGE || message == _LEFT_KEY_MESSAGE)
	{
		COsdTvSwapAddNum(1, message);
		if (bTvSwapExecuteDone)
		{
			bTvSwapExecuteDone = _FALSE;
			bTvSwapExecuteDoneUpdateRelativeItem = _TRUE;
		}
	}
#endif
}

UINT8 COsdCtrlGetTvSwapDestChannel(void)
{
#if _TV_SWAP_BY_NUMBER
	return 1;
#else
	return GET_TV_SWAP_DEST_CHANNEL();
#endif
}

void COsdCtrlSetTvSwapExecute(UINT8 message)
{
	StructTvPdb stTvPdbTemp;
	UINT8 src, dest;
	BIT bSrcSkip, bDestSkip;
	UINT8 srcFinetuneData,destFinetuneData;

	src = GET_TV_SWAP_SRC_CHANNEL();
	dest = GET_TV_SWAP_DEST_CHANNEL();

	if (src>=GET_TV_MAX_CH())
	{
		CLR_TV_SWAP_SRC_DATA();
		CLR_TV_SWAP_SRC_LEN();
		return;
	}
	if (dest>=GET_TV_MAX_CH())
	{
		CLR_TV_SWAP_DEST_DATA();
		CLR_TV_SWAP_DEST_LEN();
		return;
	}
	if (dest == src)
	{
		return;
	}
	
	if (message==_RIGHT_KEY_MESSAGE)
	{
		//skip status
		bSrcSkip = CTvGetChStatus(src);
		bDestSkip = CTvGetChStatus(dest);
		//save src pdb:
		CEepromGetTvPdbData(src, &stTvPdb.chinfo);
		stTvPdbTemp = stTvPdb;
		//load dest pdb
		CEepromGetTvPdbData(dest, &stTvPdb.chinfo);
		//save dest pdb to src position:
		CEepromSaveTvPdbData(src, &stTvPdb.chinfo);
		//save src pdb to dest position:
		CEepromSaveTvPdbData(dest, &stTvPdbTemp.chinfo);

		//20070407, get finetune data
		//change src and dest finetune data
		//get
		CEepromGetTvFinetuneData(src, &srcFinetuneData);
		CEepromGetTvFinetuneData(dest, &destFinetuneData);
		//set
		CEepromSaveTvFinetuneData(src, &destFinetuneData);
		CEepromSaveTvFinetuneData(dest, &srcFinetuneData);

		//20070423, tv swap change current channel number
		//change current channel as dest channel:
		//stTvInfo.PreChn=stTvInfo.CurChn;
		//stTvInfo.CurChn = dest;
		
		//20070506, tv swap change current channel number
		/*if (src == stTvInfo.CurChn)
		{
			//change current channel as dest channel:
			stTvInfo.PreChn=stTvInfo.CurChn;
			stTvInfo.CurChn = dest;
			CEepromSaveTvData();
		}*/
		//20070506, tv swap change current channel number
		stTvInfo.PreChn=src;
		stTvInfo.CurChn = dest;
		CEepromSaveTvData();
		
		//change src and dest skip status:
		CTvSetChStatus(src, bDestSkip);
		CTvSetChStatus(dest, bSrcSkip);
		bTvSwapExecuteDone = _TRUE;
		//bTvSwapExecuteDoneUpdatePdb = _TRUE;
		bTvSwapExecuteDoneUpdateRelativeItem = _FALSE;

		//20070324, add
		CEepromGetTvPdbData(stTvInfo.CurChn, &stTvPdb.chinfo);
		
		SET_TV_FINETUNE_PRE_DONE();

		//20070407, get finetune data
		CEepromGetTvFinetuneData(stTvInfo.CurChn, &ucTvFinetuneData);

		CLR_TV_SWAP_SRC_DATA();
		CLR_TV_SWAP_SRC_LEN();
		CLR_TV_SWAP_DEST_DATA();
		CLR_TV_SWAP_DEST_LEN();

		//20070506, apply new channel data
		CTvTunerChangeChannel();
	}
}

UINT8 COsdCtrlGetTvSwapExecute(void)
{
	return 1;
}

#endif

#endif

UINT8 COsdCtrlGetChannel(void)
{
	return stTvInfo.CurChn;
}
void COsdCtrlSetChannel(UINT8 message)
{
	UINT8 mode;

	mode = stTvInfo.CurChn;
	
	if (message == _LEFT_KEY_MESSAGE)
	{
		if (mode<=_FIRST_CHANNEL)
			mode = GET_TV_MAX_CH()-1;
		else
			mode -= 1;
	}
	else if (message == _RIGHT_KEY_MESSAGE)
	{
		if (mode >= GET_TV_MAX_CH()-1)
			mode = _FIRST_CHANNEL;
		else
			mode = mode + 1;
	}
	else
		return;
	
	stTvInfo.PreChn = stTvInfo.CurChn;
	stTvInfo.CurChn = mode;

	CEepromSaveTvData();
	CLR_KEYREPEATENABLE();

	CTvTunerChangeChannel();
}

/*
UINT8 COsdCtrlGetChannelScanGet(void)
{
	return tvScanCurChn;
}
void COsdCtrlSetChannelScanGet(UINT8 message)
{
	UINT8 mode;

	mode = tvScanCurChn;
	
	if (message == _LEFT_KEY_MESSAGE)
	{
		if (mode<=1)
			mode = GET_TV_MAX_CH()-1;
		else
			mode -= 1;
	}
	else if (message == _RIGHT_KEY_MESSAGE)
	{
		mode = (mode + 1) % (GET_TV_MAX_CH());
	}
	else
		return;

	tvScanCurChn = mode;
	
}
*/

UINT8 COsdCtrlGetSearchPercent(void)
{
//czl 070928
	UINT16 usPercent, len;
if(GET_CURR_AUDIO_SYS()==_TV_AUDIO_SYS_SECAM_LL)
{
	len = (UINT16)(_UHF_END1-_VH_LOW_STAR1)/100;

	usPercent=(UINT16)(stTvPdb.pdb-_VH_LOW_STAR1);

	
	if(stTvPdb.pdb>_UHF_END1)
		usPercent=100;
	if(stTvPdb.pdb<_VH_LOW_STAR1)
		usPercent=0;
	usPercent=usPercent/len;
}
else
{
	len = (UINT16)(_UHF_END-_VH_LOW_STAR)/100;

	usPercent=(UINT16)(stTvPdb.pdb-_VH_LOW_STAR);

	
	if(stTvPdb.pdb>_UHF_END)
		usPercent=100;
	if(stTvPdb.pdb<_VH_LOW_STAR)
		usPercent=0;
	usPercent=usPercent/len;
}	
/*

	len = (UINT16)(_UHF_END-_VH_LOW_STAR)/100;

	usPercent=(UINT16)(stTvPdb.pdb-_VH_LOW_STAR);
	
	if(stTvPdb.pdb>_UHF_END)
		usPercent=100;
	if(stTvPdb.pdb<_VH_LOW_STAR)
		usPercent=0;
	usPercent=usPercent/len;
*/	
	//usPercent = len/100;
	// '/' will reserve the data of INT, so "stTvPdb.pdb / usPercent" may large than 100, so do:
	//if (usPercent*100<len)	
	//	usPercent = len / 99;


	return (usPercent);
	
}

void COsdCtrlSetSearchPercent(UINT8 message)
{
	message = message;
}

/*
UINT8 COsdCtrlGetNullFunction(void)
{
	return 0;
}
void COsdCtrlSetNullFunction(UINT8 message)
{
	message = message;
}
*/
UINT8 COsdCtrlGetBurnStatus(void)
{
	return (UINT8)(GET_BURNSTATUS());
}

void COsdCtrlSetBurnStatus(void)
{
	if (GET_BURNSTATUS())
		CLR_BURNSTATUS();
	else
		SET_BURNSTATUS();
	
	CEepromSaveSystemData();
}


#if _PICT_EFFECT_SUPPORT
/**********************************************/
//premier, video brightness
UINT8 COsdCtrlGetBrightness()
{
	switch (GET_PICT_EFFECT())
	{
		case _PICT_EFFECT_MOVIE:
			return _PICT_EFFECT_MOVIE_BRI;
			break;
		case _PICT_EFFECT_PLAY:
			return _PICT_EFFECT_PLAY_BRI;
			break;
		case _PICT_EFFECT_DV:
			return _PICT_EFFECT_DV_BRI;
			break;
		case _PICT_EFFECT_SPORT:
			return _PICT_EFFECT_SPORT_BRI;
			break;
		case _PICT_EFFECT_USER:
		default:
			return GET_MODE_BRIGHTNESS();
			break;
	}
}
#if 0
void COsdCtrlSetContrast(UINT8 message)
{
	SET_MODE_CONTRAST(message);
	CAdjustContrast();
	CEepromSaveBriConData();
}
#endif
void COsdCtrlSetBrightness(UINT8 message)
{
	SET_MODE_BRIGHTNESS(message);
	CAdjustBrightness();
	CEepromSaveBriConData();
/*
	if(GET_PICT_EFFECT()){
		switch (GET_PICT_EFFECT())
		{//the hue is always 50
			case _PICT_EFFECT_MOVIE:
				SET_PICT_EFFECT(0);
				COsdCtrlSetContrast(_PICT_EFFECT_MOVIE_CON);
				COsdCtrlSetSaturation(_PICT_EFFECT_MOVIE_SAT);
				break;
			case _PICT_EFFECT_PLAY:
				SET_PICT_EFFECT(0);
				COsdCtrlSetContrast(_PICT_EFFECT_PLAY_CON);
				COsdCtrlSetSaturation(_PICT_EFFECT_PLAY_SAT);
				break;
			case _PICT_EFFECT_DV:
				SET_PICT_EFFECT(0);
				COsdCtrlSetContrast(_PICT_EFFECT_DV_CON);
				COsdCtrlSetSaturation(_PICT_EFFECT_DV_SAT);
				break;
			case _PICT_EFFECT_SPORT:
				SET_PICT_EFFECT(0);
				COsdCtrlSetContrast(_PICT_EFFECT_SPORT_CON);
				COsdCtrlSetSaturation(_PICT_EFFECT_SPORT_SAT);
				break;
		}
		CEepromSavePictModeData();
	}	
	SET_MODE_BRIGHTNESS(message);
	CAdjustBrightness();
	CEepromSaveBriConData();
*/
}
//20080823 ccy add
#if (_PCB_TYPE == _PCB_TEST)
UINT8 COsdCtrlGetFMEffect(void)
{
	return bFMSwitch;
}
void COsdCtrlSetFMEffect(void)
{
	UINT8 mode,message;
	mode = bFMSwitch;
		message = COsdCtrlGetKey();
	if (message==_RIGHT_KEY_MESSAGE)
	{
		mode = (mode+1)%_FM_EFFECT_SUM;
	}
	else if (message==_LEFT_KEY_MESSAGE)
	{
		mode = (mode<=_FM_EFFECT_MIN)?(_FM_EFFECT_MAX):(mode-1);
	}
	else
		return;
	bFMSwitch = mode;

	
	switch(mode)
		{
		case _FM_EFFECT_OFF:
			CLR_FM_POWER();
			break;
		case _FM_EFFECT_883:
			SET_FM_POWER();
			bFM_SET_A =0;
			bFM_SET_B =0;
			break;
		case _FM_EFFECT_886:
			SET_FM_POWER();
			bFM_SET_A =0;
			bFM_SET_B =1;
			break;
		case _FM_EFFECT_891:
			SET_FM_POWER();
			bFM_SET_A =1;
			bFM_SET_B =0;
			break;
		case _FM_EFFECT_894:
			SET_FM_POWER();
			bFM_SET_A =1;
			bFM_SET_B =1;
			break;
		default:
			CLR_FM_POWER();
			break;
			
		}

}

#endif
UINT8 COsdCtrlGetPictEffect(void)
{
	return GET_PICT_EFFECT();
}

void COsdCtrlSetPictEffect()
{
	UINT8 mode,message;

	mode = GET_PICT_EFFECT();

	message = COsdCtrlGetKey();
	if(1)// (message==_RIGHT_KEY_MESSAGE)
	{
		mode = (mode+1)%_PICT_EFFECT_SUM;
	}
	else if (message==_LEFT_KEY_MESSAGE)
	{
		mode = (mode<=_PICT_EFFECT_MIN)?(_PICT_EFFECT_MAX):(mode-1);
	}
	else
		return;



	SET_PICT_EFFECT(mode);
#if 1// (_PICT_EFFECT_INDEPEND_SUPPORT)

	CEepromSavePictModeData();

#else

	CEepromSaveSystemData();

#endif

	//brightness
	CAdjustBrightness();
	//contrast
	CAdjustContrast();
	//czl 071129
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
	{
		SET_SATURATION(GET_SATURATION());
		CAdjustYpbprSaturation(GET_SATURATION());
	}
	else
	{
		SET_SATURATION(GET_SATURATION());
		CVideoSetSaturation(COsdCtrlGetSaturation());
	}


//-------------------------------------------
	//SET_HUE(message);


       // add by xyw  adjust hue 080220 at jpe
       if (GET_INPUTPORT_TYPE(stSystemData.InputSource)==_VIDEO_AV_PORT || GET_INPUTPORT_TYPE(stSystemData.InputSource)==_VIDEO_SV_PORT )
       	{

		 //if (GET_VIDEO8_V_RATE_IS_50())
				// {
					 //SET_HUE(0x32);
					// CVideoSetHuee(50);
				// }
				// else
				 //{
					 //SET_HUE(COsdCtrlGetHue());
				 //}
				 CVideoSetHuee(COsdCtrlGetHue());

       	}
	   
	      //CVideoSetHuee(GET_HUE());
	//else
	   //CAdjustYpbprhue(message);

	//CTimerDelayXms(10);
//#if(_MEMORY_LOCATION == _FLASH)
		//bHueFlag = _ENABLE;
		//CTimerReactiveTimerEvent(SEC(0.5), COsdSaveFlashDataEvent);
//#else
		//CEepromSaveHueSatData();
//#endif
//---------------------------------------------------------------------


	

	//saturation
	//if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
	//	CAdjustYpbprSaturation( GET_YPbPrSaturation());
	//else if(GET_INPUTSOURCE_TYPE() == _SOURCE_VIDEO8)
	//	CVideoSetSaturation(GET_SATURATION());
	//20070324, picture effect contains saturation
	
	//if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
	//	CAdjustYpbprSaturation(COsdCtrlGetSaturation());
	//else if(GET_INPUTSOURCE_TYPE() == _SOURCE_VIDEO8)
	//	CVideoSetSaturation(COsdCtrlGetSaturation());
	//CTimerDelayXms(10);
	//20070324
	//COsdCtrlSetHue(COsdCtrlGetHue());
	/*
      if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR){
              SET_YPbPrHue(COsdCtrlGetHue());
	     	CAdjustYpbprhue(COsdCtrlGetHue());
  	}else{
		//pal hue use default value
		if (GET_VIDEO8_V_RATE_IS_50())
		{
			SET_HUE(_HUE);
		}
		else
		{
			SET_HUE(COsdCtrlGetHue());
		}
		CVideoSetHuee(COsdCtrlGetHue());
  	}

	CTimerDelayXms(10);

	*/
	//if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
	//{
//		CAdjustYpbprhue(COsdCtrlGetHue());
	//}
	//else
	//{
	//	if (GET_PICT_EFFECT()==0)
	//		CVideoSetHuee(COsdCtrlGetHue());
	//	else
	//		CVideoSetHuee(50);
	//}
	
	//sharpness
	//if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR ||GET_INPUTSOURCE_TYPE() == _SOURCE_VIDEO8)
	//{
	//	CAdjustPeakingCoding();
	//}
	//backlight
	//CAdjustBacklight();
	//CEepromSaveSystemData();

}

#endif//#if _PICT_EFFECT_SUPPORT
#if (_AUDIO_EFFECT_SUPPORT)

UINT8 COsdCtrlGetAudioEffect(void)
{
	return GET_AUDIO_EFFECT();
}

void COsdCtrlSetAudioEffect()
{
	UINT8 mode,message;

	mode = GET_AUDIO_EFFECT();
	message = COsdCtrlGetKey();
	if (message==_RIGHT_KEY_MESSAGE)
	{
		mode = (mode+1)%_AUDIO_EFFECT_SUM;
	}
	else if (message==_LEFT_KEY_MESSAGE)
	{
		mode = (mode<=_AUDIO_EFFECT_MIN)?(_AUDIO_EFFECT_MAX):(mode-1);
	}
	else
		return;
	SET_AUDIO_EFFECT(mode);

	/*
	if(GET_AUDIO_MUTE())
	{
		CLR_AUDIO_MUTE();
		SET_MUTE_PROCESS(_DISABLE);
	}
	*/

	CEepromSaveAudioData();
#if _VOLUME_PT2314_SUPPORT
	CPt2314WrBass();
	CPt2314WrTreble();
#endif	//#if _VOLUME_PT2314_SUPPORT


}
#endif

//adc gain/offset
void CAdcDataApply(void)
{
	CAdjustAdcGain();
	CAdjustAdcOffset();
	//CEepromSaveAdcData();
	if (GET_INPUTSOURCE_TYPE() == _SOURCE_VGA)
	{
		CEepromSaveAdcData();
	}
	else if (GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
	{
		CEepromSaveYPbPrData();
	}
}

void COsdCtrlGetAdcGainTarget(UINT8 rgb)
{
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_VGA)
		pGetGainOffsetTarget = &stAdcData.AdcGain[rgb];
	else
		pGetGainOffsetTarget = &stYPbPrData.YPbPrGain[rgb];
}

void COsdCtrlGetAdcOffsetTarget(UINT8 rgb)
{
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_VGA)
		pGetGainOffsetTarget= &stAdcData.AdcOffset[rgb];
	else
		pGetGainOffsetTarget = &stYPbPrData.YPbPrOffset[rgb];
}

UINT8 COsdCtrlGetAdcGainRed(void)
{
	COsdCtrlGetAdcGainTarget(_RED);
	return *pGetGainOffsetTarget;
}

void COsdCtrlSetAdcGainRed(UINT8 message)
{
	COsdCtrlGetAdcGainTarget(_RED);
	*pGetGainOffsetTarget = message;
	CAdcDataApply();
}

UINT8 COsdCtrlGetAdcGainGreen(void)
{
	COsdCtrlGetAdcGainTarget(_GREEN);
	return *pGetGainOffsetTarget;
}

void COsdCtrlSetAdcGainGreen(UINT8 message)
{
	COsdCtrlGetAdcGainTarget(_GREEN);
	*pGetGainOffsetTarget = message;
	CAdcDataApply();
}

UINT8 COsdCtrlGetAdcGainBlue(void)
{
	COsdCtrlGetAdcGainTarget(_BLUE);
	return *pGetGainOffsetTarget;
}

void COsdCtrlSetAdcGainBlue(UINT8 message)
{
	COsdCtrlGetAdcGainTarget(_BLUE);
	*pGetGainOffsetTarget = message;
	CAdcDataApply();
}

UINT8 COsdCtrlGetAdcOffsetRed(void)
{
	COsdCtrlGetAdcOffsetTarget(_RED);
	return *pGetGainOffsetTarget;
}

void COsdCtrlSetAdcOffsetRed(UINT8 message)
{
	COsdCtrlGetAdcOffsetTarget(_RED);
	*pGetGainOffsetTarget = message;
	CAdcDataApply();
}

UINT8 COsdCtrlGetAdcOffsetGreen(void)
{
	COsdCtrlGetAdcOffsetTarget(_GREEN);
	return *pGetGainOffsetTarget;
}

void COsdCtrlSetAdcOffsetGreen(UINT8 message)
{
	COsdCtrlGetAdcOffsetTarget(_GREEN);
	*pGetGainOffsetTarget = message;
	CAdcDataApply();
}

UINT8 COsdCtrlGetAdcOffsetBlue(void)
{
	COsdCtrlGetAdcOffsetTarget(_BLUE);
	return *pGetGainOffsetTarget;
}

void COsdCtrlSetAdcOffsetBlue(UINT8 message)
{
	COsdCtrlGetAdcOffsetTarget(_BLUE);
	*pGetGainOffsetTarget = message;
	CAdcDataApply();
}

#if(_PCB_TYPE!=_PCB_TEST)			//add by lbh 20090916
#if 1//rand move

void SET_RAND_MOVE(void)
{
	UINT16 hOffset, vOffset;
	do {
			if (GET_POWERSTATUS())
			{
								if (GET_ICON_MOVE_ENABLE())
								{
									if (GET_ICON_MOVE_STICK())
									{
										CLR_ICON_MOVE_STICK();
										if (!usIconMoveInteval)
										{
											usIconMoveInteval = _ICON_MOVE_STICK;
#if 0//_PANEL_TYPE==_LG32PDP
											X = ((rand()%50)*2);
											Y = ((rand()%50)*2);
											if (X<10)
												X = 10;
												
											CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, 0x00);
											COsdFxSetPosition(_WINDOW_NOSIGNAL_WIDTH, HEIGHT(18*2*3), X, Y, 1);
											CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, _BIT0);
#else
											X = ((rand()%50)*2);
											Y = ((rand()%50)*2);
											/*
											if (X!=0)
											{
												X = 0;
												Y = 0;
											}
											else
											{
												X = 100;
												Y = 100;
											}
											*/
											hOffset = ((_DISP_WID-_WIN_NOSIGNAL_WIDTH)/2*X)/50;
											vOffset = ((_DISP_LEN-_WIN_NOSIGNAL_LEN)/2*Y)/50;
											CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, 0x00);
											//CScalerSetOsdPosition(WIDTH(12*2*16), HEIGHT(18*2*3), X, Y, 1);
											COsdFxSetWinRefPos(hOffset, vOffset); 
											CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, _BIT0);
#endif
										}
										else
										{
											usIconMoveInteval--;
										}
									}
								}
			}
	}while (0);
}
#else	//linear move
void SET_RAND_MOVE(void)
{
	if (GET_ICON_MOVE_ENABLE())
	{
		if (GET_ICON_MOVE_STICK())
		{
			CLR_ICON_MOVE_STICK();
			
			//if (!usIconMoveInteval--==0)
			if (!usIconMoveInteval)
			{
				usIconMoveInteval = 1;
				if (GET_X_DIR())
				{
					X++;
					if (X>=_OSD_HPOSITION_RANGE)		CLR_X_DIR();										
				}
				else
				{
					X--;
					if (X==0)	SET_X_DIR();
				}
				
				if (GET_Y_DIR())
				{
					Y++;
					if (Y>=_OSD_VPOSITION_RANGE-2)	CLR_Y_DIR();											
				}
				else
				{
					Y--;
					if (Y<=2)	SET_Y_DIR();
				}
			
				COsdFxSetPosition(WIDTH(12*2*16), HEIGHT(18*2*3), X, Y, 1);
				//COsdFxSetPositionLinearMove(0,0,1);
				/*usActH++;
				if (usActH>_DISP_ACT_WID)
					usActH = 1;
				usActV++;
				if (usActV>_DISP_ACT_LEN)
					usActV= 1;
				
				COsdFxSetPositionStep(_DISP_WID -usActH, _DISP_LEN-usActV, 1);
				*/
#if 1
				//COsdFxShowNumber(0, 4, ucIconTimerCounter, 0x33, 1);
				//COsdFxShowNumber(0, 9, pulIconTimerCounter, 0x33, 1);
				//COsdFxShowNumber(0, 4, usActH, 0x33, 1);
				//COsdFxShowNumber(0, 10, usActV, 0x33, 1);
#endif
			}
			else
			{
				usIconMoveInteval--;
			}
		}
	}
}
#endif	//endof move style
#endif
void COsdIconMoveDisableResetEnv(void)
{
	if (GET_ICON_MOVE_ENABLE())
	{

		CLR_ICON_MOVE_ENABLE();
		CLR_ICON_MOVE_STICK(); 

		CTimerWaitForEvent(_EVENT_DEN_STOP);
		CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, 0x00);
		//review???
		CTimerCancelNosignal_Icon_Powersaving();

	}
}

#if 0
UINT8 COsdCtrlGetHPositionYPbPr()
{
		
	return (50 + stModeUserData.HPosition - stModeInfo.IHStartPos);

    	//stModeUserCenterData.CenterClock    = stModeInfo.IHTotal;
    	//stModeUserCenterData.CenterHPos     = stModeInfo.IHStartPos;
    	//stModeUserCenterData.CenterVPos     = stModeInfo.IVStartPos;

}

void COsdCtrlSetHPositionYPbPr(UINT8 message)
{
	if(GET_INPUTSOURCE_TYPE() != _SOURCE_YPBPR)
		return;
	message = COsdCtrlGetKey();
	if((message==_LEFT_KEY_MESSAGE)/* && (stModeUserCenterData.CenterHPos-stModeUserData.HPosition >= 0)*/)
	   	stModeUserData.HPosition-=1;
	else if((message==_RIGHT_KEY_MESSAGE)/* && (stModeUserData.HPosition-stModeUserCenterData.CenterHPos >= 0)*/)
	   	stModeUserData.HPosition+=1;
	CAdjustHPosition();

	#if(_MEMORY_LOCATION == _FLASH)
		bHPositionFlag = _ENABLE;
		CTimerReactiveTimerEvent(SEC(0.5), COsdSaveFlashDataEvent);
	#else
		CEepromSaveModeDataYPbPr(stModeInfo.ModeCurr);
	#endif
}

UINT8 COsdCtrlGetVPositionYPbPr()
{
	return 100-(stModeUserData.VPosition-COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MIN))*100/(COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MAX)-COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MIN));
}

void COsdCtrlSetVPositionYPbPr(UINT8 message)
{
	if(GET_INPUTSOURCE_TYPE() != _SOURCE_YPBPR)
		return;
	message = COsdCtrlGetKey();
	if((message==_RIGHT_KEY_MESSAGE) && (stModeUserData.VPosition>COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MIN)))
		stModeUserData.VPosition-=1;
	else if ((message==_LEFT_KEY_MESSAGE) && (stModeUserData.VPosition<COsdFxGetVPositionRange(_GET_VPOSITIONRANGE_MAX)))
		stModeUserData.VPosition+=1;
	CAdjustVPosition();
	#if(_MEMORY_LOCATION == _FLASH)
		bVPositionFlag = _ENABLE;
		CTimerReactiveTimerEvent(SEC(0.5), COsdSaveFlashDataEvent);
	#else
		CEepromSaveModeDataYPbPr(stModeInfo.ModeCurr);
	#endif
}

UINT8 COsdCtrlGetClockYPbPr()
{
	return ((stModeUserData.Clock-COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN))*100)/(COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MAX) - COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN));
}

void COsdCtrlSetClockYPbPr(UINT8 message)
{
	if (GET_INPUTSOURCE_TYPE() != _SOURCE_YPBPR)
		return;

	message = COsdCtrlGetKey();

	if((message==_LEFT_KEY_MESSAGE) && (stModeUserData.Clock>COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MIN)))
	{
		stModeUserData.Clock-=1;
	}
	else if((message==_RIGHT_KEY_MESSAGE) && (stModeUserData.Clock<COsdFxGetAdcClockRange(_GET_CLOCKRANGE_MAX)))
	{
		stModeUserData.Clock+=1;
	}

	CAdjustAdcClock(stModeUserData.Clock);
	CEepromSaveModeDataYPbPr(stModeInfo.ModeCurr);

}

UINT8 COsdCtrlGetPhaseYPbPr()
{
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
	{
		if((ucSyncProcessState==_SEARCH_STATE)||(ucSyncProcessState==_NOSIGNAL_STATE))
			return 50;			
		else 
			return ((WORD)stModeUserData.Phase*100/63);
	}else
		return 32;
}

void COsdCtrlSetPhaseYPbPr(UINT8 message)
{
	if(GET_INPUTSOURCE_TYPE() != _SOURCE_YPBPR)
		return;

	message = COsdCtrlGetKey();
	if((message==_LEFT_KEY_MESSAGE) && stModeUserData.Phase>0)
	  	stModeUserData.Phase-=1;
	else if((message==_RIGHT_KEY_MESSAGE) && stModeUserData.Phase<63)
	  	stModeUserData.Phase+=1;

	CAdjustPhase(stModeUserData.Phase);
	#if(_MEMORY_LOCATION == _FLASH)
		bPhaseFlag = _ENABLE;
		CTimerReactiveTimerEvent(SEC(0.5), COsdSaveFlashDataEvent);
	#else
		CEepromSaveModeDataYPbPr(stModeInfo.ModeCurr);
	#endif
}
#endif

#if _TIMER_PAGE_SUPPORT
UINT8 COsdCtrlGetTimeCurrentTimer(void)
{
	if (ucExtendMenuRow == 1)
	{
		if (ucExtendMenuCol==1)
			return ucHourSystem;
		else	 if (ucExtendMenuCol==2)
			return ucMinSystem;
		else
			return 0;
	}
	return 0;
}
void COsdCtrlSetTimeCurrentTimer(UINT8 message)
{
	unsigned char key=0;
	
	message = COsdCtrlGetKey();

	if ((message == _DOWN_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _DOWN_KEY_MESSAGE))
		key = 1;
	else if ((message == _UP_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _UP_KEY_MESSAGE))
		key = 2;

	if (ucExtendMenuRow == 1)
	{
		if (ucExtendMenuCol == 1)
		{
			if (key == 1)
				ucHourSystem = (ucHourSystem==0)?(23):(ucHourSystem-1);
			else if (key == 2)
				ucHourSystem = (ucHourSystem==23)?(0):(ucHourSystem+1);
		}
		else if (ucExtendMenuCol == 2)
		{
			if (key == 1)
				ucMinSystem = (ucMinSystem==0)?(59):(ucMinSystem-1);
			else if (key == 2)
				ucMinSystem = (ucMinSystem==59)?(0):(ucMinSystem+1);
		}
	}

}

UINT8 COsdCtrlGetPowerOnTimer(void)
{
	if (ucExtendMenuRow == 1)
	{
		if (ucExtendMenuCol==1)
			return stTimeData.ucTimeHourStart;
		else	 if (ucExtendMenuCol==2)
			return stTimeData.ucTimeMinStart;
		else
			return 0;
	}
	return 0;
}
void COsdCtrlSetPowerOnTimer(UINT8 message)
{
	unsigned char key=0;
	
	message = COsdCtrlGetKey();

	if ((message == _DOWN_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _DOWN_KEY_MESSAGE))
		key = 1;
	else if ((message == _UP_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _UP_KEY_MESSAGE))
		key = 2;

	if (ucExtendMenuRow == 3)
	{
		ucTimerPowerOnMinTickCnt = 0;
		if (ucExtendMenuCol == 1)
		{
			if (key == 1)
				stTimeData.ucTimeHourStart = (stTimeData.ucTimeHourStart==0)?(23):(stTimeData.ucTimeHourStart-1);
			else if (key == 2)
				stTimeData.ucTimeHourStart = (stTimeData.ucTimeHourStart==23)?(0):(stTimeData.ucTimeHourStart+1);
		}
		else if (ucExtendMenuCol == 2)
		{
			if (key == 1)
				stTimeData.ucTimeMinStart = (stTimeData.ucTimeMinStart==0)?(59):(stTimeData.ucTimeMinStart-1);
			else if (key == 2)
				stTimeData.ucTimeMinStart = (stTimeData.ucTimeMinStart==59)?(0):(stTimeData.ucTimeMinStart+1);
		}
	}

}

UINT8 COsdCtrlGetPowerOffTimer(void)
{
	if (ucExtendMenuRow == 2)
	{
		if (ucExtendMenuCol==1)
			return stTimeData.ucTimeHourStop;
		else	 if (ucExtendMenuCol==2)
			return stTimeData.ucTimeMinStop;
		else
			return 0;
	}
	return 0;
}
void COsdCtrlSetPowerOffTimer(UINT8 message)
{
	unsigned char key=0;

	if ((message == _DOWN_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _DOWN_KEY_MESSAGE))
		key = 1;
	else if ((message == _UP_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _UP_KEY_MESSAGE))
		key = 2;

	if (ucExtendMenuRow == 2)
	{
		ucTimerPowerOffMinTickCnt = 0;
		if (ucExtendMenuCol == 1)
		{
			if (key == 1)
				stTimeData.ucTimeHourStop = (stTimeData.ucTimeHourStop==0)?(23):(stTimeData.ucTimeHourStop-1);
			else if (key == 2)
				stTimeData.ucTimeHourStop = (stTimeData.ucTimeHourStop==23)?(0):(stTimeData.ucTimeHourStop+1);
		}
		else if (ucExtendMenuCol == 2)
		{
			if (key == 1)
				stTimeData.ucTimeMinStop = (stTimeData.ucTimeMinStop==0)?(59):(stTimeData.ucTimeMinStop-1);
			else if (key == 2)
				stTimeData.ucTimeMinStop = (stTimeData.ucTimeMinStop==59)?(0):(stTimeData.ucTimeMinStop+1);
		}
	}
}

#if 1//(_TV_POWERONCH_SUPPORT)
UINT8 COsdCtrlGetPowerOnChannel(void)
{
	return GET_TVPOWERONCHANNEL();
}

void COsdCtrlSetPowerOnChannel(UINT8 message)
{
	UINT8 ucPowerChannel = GET_TVPOWERONCHANNEL();
	
	if (message == _LEFT_KEY_MESSAGE)
	{
		if (ucPowerChannel<=_FIRST_CHANNEL)
			ucPowerChannel = GET_TV_MAX_CH()-1;
		else
			ucPowerChannel -= 1;
	}
	else if (message == _RIGHT_KEY_MESSAGE)
	{
		ucPowerChannel = (ucPowerChannel + 1) % (GET_TV_MAX_CH());
	}
	else
		return;
	
	SET_TVPOWERONCHANNEL(ucPowerChannel);
	CEepromSaveTimeData();
}

UINT8 COsdCtrlGetSwtichTimer(void)
{
	if (ucExtendMenuRow == 2)
	{
		if (ucExtendMenuCol==1)
			return stTimeData.ucTimeHourSwitch;
		else	 if (ucExtendMenuCol==2)
			return stTimeData.ucTimeMinSwitch;
		else
			return 0;
	}
	return 0;
}
void COsdCtrlSetSwtichTimer(UINT8 message)
{
	unsigned char key=0;
	unsigned char * pHour;
	unsigned char * pMin;

	pHour = &stTimeData.ucTimeHourSwitch;
	pMin = &stTimeData.ucTimeMinSwitch;

	if ((message == _DOWN_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _DOWN_KEY_MESSAGE))
		key = 1;
	else if ((message == _UP_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _UP_KEY_MESSAGE))
		key = 2;

	if (ucExtendMenuRow == 5)
	{
		if (ucExtendMenuCol == 1)
		{
			if (key == 1)
				*pHour = (*pHour==0)?(23):(*pHour-1);
			else if (key == 2)
				*pHour = (*pHour==23)?(0):(*pHour+1);
		}
		else if (ucExtendMenuCol == 2)
		{
			if (key == 1)
				*pMin = (*pMin==0)?(59):(*pMin-1);
			else if (key == 2)
				*pMin = (*pMin==59)?(0):(*pMin+1);
		}
	}
}

UINT8 COsdCtrlGetTimeSwitchChannel(void)
{
	return GET_TIME_SWITCH_CH();
}

void COsdCtrlSetTimeSwitchChannel(UINT8 message)
{
	UINT8 ucSwitchChannel = GET_TIME_SWITCH_CH();
	
	if (message == _LEFT_KEY_MESSAGE)
	{
		if (ucSwitchChannel<=_FIRST_CHANNEL)
			ucSwitchChannel = GET_TV_MAX_CH()-1;
		else
			ucSwitchChannel -= 1;
	}
	else if (message == _RIGHT_KEY_MESSAGE)
	{
		ucSwitchChannel = (ucSwitchChannel + 1) % (GET_TV_MAX_CH());
	}
	else
		return;
	
	SET_TIME_SWITCH_CH(ucSwitchChannel);
}
#endif

/*
UINT8 COsdCtrlGetRemindTimer(void)
{
	if (ucExtendMenuRow == 3)
	{
		if (ucExtendMenuCol==1)
			return stTimeData.ucTimeHourRemind;
		else	 if (ucExtendMenuCol==2)
			return stTimeData.ucTimeMinRemind;
		else
			return 0;
	}
	return 0;
}
void COsdCtrlSetRemindTimer(UINT8 message)
{
	unsigned char key=0;
	
	message = COsdCtrlGetKey();

	if ((message == _DOWN_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _DOWN_KEY_MESSAGE))
		key = 1;
	else if ((message == _UP_KEY_MESSAGE) || (message == _REPEAT_KEY_MESSAGE && ucOsdPreMessage == _UP_KEY_MESSAGE))
		key = 2;

	if (ucExtendMenuRow == 3)
	{
		ucTimerRemindMinTickCnt = 0;
		if (ucExtendMenuCol == 1)
		{
			if (key == 1)
				stTimeData.ucTimeHourRemind= (stTimeData.ucTimeHourRemind==0)?(23):(stTimeData.ucTimeHourRemind-1);
			else if (key == 2)
				stTimeData.ucTimeHourRemind = (stTimeData.ucTimeHourRemind==23)?(0):(stTimeData.ucTimeHourRemind+1);
		}
		else if (ucExtendMenuCol == 2)
		{
			if (key == 1)
				stTimeData.ucTimeMinRemind= (stTimeData.ucTimeMinRemind==0)?(59):(stTimeData.ucTimeMinRemind-1);
			else if (key == 2)
				stTimeData.ucTimeMinRemind = (stTimeData.ucTimeMinRemind==59)?(0):(stTimeData.ucTimeMinRemind+1);
		}
	}

}
*/
#endif	//#if _TIMER_PAGE_SUPPORT

#if (_DISP_RATIO_M2_SUPPORT)
#if _PANEL_DISPLAY_RATIO == _PANEL_16_9
UINT8 COsdCtrlGetDispRatioM2(void)
{
	return GET_DISPLAYRATIO();
}

void COsdCtrlSetDispRatioM2(void)
{
	UINT8 mode;
	UINT8 ucTmpLayerIndex = ucLayerIndex;
	UINT8 ucTmpState = ucOsdState;

	//20070406, positive /negtive turn, but short menu fail
	//mode = GET_DISPLAYRATIO();
	//if (!COsdCtrlSetBracketData(ucOsdMessage,_DISP_RATIO_MAX, _DISP_RATIO_MIN, &mode))
	//	return;
	mode = GET_DISPLAYRATIO();
	mode = (mode + 1) % _DISP_RATIO_MODENUM;

	SET_DISPLAYRATIO(mode);

	CEepromSaveSystemData();

	//only active state to execute
	switch (GET_INPUTSOURCE_TYPE()) {
		case _SOURCE_VGA:
		case _SOURCE_YPBPR:
		case _SOURCE_DVI:
			if (ucSyncProcessState!=_ACTIVE_STATE)
				return;
			break;
		case _SOURCE_VIDEO8:
			if (ucVideoProcessState!=_ACTIVE_STATE)
				return;
			break;
	}

	//CModeResetMode();

	CAdjustDisableWatchDog(_WD_ALL); // Disable watch dog
 	CMiscDisableDoubleBuffer();//disable dobule buffle for VGIP write in
	CTimerWaitForEvent(_EVENT_DEN_STOP);	
	//========add by dengyi  0n   2010 01 07
	CPowerLightPowerOff();
	CAdjustBackgroundColor(0x00, 0x00, 0x00); 
	CScalerSetBit(_VDISP_CTRL_28, ~_BIT5,_BIT5);//display force to background color
	//COsdFxDisableOsd();
 	CModeAutoMeasureOff();

	bDoAspectRatioFlag = _TRUE;
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_VIDEO8)
		CVideoDisplaySet();
	else{
		if(GET_INPUTSOURCE_TYPE() == _SOURCE_DVI)	// restore avoid ovscan capture windows size reduce,hill 20070516
		{
#if _HDMI_REWRITE
#else
		 	stModeInfo.IHWidth = HDMI_H_Width;
		 	stModeInfo.IVHeight = HDMI_V_Height;
#endif
		}
		CModeDisplayActiveMode();
	}
	bDoAspectRatioFlag = _FALSE;

	CMiscEnableDoubleBuffer();
	CTimerWaitForEvent(_EVENT_DEN_STOP);
	CTimerWaitForEvent(_EVENT_DEN_START);
	CMiscClearStatusRegister();
 	if(GET_INPUTPORT_TYPE(stSystemData.InputSource)!=_VIDEO_TV_PORT) //for tv crash issue.//yf_zhang 
 		CModeAutoMeasureOn();
	CTimerWaitForEvent(_EVENT_DEN_STOP);	
	CScalerSetBit(_VDISP_CTRL_28, ~_BIT5,0x00);//display operates normally	

	if(GET_INPUTSOURCE_TYPE() == _SOURCE_DVI) 
		CScalerSetDataPortBit(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_VWDSR_41, ~_BIT0, _BIT0);//Enable packet variation Watch Dog
		
	if(GET_INPUTSOURCE_TYPE() == _SOURCE_YPBPR)
		CAdjustEnableWatchDog(_WD_DV_TIMEOUT | _WD_FRAMESYNC);	
	else if(GET_INPUTSOURCE_TYPE() == _SOURCE_VIDEO8)
		CAdjustDisableWatchDog(_WD_ALL); 
	else
		CAdjustEnableWatchDog(_WD_ALL);	
	CTimerReactiveTimerEvent(SEC(0.1), CPowerPanelOn);   //add by dengyi on 2010 10 07

	//COsdFxEnableOsd();
}
#endif	//#if _PANEL_DISPLAY_RATIO == _PANEL_16_9
#endif

void COsdCtrlSetPictureMiscLTI(UINT8 message)
{
	message = message;
	if(GET_PICTMISC_LTI())
		CLR_PICTMISC_LTI();
	else
		SET_PICTMISC_LTI();

	CEepromSaveSystemData();//CEepromSaveTimeData();  //dong alter 20080813

	//action:

}
UINT8 COsdCtrlGetPictureMiscLTI(void)
{
	if(GET_PICTMISC_LTI())
		return 1;
	else
		return 0;
}

void COsdCtrlSetPictureMiscCTI(UINT8 message)
{
	message = message;
	if(GET_PICTMISC_CTI())
		CLR_PICTMISC_CTI();
	else
		SET_PICTMISC_CTI();

	CEepromSaveSystemData();//CEepromSaveTimeData();  //dong alter 20080813

	//action:

}
UINT8 COsdCtrlGetPictureMiscCTI(void)
{
	if(GET_PICTMISC_CTI())
		return 1;
	else
		return 0;
}

void COsdCtrlSetPictureMiscBlkExt(UINT8 message)
{
	message = message;
	if(GET_PICTMISC_BLK_EXT())
		CLR_PICTMISC_BLK_EXT();
	else
		SET_PICTMISC_BLK_EXT();

	CEepromSaveSystemData();//CEepromSaveTimeData();  //dong alter 20080813

	//action:

}
UINT8 COsdCtrlGetPictureMiscBlkExt(void)
{
	if(GET_PICTMISC_BLK_EXT())
		return 1;
	else
		return 0;
}

void COsdCtrlSetPictureMiscDNR(UINT8 message)
{
	message = message;
	if(GET_PICTMISC_DNR())
		CLR_PICTMISC_DNR();
	else
		SET_PICTMISC_DNR();

	CEepromSaveSystemData();//CEepromSaveTimeData();  //dong alter 20080813

	//action:

}
UINT8 COsdCtrlGetPictureMiscDNR(void)
{
	if(GET_PICTMISC_DNR())
		return 1;
	else
		return 0;
}

void COsdCtrlSetPictureMiscDither(UINT8 message)
{
	message = message;
	if(GET_PICTMISC_DITHER())
		CLR_PICTMISC_DITHER();
	else
		SET_PICTMISC_DITHER();

	CEepromSaveSystemData();//CEepromSaveTimeData();  //dong alter 20080813

	//action:

}
UINT8 COsdCtrlGetPictureMiscDither(void)
{
	if(GET_PICTMISC_DITHER())
		return 1;
	else
		return 0;
}

//20080901 
void COsdCtrlSetBlueScreen(UINT8 message)
{
message = message;
//20081013 ccy modify
	if(GET_TV_BACKGROUND())
		SET_TV_BACKGROUND(0);
	else
		SET_TV_BACKGROUND(1);
    
	CEepromSaveOsdUserData();//CEepromSaveTimeData();  //dong alter 20081020
	  if(ucSyncProcessState==_NOSUPPORT_STATE||ucVideoProcessState==_NOSIGNAL_STATE||ucSyncProcessState==_NOSIGNAL_STATE)
	CModeResetMode();
}
UINT8 COsdCtrlGetBlueScreen(void)
{
//20081013 ccy modify
 	if(GET_TV_BACKGROUND())
		return 1;
	else
		return 0;
 
}
void COsdCtrlSetScreenSave(UINT8 message)
{
	message = message;
	if(GET_SCREEN_SAVE())
		CLR_SCREEN_SAVE();
	else
		SET_SCREEN_SAVE();

	CEepromSaveSystemData();//CEepromSaveTimeData();  //dong alter 20080813

	//action:

}
UINT8 COsdCtrlGetScreenSave(void)
{
	if(GET_SCREEN_SAVE())
		return 1;
	else
		return 0;
}



/**
 *
 * @}
 */

