переход на получение статистики устройства новым API библиотеки control_system_client

This commit is contained in:
2024-11-05 16:06:16 +03:00
parent 5bfc5cebaf
commit 541b08a40e
12 changed files with 855 additions and 181 deletions

View File

@@ -253,8 +253,13 @@ int main(int argc, char *argv[]) {
BOOST_LOG_TRIVIAL(info) << "Starting RELEASE build" << argv[0];
#endif
#ifdef USE_DEBUG
http::auth::jwt::secretKey = "^}u'ZKyQ%;+:lnh^GS7!=G~nRK?7[{``";
BOOST_LOG_TRIVIAL(info) << "DEBUG build use pre-created key " << http::auth::jwt::secretKey;
#else
http::auth::jwt::generateSecretKey();
BOOST_LOG_TRIVIAL(info) << "Generated new secret key " << http::auth::jwt::secretKey;
#endif
ServerResources resources;

View File

@@ -1,4 +1,7 @@
#include "terminal_api_driver.h"
#include <algorithm>
#include "terminal_api/ControlProtoCInterface.h"
#include <sstream>
#include <cmath>
@@ -35,202 +38,124 @@ timer_->timeout().connect([=]{
api_driver::ApiDriver::ApiDriver() {
CP_Login("admin", "pass", &sid, &access);
}
static bool DriverCP_GetLevelDemod(TSID sid, const char* param) {
double variable_dbl = 0;
CP_GetLevelDemod(sid, param, &variable_dbl);
return variable_dbl == 0;
}
static bool DriverCP_GetTxPower(TSID sid) {
double variable_dbl = 0;
CP_GetGain(sid, "TXPWD", &variable_dbl);
return variable_dbl != 0;
}
static bool DriverCp_GetIsCinC(TSID sid) {
uint32_t mode_demod = 0;
CP_GetDemodulatorParams(sid, "mode_demod", &mode_demod);
return mode_demod == 1;
CP_GetDmaDebug(sid, "status_init", &deviceInitState);
}
static const char* boolAsStr(bool value) {
return value ? "true" : "false";
}
static std::string buildEscapedString(const std::string& source) {
std::string str(source);
size_t start_pos = 0;
while((start_pos = str.find('\"', start_pos)) != std::string::npos) {
str.replace(start_pos, 1, "\\\"");
start_pos += 2;
}
return "\"" + str + "\"";
}
static bool DriverCP_GetCinC(TSID sid) {
modulator_settings s{};
CP_GetModulatorSettings(sid, s);
return s.is_cinc;
}
std::string api_driver::ApiDriver::loadTerminalState() {
std::stringstream result;
result << "{";
result << "{\"initState\":" << buildEscapedString(this->deviceInitState);
const auto txEnable = DriverCP_GetTxPower(sid);
const auto isCinC = DriverCp_GetIsCinC(sid);
result << "\"isCinC\":" << boolAsStr(isCinC);
modulator_state modulator{};
CP_GetModulatorState(sid, modulator);
demodulator_state demodulator{};
CP_GetDemodulatorState(sid, demodulator);
CinC_state state_cinc{};
CP_GetCinCState(sid,state_cinc);
device_state device{};
CP_GetDeviceState(sid, device);
const bool isCinC = DriverCP_GetCinC(sid);
result << ",\"isCinC\":" << boolAsStr(isCinC);
// формируем структуру для TX
{
result << ",\"tx.state\":" << boolAsStr(txEnable);
result << ",\"tx.state\":" << boolAsStr(modulator.is_tx_on);
result.precision(2); result << ",\"tx.modcod\":" << modulator.snr_remote;
double tmp = 0;
char tmpStr[32];
CP_GetLevelDemod(sid, "snr_acm", &tmp);
sprintf(tmpStr, "%.2f", tmp);
result << ",\"tx.snr\":" << tmpStr;
CP_GetLevelDemod(sid, "modcod_tx", &tmp);
result << ",\"tx.modcod\":" << (static_cast<uint32_t>(tmp) >> 2);
if (static_cast<uint8_t>(tmp) & 0b00000010) {
result << R"(,"tx.frameSize":"short")";
} else {
result << R"(,"tx.frameSize":"normal")";
}
if (static_cast<uint8_t>(tmp) & 0b00000001) {
result << R"(,"tx.pilots":"pilots")";
} else {
result << R"(,"tx.pilots":"no pilots")";
}
std::string speed;
CP_GetDmaDebug(sid, "speed_tx", &speed);
sprintf(tmpStr, "%.3f", std::atof(speed.c_str()) / 128.0);
result << ",\"tx.speedOnTxKbit\":" << tmpStr;
CP_GetDmaDebug(sid, "speed_tx_iface", &speed);
sprintf(tmpStr, "%.3f", std::atof(speed.c_str()) / 128.0);
result << ",\"tx.speedOnIifKbit\":" << tmpStr;
if (modulator.is_short) {
result << R"(,"tx.frameSize":"short")";
} else {
result << R"(,"tx.frameSize":"normal")";
}
if (modulator.is_pilots) {
result << R"(,"tx.pilots":"pilots")";
} else {
result << R"(,"tx.pilots":"no pilots")";
}
result.precision(2); result << ",\"tx.speedOnTxKbit\":" << static_cast<double>(modulator.speed_in_bytes_tx) / 128.0;
result.precision(2); result << ",\"tx.speedOnIifKbit\":" << (static_cast<double>(modulator.speed_in_bytes_tx_iface) / 128.0);
// формируем структуру для RX
{
const auto sym_sync_lock = DriverCP_GetLevelDemod(sid, "sym_sync_lock"); // захват символьной
const auto freq_search_lock = DriverCP_GetLevelDemod(sid, "freq_lock"); // Захват поиска по частоте
const auto afc_lock = DriverCP_GetLevelDemod(sid, "afc_lock"); // захват ФАПЧ
const auto pkt_sync = DriverCP_GetLevelDemod(sid, "pkt_sync"); // захват пакетной синхронизации
const auto receive_active = sym_sync_lock && freq_search_lock && afc_lock && pkt_sync;
result << ",\"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 << ",\"rx.state\":" << boolAsStr(receive_active);
result << ",\"rx.sym_sync_lock\":" << boolAsStr(sym_sync_lock);
result << ",\"rx.freq_search_lock\":" << boolAsStr(freq_search_lock);
result << ",\"rx.afc_lock\":" << boolAsStr(afc_lock);
result << ",\"rx.pkt_sync\":" << boolAsStr(pkt_sync);
result.precision(2); result << ",\"rx.snr\":" << demodulator.snr;
result.precision(2); result << ",\"rx.rssi\":" << demodulator.rssi;
result << ",\"rx.modcod\":" << demodulator.modcod;
double tmpd = 0; uint32_t tmpu32 = 0;
char tmpStr[32];
CP_GetLevelDemod(sid, "snr", &tmpd);
sprintf(tmpStr, "%.2f", tmpd);
result << ",\"rx.snr\":" << tmpStr;
CP_GetLevelDemod(sid, "rssi", &tmpd);
sprintf(tmpStr, "%.2f", -tmpd);
result << ",\"rx.rssi\":" << tmpStr;
CP_GetDemodulatorParams(sid, "modcod", &tmpu32);
result << ",\"rx.modcod\":" << tmpu32;
CP_GetDemodulatorParams(sid, "type_pack", &tmpu32);
if (tmpu32) {
result << R"(,"rx.frameSize":"short")";
} else {
result << R"(,"rx.frameSize":"normal")";
}
CP_GetDemodulatorParams(sid, "is_pilots", &tmpu32);
if (tmpu32) {
result << R"(,"rx.pilots":"pilots")";
} else {
result << R"(,"rx.pilots":"no pilots")";
}
CP_GetLevelDemod(sid, "sym_err", &tmpd);
sprintf(tmpStr, "%.2f", tmpd);
result << ",\"rx.symError\":" << tmpStr;
CP_GetLevelDemod(sid, "crs_freq_err", &tmpd); // freqErr
sprintf(tmpStr, "%.2f", tmpd);
result << ",\"rx.freqErr\":" << tmpStr;
CP_GetLevelDemod(sid, "fine_freq_err", &tmpd); // freqErrAcc
sprintf(tmpStr, "%.2f", tmpd);
result << ",\"rx.freqErrAcc\":" << tmpStr;
CP_GetModulatorParams(sid, "if_overload", &tmpu32); // inputSignalLevel
result << ",\"rx.inputSignalLevel\":" << tmpStr;
CP_GetLevelDemod(sid, "afc_err", &tmpd); // PLL
sprintf(tmpStr, "%.2f", tmpd);
result << ",\"rx.pllError\":" << tmpStr;
std::string speed;
CP_GetDmaDebug(sid, "speed_rx", &speed);
sprintf(tmpStr, "%.3f", std::atof(speed.c_str()) / 128.0);
result << ",\"rx.speedOnRxKbit\":" << tmpStr;
speed.clear(); CP_GetDmaDebug(sid, "speed_rx_iface", &speed);
sprintf(tmpStr, "%.3f", std::atof(speed.c_str()) / 128.0);
result << ",\"rx.speedOnIifKbit\":" << tmpStr;
speed.clear(); CP_GetDmaDebug(sid, "packet_ok_rx", &speed);
result << ",\"rx.packetsOk\":" << std::atoi(speed.c_str());
speed.clear(); CP_GetDmaDebug(sid, "drop_bad_rx", &speed);
result << ",\"rx.packetsBad\":" << std::atoi(speed.c_str());
CP_GetDemodulatorParams(sid, "dummy_cnt", &tmpu32);
result << ",\"rx.packetsDummy\":" << tmpu32;
if (demodulator.is_short) {
result << R"(,"rx.frameSize":"short")";
} else {
result << R"(,"rx.frameSize":"normal")";
}
if (demodulator.is_pilots) {
result << R"(,"rx.pilots":"pilots")";
} else {
result << R"(,"rx.pilots":"no pilots")";
}
result.precision(2); result << ",\"rx.symError\":" << demodulator.sym_err;
result.precision(2); result << ",\"rx.freqErr\":" << demodulator.crs_freq_err;
result.precision(2); result << ",\"rx.freqErrAcc\":" << demodulator.fine_freq_err;
result.precision(2); result << ",\"rx.inputSignalLevel\":" << demodulator.if_overload;
result.precision(2); result << ",\"rx.pllError\":" << demodulator.afc_err;
result.precision(2); result << ",\"rx.speedOnRxKbit\":" << (static_cast<double>(demodulator.speed_in_bytes_rx) / 128.0);
result.precision(2); result << ",\"rx.speedOnIifKbit\":" << (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;
// формируем структуру для CinC
{
std::string tmps;
char tmpbuff[32];
CP_GetDmaDebug(sid, "ratio_signal_signal", &tmps);
sprintf(tmpbuff, "%.3f", std::atof(tmps.c_str()));
result << ",\"cinc.occ\":" << tmpbuff;
result.precision(3); result << ",\"cinc.occ\":" << state_cinc.ratio_signal_signal;
const bool carrierOk = DriverCP_GetLevelDemod(sid, "carrier_lock");
if (isCinC && txEnable) {
if (carrierOk) {
result << R"(,"cinc.correlator":true)";
} else {
result << R"(,"cinc.correlator":false)";
}
if (isCinC && modulator.is_tx_on) {
if (state_cinc.carrier_lock) {
result << R"(,"cinc.correlator":true)";
} else {
result << R"(,"cinc.correlator":null)";
result << R"(,"cinc.correlator":false)";
}
uint32_t tmpu32 = 0;
CP_GetDemodulatorParams(sid, "cnt_bad_lock_cinc", &tmpu32);
result << ",\"cinc.correlatorFails\":" << tmpu32;
tmps.clear(); CP_GetDmaDebug(sid, "freq_error_offset", &tmps);
// тут так сделано из-за приколов со знаками...
result << ",\"cinc.freqErr\":" << std::to_string(static_cast<int32_t>(std::atol(tmps.c_str())));
tmps.clear(); CP_GetDmaDebug(sid, "freq_fine_estimate", &tmps);
result << ",\"cinc.freqErrAcc\":" << tmps;
tmps.clear(); CP_GetDmaDebug(sid, "delay_dpdi", &tmps);
result << ",\"cinc.channelDelay\":" << std::to_string(static_cast<uint32_t>(std::round(std::atof(tmps.c_str()) * 1000)));
} else {
result << R"(,"cinc.correlator":null)";
}
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;
// структура температур девайса
{
char tmp[32];
double tmp_adrv_c = 0;
double tmp_ps = 0;
double tmp_pl = 0;
CP_ZynqParams(sid,"adrv-c_temper_celsius", &tmp_adrv_c);
CP_ZynqParams(sid,"pl_temper_celsius", &tmp_pl);
CP_ZynqParams(sid,"ps_temper_celsius", &tmp_ps);
sprintf(tmp, "%.1f", tmp_adrv_c / 1000); result << ",\"device.adrv\":" << tmp;
sprintf(tmp, "%.1f", tmp_pl / 1000); result << ",\"device.fpga\":" << tmp;
sprintf(tmp, "%.1f", tmp_ps / 1000); result << ",\"device.zync\":" << tmp;
}
result.precision(3); result << ",\"device.adrv\":" << device.adrv_temp;
result.precision(3); result << ",\"device.fpga\":" << device.pl_temp;
result.precision(3); result << ",\"device.zync\":" << device.zynq_temp;
result << "}";
@@ -244,6 +169,52 @@ void api_driver::ApiDriver::resetPacketStatistics() const {
}
std::string api_driver::ApiDriver::loadSettings() {
// modulator_settings modSettings{};
// CP_GetModulatorSettings(sid, modSettings);
//
// modSettings.baudrate = 2000000;
// modSettings.central_freq_in_kGz = 1340000.24;
// modSettings.rollof = 0.25;
// modSettings.tx_is_on = true;
// modSettings.is_test_data = false;
// modSettings.is_save_current_state = true;
// modSettings.is_cinc = false;
// modSettings.is_carrier = true;
// CP_SetModulatorSettings(sid, modSettings);
// demodulator_settings demodulator_sett;
// demodulator_sett.baudrate = 1340000;
// demodulator_sett.central_freq_in_kGz = 2400000.34;
// demodulator_sett.is_rvt_iq = true;
// demodulator_sett.is_aru_on = true;
// demodulator_sett.gain = 13;
// demodulator_sett.rollof = 0.15;
// if(CP_SetDemodulatorSettings(sid, demodulator_sett)== OK)
// {
// std::cout << "OK SET DEMODULATOR SETTINGS" << std::endl;
// }
// demodulator_settings demodulator_settings_;
// if(CP_GetDemodulatorSettings(sid,demodulator_settings_) == OK)
// {
// std::cout << "OK GET DEMODULATOR SETTINGS" << std::endl;
// std::cout << demodulator_settings_.baudrate << std::endl;
// std::cout << demodulator_settings_.gain<< std::endl;
// std::cout << demodulator_settings_.rollof << std::endl;
// std::cout << demodulator_settings_.is_aru_on << std::endl;
// std::cout << demodulator_settings_.is_rvt_iq << std::endl;
// std::cout << demodulator_settings_.central_freq_in_kGz << std::endl;
// }
// modulator_settings modulator_settings_;
// if(CP_GetModulatorSettings(sid,modulator_settings_)== OK)
// {
// std::cout << "OK GET MODULATOR SETTINGS" << std::endl;
// std::cout << modulator_settings_.baudrate << std::endl;
// std::cout << modulator_settings_.attenuation << std::endl;
// std::cout << modulator_settings_.central_freq_in_kGz << std::endl;
// std::cout << modulator_settings_.is_carrier << std::endl;
// std::cout << modulator_settings_.is_cinc << std::endl;
// std::cout << modulator_settings_.rollof << std::endl;
// }
return "{}";
}

View File

@@ -32,6 +32,7 @@ namespace api_driver {
TSID sid{0};
unsigned int access{0};
std::string deviceInitState;
};
}