diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index a8bbdc1..5d5ce56 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -1,6 +1,7 @@ #include "terminal_api_driver.h" #include "terminal_api/ControlProtoCInterface.h" #include +#include /* timer_->timeout().connect([=]{ @@ -42,12 +43,18 @@ static bool DriverCP_GetLevelDemod(TSID sid, const char* param) { return variable_dbl == 0; } -static bool DriverCP_GetGain(TSID sid, const char* param) { +static bool DriverCP_GetTxPower(TSID sid) { double variable_dbl = 0; - CP_GetGain(sid, param, &variable_dbl); + 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; +} + static const char* boolAsStr(bool value) { return value ? "true" : "false"; } @@ -56,13 +63,16 @@ std::string api_driver::ApiDriver::loadTerminalState() { std::stringstream result; result << "{"; - { - // формируем структуру TX + const auto txEnable = DriverCP_GetTxPower(sid); + const auto isCinC = DriverCp_GetIsCinC(sid); + result << "\"isCinC\":" << boolAsStr(isCinC); - result << "\"tx.state\":" << boolAsStr(DriverCP_GetGain(sid, "TXPWD")); + // формируем структуру для TX + { + result << ",\"tx.state\":" << boolAsStr(txEnable); double tmp = 0; - char tmpStr[64]; + char tmpStr[32]; CP_GetLevelDemod(sid, "snr_acm", &tmp); sprintf(tmpStr, "%.2f", tmp); @@ -93,9 +103,8 @@ std::string api_driver::ApiDriver::loadTerminalState() { result << ",\"tx.speedOnIifKbit\":" << tmpStr; } + // формируем структуру для RX { - // формируем структуру 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"); // захват ФАПЧ @@ -109,36 +118,7 @@ std::string api_driver::ApiDriver::loadTerminalState() { result << ",\"rx.pkt_sync\":" << boolAsStr(pkt_sync); double tmpd = 0; uint32_t tmpu32 = 0; - char tmpStr[64]; - - /* - rx: { - // индикаторы - state: '?', // общее состояние - sym_sync_lock: '?', // захват символьной - freq_search_lock: '?', // Захват поиска по частоте - afc_lock: '?', // захват ФАПЧ - pkt_sync: '?', // захват пакетной синхронизации - - // куча других параметров, идет в том же порядке, что и в таблице - snr: 0, rssi: -105, - modcod: 0, frameSize: 0, - pilots: '?', - symError: 0.0, - freqErr: 0, freqErrAcc: 0, - inputSignalLevel: 0, - pllError: 0, - speedOnRxKbit: 0, - speedOnIifKbit: 0, - - // статистика пакетов - packetsOk: 0, - packetsBad: 0, - packetsDummy: 0, - }, - - testState: '?' - */ + char tmpStr[32]; CP_GetLevelDemod(sid, "snr", &tmpd); sprintf(tmpStr, "%.2f", tmpd); @@ -211,6 +191,64 @@ std::string api_driver::ApiDriver::loadTerminalState() { // }); } + /* + stat_cinc: { + occ: '?', + correlator: '?', + correlatorFails: '?', + freqErr: '?', freqErrAcc: '?', + channelDelay: '?' + }, + */ + + // формируем структуру для 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; + + const bool carrierOk = DriverCP_GetLevelDemod(sid, "carrier_lock"); + if (isCinC && txEnable) { + if (carrierOk) { + result << R"(,"cinc.correlator":true)"; + } else { + result << R"(,"cinc.correlator":false)"; + } + } else { + result << R"(,"cinc.correlator":null)"; + } + + 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(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(std::round(std::atof(tmps.c_str()) * 1000))); + } + + // структура температур девайса + { + 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 << "}"; diff --git a/static/main.html b/static/main.html index 8815859..4ad27b5 100644 --- a/static/main.html +++ b/static/main.html @@ -133,15 +133,15 @@ -
+

Статистика режима CinC

- - - - - + + + + +
ОССindcator
Захват коррелятора bool
Кол-во срывов коррелятораindcator
Грубая/точная част. ошибка, Гцindcator/indicator
Задержка в канале, мсindcator
ОСС{{ stat_cinc.occ }}
Захват коррелятора
Кол-во срывов коррелятора{{ stat_cinc.correlatorFails }}
Грубая/точная част. ошибка, Гц{{ stat_cinc.freqErr }} / {{ stat_cinc.freqErrAcc }}
Задержка в канале, мс{{ stat_cinc.channelDelay }}
@@ -149,9 +149,9 @@

Состояние устройства

- - - + + +
Температура ADRVindcator °C
Температура ZYNCindcator °C
Температура FPGAindcator °C
Температура ADRV{{ stat_device.adrv }} °C
Температура ZYNC{{ stat_device.zync }} °C
Температура FPGA{{ stat_device.fpga }} °C
@@ -214,6 +214,8 @@ const app = new Vue({ el: '#app', data: { + isCinC: null, + stat_rx: { // индикаторы state: '?', // общее состояние @@ -245,7 +247,10 @@ }, stat_cinc: { occ: '?', - + correlator: null, + correlatorFails: '?', + freqErr: '?', freqErrAcc: '?', + channelDelay: '?' }, stat_device: { // температурные датчики adrv: 0, zync: 0, fpga: 0 @@ -258,6 +263,7 @@ methods: { updateMainState(vals) { this.lastUpdateTime = new Date(); + this.isCinC = vals["mainState"]["isCinC"] this.stat_rx.state = vals["mainState"]["rx.state"] this.stat_rx.sym_sync_lock = vals["mainState"]["rx.sym_sync_lock"] @@ -288,6 +294,17 @@ this.stat_tx.speedOnTxKbit = vals["mainState"]["tx.speedOnTxKbit"] this.stat_tx.speedOnIifKbit = vals["mainState"]["rx.speedOnIifKbit"] + this.stat_cinc.occ = vals["mainState"]["cinc.occ"] + this.stat_cinc.correlator = vals["mainState"]["cinc.correlator"] + this.stat_cinc.correlatorFails = vals["mainState"]["cinc.correlatorFails"] + this.stat_cinc.freqErr = vals["mainState"]["cinc.freqErr"] + this.stat_cinc.freqErrAcc = vals["mainState"]["cinc.freqErrAcc"] + this.stat_cinc.channelDelay = vals["mainState"]["cinc.channelDelay"] + + this.stat_device.adrv = vals["mainState"]["device.adrv"] + this.stat_device.zync = vals["mainState"]["device.zync"] + this.stat_device.fpga = vals["mainState"]["device.fpga"] + this.testState = vals["mainState"]["testState"] } }, @@ -295,11 +312,13 @@ const doFetch = async () => { let d = await fetch("/api/mainStatistics") this.updateMainState(await d.json()) + + setTimeout(() => { + doFetch() + }, 1000) } - doFetch().then(() => { - setInterval(() => { doFetch().then(() => {}) }, 1000); - }); + doFetch().then(() => {}) document.getElementById("app").removeAttribute("hidden") }