Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added virtual RFID-Cards #319

Merged
merged 3 commits into from Apr 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 9 additions & 9 deletions src/AudioPlayer.cpp
Expand Up @@ -274,7 +274,7 @@ void Audio_setTitle(const char *format, ...) {
va_end(args);

// notify web ui and mqtt
Web_SendWebsocketData(0, 30);
Web_SendWebsocketData(0, WebsocketCodeType::TrackInfo);
#ifdef MQTT_ENABLE
publishMqtt(topicTrackState, gPlayProperties.title, false);
#endif
Expand Down Expand Up @@ -413,7 +413,7 @@ void AudioPlayer_Task(void *parameter) {
if (xQueueReceive(gVolumeQueue, &currentVolume, 0) == pdPASS) {
Log_Printf(LOGLEVEL_INFO, newLoudnessReceivedQueue, currentVolume);
audio->setVolume(currentVolume, VOLUMECURVE);
Web_SendWebsocketData(0, 50);
Web_SendWebsocketData(0, WebsocketCodeType::Volume);
#ifdef MQTT_ENABLE
publishMqtt(topicLoudnessState, currentVolume, false);
#endif
Expand Down Expand Up @@ -540,7 +540,7 @@ void AudioPlayer_Task(void *parameter) {
AudioPlayer_NvsRfidWriteWrapper(gPlayProperties.playRfidTag, gPlayProperties.playlist->at(gPlayProperties.currentTrackNumber), audio->getFilePos() - audio->inBufferFilled(), gPlayProperties.playMode, gPlayProperties.currentTrackNumber, gPlayProperties.playlist->size());
}
gPlayProperties.pausePlay = !gPlayProperties.pausePlay;
Web_SendWebsocketData(0, 30);
Web_SendWebsocketData(0, WebsocketCodeType::TrackInfo);
continue;

case NEXTTRACK:
Expand Down Expand Up @@ -1290,7 +1290,7 @@ void AudioPlayer_ClearCover(void) {
gPlayProperties.coverFilePos = 0;
AudioPlayer_StationLogoUrl = "";
// websocket and mqtt notify cover image has changed
Web_SendWebsocketData(0, 40);
Web_SendWebsocketData(0, WebsocketCodeType::CoverImg);
#ifdef MQTT_ENABLE
publishMqtt(topicCoverChangedState, "", false);
#endif
Expand All @@ -1301,7 +1301,7 @@ void audio_info(const char *info) {
Log_Printf(LOGLEVEL_INFO, "info : %s", info);
if (startsWith((char *) info, "slow stream, dropouts")) {
// websocket notify for slow stream
Web_SendWebsocketData(0, 3);
Web_SendWebsocketData(0, WebsocketCodeType::Dropout);
}
}

Expand Down Expand Up @@ -1358,7 +1358,7 @@ void audio_icyurl(const char *info) { // homepage
// has station homepage, get favicon url
AudioPlayer_StationLogoUrl = "https://www.google.com/s2/favicons?sz=256&domain_url=" + String(info);
// websocket and mqtt notify station logo has changed
Web_SendWebsocketData(0, 40);
Web_SendWebsocketData(0, WebsocketCodeType::CoverImg);
}
}

Expand All @@ -1367,7 +1367,7 @@ void audio_icylogo(const char *info) { // logo
if (String(info) != "") {
AudioPlayer_StationLogoUrl = info;
// websocket and mqtt notify station logo has changed
Web_SendWebsocketData(0, 40);
Web_SendWebsocketData(0, WebsocketCodeType::CoverImg);
}
}

Expand All @@ -1381,7 +1381,7 @@ void audio_id3image(File &file, const size_t pos, const size_t size) {
gPlayProperties.coverFilePos = pos;
gPlayProperties.coverFileSize = size;
// websocket and mqtt notify cover image has changed
Web_SendWebsocketData(0, 40);
Web_SendWebsocketData(0, WebsocketCodeType::CoverImg);
#ifdef MQTT_ENABLE
publishMqtt(topicCoverChangedState, "", false);
#endif
Expand Down Expand Up @@ -1444,7 +1444,7 @@ void audio_oggimage(File &file, std::vector<uint32_t> v) {
}
gPlayProperties.coverFilePos = 1; // flacMarker gives 4 Bytes before METADATA_BLOCK_PICTURE, whereas for flac files audioI2S points 3 Bytes before METADATA_BLOCK_PICTURE, so gPlayProperties.coverFilePos has to be set to 4-3=1
// websocket and mqtt notify cover image has changed
Web_SendWebsocketData(0, 40);
Web_SendWebsocketData(0, WebsocketCodeType::CoverImg);
#ifdef MQTT_ENABLE
publishMqtt(topicCoverChangedState, "", false);
#endif
Expand Down
51 changes: 51 additions & 0 deletions src/Cmd.cpp
Expand Up @@ -10,6 +10,7 @@
#include "Led.h"
#include "Log.h"
#include "Mqtt.h"
#include "Queues.h"
#include "System.h"
#include "Wlan.h"

Expand Down Expand Up @@ -367,6 +368,56 @@ void Cmd_Action(const uint16_t mod) {
break;
}

case CMD_VIRTUAL_RFID_CARD_01: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_01, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_02: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_02, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_03: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_03, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_04: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_04, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_05: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_05, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_06: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_06, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_07: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_07, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_08: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_08, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_09: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_09, 0);
break;
}

case CMD_VIRTUAL_RFID_CARD_10: {
xQueueSend(gRfidCardQueue, VIRTUAL_RFID_CARD_10, 0);
break;
}

case PRINT_TASK_STATS: {
System_esp_print_tasks();
break;
Expand Down
2 changes: 1 addition & 1 deletion src/RfidCommon.cpp
Expand Up @@ -38,7 +38,7 @@ void Rfid_PreferenceLookupHandler(void) {
System_UpdateActivityTimer();
strncpy(gCurrentRfidTagId, rfidTagId, cardIdStringSize - 1);
Log_Printf(LOGLEVEL_INFO, "%s: %s", rfidTagReceived, gCurrentRfidTagId);
Web_SendWebsocketData(0, 10); // Push new rfidTagId to all websocket-clients
Web_SendWebsocketData(0, WebsocketCodeType::CurrentRfid); // Push new rfidTagId to all websocket-clients
String s = "-1";
if (gPrefsRfid.isKey(gCurrentRfidTagId)) {
s = gPrefsRfid.getString(gCurrentRfidTagId, "-1"); // Try to lookup rfidId in NVS
Expand Down
40 changes: 20 additions & 20 deletions src/Web.cpp
Expand Up @@ -760,7 +760,7 @@ bool JSONToSettings(JsonObject doc) {
if ((millis() - lastPongTimestamp) > 1000u) {
// send pong (keep-alive heartbeat), check for excessive calls
lastPongTimestamp = millis();
Web_SendWebsocketData(0, 20);
Web_SendWebsocketData(0, WebsocketCodeType::Pong);
}
return false;
} else if (doc.containsKey("controls")) {
Expand All @@ -773,21 +773,21 @@ bool JSONToSettings(JsonObject doc) {
Cmd_Action(cmd);
}
} else if (doc.containsKey("trackinfo")) {
Web_SendWebsocketData(0, 30);
Web_SendWebsocketData(0, WebsocketCodeType::TrackInfo);
} else if (doc.containsKey("coverimg")) {
Web_SendWebsocketData(0, 40);
Web_SendWebsocketData(0, WebsocketCodeType::CoverImg);
} else if (doc.containsKey("volume")) {
Web_SendWebsocketData(0, 50);
Web_SendWebsocketData(0, WebsocketCodeType::Volume);
} else if (doc.containsKey("settings")) {
Web_SendWebsocketData(0, 60);
Web_SendWebsocketData(0, WebsocketCodeType::Settings);
} else if (doc.containsKey("ssids")) {
Web_SendWebsocketData(0, 70);
Web_SendWebsocketData(0, WebsocketCodeType::Ssid);
} else if (doc.containsKey("trackProgress")) {
if (doc["trackProgress"].containsKey("posPercent")) {
gPlayProperties.seekmode = SEEK_POS_PERCENT;
gPlayProperties.currentRelPos = doc["trackProgress"]["posPercent"].as<uint8_t>();
}
Web_SendWebsocketData(0, 80);
Web_SendWebsocketData(0, WebsocketCodeType::TrackProgress);
}

return true;
Expand Down Expand Up @@ -1127,7 +1127,7 @@ bool processJsonRequest(char *_serialJson) {
}

// Sends JSON-answers via websocket
void Web_SendWebsocketData(uint32_t client, uint8_t code) {
void Web_SendWebsocketData(uint32_t client, WebsocketCodeType code) {
if (!webserverStarted) {
// webserver not yet started
return;
Expand Down Expand Up @@ -1155,20 +1155,20 @@ void Web_SendWebsocketData(uint32_t client, uint8_t code) {
#endif
JsonObject object = doc.to<JsonObject>();

if (code == 1) {
if (code == WebsocketCodeType::Ok) {
object["status"] = "ok";
} else if (code == 2) {
} else if (code == WebsocketCodeType::Error) {
object["status"] = "error";
} else if (code == 3) {
} else if (code == WebsocketCodeType::Dropout) {
object["status"] = "dropout";
} else if (code == 10) {
} else if (code == WebsocketCodeType::CurrentRfid) {
object["rfidId"] = gCurrentRfidTagId;
} else if (code == 20) {
} else if (code == WebsocketCodeType::Pong) {
object["pong"] = "pong";
object["rssi"] = Wlan_GetRssi();
// todo: battery percent + loading status +++
// object["battery"] = Battery_GetVoltage();
} else if (code == 30) {
} else if (code == WebsocketCodeType::TrackInfo) {
JsonObject entry = object.createNestedObject("trackinfo");
entry["pausePlay"] = gPlayProperties.pausePlay;
entry["currentTrackNumber"] = gPlayProperties.currentTrackNumber + 1;
Expand All @@ -1177,17 +1177,17 @@ void Web_SendWebsocketData(uint32_t client, uint8_t code) {
entry["name"] = gPlayProperties.title;
entry["posPercent"] = gPlayProperties.currentRelPos;
entry["playMode"] = gPlayProperties.playMode;
} else if (code == 40) {
} else if (code == WebsocketCodeType::CoverImg) {
object["coverimg"] = "coverimg";
} else if (code == 50) {
} else if (code == WebsocketCodeType::Volume) {
object["volume"] = AudioPlayer_GetCurrentVolume();
} else if (code == 60) {
} else if (code == WebsocketCodeType::Settings) {
JsonObject entry = object.createNestedObject("settings");
settingsToJSON(entry, "");
} else if (code == 70) {
} else if (code == WebsocketCodeType::Ssid) {
JsonObject entry = object.createNestedObject("settings");
settingsToJSON(entry, "ssids");
} else if (code == 80) {
} else if (code == WebsocketCodeType::TrackProgress) {
JsonObject entry = object.createNestedObject("trackProgress");
entry["posPercent"] = gPlayProperties.currentRelPos;
entry["time"] = AudioPlayer_GetCurrentTime();
Expand Down Expand Up @@ -1238,7 +1238,7 @@ void onWebsocketEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsE

if (processJsonRequest((char *) data)) {
if (data && (strncmp((char *) data, "track", 5))) { // Don't send back ok-feedback if track's name is requested in background
Web_SendWebsocketData(client->id(), 1);
Web_SendWebsocketData(client->id(), WebsocketCodeType::Ok);
}
}

Expand Down
16 changes: 15 additions & 1 deletion src/Web.h
@@ -1,4 +1,18 @@
#pragma once

typedef enum class WebsocketCode {
Ok = 0,
Error,
Dropout,
CurrentRfid,
Pong,
TrackInfo,
CoverImg,
Volume,
Settings,
Ssid,
TrackProgress
} WebsocketCodeType;

void Web_Cyclic(void);
void Web_SendWebsocketData(uint32_t client, uint8_t code);
void Web_SendWebsocketData(uint32_t client, WebsocketCodeType code);
23 changes: 23 additions & 0 deletions src/values.h
Expand Up @@ -68,6 +68,17 @@
#define CMD_STOP 182 // Command: stops playback
#define CMD_RESTARTSYSTEM 183 // Command: restart System

#define CMD_VIRTUAL_RFID_CARD_01 241 // Command: Virtual RFID-Card 900000000001
#define CMD_VIRTUAL_RFID_CARD_02 242 // Command: Virtual RFID-Card 900000000002
#define CMD_VIRTUAL_RFID_CARD_03 243 // Command: Virtual RFID-Card 900000000003
#define CMD_VIRTUAL_RFID_CARD_04 244 // Command: Virtual RFID-Card 900000000004
#define CMD_VIRTUAL_RFID_CARD_05 245 // Command: Virtual RFID-Card 900000000005
#define CMD_VIRTUAL_RFID_CARD_06 246 // Command: Virtual RFID-Card 900000000006
#define CMD_VIRTUAL_RFID_CARD_07 247 // Command: Virtual RFID-Card 900000000007
#define CMD_VIRTUAL_RFID_CARD_08 248 // Command: Virtual RFID-Card 900000000008
#define CMD_VIRTUAL_RFID_CARD_09 249 // Command: Virtual RFID-Card 900000000009
#define CMD_VIRTUAL_RFID_CARD_10 250 // Command: Virtual RFID-Card 900000000010

// Repeat-Modes
#define NO_REPEAT 0 // No repeat
#define TRACK 1 // Repeat current track (infinite loop)
Expand All @@ -90,5 +101,17 @@
#define EN 2
#define FR 3

// Virtual RFID Cards
#define VIRTUAL_RFID_CARD_01 "900000000001"
#define VIRTUAL_RFID_CARD_02 "900000000002"
#define VIRTUAL_RFID_CARD_03 "900000000003"
#define VIRTUAL_RFID_CARD_04 "900000000004"
#define VIRTUAL_RFID_CARD_05 "900000000005"
#define VIRTUAL_RFID_CARD_06 "900000000006"
#define VIRTUAL_RFID_CARD_07 "900000000007"
#define VIRTUAL_RFID_CARD_08 "900000000008"
#define VIRTUAL_RFID_CARD_09 "900000000009"
#define VIRTUAL_RFID_CARD_10 "900000000010"

// Debug
#define PRINT_TASK_STATS 199 // Prints task stats for debugging, needs CONFIG_FREERTOS_USE_TRACE_FACILITY=y and CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y in sdkconfig.defaults