фикс работы с синхронизацией потоков

This commit is contained in:
Vladislav Ostapov 2024-11-15 10:55:52 +03:00
parent 55448c2bfe
commit 4a27a46c27
2 changed files with 37 additions and 33 deletions

View File

@ -122,21 +122,27 @@ private:
} }
} }
void updateStatistics() { void updateState() {
modulator_state modulator{}; modulator_state modulator{};
demodulator_state demodulator{}; demodulator_state demodulator{};
device_state device{}; device_state device{};
CinC_state cinc{};
std::lock_guard lock(this->cpApiMutex); std::lock_guard lock(this->cpApiMutex);
CP_GetModulatorState(sid, modulator); CP_GetModulatorState(sid, modulator);
CP_GetDemodulatorState(sid, demodulator); CP_GetDemodulatorState(sid, demodulator);
CP_GetDeviceState(sid, device); CP_GetDeviceState(sid, device);
bool isCinC = getIsCinC();
if (isCinC) {
CP_GetCinCState(sid, cinc);
}
{ {
std::lock_guard lock2(this->stateMutex); std::lock_guard lock2(this->stateMutex);
this->modState = modulator; this->modState = modulator;
this->demodState = demodulator; this->demodState = demodulator;
this->devState = device; this->devState = device;
this->cincState = cinc;
} }
} }
@ -230,10 +236,10 @@ private:
// обновление статистики // обновление статистики
{.lastUpdate = 0, .periodMs = CACHE_STATISTICS_UPDATE_MS, .callback = [this]() { {.lastUpdate = 0, .periodMs = CACHE_STATISTICS_UPDATE_MS, .callback = [this]() {
try { try {
this->updateStatistics(); this->updateState();
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateStatistics(): success update!"; BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateState(): success update!";
} catch (std::exception& e) { } catch (std::exception& e) {
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateStatistics(): " << e.what(); BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateState(): " << e.what();
} }
}}, }},
// обновление кеша настроек // обновление кеша настроек
@ -291,6 +297,7 @@ private:
modulator_state modState{}; modulator_state modState{};
demodulator_state demodState{}; demodulator_state demodState{};
device_state devState{}; device_state devState{};
CinC_state cincState{};
std::shared_mutex settingsMutex; std::shared_mutex settingsMutex;
modulator_settings modSettings{}; modulator_settings modSettings{};
@ -311,7 +318,7 @@ public:
TSID sid; TSID sid;
boost::thread daemon; boost::thread daemon;
explicit TerminalApiDaemon(TSID sid): sid(sid), daemon([this]() { this->run(); }), qosEnabled(false) { explicit TerminalApiDaemon(TSID sid): qosEnabled(false), sid(sid), daemon([this]() { this->run(); }) {
this->qosClassesJson = DEFAULT_QOS_CLASSES; this->qosClassesJson = DEFAULT_QOS_CLASSES;
} }
@ -320,13 +327,15 @@ public:
* @param mod статистика модулятра * @param mod статистика модулятра
* @param demod статистика демодулятора * @param demod статистика демодулятора
* @param dev статистика устройства (температуры) * @param dev статистика устройства (температуры)
* @param cinc статистика CinC (актуальна только для режима CinC, но в любом случае будет перезаписана)
*/ */
void getStatistics(modulator_state* mod, demodulator_state* demod, device_state* dev) { void getState(modulator_state* mod, demodulator_state* demod, device_state* dev, CinC_state* cinc) {
if (mod != nullptr || demod != nullptr || dev != nullptr) { if (mod != nullptr || demod != nullptr || dev != nullptr) {
std::shared_lock lock(this->stateMutex); std::shared_lock lock(this->stateMutex);
if (mod) { *mod = this->modState; } if (mod) { *mod = this->modState; }
if (demod) { *demod = this->demodState; } if (demod) { *demod = this->demodState; }
if (dev) { *dev = this->devState; } if (dev) { *dev = this->devState; }
if (cinc) { *cinc = this->cincState; }
} }
} }
@ -344,19 +353,24 @@ public:
} }
} }
bool getIsCinC() {
std::shared_lock lock(this->settingsMutex);
return modSettings.is_cinc;
}
void getNetworkSettings(TerminalNetworkSettings& dest) { void getNetworkSettings(TerminalNetworkSettings& dest) {
std::shared_lock lock(this->networkSettingsMutex); std::shared_lock lock(this->networkSettingsMutex);
dest = this->networkSettings; dest = this->networkSettings;
} }
void getQosSettings(bool& isEnabled, std::string& json) { void getQosSettings(bool& isEnabled, std::string& json) {
std::shared_lock lock(this->settingsMutex); std::shared_lock lock(this->qosSettingsMutex);
isEnabled = this->qosEnabled; isEnabled = this->qosEnabled;
json = this->qosClassesJson; json = this->qosClassesJson;
} }
void getFirmwareVersion(TerminalFirmwareVersion& fw) { void getFirmwareVersion(TerminalFirmwareVersion& fw) {
std::shared_lock lock(this->settingsMutex); std::lock_guard lock2(this->firmwareMutex);
fw = this->firmware; fw = this->firmware;
} }
@ -495,13 +509,16 @@ public:
api_driver::ApiDriver::ApiDriver() { api_driver::ApiDriver::ApiDriver() {
CP_Login("admin", "pass", &sid, &access);
CP_GetDmaDebug(sid, "status_init", &deviceInitState);
} }
void api_driver::ApiDriver::startDaemon() { void api_driver::ApiDriver::startDaemon() {
if (daemon == nullptr) { if (daemon == nullptr) {
daemon = std::make_unique<TerminalApiDaemon>(this->sid); TSID sid{};
unsigned int access{};
CP_Login("admin", "pass", &sid, &access);
CP_GetDmaDebug(sid, "status_init", &deviceInitState);
daemon = std::make_unique<TerminalApiDaemon>(sid);
BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): API daemon succes started!"; BOOST_LOG_TRIVIAL(info) << "api_driver::ApiDriver::startDaemon(): API daemon succes started!";
} }
} }
@ -551,8 +568,9 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
modulator_state modulator{}; modulator_state modulator{};
demodulator_state demodulator{}; demodulator_state demodulator{};
device_state device{}; device_state device{};
daemon->getStatistics(&modulator, &demodulator, &device); CinC_state cinc{};
const bool isCinC = this->getIsCinC(); daemon->getState(&modulator, &demodulator, &device, &cinc);
const bool isCinC = this->daemon->getIsCinC();
result << ",\"isCinC\":" << boolAsStr(isCinC); result << ",\"isCinC\":" << boolAsStr(isCinC);
@ -612,11 +630,8 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
// формируем структуру для CinC // формируем структуру для CinC
if (isCinC) { if (isCinC) {
CinC_state state_cinc{};
CP_GetCinCState(sid,state_cinc);
if (modulator.is_tx_on) { if (modulator.is_tx_on) {
if (state_cinc.carrier_lock) { if (cinc.carrier_lock) {
result << R"(,"cinc.correlator":true)"; result << R"(,"cinc.correlator":true)";
} else { } else {
result << R"(,"cinc.correlator":false)"; result << R"(,"cinc.correlator":false)";
@ -625,11 +640,11 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
result << R"(,"cinc.correlator":null)"; result << R"(,"cinc.correlator":null)";
} }
result << ",\n\"cinc.occ\":"; writeDouble(result, state_cinc.ratio_signal_signal, 3); result << ",\n\"cinc.occ\":"; writeDouble(result, cinc.ratio_signal_signal, 3);
result << ",\"cinc.correlatorFails\":" << state_cinc.cnt_bad_lock; result << ",\"cinc.correlatorFails\":" << cinc.cnt_bad_lock;
result << ",\"cinc.freqErr\":" << state_cinc.freq_error_offset; result << ",\"cinc.freqErr\":" << cinc.freq_error_offset;
result << ",\"cinc.freqErrAcc\":" << state_cinc.freq_fine_estimate; result << ",\"cinc.freqErrAcc\":" << cinc.freq_fine_estimate;
result << ",\"cinc.channelDelay\":" << state_cinc.delay_dpdi; result << ",\"cinc.channelDelay\":" << cinc.delay_dpdi;
} else { } else {
result << R"(,"cinc.correlator":null)"; result << R"(,"cinc.correlator":null)";
} }
@ -901,10 +916,4 @@ void api_driver::ApiDriver::executeInApi(const std::function<void(TSID sid)>& ca
} }
} }
bool api_driver::ApiDriver::getIsCinC() const {
modulator_settings s{};
daemon->getSettings(&s, nullptr, nullptr, nullptr, nullptr);
return s.is_cinc;
}
api_driver::ApiDriver::~ApiDriver() = default; api_driver::ApiDriver::~ApiDriver() = default;

View File

@ -72,13 +72,8 @@ namespace api_driver {
~ApiDriver(); ~ApiDriver();
private: private:
TSID sid{0};
unsigned int access{0};
std::string deviceInitState; std::string deviceInitState;
std::unique_ptr<TerminalApiDaemon> daemon; std::unique_ptr<TerminalApiDaemon> daemon;
bool getIsCinC() const;
}; };
} }