User Interface, Wifi timeout

This commit is contained in:
Stefan Ostermann 2023-10-05 21:00:26 +02:00
parent af25c8af80
commit 3f04aa1c41
3 changed files with 120 additions and 85 deletions

View File

@ -11,9 +11,9 @@ const char index_html[] PROGMEM = R"rawliteral(
<span id="state"></span><br/><br/>
<div>
<button class="prev-button" onmouseup="simpleGetCall('prev');" ontouchend="simpleGetCall('prev');"></button>
<button class="play-button" onmouseup="simpleGetCall('toggleplaypause');" ontouchend="simpleGetCall('toggleplaypause');"></button>
<button class="next-button" onmouseup="simpleGetCall('next');" ontouchend="simpleGetCall('next');"></button><br/><br/>
<button class="prev-button" onclick="simpleGetCall('prev');""></button>
<button class="play-button" onclick="simpleGetCall('toggleplaypause');"></button>
<button class="next-button" onclick="simpleGetCall('next');"></button><br/><br/>
</div>
<div class="slidecontainer">
<label for="progress" id="progressLabel"></label>
@ -23,7 +23,7 @@ const char index_html[] PROGMEM = R"rawliteral(
</div>
<div class="slidecontainer">
<label for="volume">Vol</label>
<input name="volume" type="range" min="0" max="21" value="12" class="slider" id="volumeSlider"
<input name="volume" type="range" min="0" max="15" value="7" class="slider" id="volumeSlider"
onmouseup="postValue('volume',document.getElementById('volumeSlider').value);"
ontouchend="postValue('volume',document.getElementById('volumeSlider').value);">
</div>

View File

