From 3a1699d8652daecffed2bc8250fac7563128902f Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Mon, 20 Jan 2025 15:55:03 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BA=D0=BE=D1=81?= =?UTF-8?q?=D1=8F=D1=87=D0=BD=D1=8B=D1=85=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B2=20json,=20=D1=84=D0=B8=D1=87=D0=B0:=20SNR=20=D0=B2=20?= =?UTF-8?q?=D0=B2=D0=B5=D0=B1=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front-generator/render-params.json | 6 ++-- .../template/common/setup-methods.js.j2 | 29 +++++++++++++-- src/terminal_api_driver.cpp | 5 ++- static/main-scpc.html | 35 ++++++++++++++++--- 4 files changed, 64 insertions(+), 11 deletions(-) diff --git a/front-generator/render-params.json b/front-generator/render-params.json index d014bd5..39feb27 100644 --- a/front-generator/render-params.json +++ b/front-generator/render-params.json @@ -182,14 +182,14 @@ }, {"widget": "modulation-modcod", "label": "Модуляция", "name": "dvbCcm", "v_show": "paramRxtx.dvbIsAcm === false"}, {"widget": "modulation-speed", "label": "Скорость кода", "name": "dvbCcm", "v_show": "paramRxtx.dvbIsAcm === false"}, - {"widget": "watch-expr", "label": "Расчетная скорость, kbit", "expr": "calcInterfaceSpeedKb(paramRxtx.txBaudrate, paramRxtx.dvbCcmModulation, paramRxtx.dvbCcmSpeed)", "v_show": "paramRxtx.dvbIsAcm === false"}, + {"widget": "watch-expr", "label": "Расчетная скорость", "expr": "calcInterfaceSpeedKb(paramRxtx.txBaudrate, paramRxtx.dvbCcmModulation, paramRxtx.dvbCcmSpeed, paramRxtx.txFrameSizeNormal)", "v_show": "paramRxtx.dvbIsAcm === false"}, {"widget": "watch-expr", "label": "Текущий модкод", "expr": "statTx.modcod", "v_show": "paramRxtx.dvbIsAcm === true"}, {"widget": "modulation-modcod", "label": "Модуляция (мин. режим)", "name": "dvbAcmMin", "v_show": "paramRxtx.dvbIsAcm === true"}, {"widget": "modulation-speed", "label": "Скорость кода (мин. режим)", "name": "dvbAcmMin", "v_show": "paramRxtx.dvbIsAcm === true"}, - {"widget": "watch-expr", "label": "Расчетная скорость (мин. режим), kbit", "expr": "calcInterfaceSpeedKb(paramRxtx.txBaudrate, paramRxtx.dvbAcmMinModulation, paramRxtx.dvbAcmMinSpeed)", "v_show": "paramRxtx.dvbIsAcm === true"}, + {"widget": "watch-expr", "label": "Расчетная скорость (мин. режим)", "expr": "calcInterfaceSpeedKb(paramRxtx.txBaudrate, paramRxtx.dvbAcmMinModulation, paramRxtx.dvbAcmMinSpeed, paramRxtx.txFrameSizeNormal)", "v_show": "paramRxtx.dvbIsAcm === true"}, {"widget": "modulation-modcod", "label": "Модуляция (макс. режим)", "name": "dvbAcmMax", "v_show": "paramRxtx.dvbIsAcm === true"}, {"widget": "modulation-speed", "label": "Скорость кода (макс. режим)", "name": "dvbAcmMax", "v_show": "paramRxtx.dvbIsAcm === true"}, - {"widget": "watch-expr", "label": "Расчетная скорость (макс. режим), kbit", "expr": "calcInterfaceSpeedKb(paramRxtx.txBaudrate, paramRxtx.dvbAcmMaxModulation, paramRxtx.dvbAcmMaxSpeed)", "v_show": "paramRxtx.dvbIsAcm === true"}, + {"widget": "watch-expr", "label": "Расчетная скорость (макс. режим)", "expr": "calcInterfaceSpeedKb(paramRxtx.txBaudrate, paramRxtx.dvbAcmMaxModulation, paramRxtx.dvbAcmMaxSpeed, paramRxtx.txFrameSizeNormal)", "v_show": "paramRxtx.dvbIsAcm === true"}, {"widget": "number", "label": "Запас ОСШ, дБ", "name": "dvbSnrReserve", "min": 0, "step": 0.01, "max": 10} ] }, diff --git a/front-generator/template/common/setup-methods.js.j2 b/front-generator/template/common/setup-methods.js.j2 index 22fb6c3..c841912 100644 --- a/front-generator/template/common/setup-methods.js.j2 +++ b/front-generator/template/common/setup-methods.js.j2 @@ -1,8 +1,33 @@ {% if 'rxtx' in params and modem == 'scpc' %} - calcInterfaceSpeedKb(baud, modulation, speed) { + calcRequiredSnr(frameSizeNormal, modulation, speed) { + const snrValues = [ + {fs: true, mod: 'qpsk', speed: '1/2', snr: 2.58}, {fs: true, mod: 'qpsk', speed: '2/3', snr: 3.77}, {fs: true, mod: 'qpsk', speed: '3/4', snr: 4.5}, {fs: true, mod: 'qpsk', speed: '4/5', snr: 5.2}, {fs: true, mod: 'qpsk', speed: '5/6', snr: 5.45}, {fs: true, mod: 'qpsk', speed: '8/9', snr: 6.46}, {fs: true, mod: 'qpsk', speed: '9/10', snr: 6.66}, + {fs: true, mod: '8psk', speed: '2/3', snr: 8.45}, {fs: true, mod: '8psk', speed: '3/4', snr: 8.77}, {fs: true, mod: '8psk', speed: '5/6', snr: 10.09}, {fs: true, mod: '8psk', speed: '8/9', snr: 10.91}, {fs: true, mod: '8psk', speed: '9/10', snr: 11.3}, + {fs: true, mod: '16apsk', speed: '2/3', snr: 11.21}, {fs: true, mod: '16apsk', speed: '3/4', snr: 11.31}, {fs: true, mod: '16apsk', speed: '4/5', snr: 12.04}, {fs: true, mod: '16apsk', speed: '5/6', snr: 12.45}, {fs: true, mod: '16apsk', speed: '8/9', snr: 12.98}, {fs: true, mod: '16apsk', speed: '9/10', snr: 13.14}, + {fs: true, mod: '32apsk', speed: '3/4', snr: 13.98}, {fs: true, mod: '32apsk', speed: '4/5', snr: 14.23}, {fs: true, mod: '32apsk', speed: '5/6', snr: 14.92}, {fs: true, mod: '32apsk', speed: '8/9', snr: 16.12}, {fs: true, mod: '32apsk', speed: '9/10', snr: 16.6}, + + {fs: false, mod: 'qpsk', speed: '1/2', snr: 4.05}, {fs: false, mod: 'qpsk', speed: '2/3', snr: 4.52}, {fs: false, mod: 'qpsk', speed: '3/4', snr: 5.03}, {fs: false, mod: 'qpsk', speed: '4/5', snr: 6.84}, {fs: false, mod: 'qpsk', speed: '5/6', snr: 7.75}, {fs: false, mod: 'qpsk', speed: '8/9', snr: 8.45}, + {fs: false, mod: '8psk', speed: '2/3', snr: 9.86}, {fs: false, mod: '8psk', speed: '3/4', snr: 10.5}, {fs: false, mod: '8psk', speed: '5/6', snr: 11.08}, {fs: false, mod: '8psk', speed: '8/9', snr: 11.25}, + {fs: false, mod: '16apsk', speed: '2/3', snr: 11.58}, {fs: false, mod: '16apsk', speed: '3/4', snr: 11.73}, {fs: false, mod: '16apsk', speed: '4/5', snr: 11.92}, {fs: false, mod: '16apsk', speed: '5/6', snr: 12.29}, {fs: false, mod: '16apsk', speed: '8/9', snr: 13.34}, + {fs: false, mod: '32apsk', speed: '3/4', snr: 14.16}, {fs: false, mod: '32apsk', speed: '4/5', snr: 14.69}, {fs: false, mod: '32apsk', speed: '5/6', snr: 15.23}, {fs: false, mod: '32apsk', speed: '8/9', snr: 16.48}, + ] + for (let i = 0; i < snrValues.length; i++) { + if (snrValues[i].fs === frameSizeNormal && snrValues[i].mod === modulation && snrValues[i].speed === speed) { return snrValues[i].snr } + } + return '?' + }, + calcInterfaceSpeedKb(baud, modulation, speed, frameSizeNormal) { const mMod = Math.max(2, ['', '', 'qpsk', '8psk', '16apsk', '32apsk'].indexOf(modulation)) const speedVals = {'1/4': 0.25, '1/3': 0.333, '2/5': 0.4, '1/2': 0.5, '3/5': 0.6, '2/3': 0.666, '3/4': 0.75, '4/5': 0.8, '5/6': 0.833, '8/9': 0.888, '9/10': 0.9} const mSpeed = speed in speedVals ? speedVals[speed] : 1 - return ((baud * mMod * mSpeed) / 1024).toLocaleString() + const result = (baud * mMod * mSpeed) / 1024 + const calcSnr = this.calcRequiredSnr(frameSizeNormal, modulation, speed) + let snr; + if (isNaN(calcSnr)) { snr = `SNR=?` } else { snr=`SNR=${calcSnr}` } + if (result > 1024) { + return (result / 1024).toLocaleString() + ' mbit/s; ' + snr + } else { + return result.toLocaleString() + ' kbit/s; ' + snr + } }, {% endif %} diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index c7480ab..41c24b6 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -668,7 +668,10 @@ std::string api_driver::buildEscapedString(const std::string& source) { str.replace(start_pos, 1, "\\\""); start_pos += 2; } - return "\"" + str + "\""; + for (start_pos = 0; start_pos < str.size() && (str[start_pos] == ' ' || str[start_pos] == '\n' || str[start_pos] == '\t'); start_pos++) {} + size_t end_pos = str.size() - 1; + for (; end_pos > start_pos && end_pos != 0 && (str[end_pos] == ' ' || str[end_pos] == '\n' || str[end_pos] == '\t'); end_pos--) {} + return "\"" + str.substr(start_pos, end_pos - start_pos + 1) + "\""; } static void writeDouble(std::ostream& out, double value, int prec = 2) { diff --git a/static/main-scpc.html b/static/main-scpc.html index 1aeca82..08f0466 100644 --- a/static/main-scpc.html +++ b/static/main-scpc.html @@ -217,7 +217,7 @@ @@ -1024,11 +1024,36 @@ // ========== include end from 'common/monitoring-methods.js.j2' // ========== include from 'common/setup-methods.js.j2' - calcInterfaceSpeedKb(baud, modulation, speed) { + calcRequiredSnr(frameSizeNormal, modulation, speed) { + const snrValues = [ + {fs: true, mod: 'qpsk', speed: '1/2', snr: 2.58}, {fs: true, mod: 'qpsk', speed: '2/3', snr: 3.77}, {fs: true, mod: 'qpsk', speed: '3/4', snr: 4.5}, {fs: true, mod: 'qpsk', speed: '4/5', snr: 5.2}, {fs: true, mod: 'qpsk', speed: '5/6', snr: 5.45}, {fs: true, mod: 'qpsk', speed: '8/9', snr: 6.46}, {fs: true, mod: 'qpsk', speed: '9/10', snr: 6.66}, + {fs: true, mod: '8psk', speed: '2/3', snr: 8.45}, {fs: true, mod: '8psk', speed: '3/4', snr: 8.77}, {fs: true, mod: '8psk', speed: '5/6', snr: 10.09}, {fs: true, mod: '8psk', speed: '8/9', snr: 10.91}, {fs: true, mod: '8psk', speed: '9/10', snr: 11.3}, + {fs: true, mod: '16apsk', speed: '2/3', snr: 11.21}, {fs: true, mod: '16apsk', speed: '3/4', snr: 11.31}, {fs: true, mod: '16apsk', speed: '4/5', snr: 12.04}, {fs: true, mod: '16apsk', speed: '5/6', snr: 12.45}, {fs: true, mod: '16apsk', speed: '8/9', snr: 12.98}, {fs: true, mod: '16apsk', speed: '9/10', snr: 13.14}, + {fs: true, mod: '32apsk', speed: '3/4', snr: 13.98}, {fs: true, mod: '32apsk', speed: '4/5', snr: 14.23}, {fs: true, mod: '32apsk', speed: '5/6', snr: 14.92}, {fs: true, mod: '32apsk', speed: '8/9', snr: 16.12}, {fs: true, mod: '32apsk', speed: '9/10', snr: 16.6}, + + {fs: false, mod: 'qpsk', speed: '1/2', snr: 4.05}, {fs: false, mod: 'qpsk', speed: '2/3', snr: 4.52}, {fs: false, mod: 'qpsk', speed: '3/4', snr: 5.03}, {fs: false, mod: 'qpsk', speed: '4/5', snr: 6.84}, {fs: false, mod: 'qpsk', speed: '5/6', snr: 7.75}, {fs: false, mod: 'qpsk', speed: '8/9', snr: 8.45}, + {fs: false, mod: '8psk', speed: '2/3', snr: 9.86}, {fs: false, mod: '8psk', speed: '3/4', snr: 10.5}, {fs: false, mod: '8psk', speed: '5/6', snr: 11.08}, {fs: false, mod: '8psk', speed: '8/9', snr: 11.25}, + {fs: false, mod: '16apsk', speed: '2/3', snr: 11.58}, {fs: false, mod: '16apsk', speed: '3/4', snr: 11.73}, {fs: false, mod: '16apsk', speed: '4/5', snr: 11.92}, {fs: false, mod: '16apsk', speed: '5/6', snr: 12.29}, {fs: false, mod: '16apsk', speed: '8/9', snr: 13.34}, + {fs: false, mod: '32apsk', speed: '3/4', snr: 14.16}, {fs: false, mod: '32apsk', speed: '4/5', snr: 14.69}, {fs: false, mod: '32apsk', speed: '5/6', snr: 15.23}, {fs: false, mod: '32apsk', speed: '8/9', snr: 16.48}, + ] + for (let i = 0; i < snrValues.length; i++) { + if (snrValues[i].fs === frameSizeNormal && snrValues[i].mod === modulation && snrValues[i].speed === speed) { return snrValues[i].snr } + } + return '?' + }, + calcInterfaceSpeedKb(baud, modulation, speed, frameSizeNormal) { const mMod = Math.max(2, ['', '', 'qpsk', '8psk', '16apsk', '32apsk'].indexOf(modulation)) const speedVals = {'1/4': 0.25, '1/3': 0.333, '2/5': 0.4, '1/2': 0.5, '3/5': 0.6, '2/3': 0.666, '3/4': 0.75, '4/5': 0.8, '5/6': 0.833, '8/9': 0.888, '9/10': 0.9} const mSpeed = speed in speedVals ? speedVals[speed] : 1 - return ((baud * mMod * mSpeed) / 1024).toLocaleString() + const result = (baud * mMod * mSpeed) / 1024 + const calcSnr = this.calcRequiredSnr(frameSizeNormal, modulation, speed) + let snr; + if (isNaN(calcSnr)) { snr = `SNR=?` } else { snr=`SNR=${calcSnr}` } + if (result > 1024) { + return (result / 1024).toLocaleString() + ' mbit/s; ' + snr + } else { + return result.toLocaleString() + ' kbit/s; ' + snr + } }, // ========== include end from 'common/setup-methods.js.j2'