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

📄 menu.c

📁 主要用于液晶电视解码,内置51单片机,全部代码用C编写,编译环境为KEILC
💻 C
📖 第 1 页 / 共 2 页
字号:
#define _MENU_C_

#include <stdlib.h>
#include <string.h>
#include "types.h"
#include "board.h"
#include "global.h"
#include "keypaddef.h"
#include "menu.h"
//#include "menudef.h"
#include "keypad.h"
#include "ms_rwreg.h"
#include "msosd.h"
#include "menufunc.h"
#include "menustr.h"
#include "menutbl.h"
#include "ms_reg.h"
#include "DEBUG.h"
#include "misc.h"
#include "nvram.h"
#include "adjust.h"
#include "userpref.h"
#include "ir.h"
#include "tv.h"
#include "power.h"
#include "tda7052.h"
#include "panel.h"
#include "mstar.h"
#include "DevVD.h"
#include "menufunc.h"
#include "irfunc.h"

#define CurrentMenu		tblMenus[g_ucMenuPageIndex]
#define PrevMenuPage		CurrentMenu.PrevPage
#define CurrentMenuItems	CurrentMenu.MenuItems
#define MenuItemCount		CurrentMenu.ItemCount
#define CurrentMenuTimeOut	CurrentMenu.TimeOut

#define CurrentMenuItem		CurrentMenu.MenuItems[g_ucMenuItemIndex]
#define NextMenuPage		CurrentMenuItem.NextPage
#define CurrentMenuItemFunc	CurrentMenuItem.KeyFunction
//#define KeyEvent		CurrentMenuItem.KeyEvents[KeypadButton]

//========================================================================
BOOL ResetOsdTimer(void)
{
	BYTE tempValue=g_VideoSetting.OsdTime;

 	if (!FactoryModeFlag)
    {
      if (tempValue==0)
        g_ucOsdCounter=5;
      else if (tempValue==1)
        g_ucOsdCounter=10;
      else if (tempValue==2)
        g_ucOsdCounter=30;
      else
        g_ucOsdCounter=60;
    }
  	if(CurrentMenuTimeOut & mtbIndividualTimeOut)
    	g_ucOsdCounter = CurrentMenuTimeOut& ~mtbIndividualTimeOut;//Vick :Disable OSD timer out

  	Clr_OsdTimeoutFlag();
  	return TRUE;
}

void Menu_InitVariable(void)
{
	if (PowerOnFlag)
    	g_ucMenuPageIndex=RootMenu;
  	else
    	g_ucMenuPageIndex=PowerOffMenu;

  	g_ucMenuItemIndex=0;
  	g_ucOsdCounter=0;
}

void Menu_OsdHandler(void)
{
    #ifdef IR_DEBUG_EN
	DebugIRHandler();
    #endif

  	Key_ScanKeypad();
  	irDecodeCommand();
	#if TV_ENABLE
	irDecodeNumKey();
	#endif

    if (OsdTimeoutFlag)
    {
    	Clr_OsdTimeoutFlag();
      	if (g_ucMenuPageIndex>RootMenu)
        {
        	g_ucMenuPageIndex=RootMenu;
          	g_ucMenuItemIndex=0;
          	ExecuteKeyEvent(MIA_RedrawMenu);
      	}
		SaveUserPref();
    }
}


#define ucHoldCount   10
#define ucRptCount   1
void EventProcess(BYTE ucKeyCode)
{
    BYTE ucEvent = MIA_Nothing;

    g_ucKeyRptCount = 0;
    g_ucNextRptCount = ucHoldCount ;
    if ((CurrentMenuItem.KeyEvents[ucKeyCode].cConditions & INPUT_PRESS)&&(CurrentMenuItem.KeyEvents[ucKeyCode].InputType&1<<g_VideoSetting.InputType))
    {
        ucEvent = CurrentMenuItem.KeyEvents[ucKeyCode].PressKeyEvent;
    }
    MenuProcessKey(ucEvent);
}


