компилируемая версия веб-сервера, находится на стадии отладки

This commit is contained in:
Vladislav Ostapov 2025-06-04 11:04:51 +03:00
parent 55fc322c13
commit e5e6878351
7 changed files with 247 additions and 62 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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<std::string, bool> api_driver::proxy::CpProxy::getQosSettings() {
std::string rules;
bool en;
@ -89,7 +92,9 @@ std::tuple<std::string, bool> 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();

View File

@ -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<uint8_t, uint8_t> 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) {

View File

@ -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();

View File

@ -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

View File

@ -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();