feat: task manager endpoint, updated documentation
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "ApiServer.h"
|
||||
#include <algorithm>
|
||||
|
||||
ApiServer::ApiServer(NodeContext& ctx, TaskManager& taskMgr, uint16_t port) : server(port), ctx(ctx), taskManager(taskMgr) {}
|
||||
|
||||
@@ -184,13 +185,31 @@ void ApiServer::onRestartRequest(AsyncWebServerRequest *request) {
|
||||
|
||||
void ApiServer::onTaskStatusRequest(AsyncWebServerRequest *request) {
|
||||
JsonDocument doc;
|
||||
JsonArray tasksArr = doc["tasks"].to<JsonArray>();
|
||||
|
||||
// This would need to be implemented in TaskManager to expose task status
|
||||
// For now, we'll return a basic response
|
||||
JsonObject taskObj = tasksArr.add<JsonObject>();
|
||||
taskObj["message"] = "Task status endpoint - implementation pending";
|
||||
taskObj["note"] = "Task status will be available in future versions";
|
||||
// Get comprehensive task status from TaskManager
|
||||
auto taskStatuses = taskManager.getAllTaskStatuses(doc);
|
||||
|
||||
// Add summary information
|
||||
JsonObject summaryObj = doc["summary"].to<JsonObject>();
|
||||
summaryObj["totalTasks"] = taskStatuses.size();
|
||||
summaryObj["activeTasks"] = std::count_if(taskStatuses.begin(), taskStatuses.end(),
|
||||
[](const auto& pair) { return pair.second["enabled"]; });
|
||||
|
||||
// Add detailed task information
|
||||
JsonArray tasksArr = doc["tasks"].to<JsonArray>();
|
||||
for (const auto& taskPair : taskStatuses) {
|
||||
JsonObject taskObj = tasksArr.add<JsonObject>();
|
||||
taskObj["name"] = taskPair.first;
|
||||
taskObj["interval"] = taskPair.second["interval"];
|
||||
taskObj["enabled"] = taskPair.second["enabled"];
|
||||
taskObj["running"] = taskPair.second["running"];
|
||||
taskObj["autoStart"] = taskPair.second["autoStart"];
|
||||
}
|
||||
|
||||
// Add system information
|
||||
JsonObject systemObj = doc["system"].to<JsonObject>();
|
||||
systemObj["freeHeap"] = ESP.getFreeHeap();
|
||||
systemObj["uptime"] = millis();
|
||||
|
||||
String json;
|
||||
serializeJson(doc, json);
|
||||
@@ -222,9 +241,39 @@ void ApiServer::onTaskControlRequest(AsyncWebServerRequest *request) {
|
||||
taskManager.stopTask(taskName.c_str());
|
||||
success = true;
|
||||
message = "Task stopped";
|
||||
} else if (action == "status") {
|
||||
// Get detailed status for a specific task
|
||||
success = true;
|
||||
message = "Task status retrieved";
|
||||
|
||||
// Create JsonDocument for status response
|
||||
JsonDocument statusDoc;
|
||||
statusDoc["success"] = success;
|
||||
statusDoc["message"] = message;
|
||||
statusDoc["task"] = taskName;
|
||||
statusDoc["action"] = action;
|
||||
|
||||
// Add task details to response
|
||||
statusDoc["taskDetails"] = JsonObject();
|
||||
JsonObject taskDetails = statusDoc["taskDetails"];
|
||||
taskDetails["name"] = taskName;
|
||||
taskDetails["enabled"] = taskManager.isTaskEnabled(taskName.c_str());
|
||||
taskDetails["running"] = taskManager.isTaskRunning(taskName.c_str());
|
||||
taskDetails["interval"] = taskManager.getTaskInterval(taskName.c_str());
|
||||
|
||||
// Add system context
|
||||
taskDetails["system"] = JsonObject();
|
||||
JsonObject systemInfo = taskDetails["system"];
|
||||
systemInfo["freeHeap"] = ESP.getFreeHeap();
|
||||
systemInfo["uptime"] = millis();
|
||||
|
||||
String statusJson;
|
||||
serializeJson(statusDoc, statusJson);
|
||||
request->send(200, "application/json", statusJson);
|
||||
return; // Early return since we've already sent the response
|
||||
} else {
|
||||
success = false;
|
||||
message = "Invalid action. Use: enable, disable, start, or stop";
|
||||
message = "Invalid action. Use: enable, disable, start, stop, or status";
|
||||
}
|
||||
|
||||
JsonDocument doc;
|
||||
@@ -241,7 +290,7 @@ void ApiServer::onTaskControlRequest(AsyncWebServerRequest *request) {
|
||||
JsonDocument doc;
|
||||
doc["success"] = false;
|
||||
doc["message"] = "Missing parameters. Required: task, action";
|
||||
doc["example"] = "{\"task\": \"discovery_send\", \"action\": \"disable\"}";
|
||||
doc["example"] = "{\"task\": \"discovery_send\", \"action\": \"status\"}";
|
||||
|
||||
String json;
|
||||
serializeJson(doc, json);
|
||||
|
||||
@@ -6,6 +6,8 @@ ClusterManager::ClusterManager(NodeContext& ctx, TaskManager& taskMgr) : ctx(ctx
|
||||
NodeInfo* node = static_cast<NodeInfo*>(data);
|
||||
this->addOrUpdateNode(node->hostname, node->ip);
|
||||
});
|
||||
// Register tasks
|
||||
registerTasks();
|
||||
}
|
||||
|
||||
void ClusterManager::registerTasks() {
|
||||
|
||||
@@ -191,4 +191,24 @@ Task* TaskManager::findTask(const std::string& name) const {
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::vector<std::pair<std::string, JsonObject>> TaskManager::getAllTaskStatuses(JsonDocument& doc) const {
|
||||
std::vector<std::pair<std::string, JsonObject>> taskStatuses;
|
||||
|
||||
for (size_t i = 0; i < tasks.size() && i < taskDefinitions.size(); ++i) {
|
||||
const auto& taskDef = taskDefinitions[i];
|
||||
const auto& task = tasks[i];
|
||||
|
||||
JsonObject taskStatus = doc.add<JsonObject>();
|
||||
taskStatus["name"] = taskDef.name;
|
||||
taskStatus["interval"] = task->getInterval();
|
||||
taskStatus["enabled"] = task->isEnabled();
|
||||
taskStatus["running"] = task->isEnabled(); // For now, enabled = running
|
||||
taskStatus["autoStart"] = taskDef.autoStart;
|
||||
|
||||
taskStatuses.push_back(std::make_pair(taskDef.name, taskStatus));
|
||||
}
|
||||
|
||||
return taskStatuses;
|
||||
}
|
||||
@@ -18,10 +18,7 @@ ApiServer apiServer(ctx, taskManager, ctx.config.api_server_port);
|
||||
void setup() {
|
||||
// Setup WiFi first
|
||||
network.setupWiFi();
|
||||
|
||||
// Register tasks in their respective classes
|
||||
cluster.registerTasks();
|
||||
|
||||
|
||||
// Initialize and start all tasks
|
||||
taskManager.initialize();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user