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

📄 osd.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#include  "winav.h"

#include <string.h>
#include "osd.h"
#include "cc.h"
#include "utl.h"
#include "w99av.h"
#include "cdinfo.h"
#include "digest.h"
#include "hal.h"
#include "chips.h"
#include "navigate.h"
#include "comutl.h"
#include "setup.h"

#include "osdvp.h"
#include "osdfm.h"

#ifndef NO_MP3
#include "fmanager.h" //"mp3.h"
#endif

#include "gdi.h"
#include "thumb.h"
#include "linear.h"

/////////////////////////////////////////////////////////////////
// ***** Only for testing mode Area *****
#ifdef  _DEBUG_INFO
//#define _DEBUG_STACK_DEEP
//#define _TESTFONT
//#define _DISPLAY_INFO_BY_OSD
#endif  // #ifdef _DEBUG_INFO

//cgz
#define NO_SELECTION


/////////////////////////////////////////////////////////////////////
// ***** Global Variable Area *****
// [1] gcShowStatus structure
// (G-35 bytes)
STATUS  gcShowStatus;

// [2] Top/Bottom Size/ Address
// (G-16 bytes)
//LLY.047, keep the value of OSD_TOP/BOTTOM_ADDR & OSD_TOP/BOTTOM_SIZE to avoid OSD crash
//LLY.172, remove the "initial action" to INITIAL_Variables_PowerOn()
DWORD   _dwTopAddr;
DWORD   _dwBottomAddr;
DWORD   _dwTopSize;
DWORD   _dwBottomSize;
BYTE    *_bpArray; //CoCo2.31, don't initialize it to NULL for code size reduction.

// LLY.161, using "DATA" to put variable in internal SRAM not external SRAM
// Then, we can reduce code size : 1472 BYTE
BYTE    DATA    _bNum;          // indicate font char no while fill _bpArray
BYTE    DATA    _bIdex;         // indicate the index while copy data to _bpArray
BYTE    DATA    _bPosiIndex;    // start position of "_bIndexArray" in "_wFontsArray"
BYTE *  DATA    _bIndexArray;  // point to a designed array of "fonts index" //CoCo2.31, don't initialize it to NULL for code size reduction.

// [8] The variable for search/ goto time mode
// (G-6 bytes)
// DVD.036, the reference for title/chapter display
BYTE    _bDispTitle;
WORD    _wDispChapter, _wDispChapter_Ns_Title;
// _bTimeIndex can be used only of GOTOTIME
//BYTE    _bTimeIndex=0xff;       // record current gotime input digits //--CoCo1.21, _bTimeIndex is a fixed value.
BYTE    _bTimeIndex; //CoCo2.31, don't initialize it to NULL for code size reduction.
BYTE    __bMsgString[MAXNO_OF_MSG_STRING+1];
#ifdef SHOW_6_DISPLAY_MODE
DWORD __dwDisplayStartTimer; //xuli1.07,for LD mode, record the non-time region display time and clear these region after 3 seconds
BYTE __bTitleMenu; //xuli1.07 to record dvd/vcd display mode menu state //CoCo2.31, don't initialize it to NULL for code size reduction.
BYTE __bRootMenu;  //CoCo2.31, don't initialize it to NULL for code size reduction.
#endif	//#ifdef SHOW_6_DISPLAY_MODE

// the group type for message
BYTE    _bMessageGroup; //CoCo2.31, don't initialize it to NULL for code size reduction.

WORD    _wOSDTemp, _wOSDTemp1;
BYTE    _bOSDTemp, _bOSDTemp1; //CoCo1.21, remove _bOSDTemp2
DWORD   _dwAddr; // keep the region address which current display message
//DWORD   _dwAddr1; // keep the region address which current display message //--CoCo1.21, remove it because no one use it.

WORD    _wStartPxl;  // keep start/end pixel for color change //CoCo1.21, remove _wEndPxl

BYTE    DATA    _bOSDLang;           // keep current osd language

