osdmenu.c
来自「此程序为twell8806驱动程序」· C语言 代码 · 共 2,135 行 · 第 1/4 页
C
2,135 行
#endif
default:
DisplayCursor();
// DrawNum( (CODE_P struct NumType *)ptr, GetItemValue(MenuChild[cursor_item].Id) );
break;
}
return;
/*case TIME:
val_index = HOUR;
val = GetItemValue(MenuChild[cursor_item].Id);
if( val_index == HOUR )
DrawTime( val,
((CODE_P struct TimeType *)ptr)->CursorColor,
((CODE_P struct TimeType *)ptr)->TimeColor);
else
DrawTime( val,
((CODE_P struct TimeType *)ptr)->TimeColor,
((CODE_P struct TimeType *)ptr)->CursorColor);
return; */
//case ENUM_STRING:
// OnChangingValue = 1;
/*DrawYesNo( (CODE_P struct YesNoType *)ptr,cursor_item+1,val );*/
//DrawAttrCnt( addr, ACTIVE_COLOR, MENU_WIDTH-MAX_DESC+ICON_CH_SZ );
// return;
#ifdef SUPPORT_CCD_VCHIP
case NUMBER_STRING:
OnChangingValue = 1;
val_index = 0;
Display_EnterPin();
return;
#endif //SUPPORT_CCD_VCHIP
case OSDMENU:
case CHOICEMENU:
#ifdef SUPPORT_CCD_VCHIP
if( (MenuChild[cursor_item].Id ) == CHK_PASSWORD )
{
if( (ValidPassword(OSDNumberString, val_index) ) && (VchipCheckingOnPass_Flag == 1) )
VchipCheckingOnPass_Flag = 0;
else
{
BYTE len;
ClearDataCnt(OSDMENU_SUBADDR, MenuFormat->width*(MENU_HEIGHT+1)); // Clear submenu Window all .
len = strlen(Str_Vchip[OSDLang]);
WriteStringToAddr(OSDMENU_SUBADDR, Str_Vchip[OSDLang], len);
Display_EnterPin();
VchipCheckingOnPass_Flag = 1;
val_index = 0;
return;
}
}
#endif
if(OSDMenuLevel == 1) {
addr = OSDMENU_MAINADDR + cursor_item*MenuFormat->width + 0;
//DrawAttrCnt(addr, CURSOR_COLOR, 2); // TOP Menu Icon Selected by color
// 3D Effect Cursor Bottom
WriteDecoder(TW88_WINNUM, OSDCURSORWINDOW-1);
WriteDecoder(TW88_WINATTR, OSD_Window_Attr(WINDOW_3D_BOTTOM,BG_COLOR_BLACK|EXTENDED_COLOR,0,WINDOW_3D_ENABLE,WINDOW_ENABLE));
}
OSDMenuLevel++; // Down Menu tree.
pushMenu(); // Push MenuTitle, title_item in stack.
MenuTitle = MenuChild;
title_item = cursor_item;
MenuFormat = ( CODE_P struct MenuType *) MenuTitle[title_item].TypeData;
MenuChild = MenuTitle[title_item].Child;
cursor_item = Get_cursor_item( MenuTitle[title_item].Id );
if( cur_osdwin == OSDMENU_TOPWIN ) // Window #4
cur_osdwin = OSDMENUWINDOW; // Window #3
else
DisplayOSDMenu();
DisplayCursor();
break;
}
//} while( cursor_item!=NIL && MenuChild[cursor_item].ActiveWithCursor==YES );
}
#ifdef SUPPORT_CCD_VCHIP
void Display_EnterPin(void)
{
extern CODE BYTE *Enter_Password_Str[];
WORD addr;
CODE_P BYTE *Str;
BYTE len;
Str=Enter_Password_Str[OSDLang];
len=strlen(Str);
DrawAttrCnt(OSDMENU_SUBADDR + MENU_WIDTH, DEFAULT_COLOR, MENU_WIDTH*(MENU_HEIGHT-1));
addr = OSDMENU_SUBADDR + MENU_WIDTH*4;
WriteStringToAddr(addr, Str, len);
}
void OSDNumber( BYTE num )
{
WORD addr;
CODE BYTE Str_X[]={"X"};
if(( OnChangingValue && MenuChild[ cursor_item ].Type == NUMBER_STRING ) ||
( VchipCheckingOnPass_Flag == 1 ))
{
if( val_index < 4) {
OSDNumberString[val_index] = num;
addr = OSDMENU_SUBADDR + 4*MENU_WIDTH + 16 + val_index ;
WriteStringToAddr(addr, Str_X, 1);
val_index++;
if(( val_index == 4 ) && ( (MenuChild[cursor_item].Id ) == CHK_PASSWORD) )
OSDSelect();
}
else
{
val_index=0;
Display_EnterPin();
}
}
}
#endif //SUPPORT_CCD_VCHIP
#ifdef PAL_TV
void ChannelEdit_Window(void)
{
pushMenu();
MenuTitle = MenuChild;
title_item = cursor_item;
OSDMenuLevel++;
MenuChild = 0;
cursor_item = NIL;
DrawMenulist(1); // Display Title
ChannelEdit_display();
}
void ChannelEdit_display(void)
{
BYTE i,j,row;
WORD addr;
BYTE mstr[5] = { "-----" };
CODE BYTE NULL_Str[] = {"-----"};
CODE BYTE ChannelEdit_Str[][25]={
{ " Ch. Name Skip " },
{ " -- ----- Yes " },
{ " " },
{ "" }
};
extern PDATA BYTE TVChannel;
ChannelEdit_on = 0;
DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH, DEFAULT_COLOR, MENU_HEIGHT*MENU_WIDTH ); // Clear color
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH, ChannelEdit_Str[0], MENU_WIDTH ); // Draw Head line
i = (TVChannel-1)/6; // Current page
i = i*6;
i++;
for ( row=2; row<8; row++, i++ )
{
if(i>99)
{
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*row, ChannelEdit_Str[2], MENU_WIDTH ); // Draw Head line
}
else {
// Channel No
mstr[0] = '0';
if(i/10) { mstr[0] = i/10 + '0'; j=i/10*10; }
else j=0;
mstr[1] = i-j + '0';
mstr[2] = 0;
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*row+2, mstr, 2 );
//Printf("\r\n TVChannel:%d, i:%d, mstr:%s ",(WORD)TVChannel,(WORD)i,mstr);
// Channel Name
addr = FIRST_SAVEDPR+TVCHNAME + i*BYTEPERCHANNEL;
if( ReadEEP( addr ) == 0xff )
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*row+10, NULL_Str, 5 );
else{
for(j=0; j<5; j++, addr++)
mstr[j] = ReadEEP( addr );
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*row+10, mstr, 5 );
}
//Printf(" Name== mstr:%s ",(WORD)i,mstr);
// Status of Skip
{
extern CODE BYTE StereoMomoYesNo[];
DrawStringByLang( OSDMENU_SUBADDR+MENU_WIDTH*row+19, (CODE_P struct EnumType *)SkipYesNo,
( GetTVPrSystem(i) & SKIPCHN_MASK ) ? CLEARED_CHN : SAVED_CHN );
}
if(i==TVChannel)
DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH*row, CURSOR_COLOR, MENU_WIDTH ); // Clear color
}
}
WriteStringToAddr( OSDMENU_SUBADDR+MENU_WIDTH*8, Str_Comments1, MENU_WIDTH ); // Comment
DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*8+5, Color_Comments1, 20 ); // Clear color
}
void ChannelEdit_Move(BYTE flag)
{
BYTE buf, i;
WORD addr;
addr = FIRST_SAVEDPR + TVChannel*BYTEPERCHANNEL;
if( flag == UP ) {
if( TVChannel == 1 ) return; // Min Channel
for(i=0; i<9; i++) {
buf = ReadEEP( addr+i );
WriteEEP( addr+i, ReadEEP( addr-9+i ) );
WriteEEP( addr-9+i, buf );
}
TVChannel--;
}
else {
if( TVChannel == TOTAL_PR ) return; // Max Channel
for(i=0; i<9; i++){
buf = ReadEEP( addr+i );
WriteEEP( addr+i, ReadEEP( addr+9+i ) );
WriteEEP( addr+9+i, buf );
}
TVChannel++;
}
SetTVPrEE();
ChannelEdit_display();
}
void ChannelEdit_Skip(void)
{
if( GetTVPrSystem(TVChannel) & SKIPCHN_MASK ) SetTVPrSystem(TVChannel, 0); // Not skip
else SetTVPrSystem(TVChannel, SKIPCHN_MASK);
ChannelEdit_display();
}
CODE BYTE EDIT_CURSOR_ATTR[] = { CH_COLOR_YELLOW|BG_COLOR_BLUE, 0 };
CODE BYTE EDIT_NORMAL_ATTR[] = { CURSOR_COLOR, CURSOR_COLOR, CURSOR_COLOR, CURSOR_COLOR, CURSOR_COLOR, 0};
void ChannelEdit_Edit(void)
{
BYTE i;
i = (TVChannel-1)%6; // Current Line
i+=2;
if( ChannelEdit_on ) {
ChannelEdit_on = 0;
DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*i+10, EDIT_NORMAL_ATTR, 5 ); // Clear color
}
else {
ChannelEdit_on = 1;
val_index = 0;
DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*i+10+val_index, EDIT_CURSOR_ATTR, 1 ); // Set the first Cursor.
}
}
void ChannelEdit_Cursor(BYTE flag)
{
BYTE i;
if(!ChannelEdit_on) return;
i = (TVChannel-1)%6; // Current Line
i+=2;
if( flag == UP ) val_index = (val_index+1)%5;
else val_index = (val_index+5-1)%5;
DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*i+10, EDIT_NORMAL_ATTR, 5 ); // Clear color
DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*i+10+val_index, EDIT_CURSOR_ATTR, 1 ); // Move Cursor
}
void ChannelEdit_Char(BYTE flag)
{
BYTE i, Str[2];
WORD addr;
if(!ChannelEdit_on) return;
i = (TVChannel-1)%6; // Current Line
i+=2;
addr = FIRST_SAVEDPR+TVCHNAME + TVChannel*BYTEPERCHANNEL+val_index;
Str[0] = ReadEEP(addr);
if( (Str[0] >= '0' && Str[0] <= 'Z' ) || Str[0]==' ' ){
if( flag == UP ) {
if( Str[0] == ' ' ) Str[0] = 'A';
else {
Str[0] = (Str[0]-'0'+1)%('Z'-'0'+1) + '0';
if( Str[0] > '9' && Str[0] < 'A' ) Str[0] = ' ';
}
}
else{
if( Str[0] == ' ' ) Str[0] = '9';
else {
Str[0] = (Str[0]-'0'+('Z'-'0'+1)-1)%('Z'-'0'+1) + '0';
if( Str[0] > '9' && Str[0] < 'A' ) Str[0] = ' ';
}
}
}
else Str[0] = ' ';
WriteEEP(addr, Str[0]);
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*i+10+val_index, Str, 1 ); // Clear color
}
#endif //PAL_TV
#ifdef SUPPORT_CCD_VCHIP
CODE BYTE Cursorblock[]={7,11,14,17,20,23};
CODE BYTE Maskblock[]={0x00,0x80,0xc0,0x80,0xf8,0xf8,0xf0};
void Draw_Block_Unblock( BYTE level,BYTE value )
{
BYTE j, mask;
CODE BYTE BLOCK[]={RAMFONT,0x72,0x73};
CODE BYTE UNBLOCK[]={RAMFONT,0x74,0x75};
mask=Maskblock[level];
for(j=0; j<6; j++,mask<<=1,value<<=1)
{
if( mask&0x80){
if( value & 0x80 )
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(1+level) + Cursorblock[j] , BLOCK, 3 );
else
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(1+level) + Cursorblock[j] , UNBLOCK, 3 );
}
if( level==2 && j==1) j++;
else if( level!=2 && j==0) j++;
}
}
void Display_VchipCursor(BYTE color)
{
BYTE i, val;
// XXXXX XXX: [7-3] [2-0]
val = val_index&0xf8;
for(i=0; i<6; i++, val<<=1)
{
if( val&0x80 ) break;
if( (val_index&0x07)!=1 && i==0) i++;
}
DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH*(2+(val_index&0x07))+Cursorblock[i], color, 2 );
}
void Display_TVGuide_Window(void)
{
BYTE i;
CODE BYTE TVGuide_Menu_Str[][25]={
{ " ALL FV V S L D" },
{ "TV-Y " },
{ "TV-Y7 " },
{ "TV-G " },
{ "TV-PG " },
{ "TV-14 " },
{ "TV-MA " },
{ "" }
};
DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH, DEFAULT_COLOR, MENU_HEIGHT*MENU_WIDTH ); // Clear color
for (i=0;i<7 ;i++ )
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(1+i), TVGuide_Menu_Str[i], MENU_WIDTH );
Display_TVGuide_Status();
}
void Display_TVGuide_Status(void)
{
BYTE row, rate, content;
rate = GetBlockedTVEE()&0xf8;
for(row=1;row<7;row++)
{
if( rate == 0 || rate >= row ) // Check content
content = GetBlockedTV_FLDSLEE(row)&0xf8;
else
content = Maskblock[row];
Draw_Block_Unblock(row, content);
}
Display_VchipCursor (CURSOR_COLOR);
}
void ChangeVchip_LevelCursor(BYTE flag)
{
BYTE row, col ;
row = val_index & 0x07;
col = val_index & 0xf8;
Display_VchipCursor (DEFAULT_COLOR); // Clear Cursor
if( flag == UP ) row = (row+1)%6;
else row = (row+6-1)%6;
if( (col & Maskblock[row+1]) == 0 ) col = 0x80;
val_index = col | row;
Display_VchipCursor (CURSOR_COLOR);
}
void ChangeVchip_ContentCursor(BYTE flag)
{
BYTE i,row,col;
Display_VchipCursor (DEFAULT_COLOR); // Clear Cursor
row = val_index&0x07;
col = val_index&0xf8;
if( flag == UP ) {
for (i=0; i<5 ;i++ )
{
col>>=1;
if(col & (Maskblock[row+1]&col)) break;
}
}
else // DN
{
for (i=0 ;i<5 ;i++ )
{
col<<=1;
if(col & (Maskblock[row+1]&col)) break;
}
}
if((col&0xf8) == 0 ) val_index=row|0x80; // ALL
else val_index=row|col;
Display_VchipCursor (CURSOR_COLOR);
}
void Select_VchipLevel(void)
{
BYTE rate, content;
BYTE i, row, col;
row = (val_index&0x07) +1;
col = val_index & 0xf8;
// Get current status.
rate = GetBlockedTVEE()&0x07;
content = GetBlockedTV_FLDSLEE(row)&0xf8;
// Toggle status
content = content ^ col;
if( col == 0x80 ){ // Change "ALL"
rate = row;
if( content & 0x80) { // "ALL": Block
for(i=row; i<7; i++)
SaveBlockedTV_FLDSLEE(i,Maskblock[i]);
}
else { // "ALL" : Unblock
for(i=1; i<=row; i++)
SaveBlockedTV_FLDSLEE(i,0);
row++;
rate = row;
if(rate>6) rate=0;
}
}
else
{
Printf("\r\n content:%2x row:%2x", (WORD)content, (WORD)row);
if( content & 0x80) { // Is ALL blocked?
content &= 0x7f; // "ALL" : Unblock
rate = row+1;
if( rate>6 ) rate=0;
Printf("--> content:%2x row:%2x", (WORD)content, (WORD)rate);
}
SaveBlockedTV_FLDSLEE(row,content);
if( content & col ){ // BLOCK
for( i=row+1; i<7; i++){
if( row < 4) break;
SaveBlockedTV_FLDSLEE(i, ((GetBlockedTV_FLDSLEE(i) & 0xf8) | col ) );
}
}
else
{ // UNBLOCK
for( i=1; i<row; i++){
SaveBlockedTV_FLDSLEE(i, ((GetBlockedTV_FLDSLEE(i) & 0xf8) & (~col) & 0x7f) );
}
}
}
SaveBlockedTVEE(rate);
Display_TVGuide_Status();
ChangeVchipTV(rate);
}
#endif // SUPPORT_CCD_VCHIP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?