пофиксил структуру для control system client
This commit is contained in:
parent
32983e97b3
commit
8c49af0d6e
2
dependencies/control_system_client
vendored
2
dependencies/control_system_client
vendored
@ -1 +1 @@
|
||||
Subproject commit 467f8d6bf6f6da11c622949ecb49e3fbff11f372
|
||||
Subproject commit 0f407a9738d532529ad1dba309a3137891002677
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user