фикс работы с синхронизацией потоков
This commit is contained in:
parent
55448c2bfe
commit
4a27a46c27
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user