00001
00196
#include "board.h"
00197
#include "lcd.h"
00198
#include "filesys.h"
00199
#include "vs10xx.h"
00200
#include "storage.h"
00201
#include "display.h"
00202
#include "string.h"
00203
#include "ui.h"
00204
#include "mmc.h"
00205
#include "record.h"
00206
00207
00209 #define u_int8 code unsigned char
00210
00211 #define u_int16 code unsigned int
00212
00213
00214
00215
00217 #define UI_RETURN_DELAY 150
00218
00220 xdata
playingstatetype playingState =
PS_NORMAL;
00221
00223 unsigned char intlevel = 0;
00224
00227 xdata
unsigned char userInterfaceDelayElapsed = 0;
00228
00230 xdata
uimodetype uiMode =
UI_SPEC;
00231
00232 xdata
unsigned char SPMax=0;
00233
00234
00235
00240 void timer0_interrupt(
void) interrupt 1{
00241
static char displayDelay;
00242
userInterfaceDelayElapsed = 1;
00243
if (++displayDelay==12){
00244 displayDelay = 0;
00245
displayPosition++;
00246
if (
displayPosition>
displayLength+7){
00247
displayPosition = -7;
00248 }
00249 }
00250
if (SP>
SPMax)
SPMax = SP;
00251
00252
00253 }
00254
00255
00256
00257
00259 void LoadPatch(){
00260
#if 0
00261
ConsoleWrite (
"Loading patch.\r");
00262
for (
temp.
i=0;
temp.
i <
CODELEN;
temp.
i++) {
00263
Mp3WriteRegister(
atab[
temp.
i],
dtab[
temp.
i]>>8,
dtab[
temp.
i]&0xff);
00264 }
00265
Delay(10);
00266
#endif
00267
}
00268
00270 void StartPatch()
00271 {
00272
00273
#ifdef VS1003
00274
00275
#else
00276
00277
00278
00279
#endif
00280
}
00281
00282
00283
00284
00286 void ScreenSetPlayTime(){
00287
unsigned int playTime;
00288
unsigned char minutes, seconds;
00289
00290 playTime =
Mp3ReadRegister(
SPI_DECODE_TIME);
00291 minutes = playTime/60;
00292 seconds = playTime%60;
00293
displayTitle[0]=(
'0'+minutes/10);
00294
displayTitle[1]=(
'0'+minutes%10);
00295
displayTitle[2]=(
':');
00296
displayTitle[3]=(
'0'+seconds/10);
00297
displayTitle[4]=(
'0'+seconds%10);
00298
displayTitle[5]=(
' ');
00299
displayTitle[6]=(
' ');
00300
displayTitle[7]=(
' ');
00301
00302
if (seconds&1){
00303
if (
playingState ==
PS_RECORDING){
00304
displayTitle[6]=
'o';
00305 }
else{
00306
displayTitle[6]='\x7e';
00307 }
00308
00309 }
00310
00311
if ((
playingState !=
PS_NORMAL)&&(
playingState !=
PS_RECORDING)){
00312
displayTitle[6]='\xdb';
00313 }
00314
00315
00316
00317 }
00318
00319
00320
00321
00322
00323
00324
00328 void AvailableProcessorTime(){
00329
00333
static xdata
unsigned char volume = 20;
00334
00336
static xdata
unsigned char bass = 0;
00337
00339
static xdata
unsigned char treble = 64;
00340
00342
static xdata
unsigned char reclevel = 50;
00343
00344
unsigned int i;
00345
00346
static bit bassUpdateNeeded;
00347
00351
static unsigned char uiReturnDelay=0;
00352
00353
if (!
userInterfaceDelayElapsed){
00354
return;
00355 }
00356
00357
userInterfaceDelayElapsed = 0;
00358
00359
00360
00361
00362
00363
if (uiReturnDelay == 0){
00364
if ((
uiMode !=
UI_SPEC)&&(
uiMode !=
UI_CUE))
00365
uiMode =
UI_TITLE;
00366
else{
00367 }
00368 }
else{
00369 uiReturnDelay--;
00370 }
00371
00372
00373
00374
if (
uiMode==
UI_SPEC)
00375
uiMode++;
00376
00377
00378
00379
00380
if (
uiMode==
UI_INFO)
00381
uiMode++;
00382
if (
uiMode==
UI_STOP)
00383
uiMode++;
00384
00385
00386
switch(
uiMode){
00387
00388
case UI_TITLE:
00389
00390
displayStyle =
DS_TEXT;
00391
ScreenSetPlayTime();
00392
00393
if (
playingState==
PS_RECORDING){
00394
displayStyle =
DS_PERCENTAGE;
00395 }
00396
00397
break;
00398
00399
case UI_STOP:
00400
displayStyle =
DS_NO_YES;
00401 strcpy (
displayTitle,
"Stop? ");
00402
break;
00403
00404
case UI_CUE:
00405
displayStyle =
DS_RAWTEXT;
00406 strcpy (
displayTitle,
"REW/CUE <- ->");
00407
00408
00409
00410
00411
00412
00413
00414
break;
00415
00416
case UI_VOLUME:
00417
LcdSelectFont(
lcdFont_barchars);
00418
displayStyle =
DS_PERCENTAGE;
00419 strcpy(
displayTitle,
"Volume: ");
00420
displayValue = (100-(volume>>1));
00421
if (
displayValue<0)
displayValue = 0;
00422
break;
00423
00424
case UI_BASS:
00425
LcdSelectFont(
lcdFont_barchars);
00426
displayStyle =
DS_PERCENTAGE;
00427 strcpy(
displayTitle,
"Bass: ");
00428
displayValue = (bass/5)*4;
00429
if (
displayValue<1)
displayValue = 1;
00430
break;
00431
00432
case UI_TREBLE:
00433
LcdSelectFont(
lcdFont_barchars);
00434
displayStyle =
DS_PERCENTAGE;
00435 strcpy(
displayTitle,
"Treble: ");
00436
displayValue = (treble/5)*4;
00437
if (
displayValue<1)
displayValue = 1;
00438
break;
00439
00440
case UI_RECLEVEL:
00441
00442
if (
playingState==
PS_RECORDING){
00443
LcdSelectFont(
lcdFont_barchars);
00444
displayStyle =
DS_PERCENTAGE;
00445 strcpy(
displayTitle,
"RecLevel");
00446
displayValue = (reclevel);
00447
if (reclevel==0){
00448 strcpy(
displayTitle,
"RecLevel <Auto> ");
00449
displayStyle =
DS_RAWTEXT;
00450 }
00451 }
else{
00452
00453
displayStyle =
DS_NO_YES;
00454 strcpy (
displayTitle,
"Record? ");
00455 }
00456
break;
00457
00458
00459
case UI_SPEC:
00460
00461
if (
playingState ==
PS_RECORDING){
00462
uiMode++;
00463 }
00464
00465
LcdSelectFont(
lcdFont_vertical_barchars);
00466
displayStyle =
DS_RAWTEXT;
00467
ScreenSetPlayTime();
00468
00469
00470
Mp3WriteRegister(7, 0x18, 0x04);
00471
00472
00473 {
00474
for (i=0;i<8;i++) {
00475
signed char thisband =
Mp3ReadRegister(6);
00476
00477
00478
00479
00480
00481
00482 thisband &= 63;
00483 thisband >>= 1;
00484 thisband -= 3;
00485
if (i==0) thisband -= 2;
00486
if (i==6) thisband += 1;
00487
if (i==7) thisband += 1;
00488
if (thisband>7) thisband = 7;
00489
if (thisband<0) thisband =
' ';
00490
00491
displayTitle[i+8] = thisband;
00492
00493 }
00494 }
00495
break;
00496
00497 }
00498
00499
00500
00501
00502
if ((
KEY_BUTTON) && (uiReturnDelay <
UI_RETURN_DELAY-20)){
00503
LcdReset();
00504
uiMode++;
00505 uiReturnDelay =
UI_RETURN_DELAY;
00506 }
00507
00508
switch(
uiMode){
00509
00510
case UI_TITLE:
00511
case UI_SPEC:
00512
00513
if (
KEY_FARRIGHT){
00514
playingState =
PS_NEXT_SONG;
00515 }
00516
if (
KEY_FARLEFT){
00517
playingState =
PS_PREVIOUS_SONG;
00518 }
00519
break;
00520
00521
00522
case UI_VOLUME:
00523
00524
if (
KEY_FARLEFT){
00525 uiReturnDelay =
UI_RETURN_DELAY;
00526
if (volume++ == 254) volume = 254;
00527
Mp3SetVolume(volume,volume);
00528 }
00529
00530
if (
KEY_FARRIGHT){
00531 uiReturnDelay =
UI_RETURN_DELAY;
00532
if (volume-- == 0) volume = 0;
00533
Mp3SetVolume(volume,volume);
00534 }
00535
break;
00536
00537
case UI_BASS:
00538
case UI_TREBLE:
00539 bassUpdateNeeded = 0;
00540
00541
00542
00543
if (
uiMode==
UI_BASS){
00544
00545
if (
KEY_FARLEFT){
00546 bassUpdateNeeded = 1;
00547
if (bass-- == 0) bass = 0;
00548 }
00549
if (
KEY_FARRIGHT){
00550 bassUpdateNeeded = 1;
00551
if (bass++ == 127) bass = 127;
00552 }
00553
00554 }
else{
00555
00556
if (
KEY_FARLEFT){
00557 bassUpdateNeeded = 1;
00558
if (treble-- == 0) treble = 0;
00559 }
00560
if (
KEY_FARRIGHT){
00561 bassUpdateNeeded = 1;
00562
if (treble++ == 127) treble = 127;
00563 }
00564
00565 }
00566
00567
00568
if (bassUpdateNeeded){
00569
unsigned int newBassRegister;
00570
00571
00572
00573
00589
00590
00591 newBassRegister = (bass + 23) / 10;
00592
00593
00594
00595 newBassRegister |= (bass>>3)<<4;
00596
00597
00598
00599 newBassRegister |= (((148-treble)>>3)+2)<<8;
00600
00601
00602
00603 newBassRegister |= ((treble>>3)-8)<<12;
00604
00605
00606 uiReturnDelay =
UI_RETURN_DELAY;
00607
00608
if (
Mp3ReadRegister(
SPI_BASS)!=newBassRegister){
00609
Mp3WriteRegister(
SPI_BASS,newBassRegister>>8,newBassRegister&0xff);
00610 }
00611
00612
00613
00614
00615
00616
00617
00618
00619 }
00620
00621
break;
00622
00623
00624
case UI_RECLEVEL:
00625
00626
if (
playingState==
PS_RECORDING){
00627
if (
KEY_FARRIGHT){
00628 uiReturnDelay =
UI_RETURN_DELAY;
00629
if (reclevel++ == 100){
00630 reclevel = 100;
00631 }
00632
Mp3WriteRegister(
SPI_AICTRL1,
00633 ((
int)reclevel*32)>>8,((
int)reclevel*32)&0xff);
00634
SPIPutChar(0);
SPIWait();
00635 }
00636
00637
if (
KEY_FARLEFT){
00638 uiReturnDelay =
UI_RETURN_DELAY;
00639
if (reclevel-- == 0){
00640 reclevel = 0;
00641 }
00642
Mp3WriteRegister(
SPI_AICTRL1,
00643 ((
int)reclevel*32)>>8,((
int)reclevel*32)&0xff);
00644
SPIPutChar(0);
SPIWait();
00645 }
00646 }
else{
00647
00648
if (
KEY_FARRIGHT){
00649
00650
playingState=
PS_RECORDING;
00651 }
00652 }
00653
break;
00654
00655
case UI_STOP:
00656
00657
if (
KEY_FARRIGHT){
00658
playingState =
PS_END_OF_SONG;
00659 }
00660
break;
00661
00662
case UI_CUE:
00663
00664
if (
playingState ==
PS_NORMAL){
00665
if (
KEY_FARRIGHT){
00666 uiReturnDelay =
UI_RETURN_DELAY;
00667
playingState =
PS_CUE;
00668 }
00669
if (
KEY_FARLEFT){
00670 uiReturnDelay =
UI_RETURN_DELAY;
00671
playingState =
PS_REWIND;
00672 }
00673 }
00674
00675
break;
00676
00677
case UI_END_OF_MODES:
00678
uiMode =
UI_TITLE;
00679
break;
00680
00681
00682 }
00683
00684
00685
00686
UpdateDisplay();
00687 }
00688
00689
00690
00694 void PlayCurrentFile(){
00695 xdata
char c, nFragments;
00696
00697
playingState =
PS_NORMAL;
00698
00699
00700
LcdLocateHome();
00701
LcdPutConstantString(
"Opening ");
00702
00703 ConsoleWrite (
"Building file fragment table...");
00704 nFragments =
BuildFragmentTable();
00705 ConsoleWrite(
"\rFragments: ");
00706 ConsolePutUInt(nFragments);
00707
00708
LcdLocateHome();
00709
LcdPutConstantString(
"Playing ");
00710
00711
for (c=0; c<nFragments; c++){
00712
sectorAddress.
l =
fragment[c].
start;
00713 ConsoleWrite (
"\rPlayer: Playing from sector ");
00714 ConsolePutUInt (
sectorAddress.
l);
00715
if (
PlayDiskSectors(
fragment[c].length)!=0){
00716
Mp3WriteRegister(
SPI_MODE,0,
SM_OUTOFWAV);
00717
SendZerosToVS10xx();
00718
return;
00719 }
00720 }
00721
SendZerosToVS10xx();
00722
00723
00724
playingState =
PS_NEXT_SONG;
00725
00726 }
00727
00728
00729
00735 void main(){
00736
00737
unsigned int currentFile;
00738
00739
InitBoard();
00740
00741
00742 ET0 = 1;
00743 EA = 1;
00744 TR0 = 1;
00745
00746
00747
InitDisplay (
DS_STATIC,
" ",
" ",0);
00748
00749 ConsoleWrite (
"\rVLSIPlayer\rStarting up.\r\r");
00750
00751
LcdReset();
00752
LcdPutConstantString (
"Filesys ");
00753
LcdLocateLine2();
00754
LcdPrintGenericResult (
InitFileSystem());
00755
00756
Mp3Reset();
00757
00758
00759
00760
00761
if (
KEY_FARLEFT){
00762
while(
KEY_LEFT)
00763 ;
00764
Record();
00765 }
00766
00767
00768
#ifdef VS1003
00769
uiMode =
UI_SPEC;
00770
#else
00771
uiMode =
UI_TITLE;
00772
#endif
00773
00774
playingState =
PS_NEXT_SONG;
00775 currentFile = 1;
00776
00777
while (1){
00778 ConsoleWrite(
"SPMax: ");ConsolePutHex8(
SPMax);
00779 ConsoleWrite(
"PlayingState: ");ConsolePutHex8(
playingState);
00780
00781
00782
if (
playingState ==
PS_RECORDING){
00783
uiMode =
UI_TITLE;
00784
playingState =
Record();
00785
while (
KEY_BUTTON)
00786 ;
00787 ConsoleWrite(
"\rFinished recording.\r");
00788 currentFile = 1;
00789
playingState ==
PS_NEXT_SONG;
00790 }
00791
00792
if (
OpenFile(currentFile)){
00793 currentFile = 1;
00794
if (
OpenFile(currentFile)){
00795
LcdReset();
00796
LcdPutConstantString(
"No files.");
00797
while(1);
00798 }
00799 }
00800
00801
LcdReset();
00802
LcdPutConstantString(
"File ");
00803
LcdPutUInt(currentFile);
00804
LcdLocateLine2();
00805
for (
temp.
c=0;
temp.
c<8;
temp.
c++){
00806
LcdPutChar(
currentFileName[
temp.
c]);
00807 }
00808
00809
00810
while ((
KEY_BUTTON)||(
KEY_FARLEFT)||(
KEY_FARRIGHT)||
00811 (
KEY_LEFT)||(
KEY_RIGHT))
00812 ;
00813
00814
while (((!
KEY_BUTTON)&&(!
KEY_FARLEFT)&&(!
KEY_FARRIGHT))
00815 &&(
playingState ==
PS_NORMAL))
00816 ;
00817
00818
00819
00820
if (
KEY_FARLEFT) currentFile--;
00821
if (
KEY_FARRIGHT) currentFile++;
00822
if (currentFile==0) currentFile = 1;
00823
00824
if (
KEY_BUTTON ||
00825 (
playingState==
PS_NEXT_SONG) ||
00826 (
playingState==
PS_PREVIOUS_SONG)){
00827
while (
KEY_BUTTON)
00828 ;
00829
00830
PlayCurrentFile();
00831 ConsoleWrite (
"Playing state after playing is: ");
00832 ConsolePutUInt (
playingState);
00833
00834
if (
playingState ==
PS_PREVIOUS_SONG) currentFile--;
00835
if (
playingState ==
PS_NEXT_SONG) currentFile++;
00836
if (currentFile==0) currentFile = 1;
00837
if (
playingState ==
PS_END_OF_SONG)
playingState =
PS_NORMAL;
00838
00839
00840
Mp3SoftReset();
00841
LoadPatch();
00842
StartPatch();
00843
00844
00845
while ((
KEY_BUTTON)||(
KEY_FARLEFT)||(
KEY_FARRIGHT)||
00846 (
KEY_LEFT)||(
KEY_RIGHT))
00847 ;
00848 }
00849
00850
00851 }
00852
00853
00854 }
00855
00856