Added Telemetry data report to the App

This commit is contained in:
2025-10-31 21:10:38 +02:00
parent f286abb023
commit a7f1bd1667
13 changed files with 194 additions and 20 deletions

View File

@@ -10,6 +10,7 @@
#include "../../TimeKeeper/TimeKeeper.hpp"
#include "../../FirmwareValidator/FirmwareValidator.hpp"
#include "../../ClientManager/ClientManager.hpp"
#include "../../Telemetry/Telemetry.hpp"
#include "../../Logging/Logging.hpp"
#include "../ResponseBuilder/ResponseBuilder.hpp"
@@ -21,6 +22,7 @@ CommandHandler::CommandHandler(ConfigManager& configManager, OTAManager& otaMana
, _timeKeeper(nullptr)
, _firmwareValidator(nullptr)
, _clientManager(nullptr)
, _telemetry(nullptr)
, _responseCallback(nullptr) {}
CommandHandler::~CommandHandler() {}
@@ -45,6 +47,10 @@ void CommandHandler::setClientManagerReference(ClientManager* cm) {
_clientManager = cm;
}
void CommandHandler::setTelemetryReference(Telemetry* telemetry) {
_telemetry = telemetry;
}
void CommandHandler::setResponseCallback(ResponseCallback callback) {
_responseCallback = callback;
}
@@ -105,16 +111,24 @@ void CommandHandler::handleStatusCommand(const MessageContext& context) {
uint64_t projectedRunTime = 0;
if (_player) {
if (_player->getStatus() == PlayerStatus::PLAYING ||
if (_player->getStatus() == PlayerStatus::PLAYING ||
_player->getStatus() == PlayerStatus::PAUSED ||
_player->getStatus() == PlayerStatus::STOPPING) {
timeElapsedMs = millis() - _player->startTime;
}
projectedRunTime = _player->calculateProjectedRunTime();
}
String response = ResponseBuilder::deviceStatus(playerStatus, timeElapsedMs, projectedRunTime);
// Collect strike counters from Telemetry
uint32_t strikeCounters[16] = {0};
if (_telemetry) {
for (uint8_t i = 0; i < 16; i++) {
strikeCounters[i] = _telemetry->getStrikeCount(i);
}
}
String response = ResponseBuilder::deviceStatus(playerStatus, timeElapsedMs, projectedRunTime, strikeCounters);
sendResponse(response, context);
}
@@ -257,10 +271,6 @@ void CommandHandler::handleSystemInfoCommand(JsonVariant contents, const Message
handleGetDeviceTimeCommand(context);
} else if (action == "get_clock_time") {
handleGetClockTimeCommand(context);
} else if (action == "commit_firmware") {
handleCommitFirmwareCommand(context);
} else if (action == "rollback_firmware") {
handleRollbackFirmwareCommand(context);
} else if (action == "get_firmware_status") {
handleGetFirmwareStatusCommand(context);
} else if (action == "network_info") {

View File

@@ -33,6 +33,7 @@ class FileManager;
class Timekeeper;
class FirmwareValidator;
class ClientManager;
class Telemetry;
class CommandHandler {
public:
@@ -65,6 +66,7 @@ public:
void setTimeKeeperReference(Timekeeper* tk);
void setFirmwareValidatorReference(FirmwareValidator* fv);
void setClientManagerReference(ClientManager* cm);
void setTelemetryReference(Telemetry* telemetry);
/**
* @brief Set response callback for sending responses back
@@ -87,6 +89,7 @@ private:
Timekeeper* _timeKeeper;
FirmwareValidator* _firmwareValidator;
ClientManager* _clientManager;
Telemetry* _telemetry;
ResponseCallback _responseCallback;
// Response helpers

View File

@@ -97,6 +97,10 @@ void CommunicationRouter::setFirmwareValidatorReference(FirmwareValidator* fv) {
_commandHandler.setFirmwareValidatorReference(fv);
}
void CommunicationRouter::setTelemetryReference(Telemetry* telemetry) {
_commandHandler.setTelemetryReference(telemetry);
}
void CommunicationRouter::setupUdpDiscovery() {
uint16_t discoveryPort = _configManager.getNetworkConfig().discoveryPort;
if (_udp.listen(discoveryPort)) {

View File

@@ -47,6 +47,7 @@ class FileManager;
class Timekeeper;
class Networking;
class FirmwareValidator;
class Telemetry;
class CommunicationRouter {
public:
@@ -64,6 +65,7 @@ public:
void setFileManagerReference(FileManager* fm);
void setTimeKeeperReference(Timekeeper* tk);
void setFirmwareValidatorReference(FirmwareValidator* fv);
void setTelemetryReference(Telemetry* telemetry);
void setupUdpDiscovery();
// Status methods

View File

@@ -32,15 +32,15 @@ String ResponseBuilder::pong() {
return success("pong", "");
}
String ResponseBuilder::deviceStatus(PlayerStatus playerStatus, uint32_t timeElapsed, uint64_t projectedRunTime) {
StaticJsonDocument<512> statusDoc; // Increased size for additional data
String ResponseBuilder::deviceStatus(PlayerStatus playerStatus, uint32_t timeElapsed, uint64_t projectedRunTime, const uint32_t strikeCounters[16]) {
DynamicJsonDocument statusDoc(1024); // Increased size for strikeCounters array
statusDoc["status"] = "SUCCESS";
statusDoc["type"] = "current_status";
// Create payload object with the exact format expected by Flutter
JsonObject payload = statusDoc.createNestedObject("payload");
// Convert PlayerStatus to string
const char* statusStr;
switch (playerStatus) {
@@ -58,14 +58,20 @@ String ResponseBuilder::deviceStatus(PlayerStatus playerStatus, uint32_t timeEla
statusStr = "idle"; // STOPPED maps to "idle" in Flutter
break;
}
payload["player_status"] = statusStr;
payload["time_elapsed"] = timeElapsed; // in milliseconds
payload["projected_run_time"] = projectedRunTime; // NEW: total projected duration
// Add strike counters array
JsonArray strikeCountersArray = payload.createNestedArray("strike_counters");
for (uint8_t i = 0; i < 16; i++) {
strikeCountersArray.add(strikeCounters[i]);
}
String result;
serializeJson(statusDoc, result);
LOG_DEBUG("Device status response: %s", result.c_str());
return result;
}

View File

@@ -64,7 +64,7 @@ public:
// Specialized response builders for common scenarios
static String acknowledgment(const String& commandType);
static String pong();
static String deviceStatus(PlayerStatus playerStatus, uint32_t timeElapsedMs, uint64_t projectedRunTime = 0);
static String deviceStatus(PlayerStatus playerStatus, uint32_t timeElapsedMs, uint64_t projectedRunTime, const uint32_t strikeCounters[16]);
static String melodyList(const String& fileListJson);
static String downloadResult(bool success, const String& filename = "");
static String configUpdate(const String& configType);