// LLY.170, keep the desired output format for _OSD_ShowItemInfo()
BYTE    DATA    _bItemInfoFormat;

// record the Scan or slow factor
BYTE    _bSpeedFactor; // only support 0 ~ 255

BIT     _bOSDInitial = FALSE;      // OSD intial has not completed //CoCo2.34, must initialize it here to prevent the power on problem.
// LLY.276p, expand the __bLOGO meaning, and remove the initial action into INITIAL module
// 0, no logo or JPG picture as background (LOGO_NONE)
// 1, w/ DVD player's LOGO (LOGO_DEFAULT)
// 2, w/ JPG picture (LOGO_JPEG)
BYTE    __bLOGO; // FALSE;

BYTE    _bOSDAppMode;  // keep OSD mode
// LLY.099c, keep waiting count, default value is 2 -- see three dot at initial status
BYTE    _bWaitingCnt; //CoCo2.31, don't initialize it to NULL for code size reduction.

extern BYTE _bOSDVPStage;
//---------------------------------------------------------------------------------


////////////////////////////////////////////////////////////////////
void    _OSD_ShowDigestNumber(WORD wValue);
BYTE    _OSD_ShowLogo(void);
void    _OSD_UpdateStatus(BYTE bMessage, WORD wParam, BYTE bSec); //CoCo1.21, the return value is not used.
BYTE    _OSD_FilterDisplayInfor(BYTE bMessage);
BYTE    _OSD_MessageGroup(BYTE bMessage);
void _OSD_ShowDisplayMode(void); // Brian0.86
void _ClearAngleMsgFromStack(void); // Brian0.87
void _ClearNUGroupMsgFromStack(BYTE bMessage); // Brian0.87-3rd
void _RecoverNUNBMessage(void);


extern void OSDSRCH_Search(BYTE bMessage, WORD wParam, BYTE bSec);
extern void OSDSRCH_GoToTime(BYTE bMessage, WORD wParam, BYTE bSec);

//Alex1.21,support bookmark
#ifdef SUPPORT_BOOKMARK
extern void OSDSRCH_BookMark(BYTE bMessage, WORD wParam, BYTE bSec);
#endif //#ifdef SUPPORT_BOOKMARK

//extern void	OSDPRGM_Display(bMessage, wParam, bSec);
extern void	OSDPRGM_Display(bMessage); //CoCo1.21, modify the function declaraction

#ifdef SHOW_POWERON_BAR //Xuli1.05 defined in module OSDVP
extern void OSD_ShowPoweronBar(WORD wParam);
#endif

void _OSD_DisplayVP(void); //CoCo1.21
void _OSD_DisplayLD(void); //CoCo1.21
////////////////////////////////////////////////////////////

