From f5c5caa31c11050fa55f2eec59c1106064272dd6 Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Mon, 16 Dec 2024 09:30:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=87=D0=B0=D1=82=D0=BA=D0=B8=20front-generator,?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BC?= =?UTF-8?q?=D0=B5=D0=BB=D0=BA=D0=B8=D0=B9=20=D0=B1=D0=B0=D0=B3=20QoS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front-generator/render-params.json | 48 + front-generator/render.py | 38 + front-generator/template/default-js.js | 139 +++ front-generator/template/main.html | 1540 ++++++++++++++++++++++++ static/js/vue.js | 48 +- static/main-scpc.html | 8 +- 6 files changed, 1793 insertions(+), 28 deletions(-) create mode 100644 front-generator/render-params.json create mode 100644 front-generator/render.py create mode 100644 front-generator/template/default-js.js create mode 100644 front-generator/template/main.html diff --git a/front-generator/render-params.json b/front-generator/render-params.json new file mode 100644 index 0000000..8288557 --- /dev/null +++ b/front-generator/render-params.json @@ -0,0 +1,48 @@ +{ + "monitoring-params": {}, + "params": { + "buklnb": { + "" + } + }, + "modem_types": { + "tdma": { + "modem_name": "RCSM-101 TDMA", + "tabs": [ + { + "name": "monitoring", + "desc": "Мониторинг" + }, + { + "name": "setup", + "desc": "Настройки" + }, + { + "name": "admin", + "desc": "Администрирование" + } + ] + }, + "scpc": { + "modem_name": "RCSM-101", + "tabs": [ + { + "name": "monitoring", + "desc": "Мониторинг" + }, + { + "name": "setup", + "desc": "Настройки" + }, + { + "name": "qos", + "desc": "QoS" + }, + { + "name": "admin", + "desc": "Администрирование" + } + ] + } + } +} \ No newline at end of file diff --git a/front-generator/render.py b/front-generator/render.py new file mode 100644 index 0000000..1e2b7aa --- /dev/null +++ b/front-generator/render.py @@ -0,0 +1,38 @@ +import json + +from jinja2 import Environment, FileSystemLoader +import sys + + +def build_modem_env(modem): + with open('render-params.json') as f: + config = json.load(f) + if modem not in config['modem_types']: + raise RuntimeError(f"Modem '{modem}' is not exist in config!") + + mc = config['modem_types'][modem] + + return { + "modem_name": mc['modem_name'], + "header_tabs": mc['tabs'], + "js_tabs_array": str([t['name'] for t in mc['tabs']]) + } + + +def render_modem(modem): + loader = FileSystemLoader('template') + env = Environment(loader=loader, trim_blocks=True, lstrip_blocks=True) + template = env.get_template('main.html') + + context = build_modem_env(modem) + + with open(f"main-{modem}.html", "w") as f: + f.write(template.render(context)) + + +if __name__ == '__main__': + if len(sys.argv) != 2: + print(f"Usage: {sys.argv[0]} ") + + render_modem(sys.argv[1]) + diff --git a/front-generator/template/default-js.js b/front-generator/template/default-js.js new file mode 100644 index 0000000..049de9c --- /dev/null +++ b/front-generator/template/default-js.js @@ -0,0 +1,139 @@ +{% raw %}// для обновления высоты хидера +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 defaultTab +} + +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' } +} +{% endraw %} \ No newline at end of file diff --git a/front-generator/template/main.html b/front-generator/template/main.html new file mode 100644 index 0000000..b255ee9 --- /dev/null +++ b/front-generator/template/main.html @@ -0,0 +1,1540 @@ + + + + + + {{ modem_name }} + + + + + + + + + + + \ No newline at end of file diff --git a/static/js/vue.js b/static/js/vue.js index 4f25ea0..49ad25b 100644 --- a/static/js/vue.js +++ b/static/js/vue.js @@ -725,30 +725,30 @@ }; } - /****************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); + /****************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); }; var uid$2 = 0; diff --git a/static/main-scpc.html b/static/main-scpc.html index 5bbb8ad..f198c43 100644 --- a/static/main-scpc.html +++ b/static/main-scpc.html @@ -1197,10 +1197,10 @@ "rt3": [], "cd": [] } - for (let i = 0; i < this.param.qos.rt1.length; i++) { query.rt1.push(_translateQosClass('rt', this.param.qos.rt1[i])) } - for (let i = 0; i < this.param.qos.rt2.length; i++) { query.rt2.push(_translateQosClass('rt', this.param.qos.rt2[i])) } - for (let i = 0; i < this.param.qos.rt3.length; i++) { query.rt3.push(_translateQosClass('rt', this.param.qos.rt3[i])) } - for (let i = 0; i < this.param.qos.cd.length; i++) { query.cd.push(_translateQosClass('rt', this.param.qos.cd[i])) } + for (let i = 0; i < this.param.qos.rt1.length; i++) { query.rt1.push(_translateQosClass('rt1', this.param.qos.rt1[i])) } + for (let i = 0; i < this.param.qos.rt2.length; i++) { query.rt2.push(_translateQosClass('rt2', this.param.qos.rt2[i])) } + for (let i = 0; i < this.param.qos.rt3.length; i++) { query.rt3.push(_translateQosClass('rt3', this.param.qos.rt3[i])) } + for (let i = 0; i < this.param.qos.cd.length; i++) { query.cd.push(_translateQosClass('cd', this.param.qos.cd[i])) } console.log(query) fetch('/api/set/qos', {