diff --git a/dependencies/control_system_client b/dependencies/control_system_client index 467f8d6..0f407a9 160000 --- a/dependencies/control_system_client +++ b/dependencies/control_system_client @@ -1 +1 @@ -Subproject commit 467f8d6bf6f6da11c622949ecb49e3fbff11f372 +Subproject commit 0f407a9738d532529ad1dba309a3137891002677 diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index ec32d8a..980219b 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -97,6 +97,25 @@ public: } }; +class TerminalDeviceState { +public: + double adrv_temp{}, pl_temp{}, zynq_temp{}; + +#ifdef MODEM_IS_TDMA + DOWNLOAD_STATUS otaStatus{}; // Downloading Status + unsigned int otaPercent{}; // % downloaded data + std::string otaImage{}; // Name of downloading image file +#endif + + modulator_state mod{}; + demodulator_state demod{}; +#ifdef MODEM_IS_SCPC + debug_metrics debug{}; + CinC_state cinc{}; +#endif + +}; + class TerminalFirmwareVersion { public: std::string version, modemId, modemSn, macMang, macData; @@ -255,36 +274,44 @@ private: } void updateState() { - modulator_state modulator{}; - demodulator_state demodulator{}; -#ifdef MODEM_IS_SCPC - CinC_state cinc{}; -#endif + TerminalDeviceState s; std::lock_guard lock(this->cpApiMutex); - logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetModulatorState()", CP_GetModulatorState(sid, modulator)); - logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDemodulatorState()", CP_GetDemodulatorState(sid, demodulator)); + logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetModulatorState()", CP_GetModulatorState(sid, s.mod)); + logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDemodulatorState()", CP_GetDemodulatorState(sid, s.demod)); #ifdef MODEM_IS_TDMA std::string tmpDevState; logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDmaDebug(status_init)", CP_GetDmaDebug(sid, "status_init", &tmpDevState)); #endif + { + device_state ds{}; + logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDeviceState()", CP_GetDeviceState(sid, ds)); + s.adrv_temp = ds.adrv_temp; + s.pl_temp = ds.pl_temp; + s.zynq_temp = ds.zynq_temp; + } +#ifdef MODEM_IS_TDMA + { + progress_msg ds{}; + logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetUpdateStatus()", CP_GetUpdateStatus(sid, ds)); + s.otaStatus = ds.status; + s.otaPercent = ds.dwl_percent; + s.otaImage = ds.cur_image; + } +#endif #ifdef MODEM_IS_SCPC bool isCinC = getIsCinC(); if (isCinC) { - logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetCinCState()", CP_GetCinCState(sid, cinc)); + logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetCinCState()", CP_GetCinCState(sid, s.cinc)); } #endif { std::lock_guard lock2(this->stateMutex); - this->modState = modulator; - this->demodState = demodulator; + this->state = s; #ifdef MODEM_IS_TDMA this->deviceInitState = tmpDevState; -#endif -#ifdef MODEM_IS_SCPC - this->cincState = cinc; #endif } } @@ -321,16 +348,6 @@ private: } } - void updateDeviceState() { - device_state device{}; - std::lock_guard lock(this->cpApiMutex); - logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDeviceState()", CP_GetDeviceState(sid, device)); - { - std::lock_guard lock2(this->stateMutex); - this->devState = device; - } - } - void unsafeLoadNetworkSettings(TerminalNetworkSettings& s) { s.loadDefaults(); logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &s.managementIp)); @@ -466,9 +483,9 @@ private: { std::lock_guard _alock(this->cpApiMutex); std::lock_guard _slock(this->stateMutex); - logCpApiError("api_driver::TerminalApiDaemon->statsLogs.putItem()->CP_GetDebugMetrics()", CP_GetDebugMetrics(sid, debugMetrics)); + logCpApiError("api_driver::TerminalApiDaemon->statsLogs.putItem()->CP_GetDebugMetrics()", CP_GetDebugMetrics(sid, state.debug)); } - this->statsLogs.putItem(debugMetrics); + this->statsLogs.putItem(state.debug); BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon->statsLogs.putItem(): success write statistics state to log!"; } catch (std::exception& e) { BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon->statsLogs.putItem() failed to log: " << e.what(); @@ -484,15 +501,6 @@ private: BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateState(): " << e.what(); } }}, - // обновление состояния устройства (обновления, температура) - {.lastUpdate = 0, .periodMs = CACHE_DEV_STATE_UPDATE_MS, .callback = [this]() { - try { - this->updateDeviceState(); - BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateDeviceState(): success update!"; - } catch (std::exception& e) { - BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateDeviceState(): " << e.what(); - } - }}, // обновление кеша настроек {.lastUpdate = 0, .periodMs = CACHE_SETTINGS_UPDATE_MS, .callback = [this]() { try { @@ -555,14 +563,8 @@ private: } std::shared_mutex stateMutex; - modulator_state modState{}; - demodulator_state demodState{}; - device_state devState{}; std::string deviceInitState; -#ifdef MODEM_IS_SCPC - debug_metrics debugMetrics{}; - CinC_state cincState{}; -#endif + TerminalDeviceState state; std::shared_mutex settingsMutex; modulator_settings modSettings{}; @@ -601,40 +603,17 @@ public: return this->deviceInitState; } -#ifdef MODEM_IS_SCPC /** * Получение статистики, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет. - * @param mod статистика модулятра - * @param demod статистика демодулятора - * @param dev статистика устройства (температуры) - * @param cinc статистика CinC (актуальна только для режима CinC, но в любом случае будет перезаписана) */ - void getState(modulator_state* mod, demodulator_state* demod, device_state* dev, CinC_state* cinc) { - if (mod != nullptr || demod != nullptr || dev != nullptr) { + TerminalDeviceState getState() { + TerminalDeviceState s; + { std::shared_lock lock(this->stateMutex); - if (mod) { *mod = this->modState; } - if (demod) { *demod = this->demodState; } - if (dev) { *dev = this->devState; } - if (cinc) { *cinc = this->cincState; } + s = this->state; } + return s; } -#else - /** - * Получение статистики, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет. - * @param mod статистика модулятра - * @param demod статистика демодулятора - * @param dev статистика устройства (температуры) - */ - void getState(modulator_state* mod, demodulator_state* demod, device_state* dev) { - if (mod != nullptr || demod != nullptr || dev != nullptr) { - std::shared_lock lock(this->stateMutex); - if (mod) { *mod = this->modState; } - if (demod) { *demod = this->demodState; } - if (dev) { *dev = this->devState; } - } - } -#endif - /** * Получение настроек, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет. */ @@ -871,15 +850,9 @@ std::string api_driver::ApiDriver::loadTerminalState() const { result << "{\n\"initState\":" << buildEscapedString(daemon->getDeviceInitState()); result << ",\n\"testState\":" << boolAsStr(daemon->isTest()); - modulator_state modulator{}; - demodulator_state demodulator{}; - device_state device{}; + auto state = daemon->getState(); #ifdef MODEM_IS_SCPC - CinC_state cinc{}; - daemon->getState(&modulator, &demodulator, &device, &cinc); const bool isCinC = this->daemon->getIsCinC(); -#else - daemon->getState(&modulator, &demodulator, &device); #endif #ifdef MODEM_IS_SCPC @@ -887,15 +860,15 @@ std::string api_driver::ApiDriver::loadTerminalState() const { #endif // формируем структуру для TX - result << ",\n\"tx.state\":" << boolAsStr(modulator.is_tx_on); - result << ",\"tx.modcod\":" << modulator.modcod; + result << ",\n\"tx.state\":" << boolAsStr(state.mod.is_tx_on); + result << ",\"tx.modcod\":" << state.mod.modcod; #ifdef MODEM_IS_SCPC - result << ",\"tx.snr\":"; writeDouble(result, modulator.snr_remote); + result << ",\"tx.snr\":"; writeDouble(result, state.mod.snr_remote); - if (modulator.is_short) { result << R"(,"tx.frameSizeNormal":false)"; } + if (state.mod.is_short) { result << R"(,"tx.frameSizeNormal":false)"; } else { result << R"(,"tx.frameSizeNormal":true)"; } - if (modulator.is_pilots) { result << R"(,"tx.isPilots":true)"; } + if (state.mod.is_pilots) { result << R"(,"tx.isPilots":true)"; } else { result << R"(,"tx.isPilots":false)"; } #else { @@ -905,48 +878,48 @@ std::string api_driver::ApiDriver::loadTerminalState() const { result << ",\"tx.symSpeed\":"; writeDouble(result, (static_cast(modSet.baudrate) / 1000.0)); } #endif - result << ",\"tx.speedOnTxKbit\":"; writeDouble(result, static_cast(modulator.speed_in_bytes_tx) / 128.0); - result << ",\"tx.speedOnIifKbit\":"; writeDouble(result, (static_cast(modulator.speed_in_bytes_tx_iface) / 128.0)); + result << ",\"tx.speedOnTxKbit\":"; writeDouble(result, static_cast(state.mod.speed_in_bytes_tx) / 128.0); + result << ",\"tx.speedOnIifKbit\":"; writeDouble(result, (static_cast(state.mod.speed_in_bytes_tx_iface) / 128.0)); // формируем структуру для RX - result << ",\n\"rx.state\":" << boolAsStr(demodulator.locks.sym_sync_lock && demodulator.locks.freq_lock && demodulator.locks.afc_lock && demodulator.locks.pkt_sync); - result << ",\"rx.sym_sync_lock\":" << boolAsStr(demodulator.locks.sym_sync_lock); - result << ",\"rx.freq_search_lock\":" << boolAsStr(demodulator.locks.freq_lock); - result << ",\"rx.afc_lock\":" << boolAsStr(demodulator.locks.afc_lock); - result << ",\"rx.pkt_sync\":" << boolAsStr(demodulator.locks.pkt_sync); + result << ",\n\"rx.state\":" << boolAsStr(state.demod.locks.sym_sync_lock && state.demod.locks.freq_lock && state.demod.locks.afc_lock && state.demod.locks.pkt_sync); + result << ",\"rx.sym_sync_lock\":" << boolAsStr(state.demod.locks.sym_sync_lock); + result << ",\"rx.freq_search_lock\":" << boolAsStr(state.demod.locks.freq_lock); + result << ",\"rx.afc_lock\":" << boolAsStr(state.demod.locks.afc_lock); + result << ",\"rx.pkt_sync\":" << boolAsStr(state.demod.locks.pkt_sync); - result << ",\"rx.snr\":"; writeDouble(result, demodulator.snr); - result << ",\"rx.rssi\":"; writeDouble(result, demodulator.rssi); - result << ",\"rx.modcod\":" << demodulator.modcod; + result << ",\"rx.snr\":"; writeDouble(result, state.demod.snr); + result << ",\"rx.rssi\":"; writeDouble(result, state.demod.rssi); + result << ",\"rx.modcod\":" << state.demod.modcod; - if (demodulator.is_short) { + if (state.demod.is_short) { result << R"(,"rx.frameSizeNormal":false)"; } else { result << R"(,"rx.frameSizeNormal":true)"; } - if (demodulator.is_pilots) { + if (state.demod.is_pilots) { result << R"(,"rx.isPilots":true)"; } else { result << R"(,"rx.isPilots":false)"; } - result << ",\n\"rx.symError\":"; writeDouble(result, demodulator.sym_err); - result << ",\"rx.freqErr\":"; writeDouble(result, demodulator.crs_freq_err); - result << ",\"rx.freqErrAcc\":"; writeDouble(result, demodulator.fine_freq_err); - result << ",\"rx.inputSignalLevel\":"; writeDouble(result, demodulator.if_overload); - result << ",\"rx.pllError\":"; writeDouble(result, demodulator.afc_err); - result << ",\"rx.speedOnRxKbit\":"; writeDouble(result, static_cast(demodulator.speed_in_bytes_rx) / 128.0); - result << ",\"rx.speedOnIifKbit\":"; writeDouble(result, static_cast(demodulator.speed_in_bytes_rx_iface) / 128.0); - result << ",\"rx.packetsOk\":" << demodulator.packet_ok_cnt; - result << ",\"rx.packetsBad\":" << demodulator.packet_bad_cnt; - result << ",\"rx.packetsDummy\":" << demodulator.dummy_cnt; + result << ",\n\"rx.symError\":"; writeDouble(result, state.demod.sym_err); + result << ",\"rx.freqErr\":"; writeDouble(result, state.demod.crs_freq_err); + result << ",\"rx.freqErrAcc\":"; writeDouble(result, state.demod.fine_freq_err); + result << ",\"rx.inputSignalLevel\":"; writeDouble(result, state.demod.if_overload); + result << ",\"rx.pllError\":"; writeDouble(result, state.demod.afc_err); + result << ",\"rx.speedOnRxKbit\":"; writeDouble(result, static_cast(state.demod.speed_in_bytes_rx) / 128.0); + result << ",\"rx.speedOnIifKbit\":"; writeDouble(result, static_cast(state.demod.speed_in_bytes_rx_iface) / 128.0); + result << ",\"rx.packetsOk\":" << state.demod.packet_ok_cnt; + result << ",\"rx.packetsBad\":" << state.demod.packet_bad_cnt; + result << ",\"rx.packetsDummy\":" << state.demod.dummy_cnt; #ifdef MODEM_IS_SCPC // формируем структуру для CinC if (isCinC) { - if (modulator.is_tx_on) { - if (cinc.carrier_lock) { + if (state.mod.is_tx_on) { + if (state.cinc.carrier_lock) { result << R"(,"cinc.correlator":true)"; } else { result << R"(,"cinc.correlator":false)"; @@ -955,26 +928,26 @@ std::string api_driver::ApiDriver::loadTerminalState() const { result << R"(,"cinc.correlator":null)"; } - result << ",\n\"cinc.occ\":"; writeDouble(result, cinc.ratio_signal_signal, 3); - result << ",\"cinc.correlatorFails\":" << cinc.cnt_bad_lock; - result << ",\"cinc.freqErr\":" << cinc.freq_error_offset; - result << ",\"cinc.freqErrAcc\":" << cinc.freq_fine_estimate; - result << ",\"cinc.channelDelay\":" << cinc.delay_dpdi; + result << ",\n\"cinc.occ\":"; writeDouble(result, state.cinc.ratio_signal_signal, 3); + result << ",\"cinc.correlatorFails\":" << state.cinc.cnt_bad_lock; + result << ",\"cinc.freqErr\":" << state.cinc.freq_error_offset; + result << ",\"cinc.freqErrAcc\":" << state.cinc.freq_fine_estimate; + result << ",\"cinc.channelDelay\":" << state.cinc.delay_dpdi; } else { result << R"(,"cinc.correlator":null)"; } #endif // структура температур девайса - result << ",\n\"device.adrv\":"; writeDouble(result, device.adrv_temp, 1); - result << ",\"device.fpga\":"; writeDouble(result, device.pl_temp, 1); - result << ",\"device.zynq\":"; writeDouble(result, device.zynq_temp, 1); + result << ",\n\"device.adrv\":"; writeDouble(result, state.adrv_temp, 1); + result << ",\"device.fpga\":"; writeDouble(result, state.pl_temp, 1); + result << ",\"device.zynq\":"; writeDouble(result, state.zynq_temp, 1); #ifdef MODEM_IS_TDMA - if (device.cur_image.empty()) { + if (state.otaImage.empty()) { result << R"(, "device.upgradeStatus":"Нет обновлений","device.upgradePercent":0,"device.upgradeImage":"")"; } else { - switch (device.status) { + switch (state.otaStatus) { case NORM_RX_OBJECT_NEW_API: result << ",\n" R"("device.upgradeStatus": "Начало загрузки")"; break; case NORM_RX_OBJECT_INFO_API: result << ",\n" R"("device.upgradeStatus": "Получено имя образа")"; break; case NORM_RX_OBJECT_UPDATED_API: result << ",\n" R"("device.upgradeStatus": "Загружается")"; break; @@ -983,8 +956,8 @@ std::string api_driver::ApiDriver::loadTerminalState() const { default: result << ",\n" R"("device.upgradeStatus": "?")"; } - result << ",\"device.upgradePercent\":" << device.dwl_percent; - result << ",\"device.upgradeImage\":" << buildEscapedString(device.cur_image); + result << ",\"device.upgradePercent\":" << state.otaPercent; + result << ",\"device.upgradeImage\":" << buildEscapedString(state.otaImage); } #endif @@ -1387,9 +1360,7 @@ void api_driver::ApiDriver::executeInApi(const std::function& ca #ifdef MODEM_IS_TDMA std::string api_driver::ApiDriver::getOtaFileLocation() const { - device_state s{}; - daemon->getState(nullptr, nullptr, &s); - return s.cur_image; + return daemon->getState().otaImage; } #endif