From e5e687835173bcce9d30b942b73ae4beace3b563 Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Wed, 4 Jun 2025 11:04:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=D1=80=D1=83=D0=B5=D0=BC=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=D0=B5=D0=B1-=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B0,=20=D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0=20=D1=81=D1=82=D0=B0=D0=B4?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api-driver/daemon.cpp | 45 +++++++++++ src/api-driver/daemon.h | 8 +- src/api-driver/proxy.cpp | 18 +++++ src/api-driver/structs.cpp | 30 +++---- src/api-driver/structs.h | 4 +- src/main.cpp | 152 ++++++++++++++++++++++++++++-------- src/terminal_api_driver.cpp | 52 ++++++++++-- 7 files changed, 247 insertions(+), 62 deletions(-) diff --git a/src/api-driver/daemon.cpp b/src/api-driver/daemon.cpp index 1dcfa82..0faeca0 100644 --- a/src/api-driver/daemon.cpp +++ b/src/api-driver/daemon.cpp @@ -201,6 +201,51 @@ void api_driver::TerminalApiDaemon::getDeviceState(obj::TerminalDeviceState &des dest = stateDev; } +api_driver::obj::TerminalRxTxSettings api_driver::TerminalApiDaemon::getSettingsRxTx() { + obj::TerminalRxTxSettings s; + { + std::shared_lock _olock(this->settingsMutex); + s = settingsRxTx; + } + return s; +} + +void api_driver::TerminalApiDaemon::setSettingsRxTx(obj::TerminalRxTxSettings &s) { + std::lock_guard _olock(settingsMutex); + settingsRxTx = s; +} + +#ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE +api_driver::obj::TerminalNetworkSettings api_driver::TerminalApiDaemon::getNetworkSettings() { + obj::TerminalNetworkSettings s; + { + std::shared_lock _olock(this->settingsMutex); + s = settingsNetwork; + } + return s; +} + +void api_driver::TerminalApiDaemon::setNetworkSettings(obj::TerminalNetworkSettings &s) { + std::lock_guard _olock(settingsMutex); + settingsNetwork = s; +} +#endif + +#ifdef API_OBJECT_QOS_SETTINGS_ENABLE +api_driver::obj::TerminalQosSettings api_driver::TerminalApiDaemon::getQosSettings() { + obj::TerminalQosSettings s; + { + std::shared_lock _olock(this->settingsMutex); + s = settingsQos; + } + return s; +} + +void api_driver::TerminalApiDaemon::setQosSettings(obj::TerminalQosSettings &s) { + std::lock_guard _olock(settingsMutex); + settingsQos = s; +} +#endif api_driver::obj::TerminalFirmwareVersion api_driver::TerminalApiDaemon::getFirmware() { obj::TerminalFirmwareVersion res; diff --git a/src/api-driver/daemon.h b/src/api-driver/daemon.h index f868835..bae0d8e 100644 --- a/src/api-driver/daemon.h +++ b/src/api-driver/daemon.h @@ -52,17 +52,17 @@ namespace api_driver { // * Получение настроек, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет. // * Установка настроек просто копирует настройки и устанавливает их текущими // */ - obj::TerminalRxTxSettings getSettingsRxTx() const; + obj::TerminalRxTxSettings getSettingsRxTx(); void setSettingsRxTx(obj::TerminalRxTxSettings &s); #ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE - obj::TerminalNetworkSettings getNetworkSettings() const; + obj::TerminalNetworkSettings getNetworkSettings(); void setNetworkSettings(obj::TerminalNetworkSettings &s); #endif #ifdef API_OBJECT_QOS_SETTINGS_ENABLE - obj::TerminalQosSettings getQosSettings() const; - void setQosSettings(bool enabled, const std::string &str); + obj::TerminalQosSettings getQosSettings(); + void setQosSettings(obj::TerminalQosSettings &s); #endif obj::TerminalFirmwareVersion getFirmware(); diff --git a/src/api-driver/proxy.cpp b/src/api-driver/proxy.cpp index 2e9b777..c47cf3f 100644 --- a/src/api-driver/proxy.cpp +++ b/src/api-driver/proxy.cpp @@ -67,6 +67,7 @@ void api_driver::proxy::CpProxy::setDemodSettings(demodulator_settings &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::setDemodSettings", CP_SetDemodulatorSettings, (sid, dest), "struct {...}"); } +#ifdef API_STRUCT_ACM_ENABLE void api_driver::proxy::CpProxy::getAcmSettings(ACM_parameters_serv_ &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::getAcmSettings", CP_GetAcmParams, (sid, &dest), ""); } @@ -74,11 +75,13 @@ void api_driver::proxy::CpProxy::getAcmSettings(ACM_parameters_serv_ &dest) { void api_driver::proxy::CpProxy::setAcmSettings(ACM_parameters_serv_ &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::setAcmSettings", CP_GetAcmParams, (sid, &dest), "struct {...}"); } +#endif void api_driver::proxy::CpProxy::getDeviceState(device_state &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::getDeviceState", CP_GetDeviceState, (sid, dest), ""); } +#ifdef API_OBJECT_QOS_SETTINGS_ENABLE std::tuple api_driver::proxy::CpProxy::getQosSettings() { std::string rules; bool en; @@ -89,7 +92,9 @@ std::tuple api_driver::proxy::CpProxy::getQosSettings() { void api_driver::proxy::CpProxy::setQosSettings(const std::string &rules, bool enable) { CPAPI_PROXY_CALL_HELPER("CpProxy::setQosSettings", CP_SetQoSSettings, (sid, rules, enable), "`" << rules << "`, " << (enable ? "true" : "false")); } +#endif +#ifdef API_OBJECT_DPDI_SETTINGS_ENABLE void api_driver::proxy::CpProxy::getDpdiSettings(DPDI_parmeters &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::getDpdiSettings", CP_GetDpdiParams, (sid, &dest), ""); } @@ -97,7 +102,9 @@ void api_driver::proxy::CpProxy::getDpdiSettings(DPDI_parmeters &dest) { void api_driver::proxy::CpProxy::setDpdiSettings(DPDI_parmeters &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::setDpdiSettings", CP_SetDpdiParams, (sid, dest), "struct {...}"); } +#endif +#ifdef API_OBJECT_BUCLNB_SETTINGS_ENABLE void api_driver::proxy::CpProxy::getBuclnbSettings(buc_lnb_settings &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::getBuclnbSettings", CP_GetBUC_LNB_settings, (sid, dest), ""); } @@ -105,14 +112,25 @@ void api_driver::proxy::CpProxy::getBuclnbSettings(buc_lnb_settings &dest) { void api_driver::proxy::CpProxy::setBuclnbSettings(buc_lnb_settings &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::setBuclnbSettings", CP_SetBUC_LNB_settings, (sid, dest), "struct {...}"); } +#endif +#ifdef MODEM_IS_SCPC void api_driver::proxy::CpProxy::getCincState(CinC_state &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::getCincState", CP_GetCinCState, (sid, dest), ""); } +#endif +#ifdef API_OBJECT_DEBUG_METRICS_ENABLE void api_driver::proxy::CpProxy::getDebugMetrics(debug_metrics &dest) { CPAPI_PROXY_CALL_HELPER("CpProxy::getDebugMetrics", CP_GetDebugMetrics, (sid, dest), ""); } +#endif + +#ifdef MODEM_IS_TDMA +void api_driver::proxy::CpProxy::getUpdateStatus(progress_msg &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getUpdateStatus", CP_GetUpdateStatus, (sid, dest), ""); +} +#endif api_driver::proxy::CpProxy::~CpProxy() { disconnect(); diff --git a/src/api-driver/structs.cpp b/src/api-driver/structs.cpp index a5926a1..169b9de 100644 --- a/src/api-driver/structs.cpp +++ b/src/api-driver/structs.cpp @@ -217,7 +217,7 @@ void api_driver::obj::TerminalNetworkSettings::updateCallback(proxy::CpProxy &cp } } -void api_driver::obj::TerminalNetworkSettings::updateFromJson(nlohmann::json &data) { +void api_driver::obj::TerminalNetworkSettings::updateFromJson(const nlohmann::json &data) { managementIp = data.value("managementIp", managementIp); isL2 = data.value("isL2", isL2); dataIp = data.value("dataIp", dataIp); @@ -279,7 +279,7 @@ void api_driver::obj::TerminalQosSettings::updateCallback(proxy::CpProxy &cp) { } } -void api_driver::obj::TerminalQosSettings::updateFromJson(nlohmann::json &data) { +void api_driver::obj::TerminalQosSettings::updateFromJson(const nlohmann::json &data) { qosEnabled = data.value("en", qosEnabled); qosSettingsJson = data.value("profile", qosSettingsJson); } @@ -402,7 +402,6 @@ nlohmann::json api_driver::obj::TerminalState::asJson() { res["initState"] = fInitState; res["testState"] = fIsTest; - res["fTxState"] = fIsTest; #ifdef MODEM_IS_SCPC res["isCinC"] = fIsCinC; #endif @@ -431,6 +430,7 @@ nlohmann::json api_driver::obj::TerminalState::asJson() { res["rx"]["packetsDummy"] = fRxPacketsDummy; res["tx"]["modcod"] = fTxModcod; + res["tx"]["state"] = fTxState; res["tx"]["speedOnTxKbit"] = fTxSpeedOnTxKbit; res["tx"]["speedOnIifKbit"] = fTxSpeedOnIifKbit; #ifdef MODEM_IS_SCPC @@ -703,38 +703,38 @@ static std::tuple translateCoordinates(double abs) { } void api_driver::obj::TerminalRxTxSettings::updateDpdiSettings(const nlohmann::json &data) { - dpdi.is_delay_window = !data.value("dpdiIsPositional", !dpdi.is_delay_window); + dpdi.is_delay_window = !data.value("isPositional", !dpdi.is_delay_window); #ifdef MODEM_IS_SCPC - dpdi.freq_offset = data.value("dpdiSearchBandwidth", dpdi.freq_offset); + dpdi.freq_offset = data.value("searchBandwidth", dpdi.freq_offset); #endif - if (data["dpdiPositionStationLatitude"]) { - const double pos = data["dpdiPositionStationLatitude"]; + if (data["positionStationLatitude"]) { + const double pos = data["positionStationLatitude"]; const auto [g, m] = translateCoordinates(pos); dpdi.latitude_station_grad = g; dpdi.latitude_station_minute = m; } - if (data["dpdiPositionStationLongitude"]) { - const double pos = data["dpdiPositionStationLongitude"]; + if (data["positionStationLongitude"]) { + const double pos = data["positionStationLongitude"]; const auto [g, m] = translateCoordinates(pos); dpdi.longitude_station_grad = g; dpdi.longitude_station_minute = m; } - if (data["dpdiPositionSatelliteLongitude"]) { - const double pos = data["dpdiPositionSatelliteLongitude"]; + if (data["positionSatelliteLongitude"]) { + const double pos = data["positionSatelliteLongitude"]; const auto [g, m] = translateCoordinates(pos); dpdi.longitude_sattelite_grad = g; dpdi.longitude_sattelite_minute = m; } #ifdef MODEM_IS_SCPC - dpdi.min_delay = data.value("dpdiDelayMin", dpdi.min_delay); - dpdi.max_delay = data.value("dpdiDelayMax", dpdi.max_delay); + dpdi.min_delay = data.value("delayMin", dpdi.min_delay); + dpdi.max_delay = data.value("delayMax", dpdi.max_delay); #else - s.min_delay = 0; - s.max_delay = data.value("dpdiDelay", dpdi.max_delay); + dpdi.min_delay = 0; + dpdi.max_delay = data.value("dpdiDelay", dpdi.max_delay); #endif } void api_driver::obj::TerminalRxTxSettings::storeDpdiSettings(proxy::CpProxy &cp) { diff --git a/src/api-driver/structs.h b/src/api-driver/structs.h index 6be86b3..2eb65bc 100644 --- a/src/api-driver/structs.h +++ b/src/api-driver/structs.h @@ -79,7 +79,7 @@ namespace api_driver::obj { void loadDefaults(); void updateCallback(proxy::CpProxy& cp); - void updateFromJson(nlohmann::json& data); + void updateFromJson(const nlohmann::json& data); void store(proxy::CpProxy& cp); nlohmann::json asJson(); @@ -101,7 +101,7 @@ namespace api_driver::obj { void loadDefaults(); void updateCallback(proxy::CpProxy& cp); - void updateFromJson(nlohmann::json& data); + void updateFromJson(const nlohmann::json& data); void store(proxy::CpProxy& cp); nlohmann::json asJson(); diff --git a/src/main.cpp b/src/main.cpp index 353371b..a39e87f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -104,6 +104,8 @@ public: static constexpr const char* INDEX_HTML = "/main-tdma.html"; #elif defined(MODEM_IS_SCPC) static constexpr const char* INDEX_HTML = "/main-scpc.html"; +#elif defined(MODEM_IS_SHPS) + static constexpr const char* INDEX_HTML = "/main-shps.html"; #else #error "Modem type not defined!" #endif @@ -179,7 +181,7 @@ public: try { auto reqJson = nlohmann::json::parse(std::string(req.payload.begin(), req.payload.end())); - auto u = auth.doAuth(reqJson["username"], reqJson["username"], req, rep); + auto u = auth.doAuth(reqJson["username"], reqJson["password"], req, rep); if (u == nullptr) { throw std::runtime_error("invalid session"); } @@ -217,10 +219,21 @@ public: http::server::stockReply(http::server::bad_request, rep); return; } - rep.status = http::server::ok; rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)}); - const auto result = api->loadTerminalState(); + nlohmann::json resultJson; + + try { + resultJson["status"] = "ok"; + resultJson["state"] = api->loadTerminalState(); + } catch (std::exception& e) { + BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/qos): Can't set QoS settings: " << e.what(); + resultJson.clear(); + resultJson["status"] = "error"; + resultJson["error"] = e.what(); + } + + auto result = resultJson.dump(); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); })); @@ -229,12 +242,22 @@ public: http::server::stockReply(http::server::bad_request, rep); return; } - rep.status = http::server::ok; rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)}); - std::string result = R"({"settings":)"; - result += api->loadSettings(); - result += "}"; + nlohmann::json resultJson; + + try { + resultJson["status"] = "ok"; + resultJson["settings"] = api->loadSettings(); + } catch (std::exception& e) { + BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/get/settings): Can't get object: " << e.what(); + resultJson.clear(); + rep.status = http::server::internal_server_error; + resultJson["status"] = "error"; + resultJson["error"] = e.what(); + } + + auto result = resultJson.dump(); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); })); @@ -246,7 +269,20 @@ public: rep.status = http::server::ok; rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)}); - const auto result = api->loadFirmwareVersion(); + nlohmann::json resultJson; + + try { + resultJson["status"] = "ok"; + resultJson["firmware"] = api->loadFirmwareVersion(); + } catch (std::exception& e) { + BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/get/aboutFirmware): Can't get object: " << e.what(); + resultJson.clear(); + rep.status = http::server::internal_server_error; + resultJson["status"] = "error"; + resultJson["error"] = e.what(); + } + + auto result = resultJson.dump(); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); })); @@ -451,7 +487,13 @@ public: http::server::stockReply(http::server::bad_request, rep); return; } - this->upgradeOrRebootRunning = true; + + rep.status = http::server::ok; + rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)}); + nlohmann::json resultJson; + + try { + this->upgradeOrRebootRunning = true; #ifdef MODEM_IS_TDMA if (req.url->params.find("ota") != req.url->params.end()) { doTerminalUpgradeOta(); @@ -461,10 +503,15 @@ public: #else doTerminalUpgrade(); #endif - rep.status = http::server::ok; - rep.headers.clear(); - rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)}); - const auto result = api->loadFirmwareVersion(); + resultJson["status"] = "ok"; + } catch (std::exception& e) { + BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/doFirmwareUpgrade): Error: " << e.what(); + resultJson.clear(); + resultJson["status"] = "error"; + resultJson["error"] = e.what(); + } + + auto result = resultJson.dump(); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); })); @@ -483,28 +530,67 @@ public: return; } const auto func = req.url->params["f"]; - std::string result = R"({"status":"ok"})"; - if (func == "SetDmaDebug") { - if (req.url->params.find("param") == req.url->params.end()) { http::server::stockReply(http::server::bad_request, rep); return; } - if (req.url->params.find("value") == req.url->params.end()) { http::server::stockReply(http::server::bad_request, rep); return; } - this->api->executeInApi([&](auto& cp) { - cp.setDmaDebug(req.url->params["param"], req.url->params["value"]); - }); - } else if (func == "GetDmaDebug") { - if (req.url->params.find("param") == req.url->params.end()) { http::server::stockReply(http::server::bad_request, rep); return; } - this->api->executeInApi([&](auto& cp) { - nlohmann::json tmp; - tmp["status"] = "ok"; - tmp["result"] = cp.getDmaDebug(req.url->params["param"]); - result = tmp.dump(); - }); - } else { - http::server::stockReply(http::server::not_implemented, rep); - return; - } - rep.status = http::server::ok; rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)}); + nlohmann::json resultJson; + + try { + resultJson["status"] = "error"; + if (func == "SetDmaDebug") { + if (req.url->params.find("param") == req.url->params.end()) { + rep.status = http::server::bad_request; + resultJson["error"] = "missing required adgument: `param`"; + } else if (req.url->params.find("value") == req.url->params.end()) { + rep.status = http::server::bad_request; + resultJson["error"] = "missing required adgument: `value`"; + } else { + this->api->executeInApi([&](auto& cp) { + cp.setDmaDebug(req.url->params["param"], req.url->params["value"]); + }); + } + } else if (func == "GetDmaDebug") { + if (req.url->params.find("param") == req.url->params.end()) { + rep.status = http::server::bad_request; + resultJson["error"] = "missing required adgument: `param`"; + } else { + this->api->executeInApi([&](auto& cp) { + resultJson["status"] = "ok"; + resultJson["result"] = cp.getDmaDebug(req.url->params["param"]); + }); + } + } else if (func == "SetNetwork") { + if (req.url->params.find("param") == req.url->params.end()) { + rep.status = http::server::bad_request; + resultJson["error"] = "missing required adgument: `param`"; + } else if (req.url->params.find("value") == req.url->params.end()) { + rep.status = http::server::bad_request; + resultJson["error"] = "missing required adgument: `value`"; + } else { + this->api->executeInApi([&](auto& cp) { + cp.setNetwork(req.url->params["param"], req.url->params["value"]); + }); + } + } else if (func == "GetNetwork") { + if (req.url->params.find("param") == req.url->params.end()) { + rep.status = http::server::bad_request; + resultJson["error"] = "missing required adgument: `param`"; + } else { + this->api->executeInApi([&](auto& cp) { + resultJson["status"] = "ok"; + resultJson["result"] = cp.getNetwork(req.url->params["param"]); + }); + } + } else { + resultJson["error"] = "function not supported"; + } + } catch (std::exception& e) { + BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/qos): Can't set QoS settings: " << e.what(); + resultJson.clear(); + resultJson["status"] = "error"; + resultJson["error"] = e.what(); + } + + auto result = resultJson.dump(); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); })); #ifdef API_OBJECT_DEBUG_METRICS_ENABLE diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index 772c38c..8bf9a3c 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -71,10 +71,10 @@ nlohmann::json api_driver::ApiDriver::loadSettings() const { nlohmann::json res = daemon->getSettingsRxTx().asJson(); #ifdef API_OBJECT_QOS_SETTINGS_ENABLE - res.update(daemon->getQosSettings().asJson()); + res["qos"] = (daemon->getQosSettings().asJson()); #endif #ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE - res.update(daemon->getNetworkSettings().asJson()); + res["network"] = (daemon->getNetworkSettings().asJson()); #endif return res; } @@ -116,17 +116,53 @@ void api_driver::ApiDriver::setDpdiSettings(const nlohmann::json& data) { } #endif +#ifdef API_OBJECT_BUCLNB_SETTINGS_ENABLE void api_driver::ApiDriver::setBucLnbSettings(const nlohmann::json& data) { - // TODO -} + auto rxtx = daemon->getSettingsRxTx(); + rxtx.updateBuclnbSettings(data); + std::lock_guard _lapi(this->daemon->cpApiMutex); + this->daemon->cp.setDmaDebug("begin_save_config", ""); + rxtx.storeBuclnbSettings(this->daemon->cp); + this->daemon->cp.setDmaDebug("save_config", ""); + rxtx.updateCallback(this->daemon->cp); + { + daemon->setSettingsRxTx(rxtx); + } +} +#endif + +#ifdef API_OBJECT_QOS_SETTINGS_ENABLE void api_driver::ApiDriver::setQosSettings(const nlohmann::json& data) { - // TODO -} + auto qos = daemon->getQosSettings(); + qos.updateFromJson(data); -void api_driver::ApiDriver::setNetworkSettings(const nlohmann::json& data) { - // TODO + std::lock_guard _lapi(this->daemon->cpApiMutex); + this->daemon->cp.setDmaDebug("begin_save_config", ""); + qos.store(this->daemon->cp); + this->daemon->cp.setDmaDebug("save_config", ""); + qos.updateCallback(this->daemon->cp); + { + daemon->setQosSettings(qos); + } } +#endif + +#ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE +void api_driver::ApiDriver::setNetworkSettings(const nlohmann::json& data) { + auto net = daemon->getNetworkSettings(); + net.updateFromJson(data); + + std::lock_guard _lapi(this->daemon->cpApiMutex); + this->daemon->cp.setDmaDebug("begin_save_config", ""); + net.store(this->daemon->cp); + this->daemon->cp.setDmaDebug("save_config", ""); + net.updateCallback(this->daemon->cp); + { + daemon->setNetworkSettings(net); + } +} +#endif void api_driver::ApiDriver::resetDefaultSettings() { daemon->resetDefaultSettings();