00001
00002
00003
00004
00005
00006
00007
00029
00030
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
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
00067 static HMENU menu = INVALID_MENU_HDL;
00068 static int curPresetIdx;
00069
00070
00071
00072
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
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
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
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
00303
00304
00305
00306
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
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
00327 if( ((presetIdx >= 1)&&(presetIdx <= 5))&&
00328 (station == UI_presetStation(presetIdx)) )
00329 {
00330 curPresetIdx = presetIdx;
00331
00332 mMENU_update(menu, 5, (ULONG)graf_icon_preset, FALSE);
00333
00334
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
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
00356 static void _seeksetup(int direction)
00357 {
00358 if(TRUE == TMR_isActive(TMR_FRWD_DOUBLECLICK))
00359 {
00360
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
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
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
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:
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
00462 return P_RADIO;
00463 }
00464
00465 #pragma CODE_SECTION(_stateEnd, ".radio_code")
00466
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
00478