📄 osdbasic.c
字号:
//osd_basic.c
// ver0.11 2/1x/2001 Change display format from hex to decimal
// 1.32 LJY11262001 .Add border features to OSD window
// 1.70 LJY05302003 .Support a menu with external OSD.
#include "Config.h"
#include "typedefs.h"
#include "i2c.h"
#include "main.h"
#include "tw88.h"
#include "osdbasic.h"
#include "dispinfo.h"
#include "measure.h"
#include "debug.h"
#include "printf.h"
#include "udfont.h"
#include "regmap.h"
extern CODE struct RegisterInfo UserRange;
///#ifdef TW8803
CODE BYTE ZoomAttr[]={ 0, 0, 0x40, 0x80, 0xc0 };
///#else
///CODE BYTE ZoomAttr[]={ 0, 0, 0x04, 0x08, 0x0c };
///#endif
//IDATA struct BarInfo BarInfo;
IDATA struct OSDStrInfo OSDStrInfo;
extern bit I2CAutoIncFlagOn ;
//extern IDATA BYTE I2CAddr, I2CIdx, I2CData;
//********************************************************************
//
// Font
//
//********************************************************************
//----------------------------------------------------------------
// Data2FontRAM
//----------------------------------------------------------------
//
// The followings are structure of FONT RAM
// ........... 1 byte .....................................
// -------------------------------------------------------- .
// | First 32 byte data for every characters in FONT RAM | .
// | That is, first 1 byte data for first font char, | .
// | first 1 byte data for second font char, | 32 bytes
// | first 1 byte data for third font char. | .
// | .. | .
// | .. | .
// -------------------------------------------------------- .
// | Second 32 byte data for every characters in FONT RAM | .
// | That is, second 1 byte data for first font char, | .
// | second 1 byte data for second font char, | 32 bytes
// | second 1 byte data for third font char. | .
// | .. | .
// | .. | .
// -------------------------------------------------------- .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// | | .
// -------------------------------------------------------- 1024 bytes
//
/*
void ClearOSDRAM(BYTE attr)
{
WriteTW88(TW88_OSDRAMDATALO, attr);
WriteTW88(TW88_ENABLERAM, 0x02); // OSD RAM Auto Clear with attr.
while( ReadTW88(TW88_ENABLERAM) & 0x02 );
}
*/
void WaitEndofDisplayArea(void)
{
#ifdef TW8804D
BYTE ret,i;
ret = ReadTW88(OSDWINSTATUS) & 0x40;
for(i=0;i<10;i++){
if( ret^ (ReadTW88(OSDWINSTATUS)&0x40)) break;
}
#endif
}
//=============================================================================
// Download OSD Color Look up
//=============================================================================
void Change_OSDColorLookup(void)
{
BYTE i,j,dt;
#ifdef DEBUG_CCEDS
Printf("\r\n --- Change_OSDColorLookup to Table ");
#endif
for(j=0; j<2; j++)
{
for(i=0; i<8; i++)
{
dt = ReadTW88(0x9c);
dt &= 0xf0;
WriteTW88(0x9c, i+j*8);
WriteTW88(0x9d, OSD_Color_LookUp_Data_Table[j][i]);
}
}
}
#ifdef SUPPORT_TW88_CC_DECODER
void Reset_OSDColorLookup(void)
{
BYTE i,dt;
CODE BYTE tt[] = {0x00,0x03,0x1C,0x1F,0xE0,0xE3,0xFC,0xFF};
#ifdef DEBUG_CCEDS
Printf("\r\n --- Reset_OSDColorLookup");
#endif
for(i=0; i<8; i++) {
dt = ReadTW88(0x9c);
dt &= 0xf0;
WriteTW88(0x9c, i);
WriteTW88(0x9d, tt[i]);
}
}
#endif
//=============================================================================
// Download RAM Font Data
//=============================================================================
void DownloadFont(BYTE cod, CODE_P BYTE *fontdata)
{
WriteTW88(TW88_ENABLERAM, ReadTW88(TW88_ENABLERAM) | 0x01); // Font RAM access mode
WriteTW88(TW88_FONTRAMADDR, cod);
WriteTW88(0xff, ReadTW88(0xff) | 0x10); // Disable I2C index auto increment during multi-write
WriteI2Cn( TW88I2CAddress, TW88_FONTRAMDATA, fontdata, 27 );
WriteTW88(TW88_ENABLERAM, ReadTW88(TW88_ENABLERAM) & 0xfe); // OSD RAM access mode
}
void DownloadUDFont(void)
{
BYTE i;
WriteTW88(TW88_MULTISTART, COLORFONT_START); // Set Color Font Start Address.
for(i=0; i< NO_UDFONT && i<= MAX_FONT_RAM_CHARS ; i++) {
DownloadFont(i, RAMFONTDATA[i]);
}
}
//*****************************************************************************
// OSD Window internal subfunction for TW88xx
//*****************************************************************************
#ifdef SUPPORT_TW88_CC_DECODER
void EnableOSDRAMAndChangeFont(BYTE type)
{
BYTE dt;
dt = ReadTW88(TW88_ENABLERAM);
if( type==FONT_ROM ) dt &= 0x7f;
else dt |= 0x80;
WriteTW88(TW88_ENABLERAM, dt);
}
#endif
//*****************************************************************************
// Functions for TW88xx internal OSD
//*****************************************************************************
#ifdef SUPPORT_CCD_VCHIP
void ClearOSD_TW88()
{
BYTE i;
for(i=1; i<=MAX_OSDWINDOW_TW88; i++) {
ShowOSDWindow_TW88(i,FALSE);
}
}
#endif
//-----------------------------------------------------------------------------
// CreateOSDWindow_TW88
// winno: 1,2,3,4
// x: based on pixel not char.(8 pixels per 1 step).
// y: based on lines not char.(4 lines per 1 step).
// w: based on char.(1 character width per 1 step)
// h:
// sa: start address
// attr: BG_COLOR | ZOOM | SHOW
//-----------------------------------------------------------------------------
/*#ifdef SUPPORT_CCD_VCHIP
void CreateOSDWindow_TW88(BYTE winno, BYTE x, BYTE y, BYTE w, BYTE h, WORD sa, BYTE attr)
{
BYTE zoom_attr, new_attr;
if( winno<1 || winno>8 ) return;
SetOSDWindowNum(winno); // * set winno
SetOSDWindowX_TW88(winno, x); // * set x
SetOSDWindowY_TW88(winno, y); // * set y
WriteTW88(TW88_WINWIDTH, w); // * set w width(1 character width per 1 step)
WriteTW88(TW88_WINHEIGHT, h); // * set h height(1 character height per 1 step)
zoom_attr = (attr & 0x07)-1;
zoom_attr = zoom_attr*0x40 + zoom_attr*0x10 + (sa>>8);
WriteTW88(TW88_WINZOOM, zoom_attr);
WriteTW88(TW88_WINSADDRLO, sa); // * set sa start address of OSD RAM
new_attr = attr & 0xf0; //for color
if( attr & SHOW ) new_attr |= 0x01;
WriteTW88(TW88_WINATTR, new_attr); // attribute
// Disable all other functions
WriteTW88( TW88_WINBRDATTR, 0x00 );
WriteTW88( TW88_WINBRDWIDTH, 0x00 );
WriteTW88( TW88_WINBRDHEIGHT, 0x00 );
WriteTW88( TW88_WINSPACE, 0x00 );
WriteTW88( TW88_WINSHADOW, 0x00 );
WriteTW88( TW88_WINBLENDING, 0x00 );
WriteTW88( TW88_WINCHEFFECT, 0x00 );
#ifdef DEBUG_OSD
dPrintf("\r\n++(CreateOSDWindow_TW88) wino:%bd,", winno-1 );
dPrintf("attr:0x%bx, new_attr:0x%bx __", attr, new_attr);
#endif
}
#endif // SUPPORT_CCD_VCHIP
//#endif // SUPPORT_TW88_CC_DECODER
*/
#ifdef SUPPORT_OSDPOSITIONMOVE
void SetOSDWindowX_TW88(BYTE winno, BYTE x)
{
WORD tmp;
BYTE dat;
if( winno<1 || winno>8 ) return;
SetOSDWindowNum(winno);
tmp = x << 3;
dat = ReadTW88(TW88_WINSTART_HI) & 0xf0;
dat = dat | (tmp>>8);
WriteTW88(TW88_WINSTART_HI, dat);
WriteTW88(TW88_WINXSTART, tmp);
}
#endif
void SetOSDWindowY_TW88(BYTE winno, BYTE y)
{
WORD tmp;
BYTE dat;
if( winno<1 || winno>8 ) return;
SetOSDWindowNum(winno);
tmp = y << 2;
dat = ReadTW88(TW88_WINSTART_HI) & 0x0f;
dat = dat | ((tmp>>8)<<4);
WriteTW88(TW88_WINSTART_HI, dat);
WriteTW88(TW88_WINYSTART, tmp);
}
//#if (defined SUPPORT_TW88_CC_DECODER)
//ljy052903: CC + Info
//=============================================================================
// ShowOSDWindow_TW88
//=============================================================================
void ShowOSDWindowAll(BYTE on)
{
BYTE rd;
WaitEndofDisplayArea();
rd = ReadTW88(TW88_OSDLOCKUPSEL);
if( on )
WriteTW88(TW88_OSDLOCKUPSEL, rd&0xef); //
else
WriteTW88(TW88_OSDLOCKUPSEL, rd|0x10); // OSD All Off (TW8806B)
}
void ShowOSDWindow_TW88(BYTE winno, BYTE onoff)
{
BYTE rd;
if( winno<1 || winno>8 ) return;
SetOSDWindowNum(winno);
rd = ReadTW88(TW88_WINATTR);
if( onoff ) rd |= 0x01;
else rd &= 0xfe;
WaitEndofDisplayArea();
WriteTW88(TW88_WINATTR, rd);
}
#ifdef SUPPORT_OSDPOSITIONMOVE
WORD GetOSDWindowX(BYTE winno)
{
WORD x;
if( winno<1 || winno>8 ) return 0;
SetOSDWindowNum(winno);
x = (ReadTW88(TW88_WINSTART_HI) & 0x0f) << 8;
x = x | ReadTW88(TW88_WINXSTART);
return (BYTE)(x >> 3);
}
#endif
WORD GetOSDWindowY(BYTE winno)
{
WORD y;
if( winno<1 || winno>8 ) return 0;
SetOSDWindowNum(winno);
y = (ReadTW88(TW88_WINSTART_HI) & 0xf0) << 4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -