Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions boards/sdkconfig.base_defaults
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,7 @@ CONFIG_CAMERA_WIFI_XCLK_FREQ=16500000
#
CONFIG_WIFI_MDNS_HOSTNAME="openiristracker"
CONFIG_WIFI_SSID=""
CONFIG_WIFI_BSSID=""
CONFIG_WIFI_PASSWORD=""
CONFIG_WIFI_AP_SSID="EyeTrackVR"
CONFIG_WIFI_AP_PASSWORD="12345678"
Expand Down
35 changes: 33 additions & 2 deletions components/CommandManager/CommandManager/CommandSchema.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,33 @@
#include "CommandSchema.hpp"

void to_json(nlohmann::json& j, const WifiPayload& payload)
{
j = nlohmann::json{
{"name", payload.name}, {"ssid", payload.ssid}, {"bssid", payload.bssid},
{"password", payload.password}, {"channel", payload.channel}, {"power", payload.power},
};
}

void from_json(const nlohmann::json& j, WifiPayload& payload)
{
payload.name = j.at("name").get<std::string>();
payload.ssid = j.at("ssid").get<std::string>();
payload.password = j.at("password").get<std::string>();
payload.channel = j.at("channel").get<uint8_t>();
payload.power = j.at("power").get<uint8_t>();

if (j.contains("bssid"))
{
payload.bssid = j.at("bssid").get<std::string>();
}
}

void to_json(nlohmann::json& j, const UpdateWifiPayload& payload)
{
j = nlohmann::json{{"name", payload.name}, {"ssid", payload.ssid}, {"password", payload.password}, {"channel", payload.channel}, {"power", payload.power}};
j = nlohmann::json{
{"name", payload.name}, {"ssid", payload.ssid}, {"bssid", payload.bssid},
{"password", payload.password}, {"channel", payload.channel}, {"power", payload.power},
};
}

void from_json(const nlohmann::json& j, UpdateWifiPayload& payload)
Expand All @@ -13,6 +38,11 @@ void from_json(const nlohmann::json& j, UpdateWifiPayload& payload)
payload.ssid = j.at("ssid").get<std::string>();
}

if (j.contains("bssid"))
{
payload.bssid = j.at("bssid").get<std::string>();
}

if (j.contains("password"))
{
payload.password = j.at("password").get<std::string>();
Expand Down Expand Up @@ -54,7 +84,8 @@ void from_json(const nlohmann::json& j, UpdateAPWiFiPayload& payload)
void to_json(nlohmann::json& j, const UpdateCameraConfigPayload& payload)
{
j = nlohmann::json{
{"vflip", payload.vflip}, {"href", payload.href}, {"framesize", payload.framesize}, {"quality", payload.quality}, {"brightness", payload.brightness}};
{"vflip", payload.vflip}, {"href", payload.href}, {"framesize", payload.framesize}, {"quality", payload.quality}, {"brightness", payload.brightness},
};
}

void from_json(const nlohmann::json& j, UpdateCameraConfigPayload& payload)
Expand Down
5 changes: 4 additions & 1 deletion components/CommandManager/CommandManager/CommandSchema.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,20 @@ struct WifiPayload : BasePayload
{
std::string name;
std::string ssid;
std::optional<std::string> bssid;
std::string password;
uint8_t channel;
uint8_t power;
};

NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(WifiPayload, name, ssid, password, channel, power)
void to_json(nlohmann::json& j, const WifiPayload& payload);
void from_json(const nlohmann::json& j, WifiPayload& payload);

struct UpdateWifiPayload : BasePayload
{
std::string name;
std::optional<std::string> ssid;
std::optional<std::string> bssid;
std::optional<std::string> password;
std::optional<uint8_t> channel;
std::optional<uint8_t> power;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,16 @@ CommandResult setWiFiCommand(std::shared_ptr<DependencyRegistry> registry, const
return CommandResult::getErrorResult("Invalid payload: missing SSID");
}

// format is XX:XX:XX:XX:XX:XX
const std::string bssid = payload.bssid.has_value() ? payload.bssid.value() : "";
const auto bssid_len = bssid.length();
if (bssid_len > 0 && bssid_len != 17)
{
return CommandResult::getErrorResult("BSSID is malformed");
}

std::shared_ptr<ProjectConfig> projectConfig = registry->resolve<ProjectConfig>(DependencyType::project_config);
projectConfig->setWifiConfig(payload.name, payload.ssid, payload.password, payload.channel, payload.power);
projectConfig->setWifiConfig(payload.name, payload.ssid, bssid, payload.password, payload.channel, payload.power);

return CommandResult::getSuccessResult("Config updated");
}
Expand Down Expand Up @@ -53,12 +61,22 @@ CommandResult updateWiFiCommand(std::shared_ptr<DependencyRegistry> registry, co
return CommandResult::getErrorResult("Invalid payload - missing network name");
}

if (payload.bssid.has_value())
{
auto bssid_len = payload.bssid.value().length();
if (bssid_len > 0 && bssid_len != 11)
{
return CommandResult::getErrorResult("BSSID is malformed");
}
}

auto projectConfig = registry->resolve<ProjectConfig>(DependencyType::project_config);
auto storedNetworks = projectConfig->getWifiConfigs();
if (const auto networkToUpdate = std::ranges::find_if(storedNetworks, [&](auto& network) { return network.name == payload.name; });
networkToUpdate != storedNetworks.end())
{
projectConfig->setWifiConfig(payload.name, payload.ssid.has_value() ? payload.ssid.value() : networkToUpdate->ssid,
payload.bssid.has_value() ? payload.bssid.value() : networkToUpdate->bssid,
payload.password.has_value() ? payload.password.value() : networkToUpdate->password,
payload.channel.has_value() ? payload.channel.value() : networkToUpdate->channel,
payload.power.has_value() ? payload.power.value() : networkToUpdate->power);
Expand Down
19 changes: 15 additions & 4 deletions components/ProjectConfig/ProjectConfig/Models.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,14 +170,23 @@ struct WiFiConfig_t : BaseConfigModel
// default constructor used for loading
WiFiConfig_t(Preferences* pref) : BaseConfigModel(pref) {}

WiFiConfig_t(Preferences* pref, const uint8_t index, std::string name, std::string ssid, std::string password, const uint8_t channel, const uint8_t power)
: BaseConfigModel(pref), index(index), name(std::move(name)), ssid(std::move(ssid)), password(std::move(password)), channel(channel), power(power)
WiFiConfig_t(Preferences* pref, const uint8_t index, std::string name, std::string ssid, std::string bssid, std::string password, const uint8_t channel,
const uint8_t power)
: BaseConfigModel(pref),
index(index),
name(std::move(name)),
ssid(std::move(ssid)),
bssid(std::move(bssid)),
password(std::move(password)),
channel(channel),
power(power)
{
}

uint8_t index;
std::string name;
std::string ssid;
std::string bssid;
std::string password;
uint8_t channel;
uint8_t power;
Expand All @@ -190,6 +199,7 @@ struct WiFiConfig_t : BaseConfigModel
auto const iter_str = std::string(Helpers::itoa(index, buffer, 10));
this->name = this->pref->getString(("name" + iter_str).c_str(), "");
this->ssid = this->pref->getString(("ssid" + iter_str).c_str(), "");
this->bssid = this->pref->getString(("bssid" + iter_str).c_str(), "");
this->password = this->pref->getString(("password" + iter_str).c_str(), "");
this->channel = this->pref->getUInt(("channel" + iter_str).c_str());
this->power = this->pref->getUInt(("power" + iter_str).c_str());
Expand All @@ -204,6 +214,7 @@ struct WiFiConfig_t : BaseConfigModel

this->pref->putString(("name" + iter_str).c_str(), this->name.c_str());
this->pref->putString(("ssid" + iter_str).c_str(), this->ssid.c_str());
this->pref->putString(("bssid" + iter_str).c_str(), this->bssid.c_str());
this->pref->putString(("password" + iter_str).c_str(), this->password.c_str());
this->pref->putUInt(("channel" + iter_str).c_str(), this->channel);
this->pref->putUInt(("power" + iter_str).c_str(), this->power);
Expand All @@ -213,8 +224,8 @@ struct WiFiConfig_t : BaseConfigModel

std::string toRepresentation()
{
return Helpers::format_string("{\"name\": \"%s\", \"ssid\": \"%s\", \"password\": \"%s\", \"channel\": %u, \"power\": %u}", this->name.c_str(),
this->ssid.c_str(), this->password.c_str(), this->channel, this->power);
return Helpers::format_string("{\"name\": \"%s\", \"ssid\": \"%s\", \"bssid\": \"%s\", \"password\": \"%s\", \"channel\": %u, \"power\": %u}",
this->name.c_str(), this->ssid.c_str(), this->bssid.c_str(), this->password.c_str(), this->channel, this->power);
};
};

