From 55fc322c131eacae79e524fd6f4d74d1862c12a2 Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Tue, 3 Jun 2025 18:32:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2-=D0=B7=D0=B0=D0=B3=D0=BB=D1=83=D1=88=D0=B5=D0=BA,=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D1=8C=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api-driver/daemon.cpp | 40 +++++------- src/api-driver/daemon.h | 23 +++---- src/api-driver/proxy.cpp | 121 ++++++++++++++++++++++++++++++++++-- src/api-driver/structs.cpp | 21 ++++++- src/terminal_api_driver.cpp | 55 ++++++++++------ src/terminal_api_driver.h | 7 +-- 6 files changed, 199 insertions(+), 68 deletions(-) diff --git a/src/api-driver/daemon.cpp b/src/api-driver/daemon.cpp index 135e83a..1dcfa82 100644 --- a/src/api-driver/daemon.cpp +++ b/src/api-driver/daemon.cpp @@ -6,6 +6,11 @@ // минимальный порог для сна в цикле событий демона static constexpr int64_t SLEEP_THRESHOLD = 10; +int64_t api_driver::TimeNow() { + return std::chrono::time_point_cast(std::chrono::system_clock::now()).time_since_epoch().count(); +} + + namespace api_driver { /** * Обертка для объектов, доступных для обновления @@ -196,37 +201,26 @@ void api_driver::TerminalApiDaemon::getDeviceState(obj::TerminalDeviceState &des dest = stateDev; } -void api_driver::TerminalApiDaemon::getSettingsRxTx(obj::TerminalRxTxSettings &dest) { -} - -void api_driver::TerminalApiDaemon::getNetworkSettings(obj::TerminalNetworkSettings &dest) { -} - -void api_driver::TerminalApiDaemon::getQosSettings(bool &isEnabled, std::string &json) { -} - -void api_driver::TerminalApiDaemon::setSettingsRxTx(obj::TerminalRxTxSettings &s, bool readback) { -} - -void api_driver::TerminalApiDaemon::setSettingsDpdi(DPDI_parmeters &s, bool readback) { -} - -void api_driver::TerminalApiDaemon::setSettingsBucLnb(buc_lnb_settings &bucLnb, bool readback) { -} - -void api_driver::TerminalApiDaemon::setQosSettings(bool enabled, const std::string &str, bool readback) { -} - -void api_driver::TerminalApiDaemon::setNetworkSettings(obj::TerminalNetworkSettings &s, bool readback) { -} api_driver::obj::TerminalFirmwareVersion api_driver::TerminalApiDaemon::getFirmware() { + obj::TerminalFirmwareVersion res; + { + std::shared_lock _olock(firmwareMutex); + res = firmware; + } + return res; } void api_driver::TerminalApiDaemon::resetPacketStatistics() { + std::lock_guard lock(this->cpApiMutex); + cp.getDmaDebug("reset_cnt_rx"); } void api_driver::TerminalApiDaemon::resetDefaultSettings() { + std::lock_guard lock(this->cpApiMutex); + cp.setDmaDebug("begin_save_config", ""); + cp.setDmaDebug("default_params", ""); + cp.setDmaDebug("save_config", ""); } api_driver::TerminalApiDaemon::~TerminalApiDaemon() { diff --git a/src/api-driver/daemon.h b/src/api-driver/daemon.h index daa836b..f868835 100644 --- a/src/api-driver/daemon.h +++ b/src/api-driver/daemon.h @@ -50,26 +50,19 @@ namespace api_driver { // /** // * Получение настроек, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет. + // * Установка настроек просто копирует настройки и устанавливает их текущими // */ - void getSettingsRxTx(obj::TerminalRxTxSettings &dest); + obj::TerminalRxTxSettings getSettingsRxTx() const; + void setSettingsRxTx(obj::TerminalRxTxSettings &s); + #ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE - void getNetworkSettings(obj::TerminalNetworkSettings &dest); - void setNetworkSettings(obj::TerminalNetworkSettings &s, bool readback = true); + obj::TerminalNetworkSettings getNetworkSettings() const; + void setNetworkSettings(obj::TerminalNetworkSettings &s); #endif #ifdef API_OBJECT_QOS_SETTINGS_ENABLE - void getQosSettings(bool &isEnabled, std::string &json); - void setQosSettings(bool enabled, const std::string &str, bool readback = true); - #endif - - void setSettingsRxTx(obj::TerminalRxTxSettings &s, bool readback = true); - - #ifdef API_OBJECT_DPDI_SETTINGS_ENABLE - void setSettingsDpdi(DPDI_parmeters &s, bool readback = true); - #endif - - #ifdef API_OBJECT_BUCLNB_SETTINGS_ENABLE - void setSettingsBucLnb(buc_lnb_settings &bucLnb, bool readback = true); + obj::TerminalQosSettings getQosSettings() const; + void setQosSettings(bool enabled, const std::string &str); #endif obj::TerminalFirmwareVersion getFirmware(); diff --git a/src/api-driver/proxy.cpp b/src/api-driver/proxy.cpp index 16ee327..2e9b777 100644 --- a/src/api-driver/proxy.cpp +++ b/src/api-driver/proxy.cpp @@ -1,10 +1,119 @@ #include "proxy.h" +#include "sstream" -//#define CPAPI_PROXY_CALL(proxy, func, ...) do { auto _res = func(proxy.sid, __VA_ARGS__); if (_res != OK) { BOOST_LOG_TRIVIAL(error) << "CP API error in " #func "(" #__VA_ARGS__ "): " << _res; } } while (0) -// void foo() { -// api_driver::proxy::CpProxy proxy; -// std::string tmp; -// CPAPI_PROXY_CALL(proxy, CP_GetDmaDebug, "fuck", &tmp); -// } +#define CPAPI_PROXY_CALL_HELPER(callfrom, func, funcArgs, throwArgs) do { lastCpError = func funcArgs; if (lastCpError != OK) { \ + std::stringstream err; err << callfrom ": CP Api error " #func "("; err << throwArgs; err << "): " << lastCpError;\ + throw std::runtime_error(err.str());\ + } } while (0) +api_driver::proxy::CpProxy::CpProxy() = default; + +api_driver::proxy::CpProxy::CpProxy(TSID s): sid(s) {} + +void api_driver::proxy::CpProxy::connect() { + unsigned int access{}; + CPAPI_PROXY_CALL_HELPER("CpProxy::connect", CP_Login, ("admin", "pass", &sid, &access), R"("admin", "pass", &sid, &access)"); +} + +void api_driver::proxy::CpProxy::disconnect() { + if (sid != 0) { + lastCpError = CP_Logout(sid); + sid = 0; + } +} + +std::string api_driver::proxy::CpProxy::getDmaDebug(const std::string &arg) { + std::string result; + CPAPI_PROXY_CALL_HELPER("CpProxy::getDmaDebug", CP_GetDmaDebug, (sid, arg.c_str(), &result), arg); + return result; +} + +void api_driver::proxy::CpProxy::setDmaDebug(const std::string &arg, const std::string &value) { + CPAPI_PROXY_CALL_HELPER("CpProxy::setDmaDebug", CP_SetDmaDebug, (sid, arg.c_str(), value), arg << ", \"" << value << "\""); +} + +std::string api_driver::proxy::CpProxy::getNetwork(const std::string ¶m) { + std::string result; + CPAPI_PROXY_CALL_HELPER("CpProxy::getNetwork", CP_GetNetwork, (sid, param.c_str(), &result), param); + return result; +} + +void api_driver::proxy::CpProxy::setNetwork(const std::string ¶m, const std::string &value) { + CPAPI_PROXY_CALL_HELPER("CpProxy::setNetwork", CP_SetNetwork, (sid, param.c_str(), value.c_str()), param << ", \"" << value << "\""); +} + +void api_driver::proxy::CpProxy::getModState(modulator_state &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getModState", CP_GetModulatorState, (sid, dest), ""); +} + +void api_driver::proxy::CpProxy::getModSettings(modulator_settings &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getModSettings", CP_GetModulatorSettings, (sid, dest), ""); +} + +void api_driver::proxy::CpProxy::setModSettings(modulator_settings &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::setModSettings", CP_SetModulatorSettings, (sid, dest), "struct {...}"); +} + +void api_driver::proxy::CpProxy::getDemodState(demodulator_state &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getDemodState", CP_GetDemodulatorState, (sid, dest), ""); +} + +void api_driver::proxy::CpProxy::getDemodSettings(demodulator_settings &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getDemodSettings", CP_GetDemodulatorSettings, (sid, dest), ""); +} + +void api_driver::proxy::CpProxy::setDemodSettings(demodulator_settings &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::setDemodSettings", CP_SetDemodulatorSettings, (sid, dest), "struct {...}"); +} + +void api_driver::proxy::CpProxy::getAcmSettings(ACM_parameters_serv_ &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getAcmSettings", CP_GetAcmParams, (sid, &dest), ""); +} + +void api_driver::proxy::CpProxy::setAcmSettings(ACM_parameters_serv_ &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::setAcmSettings", CP_GetAcmParams, (sid, &dest), "struct {...}"); +} + +void api_driver::proxy::CpProxy::getDeviceState(device_state &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getDeviceState", CP_GetDeviceState, (sid, dest), ""); +} + +std::tuple api_driver::proxy::CpProxy::getQosSettings() { + std::string rules; + bool en; + CPAPI_PROXY_CALL_HELPER("CpProxy::getQosSettings", CP_GetQoSSettings, (sid, rules, en), ""); + return {rules, en}; +} + +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")); +} + +void api_driver::proxy::CpProxy::getDpdiSettings(DPDI_parmeters &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getDpdiSettings", CP_GetDpdiParams, (sid, &dest), ""); +} + +void api_driver::proxy::CpProxy::setDpdiSettings(DPDI_parmeters &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::setDpdiSettings", CP_SetDpdiParams, (sid, dest), "struct {...}"); +} + +void api_driver::proxy::CpProxy::getBuclnbSettings(buc_lnb_settings &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getBuclnbSettings", CP_GetBUC_LNB_settings, (sid, dest), ""); +} + +void api_driver::proxy::CpProxy::setBuclnbSettings(buc_lnb_settings &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::setBuclnbSettings", CP_SetBUC_LNB_settings, (sid, dest), "struct {...}"); +} + +void api_driver::proxy::CpProxy::getCincState(CinC_state &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getCincState", CP_GetCinCState, (sid, dest), ""); +} + +void api_driver::proxy::CpProxy::getDebugMetrics(debug_metrics &dest) { + CPAPI_PROXY_CALL_HELPER("CpProxy::getDebugMetrics", CP_GetDebugMetrics, (sid, dest), ""); +} + +api_driver::proxy::CpProxy::~CpProxy() { + disconnect(); +} diff --git a/src/api-driver/structs.cpp b/src/api-driver/structs.cpp index bd10d49..a5926a1 100644 --- a/src/api-driver/structs.cpp +++ b/src/api-driver/structs.cpp @@ -132,7 +132,11 @@ void api_driver::obj::StatisticsLogger::setSettings(const nlohmann::json& data) } void api_driver::obj::StatisticsLogger::updateCallback(proxy::CpProxy &cp) { + if (!logEn) return; + debug_metrics dm{}; + cp.getDebugMetrics(dm); + putItem(dm); } void api_driver::obj::StatisticsLogger::putItem(const debug_metrics &item) { @@ -214,6 +218,11 @@ void api_driver::obj::TerminalNetworkSettings::updateCallback(proxy::CpProxy &cp } void api_driver::obj::TerminalNetworkSettings::updateFromJson(nlohmann::json &data) { + managementIp = data.value("managementIp", managementIp); + isL2 = data.value("isL2", isL2); + dataIp = data.value("dataIp", dataIp); + dataMtu = data.value("dataMtu", dataMtu); + serverName = data.value("serverName", serverName); } void api_driver::obj::TerminalNetworkSettings::store(proxy::CpProxy& cp) { @@ -546,6 +555,14 @@ void api_driver::obj::TerminalRxTxSettings::updateCallback(proxy::CpProxy &cp) { #endif } +void api_driver::obj::TerminalRxTxSettings::storeMainSettings(proxy::CpProxy &cp) { + cp.setModSettings(mod); + cp.setDemodSettings(dem); +#ifdef API_STRUCT_ACM_ENABLE + cp.setAcmSettings(acm); +#endif +} + struct ModcodDef_t {const char* modulation; const char* speed;}; const static ModcodDef_t ModcodDefs[] = { @@ -674,11 +691,11 @@ void api_driver::obj::TerminalRxTxSettings::updateMainSettings(const nlohmann::j } #ifdef API_OBJECT_DPDI_SETTINGS_ENABLE -double translateCoordinates(uint8_t deg, uint8_t min) { +static double translateCoordinates(uint8_t deg, uint8_t min) { return static_cast(deg) + static_cast(min) / 60; } -std::tuple translateCoordinates(double abs) { +static std::tuple translateCoordinates(double abs) { auto deg = static_cast(abs); double min_double = (abs - deg) * 60; auto min = static_cast(min_double); diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index 0f536b9..772c38c 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -44,7 +44,7 @@ std::tuple translateCoordinates(double abs) { } -std::string api_driver::ApiDriver::loadTerminalState() const { +nlohmann::json api_driver::ApiDriver::loadTerminalState() const { if (daemon == nullptr) { return R"({"error": "api daemon not started!"})"; } @@ -56,7 +56,7 @@ std::string api_driver::ApiDriver::loadTerminalState() const { auto res = state.asJson(); res["device"] = devState.asJson(); - return res.dump(); + return res; } @@ -64,38 +64,57 @@ void api_driver::ApiDriver::resetPacketStatistics() const { this->daemon->resetPacketStatistics(); } -std::string api_driver::ApiDriver::loadSettings() const { +nlohmann::json api_driver::ApiDriver::loadSettings() const { if (daemon == nullptr) { return R"({"error": "api daemon not started!"})"; } - // TODO сделать получение настроек - return "{}"; + nlohmann::json res = daemon->getSettingsRxTx().asJson(); +#ifdef API_OBJECT_QOS_SETTINGS_ENABLE + res.update(daemon->getQosSettings().asJson()); +#endif +#ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE + res.update(daemon->getNetworkSettings().asJson()); +#endif + return res; } -std::string api_driver::ApiDriver::loadFirmwareVersion() const { +nlohmann::json api_driver::ApiDriver::loadFirmwareVersion() const { if (daemon == nullptr) { return R"({"error": "api daemon not started!"})"; } - - std::stringstream result; - auto firmware = daemon->getFirmware(); - result << "{\n\"fw.version\":" << buildEscapedString(firmware.version); - result << ",\"fw.modemId\":" << buildEscapedString(firmware.modemId); - result << ",\"fw.modemSn\":" << buildEscapedString(firmware.modemSn); - result << ",\"fw.macMang\":" << buildEscapedString(firmware.macMang); - result << ",\"fw.macData\":" << buildEscapedString(firmware.macData); - result << "\n}"; - return result.str(); + return daemon->getFirmware().asJson(); } void api_driver::ApiDriver::setRxTxSettings(const nlohmann::json& data) { - // TODO + auto rxtx = daemon->getSettingsRxTx(); + rxtx.updateMainSettings(data); + + std::lock_guard _lapi(this->daemon->cpApiMutex); + this->daemon->cp.setDmaDebug("begin_save_config", ""); + rxtx.storeMainSettings(this->daemon->cp); + this->daemon->cp.setDmaDebug("save_config", ""); + rxtx.updateCallback(this->daemon->cp); + { + daemon->setSettingsRxTx(rxtx); + } } +#ifdef API_OBJECT_DPDI_SETTINGS_ENABLE void api_driver::ApiDriver::setDpdiSettings(const nlohmann::json& data) { - // TODO + auto rxtx = daemon->getSettingsRxTx(); + rxtx.updateDpdiSettings(data); + + std::lock_guard _lapi(this->daemon->cpApiMutex); + this->daemon->cp.setDmaDebug("begin_save_config", ""); + rxtx.storeMainSettings(this->daemon->cp); + this->daemon->cp.setDmaDebug("save_config", ""); + rxtx.updateCallback(this->daemon->cp); + { + daemon->setSettingsRxTx(rxtx); + } } +#endif void api_driver::ApiDriver::setBucLnbSettings(const nlohmann::json& data) { // TODO diff --git a/src/terminal_api_driver.h b/src/terminal_api_driver.h index f4476a6..7f42ffe 100644 --- a/src/terminal_api_driver.h +++ b/src/terminal_api_driver.h @@ -30,18 +30,17 @@ namespace api_driver { /** * Запросить общее состояние терминала - * @return {"txState":false,"rxState":false,"rx.sym_sync_lock":false,"rx.freq_search_lock":false,"rx.afc_lock":false,"rx.pkt_sync":false} */ - std::string loadTerminalState() const; + nlohmann::json loadTerminalState() const; /** * Сбросить статистику пакетов */ void resetPacketStatistics() const; - std::string loadSettings() const; + nlohmann::json loadSettings() const; - std::string loadFirmwareVersion() const; + nlohmann::json loadFirmwareVersion() const; /** * Установить настройки RX/TX, readback можно получить используя loadTerminalState