simplify query implementation

This commit is contained in:
Lorow 2024-06-02 18:59:44 +02:00
parent 635c6b04de
commit c8335d221d
6 changed files with 114 additions and 148 deletions

View File

@ -1,29 +1,31 @@
#include "CommandManager.hpp" #include "CommandManager.hpp"
CommandManager::CommandManager(ProjectConfig *deviceConfig) : deviceConfig(deviceConfig) {} CommandManager::CommandManager(ProjectConfig* deviceConfig)
: deviceConfig(deviceConfig) {}
const CommandType CommandManager::getCommandType(JsonVariant& command) {
const CommandType CommandManager::getCommandType(JsonVariant &command){
if (!command.containsKey("command")) if (!command.containsKey("command"))
return CommandType::None; return CommandType::None;
if (auto search = commandMap.find(command["command"]); search != commandMap.end()) if (auto search = commandMap.find(command["command"]);
search != commandMap.end())
return search->second; return search->second;
return CommandType::None; return CommandType::None;
} }
bool CommandManager::hasDataField(JsonVariant &command) { bool CommandManager::hasDataField(JsonVariant& command) {
return command.containsKey("data"); return command.containsKey("data");
} }
void CommandManager::handleCommands(CommandsPayload commandsPayload){ void CommandManager::handleCommands(CommandsPayload commandsPayload) {
if (!commandsPayload.data.containsKey("commands")){ if (!commandsPayload.data.containsKey("commands")) {
log_e("Json data sent not supported, lacks commands field"); log_e("Json data sent not supported, lacks commands field");
return; return;
} }
for(JsonVariant commandData : commandsPayload.data["commands"].as<JsonArray>()) { for (JsonVariant commandData :
commandsPayload.data["commands"].as<JsonArray>()) {
this->handleCommand(commandData); this->handleCommand(commandData);
} }
@ -33,29 +35,26 @@ void CommandManager::handleCommands(CommandsPayload commandsPayload){
void CommandManager::handleCommand(JsonVariant command) { void CommandManager::handleCommand(JsonVariant command) {
auto command_type = this->getCommandType(command); auto command_type = this->getCommandType(command);
switch(command_type) switch (command_type) {
{
case CommandType::SET_WIFI: { case CommandType::SET_WIFI: {
if (!this->hasDataField(command)) if (!this->hasDataField(command))
// malformed command, lacked data field // malformed command, lacked data field
break; break;
if(!command["data"].containsKey("ssid") || !command["data"].containsKey("password")) if (!command["data"].containsKey("ssid") ||
!command["data"].containsKey("password"))
break; break;
std::string customNetworkName = "main"; std::string customNetworkName = "main";
if (command["data"].containsKey("network_name")) if (command["data"].containsKey("network_name"))
customNetworkName = command["data"]["network_name"].as<std::string>(); customNetworkName = command["data"]["network_name"].as<std::string>();
this->deviceConfig->setWifiConfig( this->deviceConfig->setWifiConfig(customNetworkName,
customNetworkName,
command["data"]["ssid"], command["data"]["ssid"],
command["data"]["password"], command["data"]["password"],
0, // channel, should this be zero? 0, // channel, should this be zero?
0, // power, should this be zero? 0, // power, should this be zero?
false, false, false);
false
);
break; break;
} }
@ -63,14 +62,12 @@ void CommandManager::handleCommand(JsonVariant command) {
if (!this->hasDataField(command)) if (!this->hasDataField(command))
break; break;
if(!command["data"].containsKey("hostname") || !strlen(command["data"]["hostname"])) if (!command["data"].containsKey("hostname") ||
!strlen(command["data"]["hostname"]))
break; break;
this->deviceConfig->setMDNSConfig( this->deviceConfig->setMDNSConfig(command["data"]["hostname"],
command["data"]["hostname"], "openiristracker", false);
"openiristracker",
false
);
break; break;
} }

View File

@ -12,28 +12,26 @@ enum CommandType {
SET_MDNS, SET_MDNS,
}; };
struct CommandsPayload { struct CommandsPayload {
JsonDocument data; JsonDocument data;
}; };
class CommandManager{ class CommandManager {
private:
private: const std::unordered_map<std::string, CommandType> commandMap = {
const std::unordered_map<std::string, CommandType> commandMap = {
{"ping", CommandType::PING}, {"ping", CommandType::PING},
{"set_wifi", CommandType::SET_WIFI}, {"set_wifi", CommandType::SET_WIFI},
{"set_mdns", CommandType::SET_MDNS}, {"set_mdns", CommandType::SET_MDNS},
}; };
ProjectConfig* deviceConfig; ProjectConfig* deviceConfig;
bool hasDataField(JsonVariant &command); bool hasDataField(JsonVariant& command);
void handleCommand(JsonVariant command); void handleCommand(JsonVariant command);
const CommandType getCommandType(JsonVariant &command); const CommandType getCommandType(JsonVariant& command);
public: public:
CommandManager(ProjectConfig *deviceConfig); CommandManager(ProjectConfig* deviceConfig);
void handleCommands(CommandsPayload commandsPayload); void handleCommands(CommandsPayload commandsPayload);
}; };

View File

@ -1,8 +0,0 @@
#include "QueryManager.hpp"
std::string QueryManager::formatMessage(QueryPayload* messagePayload) {
return Helpers::format_string(
"{\"action\": \"%s\", \"status\": %d, \"additional_info\": \"%s\"}",
queryActionMap.at(messagePayload->action).c_str(), messagePayload->status,
messagePayload->additionalInfo.c_str());
}

View File

@ -1,46 +0,0 @@
#pragma once
#ifndef QUERY_MANAGER_HPP
#define QUERY_MANAGER_HPP
#include <string>
#include <unordered_map>
#include "data/utilities/helpers.hpp"
enum QueryAction {
READY_TO_RECEIVE,
PARSE_COMMANDS,
CONNECT_TO_WIFI,
};
enum QueryStatus {
NONE,
SUCCESS,
ERROR,
};
struct QueryPayload {
QueryAction action;
QueryStatus status;
std::string additionalInfo;
QueryPayload(QueryAction action,
QueryStatus status,
std::string additionalInfo) {
this->action = action;
this->status = status;
this->additionalInfo = additionalInfo;
}
};
class QueryManager {
private:
const std::unordered_map<QueryAction, std::string> queryActionMap = {
{QueryAction::READY_TO_RECEIVE, "ready_to_receive"},
{QueryAction::PARSE_COMMANDS, "parse_commands"},
{QueryAction::CONNECT_TO_WIFI, "connect_to_wifi"},
};
public:
std::string formatMessage(QueryPayload* messagePayload);
};
#endif

View File

@ -59,13 +59,19 @@ void SerialManager::init() {
Serial.flush(); Serial.flush();
} }
QueryPayload* setupFinishedMessage = this->sendQuery(QueryAction::READY_TO_RECEIVE, QueryStatus::NONE, "");
new QueryPayload(QueryAction::READY_TO_RECEIVE, QueryStatus::NONE, "");
this->snedQuery(setupFinishedMessage);
} }
void SerialManager::snedQuery(QueryPayload* messagePayload) { void SerialManager::(QueryAction action,
Serial.println(this->queryManager->formatMessage(messagePayload).c_str()); QueryStatus status,
std::string additional_info) {
JsonDocument doc;
doc["action"] = queryActionMap.at(action);
doc["status"] = status;
doc["additional_info"] = additional_info;
doc.shrinkToFit(); // optional
serializeJson(doc, Serial);
} }
void SerialManager::run() { void SerialManager::run() {

View File

@ -13,11 +13,28 @@
const char* const ETVR_HEADER = "\xff\xa0"; const char* const ETVR_HEADER = "\xff\xa0";
const char* const ETVR_HEADER_FRAME = "\xff\xa1"; const char* const ETVR_HEADER_FRAME = "\xff\xa1";
enum QueryAction {
READY_TO_RECEIVE,
PARSE_COMMANDS,
CONNECT_TO_WIFI,
};
enum QueryStatus {
NONE,
SUCCESS,
ERROR,
};
const std::unordered_map<QueryAction, std::string> queryActionMap = {
{QueryAction::READY_TO_RECEIVE, "ready_to_receive"},
{QueryAction::PARSE_COMMANDS, "parse_commands"},
{QueryAction::CONNECT_TO_WIFI, "connect_to_wifi"},
};
class SerialManager { class SerialManager {
private: private:
esp_err_t err = ESP_OK; esp_err_t err = ESP_OK;
CommandManager* commandManager; CommandManager* commandManager;
QueryManager* queryManager;
#ifdef ETVR_EYE_TRACKER_USB_API #ifdef ETVR_EYE_TRACKER_USB_API
int64_t last_frame = 0; int64_t last_frame = 0;
@ -28,7 +45,9 @@ class SerialManager {
public: public:
SerialManager(CommandManager* commandManager); SerialManager(CommandManager* commandManager);
void snedQuery(QueryPayload* messagePayload); void sendQuery(QueryAction action,
QueryStatus status,
std::string additional_info);
void init(); void init();
void run(); void run();
}; };