Expand Down
10 changes: 6 additions & 4 deletions components/ProjectConfig/ProjectConfig/ProjectConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ void ProjectConfig::setCameraConfig(const uint8_t vflip, const uint8_t framesize
ESP_LOGD(CONFIGURATION_TAG, "Updating Camera config");
}

void ProjectConfig::setWifiConfig(const std::string& networkName, const std::string& ssid, const std::string& password, uint8_t channel, uint8_t power)
void ProjectConfig::setWifiConfig(const std::string& networkName, const std::string& ssid, const std::string& bssid, const std::string& password,
uint8_t channel, uint8_t power)
{
const auto size = this->config.networks.size();

Expand All @@ -139,6 +140,7 @@ void ProjectConfig::setWifiConfig(const std::string& networkName, const std::str

it->name = networkName;
it->ssid = ssid;
it->bssid = bssid;
it->password = password;
it->channel = channel;
it->power = power;
Expand All @@ -150,7 +152,7 @@ void ProjectConfig::setWifiConfig(const std::string& networkName, const std::str
if (size == 0)
{
ESP_LOGI(CONFIGURATION_TAG, "No networks, We're adding a new network");
this->config.networks.emplace_back(this->pref, static_cast<uint8_t>(0), networkName, ssid, password, channel, power);
this->config.networks.emplace_back(this->pref, static_cast<uint8_t>(0), networkName, ssid, bssid, password, channel, power);
// Save the new network immediately
this->config.networks.back().save();
saveNetworkCount(this->pref, 1);
Expand All @@ -162,10 +164,10 @@ void ProjectConfig::setWifiConfig(const std::string& networkName, const std::str
{
ESP_LOGI(CONFIGURATION_TAG, "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,
// space, we're using emplace_back as push_back will create a copy of it,
// we want to avoid that
uint8_t last_index = getNetworkCount(this->pref);
this->config.networks.emplace_back(this->pref, last_index, networkName, ssid, password, channel, power);
this->config.networks.emplace_back(this->pref, last_index, networkName, ssid, bssid, password, channel, power);
// Save the new network immediately
this->config.networks.back().save();
saveNetworkCount(this->pref, static_cast<int>(this->config.networks.size()));
Expand Down
3 changes: 2 additions & 1 deletion components/ProjectConfig/ProjectConfig/ProjectConfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ class ProjectConfig
void setLEDDUtyCycleConfig(int led_external_pwm_duty_cycle);
void setMDNSConfig(const std::string& hostname);
void setCameraConfig(uint8_t vflip, uint8_t framesize, uint8_t href, uint8_t quality, uint8_t brightness);
void setWifiConfig(const std::string& networkName, const std::string& ssid, const std::string& password, uint8_t channel, uint8_t power);
void setWifiConfig(const std::string& networkName, const std::string& ssid, const std::string& bssid, const std::string& password, uint8_t channel,
uint8_t power);

void deleteWifiConfig(const std::string& networkName);

Expand Down
Loading