diff --git a/front-generator/render-params.json b/front-generator/render-params.json
index 7edd28b..c9b7162 100644
--- a/front-generator/render-params.json
+++ b/front-generator/render-params.json
@@ -39,7 +39,7 @@
{"widget": "number", "label": "Ручное усиление, дБ", "name": "rxManualGain", "v_show": "!paramRxtx.rxAgcEn", "min": -40},
{"widget": "checkbox", "label": "Инверсия спектра", "name": "rxSpectrumInversion"},
{"widget": "number-int", "label": "Центральная частота, КГц", "name": "rxCentralFreq", "min": 900000, "step": 0.01},
- {"widget": "number-int", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 0, "step": 1},
+ {"widget": "number-int", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 200000, "max": 54000000, "step": 1},
{
"widget": "select", "label": "Roll-off", "name": "rxRolloff",
"values": [{"label": "0.02", "value": "2"}, {"label": "0.05", "value": "5"}, {"label": "0.10", "value": "10"}, {"label": "0.15", "value": "15"}, {"label": "0.20", "value": "20"}, {"label": "0.25", "value": "25"}]
diff --git a/front-generator/template/common/monitoring-data.js.j2 b/front-generator/template/common/monitoring-data.js.j2
index 87777fe..65a6c48 100644
--- a/front-generator/template/common/monitoring-data.js.j2
+++ b/front-generator/template/common/monitoring-data.js.j2
@@ -26,9 +26,9 @@
// прочие поля
{% if modem == 'scpc' %}
- snr: '?', modcod: '?', frameSizeNormal: '?', isPilots: '?', speedOnTxKbit: '?', speedOnIifKbit: '?',
+ snr: '?', modcod: '?', frameSizeNormal: '?', isPilots: '?', speedOnTxKbit: '?', speedOnIifKbit: '?'
{% else %}
- modcod: '?', speedOnTxKbit: '?', speedOnIifKbit: '?', centerFreq: '?', symSpeed: '?',
+ modcod: '?', speedOnTxKbit: '?', speedOnIifKbit: '?', centerFreq: '?', symSpeed: '?'
{% endif %}
},
{% if modem == 'scpc' %}
@@ -42,6 +42,9 @@
{% endif %}
statDevice: { // температурные датчики
adrv: 0, zynq: 0, fpga: 0
+ {% if modem == 'tdma' %},
+ upgradeStatus: "", upgradePercent: 0, upgradeImage: ""
+ {% endif %}
},
statOs: {uptime: '?', load1: '?', load5: '?', load15: '?', totalram: '?', freeram: '?'},
diff --git a/front-generator/template/common/monitoring-methods.js.j2 b/front-generator/template/common/monitoring-methods.js.j2
index 5c886ee..5d82065 100644
--- a/front-generator/template/common/monitoring-methods.js.j2
+++ b/front-generator/template/common/monitoring-methods.js.j2
@@ -71,6 +71,11 @@
this.statDevice.adrv = vals["mainState"]["device.adrv"]
this.statDevice.zynq = vals["mainState"]["device.zynq"]
this.statDevice.fpga = vals["mainState"]["device.fpga"]
+ {% if modem == 'tdma' %},
+ this.statDevice.upgradeStatus = vals["mainState"]["device.upgradeStatus"]
+ this.statDevice.upgradePercent = vals["mainState"]["device.upgradePercent"]
+ this.statDevice.upgradeImage = vals["mainState"]["device.upgradeImage"]
+ {% endif %}
this.testState = vals["mainState"]["testState"]
diff --git a/front-generator/template/common/monitoring.html.j2 b/front-generator/template/common/monitoring.html.j2
index 2a4008e..b7583af 100644
--- a/front-generator/template/common/monitoring.html.j2
+++ b/front-generator/template/common/monitoring.html.j2
@@ -72,7 +72,11 @@
Температура FPGA | {{ statDevice.fpga }} °C |
Время работы устройства | {{ statOs.uptime }} |
Средняя загрузка ЦП (1/5/15 мин.) | {{ statOs.load1 }}% {{ statOs.load5 }}% {{ statOs.load15 }}% |
- ОЗУ всего/свободно | {{ statOs.totalram }}МБ/{{ statOs.freeram }}МБ |
+ ОЗУ всего/свободно | {{ statOs.totalram }}МБ/{{ statOs.freeram }}МБ |
{% endraw %}{% if modem == 'tdma' %}{% raw %}
+ Статус обновления |
+ Статус | {{ statDevice.upgradeStatus }} |
+ Прогресс | {{ statDevice.upgradePercent }}% |
+ Имя образа | {{ statDevice.upgradeImage }} |
{% endraw %}{% endif %}{% raw %}
diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp
index 7bb6bb0..bd3bc21 100644
--- a/src/terminal_api_driver.cpp
+++ b/src/terminal_api_driver.cpp
@@ -255,7 +255,6 @@ private:
void updateState() {
modulator_state modulator{};
demodulator_state demodulator{};
- device_state device{};
#ifdef MODEM_IS_SCPC
CinC_state cinc{};
#endif
@@ -263,7 +262,6 @@ private:
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_GetDeviceState()", CP_GetDeviceState(sid, device));
#ifdef MODEM_IS_TDMA
std::string tmpDevState;
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDmaDebug(status_init)", CP_GetDmaDebug(sid, "status_init", &tmpDevState));
@@ -281,7 +279,6 @@ private:
std::lock_guard lock2(this->stateMutex);
this->modState = modulator;
this->demodState = demodulator;
- this->devState = device;
#ifdef MODEM_IS_TDMA
this->deviceInitState = tmpDevState;
#endif
@@ -323,6 +320,16 @@ 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));
@@ -475,6 +482,15 @@ private:
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateState() failed to log: " << 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 {
@@ -515,7 +531,12 @@ private:
auto now = TIME_NOW();
for (auto& u: updaters) {
if (u.checkNeedUpdate(now)) {
- u.lastUpdate = now;
+ // выравнивание таймингов (-20ms...+50ms)
+ if (u.lastUpdate + u.periodMs + 50 < now) {
+ u.lastUpdate += u.periodMs;
+ } else {
+ u.lastUpdate = now;
+ }
u.callback();
now = TIME_NOW();
}
@@ -942,6 +963,25 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
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);
+#ifdef MODEM_IS_TDMA
+ if (device.cur_image.empty()) {
+ result << R"(,
+"device.upgradeStatus":"Нет обновлений","device.upgradePercent":0,"device.upgradeImage":"")";
+ } else {
+ switch (device.status) {
+ 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;
+ case NORM_RX_OBJECT_COMPLETED_API: result << ",\n" R"("device.upgradeStatus": "Загрузка завершена")"; break;
+ case NORM_RX_OBJECT_ABORTED_API: result << ",\n" R"("device.upgradeStatus": "Загрузка прервана")"; break;
+ default: result << ",\n" R"("device.upgradeStatus": "?")";
+
+ }
+ result << ",\"device.upgradePercent\":" << device.dwl_percent;
+ result << ",\"device.upgradeImage\":" << buildEscapedString(device.cur_image);
+ }
+
+#endif
result << "}";
diff --git a/src/terminal_api_driver.h b/src/terminal_api_driver.h
index dcb316a..b75f98d 100644
--- a/src/terminal_api_driver.h
+++ b/src/terminal_api_driver.h
@@ -9,7 +9,8 @@
namespace api_driver {
- constexpr int CACHE_STATISTICS_UPDATE_MS = 500;
+ constexpr int CACHE_STATISTICS_UPDATE_MS = 500; ///< время обновления кеша статистики модулятора/демодулятора
+ constexpr int CACHE_DEV_STATE_UPDATE_MS = 3000; ///< время обновления статуса устройства (обновления по воздуху, температуры)
constexpr int CACHE_SETTINGS_UPDATE_MS = 5000;
constexpr int CACHE_QOS_UPDATE_MS = 5000;
diff --git a/static/main-scpc.html b/static/main-scpc.html
index 60f6a4c..08fbbc2 100644
--- a/static/main-scpc.html
+++ b/static/main-scpc.html
@@ -687,7 +687,7 @@
state: '?',
// прочие поля
- snr: '?', modcod: '?', frameSizeNormal: '?', isPilots: '?', speedOnTxKbit: '?', speedOnIifKbit: '?',
+ snr: '?', modcod: '?', frameSizeNormal: '?', isPilots: '?', speedOnTxKbit: '?', speedOnIifKbit: '?'
},
statCinc: {
occ: '?',
diff --git a/static/main-tdma.html b/static/main-tdma.html
index 1962842..0c35651 100644
--- a/static/main-tdma.html
+++ b/static/main-tdma.html
@@ -103,6 +103,10 @@
Время работы устройства | {{ statOs.uptime }} |
Средняя загрузка ЦП (1/5/15 мин.) | {{ statOs.load1 }}% {{ statOs.load5 }}% {{ statOs.load15 }}% |
ОЗУ всего/свободно | {{ statOs.totalram }}МБ/{{ statOs.freeram }}МБ |
+ Статус обновления |
+ Статус | {{ statDevice.upgradeStatus }} |
+ Прогресс | {{ statDevice.upgradePercent }}% |
+ Имя образа | {{ statDevice.upgradeImage }} |
@@ -149,7 +153,7 @@