Die Position in einer Playlist beilbt beibehalten, solange die Papabox nicht neu gestartet wird.
This commit is contained in:
parent
b2cf9d6277
commit
913a64d465
@ -15,6 +15,7 @@ class Controller {
|
|||||||
bool is_rfid_present = false;
|
bool is_rfid_present = false;
|
||||||
unsigned long last_rfid_check = 0;
|
unsigned long last_rfid_check = 0;
|
||||||
unsigned long last_button_check = 0;
|
unsigned long last_button_check = 0;
|
||||||
|
unsigned long last_position_save = 0;
|
||||||
uint8_t button_pressed = 0;
|
uint8_t button_pressed = 0;
|
||||||
unsigned long button_pressed_since = 0;
|
unsigned long button_pressed_since = 0;
|
||||||
bool button_already_processed = false;
|
bool button_already_processed = false;
|
||||||
|
9
include/persisted_playlist.h
Normal file
9
include/persisted_playlist.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
struct PersistedPlaylist {
|
||||||
|
String dir;
|
||||||
|
uint16_t file = 0;
|
||||||
|
uint32_t position = 0;
|
||||||
|
PersistedPlaylist(String s="") : dir(s) {}
|
||||||
|
};
|
@ -2,17 +2,19 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include "persisted_playlist.h"
|
||||||
|
|
||||||
class Playlist {
|
class Playlist {
|
||||||
private:
|
private:
|
||||||
std::vector<String> files;
|
std::vector<String> files;
|
||||||
uint8_t current_file = 0;
|
uint8_t current_file = 0;
|
||||||
uint32_t current_time = 0;
|
uint32_t current_time = 0;
|
||||||
void set_current_position(uint8_t file, uint32_t position=0);
|
|
||||||
String rfid_id;
|
String rfid_id;
|
||||||
|
PersistedPlaylist* pp;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Playlist(String rfid_id="");
|
Playlist();
|
||||||
|
Playlist(String rfid_id, PersistedPlaylist* p);
|
||||||
void add_file(String filename);
|
void add_file(String filename);
|
||||||
void sort();
|
void sort();
|
||||||
String get_rfid_id();
|
String get_rfid_id();
|
||||||
@ -23,4 +25,6 @@ class Playlist {
|
|||||||
void set_current_time(uint32_t time);
|
void set_current_time(uint32_t time);
|
||||||
uint32_t get_current_time();
|
uint32_t get_current_time();
|
||||||
void shuffle();
|
void shuffle();
|
||||||
|
void set_current_position(uint8_t file, uint32_t position=0);
|
||||||
|
void save_current_position(uint32_t position=0);
|
||||||
};
|
};
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "playlist.h"
|
#include "playlist.h"
|
||||||
|
#include "persisted_playlist.h"
|
||||||
|
|
||||||
|
class Playlist;
|
||||||
|
|
||||||
class PlaylistManager {
|
class PlaylistManager {
|
||||||
private:
|
private:
|
||||||
@ -13,9 +16,10 @@ class PlaylistManager {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
PlaylistManager();
|
PlaylistManager();
|
||||||
std::map<String, String> map;
|
std::map<String, PersistedPlaylist> map;
|
||||||
Playlist get_playlist(String rfid_id);
|
Playlist get_playlist(String rfid_id);
|
||||||
bool has_playlist(String rfid_id);
|
bool has_playlist(String rfid_id);
|
||||||
Playlist current_playlist;
|
Playlist current_playlist;
|
||||||
void set_audio_current_time(uint32_t time);
|
void set_audio_current_time(uint32_t time);
|
||||||
|
String pp_to_String();
|
||||||
};
|
};
|
@ -10,6 +10,11 @@ void Controller::handle() {
|
|||||||
handle_buttons();
|
handle_buttons();
|
||||||
last_button_check = millis();
|
last_button_check = millis();
|
||||||
}
|
}
|
||||||
|
if (last_position_save + 10000 < millis() || last_position_save > millis()) {
|
||||||
|
current_playlist.save_current_position(audio.getFilePos());
|
||||||
|
last_position_save = millis();
|
||||||
|
//Serial.println(pm->pp_to_String().c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Controller::handle_buttons() {
|
void Controller::handle_buttons() {
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#include "playlist.h"
|
#include "playlist.h"
|
||||||
|
|
||||||
Playlist::Playlist(String id) {
|
Playlist::Playlist() {}
|
||||||
|
|
||||||
|
Playlist::Playlist(String id, PersistedPlaylist* p) {
|
||||||
rfid_id = id;
|
rfid_id = id;
|
||||||
|
pp = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
String Playlist::get_rfid_id() {
|
String Playlist::get_rfid_id() {
|
||||||
@ -16,9 +19,22 @@ void Playlist::sort() {
|
|||||||
std::sort(files.begin(), files.end());
|
std::sort(files.begin(), files.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Playlist::set_current_position(uint8_t file, uint32_t seconds) {
|
void Playlist::set_current_position(uint8_t file, uint32_t bytes) {
|
||||||
|
log_d("Setting position: File %d, bytes %d.", file, bytes);
|
||||||
current_file = file;
|
current_file = file;
|
||||||
current_time = seconds;
|
current_time = bytes;
|
||||||
|
save_current_position();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Playlist::save_current_position(uint32_t position) {
|
||||||
|
if (position==0) {
|
||||||
|
position = current_time;
|
||||||
|
}
|
||||||
|
log_d("Saving current position: File %d, bytes %d.", current_file, position);
|
||||||
|
if (pp != NULL) {
|
||||||
|
pp->file = current_file;
|
||||||
|
pp->position = position;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String Playlist::get_current_file_name() {
|
String Playlist::get_current_file_name() {
|
||||||
@ -54,7 +70,7 @@ void Playlist::restart() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Playlist::set_current_time(uint32_t pos) {
|
void Playlist::set_current_time(uint32_t pos) {
|
||||||
current_time = pos;
|
set_current_position(current_file, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Playlist::get_current_time() {
|
uint32_t Playlist::get_current_time() {
|
||||||
|
@ -23,7 +23,7 @@ PlaylistManager::PlaylistManager() {
|
|||||||
String rfid_id = data.substring(0, eq);
|
String rfid_id = data.substring(0, eq);
|
||||||
String folder = data.substring(eq + 1);
|
String folder = data.substring(eq + 1);
|
||||||
Serial.printf(" Adding mapping: %s=>%s\n", rfid_id.c_str(), folder.c_str());
|
Serial.printf(" Adding mapping: %s=>%s\n", rfid_id.c_str(), folder.c_str());
|
||||||
map[rfid_id] = folder;
|
map[rfid_id] = PersistedPlaylist(folder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.close();
|
f.close();
|
||||||
@ -38,8 +38,10 @@ Playlist PlaylistManager::get_playlist(String rfid_id) {
|
|||||||
Serial.printf("No known playlist for id %s.\n", rfid_id);
|
Serial.printf("No known playlist for id %s.\n", rfid_id);
|
||||||
return current_playlist;
|
return current_playlist;
|
||||||
} else {
|
} else {
|
||||||
current_playlist = Playlist(rfid_id);
|
PersistedPlaylist* ap = &(map[rfid_id]);
|
||||||
String path = map[rfid_id];
|
log_d("PP status is: File %d, bytes %d.", ap->file, ap->position);
|
||||||
|
current_playlist = Playlist(rfid_id, ap);
|
||||||
|
String path = ap->dir;
|
||||||
if (path.startsWith("/")) {
|
if (path.startsWith("/")) {
|
||||||
File dir = SD.open(path);
|
File dir = SD.open(path);
|
||||||
while(File entry = dir.openNextFile()) {
|
while(File entry = dir.openNextFile()) {
|
||||||
@ -54,6 +56,7 @@ Playlist PlaylistManager::get_playlist(String rfid_id) {
|
|||||||
entry.close();
|
entry.close();
|
||||||
}
|
}
|
||||||
dir.close();
|
dir.close();
|
||||||
|
current_playlist.set_current_position(ap->file, ap->position);
|
||||||
} else if (path.startsWith("http")) {
|
} else if (path.startsWith("http")) {
|
||||||
Serial.printf("Adding URL %s to the list of files\n", path.c_str());
|
Serial.printf("Adding URL %s to the list of files\n", path.c_str());
|
||||||
current_playlist.add_file(path);
|
current_playlist.add_file(path);
|
||||||
@ -72,3 +75,11 @@ void PlaylistManager::set_audio_current_time(uint32_t time) {
|
|||||||
bool PlaylistManager::has_playlist(String rfid_id) {
|
bool PlaylistManager::has_playlist(String rfid_id) {
|
||||||
return map.count(rfid_id) == 1;
|
return map.count(rfid_id) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String PlaylistManager::pp_to_String() {
|
||||||
|
String s = "";
|
||||||
|
for(const auto& kv : map) {
|
||||||
|
s += kv.first + "=" + kv.second.file + "," + kv.second.position + '\n';
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user