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

📄 mode.c

📁 车载 液晶显示器的主控程序(主要使用芯片为 MYSON MTV512 单片机、RealTek 2323 Scare 芯片、TVP5147(视频解码)。配Sharp 8寸液晶显示器 )。
💻 C
📖 第 1 页 / 共 5 页
字号:
//----------------------------------------------------------------------------------------------------
// ID Code      : Mode.c No.0002
// Update Note  : 
//
//----------------------------------------------------------------------------------------------------

#define __MODE__

#include "..\Header\Include.h"


//--------------------------------------------------
// Description  : Mode handler, the main control flow
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeHandler(void) 
{
	
	//x.hu, for source change
	if (CSourceChange())
	{
		CModeResetMode();
		//return;			//if add, switch to no signal channel cause screen darkness
	    CScalerReset();		//x.hu, test for changing source from VGA to Video
             
		

		//x.hu, request to set scaler in CVideoExist()
		//SET_VIDEO_TABLE_SET_SCALER();
	}

	if(CPowerHandler())
    {
       	ucCurrState = GET_POWERSTATUS() ? _INITIAL_STATE : _PWOFF_STATE;
    }
	
    switch(ucCurrState)
	{
       	case _PWOFF_STATE:
           	ucCurrState = GET_POWERSTATUS() ? _INITIAL_STATE : _PWOFF_STATE;
           	break;

       	case _INITIAL_STATE:
			// Evan 050512
			LED_Message(LED_MSG_GREEN);					// Power up show led
           	ucCurrState = _SEARCH_STATE;
           	break;

       	case _SEARCH_STATE:
			
       		if(CSyncHandler())
       		{
       			// Source and sync OK
       			if(CModeDetect())
				{
					//x.hu, 20050803, update
					// move this from the end of "case _SEARCH_STATE" to avoid gabage to be shown 
					// while signal not stable, such as power on, source switch.
// if set source hint here, when signal is found, the hint text will disable a little time to set display.
#if 0	// 20050805
					#if 1//(_SHOW_SOURCEHINT)	//x.hu, 20050803, add
						if (1){//(GET_SOURCEHINTSTATUS() == _FALSE) {
							ucOsdEventMsg = _SHOW_SOURCE_MSG;
							CTimerReactiveTimerEvent(SEC(4),COsdDispOsdTimerEvent);
							SET_SOURCEHINTSTATUS();
						}
					#endif
#endif
					// Mode stable. Initial display settings  switch to active/nosignal/nosupport state
					SET_READYFORDISPLAY();
					if(stModeInfo.ModeCurr == _MODE_NOSIGNAL)
					{
						ucCurrState = _NOSIGNAL_STATE;
					}
					else if(stModeInfo.ModeCurr == _MODE_NOSUPPORT)
					{
						CModeAutoMeasureOn();
						ucCurrState = _NOSUPPORT_STATE;
					}
					else
					{
						//x.hu, 20050716, add for changing source, test, and may be update
						// Notes for this:
						// Because of showing Source hint will power up panel and light, so,
						// CModeDisplayActiveMode() will bring out some gabage on the screen.
						// We power down the light here, and reactive light when the programe 
						// enter into _ACTIVE_STATE state.
						#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
						if (!GET_VIDEO_PN_ACTION()) {
							CPowerLightPowerOff();		// x.hu, 20050803, remarks
						}
						#else
							CPowerLightPowerOff();		// x.hu, 20050803, remarks
						#endif
						
						CModeDisplayActiveMode();
						CModeAutoMeasureOn();
						/*
						//////////////////////////////////////////////////////for test
                                 pData[0]=0;
                                 pData[1]=0;
				     pData[2]=0;
                              CScalerWrite(_BRI_RED_COE_60, 3, pData, _AUTOINC);
				     pData[0]=0;
                                 pData[1]=0;
				     pData[2]=0;
				    CScalerWrite(_CTS_RED_COE_63, 3, pData, _AUTOINC);

/////////////////////////////////////////////////////////////////
                                   */
						ucCurrState = _ACTIVE_STATE;
// after found signal,   
///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
#if 1	// 20050805
					#if 1//(_SHOW_SOURCEHINT)	//x.hu, 20050803, add
						if (1){//(GET_SOURCEHINTSTATUS() == _FALSE) {
							ucOsdEventMsg = _SHOW_SOURCE_MSG;
							CTimerReactiveTimerEvent(SEC(4),COsdDispOsdTimerEvent);
							SET_SOURCEHINTSTATUS();
						}
					#endif
#endif
					}
				}
				else
				{
					// Still in search state
				}

				ucEvent0 = _INACTIVE_COUNTDOWN_EVENT;
			}
			else
			{
				CTimerCountDownEventProc(&ucEvent0, 5, CModeSyncTimeoutCountDownEvent);
			}
			
			break;

        	case _ACTIVE_STATE:
            		if(CFrameSyncDetect())	//detection frame sync condition. note by zhang_dc
            		{
            			// x.hu, add to get whether the sync is lost because switch from PAL and NTSC
            			CModeIsChange();
						
                		CModeResetMode();	//if frame error, reset. note by zhang_dc

            		}
            		else		//sync is OK!. note by zhang_dc
            		{
                		if(CModeIsChange())
                		{
                    		CModeResetMode();
                		}
                		else
                		{
                    		if(GET_READYFORDISPLAY() == _TRUE)
                    		{
                        		CLR_READYFORDISPLAY();
                        		CLR_SOURCE_AUTOCHANGE();
			///////////////////////////////////////for test/////////////////////xyw
			            
					//CAutoDoWhiteBalance();
			/////////////////////////////////////////////////
			
                        		CPowerPanelOn();
						
								// x.hu, 20050804, remark because blueBG when src sw
								//CAdjustBackgroundColor(_BGND_COLOR_R, _BGND_COLOR_G, _BGND_COLOR_B);
								CAdjustBackgroundColor(0, 0, 0);
								//while(1) CMiscIspDebugProc();		//for debug.
                       			// CAdjustEnableWatchDog(_WD_ALL);
								CAdjustEnableWatchDog(0);
								

                        		if(GET_FIRST_LOADFONT() == _TRUE)
                        		{
                            		CLR_FIRST_LOADFONT();
                            		COsdDispFirstTimeLoadFont();
                        		}

								// x.hu, audio may switch to avalid channel because of no signal, so:
								// if audio is not muted, get correct audio channel:
								#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
								#if  (_AUDIO_DEVICE != _AUDIO_NONE || _FM_MODULATION == _ENABLE)
								if (GET_MUTESTATUS() == 0) {
									CAudioFmMuteClear();
								}
								#endif
								#endif
								#if 0//(_CUSTOM_TYPE == _CUSTOM_NONE)
								#if (_AUDIO_DEVICE != _AUDIO_NONE)
								if (GET_MUTESTATUS() == 0) {
									CAudioFmMuteClear();
								}
								#endif
								#endif
		// x.hu, 20050803, add
		// start audio after 1s from showing video
		//#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)////////////
		//CTimerDelayXms(600);	// here also delay light on////////
		//#endif////////////////////////
		
		#if (_AUDIO_DEVICE != _AUDIO_NONE)
		CAdjustVolume();
		#endif
		#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
		#if (_FM_MODULATION == _ENABLE)
		CAudio2FM();
		#endif
		#endif

					#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
							CLR_VIDEO_PN_ACTION();
					#endif
							
                    		}
				LED_Message(LED_MSG_GREEN);//	XYW
                    		if((stModeUserData.FirstAuto == 0) && (GET_INPUTSOURCE_TYPE() == _SOURCE_VGA))
                    		{
                        		stModeUserData.FirstAuto = 1;
                        		ucOsdEventMsg = _DO_AUTO_CONFIG;
                    		}
                    			
                		}
            		}
            		break;

        	case _NOSUPPORT_STATE:
//#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
							//CLR_VIDEO_PN_ACTION();
//#endif                  
                        CAudioVolumemute();//xyw
            		if(GET_READYFORDISPLAY() == _TRUE)
            		{
                		CLR_READYFORDISPLAY();
                		CModeSetFreeRun();
                		CAdjustBackgroundColor(_BGND_COLOR_R, _BGND_COLOR_G, _BGND_COLOR_B);
                		//CAdjustBackgroundColor(0, 0, 0);

						// x.hu, add @ 20050802, we enable osd to be show while no signal. so:
						// Press Menu key to show common osd while no signal,
						// we should load font first.
						if(GET_FIRST_LOADFONT() == _TRUE)
						{
							CLR_FIRST_LOADFONT();
							COsdDispFirstTimeLoadFont();
						}
						// x.hu, add @ 20050802 end.
						
                		CTimerReactiveTimerEvent(SEC(1), CModeNoSupportEvent);
            		}

            		if(CModeConnectIsChange() || CModeIsChange())
                		CModeResetMode();

            		break;

        	case _NOSIGNAL_STATE:
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
							CLR_VIDEO_PN_ACTION();
#endif

                      
			#if (_AUDIO_DEVICE != _AUDIO_NONE)
			// 20050810
			//CAudioSelChannel(_AUDIO_CHANNEL_NC);2005.12.26
			CAudioVolumemute();//xyw
			#endif
			 
            		if(GET_READYFORDISPLAY() == _TRUE)
            		{
               			//CLR_VIDEO_PN_ACTION();
						
                		CLR_READYFORDISPLAY();
						#if (_SOURCE_AUTOCHANGE_ENABLE == _TRUE)
                		SET_SOURCE_AUTOCHANGE();
						#endif
                		CModeSetFreeRun();
                		CAdjustBackgroundColor(_BGND_COLOR_R, _BGND_COLOR_G, _BGND_COLOR_B);
                		//CAdjustBackgroundColor(0, 0, 0);

						// x.hu, add @ 20050802, we enable osd to be show while no signal. so:
						// Press Menu key to show common osd while no signal,
						// we should load font first.
						if(GET_FIRST_LOADFONT() == _TRUE)
						{
							CLR_FIRST_LOADFONT();
							COsdDispFirstTimeLoadFont();
						}
						// x.hu, add @ 20050802 end.

#if(_TMDS_SUPPORT == _ON)
                		if(bVGACONNECT && bDVICONNECT)
#else
                		if(bVGACONNECT)
#endif
                		{
                			#if (_OSD_NOSIGNAL_OPTION == _TRUE)
							//x.hu, 20051027, for common user to show source hint
							#if (_SHOW_SOURCEHINT)
							
							if (GET_SOURCEHINTSTATUS() == _FALSE) {
								ucOsdEventMsg = _SHOW_SOURCE_MSG;
								CTimerActiveTimerEvent(SEC(300),COsdDispOsdTimerEvent);//8.5

								SET_SOURCEHINTSTATUS();
							}
							#endif
                    		CTimerReactiveTimerEvent(SEC(3.5), CModeNoCableEvent);//xyw
							CTimerActiveTimerEvent(SEC(300), CModePowerSavingEvent);//8.5
							#else
                    		//CTimerReactiveTimerEvent(SEC(3.5), CModeNoCableEvent);
                    		
			                // x.hu, 20050804, update
			                // for no signal source hint if not in be started in SetFreerun()
			                // if src sw to an no signal ch, "CModeSyncTimeoutCountDownEvent" will clr flag
							#if (_SHOW_SOURCEHINT)
							
							if (GET_SOURCEHINTSTATUS() == _FALSE) {
								ucOsdEventMsg = _SHOW_SOURCE_MSG;
								CTimerActiveTimerEvent(SEC(4),COsdDispOsdTimerEvent);

								SET_SOURCEHINTSTATUS();
							}
							#endif
							// x.hu, 20050803, add end
							CTimerActiveTimerEvent(SEC(300), CModePowerSavingEvent);//8.5
							#endif
                		}
                		else
                		{
                			#if (_OSD_NOSIGNAL_OPTION == _TRUE)
                    		CTimerReactiveTimerEvent(SEC(3.5), CModeNoSignalEvent);//xyw
                    		CTimerActiveTimerEvent(SEC(300), CModePowerSavingEvent);//8.5
							#else
                   			//CTimerReactiveTimerEvent(SEC(3.5), CModeNoSignalEvent);
                    		CTimerActiveTimerEvent(SEC(300), CModePowerSavingEvent);//8.5
							
			                // x.hu, 20050804, update
			                // for no signal source hint if not in be started in SetFreerun()
			                // if src sw to an no signal ch, "CModeSyncTimeoutCountDownEvent" will clr flag
			                #if (_SHOW_SOURCEHINT)
							if (GET_SOURCEHINTSTATUS() == _FALSE) {
								ucOsdEventMsg = _SHOW_SOURCE_MSG;
								CTimerActiveTimerEvent(SEC(4),COsdDispOsdTimerEvent);

								SET_SOURCEHINTSTATUS();
							}
							#endif
							// x.hu, 20050803, add end
							
							#endif
                		}
            		}

            		if(CModeConnectIsChange() || CSourceHandler())
                		CModeResetMode();

            		break;

        	case _SLEEP_STATE:
				LED_Message(LED_MSG_FLASH_GREEN);//	XYW
            		if(CModeConnectIsChange() || CSourceHandler())
                		CModeResetMode();

            		break;

        	default:
            		break;
    	}
}

//----------------------------------------------------------------------------------------------------
// Measure Functions
//----------------------------------------------------------------------------------------------------

//--------------------------------------------------
// Description  : Check measure ready process
// Input Value  : None
// Output Value : Return _TRUE if measure finished, _FALSE if timeout
//--------------------------------------------------
bit CModeMeasureReady(void)
{
    	CScalerSetBit(_SYNC_SELECT_47, ~_BIT0, 0x00);	//set HSYNC & VSYNC Measure mode. Analog. note by zhang_dc
    	CAdjustSyncProcessorMeasureStart();		//Start measurement. note by zhang_dc

    	if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))	//if measurement finished in specified time. note by zhang_dc
    	{
        	return _TRUE;
    	}
    	else
    	{
        	CScalerSetBit(_MEAS_HS_PERIOD_H_52, ~_BIT5, 0x00);	//if measurement timeout, disable measurement. note by zhang_dc

⌨️ 快捷键说明

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