@ -54,6 +54,8 @@ void writeFile(fs::FS &fs, const char * path, const char * message){
unsigned long lastStart = 0;
uint8_t buttontoignore = 0;
const int startDelay = 250;
#endif

View File

@ -8,7 +8,6 @@
#include <ESPAsyncWiFiManager.h> //https://github.com/tzapu/WiFiManager WiFi Configuration Magic
#include <ArduinoJson.h>
#include "Audio.h"
#include <SPI.h>
@ -26,9 +25,9 @@
#define I2S_BCLK 27 // connect to DAC pin BCK
#define I2S_LRC 25 // connect to DAC pin LCK
#define BTN_START_STOP 17 // Button on XX and GND
#define BTN_NEXT 16
#define BTN_PREV 4
#define BTN_START_STOP 4 // Button on XX and GND
#define BTN_NEXT 17
#define BTN_PREV 16
#define CS_SDCARD 22
@ -44,7 +43,7 @@ File mp3File;
Audio audio;
uint volume = 8;
uint volume = 7;
uint rfid_loop = RFID_LOOP_INTERVAL;
@ -71,7 +70,7 @@ bool asyncNext = false;
bool asyncPrev = false;
std::map<String, String> rfid_map{{"67 152 204 14", "01-The_Box_Tops-The_Letter.mp3"},
{"67 175 148 160","068-Der_Schatz_im_Bergsee"}};
{"67 175 148 160", "068-Der_Schatz_im_Bergsee"}};
void activateSD()
{
@ -93,7 +92,8 @@ void deactivateRFID()
digitalWrite(CS_RFID, HIGH);
}
void playSongByName(String song) {
void playSongByName(String song)
{
currentNode = rootNode.advanceToMP3(&song);
String mp3File = currentNode->getCurrentPlayingFilePath();
Serial.println(mp3File.c_str());
@ -104,28 +104,27 @@ void playSongByName(String song) {
deactivateSD();
}
void playSongByRFID(String id) {
void playSongByRFID(String id)
{
String song = rfid_map[id];
Serial.println("searching for ");
Serial.println(song);
playSongByName(song);
}
/**
* @brief Wrapper, so that we can intercept each call for other stuff.
*
* @param filename
* @param resumeFilePos
* @return true
* @return false
*
* @param filename
* @param resumeFilePos
* @return true
* @return false
*/
bool playFile(const char* filename, uint32_t resumeFilePos) {
bool playFile(const char *filename, uint32_t resumeFilePos)
{
return audio.connecttoSD(filename, resumeFilePos);
}
void playNextMp3()
{
stop();
@ -142,7 +141,8 @@ void playNextMp3()
currentNode = rootNode.advanceToNextMP3(currentNode->getCurrentPlaying());
}
if (currentNode!=NULL) {
if (currentNode != NULL)
{
currentNode->setSecondsPlayed(0);
}
@ -158,7 +158,7 @@ void playNextMp3()
void audio_info(const char *info)
{
//Serial.print("info "); Serial.println(info);
// Serial.print("info "); Serial.println(info);
}
void mute()
@ -180,18 +180,17 @@ String getState()
{
DynamicJsonDocument jsonState(1024);
jsonState["playing"] = audio.isRunning();
if (currentNode!=NULL)
if (currentNode != NULL)
jsonState["title"] = *currentNode->getCurrentPlaying();
else
else
jsonState["title"] = "Angehalten";
jsonState["time"] = audio.getAudioCurrentTime();
jsonState["volume"] = audio.getVolume();
jsonState["length"] = audio.getAudioFileDuration();
String output;
serializeJson(jsonState,output);
serializeJson(jsonState, output);
return output;
}
String processor(const String &var)
@ -207,9 +206,10 @@ void stop()
{
if (audio.isRunning())
{
Serial.println("stopping audio.");
Serial.println("stopping audio.");
audio.stopSong();
if (currentNode!=NULL) {
if (currentNode != NULL)
{
currentNode->setSecondsPlayed(0);
}
}
@ -230,8 +230,10 @@ void togglePlayPause()
{
if (currentNode != NULL)
{
audio.pauseResume();
} else {
audio.pauseResume();
}
else
{
playNextMp3();
}
}
@ -280,10 +282,7 @@ void setup()
deactivateRFID();
activateSD();
// first parameter is name of access point, second is the password
AsyncWiFiManager wifiManager(&server, &dns);
wifiManager.autoConnect("HannaBox");
Serial.print("Initializing SD card...");
@ -321,49 +320,59 @@ void setup()
Serial.println("Audio initialized.");
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send_P(200, "text/html", index_html, processor); });
// first parameter is name of access point, second is the password
AsyncWiFiManager wifiManager(&server, &dns);
server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send_P(200, "text/css", css); });
wifiManager.setTimeout(180);
server.on("/state", HTTP_GET, [](AsyncWebServerRequest *request)
{
if (wifiManager.autoConnect("HannaBox"))
{
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send_P(200, "text/html", index_html, processor); });
server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send_P(200, "text/css", css); });
server.on("/state", HTTP_GET, [](AsyncWebServerRequest *request)
{
String state = getState();
request->send(200, "application/json", state.c_str()); });
server.on("/start", HTTP_GET, [](AsyncWebServerRequest *request)
{
server.on("/start", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send(200, "text/plain", "start");
start(); });
server.on("/toggleplaypause", HTTP_GET, [](AsyncWebServerRequest *request)
{
server.on("/toggleplaypause", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send(200, "text/plain", "toggleplaypause");
togglePlayPause(); });
server.on("/stop", HTTP_GET, [](AsyncWebServerRequest *request)
{
server.on("/stop", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send(200, "text/plain", "stop");
stop(); });
server.on("/next", HTTP_GET, [](AsyncWebServerRequest *request)
{
server.on("/next", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send(200, "text/plain", "next");
next(); });
server.on("/playnamed", HTTP_POST, named_song_action);
server.on("/progress", HTTP_POST, progress_action);
server.on("/playnamed", HTTP_POST, named_song_action);
server.on("/volume", HTTP_POST, volume_action);
server.on("/progress", HTTP_POST, progress_action);
server.begin();
server.on("/volume", HTTP_POST, volume_action);
server.begin();
Serial.println("Wifi initialized.");
} else {
Serial.println("Wifi timed out. Fallback no Wifi.");
}
xTaskCreatePinnedToCore(
loop2, /* Function to implement the task */
@ -377,42 +386,51 @@ void setup()
Serial.println("initialization done.");
}
void named_song_action(AsyncWebServerRequest *request) {
void named_song_action(AsyncWebServerRequest *request)
{
Serial.println("named song!");
int params = request->params();
for (int i = 0; i < params; i++) {
AsyncWebParameter* p = request->getParam(i);
for (int i = 0; i < params; i++)
{
AsyncWebParameter *p = request->getParam(i);
Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
if (p->name()=="title") {
if (p->name() == "title")
{
playSongByName(p->value());
}
}
request->send_P(200, "text/plain", "ok");
}
void progress_action(AsyncWebServerRequest *request) {
void progress_action(AsyncWebServerRequest *request)
{
Serial.println("progress!");
int params = request->params();
for (int i = 0; i < params; i++) {
AsyncWebParameter* p = request->getParam(i);
for (int i = 0; i < params; i++)
{
AsyncWebParameter *p = request->getParam(i);
Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
if (p->name()=="value") {
if (p->name() == "value")
{
audio.setAudioPlayPosition(atoi(p->value().c_str()));
}
}
request->send_P(200, "text/plain", "ok");
}
void volume_action(AsyncWebServerRequest *request) {
void volume_action(AsyncWebServerRequest *request)
{
Serial.println("volume!");
int params = request->params();
for (int i = 0; i < params; i++) {
AsyncWebParameter* p = request->getParam(i);
for (int i = 0; i < params; i++)
{
AsyncWebParameter *p = request->getParam(i);
Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
if (p->name()=="value") {
if (p->name() == "value")
{
audio.setVolume(atoi(p->value().c_str()));
}
}
@ -423,37 +441,46 @@ void loop()
{
if (audio.isRunning())
{
if (asyncStop) {
asyncStop = false;
stop();
if (asyncStop)
{
asyncStop = false;
stop();
}
deactivateRFID();
activateSD();
audio.loop();
if (currentNode!=NULL) {
if (currentNode != NULL)
{
currentNode->setSecondsPlayed(audio.getAudioCurrentTime());
}
deactivateSD();
activateRFID();
} else if (asyncStart) {
}
else if (asyncStart)
{
asyncStart = false;
start();
}
if (asyncTogglePlayPause) {
}
if (asyncTogglePlayPause)
{
asyncTogglePlayPause = false;
togglePlayPause();
} else if (asyncNext) {
}
else if (asyncNext)
{
asyncNext = false;
next();
} else if (asyncPrev) {
}
else if (asyncPrev)
{
asyncPrev = false;
Serial.println("Previous not yet implemented!");
}
rfid_loop--;
if (rfid_loop == 0)
{
rfid_loop = RFID_LOOP_INTERVAL;
@ -475,11 +502,13 @@ void loop2(void *parameter)
if (buttonPressed(BTN_START_STOP))
{
asyncTogglePlayPause = true;
}
if (buttonPressed(BTN_NEXT)) {
}
if (buttonPressed(BTN_NEXT))
{
asyncNext = true;
}
if (buttonPressed(BTN_PREV)) {
if (buttonPressed(BTN_PREV))
{
asyncPrev = true;
}
}
@ -487,17 +516,21 @@ void loop2(void *parameter)
boolean buttonPressed(const uint8_t pin)
{
if (digitalRead(pin) == LOW)
if (digitalRead(pin) == LOW && buttontoignore != pin)
{
unsigned long now = millis();
if (now - lastStart > startDelay)
{
lastStart = now;
Serial.println("button pressed.");
buttontoignore = pin;
return true;
}
} else if (digitalRead(pin) == HIGH && buttontoignore == pin) {
buttontoignore = 0;
}
return false;
}