app: ensure track is not repeated
This commit is contained in:
parent
ae875daba7
commit
9b8632c893
|
@ -232,6 +232,56 @@ static void command_reset(void* argument);
|
||||||
*/
|
*/
|
||||||
static void command_bootloader(void* argument);
|
static void command_bootloader(void* argument);
|
||||||
|
|
||||||
|
/** get random track from folder
|
||||||
|
* @param[in] folder MP3 SD card folder number
|
||||||
|
* @return a track within the folder (0 on invalid folder)
|
||||||
|
*/
|
||||||
|
static uint16_t track_random(uint8_t folder)
|
||||||
|
{
|
||||||
|
uint8_t tracks; // number of available tracks in folder
|
||||||
|
switch (folder) {
|
||||||
|
case WELCOME_FOLDER:
|
||||||
|
tracks = WELCOME_TRACKS;
|
||||||
|
break;
|
||||||
|
case MUSIC_FOLDER:
|
||||||
|
tracks = MUSIC_TRACKS;
|
||||||
|
break;
|
||||||
|
case EXIT_FOLDER:
|
||||||
|
tracks = EXIT_TRACKS;
|
||||||
|
break;
|
||||||
|
case TALK_FOLDER:
|
||||||
|
tracks = TALK_TRACKS;
|
||||||
|
break;
|
||||||
|
case TECHNO_FOLDER:
|
||||||
|
tracks = TECHNO_TRACKS;
|
||||||
|
break;
|
||||||
|
case KANGURU_FOLDER:
|
||||||
|
tracks = KANGURU_TRACKS;
|
||||||
|
break;
|
||||||
|
default: // invalid folder
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t played[10] = {0}; // the last tracks played
|
||||||
|
bool track_ok = false; // when we found a valid track number
|
||||||
|
uint16_t track_nr; // the track we will play
|
||||||
|
while (!track_ok) {
|
||||||
|
track_nr = (folder << 8) + (rand() % tracks) + 1; // generate random track number
|
||||||
|
track_ok = true;
|
||||||
|
for (uint8_t i = 0; i < LENGTH(played); i++) { // go though played list
|
||||||
|
if (track_nr == played[i]) { // we already played the track
|
||||||
|
track_ok = false; // the track we have is not OK
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (uint8_t i = 0; i < LENGTH(played) - 1; i++) { // shift playlist
|
||||||
|
played[i + 1] = played[i];
|
||||||
|
}
|
||||||
|
played[0] = track_nr; // save the track we chose
|
||||||
|
return track_nr; // return the random track within folder
|
||||||
|
}
|
||||||
|
|
||||||
/** send command to MP3 playes
|
/** send command to MP3 playes
|
||||||
* @param[in] cmd command to send
|
* @param[in] cmd command to send
|
||||||
* @param[in] data argument for command (such as track number)
|
* @param[in] data argument for command (such as track number)
|
||||||
|
@ -341,7 +391,7 @@ static bool mp3_response(void)
|
||||||
const uint16_t time_passed = (rtc_get_counter_val() - timer_door_closed) / RTC_TICKS_SECOND; // how many seconds have passed since door has been closed
|
const uint16_t time_passed = (rtc_get_counter_val() - timer_door_closed) / RTC_TICKS_SECOND; // how many seconds have passed since door has been closed
|
||||||
switch (playing_state) {
|
switch (playing_state) {
|
||||||
case PLAYING_STATE_INTRO: // the welcome message finished
|
case PLAYING_STATE_INTRO: // the welcome message finished
|
||||||
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, (MUSIC_FOLDER << 8) + (rtc_get_counter_val() % MUSIC_TRACKS) + 1); // play random music track
|
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, track_random(MUSIC_FOLDER)); // play random music track
|
||||||
playing_state = PLAYING_STATE_SONG; // remember we are playing a song (for the first time)
|
playing_state = PLAYING_STATE_SONG; // remember we are playing a song (for the first time)
|
||||||
break;
|
break;
|
||||||
case PLAYING_STATE_SONG: // the song finished
|
case PLAYING_STATE_SONG: // the song finished
|
||||||
|
@ -373,18 +423,18 @@ static bool mp3_response(void)
|
||||||
playing_state = PLAYING_STATE_TIMER_OUTRO; // remember we are playing the timer outro announcement
|
playing_state = PLAYING_STATE_TIMER_OUTRO; // remember we are playing the timer outro announcement
|
||||||
break;
|
break;
|
||||||
case PLAYING_STATE_TIMER_OUTRO: // the timer outro announcement finished
|
case PLAYING_STATE_TIMER_OUTRO: // the timer outro announcement finished
|
||||||
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, (TALK_FOLDER << 8) + (rtc_get_counter_val() % TALK_TRACKS) + 1); // play random talk track
|
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, track_random(TALK_FOLDER)); // play random talk track
|
||||||
playing_state = PLAYING_STATE_TALK; // remember we are playing the talk track
|
playing_state = PLAYING_STATE_TALK; // remember we are playing the talk track
|
||||||
break;
|
break;
|
||||||
case PLAYING_STATE_TALK: // the talk track finished
|
case PLAYING_STATE_TALK: // the talk track finished
|
||||||
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, (MUSIC_FOLDER << 8) + (rtc_get_counter_val() % MUSIC_TRACKS) + 1); // play random music track
|
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, track_random(MUSIC_FOLDER)); // play random music track
|
||||||
playing_state = PLAYING_STATE_SONG; // remember we are playing a song (again)
|
playing_state = PLAYING_STATE_SONG; // remember we are playing a song (again)
|
||||||
break;
|
break;
|
||||||
case PLAYING_STATE_TECHNO: // techno song completed, play the next one
|
case PLAYING_STATE_TECHNO: // techno song completed, play the next one
|
||||||
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, (TECHNO_FOLDER << 8) + (rtc_get_counter_val() % TECHNO_TRACKS) + 1); // play random techno music track
|
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, track_random(TECHNO_FOLDER)); // play random techno music track
|
||||||
break;
|
break;
|
||||||
case PLAYING_STATE_KANGURU: // kanguru sketch completed, play the next one
|
case PLAYING_STATE_KANGURU: // kanguru sketch completed, play the next one
|
||||||
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, (KANGURU_FOLDER << 8) + (rtc_get_counter_val() % KANGURU_TRACKS) + 1); // play random techno music track
|
mp3_command(MP3_CMD_PLAY_FOLDER_FILE, track_random(KANGURU_FOLDER)); // play random techno music track
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
playing_state = PLAYING_STATE_OFF; // we won't play anything else
|
playing_state = PLAYING_STATE_OFF; // we won't play anything else
|
||||||
|
|
Loading…
Reference in New Issue