void EventRepeatProcess(BYTE ucKeyCode, BYTE ucTicks)
{
    BYTE ucEvent = MIA_Nothing;

    if ((CurrentMenuItem.KeyEvents[ucKeyCode].cConditions & INPUT_HOLD)&&(CurrentMenuItem.KeyEvents[ucKeyCode].InputType&1<<g_VideoSetting.InputType))
    {
        g_ucKeyRptCount++;
        if (g_ucKeyRptCount >= (g_ucNextRptCount * ucTicks))
        {
            ucEvent = CurrentMenuItem.KeyEvents[ucKeyCode].PressKeyEvent;
            g_ucKeyRptCount = 0;
            g_ucNextRptCount = ucRptCount;
        }
    }

    MenuProcessKey(ucEvent);
}

void MenuProcessKey(BYTE menuAction)
{
  	if (menuAction)
  	{
     	if(!PowerOnFlag)
        {
        	if (menuAction!=MIA_Power)
                menuAction=MIA_Nothing;
  	    }
      	if (ExecuteKeyEvent(menuAction))
	  	{
          	ResetOsdTimer();
	   	    Clr_OsdTimeoutFlag();
        }
  	}
}

#if TV_ENABLE
void irAdjustNumKey(BYTE ucPressNum)
{
    if (g_bIrNumKeyStart == 0)
    {
        g_ucIrNumKey = ucPressNum;
        g_bIrNumKeyStart = 1;
        g_bIrKeyNumEnd = 0;
        if (g_ucIr100Key==1)
        {
        g_IrCodeParam[0] = ' ';
        g_IrCodeParam[1] = ucPressNum + OSD_0_INDEX;
        g_IrCodeParam[2] = '-';
        g_IrCodeParam[3] = '\0';
        }
#if TV_SYSTEM==TV_NTSC
        else if (g_ucIr100Key==2)
        {
        g_IrCodeParam[0] = '1';
        g_IrCodeParam[1] = ucPressNum + OSD_0_INDEX;
        g_IrCodeParam[2] = '-';
        g_IrCodeParam[3] = '\0';
        }
#endif
	else
	{
        g_IrCodeParam[0] = ' ';
        g_IrCodeParam[1] = ' ';
        g_IrCodeParam[2] = ucPressNum + OSD_0_INDEX;
        g_IrCodeParam[3] = '\0';
	g_bIrKeyNumEnd = 1;
	 g_bIrNumKeyStart = 0;
	}
        g_ucMenuPageIndex = TVInputNumMenu;
        g_ucMenuItemIndex = 0;
        g_ucOsdCounter = 5;
    }
    else
    {
#if TV_SYSTEM==TV_NTSC
	if(g_ucIr100Key==2)
        	g_ucIrNumKey = 100+(g_ucIrNumKey * 10) + ucPressNum; // calculate key number
	else
#endif
        g_ucIrNumKey = (g_ucIrNumKey * 10) + ucPressNum; // calculate key number
        g_ucMenuPageIndex = TVInputNumMenu;
        g_ucMenuItemIndex = 0;
        g_ucOsdCounter = 5;
        g_bIrNumKeyStart = 0;
        g_bIrKeyNumEnd = 1; // ready to change channel
    }
}

void irNumInputMode(void)
{
    if (g_ucIr100Key == 0)
    {
        g_ucIr100Key = 1;
        g_ucIrNumKey = 0; // clear IR key

        g_IrCodeParam[0] = ' ';
        g_IrCodeParam[1] = '-';
        g_IrCodeParam[2] = '-';
        g_IrCodeParam[3] = '\0';

        g_ucMenuPageIndex = TVInputNumMenu;
        g_ucMenuItemIndex = 0;
        Osd_Hide();
        g_ucOsdCounter = 5;
    }
#if TV_SYSTEM==TV_NTSC
    else if(g_ucIr100Key == 1&&(g_TVChSetting.ucTVSource==NTSC_CTV))
    {
        g_ucIr100Key = 2;
        g_ucIrNumKey = 0; // clear IR key

        g_IrCodeParam[0] = '1';
        g_IrCodeParam[1] = '-';
        g_IrCodeParam[2] = '-';
        g_IrCodeParam[3] = '\0';
        g_ucMenuPageIndex = TVInputNumMenu;
        g_ucMenuItemIndex = 0;
        Osd_Hide();
        g_ucOsdCounter = 5;
    }
#endif
else
	{
	        g_ucIr100Key = 0;
	        g_ucIrNumKey = 0; // clear IR key

	        g_IrCodeParam[0] = ' ';
	        g_IrCodeParam[1] = '-';
	        g_IrCodeParam[2] = ' ';
	        g_IrCodeParam[3] = '\0';

	        g_ucMenuPageIndex = TVInputNumMenu;
	        g_ucMenuItemIndex = 0;
	        Osd_Hide();
	       g_ucOsdCounter = 5;
	}
}

BYTE IRKeyToNumber( MenuItemActionType ucCode )
{
    switch( ucCode )
    {
        case MIA_IRKEY_0:   return 0;
        case MIA_IRKEY_1:   return 1;
        case MIA_IRKEY_2:   return 2;
        case MIA_IRKEY_3:   return 3;
        case MIA_IRKEY_4:   return 4;
        case MIA_IRKEY_5:   return 5;
        case MIA_IRKEY_6:   return 6;
        case MIA_IRKEY_7:   return 7;
        case MIA_IRKEY_8:   return 8;
        case MIA_IRKEY_9:   return 9;
        default:		break;
    }
    return 0xFF;
}
#endif

BOOL ExecuteKeyEvent(MenuItemActionType menuAction)
{ BOOL processEvent=TRUE;
  BYTE tempValue;

  while (processEvent)
    {
    	processEvent=FALSE;
  		//printMsg("keypress");
         if (g_bTVAutoScanChannelEnable || g_bTVManualSearchEnable)
        {
            g_bTVAutoScanChannelBreak = TRUE;
            g_bTVManualScanChannelBreak= TRUE;
            return TRUE;
        }

      	switch (menuAction)
        {
        	case MIA_IncValue:
          	case MIA_DecValue:
	   		case MIA_CalendarmonthIncValue:
	   		case MIA_CalendarmonthDecValue:
            if (CurrentMenuItemFunc.AdjustFunction)
              { if (CurrentMenuItemFunc.AdjustFunction(menuAction))
                  { DrawOsdMenuItemValue(g_ucMenuItemIndex, CurrentMenuItem.DisplayValue);
                    Set_SaveSettingFlag();
                  }
              }
            break;
          case MIA_NextItem:
          case MIA_PrevItem:
            tempValue=g_ucMenuItemIndex;
            if (menuAction==MIA_NextItem)
              g_ucMenuItemIndex=GetNextItem(CurrentMenuItems);
            else
              g_ucMenuItemIndex=GetPrevItem(CurrentMenuItems);

/********************************zwtan for ********************************************/
		#if TV_ENABLE
		if(g_ucMenuPageIndex==SystemMenu)
		{
		 if((tempValue==1&&g_ucMenuItemIndex==2)||(tempValue==3&&g_ucMenuItemIndex==2))
		 	{
		 	Osd_SetTextColor(CP_WhiteColor, CP_GrayColor);
		 	Osd_DrawNum(12, 5, g_TVChSetting.ucCurChannelNO);
		 	}
		 if((tempValue==4&&g_ucMenuItemIndex==3)||(tempValue==2&&g_ucMenuItemIndex==3))
		 	{
		 	Osd_SetTextColor(CP_RedColor, CP_GrayColor);
		 	Osd_DrawNum(12, 5, g_TVChSetting.ucCurChannelNO);
		 	}
		 if((tempValue==2&&g_ucMenuItemIndex==1)||(tempValue==3&&g_ucMenuItemIndex==4))
		 	{
		 	Osd_SetTextColor(CP_WhiteColor, CP_GrayColor);
		 	Osd_DrawStr(13, 5, " - ");
		 	}

		 if((tempValue==3&&g_ucMenuItemIndex==4)||(tempValue==5&&g_ucMenuItemIndex==4))
		 	{
		 	Osd_SetTextColor(CP_WhiteColor, CP_GrayColor);
		 	Osd_DrawNum(12, 6, g_TVChSetting.ucCurChannelNO);
		 	}
		 if((tempValue==0&&g_ucMenuItemIndex==5)||(tempValue==4&&g_ucMenuItemIndex==5))
		 	{
		 	Osd_SetTextColor(CP_RedColor, CP_GrayColor);
		 	Osd_DrawNum(12, 6, g_TVChSetting.ucCurChannelNO);
		 	}
		 if((tempValue==4&&g_ucMenuItemIndex==3)||(tempValue==5&&g_ucMenuItemIndex==0))
		 	{
		 	Osd_SetTextColor(CP_WhiteColor, CP_GrayColor);
		 	Osd_DrawStr(13, 6, " - ");
		 	}
		}
		#endif
/********************************************************************************/

		if (tempValue!=g_ucMenuItemIndex)
              {
                DrawOsdMenuItem(tempValue, &CurrentMenuItems[tempValue]);
                DrawOsdMenuItem(g_ucMenuItemIndex, &CurrentMenuItem);
                SystemDelay_translate_To_Dsp_Processor(5);
              }
		break;
          case MIA_JumpAdjustItem:
          case MIA_JumpNaviItem:
            tempValue=g_ucMenuItemIndex;
            g_ucMenuItemIndex+=((menuAction==MIA_JumpAdjustItem)?(1):(-1));
            DrawOsdMenuItem(tempValue, &CurrentMenuItems[tempValue]);
            DrawOsdMenuItem(g_ucMenuItemIndex, &CurrentMenuItem);
            //Delay1ms(300);
            break;
          case MIA_GotoNext:
          case MIA_GotoPrev:
            tempValue=g_ucMenuPageIndex;
            g_ucMenuPageIndex=(menuAction==MIA_GotoNext)?(NextMenuPage):(PrevMenuPage);
            g_ucMenuItemIndex=GetMenuItemIndex(tempValue);
            if(g_ucMenuPageIndex==RootMenu)
	   	SaveUserPref();
            //Delay1ms(150);
/********************************zwtan for ********************************************/
#if TV_ENABLE
            if (g_ucMenuPageIndex==PresetMenu&&!IsTVInUse())
				g_ucMenuPageIndex=ClockMenu;

            if(g_ucMenuPageIndex==AudioMenu||g_ucMenuPageIndex==FunctionMenu||g_ucMenuPageIndex==SystemMenu
			||g_ucMenuPageIndex==PresetMenu||g_ucMenuPageIndex==ClockMenu)
#else
            if(g_ucMenuPageIndex==AudioMenu||g_ucMenuPageIndex==FunctionMenu||g_ucMenuPageIndex==SystemMenu
			||g_ucMenuPageIndex==ClockMenu)
#endif
			  {
			  BYTE kk;
			  Osd_SetTextColor(CP_GrayColor, CP_GrayColor);
			  for (kk=3;kk<=9;kk++)
	 		  	Osd_DrawStr(0, kk, "                       ");
			  }
/********************************zwtan for end********************************************/
          case MIA_RedrawMenu:
            DrawOsdMenu();
            if (CurrentMenu.ExecFunction)
              { tempValue=CurrentMenu.ExecFunction();
              }
            if (!(CurrentMenu.Flags&mpbStay))
              { processEvent=TRUE;
                menuAction=MIA_GotoPrev;
              }
            break;
	    case MIA_ExecFunc:
            if (CurrentMenuItemFunc.ExecFunction)
              {
			tempValue=0;
			tempValue=CurrentMenuItemFunc.ExecFunction();
			if(tempValue)
			{
			}
			processEvent=FALSE;

			#if VGA_ENABLE
			 if(CurrentMenuItemFunc.ExecFunction==AutoColor)
			 {
			 	if (tempValue)
                    	{
                     	 	Osd_SetTextColor(CP_YellowColor, CP_GrayColor);
                      		Osd_DrawStr(24, 5, PassText());
                    	}
                    	else
                    	{
                      		Osd_SetTextColor(CP_RedColor, CP_GrayColor);
                      		Osd_DrawStr(24, 5, FailText());
                    	}
			  	menuAction=MIA_RedrawMenu;
            			processEvent=TRUE;
			 }
			 #endif
              }
            break;

          case MIA_Power:
            if (PowerOnFlag)
              g_ucMenuPageIndex=PowerOffMenu;
	    	else
              g_ucMenuPageIndex=PowerOnMenu;
            g_ucMenuItemIndex=0;
            menuAction=MIA_RedrawMenu;
            processEvent=TRUE;
            break;

//=============================IR Event======================================

	   case MIA_Source:
	   case MIA_IR_SourceSwitch:
            AdjustSource();
            break;
	   case MIA_IncVolume:
	   case MIA_DecVolume:

	   case MIA_IR_IncVolume:
	   case MIA_IR_DecVolume:
	   	if(g_ucMenuPageIndex!=VolumeMenu)
	   	{
               menuAction=MIA_RedrawMenu;
               g_ucMenuPageIndex=VolumeMenu;
               g_ucMenuItemIndex=0;
	        processEvent=TRUE;
	   	}
		else
		{
		 if(menuAction==MIA_IR_IncVolume)
		 	menuAction=MIA_IncValue;
		 if(menuAction==MIA_IR_DecVolume)
		 	menuAction=MIA_DecValue;
		processEvent=TRUE;
		}
            break;

          case MIA_IR_ShowINFO:
	     if(IsSVideoInUse()||IsAVInUse())
	     	{
		 	if(g_ucMenuPageIndex!=ShowSourceMenu)
  	        		g_ucMenuPageIndex=ShowSourceMenu;
			else
				g_ucMenuPageIndex=RootMenu;
	     	}

	#if TV_ENABLE
	     else
	     	{
		 	if(g_ucMenuPageIndex!=ShowTVChannelMenu)
  	        		g_ucMenuPageIndex=ShowTVChannelMenu;
			else
				g_ucMenuPageIndex=RootMenu;
	     	}
            menuAction=MIA_RedrawMenu;
            g_ucMenuItemIndex=0;
	     processEvent=TRUE;
            break;
	#endif

	   case MIA_IR_Mute:
            AdjustMuteStatusValue(MIA_IncValue);
	     menuAction=MIA_RedrawMenu;
            g_ucMenuPageIndex=MuteMenu;
            g_ucMenuItemIndex=0;
            processEvent=TRUE;
      	    break;

	#if CALENDAR_ENABLE
	  case MIA_IR_Calendar:
	  	if (g_ucMenuPageIndex==CalendarMenu)
			break;
	     menuAction=MIA_RedrawMenu;
            g_ucMenuPageIndex=CalendarMenu;
            g_ucMenuItemIndex=0;
            processEvent=TRUE;
	    break;
	#endif

	#if GAME_ENABLE
	  case MIA_IR_Game:
	  	if (g_ucMenuPageIndex==GameMenu)
			break;
	        SetAudioMute();
	        msSetBlueScreen( _ENABLE, FR_BLUE);
	        menuAction=MIA_RedrawMenu;
            g_ucMenuPageIndex=GameMenu;
            g_ucMenuItemIndex=0;
            processEvent=TRUE;
    	    break;
	  case MIA_BlockTurn:
            g_ucGameKeyControlStatus=GK_GameKeyTurn;
    	    break;
	  case MIA_BlockDown:
            g_ucGameKeyControlStatus=GK_GameKeyDown;
    	    break;
	  case MIA_BlockExit:
	     g_ucGameStatus=GS_GameExit;
    	    break;
	  case MIA_GameRestart:
	     g_ucGameStatus=GS_GameReStart;
    	    break;
	  case MIA_BlockLeft:
            g_ucGameKeyControlStatus=GK_GameKeyLeft;
    	    break;
	  case MIA_BlockRight:
            g_ucGameKeyControlStatus=GK_GameKeyRight;
    	    break;
	#endif

⌨️ 快捷键说明

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