пофиксил структуру для control system client

This commit is contained in:
Vladislav Ostapov 2025-05-05 18:01:56 +03:00
parent 32983e97b3
commit 8c49af0d6e
2 changed files with 92 additions and 121 deletions

@ -1 +1 @@
Subproject commit 467f8d6bf6f6da11c622949ecb49e3fbff11f372
Subproject commit 0f407a9738d532529ad1dba309a3137891002677

View File

@ -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<double>(modSet.baudrate) / 1000.0));
}
#endif
result << ",\"tx.speedOnTxKbit\":"; writeDouble(result, static_cast<double>(modulator.speed_in_bytes_tx) / 128.0);
result << ",\"tx.speedOnIifKbit\":"; writeDouble(result, (static_cast<double>(modulator.speed_in_bytes_tx_iface) / 128.0));
result << ",\"tx.speedOnTxKbit\":"; writeDouble(result, static_cast<double>(state.mod.speed_in_bytes_tx) / 128.0);
result << ",\"tx.speedOnIifKbit\":"; writeDouble(result, (static_cast<double>(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<double>(demodulator.speed_in_bytes_rx) / 128.0);
result << ",\"rx.speedOnIifKbit\":"; writeDouble(result, static_cast<double>(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<double>(state.demod.speed_in_bytes_rx) / 128.0);
result << ",\"rx.speedOnIifKbit\":"; writeDouble(result, static_cast<double>(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<void(TSID sid)>& 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