Fix compilation issues, change ProjectConfig into a shared_ptr with updated definitions

// todo implement the API and missing features
This commit is contained in:
Lorow
2024-11-23 21:00:05 +01:00
parent 60e2e7cc36
commit 6b603f5574
13 changed files with 61 additions and 50 deletions

View File

@@ -2,7 +2,7 @@
const char *CAMERA_MANAGER_TAG = "[CAMERA_MANAGER]";
CameraManager::CameraManager(ProjectConfig &projectConfig)
CameraManager::CameraManager(std::shared_ptr<ProjectConfig> projectConfig)
: projectConfig(projectConfig) {}
void CameraManager::setupCameraPinout()
@@ -225,7 +225,7 @@ bool CameraManager::setupCamera()
void CameraManager::loadConfigData()
{
ESP_LOGD(CAMERA_MANAGER_TAG, "Loading camera config data");
ProjectConfig::CameraConfig_t cameraConfig = projectConfig.getCameraConfig();
ProjectConfig::CameraConfig_t cameraConfig = projectConfig->getCameraConfig();
this->setHFlip(cameraConfig.href);
this->setVFlip(cameraConfig.vflip);
this->setCameraResolution((framesize_t)cameraConfig.framesize);

View File

@@ -20,11 +20,11 @@ class CameraManager
{
private:
sensor_t *camera_sensor;
ProjectConfig &projectConfig;
std::shared_ptr<ProjectConfig> projectConfig;
camera_config_t config;
public:
CameraManager(ProjectConfig &projectConfigl);
CameraManager(std::shared_ptr<ProjectConfig> projectConfigl);
int setCameraResolution(framesize_t frameSize);
bool setupCamera(); // todo, once we have observers, make it private

View File

@@ -1,5 +1,13 @@
#include "CommandManager.hpp"
std::unordered_map<std::string, CommandType> commandTypeMap = {
{"ping", CommandType::PING},
{"set_wifi", CommandType::SET_WIFI},
{"update_wifi", CommandType::UPDATE_WIFI},
{"delete_network", CommandType::DELETE_NETWORK},
{"save_config", CommandType::SAVE_CONFIG},
};
std::unique_ptr<Command> CommandManager::createCommand(CommandType type)
{
switch (type)

View File

@@ -27,20 +27,13 @@ enum CommandType
RESTART_DEVICE,
};
std::unordered_map<std::string, CommandType> commandTypeMap = {
{"ping", CommandType::PING},
{"set_wifi", CommandType::SET_WIFI},
{"update_wifi", CommandType::UPDATE_WIFI},
{"delete_network", CommandType::DELETE_NETWORK},
{"save_config", CommandType::SAVE_CONFIG},
};
class CommandManager
{
ProjectConfig &projectConfig;
private:
std::shared_ptr<ProjectConfig> projectConfig;
public:
CommandManager(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
CommandManager(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
std::unique_ptr<Command> createCommand(CommandType type);
CommandResult executeFromJson(std::string *json);

View File

@@ -60,7 +60,7 @@ CommandResult setWiFiCommand::execute(std::string &jsonPayload)
return CommandResult::getErrorResult("Invalid payload");
}
auto wifiConfig = payload.value();
projectConfig.setWifiConfig(
projectConfig->setWifiConfig(
wifiConfig.networkName,
wifiConfig.ssid,
wifiConfig.password,
@@ -98,7 +98,7 @@ CommandResult deleteWifiCommand::execute(std::string &jsonPayload)
if (!payload.has_value())
return CommandResult::getErrorResult("Invalid payload");
projectConfig.deleteWifiConfig(payload.value().networkName, false);
projectConfig->deleteWifiConfig(payload.value().networkName, false);
return CommandResult::getSuccessResult("Config updated");
}
@@ -153,7 +153,7 @@ CommandResult updateWifiCommand::execute(std::string &jsonPayload)
}
auto updatedConfig = payload.value();
auto storedNetworks = projectConfig.getWifiConfigs();
auto storedNetworks = projectConfig->getWifiConfigs();
if (auto networkToUpdate = std::find_if(
storedNetworks.begin(),
storedNetworks.end(),
@@ -161,7 +161,7 @@ CommandResult updateWifiCommand::execute(std::string &jsonPayload)
{ return network.name == updatedConfig.networkName; });
networkToUpdate != storedNetworks.end())
{
projectConfig.setWifiConfig(
projectConfig->setWifiConfig(
updatedConfig.networkName,
updatedConfig.ssid.has_value() ? updatedConfig.ssid.value() : networkToUpdate->ssid,
updatedConfig.password.has_value() ? updatedConfig.password.value() : networkToUpdate->password,
@@ -217,7 +217,7 @@ CommandResult setMDNSCommand::execute(std::string &jsonPayload)
if (!payload.has_value())
return CommandResult::getErrorResult("Invalid payload");
projectConfig.setMDNSConfig(payload.value().hostname, false);
projectConfig->setMDNSConfig(payload.value().hostname, true);
return CommandResult::getSuccessResult("Config updated");
}
@@ -260,8 +260,8 @@ CommandResult updateCameraCommand::execute(std::string &jsonPayload)
}
auto updatedConfig = payload.value();
auto oldConfig = projectConfig.getCameraConfig();
this->projectConfig.setCameraConfig(
auto oldConfig = projectConfig->getCameraConfig();
this->projectConfig->setCameraConfig(
updatedConfig.vflip.has_value() ? updatedConfig.vflip.value() : oldConfig.vflip,
updatedConfig.framesize.has_value() ? updatedConfig.framesize.value() : oldConfig.framesize,
updatedConfig.href.has_value() ? updatedConfig.href.value() : oldConfig.href,
@@ -274,6 +274,6 @@ CommandResult updateCameraCommand::execute(std::string &jsonPayload)
CommandResult saveConfigCommand::execute(std::string &jsonPayload)
{
projectConfig.save();
projectConfig->save();
return CommandResult::getSuccessResult("Config saved");
}

View File

@@ -24,60 +24,60 @@ public:
class setWiFiCommand : public Command
{
ProjectConfig &projectConfig;
std::shared_ptr<ProjectConfig> projectConfig;
public:
setWiFiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
setWiFiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
CommandResult execute(std::string &jsonPayload) override;
std::optional<WifiPayload> parsePayload(std::string &jsonPayload);
};
class deleteWifiCommand : public Command
{
ProjectConfig &projectConfig;
std::shared_ptr<ProjectConfig> projectConfig;
public:
deleteWifiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
deleteWifiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
CommandResult execute(std::string &jsonPayload) override;
std::optional<deleteNetworkPayload> parsePayload(std::string &jsonPayload);
};
class updateWifiCommand : public Command
{
ProjectConfig &projectConfig;
std::shared_ptr<ProjectConfig> projectConfig;
public:
updateWifiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
updateWifiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
CommandResult execute(std::string &jsonPayload) override;
std::optional<UpdateWifiPayload> parsePayload(std::string &jsonPayload);
};
class updateAPWiFiCommand : public Command
{
ProjectConfig &projectConfig;
std::shared_ptr<ProjectConfig> projectConfig;
public:
updateAPWiFiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
updateAPWiFiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
CommandResult execute(std::string &jsonPayload) override;
std::optional<UpdateAPWiFiPayload> parsePayload(std::string &jsonPayload);
};
class setMDNSCommand : public Command
{
ProjectConfig &projectConfig;
std::shared_ptr<ProjectConfig> projectConfig;
public:
setMDNSCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
setMDNSCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
CommandResult execute(std::string &jsonPayload) override;
std::optional<MDNSPayload> parsePayload(std::string &jsonPayload);
};
class updateCameraCommand : public Command
{
ProjectConfig &projectConfig;
std::shared_ptr<ProjectConfig> projectConfig;
public:
updateCameraCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
updateCameraCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
CommandResult execute(std::string &jsonPayload) override;
std::optional<UpdateCameraConfigPayload> parsePayload(std::string &jsonPayload);
};
@@ -85,8 +85,8 @@ public:
class saveConfigCommand : public Command
{
public:
ProjectConfig &projectConfig;
saveConfigCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
std::shared_ptr<ProjectConfig> projectConfig;
saveConfigCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
CommandResult execute(std::string &jsonPayload) override;
};

View File

@@ -2,7 +2,7 @@
static const char *MDNS_MANAGER_TAG = "[MDNS MANAGER]";
MDNSManager::MDNSManager(ProjectConfig &projectConfig) : projectConfig(projectConfig) {}
MDNSManager::MDNSManager(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {}
esp_err_t MDNSManager::start()
{
@@ -17,7 +17,7 @@ esp_err_t MDNSManager::start()
return result;
}
auto mdnsConfig = projectConfig.getMDNSConfig();
auto mdnsConfig = projectConfig->getMDNSConfig();
result = mdns_hostname_set(mdnsConfig.hostname.c_str());
if (result != ESP_OK)
{

View File

@@ -11,10 +11,10 @@
class MDNSManager
{
private:
ProjectConfig &projectConfig;
std::shared_ptr<ProjectConfig> projectConfig;
public:
MDNSManager(ProjectConfig &projectConfig);
MDNSManager(std::shared_ptr<ProjectConfig> projectConfig);
esp_err_t start();
};

View File

@@ -1,6 +1,6 @@
#include "RestAPI.hpp"
RestAPI::RestAPI(std::string url)
RestAPI::RestAPI(std::string url, std::shared_ptr<CommandManager> commandManager) : command_manager(commandManager)
{
this->url = url;
// updates

View File

@@ -1,7 +1,11 @@
#pragma once
#ifndef RESTAPI_HPP
#define RESTAPI_HPP
#include <string>
#include <memory>
#include <unordered_map>
#include <mongoose.h>
#include <CommandManager.hpp>
#include "esp_log.h"
@@ -22,6 +26,7 @@ class RestAPI
route_map routes;
struct mg_mgr mgr;
std::shared_ptr<CommandManager> command_manager;
private:
// updates
@@ -50,7 +55,7 @@ private:
public:
// this will also need command manager
RestAPI(std::string url);
RestAPI(std::string url, std::shared_ptr<CommandManager> command_manager);
void begin();
void handle_request(struct mg_connection *connection, int event, void *event_data);
void poll();
@@ -59,4 +64,6 @@ public:
namespace RestAPIHelpers
{
void event_handler(struct mg_connection *connection, int event, void *event_data);
};
};
#endif

View File

@@ -36,7 +36,7 @@ void WiFiManagerHelpers::event_handler(void *arg, esp_event_base_t event_base,
}
}
WiFiManager::WiFiManager(ProjectConfig &deviceConfig) : deviceConfig(deviceConfig) {}
WiFiManager::WiFiManager(std::shared_ptr<ProjectConfig> deviceConfig) : deviceConfig(deviceConfig) {}
void WiFiManager::SetCredentials(const char *ssid, const char *password)
{
@@ -84,7 +84,7 @@ void WiFiManager::ConnectWithHardcodedCredentials()
void WiFiManager::ConnectWithStoredCredentials()
{
auto networks = this->deviceConfig.getWifiConfigs();
auto networks = this->deviceConfig->getWifiConfigs();
for (auto network : networks)
{
xEventGroupClearBits(s_wifi_event_group, WIFI_FAIL_BIT);

View File

@@ -30,7 +30,7 @@ class WiFiManager
{
private:
uint8_t channel;
ProjectConfig &deviceConfig;
std::shared_ptr<ProjectConfig> deviceConfig;
wifi_init_config_t _wifi_init_cfg = WIFI_INIT_CONFIG_DEFAULT();
wifi_config_t _wifi_cfg = {};
@@ -45,7 +45,7 @@ private:
void SetupAccessPoint();
public:
WiFiManager(ProjectConfig &deviceConfig);
WiFiManager(std::shared_ptr<ProjectConfig> deviceConfig);
void Begin();
};

View File

@@ -17,6 +17,7 @@
#include <CameraManager.hpp>
#include <WebSocketLogger.hpp>
#include <StreamServer.hpp>
#include <CommandManager.hpp>
#include <RestAPI.hpp>
#include <stdarg.h>
@@ -31,12 +32,14 @@ static const char *TAG = "[MAIN]";
WebSocketLogger webSocketLogger;
ProjectConfig deviceConfig("openiris", CONFIG_MDNS_HOSTNAME);
auto deviceConfig = std::make_shared<ProjectConfig>("openiris", CONFIG_MDNS_HOSTNAME);
WiFiManager wifiManager(deviceConfig);
MDNSManager mdnsManager(deviceConfig);
CameraManager cameraHandler(deviceConfig);
StreamServer streamServer(80);
RestAPI restAPI("http://0.0.0.0:81");
auto commandManager = std::make_shared<CommandManager>(deviceConfig);
RestAPI restAPI("http://0.0.0.0:81", commandManager);
#ifdef CONFIG_WIRED_MODE
UVCStreamManager uvcStream;
@@ -96,7 +99,7 @@ extern "C" void app_main(void)
esp_log_set_vprintf(&test_log);
ledManager.setup();
deviceConfig.load();
deviceConfig->load();
wifiManager.Begin();
mdnsManager.start();
restAPI.begin();