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,84 +1,81 @@
#include "CommandManager.hpp"
CommandManager::CommandManager(ProjectConfig *deviceConfig) : deviceConfig(deviceConfig) {}
CommandManager::CommandManager(ProjectConfig* deviceConfig)
: deviceConfig(deviceConfig) {}
const CommandType CommandManager::getCommandType(JsonVariant &command){
if (!command.containsKey("command"))
return CommandType::None;
if (auto search = commandMap.find(command["command"]); search != commandMap.end())
return search->second;
const CommandType CommandManager::getCommandType(JsonVariant& command) {
if (!command.containsKey("command"))
return CommandType::None;
if (auto search = commandMap.find(command["command"]);
search != commandMap.end())
return search->second;
return CommandType::None;
}
bool CommandManager::hasDataField(JsonVariant &command) {
return command.containsKey("data");
bool CommandManager::hasDataField(JsonVariant& command) {
return command.containsKey("data");
}
void CommandManager::handleCommands(CommandsPayload commandsPayload){
if (!commandsPayload.data.containsKey("commands")){
log_e("Json data sent not supported, lacks commands field");
return;
}
void CommandManager::handleCommands(CommandsPayload commandsPayload) {
if (!commandsPayload.data.containsKey("commands")) {
log_e("Json data sent not supported, lacks commands field");
return;
}
for(JsonVariant commandData : commandsPayload.data["commands"].as<JsonArray>()) {
this->handleCommand(commandData);
}
for (JsonVariant commandData :
commandsPayload.data["commands"].as<JsonArray>()) {
this->handleCommand(commandData);
}
this->deviceConfig->save();
}
this->deviceConfig->save();
}
void CommandManager::handleCommand(JsonVariant command) {
auto command_type = this->getCommandType(command);
auto command_type = this->getCommandType(command);
switch(command_type)
{
case CommandType::SET_WIFI: {
if (!this->hasDataField(command))
// malformed command, lacked data field
break;
switch (command_type) {
case CommandType::SET_WIFI: {
if (!this->hasDataField(command))
// malformed command, lacked data field
break;
if(!command["data"].containsKey("ssid") || !command["data"].containsKey("password"))
break;
if (!command["data"].containsKey("ssid") ||
!command["data"].containsKey("password"))
break;
std::string customNetworkName = "main";
if (command["data"].containsKey("network_name"))
customNetworkName = command["data"]["network_name"].as<std::string>();
std::string customNetworkName = "main";
if (command["data"].containsKey("network_name"))
customNetworkName = command["data"]["network_name"].as<std::string>();
this->deviceConfig->setWifiConfig(
customNetworkName,
command["data"]["ssid"],
command["data"]["password"],
0, // channel, should this be zero?
0, // power, should this be zero?
false,
false
);
break;
}
case CommandType::SET_MDNS: {
if (!this->hasDataField(command))
break;
this->deviceConfig->setWifiConfig(customNetworkName,
command["data"]["ssid"],
command["data"]["password"],
0, // channel, should this be zero?
0, // power, should this be zero?
false, false);
if(!command["data"].containsKey("hostname") || !strlen(command["data"]["hostname"]))
break;
this->deviceConfig->setMDNSConfig(
command["data"]["hostname"],
"openiristracker",
false
);
break;
}
case CommandType::PING: {
Serial.println("PONG \n\r");
break;
}
default:
break;
break;
}
case CommandType::SET_MDNS: {
if (!this->hasDataField(command))
break;
if (!command["data"].containsKey("hostname") ||
!strlen(command["data"]["hostname"]))
break;
this->deviceConfig->setMDNSConfig(command["data"]["hostname"],
"openiristracker", false);
break;
}
case CommandType::PING: {
Serial.println("PONG \n\r");
break;
}
default:
break;
}
}

View File

@ -6,35 +6,33 @@
#include "data/config/project_config.hpp"
enum CommandType {
None,
PING,
SET_WIFI,
SET_MDNS,
None,
PING,
SET_WIFI,
SET_MDNS,
};
struct CommandsPayload {
JsonDocument data;
struct CommandsPayload {
JsonDocument data;
};
class CommandManager{
private:
const std::unordered_map<std::string, CommandType> commandMap = {
{"ping", CommandType::PING},
{"set_wifi", CommandType::SET_WIFI},
{"set_mdns", CommandType::SET_MDNS},
};
class CommandManager {
private:
const std::unordered_map<std::string, CommandType> commandMap = {
{"ping", CommandType::PING},
{"set_wifi", CommandType::SET_WIFI},
{"set_mdns", CommandType::SET_MDNS},
};
ProjectConfig* deviceConfig;
ProjectConfig* deviceConfig;
bool hasDataField(JsonVariant &command);
void handleCommand(JsonVariant command);
const CommandType getCommandType(JsonVariant &command);
bool hasDataField(JsonVariant& command);
void handleCommand(JsonVariant command);
const CommandType getCommandType(JsonVariant& command);
public:
CommandManager(ProjectConfig *deviceConfig);
void handleCommands(CommandsPayload commandsPayload);
public:
CommandManager(ProjectConfig* deviceConfig);
void handleCommands(CommandsPayload commandsPayload);
};
#endif

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();
}
QueryPayload* setupFinishedMessage =
new QueryPayload(QueryAction::READY_TO_RECEIVE, QueryStatus::NONE, "");
this->snedQuery(setupFinishedMessage);
this->sendQuery(QueryAction::READY_TO_RECEIVE, QueryStatus::NONE, "");
}
void SerialManager::snedQuery(QueryPayload* messagePayload) {
Serial.println(this->queryManager->formatMessage(messagePayload).c_str());
void SerialManager::(QueryAction action,
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() {

View File

@ -13,11 +13,28 @@
const char* const ETVR_HEADER = "\xff\xa0";
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 {
private:
esp_err_t err = ESP_OK;
CommandManager* commandManager;
QueryManager* queryManager;
#ifdef ETVR_EYE_TRACKER_USB_API
int64_t last_frame = 0;
@ -28,7 +45,9 @@ class SerialManager {
public:
SerialManager(CommandManager* commandManager);
void snedQuery(QueryPayload* messagePayload);
void sendQuery(QueryAction action,
QueryStatus status,
std::string additional_info);
void init();
void run();
};