From 25a3b11ba8bc0a3861cf9f82e738e9d58ff591c5 Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Tue, 14 Jan 2025 14:42:16 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D1=85=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=B8=20Qos,=20?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=BB=D0=BE=D1=81=D1=8C=20=D0=B0=D0=B4?= =?UTF-8?q?=D0=BC=D0=B8=D0=BD=D0=B8=D1=81=D1=82=D1=80=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front-generator/render-params.json | 135 +++-- front-generator/render.py | 27 + .../template/common/qos-data.js.j2 | 10 +- .../template/common/qos-methods.js.j2 | 95 ++-- front-generator/template/common/qos.html.j2 | 26 +- front-generator/template/common/setup.html.j2 | 1 - front-generator/template/common/widgets.j2 | 23 + front-generator/template/default-js.js | 141 ----- front-generator/template/main.html | 38 +- static/main-scpc.html | 503 +++++++++++------- static/main-tdma.html | 149 +----- 11 files changed, 553 insertions(+), 595 deletions(-) delete mode 100644 front-generator/template/default-js.js diff --git a/front-generator/render-params.json b/front-generator/render-params.json index ea710c2..b9344ca 100644 --- a/front-generator/render-params.json +++ b/front-generator/render-params.json @@ -46,14 +46,7 @@ {"widget": "number", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 0, "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"} - ] + "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"}] } ] } @@ -108,18 +101,9 @@ ] }, "tabs": [ - { - "name": "monitoring", - "desc": "Мониторинг" - }, - { - "name": "setup", - "desc": "Настройки" - }, - { - "name": "admin", - "desc": "Администрирование" - } + {"name": "monitoring", "desc": "Мониторинг"}, + {"name": "setup", "desc": "Настройки"}, + {"name": "admin", "desc": "Администрирование"} ] }, "scpc": { @@ -131,19 +115,8 @@ "widget": "settings-container", "childs": [ { - "widget": "select", - "label": "Режим работы", - "name": "isCinC", - "values": [ - { - "label": "SCPC", - "value": "false" - }, - { - "label": "CinC", - "value": "true" - } - ] + "widget": "select", "label": "Режим работы", "name": "isCinC", + "values": [{"label": "SCPC", "value": "false"}, {"label": "CinC", "value": "true"}] } ] }, @@ -153,21 +126,75 @@ { "widget": "settings-container", "childs": [ - { "widget": "h3", "label": "Настройки приема/передачи" }, + {"widget": "h3", "label": "Настройки передатчика"}, + {"widget": "checkbox", "label": "Включить передатчик", "name": "txEn"}, + {"widget": "checkbox", "label": "Автоматический запуск передатчика", "name": "txAutoStart"}, { - "widget": "select", - "label": "Режим работы", - "name": "isCinC", - "values": [ - { - "label": "CinC", - "value": "true" - }, - { - "label": "SCPC", - "value": "false" - } - ] + "widget": "select", "label": "Режим работы модулятора", "name": "txModulatorIsTest", + "values": [{"label": "Нормальный", "value": "false"}, {"label": "Тест (CW)", "value": "true"}] + }, + { + "widget": "select", "label": "Входные данные", "name": "txIsTestInput", + "values": [{"label": "SCPC", "value": "false"}, {"label": "Тест", "value": "true"}] + }, + {"widget": "h3", "label": "Параметры передачи"}, + {"widget": "number", "label": "Центральная частота, КГц", "name": "txCentralFreq", "min": 900000, "step": 1}, + {"widget": "number", "label": "Символьная скорость, Бод", "name": "txBaudrate", "min": 0, "step": 1}, + { + "widget": "select", "label": "Roll-off", "name": "txRolloff", + "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"}] + }, + {"widget": "number", "label": "Ослабление, дБ", "name": "txAttenuation", "min": 0, "step": 1} + ] + }, + { + "widget": "settings-container", + "childs": [ + {"widget": "h3", "label": "Режим работы DVB-S2"}, + {"widget": "number", "label": "Период служебных пакетов, сек", "name": "dvbServicePacketPeriod", "min": 0, "step": 1, "max": 60}, + { + "widget": "select", "label": "Режим модуляции", "name": "dvbIsAcm", + "values": [{"label": "CCM", "value": "false"}, {"label": "ACM", "value": "true"}] + }, + { + "widget": "select", "label": "Размер кадра", "name": "txFrameSizeNormal", + "values": [{"label": "normal", "value": "true"}, {"label": "short", "value": "false"}] + }, + {"widget": "modulation-modcod", "label": "Модуляция", "name": "dvbCcm", "v_show": "paramRxtx.dvbIsAcm === false"}, + {"widget": "modulation-speed", "label": "Скорость кода", "name": "dvbCcm", "v_show": "paramRxtx.dvbIsAcm === false"}, + {"widget": "watch", "label": "Текущий модкод", "model": "statRx.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": "modulation-modcod", "label": "Модуляция (макс. режим)", "name": "dvbAcmMax", "v_show": "paramRxtx.dvbIsAcm === true"}, + {"widget": "modulation-speed", "label": "Скорость кода (макс. режим)", "name": "dvbAcmMax", "v_show": "paramRxtx.dvbIsAcm === true"}, + {"widget": "number", "label": "Запас ОСШ, дБ", "name": "dvbSnrReserve", "min": 0, "step": 0.01, "max": 10} + ] + }, + { + "widget": "settings-container", + "childs": [ + {"widget": "h3", "label": "Авто-регулировка мощности"}, + {"widget": "checkbox", "label": "Авто-регулировка мощности", "name": "acmEn"}, + {"widget": "number", "label": "Минимальное ослабление, дБ", "name": "acmMinAttenuation", "min": 0, "step": 0.01, "max": 10}, + {"widget": "number", "label": "Максимальное ослабление, дБ", "name": "acmMaxAttenuation", "min": 0, "step": 0.01, "max": 10}, + {"widget": "number", "label": "Требуемое ОСШ", "name": "acmRequiredSnr", "min": 0, "step": 0.01, "max": 10} + ] + }, + { + "widget": "settings-container", + "childs": [ + {"widget": "h3", "label": "Настройки приемника"}, + { + "widget": "select", "label": "Режим управления усилением", "name": "rxAgcEn", + "values": [{"label": "РРУ", "value": "false"}, {"label": "АРУ", "value": "true"}] + }, + {"widget": "number", "label": "Усиление, дБ", "name": "rxManualGain", "min": -40, "step": 0.01, "max": 40, "v_show": "paramRxtx.rxAgcEn === false"}, + {"widget": "checkbox", "label": "Инверсия спектра", "name": "rxSpectrumInversion"}, + {"widget": "number", "label": "Центральная частота, КГц", "name": "rxCentralFreq", "min": 900000, "step": 1}, + {"widget": "number", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 0, "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"}] } ] } @@ -187,9 +214,9 @@ ] }, {"widget": "number", "label": "Полоса поиска, КГц ±", "name": "cincSearchBandwidth", "min": 0, "step": 1, "max": 100} - ] - } + }, + {"widget": "submit", "v_show": "paramRxtx.isCinC"} ], "buclnb": [ {"widget": "h2", "label": "Настройки питания и опорного генератора"}, @@ -237,6 +264,16 @@ } ] } + ], + "tcpaccel": [ + {"widget": "h2", "label": "Настройки TCP-акселерации"}, + { + "widget": "settings-container", + "childs": [ + {"widget": "checkbox", "label": "Активировать акселерацию", "name": "accelEn"}, + {"widget": "number", "label": "Максимальное количество соединений", "name": "accelMaxConnections", "min": 0, "step": 1, "max": 4000} + ] + } ] }, "tabs": [ diff --git a/front-generator/render.py b/front-generator/render.py index 1990b70..545277f 100644 --- a/front-generator/render.py +++ b/front-generator/render.py @@ -18,6 +18,9 @@ def extract_param_names(mc): case 'select': return [{"name": widget['name'], "initValue": widget['values'][0]['value']}] case 'checkbox': return [{"name": widget['name'], "initValue": 'false'}] case 'number': return [{"name": widget['name'], "initValue": widget['min'] if widget['min'] else '0'}] + case 'modulation-modcod': return [{"name": widget['name'] + "Modulation", "initValue": '"QPSK"'}] + case 'modulation-speed': return [{"name": widget['name'] + "Speed", "initValue": '"1/4"'}] + case 'watch': return [] return [{"name": widget['name'], "initValue": 'null'}] return [] @@ -35,6 +38,28 @@ def extract_param_names(mc): return result +def add_submit_widgets(params): + def find_submit(w): + if w['widget'] == 'submit': + return True + if 'childs' in w: + for c in w['childs']: + if find_submit(c): + return True + return False + + for group in params: + wid_found = False + for wid in params[group]: + if find_submit(wid): + wid_found = True + break + if wid_found: + continue + + params[group].append({"widget": "submit"}) + + def extract_param_groups(mc): return [k for k in mc['params']] @@ -48,6 +73,8 @@ def build_modem_env(modem): mc = config['modem_types'][modem] + add_submit_widgets(mc['params']) + return { "modem": modem, "modem_name": mc['modem_name'], diff --git a/front-generator/template/common/qos-data.js.j2 b/front-generator/template/common/qos-data.js.j2 index ee1f477..31da867 100644 --- a/front-generator/template/common/qos-data.js.j2 +++ b/front-generator/template/common/qos-data.js.j2 @@ -1,14 +1,8 @@ - paramsQos: { + submitStatusQos: false, + paramQos: { en: false, rt1: [], rt2: [], rt3: [], cd: [], }, - {% if 'tcpaccel' in params.paramGroupsList %} - paramsTcpAccel: { - en: false, - maxConnections: 128 - }, - {% endif %} - diff --git a/front-generator/template/common/qos-methods.js.j2 b/front-generator/template/common/qos-methods.js.j2 index 45db200..c234bf9 100644 --- a/front-generator/template/common/qos-methods.js.j2 +++ b/front-generator/template/common/qos-methods.js.j2 @@ -1,29 +1,6 @@ - {% if 'tcpaccel' in params.paramGroupsList %} - submitTcpaccelSettings() { - if (this.submitStatus.tcpAccel) { return } - this.submitStatus.tcpAccel = true - fetch('/api/set/tcpAccel', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - "tcpAccel.en": this.param.tcpAccel.en, - "tcpAccel.maxConnections": this.param.tcpAccel.maxConnections - }) - }).then(async (resp) => { - this.submitStatus.tcpAccel = false - this.updateNetworkSettings(await resp.json()) - }).catch((reason) => { - this.submitStatus.tcpAccel = false - alert(`Ошибка при применении настроек: ${reason}`) - }) - }, - updateTcpaccelSettings(vals) { console.log('tcp accel setting update function has no impl! update backend and write this function') } - {% endif %} settingsSubmitQoS() { - if (this.submitStatus.qos) { return } - this.submitStatus.qos = true + if (this.submitStatusQos) { return } + this.submitStatusQos = true function _translateQosClass(trafficClass, qc) { let res = { cir: qc['cir'], @@ -66,18 +43,18 @@ return res } let query = { - "en": this.paramsQos.en, + "en": this.paramQos.en, "rt1": [], "rt2": [], "rt3": [], "cd": [] } - for (let i = 0; i < this.paramsQos.rt1.length; i++) { query.rt1.push(_translateQosClass('rt', this.paramsQos.rt1[i])) } - for (let i = 0; i < this.paramsQos.rt2.length; i++) { query.rt2.push(_translateQosClass('rt', this.paramsQos.rt2[i])) } - for (let i = 0; i < this.paramsQos.rt3.length; i++) { query.rt3.push(_translateQosClass('rt', this.paramsQos.rt3[i])) } - for (let i = 0; i < this.paramsQos.cd.length; i++) { query.cd.push(_translateQosClass('rt', this.paramsQos.cd[i])) } + for (let i = 0; i < this.paramQos.rt1.length; i++) { query.rt1.push(_translateQosClass('rt', this.paramQos.rt1[i])) } + for (let i = 0; i < this.paramQos.rt2.length; i++) { query.rt2.push(_translateQosClass('rt', this.paramQos.rt2[i])) } + for (let i = 0; i < this.paramQos.rt3.length; i++) { query.rt3.push(_translateQosClass('rt', this.paramQos.rt3[i])) } + for (let i = 0; i < this.paramQos.cd.length; i++) { query.cd.push(_translateQosClass('rt', this.paramQos.cd[i])) } - console.log(query) + //console.log(query) fetch('/api/set/qos', { method: 'POST', headers: { @@ -85,24 +62,24 @@ }, body: JSON.stringify(query) }).then(async (resp) => { - this.submitStatus.qos = false + this.submitStatusQos = false this.updateQosSettings(await resp.json()) }).catch((reason) => { - this.submitStatus.qos = false + this.submitStatusQos = false alert(`Ошибка при применении настроек: ${reason}`) }) }, updateQosSettings(vals) { - this.submitStatus.qos = false - this.paramsQos.en = vals["settings"]["qos.enabled"] + this.submitStatusQos = false + this.paramQos.en = vals["settings"]["qos.enabled"] const qosProfile = vals["settings"]["qos.profile"] if (qosProfile !== null && qosProfile !== undefined) { - this.paramsQos.rt1 = [] // .splice(0, this.paramsQos.rt1.length) - this.paramsQos.rt2 = [] // .splice(0, this.paramsQos.rt2.length) - this.paramsQos.rt3 = [] // .splice(0, this.paramsQos.rt3.length) - this.paramsQos.cd = [] // .splice(0, this.paramsQos.cd.length) + this.paramQos.rt1 = [] // .splice(0, this.paramQos.rt1.length) + this.paramQos.rt2 = [] // .splice(0, this.paramQos.rt2.length) + this.paramQos.rt3 = [] // .splice(0, this.paramQos.rt3.length) + this.paramQos.cd = [] // .splice(0, this.paramQos.cd.length) for (let trafficClass in qosProfile) { if (['rt1', 'rt2', 'rt3', 'cd'].indexOf(trafficClass) < 0) { @@ -137,10 +114,10 @@ }) } switch (trafficClass) { - case 'rt1': this.paramsQos.rt1.push(result); break - case 'rt2': this.paramsQos.rt2.push(result); break - case 'rt3': this.paramsQos.rt3.push(result); break - case 'cd': this.paramsQos.cd.push(result); break + case 'rt1': this.paramQos.rt1.push(result); break + case 'rt2': this.paramQos.rt2.push(result); break + case 'rt3': this.paramQos.rt3.push(result); break + case 'cd': this.paramQos.cd.push(result); break } } } @@ -157,10 +134,10 @@ filters: [] } switch (name) { - case 'rt1': this.paramsQos.rt1.push(res); break - case 'rt2': this.paramsQos.rt2.push(res); break - case 'rt3': this.paramsQos.rt3.push(res); break - case 'cd': this.paramsQos.cd.push(res); break + case 'rt1': this.paramQos.rt1.push(res); break + case 'rt2': this.paramQos.rt2.push(res); break + case 'rt3': this.paramQos.rt3.push(res); break + case 'cd': this.paramQos.cd.push(res); break } }, @@ -176,28 +153,28 @@ dscp: "" } switch (name) { - case 'rt1': this.paramsQos.rt1[index].filters.push(rule); break - case 'rt2': this.paramsQos.rt2[index].filters.push(rule); break - case 'rt3': this.paramsQos.rt3[index].filters.push(rule); break - case 'cd': this.paramsQos.cd[index].filters.push(rule); break + case 'rt1': this.paramQos.rt1[index].filters.push(rule); break + case 'rt2': this.paramQos.rt2[index].filters.push(rule); break + case 'rt3': this.paramQos.rt3[index].filters.push(rule); break + case 'cd': this.paramQos.cd[index].filters.push(rule); break } }, qosDelClass(name, index) { switch (name) { - case 'rt1': this.paramsQos.rt1.splice(index, 1); break - case 'rt2': this.paramsQos.rt2.splice(index, 1); break - case 'rt3': this.paramsQos.rt3.splice(index, 1); break - case 'cd': this.paramsQos.cd.splice(index, 1); break + case 'rt1': this.paramQos.rt1.splice(index, 1); break + case 'rt2': this.paramQos.rt2.splice(index, 1); break + case 'rt3': this.paramQos.rt3.splice(index, 1); break + case 'cd': this.paramQos.cd.splice(index, 1); break } }, qosDelFilter(name, index, filterIndex) { switch (name) { - case 'rt1': this.paramsQos.rt1[index].filters.splice(filterIndex, 1); break - case 'rt2': this.paramsQos.rt2[index].filters.splice(filterIndex, 1); break - case 'rt3': this.paramsQos.rt3[index].filters.splice(filterIndex, 1); break - case 'cd': this.paramsQos.cd[index].filters.splice(filterIndex, 1); break + case 'rt1': this.paramQos.rt1[index].filters.splice(filterIndex, 1); break + case 'rt2': this.paramQos.rt2[index].filters.splice(filterIndex, 1); break + case 'rt3': this.paramQos.rt3[index].filters.splice(filterIndex, 1); break + case 'cd': this.paramQos.cd[index].filters.splice(filterIndex, 1); break } }, diff --git a/front-generator/template/common/qos.html.j2 b/front-generator/template/common/qos.html.j2 index 8a6949a..26ba039 100644 --- a/front-generator/template/common/qos.html.j2 +++ b/front-generator/template/common/qos.html.j2 @@ -1,15 +1,16 @@ +{% from 'common/widgets.j2' import build_widget %} {% raw %}

Настройки QoS

Классы {{ classesGroup.toUpperCase() }}

-
+
#{{ index }} CIR={{ qosClass.cir }}кбит, PIR={{ qosClass.pir }}кбит {{ qosClass.description }} #{{ index }} CBR={{ qosClass.cir }}кбит {{ qosClass.description }} @@ -98,20 +99,9 @@
- + - {% endraw %}{% if 'tcpaccel' in params.paramGroupsList %}{% raw %} -

Настройки TCP-акселерации

-
- - -
- - - {% endraw %}{% endif %} \ No newline at end of file + {% endraw %}{% if 'tcpaccel' in params %} + {% for w in params['tcpaccel'] %}{{ build_widget('tcpaccel', w) | indent(12, true) }}{% endfor %} + {% endif %} + \ No newline at end of file diff --git a/front-generator/template/common/setup.html.j2 b/front-generator/template/common/setup.html.j2 index 4cd0ecb..6587bc8 100644 --- a/front-generator/template/common/setup.html.j2 +++ b/front-generator/template/common/setup.html.j2 @@ -3,7 +3,6 @@ {% for cat in ['rxtx', 'cinc', 'buclnb'] %} {% if cat in params %} {% for w in params[cat] %}{{ build_widget(cat, w) | indent(12, true) }}{% endfor %} - {% endif %} {% endfor %} \ No newline at end of file diff --git a/front-generator/template/common/widgets.j2 b/front-generator/template/common/widgets.j2 index 1d67ea5..705f2c5 100644 --- a/front-generator/template/common/widgets.j2 +++ b/front-generator/template/common/widgets.j2 @@ -13,6 +13,25 @@ {% endmacro %} +{% macro build_widget_watch(param_group, widget) %}{{ widget.label }}{% endmacro %} + +{% macro build_widget_modulation_modcod(param_group, widget) %} + {{ widget.label }} + +{% endmacro %} + +{% macro build_widget_modulation_speed(param_group, widget) %} + {{ widget.label }} + +{% endmacro %} + {% macro build_widget_flex_container(param_group, widget) %}
{% for w in widget.childs %}{{ build_widget(param_group, w) | indent(4, true) }}{% endfor %}
{% endmacro %} @@ -26,9 +45,13 @@ {% elif widget.widget == 'settings-container' %}{{ build_widget_settings_container(param_group, widget) }} {% elif widget.widget == 'h2' %}{{ widget.label }} {% elif widget.widget == 'h3' %}{{ widget.label }} +{% elif widget.widget == 'submit' %} {% elif widget.widget == 'checkbox' %}{{ build_widget_checkbox(param_group, widget) }} {% elif widget.widget == 'number' %}{{ build_widget_number(param_group, widget) }} +{% elif widget.widget == 'watch' %}{{ build_widget_watch(param_group, widget) }} {% elif widget.widget == 'select' %}{{ build_widget_select(param_group, widget) }} +{% elif widget.widget == 'modulation-modcod' %}{{ build_widget_modulation_modcod(param_group, widget) }} +{% elif widget.widget == 'modulation-speed' %}{{ build_widget_modulation_speed(param_group, widget) }} {% else %}

Widget '{{ widget.widget }}' not defined!

{{ widget }}

{% endif %} {% endmacro %} diff --git a/front-generator/template/default-js.js b/front-generator/template/default-js.js deleted file mode 100644 index cbb18f2..0000000 --- a/front-generator/template/default-js.js +++ /dev/null @@ -1,141 +0,0 @@ - {% raw %}// default-js.js - // для обновления высоты хидера - function updateHeaderHeight() { const header = document.querySelector('header'); document.body.style.setProperty('--header-height', `${header.offsetHeight}px`); } - window.addEventListener('load', updateHeaderHeight); window.addEventListener('resize', updateHeaderHeight); - - function getCurrentTab() { - const sl = window.location.hash.slice(1) - if (availableTabs.indexOf(sl) >= 0) { - return sl - } - return availableTabs[0] - } - - function modcodToStr(modcod) { - // модкоды из раздела 5.5.2.2 https://www.etsi.org/deliver/etsi_en/302300_302399/302307/01.01.02_60/en_302307v010102p.pdf - - // NOTE модкоды со скоростью хода 3/5 не работают - const modcods = [ - "DUMMY", - "QPSK 1/4", - "QPSK 1/3", - "QPSK 2/5", - "QPSK 1/2", - "QPSK 3/5", // отключено - "QPSK 2/3", - "QPSK 3/4", - "QPSK 4/5", - "QPSK 5/6", - "QPSK 8/9", - "QPSK 9/10", - - "8PSK 3/5", // отключено - "8PSK 2/3", - "8PSK 3/4", - "8PSK 5/6", - "8PSK 8/9", - "8PSK 9/10", - - "16APSK 2/3", - "16APSK 3/4", - "16APSK 4/5", - "16APSK 5/6", - "16APSK 8/9", - "16APSK 9/10", - - "32APSK 3/4", - "32APSK 4/5", - "32APSK 5/6", - "32APSK 8/9", - "32APSK 9/10", - ] - if (typeof modcod != "number" || modcod < 0 || modcod >= modcod.length) { - return "?"; - } - return modcods[modcod] - } - - function toModcod(modulation, speed) { - switch (modulation.toLowerCase()) { - case 'qpsk': - switch (speed) { - case '1/4': return 1 - case '1/3': return 2 - case '2/5': return 3 - case '1/2': return 4 - case '3/5': return 5 // отключено - case '2/3': return 6 - case '3/4': return 7 - case '4/5': return 8 - case '5/6': return 9 - case '8/9': return 10 - case '9/10': return 11 - default: return 1 // минимальная скорость - } - case '8psk': - switch (speed) { - case '3/5': return 12 // отключено - case '2/3': return 13 - case '3/4': return 14 - case '5/6': return 15 - case '8/9': return 16 - case '9/10': return 17 - default: return 13 // минимальная скорость - } - case '16apsk': - switch (speed) { - case '2/3': return 18 - case '3/4': return 19 - case '4/5': return 20 - case '5/6': return 21 - case '8/9': return 22 - case '9/10': return 23 - default: return 18 // минимальная скорость - } - case '32apsk': - switch (speed) { - case '3/4': return 24 - case '4/5': return 25 - case '5/6': return 26 - case '8/9': return 27 - case '9/10': return 28 - default: return 24 - } - } - } - - function extractModulationAndSpeedFromModcod(modcod) { - switch (modcod) { - case 1: return { modulation: 'qpsk', speed: '1/4' } - case 2: return { modulation: 'qpsk', speed: '1/3' } - case 3: return { modulation: 'qpsk', speed: '2/5' } - case 4: return { modulation: 'qpsk', speed: '1/2' } - case 5: return { modulation: 'qpsk', speed: '3/5' } - case 6: return { modulation: 'qpsk', speed: '2/3' } - case 7: return { modulation: 'qpsk', speed: '3/4' } - case 8: return { modulation: 'qpsk', speed: '4/5' } - case 9: return { modulation: 'qpsk', speed: '5/6' } - case 10: return { modulation: 'qpsk', speed: '8/9' } - case 11: return { modulation: 'qpsk', speed: '9/10' } - case 12: return { modulation: '8psk', speed: '3/5' } - case 13: return { modulation: '8psk', speed: '2/3' } - case 14: return { modulation: '8psk', speed: '3/4' } - case 15: return { modulation: '8psk', speed: '5/6' } - case 16: return { modulation: '8psk', speed: '8/9' } - case 17: return { modulation: '8psk', speed: '9/10' } - case 18: return { modulation: '16apsk', speed: '2/3' } - case 19: return { modulation: '16apsk', speed: '3/4' } - case 20: return { modulation: '16apsk', speed: '4/5' } - case 21: return { modulation: '16apsk', speed: '5/6' } - case 22: return { modulation: '16apsk', speed: '8/9' } - case 23: return { modulation: '16apsk', speed: '9/10' } - case 24: return { modulation: '32apsk', speed: '3/4' } - case 25: return { modulation: '32apsk', speed: '4/5' } - case 26: return { modulation: '32apsk', speed: '5/6' } - case 27: return { modulation: '32apsk', speed: '8/9' } - case 28: return { modulation: '32apsk', speed: '9/10' } - } - return { modulation: 'qpsk', speed: '1/4' } - } - // default-js.js end - {% endraw %} \ No newline at end of file diff --git a/front-generator/template/main.html b/front-generator/template/main.html index e700f83..fe4c60b 100644 --- a/front-generator/template/main.html +++ b/front-generator/template/main.html @@ -63,18 +63,24 @@