Lcd_msg.c
上传用户:xmyjxjd
上传日期:2013-05-04
资源大小:1517k
文件大小:21k
开发平台:

C/C++

  1. #define __MESSAGE__
  2. #include "reg52.h"
  3. #include "HeaderMAIN_DEF.H"
  4. #include "HeaderCONFIG.H"
  5. #include "HeaderACCESS.H"
  6. #include "HeaderLCD_FUNC.H"
  7. #include "HeaderLCD_MSG.H"
  8. #include "HeaderLCD_MAIN.H"
  9. #include "HeaderLCD_OSD.H"
  10. #include "HeaderMTV512.H"
  11. #include "HeaderOSD.H"
  12. #include "HeaderFONT.H"
  13. #include "HeaderSRC_CTRL.H"
  14. #include "HeaderFRAME_SYNC.H"
  15. #include "Headerrgb_echo.H"
  16. unsigned char GetKeyState(void)
  17. {
  18. /* //anson 050519
  19. #if(MCU_TYPE == MCU_WINBOND)
  20.     unsigned char   ucKeyState;
  21. #if (BOARD_TYPE == QA_PCB || BOARD_TYPE == DEMO_LVDS_A || KINGMICE)
  22.     ucKeyState  = bPOWER_KEY ? P3 | (IR_KEY_MASK | POWER_KEY_MASK) : (P3 | IR_KEY_MASK) & (0xff ^ POWER_KEY_MASK);
  23. #elif(BOARD_TYPE == DEMO1_PCB)
  24.    ucKeyState  = bPOWER_KEY ? P1 | (IR_KEY_MASK | POWER_KEY_MASK) : (P1 | IR_KEY_MASK) & (0xff ^ POWER_KEY_MASK);
  25. #else
  26.         ucKeyState  = (P3 & 0x40) | (P1 & 0x1b) | IR_KEY_MASK;
  27. #endif
  28. #if (IRPOLLING)
  29.     {
  30.     //    unsigned char   ucIR_Curr;
  31.         
  32.         // You cannot respond to ucIR_Cmd[0] when IR command decoding (1 < ucIR_State).
  33.         // Because ucIR_Cmd[0] is not a constant during command decoding.
  34.         Data[0]   = (1 < ucIR_State) ? 0 : ucIR_Cmd[0];
  35.         if (Data[0])
  36.         {
  37.             switch (Data[0])
  38.             {
  39. #if (POWER_KEY_TYPE == TYPE_ONE_TOUCH)
  40.             // Only when power-key is one-touch style, you can use IR remote controller to switch power on/off
  41.             case IR_POWER_KEY :     ucKeyState  &= (0xff ^ POWER_KEY_MASK);     break;
  42. #endif
  43.             // Use IR to implement standard key
  44.             case IR_LEFT_KEY :      ucKeyState  &= (0xff ^ LEFT_KEY_MASK);      break;
  45.             case IR_RIGHT_KEY :     ucKeyState  &= (0xff ^ RIGHT_KEY_MASK);     break;
  46.             case IR_ENTER_KEY :     ucKeyState  &= (0xff ^ ENTER_KEY_MASK);     break;
  47.             // Other IR function key
  48.             default :        
  49.                 ucKeyState  &= (0xff ^ IR_KEY_MASK);
  50. #if (TV_CHIP != TV_NONE)
  51.                 switch (Data[0])
  52.                 {
  53.                 case IR_FUNC_SOURCE :   Data[0] = NOTIFY_IR_SOURCE;     break;
  54.                 case IR_FUNC_DISP :     Data[0] = NOTIFY_IR_DISP;       break;
  55.                 case IR_FUNC_JUMP :     Data[0] = NOTIFY_IR_JUMP;       break;
  56.                 case IR_FUNC_CHDEC :    Data[0] = NOTIFY_IR_CHDEC;      break;
  57.                 case IR_FUNC_CHINC :    Data[0] = NOTIFY_IR_CHINC;      break;
  58.                 case IR_FUNC_VOLINC :   Data[0] = NOTIFY_IR_VOLINC;     break;
  59.                 case IR_FUNC_VOLDEC :   Data[0] = NOTIFY_IR_VOLDEC;     break;
  60.                 case IR_FUNC_MENU :     Data[0] = NOTIFY_IR_MENU;       break;
  61.                 case IR_FUNC_ENTER :    Data[0] = NOTIFY_IR_ENTER;      break;
  62.                 case IR_FUNC_MUTE :     Data[0] = NOTIFY_IR_MUTE;       break;
  63.                 case IR_FUNC_NUM0 :     Data[0] = NOTIFY_IR_NUM0;       break;
  64.                 case IR_FUNC_NUM1 :     Data[0] = NOTIFY_IR_NUM1;       break;
  65.                 case IR_FUNC_NUM2 :     Data[0] = NOTIFY_IR_NUM2;       break;
  66.                 case IR_FUNC_NUM3 :     Data[0] = NOTIFY_IR_NUM3;       break;
  67.                 case IR_FUNC_NUM4 :     Data[0] = NOTIFY_IR_NUM4;       break;
  68.                 case IR_FUNC_NUM5 :     Data[0] = NOTIFY_IR_NUM5;       break;
  69.                 case IR_FUNC_NUM6 :     Data[0] = NOTIFY_IR_NUM6;       break;
  70.                 case IR_FUNC_NUM7 :     Data[0] = NOTIFY_IR_NUM7;       break;
  71.                 case IR_FUNC_NUM8 :     Data[0] = NOTIFY_IR_NUM8;       break;
  72.                 case IR_FUNC_NUM9 :     Data[0] = NOTIFY_IR_NUM9;       break;
  73.                 default :               ucKeyState  |= IR_KEY_MASK;     break;
  74.                 }
  75. #endif
  76.                 break;
  77.             }
  78.         }
  79.     }
  80. #endif
  81.     
  82.     return ((ucKeyState & ALL_KEY_MASK) | KEY_DISABLED) ^ ALL_KEY_MASK;
  83. #else
  84. */ //anson 050519
  85. unsigned char ucKeyState=0;
  86.         if(!bRIGHT_KEY)
  87.           ucKeyState=ucKeyState|RIGHT_KEY_MASK;
  88.         if(!bLEFT_KEY)
  89.           ucKeyState=ucKeyState|LEFT_KEY_MASK;
  90.         if(!bENTER_KEY)
  91.           ucKeyState=ucKeyState|ENTER_KEY_MASK;
  92. //        if(!bMENU_KEY)
  93. //           ucKeyState=ucKeyState|MENU_KEY_MASK;
  94.         if(!bPOWER_KEY)
  95.           ucKeyState=ucKeyState|POWER_KEY_MASK;
  96.         if(!bAUTO_KEY)
  97.           ucKeyState=ucKeyState|AUTO_KEY_MASK;
  98.         return ucKeyState;
  99. //#endif //anson 050519
  100. }
  101. // Key_Trans() is used for generating key related messages, including OSD timout message.
  102. // You can just issue the message or execute system default function, like changing input source.
  103. // BE CAREFUL !! YOU CANNOT CHANGE ANY OSD STATUS REGISTERS OR CALL ANY OSD PROCESS HERE !!
  104. // You should not expect OSD_Proc() can always receive your message.
  105. // Because main program will shield OSD process from been triggered when input signal isn't stable,
  106. // and terminate OSD process when input source is changed.
  107. unsigned char Key_Trans()
  108. {
  109.     static unsigned char    idata   ucP3_Prev       = 0;
  110.     static unsigned char    idata   ucP3_Curr       = 0;
  111.     static unsigned char    idata   ucKey_Repeat    = 0;
  112.     unsigned char   ucNotify    = NOTIFY_NONE;
  113.     // Save the previous key status
  114.     ucP3_Prev   = ucP3_Curr;
  115.     // Sample the current key status
  116.     ucP3_Curr   = GetKeyState();
  117. #if (POWER_KEY_TYPE == TYPE_TWO_STATE)
  118. // We MUST handle power-key first.
  119. if (bPower_Status)
  120. {
  121. if (ucP3_Curr & POWER_KEY_MASK)
  122. ucP3_Curr   ^= POWER_KEY_MASK;  // Go further to handle other keys (and mask power-key)
  123. else
  124. {
  125. Delay_Xms(20);
  126. ucP3_Prev   = ucP3_Curr;
  127. ucP3_Curr   = GetKeyState();
  128. if (ucP3_Curr & POWER_KEY_MASK)
  129. ucP3_Curr   ^= POWER_KEY_MASK;  // Go further to handle other keys (and mask power-key)
  130. else
  131. return  NOTIFY_POWERDOWN;
  132. }
  133. }
  134. else
  135. {
  136. if (ucP3_Curr & POWER_KEY_MASK)
  137. {
  138. ucKey_Issued    = 0;
  139. Delay_Xms(20);
  140. ucP3_Prev   = ucP3_Curr;
  141. ucP3_Curr   = GetKeyState();
  142. if (ucP3_Curr & POWER_KEY_MASK)
  143. return NOTIFY_POWERUP;
  144. else
  145. return NOTIFY_NONE;
  146. }
  147. else
  148. return NOTIFY_NONE;
  149. }
  150. #else   // POWER_KEY_TYPE is TYPE_ONE_TOUCH
  151. if (bPower_Status)
  152. {
  153. if (POWER_KEY_MASK & ucP3_Curr)
  154. {
  155. if ((ucP3_Prev ^ ucP3_Curr) & POWER_KEY_MASK)
  156. {
  157. Delay_Xms(20);
  158. ucP3_Curr   = GetKeyState();
  159. if ((ucP3_Prev ^ ucP3_Curr) & POWER_KEY_MASK)   
  160. {
  161. if(((stGUD3.TV_SETTING & 0x08)==0x08) || ((stGUD3.TV_SETTING & 0x20)==0x20 ))  //anson
  162. {
  163. stGUD3.TV_SETTING &= 0xF7 ;  //anson Factory bit=0
  164. Save_GUD3(); //anson
  165. }
  166. return NOTIFY_POWERDOWN;
  167. }
  168. else
  169. return NOTIFY_NONE;
  170. }
  171. }
  172. }
  173. else
  174. {
  175. if ((RIGHT_KEY_MASK| POWER_KEY_MASK ) == ucP3_Curr)  //anson
  176. {
  177. stGUD3.TV_SETTING |= 0x08;//Factory mode
  178. Save_GUD3();
  179. return NOTIFY_POWERUP;
  180. }
  181. else if ((MODE_NOSIGNAL == ucMode_Curr) &&((LEFT_KEY_MASK | POWER_KEY_MASK) == ucP3_Curr))     //anson
  182. { //ucNotify    = NOTIFY_BURNIN_KEY;
  183. stGUD3.TV_SETTING = stGUD3.TV_SETTING | 0x20; //Burning Mode
  184. Save_GUD3();
  185. return NOTIFY_POWERUP;
  186. }         
  187. else if (POWER_KEY_MASK & ucP3_Curr)
  188. {
  189. if ((ucP3_Prev ^ ucP3_Curr) & POWER_KEY_MASK)
  190. {
  191. ucKey_Issued    = 0;
  192. Delay_Xms(20);
  193. ucP3_Curr   = GetKeyState();
  194. if ((ucP3_Prev ^ ucP3_Curr) & POWER_KEY_MASK)
  195. return NOTIFY_POWERUP;
  196. else
  197. return NOTIFY_NONE;
  198. }
  199. else
  200. return NOTIFY_NONE;
  201. }
  202. }
  203. #endif
  204.     // Generate Key Messages
  205.     switch (ucP3_Curr)
  206.     {
  207. ///////////////////////////////////////////////////////////////////////////////////
  208. //anson
  209. ///////////////////////////////////////////////////////////////////////////////////
  210. case FACTORY_KEY_MASK : //anson 0921
  211. if ((ucP3_Prev ^ ucP3_Curr) & FACTORY_KEY_MASK)
  212. {
  213. do
  214. {
  215. ucP3_Curr   = GetKeyState();
  216. }while(ucP3_Curr != 0x00);
  217. ucKey_Issued    = 0;
  218. ucNotify        = NOTIFY_FACTORY_KEY;
  219. }
  220. break;
  221. ///////////////////////////////////////////////////////////////////////////////////
  222. ///////////////////////////////////////////////////////////////////////////////////
  223.     case AUTO_KEY_MASK :
  224.         if ((ucP3_Prev ^ ucP3_Curr) & AUTO_KEY_MASK)
  225.         {
  226.             ucKey_Issued    = 0;
  227.             ucNotify        = NOTIFY_AUTO_KEY;
  228.         }
  229.         break;
  230. /*
  231.     case MENU_KEY_MASK :
  232.         if ((ucP3_Prev ^ ucP3_Curr) & MENU_KEY_MASK)
  233.         {
  234.            if (ucOSD_Page_Index)
  235.            {
  236.               ucKey_Issued    = 0;
  237. //            ucNotify        = NOTIFY_MENU_KEY;  //default , now mask for exit function
  238.               ucNotify        = NOTIFY_EXIT_KEY;
  239.            }
  240.            else
  241.            {
  242.               bStable  = 0;
  243.               return NOTIFY_POWERUP;
  244.            }
  245.         }
  246.         break;
  247. */    
  248.     case ENTER_KEY_MASK :
  249.         if ((ucP3_Prev ^ ucP3_Curr) & ENTER_KEY_MASK)
  250.         {
  251.             ucKey_Issued    = 0;
  252.             //usOSD_Timer     = (unsigned int)stGUD1.OSD_TIMEOUT << 9;    // Reset OSD timeout timer
  253.             usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51; 
  254.             ucNotify        = NOTIFY_ENTER_KEY;                         // Post enter-key pressed message
  255.             ucKey_Repeat    = KEY_REPEAT_COUNT * 8;
  256.         }
  257.         else
  258.         {
  259.             if (ucKey_Repeat)
  260.                 ucKey_Repeat    -= 1;
  261.             else
  262.             {
  263.                 if (ucOSD_Page_Index)
  264.                 {
  265.                     usOSD_Timer = 0;
  266.                     ucNotify    = NOTIFY_CLEAR_OSD;
  267.                 }
  268.             }
  269.         }
  270.         break;
  271.     
  272.     case RIGHT_KEY_MASK :
  273.     case LEFT_KEY_MASK:
  274.         //usOSD_Timer     = (unsigned int)stGUD1.OSD_TIMEOUT << 9;        // Reset OSD timeout timer
  275. //----------------------------------echo add begin
  276.         if (ucOSD_Page_Index)
  277.         {
  278.            usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51;
  279.         }
  280.         else
  281.         {
  282.            if (b_rgb_VOLUME_STATUS)
  283.               usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 4;
  284.         }
  285. //----------------------------------echo add end;           
  286.         
  287.         if ((ucP3_Prev ^ ucP3_Curr) & ucP3_Curr)
  288.         {
  289.             ucKey_Issued    = 0;
  290.             ucNotify        = (ucP3_Curr == RIGHT_KEY_MASK) ? NOTIFY_RIGHT_KEY : NOTIFY_LEFT_KEY;  // Post right-key pressed message
  291.             ucKey_Repeat    = KEY_REPEAT_COUNT;
  292.         }
  293.         else
  294.         {
  295.             if (ucKey_Repeat)
  296.                 ucKey_Repeat    -= 1;
  297.             else
  298.             {
  299.                 if (KEY_TURBO_ENABLE > ucKey_Issued)
  300.                 {
  301.                     ucKey_Issued    += 1;
  302.                     ucKey_Repeat    = KEY_REPEAT_PERIOD;
  303.                 }
  304.                 else
  305.                     ucKey_Repeat    = 0;
  306.                 ucNotify        = (ucP3_Curr == RIGHT_KEY_MASK) ? NOTIFY_RIGHT_KEY : NOTIFY_LEFT_KEY;  // Post right-key repeat message
  307.             }
  308.         }
  309.         break;
  310. /*    
  311.     case LEFT_KEY_MASK :
  312.         //usOSD_Timer     = (unsigned int)stGUD1.OSD_TIMEOUT << 9;        // Reset OSD timeout timer
  313.         usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51; 
  314.         if ((ucP3_Prev ^ ucP3_Curr) & LEFT_KEY_MASK)
  315.         {
  316.             ucKey_Issued    = 0;
  317.             ucNotify        = NOTIFY_LEFT_KEY;                          // Post left-key pressed message
  318.             ucKey_Repeat    = KEY_REPEAT_COUNT;
  319.         }
  320.         else
  321.         {
  322.             if (ucKey_Repeat)
  323.                 ucKey_Repeat    -= 1;
  324.             else
  325.             {
  326.                 if (KEY_TURBO_ENABLE > ucKey_Issued)
  327.                 {
  328.                     ucKey_Issued    += 1;
  329.                     ucKey_Repeat    = KEY_REPEAT_PERIOD;
  330.                 }
  331.                 else
  332.                     ucKey_Repeat    = 0;
  333.                 ucNotify        = NOTIFY_LEFT_KEY;                      // Post left-key repeat message
  334.             }
  335.         }
  336.         break;
  337. */
  338. /*    case IR_KEY_MASK :
  339.         ucKey_Issued    = 0;
  340.         if ((ucP3_Prev ^ ucP3_Curr) & IR_KEY_MASK)
  341.         {
  342.             if (SOURCE_TV == (stGUD1.INPUT_SOURCE & 0x07))
  343.             {
  344.                 //usOSD_Timer     = (unsigned int)stGUD1.OSD_TIMEOUT << 9;    // Reset OSD timeout timer
  345.                 usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51; 
  346.             }
  347.             ucNotify        = Data[0];                                      // Post IR-key pressed message
  348.             ucKey_Repeat    = KEY_REPEAT_COUNT;
  349.         }
  350.         else if (NOTIFY_IR_VOLINC == Data[0] || NOTIFY_IR_VOLDEC == Data[0])
  351.         {
  352.             if (ucKey_Repeat)
  353.                 ucKey_Repeat    -= 1;
  354.             else
  355.             {
  356.                 ucNotify        = Data[0];
  357.                 ucKey_Repeat    = KEY_REPEAT_PERIOD;
  358.             }
  359.         }
  360.         break;
  361.  */   
  362.     default :
  363.         // No key or more than 1 key pressed. Post no message and reset key-repeat.
  364.         ucKey_Repeat    = KEY_REPEAT_COUNT;
  365.         ucKey_Issued    = 0;
  366. #if (HIDDEN_PAGE)        
  367.         // For triggering the hidden page
  368.         if (0 == ucOSD_Page_Index && (RIGHT_KEY_MASK | LEFT_KEY_MASK) == ucP3_Curr)     ucNotify    = NOTIFY_LR_KEY;
  369. #endif
  370.         break;
  371.     }
  372.     return ucNotify;
  373. }
  374. void OSD_Dispatcher(unsigned char message)
  375. {
  376.     if (bReload)
  377.     {
  378.         // When bStable and bReload are both 1s, it is the first iteration after input signal becomes stable.
  379.         // bReload will be cleared and user's font will be reloaded.
  380.         bReload = 0;
  381.         RTDSetByte(HOSTCTRL_02, 0x40);          // Wake RTD up
  382.      RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00); // Disable overlay control
  383.         RTDOSDW(OSD_Reset);                    // Clear OSD
  384.       //  RTDSetBit(OVL_CTRL_6D, 0xff, 0x02);     // Turn back to the original osd display width
  385.        // Load_Font(JAPANESS == (stGUD1.FUNCTION & 0x07) ? Font_East_J : Font_East_C, 0x00, 0x12);
  386. //Load_Font(Font_Global, 0x00, 0x154);
  387. /*
  388. Load_VLC_Font(Font_Global, 0x00, 0xa1);
  389.        if( (stGUD1.FUNCTION & 0x07) == JAPANESS )
  390.        {
  391.        Load_VLC_Font(Font_East_J, 0x573, 0x4B);
  392.        }
  393.        else
  394.        {
  395.             Load_VLC_Font(Font_East_C, 0x5a9, 0x45);
  396.        }
  397.        Load_VLC_Font(Font_Icons, 0x828, 0x70);
  398. */
  399.         if (ucOSD_Page_Index)
  400.         {
  401.             message = NOTIFY_SHOW;
  402.         }
  403.         else
  404.         {
  405.             message = NOTIFY_NONE;
  406. RTDSetBit(OVL_CTRL_6D, 0x3f, 0x00); //Red
  407. RTDSetBit(BGCOLOR_CONTROL_6C, 0x00, 0x00);
  408. RTDSetBit(OVL_CTRL_6D, 0x3f, 0x40); //Green
  409. RTDSetBit(BGCOLOR_CONTROL_6C, 0x00, 0x00);
  410. RTDSetBit(OVL_CTRL_6D, 0x3f, 0x80); //Blue
  411. RTDSetBit(BGCOLOR_CONTROL_6C, 0x00, 0x00);
  412.            if (BEGIN_MODECHANGE < usTaskCnt)    Show_Note();
  413.         }
  414.         // We always read REG[1F] to see if frame-sync is OK.
  415.         // ucStatus is the OR result of REG[1F] when OSD is open, and clear to 0 when OSD is close.
  416.         //ucStatus    = 0;
  417.     }
  418.     if ((0 == ucOSD_Page_Index) && (!b_rgb_VOLUME_STATUS))
  419.     {
  420.         if ((BEGIN_MODECHANGE == usTaskCnt))
  421.         {
  422.             // Disable and clear input source note text
  423.             RTDSetByte(HOSTCTRL_02, 0x40);
  424.      RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);     
  425.             RTDOSDW(OSD_Reset);
  426.         }
  427.         else if ((BEGIN_SHOWHINT == usTaskCnt))
  428.         {
  429.            Show_Hint();
  430.         }
  431. //else if (1 == usTaskCnt)
  432. //{
  433. //    RTDOSDW(OSD_Reset);            // Clear OSD
  434. //}
  435.     }
  436.     else if (NOTIFY_NONE == message)
  437.     {
  438. //        if (0 == usOSD_Timer && 0 != stGUD1.OSD_TIMEOUT && SOURCE_TV != (stGUD1.INPUT_SOURCE & 0x07))
  439.         if (0 == usOSD_Timer && 0 != stGUD1.OSD_TIMEOUT )
  440.         {
  441.             message = NOTIFY_CLEAR_OSD;
  442.         }
  443.     }
  444.     switch (message)
  445.     {
  446.     case NOTIFY_CLEAR_OSD :
  447. //        if (ucOSD_Page_Index && SOURCE_TV != (stGUD1.INPUT_SOURCE & 0x07))
  448.         if ((ucOSD_Page_Index) || (b_rgb_VOLUME_STATUS))
  449.         {
  450.             // OSD time-out
  451.             ucOSD_Page_Index    = 0;
  452.             ucOSD_Item_Index0   = 0;
  453.             ucOSD_Item_Index1   = 0;
  454.             ucOSD_Item_Index2   = 0;
  455.             b_rgb_VOLUME_STATUS = 0;  // echo add 04/05/18
  456.             RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  457.             // Although you can add ending animation here, I don't think it is necessary.
  458. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);
  459.             RTDOSDW(OSD_Reset);            // Clear OSD
  460.         }
  461.         break;
  462. /*
  463.     case NOTIFY_EXIT_KEY :
  464.             ucOSD_Page_Index    = 0;
  465.             ucOSD_Item_Index0   = 0;
  466.             ucOSD_Item_Index1   = 0;
  467.             ucOSD_Item_Index2   = 0;
  468.             b_rgb_VOLUME_STATUS = 0;  // echo add 04/05/18
  469.             RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  470.             // Although you can add ending animation here, I don't think it is necessary.
  471. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);
  472.             RTDOSDW(OSD_Reset);            // Clear OSD
  473.         break;
  474. */
  475. /*
  476.     case NOTIFY_EXIT_KEY :
  477.         break;
  478. */
  479.     case NOTIFY_MENU_KEY :
  480.     case NOTIFY_IR_SOURCE :
  481.         if (SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07))
  482.         {
  483. #if (TMDS_ENABLE) 
  484.             Change_Source(SOURCE_DVI);
  485. #else
  486.             Change_Source(SOURCE_AV);
  487. #endif
  488.         }
  489.         else if (SOURCE_DVI == (stGUD1.INPUT_SOURCE & 0x07))
  490.             Change_Source(SOURCE_AV);
  491.         else if (SOURCE_AV == (stGUD1.INPUT_SOURCE & 0x07))
  492.             Change_Source(SOURCE_SV);
  493.         else if (SOURCE_SV == (stGUD1.INPUT_SOURCE & 0x07))
  494.         {
  495. #if (VIDEO_CHIP == VDC_SAA7118)
  496.             Change_Source(SOURCE_YUV);
  497. #else
  498.             Change_Source(SOURCE_TV);
  499. #endif
  500.         }
  501.         else if (SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07))
  502.         {
  503.             Change_Source(SOURCE_TV);
  504.         }
  505.         else
  506.         {
  507.             Change_Source(SOURCE_VGA);
  508.         }
  509.         break;
  510.     default :
  511.         {
  512.             // Save the current OSD page index
  513.             unsigned char   ucPage_Curr     = ucOSD_Page_Index;
  514.             // Send messages to OSD process
  515.             //(*OSD_Proc[ucOSD_Page_Index][stGUD1.INPUT_SOURCE & 0x07])(message);
  516.             OSD_Proc(message);
  517.             // If OSD page is changed ...
  518.             if (ucPage_Curr != ucOSD_Page_Index)
  519.             {
  520.                 if (ucOSD_Page_Index)
  521.                 {
  522.                     if (0 == ucPage_Curr)
  523.                     {
  524.                         // ucOSD_Page_Index becomes non-zero value from zero. It is the first show of OSD.
  525.                         // Maybe RTD3001 is still in power-saving mode, or we are showing some text on screen,
  526.                         // like "No Signal". So we must wake up RTD3001 and clear screen before we display OSD.
  527.                         RTDSetByte(HOSTCTRL_02, 0x40);
  528.                         RTDSetBit(VDIS_CTRL_20, 0xff, 0x01);
  529. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);     
  530.                         RTDOSDW(OSD_Reset);
  531.                     }
  532.                     //(*OSD_Proc[ucOSD_Page_Index][stGUD1.INPUT_SOURCE & 0x07])(NOTIFY_SHOW);
  533.                     OSD_Proc(NOTIFY_SHOW);
  534. if (0 == ucPage_Curr)
  535. {
  536. //RTDCodeW(OSD_Enable);
  537. //RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  538. OSD_Opening();
  539. }
  540.                 }
  541.                 else
  542.                 {
  543.                     // OSD should be cleared when ucOSD_Page_Index becomes 0. 
  544.                     // Clear other OSD status registers for safety
  545.                     ucOSD_Item_Index0   = 0;
  546.                     ucOSD_Item_Index1   = 0;
  547.                     ucOSD_Item_Index2   = 0;
  548.                     RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  549.                     OSD_Ending();
  550. //RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);     
  551.                     //RTDCodeW(OSD_Reset);            // Clear OSD
  552.                 }
  553.             }
  554.             else
  555.             {
  556.                 // OSD page is not changed
  557.                 if (ucOSD_Page_Index)
  558.                 {
  559. if (NOTIFY_SHOW == message)     
  560. {
  561. RTDCodeW(OSD_Enable);
  562. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  563. }
  564.                     // Change H/V Position and ADC clock may cause overflow/underflow temporarily.
  565.                     if (NOTIFY_RIGHT_KEY == message || NOTIFY_LEFT_KEY == message)
  566.                     {
  567. RTDSetByte(STATUS0_01, 0x00);  // Clear status
  568.                         RTDSetByte(STATUS1_1F, 0x00);  // Clear status
  569.                     }
  570. #if (SHOW_CHECK)
  571.                     // Just for showing debug information
  572.                     OSD_Show_Check();
  573. if( ucOSD_Item_Index0 == 5 &&  ucOSD_Page_Index == 1 &&  ucOSD_Item_Index1)
  574. {
  575. ucOSD_Page_Index = 7;
  576. OSD_Show_Check();
  577. ucOSD_Page_Index = 1;
  578. }
  579. #endif
  580.                 }
  581.                 else
  582.                 {
  583.                     // We always read REG[1F] to see if frame-sync is OK.
  584.                     // ucStatus is the OR result of REG[1F] when OSD is open, and clear to 0 when OSD is close.
  585.                     ucStatus    = 0;
  586. #if (RTDDEBUG)
  587.                     usPE_Sum    = 0;
  588. #endif
  589.                 }
  590.             }
  591.         }
  592.         break;
  593.     }
  594. }