// Brian0.86
// Auto-upgrade Message
// Brian1.21-3
WORD code aUpgradeFlash[] = {20, CHAR_W, CHAR_ii, CHAR_nn, CHAR_D, CHAR_V, CHAR_D, CHAR_SPACE, CHAR_F, CHAR_ll, CHAR_aa, CHAR_ss, CHAR_hh, CHAR_SPACE, CHAR_V, CHAR_ee, CHAR_rr, CHAR_ss, CHAR_ii, CHAR_oo, CHAR_nn};
//WORD code aUpgradeFlash[] = {20, CHAR_W, CHAR_ii, CHAR_nn, CHAR_D, CHAR_V, CHAR_D, CHAR_SPACE, CHAR_F, CHAR_ll, CHAR_aa, CHAR_ss, CHAR_hh, CHAR_SPACE, CHAR_P, CHAR_rr, CHAR_oo, CHAR_gg, CHAR_rr, CHAR_aa, CHAR_mm};
WORD code aUpgradePrrpareData[] = {12, CHAR_P, CHAR_rr, CHAR_ee, CHAR_pp, CHAR_aa, CHAR_rr, CHAR_ee, CHAR_SPACE, CHAR_D, CHAR_aa, CHAR_tt, CHAR_aa};
WORD code aUpgradeCheck[] = {13, CHAR_R, CHAR_ee, CHAR_aa, CHAR_dd, CHAR_yy, CHAR_SPACE, CHAR_T, CHAR_oo, CHAR_SPACE, CHAR_B, CHAR_uu, CHAR_rr, CHAR_nn};
WORD code aUpgradeAnswer[] = {10, CHAR_1, CHAR_DASH, CHAR_Y, CHAR_ee, CHAR_ss, CHAR_SLASH, CHAR_2, CHAR_DASH, CHAR_N, CHAR_oo};
WORD code aUpgradeAbort[] = {21, CHAR_A, CHAR_bb, CHAR_oo, CHAR_rr, CHAR_tt, CHAR_SPACE, CHAR_U, CHAR_pp, CHAR_gg, CHAR_rr, CHAR_aa, CHAR_dd, CHAR_ee, CHAR_SPACE, CHAR_P, CHAR_rr, CHAR_oo, CHAR_gg, CHAR_rr, CHAR_aa, CHAR_mm};
WORD code aUpgradeCheckSUM[]={17, CHAR_C, CHAR_hh, CHAR_ee, CHAR_cc, CHAR_kk, CHAR_S, CHAR_U, CHAR_M, CHAR_SPACE, CHAR_C, CHAR_oo, CHAR_uu, CHAR_nn, CHAR_tt, CHAR_ii, CHAR_nn, CHAR_gg};
WORD code aUpgradeWriting[] = {16, CHAR_F, CHAR_ll, CHAR_aa, CHAR_ss, CHAR_hh, CHAR_SPACE, CHAR_W, CHAR_rr, CHAR_ii, CHAR_tt, CHAR_ii, CHAR_nn, CHAR_gg, CHAR_DOT, CHAR_DOT, CHAR_DOT};

//alex1.24a,Show error message when autoupgrade error
//-----------------------------------
WORD code aUpgradeFailDecode[]=     {11, CHAR_F, CHAR_aa, CHAR_ii, CHAR_ll, CHAR_SPACE, CHAR_D, CHAR_ee, CHAR_cc, CHAR_oo, CHAR_dd, CHAR_ee};
WORD code aUpgradeFailUserAbort[]=  {15, CHAR_F, CHAR_aa, CHAR_ii, CHAR_ll, CHAR_SPACE, CHAR_U, CHAR_ss, CHAR_ee, CHAR_rr, CHAR_SPACE, CHAR_A, CHAR_bb, CHAR_oo, CHAR_rr, CHAR_tt};
WORD code aUpgradeFailInvalidDisc[]={17, CHAR_F, CHAR_aa, CHAR_ii, CHAR_ll, CHAR_SPACE, CHAR_I, CHAR_nn, CHAR_vv, CHAR_aa, CHAR_ll, CHAR_ii, CHAR_dd, CHAR_SPACE, CHAR_D, CHAR_ii, CHAR_ss, CHAR_cc};
WORD code aUpgradeFailCheckSum[]=   {13, CHAR_F, CHAR_aa, CHAR_ii, CHAR_ll, CHAR_SPACE, CHAR_C, CHAR_hh, CHAR_ee, CHAR_cc, CHAR_kk, CHAR_S, CHAR_uu, CHAR_mm};
//-----------------------------------

/////////////////////////////////////////////////////////////////////////////

// [6] The message checking array -- LLY.099c
BYTE  code aMsgChk[MAX_MSGNO_FOR_CHECK]=
{
	//#ifndef  NO_OSD
#include "msgchk.txt"
	//#else   // #ifndef NO_OSD
	//0
	//#endif  // #ifndef NO_OSD
};

BYTE _bVolDisplayed;
BYTE _bIsDisplayModeMessage;

