📄 osd.c
字号:
#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 + -