UI_PSF_radio.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002                            C   M O D U L E   F I L E
00003 
00004     Copyright (c) 2003 Neuros Audio LLC, All rights reserved.
00005 
00006 ******************************************************************************/
00007 
00029 
00030 /*-- HEADER FILE INCLUDES ---------------------------------------------------*/
00031 #include "../SYSTEM/sys_main.h"
00032 #include "../SYSTEM/sys_clock.h"
00033 #include "../SYSTEM/sys_hiddenfeature.h"
00034 #include "../AUDIO/audio.h"
00035 #include "../TUNER/tuner.h"
00036 #include "../MENU/tmplt.h"
00037 #include "xim.h"
00038 #include "ui.h"
00039 #include "ui_assert.h"
00040 #include "../HDD/hdd.h"
00041 
00042 
00043 /*-- LOCAL DEFINITIONS ------------------------------------------------------*/
00044 enum tuner_seek_dir
00045 {
00046     TUNER_SEEK_UP,
00047     TUNER_SEEK_DOWN
00048 };
00049 
00050 static int seekctl;
00051 #define _SEEK_START         0
00052 #define _SEEK_CONTINUE      1
00053 #define _SEEK_DONE          2
00054 #define _seekcontinue() {   seekctl = _SEEK_CONTINUE;}
00055 #define _seekdone(s)    {   seekctl = _SEEK_DONE; \
00056                             sysParam.station = TUNER_tune(TUNER_SET, s);\
00057                             CODEC_hpVolume(sysParam.volume);}
00058 
00059 static void _updateRadioDisplay(USHORT, HMENU, int);
00060 static void _seeksetup(int);
00061 static int  _seektest(void);
00062 static void _radioGUIon(BOOL, MSG_DATA);
00063 static PARENT_STATE _ximAction(UINT);
00064 static PARENT_STATE _stateEnd(void);
00065 
00066 /*-- STATIC DATA ------------------------------------------------------------*/
00067 static HMENU            menu = INVALID_MENU_HDL;
00068 static int              curPresetIdx;
00069 
00070 /*-- GLOBAL DATA ------------------------------------------------------------*/
00071 
00072 /*-- FUNCTIONS --------------------------------------------------------------*/
00073 #pragma CODE_SECTION(UI_PSF_radio, ".radio_code")
00082 PARENT_STATE UI_PSF_radio( st_MSG * msgIN )
00083 {   
00084     MSG_ID          id = msgIN->id;     
00085     MSG_DATA        d1 = msgIN->d1; 
00086     MSG_DATA        d2 = msgIN->d2;
00087     
00088     switch(id)
00089     {
00090     case SYS_MSG_ID:
00091         
00092         switch(d1)
00093         {
00094             case SSTATE_START:
00095             {
00096                 SYS_clockSetup(CLOCK_FMTUNER);
00097                 SYS_presetable();               
00098                 if(!SYS_isRadioActive())
00099                 {
00100                     SYS_radioActive();
00101                         
00102                     TUNER_control(ON);
00103                     TUNER_initFIR();
00104                     SYS_delayMicrosecond(300000);
00105                     AUDIO_initInterface(AM_FMRADIO, AF_PCM, 0, 0);
00106                     AUDIO_setInterface(AI_START);
00107                     TUNER_tune(TUNER_SET, sysParam.station);
00108                     CODEC_hpVolume(sysParam.volume);
00109                     SYS_audioNotPaused();
00110                     HDD_shutdown();
00111                 }                                   
00112                 _radioGUIon(TRUE, d2);
00113                 return P_RADIO;
00114             }
00115             case SHIDDENFEATURE:
00116             {
00117                 if(1 != d2) break;
00118                 _stateEnd();
00119                 SYS_HF_myfiTestEnable();
00120                 sysParam.myfiChannel = 963;
00121                 mMSG_send(sysMsgQ, SYS_MSG_ID, SSTART2PLAY, 0xA5A5, SYS_FOREVER);
00122                 return P_NULL;
00123             }
00124             case SSTATE_END:
00125             {
00126                 return _stateEnd();
00127             }
00128             case SGO2PRESET:
00129             {
00130                 if(UI_presetType(d2) == PRESET_RADIO)
00131                 {
00132                     int station = UI_presetStation(d2);
00133                     if(sysParam.station != station)
00134                     {
00135                         sysParam.station = station;                 
00136                         TUNER_tune(TUNER_SET, station);
00137                     }
00138                     _radioGUIon(TRUE, d2);
00139                 }
00140                 else 
00141                 {
00142                     _radioGUIon(FALSE, d2);
00143                     AUDIO_setInterface(AI_SHUTDOWN);
00144                     return P_PLAY;
00145                 }
00146                 return P_RADIO;
00147             }
00148             case SSTARTRADIO:
00149             case SRESUMEPLAY:
00150             case SENDOFMENU:
00151             {
00152                 _radioGUIon(TRUE, curPresetIdx);
00153                 return P_RADIO;         
00154             }
00155             case SPRESET:
00156             {
00157                 UI_presetRadio(d2, sysParam.station);
00158                 _updateRadioDisplay(sysParam.station, menu, d2);
00159                 return P_RADIO;
00160             }
00161             case SSTART2RECORD: 
00162             case SSTART2HISI:
00163             {
00164                 SYS_deleteDiskDbTask(SYS_FOREVER);
00165 // Bugzilla #157 Pt. 2b
00166                 if(SYS_isAudioPaused())
00167                 {
00168                     SYS_toggleAudioPaused();                
00169                     mMENU_update(menu, 7, (ULONG)text_null, FALSE);
00170                     CODEC_hpVolume(sysParam.volume);
00171                 }
00172                 mMENU_refresh(menu);
00173                 _radioGUIon(FALSE, DONTCARE);
00174                 return((SSTART2RECORD == d1)? P_RECORD:P_HISI);
00175             }
00176             case SXIM_EXIT: 
00177             {
00178                 return(_ximAction(d2));
00179             }
00180         }   
00181         break;
00182 
00183     case KBD_MSG_ID:
00184         switch(d1)
00185         {
00186             case KEY_HSELECT:
00187                 sysParam.station = TUNER_tune(TUNER_SET, TUN_MAX_REAL_FREQ);
00188                 _updateRadioDisplay(sysParam.station, menu, DONTCARE);
00189                 return P_RADIO;
00190             case KEY_HBACK:
00191                 sysParam.station = TUNER_tune(TUNER_SET, TUN_MIN_REAL_FREQ);
00192                 _updateRadioDisplay(sysParam.station, menu, DONTCARE);
00193                 return P_RADIO;
00194             case KEY_BACK:
00195                 // Auto resume play window.
00196                 SYS_autoResumePlayEnable();
00197                 _radioGUIon(FALSE, DONTCARE);
00198                 mMSG_send(uiChildMsgQ, SYS_MSG_ID, SBROWSE, DONTCARE, SYS_FOREVER);
00199                 return P_RADIO;
00200             
00201             case KEY_HREWIND:
00202             case KEY_RREWIND:
00203                 sysParam.station = TUNER_tune(TUNER_DEC, sysParam.station);
00204                 _updateRadioDisplay(sysParam.station, menu, DONTCARE);
00205                 return P_RADIO;
00206                 
00207             case KEY_REWIND:
00208                 _seeksetup(TUNER_SEEK_DOWN);
00209                 return P_RADIO;
00210                 
00211             case KEY_FORWARD:  
00212                 _seeksetup(TUNER_SEEK_UP);
00213                 return P_RADIO;
00214                 
00215             case KEY_HFORWARD:
00216             case KEY_RFORWARD:
00217                 sysParam.station = TUNER_tune(TUNER_INC, sysParam.station);
00218                 _updateRadioDisplay(sysParam.station, menu, DONTCARE);
00219                 return P_RADIO; 
00220                 
00221             case KEY_PLAY:
00222                 SYS_toggleAudioPaused();                
00223                 if(SYS_isAudioPaused())
00224                 {
00225                     mMENU_update(menu, 7, (ULONG)text_tunermuted, FALSE);
00226                     CODEC_hpVolume(0);  
00227                 }
00228                 else
00229                 {
00230                     mMENU_update(menu, 7, (ULONG)text_null, FALSE); 
00231                     CODEC_hpVolume(sysParam.volume);
00232                 }
00233                 mMENU_refresh(menu);
00234                 return P_RADIO;
00235                 
00236             case KEY_UP:
00237             case KEY_HUP:
00238             case KEY_DOWN:
00239             case KEY_HDOWN:
00240                 mMSG_send(uiChildMsgQ, SYS_MSG_ID, SVOLWIN_CREATE, DONTCARE, SYS_FOREVER);
00241                 return P_RADIO;
00242                 
00243             case KEY_SELECT:
00244                 SYS_autoResumePlayEnable();
00245                 mMSG_send(uiChildMsgQ, SYS_MSG_ID, SXIM_CREATE, XIMWIN_RADIO, SYS_FOREVER);
00246                 return P_RADIO;
00247         }
00248         break;
00249     
00250     case TMR_MSG_ID:
00251         switch(d1)
00252         {
00253             case TFRWD_DOUBLECLICK:
00254                 if(TUNER_SEEK_DOWN == d2)   
00255                     sysParam.station = TUNER_tune(TUNER_DEC, sysParam.station);
00256                 else                        
00257                     sysParam.station = TUNER_tune(TUNER_INC, sysParam.station);
00258                 _updateRadioDisplay(sysParam.station, menu, DONTCARE);
00259                 break;
00260             
00261             case TTUNERSEEK:
00262                 if( _SEEK_DONE != _seektest())
00263                 {
00264                     unsigned int oldStation;
00265                     oldStation = sysParam.station;
00266                     if(TUNER_SEEK_DOWN == d2)   
00267                     {
00268                         sysParam.station = TUNER_tune(TUNER_DEC, sysParam.station);
00269                         if(oldStation < sysParam.station) {_seekdone(oldStation);}
00270                         else _seekcontinue();
00271                     }
00272                     else
00273                     {                       
00274                         sysParam.station = TUNER_tune(TUNER_INC, sysParam.station);
00275                         if(oldStation > sysParam.station) {_seekdone(oldStation);}
00276                         else _seekcontinue();
00277                     }               
00278                 }
00279                 else 
00280                 {
00281                     TMR_delete(TMR_TUNERSEEK);
00282 // Bugzilla #157 Pt. 2a
00283                     if(SYS_isAudioPaused())
00284                     {
00285                         SYS_toggleAudioPaused();                
00286                         mMENU_update(menu, 7, (ULONG)text_null, FALSE);
00287                         CODEC_hpVolume(sysParam.volume);
00288                     }
00289                     mMENU_refresh(menu);
00290                 }
00291                 _updateRadioDisplay(sysParam.station, menu, DONTCARE);
00292                 break;
00293         }   
00294         break;      
00295     }
00296     
00297     return P_RADIO;
00298 }
00299 
00300 
00301 #pragma CODE_SECTION (_updateRadioDisplay, ".radio_code")
00302 // Function updates radio MENU with station display and a preset if available.
00303 // 
00304 // station: FM channel in 100KHz.
00305 // menu:    radio MENU handle.
00306 // presetIdx: preset index if not DONTCARE.
00307 static void _updateRadioDisplay(USHORT station, HMENU menu, int presetIdx)
00308 {
00309     ULONG           dptr;
00310     char            strStation[6];
00311     int             ii;
00312 
00313     ii = GEN_int2ASCII(station, strStation, FALSE, 0);
00314     
00315     // Insert '.'
00316     strStation[ii+1] = 0;
00317     strStation[ii] = strStation[ii-1];
00318     strStation[ii-1] = '.';
00319     
00320     mMENU_update(menu, 3, (ULONG)strStation, FALSE);    
00321     
00322     if( (presetIdx < 1)||(presetIdx > 5) )
00323     {
00324         presetIdx = UI_isPresetStation(station);
00325     }
00326     // Update preset display.
00327     if( ((presetIdx >= 1)&&(presetIdx <= 5))&&
00328         (station == UI_presetStation(presetIdx)) )
00329     {
00330         curPresetIdx = presetIdx;
00331         // Valid preset station, display preset icon. 
00332         mMENU_update(menu, 5, (ULONG)graf_icon_preset, FALSE);  
00333 
00334         // Update preset text display.
00335         switch(presetIdx)
00336         {       
00337             case 1: dptr = (long)text_preset01; break;
00338             case 2: dptr = (long)text_preset02; break;
00339             case 3: dptr = (long)text_preset03; break;
00340             case 4: dptr = (long)text_preset04; break;
00341             case 5: dptr = (long)text_preset05; break;
00342         }
00343         mMENU_update(menu, 6, dptr, TRUE);  
00344     }
00345     else 
00346     {
00347         // Clear preset display.
00348         mMENU_update(menu, 5, (ULONG)graf_icon_null, FALSE);    
00349     }   
00350     mMENU_refresh(menu);
00351 }
00352 
00353 
00354 #pragma CODE_SECTION (_seeksetup, ".radio_code")
00355 // Function sets up the tuner seeking timers.
00356 static void _seeksetup(int direction)
00357 {
00358     if(TRUE == TMR_isActive(TMR_FRWD_DOUBLECLICK))
00359     {
00360         // Double click detected.
00361         TMR_delete(TMR_FRWD_DOUBLECLICK);
00362         TMR_create(TMR_TUNERSEEK, 20, TTUNERSEEK, direction, AUTO_RELOAD);
00363         if (sysParam.x_automute == XTRA_ON)
00364         {
00365             CODEC_hpVolume(0);
00366         }
00367         seekctl = _SEEK_START;
00368     }
00369     else
00370     {               
00371         TMR_create( TMR_FRWD_DOUBLECLICK, 20, TFRWD_DOUBLECLICK, direction, NO_RELOAD );
00372         TMR_delete(TMR_TUNERSEEK);
00373     }
00374 }
00375 
00376 
00377 #pragma CODE_SECTION (_seektest, ".radio_code")
00378 // Function tests to see if channel is locked.
00379 static int _seektest(void)
00380 {
00381     int status;
00382     if(_SEEK_CONTINUE != seekctl) return seekctl;
00383     
00384     status = TUNER__spiReadStatus();
00385     if(!(status & TUNER_STATUS_VALID))  SYS_die(UI_PSF_RADIO);
00386     if (status & TUNER_STATUS_LOCKED)   seekctl = _SEEK_DONE; 
00387     else seekctl = _SEEK_CONTINUE;
00388     
00389     return seekctl;
00390 }
00391 
00392 #pragma CODE_SECTION (_radioGUIon, ".radio_code")
00393 // Function controls the radio GUI.
00394 static void _radioGUIon(BOOL on, MSG_DATA d2)
00395 {
00396     if(FALSE == on)
00397     {
00398         mMENU_action(menu, MENU_CLOSE); 
00399         TMR_delete(TMR_FRWD_DOUBLECLICK);
00400         TMR_delete(TMR_TUNERSEEK);          
00401     }
00402     else
00403     {
00404         SYS_autoResumePlayDisable();
00405         if(MENU_isValid(menu) == FALSE )
00406         {
00407             MENU_buf[0] = DP_RADIO;
00408             menu = mMENU_create((void*)&MENU_buf[0]);
00409         }
00410         if(SYS_isAudioPaused())     
00411         {
00412             SYS_autoffEnable();
00413             mMENU_update(menu, 7, (ULONG)text_tunermuted, FALSE);
00414         }
00415         else        
00416         {
00417             SYS_autoffDisable();
00418             mMENU_update(menu, 7, (ULONG)text_null, FALSE);
00419         }   
00420         _updateRadioDisplay(sysParam.station, menu, d2);
00421         mMENU_refresh(menu);
00422     }
00423 }
00424 
00425 
00426 #pragma CODE_SECTION(_ximAction, ".radio_code")
00427 // Function handles various DB XIMs.
00428 static PARENT_STATE _ximAction(UINT ximID)
00429 {
00430     XIM_ACTTYPE         actType;
00431     XIM_ACTID           actID;
00432     
00433     actType = (XIM_ACTTYPE)((ximID & 0xC000)>>14);          
00434     actID = (XIM_ACTID)(ximID & 0x3FFF);
00435 
00436     #ifdef DJ_SUPPORT
00437     SYS_autoResumePlayDisable();
00438     #endif
00439     switch( actType ) 
00440     {
00441     case XIM_ACT_DEV:   /* Device completed actions. */
00442         actID = (XIM_ACTID)(actID | XIM_DEV_IDMASK);
00443         switch( actID ) 
00444         {
00445         case XIM_DEV_EQ:
00446             UI_menuBrowse(DONTCARE, DONTCARE, MENU_EQ);
00447             break;
00448             
00449         case XIM_DEV_STOP_PLAY: 
00450             return _stateEnd(); 
00451             
00452         default:
00453             #ifndef DJ_SUPPORT
00454             SYS_autoResumePlayDisable();
00455             #endif
00456             break;      
00457         }
00458         break;
00459     }
00460     
00461     // All defaults to simply close XIM and do nothing.
00462     return P_RADIO;
00463 }
00464 
00465 #pragma CODE_SECTION(_stateEnd, ".radio_code")
00466 // Function completely stops the radio.
00467 static PARENT_STATE _stateEnd(void)
00468 {
00469     SYS_autoResumePlayDisable();
00470     _radioGUIon(FALSE, DONTCARE);
00471     UI_presetRadio(0, sysParam.station);
00472     AUDIO_setInterface(AI_SHUTDOWN);
00473     return P_NULL;
00474 }
00475 
00476 /*****************************************************************************
00477                 Neuros Audio LLC. Confidential Proprietary
00478  *****************************************************************************/

Generated on Wed Jan 19 01:12:46 2005 for neuros-firmware by  doxygen 1.3.9.1