OSDMESSAGE _OSDNUCurMsg;
OSDMESSAGE _OSDNBCurMsg;
OSDMESSAGE *_pOSDCurMsg;
OSDMESSAGE _OSDNUStack[MAX_DEPTH_OF_MSG_STACK];
OSDMESSAGE _OSDNBStack[MAX_DEPTH_OF_MSG_STACK];
OSDMESSAGE *_pOSDStack;
BYTE _bOSDNUIndex;
BYTE _bOSDNBIndex;
BYTE *_pbOSDStackIndex;
DWORD _dwOSDNUStartTickCount; // the reference start ticks for down count
WORD    _wOSDNUDisplayTickCount; // OSD display ticks, down count in OSD_Trigger
DWORD _dwOSDNBStartTickCount; // the reference start ticks for down count
WORD    _wOSDNBDisplayTickCount; // OSD display ticks, down count in OSD_Trigger
BYTE _bCurrentUI, _bPreviousUI; // OSD_UI_NONE, OSD_UI_DISPLAY, OSD_UI_SETUP, OSD_UI_MP3, OSD_UI_CDDA, OSD_UI_THUMBNAIL
BYTE    _bNBTimeOut; // Brian1.07a
BYTE    _bNUTimeOut; //CoCo2.39, fix the recovery problem.

// LLY.101, re-modify the procedure -- combine initialize and run-time stage
//  ***************************************************
//  Function    :   OSD_FillHeadtoDRAM
//  Description :   Load OSD header part to DRAM
//  Arguments   :   bStage, specify the desired stage for fill OSD header
//                  OSD_FILLHEADER_INITIAL, initial stage
//                  OSD_FILLJEADER_RUNTIME, runtime stage
//  Return      :   none
//  Side Effect :
//  ***************************************************
// Notice: Must add "#pramga NOAREGS" w/ each APIs if it will be called by OSD_FillHeadtoDRAM()
// So, if anyone add any function with OSD_FillHeadtoDRAM(), please check it more
// Current sub-APIs with will be called by OSD_FillHeadtoDRAM()
// [1] HAL_RedrawVCD30Area : Done !!
#pragma NOAREGS          // may be called in ISR
void OSD_FillHeadtoDRAM(BYTE bStage)
{
#ifndef  NO_OSD
	
	extern WORD __wGDIStartX, __wGDIStartY; // used only for GDI_MoveRegion
	
    /// Brian2.39, Adjust OSD region position
	OSD_AdjustOSDPos();

	
    if (__bThumbnailMode
        && bStage != OSD_FILLHEADER_ENTER_SETUP) // Brian1.22
    {
#ifdef MINI_OSD_REGION // Brian2.30b
         if (__bSetupMode) // I hope it means exitting from setup in this case
            {
                _OSD_SetNormalOSDRegion();
            }
#endif

        THUMBNAIL_Recover(OSD_MSG_RECOVER_ALL);
    }
	
#endif  // #ifndef NO_OSD
}


