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

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{};
demodulator_state demodulator{};
device_state device{};
CinC_state cinc{};
std::lock_guard lock(this->cpApiMutex);
CP_GetModulatorState(sid, modulator);
CP_GetDemodulatorState(sid, demodulator);
CP_GetDeviceState(sid, device);
bool isCinC = getIsCinC();
if (isCinC) {
CP_GetCinCState(sid, cinc);
}
{
std::lock_guard lock2(this->stateMutex);
this->modState = modulator;
this->demodState = demodulator;
this->devState = device;
this->cincState = cinc;
}
}
@ -230,10 +236,10 @@ private:
// обновление статистики
{.lastUpdate = 0, .periodMs = CACHE_STATISTICS_UPDATE_MS, .callback = [this]() {
try {
this->updateStatistics();
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateStatistics(): success update!";
this->updateState();
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateState(): success update!";
} 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{};
demodulator_state demodState{};
device_state devState{};
CinC_state cincState{};
std::shared_mutex settingsMutex;
modulator_settings modSettings{};
@ -311,7 +318,7 @@ public:
TSID sid;
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;
}
@ -320,13 +327,15 @@ public:
* @param mod статистика модулятра
* @param demod статистика демодулятора
* @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) {
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; }
}
}
@ -344,19 +353,24 @@ public:
}
}
bool getIsCinC() {
std::shared_lock lock(this->settingsMutex);
return modSettings.is_cinc;
}
void getNetworkSettings(TerminalNetworkSettings& dest) {
std::shared_lock lock(this->networkSettingsMutex);
dest = this->networkSettings;
}
void getQosSettings(bool& isEnabled, std::string& json) {
std::shared_lock lock(this->settingsMutex);
std::shared_lock lock(this->qosSettingsMutex);
isEnabled = this->qosEnabled;
json = this->qosClassesJson;
}
void getFirmwareVersion(TerminalFirmwareVersion& fw) {
std::shared_lock lock(this->settingsMutex);
std::lock_guard lock2(this->firmwareMutex);
fw = this->firmware;
}
@ -495,13 +509,16 @@ public:
api_driver::ApiDriver::ApiDriver() {
CP_Login("admin", "pass", &sid, &access);
CP_GetDmaDebug(sid, "status_init", &deviceInitState);
}
void api_driver::ApiDriver::startDaemon() {
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!";
}
}
@ -551,8 +568,9 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
modulator_state modulator{};
demodulator_state demodulator{};
device_state device{};
daemon->getStatistics(&modulator, &demodulator, &device);
const bool isCinC = this->getIsCinC();
CinC_state cinc{};
daemon->getState(&modulator, &demodulator, &device, &cinc);
const bool isCinC = this->daemon->getIsCinC();
result << ",\"isCinC\":" << boolAsStr(isCinC);
@ -612,11 +630,8 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
// формируем структуру для CinC
if (isCinC) {
CinC_state state_cinc{};
CP_GetCinCState(sid,state_cinc);
if (modulator.is_tx_on) {
if (state_cinc.carrier_lock) {
if (cinc.carrier_lock) {
result << R"(,"cinc.correlator":true)";
} else {
result << R"(,"cinc.correlator":false)";
@ -625,11 +640,11 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
result << R"(,"cinc.correlator":null)";
}
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;
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;
} else {
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;

View File

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