From 913a64d46539ca4db922cb1e124862b7bcad974a Mon Sep 17 00:00:00 2001 From: Fabian Schlenz Date: Thu, 25 Aug 2022 14:52:12 +0200 Subject: [PATCH] Die Position in einer Playlist beilbt beibehalten, solange die Papabox nicht neu gestartet wird. --- include/controller.h | 1 + include/persisted_playlist.h | 9 +++++++++ include/playlist.h | 8 ++++++-- include/playlist_manager.h | 6 +++++- src/controller.cpp | 5 +++++ src/playlist.cpp | 24 ++++++++++++++++++++---- src/playlist_manager.cpp | 17 ++++++++++++++--- 7 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 include/persisted_playlist.h diff --git a/include/controller.h b/include/controller.h index 428558a..1d7f7ef 100644 --- a/include/controller.h +++ b/include/controller.h @@ -15,6 +15,7 @@ class Controller { bool is_rfid_present = false; unsigned long last_rfid_check = 0; unsigned long last_button_check = 0; + unsigned long last_position_save = 0; uint8_t button_pressed = 0; unsigned long button_pressed_since = 0; bool button_already_processed = false; diff --git a/include/persisted_playlist.h b/include/persisted_playlist.h new file mode 100644 index 0000000..d16ea28 --- /dev/null +++ b/include/persisted_playlist.h @@ -0,0 +1,9 @@ +#pragma once + + +struct PersistedPlaylist { + String dir; + uint16_t file = 0; + uint32_t position = 0; + PersistedPlaylist(String s="") : dir(s) {} +}; \ No newline at end of file diff --git a/include/playlist.h b/include/playlist.h index 1edbfce..6edb34e 100644 --- a/include/playlist.h +++ b/include/playlist.h @@ -2,17 +2,19 @@ #include #include +#include "persisted_playlist.h" class Playlist { private: std::vector files; uint8_t current_file = 0; uint32_t current_time = 0; - void set_current_position(uint8_t file, uint32_t position=0); String rfid_id; + PersistedPlaylist* pp; public: - Playlist(String rfid_id=""); + Playlist(); + Playlist(String rfid_id, PersistedPlaylist* p); void add_file(String filename); void sort(); String get_rfid_id(); @@ -23,4 +25,6 @@ class Playlist { void set_current_time(uint32_t time); uint32_t get_current_time(); void shuffle(); + void set_current_position(uint8_t file, uint32_t position=0); + void save_current_position(uint32_t position=0); }; diff --git a/include/playlist_manager.h b/include/playlist_manager.h index ab07ad2..52e1289 100644 --- a/include/playlist_manager.h +++ b/include/playlist_manager.h @@ -4,6 +4,9 @@ #include #include #include "playlist.h" +#include "persisted_playlist.h" + +class Playlist; class PlaylistManager { private: @@ -13,9 +16,10 @@ class PlaylistManager { public: PlaylistManager(); - std::map map; + std::map map; Playlist get_playlist(String rfid_id); bool has_playlist(String rfid_id); Playlist current_playlist; void set_audio_current_time(uint32_t time); + String pp_to_String(); }; \ No newline at end of file diff --git a/src/controller.cpp b/src/controller.cpp index acde59a..91e033b 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -10,6 +10,11 @@ void Controller::handle() { handle_buttons(); 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() { diff --git a/src/playlist.cpp b/src/playlist.cpp index f6aa218..0218467 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -1,7 +1,10 @@ #include "playlist.h" -Playlist::Playlist(String id) { +Playlist::Playlist() {} + +Playlist::Playlist(String id, PersistedPlaylist* p) { rfid_id = id; + pp = p; } String Playlist::get_rfid_id() { @@ -16,9 +19,22 @@ void Playlist::sort() { 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_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() { @@ -54,7 +70,7 @@ void Playlist::restart() { } void Playlist::set_current_time(uint32_t pos) { - current_time = pos; + set_current_position(current_file, pos); } uint32_t Playlist::get_current_time() { diff --git a/src/playlist_manager.cpp b/src/playlist_manager.cpp index 75f2776..643ec12 100644 --- a/src/playlist_manager.cpp +++ b/src/playlist_manager.cpp @@ -23,7 +23,7 @@ PlaylistManager::PlaylistManager() { String rfid_id = data.substring(0, eq); String folder = data.substring(eq + 1); 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(); @@ -38,8 +38,10 @@ Playlist PlaylistManager::get_playlist(String rfid_id) { Serial.printf("No known playlist for id %s.\n", rfid_id); return current_playlist; } else { - current_playlist = Playlist(rfid_id); - String path = map[rfid_id]; + PersistedPlaylist* ap = &(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("/")) { File dir = SD.open(path); while(File entry = dir.openNextFile()) { @@ -54,6 +56,7 @@ Playlist PlaylistManager::get_playlist(String rfid_id) { entry.close(); } dir.close(); + current_playlist.set_current_position(ap->file, ap->position); } else if (path.startsWith("http")) { Serial.printf("Adding URL %s to the list of files\n", path.c_str()); current_playlist.add_file(path); @@ -71,4 +74,12 @@ void PlaylistManager::set_audio_current_time(uint32_t time) { bool PlaylistManager::has_playlist(String rfid_id) { 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; } \ No newline at end of file