// Brian2.39, Adjust OSD region position
#pragma NOAREGS          // may be called in ISR
void OSD_AdjustOSDPos(void)
{
#ifndef  NO_OSD
	
	extern WORD __wGDIStartX, __wGDIStartY; // used only for GDI_MoveRegion
	
    // Brian0.86
    // Adjust OSD region position
    _bPosiIndex = __bCurrentRegionId;
	
    for (_bIdex=0; _bIdex<2; _bIdex++)
    {
        __bCurrentRegionId = _bIdex;
        if (__SetupInfo.bProgressiveScan == SETUP_PROGRESSIVE_SCAN_ON)
        {
            if (__bMPEGVideoMode == MPEG_VIDEO_MODE_NTSC)
            {
                __wGDIStartX = REGION_X_NTSC;
                //__wGDIStartY = REGION_Y_NTSC - 10;
                __wGDIStartY = REGION_Y_NTSC - 5;
            }
            else
            {
                __wGDIStartX = REGION_X_PAL-4;
                //__wGDIStartY = REGION_Y_PAL - 12;
                __wGDIStartY = REGION_Y_PAL - 4;
				
            }
        }
        else
        {
            if (__bMPEGVideoMode == MPEG_VIDEO_MODE_NTSC)
            {
                __wGDIStartX = REGION_X_NTSC;
                __wGDIStartY = REGION_Y_NTSC;
            }
            else
            {
                __wGDIStartX = REGION_X_PAL;
                __wGDIStartY = REGION_Y_PAL;
            }
        }
		
        GDI_MOVE_REGION(__wGDIStartX, __wGDIStartY);
		
    }
	
    __bCurrentRegionId = _bPosiIndex;
	
	
#endif  // #ifndef NO_OSD
}


	
//  LLY.105 re-modify -- remove the "pop message" action to _OSD_UpdateMsgStack
//  *********************************************************************
//  Function    :   _OSD_UpdateStatus
//  Description :   To update the gcShowStatus information and auto remove
//                  some messages from message stack
//  Arguments   :   bMessage    : the input message
//                  wParam      : parameter for this message
//                  bSec        : the message display time
//  Return      :   TRUE        : gcShowStatus is updated
//              :   FALSE       : gcShowStatus is not updated
//  Side Effect :
//  *********************************************************************
void _OSD_UpdateStatus(BYTE bMessage, WORD wParam, BYTE bSec) //CoCo1.21, the return value is not used.
{
	switch(bMessage)
	{
		// LLY.0991, keep OSD mode in _bOSDAppMode
		// becasue in non-normal OSD mode, all other message will be throw
	case    MSG_SETUP_MAIN_BASE:
		if(bSec)
			_bOSDAppMode=OSD_APPMODE_SETUP;
		else
			_bOSDAppMode=OSD_APPMODE_NORMAL;
		break;
		// LLY.160, merge MSG_OSDGAME and MSG_SCR into MSG_OSDAPP
	case    MSG_OSDAPP:
		_bOSDAppMode=(BYTE)wParam;
		break;
		
		// DVD022, rename _btMP3Mode to gcShowStatus.bMP3Mode
	case    MSG_MP3_MENU:
#ifndef  NO_MP3
		if(__bFMMenuID != FM_MENU_NONE) // enter MP3 playing control menu
		{
			//gcShowStatus.bMP3Mode=TRUE; //--CoCo1.21, remove it because no one use it.
			// DVD022, let display mode is disable while in MP3 playing menu
			gcShowStatus.bOsdDisplay=FALSE;
		}
#endif  // #ifndef NO_MP3
		break;
		
	case    MSG_TOTALTRACKS:
		gcShowStatus.wTotalTracks=wParam;
		break;
		
	case    MSG_STOPWAIT:
		_bWaitingCnt=2; // LLY.099c, clear waiting count to default value
		// if wParam is TRUE, copy the StatusInfo to gcShowStatus directly
		if(wParam)
		{
			// set the system information to gcShowStatus
			// Error pointer
			// gcShowStatus = *((STATUS *) wParam);
			gcShowStatus = *((STATUS *) __bpDataPointer);
			__bpDataPointer=NULL;
		}
		break;
		//LJY1.20, support 4M flash, remove digest
#ifndef NO_DIGEST        
	case    MSG_DIGEST:
		if (wParam)
			__bLOGO=LOGO_NONE; //FALSE;		
		break;
#endif
		
	case    MSG_ENDLIST:    // LLY.050
		gcShowStatus.bPlayingMode=MSG_STOP;
		break;
	case    MSG_PBC:
		// update the PBC status
		gcShowStatus.bPBCMode=LOBYTE(wParam);
		if(__wDiscType & BOOK_DVD)
		{
		}
		else
		{
			gcShowStatus.bStill=LOBYTE(wParam);
		}
		break;
		//CoCo.101, fix the bug about the PROGRAM recovery is error.
	case    MSG_SETPROGRAM:
		// update the first time set program
		gcShowStatus.bSetProgram=TRUE; //CoCo.program
		break;
		// f/w 0.43
	case    MSG_CLEARPROGRAM:
		// clear the PROGRAM mode status
		gcShowStatus.bSetProgram=FALSE;
		break;
	case    MSG_PLAYING:
	case    MSG_STEP:
	case    MSG_FAST:
	case    MSG_STOP:

⌨️ 快捷键说明

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