mirror of
https://github.com/MrUnknownDE/OpenIris-ESPIDF.git
synced 2026-04-17 13:33:44 +02:00
Implement wifi update command
This commit is contained in:
@@ -8,6 +8,8 @@ std::unique_ptr<Command> CommandManager::createCommand(CommandType type)
|
||||
return std::make_unique<PingCommand>();
|
||||
case CommandType::SET_WIFI:
|
||||
return std::make_unique<setWiFiCommand>(projectConfig);
|
||||
case CommandType::UPDATE_WIFI:
|
||||
return std::make_unique<updateWifiCommand>(projectConfig);
|
||||
case CommandType::DELETE_NETWORK:
|
||||
return std::make_unique<deleteWifiCommand>(projectConfig);
|
||||
default:
|
||||
|
||||
@@ -17,7 +17,7 @@ public:
|
||||
class UpdateWifiPayload : public BasePayload
|
||||
{
|
||||
public:
|
||||
std::optional<std::string> networkName;
|
||||
std::string networkName;
|
||||
std::optional<std::string> ssid;
|
||||
std::optional<std::string> password;
|
||||
std::optional<uint8_t> channel;
|
||||
|
||||
@@ -101,4 +101,76 @@ CommandResult deleteWifiCommand::execute(std::string &jsonPayload)
|
||||
|
||||
projectConfig.deleteWifiConfig(payload.value().networkName, false);
|
||||
return CommandResult::getSuccessResult("Config updated");
|
||||
}
|
||||
|
||||
std::optional<UpdateWifiPayload> updateWifiCommand::parsePayload(std::string &jsonPayload)
|
||||
{
|
||||
UpdateWifiPayload payload;
|
||||
cJSON *parsedJson = cJSON_Parse(jsonPayload.c_str());
|
||||
|
||||
if (parsedJson == nullptr)
|
||||
return std::nullopt;
|
||||
|
||||
cJSON *networkName = cJSON_GetObjectItem(parsedJson, "name");
|
||||
if (networkName == nullptr)
|
||||
{
|
||||
cJSON_Delete(parsedJson);
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
payload.networkName = std::string(networkName->valuestring);
|
||||
|
||||
cJSON *ssidObject = cJSON_GetObjectItem(parsedJson, "ssid");
|
||||
cJSON *passwordObject = cJSON_GetObjectItem(parsedJson, "password");
|
||||
cJSON *channelObject = cJSON_GetObjectItem(parsedJson, "channel");
|
||||
cJSON *powerObject = cJSON_GetObjectItem(parsedJson, "power");
|
||||
|
||||
if (ssidObject != nullptr && ssidObject->valuestring == "")
|
||||
{
|
||||
// we need ssid to actually connect
|
||||
cJSON_Delete(parsedJson);
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
if (ssidObject != nullptr)
|
||||
payload.ssid = std::string(ssidObject->valuestring);
|
||||
|
||||
if (passwordObject != nullptr)
|
||||
payload.password = std::string(passwordObject->valuestring);
|
||||
|
||||
if (channelObject != nullptr)
|
||||
payload.channel = channelObject->valueint;
|
||||
|
||||
if (powerObject != nullptr)
|
||||
payload.power = powerObject->valueint;
|
||||
}
|
||||
|
||||
CommandResult updateWifiCommand::execute(std::string &jsonPayload)
|
||||
{
|
||||
auto payload = parsePayload(jsonPayload);
|
||||
if (!payload.has_value())
|
||||
{
|
||||
return CommandResult::getErrorResult("Invalid payload");
|
||||
}
|
||||
|
||||
auto updatedConfig = payload.value();
|
||||
auto storedNetworks = projectConfig.getWifiConfigs();
|
||||
if (auto networkToUpdate = std::find_if(
|
||||
storedNetworks.begin(),
|
||||
storedNetworks.end(),
|
||||
[&](auto &network)
|
||||
{ return network.name == updatedConfig.networkName; });
|
||||
networkToUpdate != storedNetworks.end())
|
||||
{
|
||||
projectConfig.setWifiConfig(
|
||||
updatedConfig.networkName,
|
||||
updatedConfig.ssid.has_value() ? updatedConfig.ssid.value() : networkToUpdate->ssid,
|
||||
updatedConfig.password.has_value() ? updatedConfig.password.value() : networkToUpdate->password,
|
||||
updatedConfig.channel.has_value() ? updatedConfig.channel.value() : networkToUpdate->channel,
|
||||
updatedConfig.power.has_value() ? updatedConfig.power.value() : networkToUpdate->power,
|
||||
false,
|
||||
false);
|
||||
}
|
||||
else
|
||||
return CommandResult::getErrorResult("Requested network does not exist");
|
||||
}
|
||||
@@ -42,4 +42,14 @@ public:
|
||||
std::optional<deleteNetworkPayload> parsePayload(std::string &jsonPayload);
|
||||
};
|
||||
|
||||
class updateWifiCommand : public Command
|
||||
{
|
||||
ProjectConfig &projectConfig;
|
||||
|
||||
public:
|
||||
updateWifiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
|
||||
CommandResult execute(std::string &jsonPayload) override;
|
||||
std::optional<UpdateWifiPayload> parsePayload(std::string &jsonPayload);
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user