From 3e4ffc8281be35dabe3ac686e9b110bf76692252 Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Fri, 29 Nov 2024 13:36:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/terminal_api_driver.cpp | 63 ++++++++++++++++++++++--------------- src/terminal_api_driver.h | 1 - 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index 34f0241..6eaa8dc 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -201,12 +201,35 @@ private: void run() { // это демон, который в бесконечном цикле опрашивает API - CP_GetNetwork(sid, "version", &firmware.version); - CP_GetNetwork(sid, "chip_id", &firmware.modemId); - rtrim(firmware.modemId); - CP_GetNetwork(sid, "serial", &firmware.modemSn); - CP_GetNetwork(sid, "mac_eth0", &firmware.macMang); - CP_GetNetwork(sid, "mac_eth1", &firmware.macData); + { + TSID sid{}; + unsigned int access{}; + for (int connectAttempt = 0;; connectAttempt++) { + BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): Try to connect api (attempt " << connectAttempt << ")..."; + auto res = CP_Login("admin", "pass", &sid, &access); + if (res != OK) { + boost::this_thread::sleep_for(boost::chrono::duration(boost::chrono::milliseconds(1000))); + } else { + break; + } + } + + std::string tmp; + CP_GetDmaDebug(sid, "status_init", &tmp); + { + std::lock_guard _lock(this->stateMutex); + this->deviceInitState = tmp; + } + BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): Success connect!"; + BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): API status: " << tmp; + + CP_GetNetwork(sid, "version", &firmware.version); + CP_GetNetwork(sid, "chip_id", &firmware.modemId); + rtrim(firmware.modemId); + CP_GetNetwork(sid, "serial", &firmware.modemSn); + CP_GetNetwork(sid, "mac_eth0", &firmware.macMang); + CP_GetNetwork(sid, "mac_eth1", &firmware.macData); + } struct IntervalUpdate_t { int64_t lastUpdate; @@ -290,6 +313,7 @@ private: modulator_state modState{}; demodulator_state demodState{}; device_state devState{}; + std::string deviceInitState; #ifdef MODEM_IS_SCPC CinC_state cincState{}; #endif @@ -317,10 +341,15 @@ public: TerminalFirmwareVersion firmware; - explicit TerminalApiDaemon(TSID sid): qosEnabled(false), sid(sid), daemon([this]() { this->run(); }) { + explicit TerminalApiDaemon(): deviceInitState("Not connected to API"), qosEnabled(false), sid(0), daemon([this]() { this->run(); }) { this->qosClassesJson = DEFAULT_QOS_CLASSES; } + std::string getDeviceInitState() { + std::shared_lock lock(this->stateMutex); + return this->deviceInitState; + } + #ifdef MODEM_IS_SCPC /** * Получение статистики, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет. @@ -557,23 +586,7 @@ api_driver::ApiDriver::ApiDriver() = default; void api_driver::ApiDriver::startDaemon() { if (daemon == nullptr) { - TSID sid{}; - unsigned int access{}; - for (int connectAttempt = 0; connectAttempt <= 10; connectAttempt++) { - BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): Try to connect api (attempt " << connectAttempt << ")..."; - auto res = CP_Login("admin", "pass", &sid, &access); - if (res != OK) { - boost::this_thread::sleep_for(boost::chrono::duration(boost::chrono::milliseconds(1000))); - } else { - break; - } - } - - CP_GetDmaDebug(sid, "status_init", &deviceInitState); - BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): Success connect!"; - BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): API status: " << deviceInitState; - - daemon = std::make_unique(sid); + daemon = std::make_unique(); BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): API daemon succes started!"; } } @@ -619,7 +632,7 @@ std::string api_driver::ApiDriver::loadTerminalState() const { } std::stringstream result; - result << "{\n\"initState\":" << buildEscapedString(this->deviceInitState); + result << "{\n\"initState\":" << buildEscapedString(daemon->getDeviceInitState()); modulator_state modulator{}; demodulator_state demodulator{}; diff --git a/src/terminal_api_driver.h b/src/terminal_api_driver.h index f2e6b8d..f1e8ae2 100644 --- a/src/terminal_api_driver.h +++ b/src/terminal_api_driver.h @@ -73,7 +73,6 @@ namespace api_driver { ~ApiDriver(); private: - std::string deviceInitState; std::unique_ptr daemon; }; }