📄 yampp7_usb.c
字号:
SectorBuffer = (u08 *) card_sbuf; // 512 bytes
// *********************************************************************
u08 tmp;
// *********************************************************************
sei();
lcd_init();
tmp = eeprom_rb(EEPROM_LCD_CONTRAST);
if (tmp > 0x40 || tmp < 0x10)
{
tmp = 45;
eeprom_wb(EEPROM_LCD_CONTRAST,tmp);
}
lcd_contrast(tmp);
light_mode = eeprom_rb(EEPROM_BACKLIGHT) % 6;
backlight_on();
// init VS1001
cbi(PORTB,RESET_PIN); // RESET- lo
delayms(2);
sbi(PORTB,RESET_PIN); // RESET- hi
delayms(10);
vs1001_init_io(); // init VS1001
vs1001_setcomp(F_VS1001);
vs1001_reset();
if ((volume = eeprom_rb(EEPROM_VOLUME)) > MIN_VOLUME)
volume = MIN_VOLUME / 2; // half scale
balance = eeprom_rb(EEPROM_BALANCE) & 0xfe;
bLoudness = eeprom_rb(EEPROM_LOUDNESS) % 13;
bRandom = eeprom_rb(EEPROM_RANDOM);
Repeat = eeprom_rb(EEPROM_REPEAT) % 4;
timemode = eeprom_rb(EEPROM_TIME);
autolock = eeprom_rb(EEPROM_AUTOLOCK);
curIndex = eeprom_rw(EEPROM_SONGPOS);
curPlaylist = eeprom_rw(EEPROM_PLAYLIST);
vs1001_setvolume(volume,balance);
// Init and wait for CARD ready
_p_puts(CardInit_txt);
#ifdef MMC_CARD
MMC_Reset();
#else
ATA_SetDrive(0);
#endif
delayms(10);
#ifndef FIXED_RESET
u08 tmp2;
tmp = 4;
while(tmp--) // for propper CF init after card removing.
{
wdt_reset();
tmp2 = CARD_SW_Reset2();
if (tmp2) // if card is ready
break;
else
beep(SINE_800,50);
}
if (!tmp2) // if card is not ready
PowerOff(); // power off
#else
wdt_reset();
if (!CARD_SW_Reset2())
{
delayms(800);
PowerOff(); // power off
}
#endif
#ifndef MMC_CARD
WriteBYTE(ATA_SectorCount, SLEEP_TIME); // CF standby time * 5 milisecond (0=disable)
WriteBYTE(ATAPI_Cmd, 0xE3); // set CF standby timer and execute IDLE
ATA_WaitBusy();
#endif
init_stuff();
lcd_image(0); // Welcome STOP image
CARD_Read(lcd_data_start + (32*IMAGES_COUNT)); // read set of colours from bitmap (icon00.bmp)
memcpy(&colors[0], SectorBuffer, 40);
lcd_gotoxy(SOFT_VER_INFO_XPOS, SOFT_VER_INFO_YPOS);
lcd_color(colors[SOFT_VER_INFO], colors[SOFT_VER_INFO+16]);
_p_puts(model_txt);
puts(" v.");
_p_puts(version_txt);
beep(SINE_1500,100); // Wakeup beep
ACSR = 0x40; // Enable Analog Comparator and Bandgap reference
InitRnd(); // init randomizer table
LoudSet();
if (curPlaylist >= playlist_qty)
curPlaylist = curIndex = 0;
delayms(1000);
wdt_enable(6);
///////////////////////////////////////////////////////////////////////////////
// start things rolling
///////////////////////////////////////////////////////////////////////////////
event_e event = EV_IDLE;
YADL_PLAY_LIST_ENTRY *pListEntry;
set_event(EV_STOP);
//
// main loop
//
while (1)
{
event = get_event();
switch (event)
{
default:
case EV_IDLE:
break;
case EV_MENU:
info_flag = 3; // disable displaying
menu_event = browse_menu() + 1;
if(menu_event)
{
set_event(menu_event);
break;
}
else
{
BROWSE_BREAK: info_flag = 0; // enable displaying
menu_event = EV_IDLE;
if (isPlaying)
Playlist_name(); // show Playlist name
else
set_event(EV_STOP);
break;
}
case EV_CONTRAST:
set_contrast();
break;
case EV_LIGHTMODE:
lcd_clricon(BL_TI_MODES);
light_mode =(u08)(light_mode + 1) % 6;
if(light_mode == 0)
_p_puts(Blight0);
else if(light_mode == 1)
_p_puts(Blight1);
else if(light_mode == 2)
_p_puts(Blight2);
else if(light_mode == 3)
_p_puts(Blight3);
else if(light_mode == 4)
_p_puts(Blight4);
else
_p_puts(Blight5);
if(light_mode)
backlight_on();
else
backlight_off();
break;
case EV_TIME:
timemode = !timemode; // change mode of time displaying (normal<->remain)
lcd_clricon(BL_TI_MODES);
if(timemode)
_p_puts(TimRem_txt);
else
_p_puts(TimNor_txt);
sleepcount = 0; // clear shutdown timeout count
break;
case EV_PLAYLIST:
event = EV_IDLE;
info_flag = 3; // disable displaying
u16 Index = browse_songs(); // browse songs within playlist
if (Index == (u16)-1)
goto BROWSE_BREAK;
curIndex = Index;
menu_event = EV_IDLE;
info_flag = 0;
InitRnd();
isPlaying = 0;
case EV_PLAY:
if (menu_event)
{
set_event(menu_event);
time_flag = 0;
continue;
}
if (isPlaying) // Pause function
{
while(get_event() != EV_IDLE) // Wait for release key
wdt_reset();
lobatt_time = 0;
MCUCR = 0xA0; // enable SLEEP mode
u08 cc = 6;
isPlaying = 0;
do
{
asm volatile ("sleep"); // go to sleep
asm volatile ("nop");
wdt_reset();
if (cc-- == 0)
cc=8;
lcd_gotoxy(SONG_TIME_XPOS+1, SONG_TIME_YPOS); // position for "Paused" string
if (cc > 4)
lcd_color(colors[PAUSED_TEXT1], colors[PAUSED_TEXT1+16]);
else
lcd_color(colors[PAUSED_TEXT2], colors[PAUSED_TEXT2+16]);
_p_puts(Pause_txt); // printf string on LCD
time_flag = 1;
if (lobatt_time > MAX_PAUSE_TIME || !CARD_SW_Reset2())
PowerOff(); // max 15 minutes of pause
get_key();
} while (check_event() != EV_PLAY); // stay within loop until play pressed again
isPlaying = 1;
time_flag = 5;
break;
}
else // Play function
{
lobatt = 0;
BatteryMeasure();
if (lobatt) // low battery
{
lcd_color(colors[LOBATT_TEXT], colors[LOBATT_TEXT+16]);
lcd_clrline(BATTCHARGE_TEXT_YPOS);
_p_puts(Lobatt_txt);
send_sinewave_beeps();
delayms(1000);
PowerOff();
}
if(curPlaylist < playlist_qty && playlist_qty > 0)
{
pListEntry = get_pl_entry(curPlaylist);
if(curIndex >= pListEntry->entry_qty)
curIndex = 0;
play_song();
}
break;
}
case EV_STOP:
if (menu_event)
{
time_flag = 40;
break;
}
if (isPlaying)
{
sleepcount = 0; // clear shutdown timeout count
vs1001_reset();
vs1001_write(0x0A,0);
InitRnd(); // init randomizer table
isPlaying = 0;
}
info_flag = 0;
lcd_image(0);
/*
u08 q,w;
for(q=0; q<16; q++) // colour pallete test
for(w=0; w<16; w++)
{
lcd_gotoxy(w*8,q*8);
lcd_color(16*q + w, 0);
lcd_putchar(' ');
}
*/
BatteryMeasure();
if (lobatt)
lobatt = 2;
status_display();
if(usb_link)
{
lcd_gotoxy(LINK_ACTIV_TEXT_XPOS, LINK_ACTIV_TEXT_YPOS);
lcd_color(colors[PCLINK_TEXT], colors[PCLINK_TEXT+16]);
_p_puts(PClink_txt);
eeprom_update();
usb_response(0);
lobatt_time = 0;
#ifndef MMC_CARD
EMCUCR = (1<<SRW11); // enable external SRAM 2 waitstates
#endif
set_cpu_speed(0); // CPU clock = XTAL
// break;
}
break;
case EV_BALANCE:
if (isPlaying)
{
info_flag = 1;
time_flag = 0;
Playlist_name();
}
break;
case EV_DOWN: // volume down (or balance left)
if (isPlaying)
{
if(info_flag == 1)
{
time_flag = 0;
#ifdef REVERSE_BALANCE
if (balance < 57)
balance +=2;
#else
if (balance > -57)
balance -=2;
#endif
}
else
{
if (volume <= MIN_VOLUME-VOL_STEP)
volume += VOL_STEP;
else
volume = MIN_VOLUME;
}
goto SETVOL;
}
else if (!menu_event)
set_event(EV_CONTRAST);
break;
case EV_UP: // volume up (or balance right)
if (isPlaying)
{
if(info_flag == 1)
{
time_flag = 0;
#ifdef REVERSE_BALANCE
if (balance > -57)
balance -=2;
#else
if (balance < 57)
balance +=2;
#endif
}
else
{
if (volume >= VOL_STEP)
volume -= VOL_STEP;
else
volume = 0;
}
SETVOL: vs1001_setvolume(volume,balance);
status_display();
break;
}
#if (AUTOLOCK_TIME != 0)
else if (!menu_event)
set_event(EV_AUTOLOCK);
break;
case EV_AUTOLOCK:
autolock = !autolock;
status_display();
sleepcount = 0; // clear shutdown timeout count
if (!menu_event)
delayms(500);
#endif
break;
case EV_NEXT:
if (info_flag == 1)
{
set_event(EV_UP); // if balance control active
break;
}
if (menu_event)
{
set_event(EV_MENU); // if menu is active
break;
}
if (isPlaying)
next_song(1); // while playing
else
set_event(EV_MBASS); // while stop
break;
case EV_PREV:
if (info_flag == 1)
{
set_event(EV_DOWN); // if balance control active
break;
}
if (menu_event)
{
set_event(EV_MENU); // if menu active
break;
}
if (isPlaying)
next_song(2); // while playing
else
set_event(EV_RANDOM); // while stop
break;
case EV_NEXTPL:
next_playlist();
goto PLCHG;
case EV_PREVPL:
prev_playlist();
if (!bRandom)
curIndex = 0;
PLCHG: if (isPlaying)
play_song();
Playlist_name();
break;
case EV_FFWD:
if (isPlaying)
{
MyCluster = next_fat(); // get next cluster position
init_load_sectors(MyCluster); // skip to next cluster
// calculate new size of played data
fileplayed = ClusterCount * YADL_CLUSTERSIZE / 32;
// calculation of playing time - small hazard :-)
addtime = (u16)(fileplayed*32 / (bitrate * 125)) -
vs1001_read(VS1001_PLAYTIME);
outptr = SectorBuffer; // play from buffer 1
vs1001_setvolume(volume+40,balance); // volume down during search
vol_decrease = 1; // setting of volume downed flag
time_flag = 5;
}
else if (!isPlaying && !menu_event)
PowerOff(); // while stop
break;
case EV_MBASS:
if (vs1001_fw == 0x4020)
bLoudness = (u08)(bLoudness+1) % 9;
else if (vs1001_fw == 0x4200)
bLoudness = (u08)(bLoudness+1) % 13;
else
bLoudness = !bLoudness;
LoudSet();
status_display();
sleepcount = 0; // clear shutdown timeout count
break;
case EV_RANDOM:
bRandom = !bRandom;
status_display();
sleepcount = 0; // clear shutdown timeout count
break;
case EV_REPEAT:
Repeat = (u08)(Repeat + 1) % 4;
status_display();
sleepcount = 0; // clear shutdown timeout count
break;
}
event = EV_IDLE;
} // while (1)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -