Merge branch 'master' of https://git.schle.nz/fabian/esmp3
This commit is contained in:
commit
a5751eec79
@ -1,2 +1,2 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
echo -n "-DVERSION=\\\"`git describe --tags --dirty`\\\""
|
echo -n "-DVERSION=\\\"`git describe --tags --dirty`-`date +%Y%m%d-%H%M%S`\\\""
|
||||||
|
@ -31,6 +31,11 @@
|
|||||||
#define SM_ADPCM 0x1000
|
#define SM_ADPCM 0x1000
|
||||||
#define SS_DO_NOT_JUMP 0x8000
|
#define SS_DO_NOT_JUMP 0x8000
|
||||||
|
|
||||||
|
struct ID_to_Folder_Map {
|
||||||
|
const char* id;
|
||||||
|
const char* folder;
|
||||||
|
};
|
||||||
|
|
||||||
class Player {
|
class Player {
|
||||||
private:
|
private:
|
||||||
enum state { uninitialized, idle, playing, stopping,
|
enum state { uninitialized, idle, playing, stopping,
|
||||||
@ -70,6 +75,8 @@ private:
|
|||||||
void _patch_adpcm();
|
void _patch_adpcm();
|
||||||
void _speaker_off();
|
void _speaker_off();
|
||||||
void _speaker_on();
|
void _speaker_on();
|
||||||
|
void _fill_id_to_folder_map();
|
||||||
|
String _foldername_for_id(String id);
|
||||||
|
|
||||||
SPISettings _spi_settings_slow = SPISettings(250000, MSBFIRST, SPI_MODE0);
|
SPISettings _spi_settings_slow = SPISettings(250000, MSBFIRST, SPI_MODE0);
|
||||||
SPISettings _spi_settings_fast = SPISettings(4000000, MSBFIRST, SPI_MODE0);
|
SPISettings _spi_settings_fast = SPISettings(4000000, MSBFIRST, SPI_MODE0);
|
||||||
@ -89,6 +96,7 @@ private:
|
|||||||
uint32_t _skip_to;
|
uint32_t _skip_to;
|
||||||
SPIMaster* _spi;
|
SPIMaster* _spi;
|
||||||
unsigned long _stopped_at;
|
unsigned long _stopped_at;
|
||||||
|
std::list<ID_to_Folder_Map> _id_to_folder_map;
|
||||||
public:
|
public:
|
||||||
Player(SPIMaster* s);
|
Player(SPIMaster* s);
|
||||||
void vol_up();
|
void vol_up();
|
||||||
@ -97,6 +105,7 @@ public:
|
|||||||
void track_prev();
|
void track_prev();
|
||||||
bool is_playing();
|
bool is_playing();
|
||||||
|
|
||||||
|
bool play_id(String id);
|
||||||
bool play_album(String album);
|
bool play_album(String album);
|
||||||
void play_random_album();
|
void play_random_album();
|
||||||
bool play_song(String album, uint8_t song_index, uint32_t offset=0);
|
bool play_song(String album, uint8_t song_index, uint32_t offset=0);
|
||||||
|
@ -64,9 +64,14 @@ void Controller::_check_rfid() {
|
|||||||
if (uid > 0) {
|
if (uid > 0) {
|
||||||
_mqtt_client->publish_rfid_uid(uid);
|
_mqtt_client->publish_rfid_uid(uid);
|
||||||
_no_rfid_card_count = 0;
|
_no_rfid_card_count = 0;
|
||||||
INFO("New RFID card uid: %08x\n", uid);
|
String temp = String(uid, HEX);
|
||||||
String s_uid = String(uid, HEX);
|
String s_uid = "";
|
||||||
_player->play_album(s_uid);
|
for (int i=0; i<(8-s_uid.length()); i++) {
|
||||||
|
s_uid.concat("0");
|
||||||
|
}
|
||||||
|
s_uid.concat(temp);
|
||||||
|
INFO("New RFID card uid: %s\n", s_uid.c_str());
|
||||||
|
_player->play_id(s_uid);
|
||||||
} else {
|
} else {
|
||||||
if (_no_rfid_card_count >= 1) {
|
if (_no_rfid_card_count >= 1) {
|
||||||
INFO("No more RFID card.\n");
|
INFO("No more RFID card.\n");
|
||||||
@ -105,7 +110,7 @@ void Controller::_execute_serial_command(String cmd) {
|
|||||||
} else if (cmd.equals("play")) {
|
} else if (cmd.equals("play")) {
|
||||||
_player->play_random_album();
|
_player->play_random_album();
|
||||||
} else if (cmd.startsWith("play ")) {
|
} else if (cmd.startsWith("play ")) {
|
||||||
_player->play_album(cmd.substring(5));
|
_player->play_id(cmd.substring(5));
|
||||||
} else if (cmd.startsWith("sys ")) {
|
} else if (cmd.startsWith("sys ")) {
|
||||||
_player->play_system_sound(cmd.substring(4));
|
_player->play_system_sound(cmd.substring(4));
|
||||||
} else if (cmd.equals("stop")) {
|
} else if (cmd.equals("stop")) {
|
||||||
|
@ -15,6 +15,8 @@ Player::Player(SPIMaster* s) {
|
|||||||
_spi->disable();
|
_spi->disable();
|
||||||
PIN_VS1053_DREQ_SETUP();
|
PIN_VS1053_DREQ_SETUP();
|
||||||
|
|
||||||
|
_fill_id_to_folder_map();
|
||||||
|
|
||||||
_init();
|
_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,6 +402,47 @@ std::list<String> Player::_files_in_dir(String path) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::_fill_id_to_folder_map() {
|
||||||
|
DEBUG("_fill_id_to_folder_map() running...");
|
||||||
|
_spi->select_sd();
|
||||||
|
File root = SD.open("/");
|
||||||
|
File entry;
|
||||||
|
while (entry = root.openNextFile()) {
|
||||||
|
String foldername = entry.name();
|
||||||
|
TRACE("Looking at %s...\n", foldername.c_str());
|
||||||
|
if (!entry.isDirectory() || foldername.startsWith("/.")) continue;
|
||||||
|
if (!SD.exists(foldername + "/id.txt")) {
|
||||||
|
TRACE("Folder %s does not contain id.txt -> ignoring\n", foldername.c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
TRACE("Reading contents of %s...\n", (foldername + "/id.txt").c_str());
|
||||||
|
File f = SD.open(foldername + "/id.txt");
|
||||||
|
String buffer = "";
|
||||||
|
while (f.available()) {
|
||||||
|
char c = f.read();
|
||||||
|
if (c=='\n' || c=='\r') {
|
||||||
|
if (buffer.length() > 0) {
|
||||||
|
ID_to_Folder_Map m = {buffer.c_str(), foldername.c_str()};
|
||||||
|
DEBUG("Adding mapping '%s'=>'%s'\n", m.id, m.folder);
|
||||||
|
_id_to_folder_map.push_back(m);
|
||||||
|
buffer = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f.close();
|
||||||
|
|
||||||
|
if (buffer.length() > 0) {
|
||||||
|
ID_to_Folder_Map m = {buffer.c_str(), foldername.c_str()};
|
||||||
|
DEBUG("Adding mapping '%s'=>'%s'\n", m.id, m.folder);
|
||||||
|
_id_to_folder_map.push_back(m);
|
||||||
|
}
|
||||||
|
entry.close();
|
||||||
|
}
|
||||||
|
root.close();
|
||||||
|
DEBUG("fill_id_to_folder_map done.\n");
|
||||||
|
_spi->select_sd(false);
|
||||||
|
}
|
||||||
|
|
||||||
String Player::_random_album() {
|
String Player::_random_album() {
|
||||||
std::list<String> albums = ls("/", false, true, false);
|
std::list<String> albums = ls("/", false, true, false);
|
||||||
uint8_t rnd = random(albums.size());
|
uint8_t rnd = random(albums.size());
|
||||||
@ -412,9 +455,27 @@ void Player::play_random_album() {
|
|||||||
play_album(_random_album());
|
play_album(_random_album());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Player::play_id(String id) {
|
||||||
|
String folder = _foldername_for_id(id);
|
||||||
|
if (folder.length()==0) return false;
|
||||||
|
return play_album(folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
String Player::_foldername_for_id(String id) {
|
||||||
|
DEBUG("Searching for id %s...\n", id.c_str());
|
||||||
|
for(std::list<ID_to_Folder_Map>::iterator it=_id_to_folder_map.begin(); it!=_id_to_folder_map.end(); it++) {
|
||||||
|
if (id.equals((*it).id)) {
|
||||||
|
DEBUG("Found folder '%s' for id %s.\n", (*it).folder, id.c_str());
|
||||||
|
return (*it).folder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG("No folder found for id %s.\n", id.c_str());
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
bool Player::play_album(String album) {
|
bool Player::play_album(String album) {
|
||||||
album_state s = _last_tracks[album.c_str()];
|
album_state s = _last_tracks[album.c_str()];
|
||||||
DEBUG("Last index for album %s was %d,%d\n", album.c_str(), s.index, s.position);
|
DEBUG("Last index for album '%s' was %d,%d\n", album.c_str(), s.index, s.position);
|
||||||
return play_song(album, s.index, s.position);
|
return play_song(album, s.index, s.position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,14 +483,7 @@ bool Player::play_song(String album, uint8_t index, uint32_t skip_to) {
|
|||||||
if (_state == sleeping || _state == recording) _wakeup();
|
if (_state == sleeping || _state == recording) _wakeup();
|
||||||
if (_state != idle) return false;
|
if (_state != idle) return false;
|
||||||
DEBUG("Trying to play song at index %d, offset %d of album %s\n", index, skip_to, album.c_str());
|
DEBUG("Trying to play song at index %d, offset %d of album %s\n", index, skip_to, album.c_str());
|
||||||
String path = _find_album_dir(album);
|
std::list<String> files = _files_in_dir(album);
|
||||||
if (path.length()==0) {
|
|
||||||
ERROR("Could not find album.\n");
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
INFO("Found album in dir '%s'.\n", path.c_str());
|
|
||||||
}
|
|
||||||
std::list<String> files = _files_in_dir(path);
|
|
||||||
_playing_album_songs = files.size();
|
_playing_album_songs = files.size();
|
||||||
DEBUG("Found %d songs in album\n", files.size());
|
DEBUG("Found %d songs in album\n", files.size());
|
||||||
if (index >= files.size()) {
|
if (index >= files.size()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user