feat: add DELETE method to wifi endpoint

This commit is contained in:
ZanzyTHEbar 2023-02-27 15:38:11 +00:00
parent af6b3dc2c1
commit de3ab8b4f5
3 changed files with 455 additions and 424 deletions

View File

@ -1,20 +1,20 @@
#include "project_config.hpp"
ProjectConfig::ProjectConfig(const std::string &name,
const std::string &mdnsName) : _name(std::move(name)),
ProjectConfig::ProjectConfig(const std::string& name,
const std::string& mdnsName)
: _name(std::move(name)),
_mdnsName(std::move(mdnsName)),
_already_loaded(false) {}
ProjectConfig::~ProjectConfig() {}
/**
*@brief Initializes the structures with blank data to prevent empty memory sectors and nullptr errors.
*@brief Initializes the structures with blank data to prevent empty memory
*sectors and nullptr errors.
*@brief This is to be called in setup() before loading the config.
*/
void ProjectConfig::initConfig()
{
if (_name.empty())
{
void ProjectConfig::initConfig() {
if (_name.empty()) {
log_e("Config name is null\n");
_name = "openiris";
}
@ -35,8 +35,7 @@ void ProjectConfig::initConfig()
3232,
};
if (_mdnsName.empty())
{
if (_mdnsName.empty()) {
log_e("MDNS name is null\n Autoassigning name to 'openiristracker'");
_mdnsName = "openiristracker";
}
@ -63,20 +62,19 @@ void ProjectConfig::initConfig()
};
}
void ProjectConfig::save()
{
void ProjectConfig::save() {
log_d("Saving project config");
deviceConfigSave();
mdnsConfigSave();
cameraConfigSave();
wifiConfigSave();
wifiTxPowerConfigSave();
end(); // we call end() here to close the connection to the NVS partition, we only do this because we call ESP.restart() next.
end(); // we call end() here to close the connection to the NVS partition, we
// only do this because we call ESP.restart() next.
OpenIrisTasks::ScheduleRestart(2000);
}
void ProjectConfig::wifiConfigSave()
{
void ProjectConfig::wifiConfigSave() {
log_d("Saving wifi config");
/* WiFi Config */
@ -87,8 +85,7 @@ void ProjectConfig::wifiConfigSave()
std::string password = "pass";
std::string channel = "channel";
std::string power = "power";
for (int i = 0; i < this->config.networks.size(); i++)
{
for (int i = 0; i < this->config.networks.size(); i++) {
char buffer[2];
std::string iter_str = Helpers::itoa(i, buffer, 10);
@ -113,28 +110,24 @@ void ProjectConfig::wifiConfigSave()
log_i("Project config saved and system is rebooting");
}
void ProjectConfig::deviceConfigSave()
{
void ProjectConfig::deviceConfigSave() {
/* Device Config */
putString("OTAPassword", this->config.device.OTAPassword.c_str());
putInt("OTAPort", this->config.device.OTAPort);
}
void ProjectConfig::mdnsConfigSave()
{
void ProjectConfig::mdnsConfigSave() {
/* Device Config */
putString("hostname", this->config.mdns.hostname.c_str());
putString("service", this->config.mdns.service.c_str());
}
void ProjectConfig::wifiTxPowerConfigSave()
{
void ProjectConfig::wifiTxPowerConfigSave() {
/* Device Config */
putInt("power", this->config.txpower.power);
}
void ProjectConfig::cameraConfigSave()
{
void ProjectConfig::cameraConfigSave() {
/* Camera Config */
putInt("vflip", this->config.camera.vflip);
putInt("href", this->config.camera.href);
@ -143,23 +136,21 @@ void ProjectConfig::cameraConfigSave()
putInt("brightness", this->config.camera.brightness);
}
bool ProjectConfig::reset()
{
bool ProjectConfig::reset() {
log_w("Resetting project config");
return clear();
}
void ProjectConfig::load()
{
void ProjectConfig::load() {
log_d("Loading project config");
if (this->_already_loaded)
{
if (this->_already_loaded) {
log_w("Project config already loaded");
return;
}
/* Device Config */
this->config.device.OTAPassword = getString("OTAPassword", "12345678").c_str();
this->config.device.OTAPassword =
getString("OTAPassword", "12345678").c_str();
this->config.device.OTAPort = getInt("OTAPort", 3232);
/* MDNS Config */
@ -175,8 +166,7 @@ void ProjectConfig::load()
std::string password = "pass";
std::string channel = "channel";
std::string power = "power";
for (int i = 0; i < networkCount; i++)
{
for (int i = 0; i < networkCount; i++) {
char buffer[2];
std::string iter_str = Helpers::itoa(i, buffer, 10);
@ -186,20 +176,17 @@ void ProjectConfig::load()
channel.append(iter_str);
power.append(iter_str);
const std::string &temp_1 = getString(name.c_str()).c_str();
const std::string &temp_2 = getString(ssid.c_str()).c_str();
const std::string &temp_3 = getString(password.c_str()).c_str();
const std::string& temp_1 = getString(name.c_str()).c_str();
const std::string& temp_2 = getString(ssid.c_str()).c_str();
const std::string& temp_3 = getString(password.c_str()).c_str();
uint8_t temp_4 = getUInt(channel.c_str());
uint8_t temp_5 = getUInt(power.c_str());
//! push_back creates a copy of the object, so we need to use emplace_back
this->config.networks.emplace_back(
temp_1,
temp_2,
temp_3,
temp_4,
temp_5,
false); // false because the networks we store in the config are the ones we want the esp to connect to, rather than host as AP
temp_1, temp_2, temp_3, temp_4, temp_5,
false); // false because the networks we store in the config are the
// ones we want the esp to connect to, rather than host as AP
}
/* AP Config */
@ -223,8 +210,10 @@ void ProjectConfig::load()
//! DeviceConfig
//*
//**********************************************************************************************************************
void ProjectConfig::setDeviceConfig(const std::string &OTAPassword, int OTAPort, const std::string &binaryName, bool shouldNotify)
{
void ProjectConfig::setDeviceConfig(const std::string& OTAPassword,
int OTAPort,
const std::string& binaryName,
bool shouldNotify) {
log_d("Updating device config");
this->config.device.OTAPassword.assign(OTAPassword);
this->config.device.OTAPort = OTAPort;
@ -238,8 +227,9 @@ void ProjectConfig::setDeviceConfig(const std::string &OTAPassword, int OTAPort,
this->notify(ObserverEvent::deviceConfigUpdated);
}
void ProjectConfig::setMDNSConfig(const std::string &hostname, const std::string &service, bool shouldNotify)
{
void ProjectConfig::setMDNSConfig(const std::string& hostname,
const std::string& service,
bool shouldNotify) {
log_d("Updating MDNS config");
this->config.mdns.hostname.assign(hostname);
this->config.mdns.service.assign(service);
@ -248,8 +238,12 @@ void ProjectConfig::setMDNSConfig(const std::string &hostname, const std::string
this->notify(ObserverEvent::mdnsConfigUpdated);
}
void ProjectConfig::setCameraConfig(uint8_t *vflip, uint8_t *framesize, uint8_t *href, uint8_t *quality, uint8_t *brightness, bool shouldNotify)
{
void ProjectConfig::setCameraConfig(uint8_t* vflip,
uint8_t* framesize,
uint8_t* href,
uint8_t* quality,
uint8_t* brightness,
bool shouldNotify) {
log_d("Updating camera config");
this->config.camera.vflip = *vflip;
this->config.camera.href = *href;
@ -262,64 +256,92 @@ void ProjectConfig::setCameraConfig(uint8_t *vflip, uint8_t *framesize, uint8_t
this->notify(ObserverEvent::cameraConfigUpdated);
}
void ProjectConfig::setWifiConfig(const std::string &networkName, const std::string &ssid, const std::string &password, uint8_t *channel, uint8_t *power, bool adhoc, bool shouldNotify)
{
// we store the ADHOC flag as false because the networks we store in the config are the ones we want the esp to connect to, rather than host as AP, and here we're just updating them
void ProjectConfig::setWifiConfig(const std::string& networkName,
const std::string& ssid,
const std::string& password,
uint8_t* channel,
uint8_t* power,
bool adhoc,
bool shouldNotify) {
// we store the ADHOC flag as false because the networks we store in the
// config are the ones we want the esp to connect to, rather than host as AP,
// and here we're just updating them
size_t size = this->config.networks.size();
// we're allowing to store up to three additional networks
if (size == 0)
{
if (size == 0) {
Serial.println("No networks, We're adding a new network");
this->config.networks.emplace_back(
networkName,
ssid,
password,
*channel,
*power,
false);
this->config.networks.emplace_back(networkName, ssid, password, *channel,
*power, false);
}
int networkToUpdate = -1;
for (int i = 0; i < size; i++)
{
if (strcmp(this->config.networks[i].name.c_str(), networkName.c_str()) == 0)
{
for (int i = 0; i < size; i++) {
if (this->config.networks[i].name == networkName) {
// we've found a preexisting network, let's upate it
networkToUpdate = i;
break;
}
}
if (networkToUpdate >= 0)
{
if (networkToUpdate >= 0) {
this->config.networks[networkToUpdate].name = networkName;
this->config.networks[networkToUpdate].ssid = ssid;
this->config.networks[networkToUpdate].password = password;
this->config.networks[networkToUpdate].channel = *channel;
this->config.networks[networkToUpdate].power = *power;
this->config.networks[networkToUpdate].adhoc = false;
}
else if (size < 3)
{
} else if (size < 3) {
Serial.println("We're adding a new network");
// we don't have that network yet, we can add it as we still have some space
// we're using emplace_back as push_back will create a copy of it, we want to avoid that
this->config.networks.emplace_back(
networkName,
ssid,
password,
*channel,
*power,
false);
// we're using emplace_back as push_back will create a copy of it, we want
// to avoid that
this->config.networks.emplace_back(networkName, ssid, password, *channel,
*power, false);
}
if (shouldNotify)
this->notify(ObserverEvent::networksConfigUpdated);
}
void ProjectConfig::setAPWifiConfig(const std::string &ssid, const std::string &password, uint8_t *channel, bool adhoc, bool shouldNotify)
{
void ProjectConfig::deleteWifiConfig(const std::string& networkName,
bool shouldNotify) {
size_t size = this->config.networks.size();
if (size == 0) {
Serial.println("No networks, nothing to delete");
}
int networkToDelete = -1;
for (int i = 0; i < size; i++) {
if (networkName == this->config.networks[i].name) {
// we've found a preexisting network, let's upate it
networkToDelete = i;
break; // we can break here as we're not allowing duplicate names
}
}
if (networkToDelete >= 0) {
this->config.networks.erase(this->config.networks.begin() +
networkToDelete);
}
if (shouldNotify)
this->notify(ObserverEvent::networksConfigUpdated);
}
void ProjectConfig::setWiFiTxPower(uint8_t* power, bool shouldNotify) {
this->config.txpower.power = *power;
log_d("Updating wifi tx power");
if (shouldNotify)
this->notify(ObserverEvent::wifiTxPowerUpdated);
}
void ProjectConfig::setAPWifiConfig(const std::string& ssid,
const std::string& password,
uint8_t* channel,
bool adhoc,
bool shouldNotify) {
this->config.ap_network.ssid.assign(ssid);
this->config.ap_network.password.assign(password);
this->config.ap_network.channel = *channel;
@ -330,74 +352,51 @@ void ProjectConfig::setAPWifiConfig(const std::string &ssid, const std::string &
this->notify(ObserverEvent::networksConfigUpdated);
}
void ProjectConfig::setWiFiTxPower(uint8_t *power, bool shouldNotify)
{
this->config.txpower.power = *power;
log_d("Updating wifi tx power");
if (shouldNotify)
this->notify(ObserverEvent::wifiTxPowerUpdated);
}
std::string ProjectConfig::DeviceConfig_t::toRepresentation()
{
std::string ProjectConfig::DeviceConfig_t::toRepresentation() {
std::string json = Helpers::format_string(
"\"device_config\": {\"OTAPassword\": \"%s\", \"OTAPort\": %u}",
this->OTAPassword.c_str(),
this->OTAPort);
this->OTAPassword.c_str(), this->OTAPort);
return json;
}
std::string ProjectConfig::MDNSConfig_t::toRepresentation()
{
std::string ProjectConfig::MDNSConfig_t::toRepresentation() {
std::string json = Helpers::format_string(
"\"mdns_config\": {\"hostname\": \"%s\", \"service\": \"%s\"}",
this->hostname.c_str(),
this->service.c_str());
this->hostname.c_str(), this->service.c_str());
return json;
}
std::string ProjectConfig::CameraConfig_t::toRepresentation()
{
std::string ProjectConfig::CameraConfig_t::toRepresentation() {
std::string json = Helpers::format_string(
"\"camera_config\": {\"vflip\": %d,\"framesize\": %d,\"href\": %d,\"quality\": %d,\"brightness\": %d}",
this->vflip,
this->framesize,
this->href,
this->quality,
"\"camera_config\": {\"vflip\": %d,\"framesize\": %d,\"href\": "
"%d,\"quality\": %d,\"brightness\": %d}",
this->vflip, this->framesize, this->href, this->quality,
this->brightness);
return json;
}
std::string ProjectConfig::WiFiConfig_t::toRepresentation()
{
std::string ProjectConfig::WiFiConfig_t::toRepresentation() {
std::string json = Helpers::format_string(
"{\"name\": \"%s\", \"ssid\": \"%s\", \"password\": \"%s\", \"channel\": %u, \"power\": %u,\"adhoc\": %s}",
this->name.c_str(),
this->ssid.c_str(),
this->password.c_str(),
this->channel,
this->power,
"{\"name\": \"%s\", \"ssid\": \"%s\", \"password\": \"%s\", "
"\"channel\": "
"%u, \"power\": %u,\"adhoc\": %s}",
this->name.c_str(), this->ssid.c_str(), this->password.c_str(),
this->channel, this->power, this->adhoc ? "true" : "false");
return json;
}
std::string ProjectConfig::AP_WiFiConfig_t::toRepresentation() {
std::string json = Helpers::format_string(
"\"ap_wifi_config\": {\"ssid\": \"%s\", \"password\": \"%s\", "
"\"channel\": %u, \"adhoc\": %s}",
this->ssid.c_str(), this->password.c_str(), this->channel,
this->adhoc ? "true" : "false");
return json;
}
std::string ProjectConfig::AP_WiFiConfig_t::toRepresentation()
{
std::string json = Helpers::format_string(
"\"ap_wifi_config\": {\"ssid\": \"%s\", \"password\": \"%s\", \"channel\": %u, \"adhoc\": %s}",
this->ssid.c_str(),
this->password.c_str(),
this->channel,
this->adhoc ? "true" : "false");
return json;
}
std::string ProjectConfig::WiFiTxPower_t::toRepresentation()
{
std::string json = Helpers::format_string(
"\"wifi_tx_power\": {\"power\": %u}",
this->power);
std::string ProjectConfig::WiFiTxPower_t::toRepresentation() {
std::string json =
Helpers::format_string("\"wifi_tx_power\": {\"power\": %u}", this->power);
return json;
}
@ -407,9 +406,21 @@ std::string ProjectConfig::WiFiTxPower_t::toRepresentation()
//*
//**********************************************************************************************************************
ProjectConfig::DeviceConfig_t *ProjectConfig::getDeviceConfig() { return &this->config.device; }
ProjectConfig::CameraConfig_t *ProjectConfig::getCameraConfig() { return &this->config.camera; }
std::vector<ProjectConfig::WiFiConfig_t> *ProjectConfig::getWifiConfigs() { return &this->config.networks; }
ProjectConfig::AP_WiFiConfig_t *ProjectConfig::getAPWifiConfig() { return &this->config.ap_network; }
ProjectConfig::MDNSConfig_t *ProjectConfig::getMDNSConfig() { return &this->config.mdns; }
ProjectConfig::WiFiTxPower_t *ProjectConfig::getWiFiTxPowerConfig() { return &this->config.txpower; }
ProjectConfig::DeviceConfig_t* ProjectConfig::getDeviceConfig() {
return &this->config.device;
}
ProjectConfig::CameraConfig_t* ProjectConfig::getCameraConfig() {
return &this->config.camera;
}
std::vector<ProjectConfig::WiFiConfig_t>* ProjectConfig::getWifiConfigs() {
return &this->config.networks;
}
ProjectConfig::AP_WiFiConfig_t* ProjectConfig::getAPWifiConfig() {
return &this->config.ap_network;
}
ProjectConfig::MDNSConfig_t* ProjectConfig::getMDNSConfig() {
return &this->config.mdns;
}
ProjectConfig::WiFiTxPower_t* ProjectConfig::getWiFiTxPowerConfig() {
return &this->config.txpower;
}

View File

@ -3,20 +3,17 @@
#define PROJECT_CONFIG_HPP
#include <Arduino.h>
#include <Preferences.h>
#include <vector>
#include <string>
#include <vector>
#include "tasks/tasks.hpp"
#include "data/utilities/Observer.hpp"
#include "data/utilities/helpers.hpp"
#include "tasks/tasks.hpp"
class ProjectConfig : public Preferences, public ISubject
{
public:
ProjectConfig(
const std::string &name = std::string(),
const std::string &mdnsName = std::string()
);
class ProjectConfig : public Preferences, public ISubject {
public:
ProjectConfig(const std::string& name = std::string(),
const std::string& mdnsName = std::string());
virtual ~ProjectConfig();
void load();
void save();
@ -28,23 +25,20 @@ public:
bool reset();
void initConfig();
struct DeviceConfig_t
{
struct DeviceConfig_t {
std::string OTAPassword;
int OTAPort;
std::string binaryName;
std::string toRepresentation();
};
struct MDNSConfig_t
{
struct MDNSConfig_t {
std::string hostname;
std::string service;
std::string toRepresentation();
};
struct CameraConfig_t
{
struct CameraConfig_t {
uint8_t vflip;
uint8_t href;
uint8_t framesize;
@ -54,15 +48,15 @@ public:
std::string toRepresentation();
};
struct WiFiConfig_t
{
struct WiFiConfig_t {
//! Constructor for WiFiConfig_t - allows us to use emplace_back
WiFiConfig_t(const std::string &name,
const std::string &ssid,
const std::string &password,
WiFiConfig_t(const std::string& name,
const std::string& ssid,
const std::string& password,
uint8_t channel,
uint8_t power,
bool adhoc) : name(std::move(name)),
bool adhoc)
: name(std::move(name)),
ssid(std::move(ssid)),
password(std::move(password)),
channel(channel),
@ -78,8 +72,7 @@ public:
std::string toRepresentation();
};
struct AP_WiFiConfig_t
{
struct AP_WiFiConfig_t {
std::string ssid;
std::string password;
uint8_t channel;
@ -87,14 +80,12 @@ public:
std::string toRepresentation();
};
struct WiFiTxPower_t
{
struct WiFiTxPower_t {
uint8_t power;
std::string toRepresentation();
};
struct TrackerConfig_t
{
struct TrackerConfig_t {
DeviceConfig_t device;
CameraConfig_t camera;
std::vector<WiFiConfig_t> networks;
@ -103,21 +94,43 @@ public:
WiFiTxPower_t txpower;
};
DeviceConfig_t *getDeviceConfig();
CameraConfig_t *getCameraConfig();
std::vector<WiFiConfig_t> *getWifiConfigs();
AP_WiFiConfig_t *getAPWifiConfig();
MDNSConfig_t *getMDNSConfig();
WiFiTxPower_t *getWiFiTxPowerConfig();
DeviceConfig_t* getDeviceConfig();
CameraConfig_t* getCameraConfig();
std::vector<WiFiConfig_t>* getWifiConfigs();
AP_WiFiConfig_t* getAPWifiConfig();
MDNSConfig_t* getMDNSConfig();
WiFiTxPower_t* getWiFiTxPowerConfig();
void setDeviceConfig(const std::string &OTAPassword, int OTAPort, const std::string &binaryName, bool shouldNotify);
void setMDNSConfig(const std::string &hostname, const std::string &service, bool shouldNotify);
void setCameraConfig(uint8_t *vflip, uint8_t *framesize, uint8_t *href, uint8_t *quality, uint8_t *brightness, bool shouldNotify);
void setWifiConfig(const std::string &networkName, const std::string &ssid, const std::string &password, uint8_t *channel, uint8_t *power, bool adhoc, bool shouldNotify);
void setAPWifiConfig(const std::string &ssid, const std::string &password, uint8_t *channel, bool adhoc, bool shouldNotify);
void setWiFiTxPower(uint8_t *power, bool shouldNotify);
void setDeviceConfig(const std::string& OTAPassword,
int OTAPort,
const std::string& binaryName,
bool shouldNotify);
void setMDNSConfig(const std::string& hostname,
const std::string& service,
bool shouldNotify);
void setCameraConfig(uint8_t* vflip,
uint8_t* framesize,
uint8_t* href,
uint8_t* quality,
uint8_t* brightness,
bool shouldNotify);
void setWifiConfig(const std::string& networkName,
const std::string& ssid,
const std::string& password,
uint8_t* channel,
uint8_t* power,
bool adhoc,
bool shouldNotify);
void setAPWifiConfig(const std::string& ssid,
const std::string& password,
uint8_t* channel,
bool adhoc,
bool shouldNotify);
void setWiFiTxPower(uint8_t* power, bool shouldNotify);
private:
void deleteWifiConfig(const std::string& networkName, bool shouldNotify);
private:
TrackerConfig_t config;
std::string _name;
std::string _mdnsName;

View File

@ -114,6 +114,13 @@ void BaseAPI::setWiFi(AsyncWebServerRequest* request) {
"{\"msg\":\"Done. Wifi Creds have been set.\"}");
break;
}
case DELETE: {
projectConfig->deleteWifiConfig(request->arg("networkName").c_str(),
true);
request->send(200, MIMETYPE_JSON,
"{\"msg\":\"Done. Wifi Creds have been deleted.\"}");
break;
}
default: {
request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}");
request->redirect("/");