работающая генерация настроек

This commit is contained in:
Vladislav Ostapov 2025-01-10 18:10:14 +03:00
parent 44aec3a114
commit a7242c186d
12 changed files with 570 additions and 450 deletions

View File

@ -1,32 +1,73 @@
{ {
"monitoring-params": {}, "monitoring-params": {},
"params": {
"rxtx": {
"rx.en": {
"model": "w:switch",
"label": "Включить передатчик"
},
"rx.isTestInputData": {
"model": "w:select",
"label": "Включить передатчик",
"items": [
{"value": "false", "label": "Ethernet"},
{"value": "true", "label": "Тест (CW)"}
]
},
"rx.freqKhz": {
"model": "w:number",
"number.type": "int",
"number.step": 1,
"number.min": 500000,
"number.max": 15000000
}
}
},
"modem_types": { "modem_types": {
"tdma": { "tdma": {
"modem_name": "RCSM-101 TDMA", "modem_name": "RCSM-101 TDMA",
"groupsList": ["rxtx", "buclnb"], "params": {
"rxtx": [
{
"widget": "h2",
"label": "Настройки приема/передачи"
},
{
"widget": "flex-container",
"childs": [
{
"widget": "settings-container",
"childs": [
{ "widget": "h3", "label": "Настройки передатчика" },
{
"widget": "checkbox",
"label": "Включить передатчик",
"name": "txEn"
},
{
"widget": "select",
"label": "Входные данные",
"name": "txIsTestInput",
"values": [
{
"label": "Тест",
"value": "true"
},
{
"label": "SCPC",
"value": "false"
}
]
}
]
},
{
"widget": "settings-container",
"childs": [
{ "widget": "h3", "label": "Настройки приемника" },
{
"widget": "select",
"label": "Режим управления усилением",
"name": "rxAgcEn",
"values": [
{
"label": "АРУ",
"value": "true"
},
{
"label": "РРУ",
"value": "false"
}
]
},
{
"widget": "checkbox",
"label": "Инверсия спектра",
"name": "rxSpectrumInversion"
}
]
}
]
}
]
},
"tabs": [ "tabs": [
{ {
"name": "monitoring", "name": "monitoring",
@ -44,7 +85,60 @@
}, },
"scpc": { "scpc": {
"modem_name": "RCSM-101", "modem_name": "RCSM-101",
"groupsList": ["rxtx", "cinc", "buclnb", "qos", "tcpaccel"], "params": {
"rxtx": [
{
"widget": "h2",
"label": "Настройки приема/передачи"
},
{
"widget": "settings-container",
"childs": [
{
"widget": "select",
"label": "Режим работы",
"name": "isCinC",
"values": [
{
"label": "CinC",
"value": "true"
},
{
"label": "SCPC",
"value": "false"
}
]
}
]
},
{
"widget": "flex-container",
"childs": [
{
"widget": "settings-container",
"childs": [
{ "widget": "h3", "label": "Настройки приема/передачи" },
{
"widget": "select",
"label": "Режим работы",
"name": "isCinC",
"values": [
{
"label": "CinC",
"value": "true"
},
{
"label": "SCPC",
"value": "false"
}
]
}
]
}
]
}
]
},
"tabs": [ "tabs": [
{ {
"name": "monitoring", "name": "monitoring",

View File

@ -4,6 +4,15 @@ import sys
import os import os
def extract_param_names(mc):
result = {}
def extract_param_groups(mc):
return [k for k in mc['params']]
def build_modem_env(modem): def build_modem_env(modem):
with open('render-params.json') as f: with open('render-params.json') as f:
config = json.load(f) config = json.load(f)
@ -17,8 +26,9 @@ def build_modem_env(modem):
"modem_name": mc['modem_name'], "modem_name": mc['modem_name'],
"header_tabs": mc['tabs'], "header_tabs": mc['tabs'],
"tab_names_array": [t['name'] for t in mc['tabs']], "tab_names_array": [t['name'] for t in mc['tabs']],
"params": {"groupsList": mc["groupsList"]} | config["params"], "params": mc["params"],
"all_settings_group_names": [] "paramGroupsWithNames": extract_param_names(mc),
"paramGroupsList": extract_param_groups(mc),
} }

View File

@ -5,7 +5,7 @@
rt3: [], rt3: [],
cd: [], cd: [],
}, },
{% if 'tcpaccel' in params.groupsList %} {% if 'tcpaccel' in params.paramGroupsList %}
paramsTcpAccel: { paramsTcpAccel: {
en: false, en: false,
maxConnections: 128 maxConnections: 128

View File

@ -1,3 +1,26 @@
{% 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() { settingsSubmitQoS() {
if (this.submitStatus.qos) { return } if (this.submitStatus.qos) { return }
this.submitStatus.qos = true this.submitStatus.qos = true
@ -70,29 +93,6 @@
}) })
}, },
{% if 'tcpaccel' in params.groupsList %}
settingsSubmitTcpAccel() {
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}`)
})
},
{% endif %}
updateQosSettings(vals) { updateQosSettings(vals) {
this.submitStatus.qos = false this.submitStatus.qos = false
this.paramsQos.en = vals["settings"]["qos.enabled"] this.paramsQos.en = vals["settings"]["qos.enabled"]
@ -241,3 +241,4 @@
return result return result
}, },

View File

@ -100,7 +100,7 @@
</div> </div>
<button class="action-button" @click="settingsSubmitQoS()">Применить <span class="submit-spinner" v-show="submitStatus.qos"></span></button> <button class="action-button" @click="settingsSubmitQoS()">Применить <span class="submit-spinner" v-show="submitStatus.qos"></span></button>
{% endraw %}{% if 'tcpaccel' in params.groupsList %}{% raw %} {% endraw %}{% if 'tcpaccel' in params.paramGroupsList %}{% raw %}
<h2>Настройки TCP-акселерации</h2> <h2>Настройки TCP-акселерации</h2>
<div class="settings-set-container"> <div class="settings-set-container">
<label> <label>

View File

@ -0,0 +1,55 @@
{% if 'rxtx' in params.paramGroupsList %}
paramsRxtx: {
isCinC: Boolean,
txEn: Boolean, // включен/выключен
modulatorMode: 'normal', // режим работы модулятора
autoStartTx: Boolean, // было "режим работы передатчика"
isTestInputData: Boolean, // входные данные: eth или test
txAttenuation: Number, // ослабление
txRolloff: Number,
txCymRate: Number,
txCenterFreq: Number,
txMode: null, // ccm/acm
txFrameSizeNormal: null, // 'normal' / 'short'
txIsPilots: false,
txCcmModulation: null,
txCcmSpeed: null,
txAcmMaxModulation: null,
txAcmMaxSpeed: null,
txAcmMinModulation: null,
txAcmMinSpeed: null,
txSnrReserve: null,
txServicePacketPeriod: null,
txAcmEn: false,
txAcmMaxAttenuation: null,
txAcmMinAttenuation: null,
txAcmRequiredSnr: null,
rxGainMode: null, // 'auto'/'manual' режим управления усилением
rxManualGain: 0, // усиление, только для ручного режима
rxSpectrumInversion: false,
rxRolloff: 0,
rxCymRate: 100000,
rxCenterFreq: 1200000.0,
},
{% endif %}
{% if 'cinc' in params.paramGroupsList %}
paramsCinc: {
cincMode: null, // 'positional' | 'delay'
cincSearchBandwidth: 0, // полоса поиска в кГц
cincPosition: {station: {latitude: 0, longitude: 0}, satelliteLongitude: 0},
cincDelayMin: 0,
cincDelayMax: 0
},
{% endif %}
{% if 'buclnb' in params.paramGroupsList %}
paramsBuclnb: {
bucRefClk10M: false, // подача опоры 10MHz
bucPowering: 0, // 0, 24, 48
lnbRefclk10m: false, // подача опоры 10MHz
lnbPowering: 0 // 0, 13, 18, 24
sysRefClk10M: false, // подача опоры 10MHz
sysAutoStart: false
},
{% endif %}

View File

@ -1,4 +1,5 @@
settingsSubmitRxTx() { {% if 'rxtx' in params.paramGroupsList %}
settingsSubmitRxtx() {
if (this.submitStatus.rxTx) { return } if (this.submitStatus.rxTx) { return }
// потом добавить: "dvbs2.isPilots": this.param.dvbs2.isPilots // потом добавить: "dvbs2.isPilots": this.param.dvbs2.isPilots
let query = { let query = {
@ -45,6 +46,49 @@
alert(`Ошибка при применении настроек: ${reason}`) alert(`Ошибка при применении настроек: ${reason}`)
}) })
}, },
updateRxtxSettings(vals) {
this.submitStatus.rxTx = false
this.param.general.isCinC = vals["settings"]["general.isCinC"]
this.param.general.txEn = vals["settings"]["general.txEn"]
this.param.general.modulatorMode = vals["settings"]["general.modulatorMode"]
this.param.general.autoStartTx = vals["settings"]["general.autoStartTx"]
this.param.general.isTestInputData = vals["settings"]["general.isTestInputData"]
this.param.tx.attenuation = vals["settings"]["tx.attenuation"]
this.param.tx.rolloff = vals["settings"]["tx.rolloff"]
this.param.tx.cymRate = vals["settings"]["tx.cymRate"]
this.param.tx.centerFreq = vals["settings"]["tx.centerFreq"]
this.param.dvbs2.mode = (vals["settings"]["dvbs2.isAcm"] ? 'acm' : 'ccm')
this.param.dvbs2.frameSizeNormal = vals["settings"]["dvbs2.frameSizeNormal"]
// this.param.dvbs2.isPilots = vals["settings"]["dvbs2.isPilots"]
let m = extractModulationAndSpeedFromModcod(vals["settings"]["dvbs2.ccm_modcod"])
this.param.dvbs2.ccm_modulation = m.modulation
this.param.dvbs2.ccm_speed = m.speed
m = extractModulationAndSpeedFromModcod(vals["settings"]["dvbs2.acm_maxModcod"])
this.param.dvbs2.acm_maxModulation = m.modulation
this.param.dvbs2.acm_maxSpeed = m.speed
m = extractModulationAndSpeedFromModcod(vals["settings"]["dvbs2.acm_minModcod"])
this.param.dvbs2.acm_minModulation = m.modulation
this.param.dvbs2.acm_minSpeed = m.speed
this.param.dvbs2.snrReserve = vals["settings"]["dvbs2.snrReserve"]
this.param.dvbs2.servicePacketPeriod = vals["settings"]["dvbs2.servicePacketPeriod"]
this.param.acm.en = vals["settings"]["acm.en"]
this.param.acm.maxAttenuation = vals["settings"]["acm.maxAttenuation"]
this.param.acm.minAttenuation = vals["settings"]["acm.minAttenuation"]
this.param.acm.requiredSnr = vals["settings"]["acm.requiredSnr"]
this.param.rx.gainMode = vals["settings"]["rx.gainMode"]
this.param.rx.manualGain = vals["settings"]["rx.manualGain"]
this.param.rx.spectrumInversion = vals["settings"]["rx.spectrumInversion"]
this.param.rx.rolloff = vals["settings"]["rx.rolloff"]
this.param.rx.cymRate = vals["settings"]["rx.cymRate"]
this.param.rx.centerFreq = vals["settings"]["rx.centerFreq"]
},
{% endif %}
settingsSubmitCinC() { settingsSubmitCinC() {
if (this.submitStatus.cinc) { return } if (this.submitStatus.cinc) { return }
@ -102,48 +146,7 @@
} }
}, },
updateRxTxSettings(vals) {
this.submitStatus.rxTx = false
this.param.general.isCinC = vals["settings"]["general.isCinC"]
this.param.general.txEn = vals["settings"]["general.txEn"]
this.param.general.modulatorMode = vals["settings"]["general.modulatorMode"]
this.param.general.autoStartTx = vals["settings"]["general.autoStartTx"]
this.param.general.isTestInputData = vals["settings"]["general.isTestInputData"]
this.param.tx.attenuation = vals["settings"]["tx.attenuation"]
this.param.tx.rolloff = vals["settings"]["tx.rolloff"]
this.param.tx.cymRate = vals["settings"]["tx.cymRate"]
this.param.tx.centerFreq = vals["settings"]["tx.centerFreq"]
this.param.dvbs2.mode = (vals["settings"]["dvbs2.isAcm"] ? 'acm' : 'ccm')
this.param.dvbs2.frameSizeNormal = vals["settings"]["dvbs2.frameSizeNormal"]
// this.param.dvbs2.isPilots = vals["settings"]["dvbs2.isPilots"]
let m = extractModulationAndSpeedFromModcod(vals["settings"]["dvbs2.ccm_modcod"])
this.param.dvbs2.ccm_modulation = m.modulation
this.param.dvbs2.ccm_speed = m.speed
m = extractModulationAndSpeedFromModcod(vals["settings"]["dvbs2.acm_maxModcod"])
this.param.dvbs2.acm_maxModulation = m.modulation
this.param.dvbs2.acm_maxSpeed = m.speed
m = extractModulationAndSpeedFromModcod(vals["settings"]["dvbs2.acm_minModcod"])
this.param.dvbs2.acm_minModulation = m.modulation
this.param.dvbs2.acm_minSpeed = m.speed
this.param.dvbs2.snrReserve = vals["settings"]["dvbs2.snrReserve"]
this.param.dvbs2.servicePacketPeriod = vals["settings"]["dvbs2.servicePacketPeriod"]
this.param.acm.en = vals["settings"]["acm.en"]
this.param.acm.maxAttenuation = vals["settings"]["acm.maxAttenuation"]
this.param.acm.minAttenuation = vals["settings"]["acm.minAttenuation"]
this.param.acm.requiredSnr = vals["settings"]["acm.requiredSnr"]
this.param.rx.gainMode = vals["settings"]["rx.gainMode"]
this.param.rx.manualGain = vals["settings"]["rx.manualGain"]
this.param.rx.spectrumInversion = vals["settings"]["rx.spectrumInversion"]
this.param.rx.rolloff = vals["settings"]["rx.rolloff"]
this.param.rx.cymRate = vals["settings"]["rx.cymRate"]
this.param.rx.centerFreq = vals["settings"]["rx.centerFreq"]
},
updateCincSettings(vals) { updateCincSettings(vals) {
this.submitStatus.cinc = false this.submitStatus.cinc = false

View File

@ -1,310 +1,9 @@
{% from 'common/widgets.j2' import build_widget %}
<div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete"> <div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete">
<h2>Настройки приема/передачи</h2> {% for cat in ['rxtx', 'cinc', 'buclnb'] %}
{% if cat in params %}
<div class="settings-set-container"> {% for w in params[cat] %}{{ build_widget(cat, w) }}{% endfor %}
<label>
<span>Режим работы</span>
<select v-model="param.general.isCinC">
<option :value="false">SCPC</option>
<option :value="true">CinC</option>
</select>
</label>
</div>
<div class="tabs-item-flex-container">
<div class="settings-set-container">
<h3>Настройки передатчика</h3>
<label>
<span>Включить передатчик</span>
<span class="toggle-input">
<input type="checkbox" v-model="param.general.txEn" />
<span class="slider"></span>
</span>
</label>
<label>
<span>Автоматический запуск передатчика</span>
<span class="toggle-input">
<input type="checkbox" v-model="param.general.autoStartTx" />
<span class="slider"></span>
</span>
</label>
<label>
<span>Режим работы модулятора</span>
<select v-model="param.general.modulatorMode">
<option value="normal">Нормальный</option>
<option value="test">Тест (CW)</option>
</select>
</label>
<label>
<span>Входные данные</span>
<select v-model="param.general.isTestInputData">
<option :value="false">Ethernet</option>
<option :value="true">Тест (CW)</option>
</select>
</label>
<h3>Параметры передачи</h3>
<label>
<span>Центральная частота, КГц</span>
<input v-model="param.tx.centerFreq" type="number" step="0.01"/>
</label>
<label>
<span>Символьная скорость, Бод</span>
<input v-model="param.tx.cymRate" type="number"/>
</label>
<label>
<span>Roll-off</span>
<select v-model="param.tx.rolloff">
<option :value="5">0.05</option>
<option :value="10">0.10</option>
<option :value="15">0.15</option>
<option :value="20">0.20</option>
<option :value="25">0.25</option>
</select>
</label>
<label>
<span>Ослабление, дБ</span>
<input v-model="param.tx.attenuation" type="number" step="0.01"/>
</label>
</div>
<div class="settings-set-container">
<h3>Режим работы DVB-S2</h3>
<label>
<span>Период служебных пакетов, сек</span>
<input v-model="param.dvbs2.servicePacketPeriod" type="number">
</label>
<label>
<span>Режим</span>
<select v-model="param.dvbs2.mode">
<option value="ccm">CCM</option>
<option value="acm">ACM</option>
</select>
</label>
<label>
<span>Размер кадра</span>
<select v-model="param.dvbs2.frameSizeNormal">
<option :value="true">normal</option>
<option :value="false">short</option>
</select>
</label>
<!-- <label>-->
<!-- <span>Пилот-символы</span>-->
<!-- <select v-model="param.dvbs2.isPilots">-->
<!-- <option :value="true">pilots</option>-->
<!-- <option :value="false">no pilots</option>-->
<!-- </select>-->
<!-- </label>-->
<label v-show="param.dvbs2.mode === 'ccm'">
<span>Модуляция</span>
<select v-model="param.dvbs2.ccm_modulation" @change="param.dvbs2.ccm_speed = correctModcodSpeed(param.dvbs2.ccm_modulation, param.dvbs2.ccm_speed)">
<option value="qpsk">QPSK</option>
<option value="8psk">8PSK</option>
<option value="16apsk">16APSK</option>
<option value="32apsk">32APSK</option>
</select>
</label>
<label v-show="param.dvbs2.mode === 'ccm'">
<span>Скорость кода</span>
<select v-model="param.dvbs2.ccm_speed">
<option v-for="speed in getAvailableModcods(param.dvbs2.ccm_modulation)" v-bind:value="speed">{{ speed }}</option>
</select>
</label>
<label v-show="param.dvbs2.mode === 'acm'">
<span>Текущий модкод</span>
<input v-model="stat_rx.modcod" readonly>
</label>
<label v-show="param.dvbs2.mode === 'acm'">
<span>Модуляция (макс. режим)</span>
<select v-model="param.dvbs2.acm_maxModulation" @change="param.dvbs2.acm_maxSpeed = correctModcodSpeed(param.dvbs2.acm_maxModulation, param.dvbs2.acm_maxSpeed)">
<option value="qpsk">QPSK</option>
<option value="8psk">8PSK</option>
<option value="16apsk">16APSK</option>
<option value="32apsk">32APSK</option>
</select>
</label>
<label v-show="param.dvbs2.mode === 'acm'">
<span>Скорость кода (макс. режим)</span>
<select v-model="param.dvbs2.acm_maxSpeed">
<option v-for="speed in getAvailableModcods(param.dvbs2.acm_maxModulation)" v-bind:value="speed">{{ speed }}</option>
</select>
</label>
<label v-show="param.dvbs2.mode === 'acm'">
<span>Модуляция (мин. режим)</span>
<select v-model="param.dvbs2.acm_minModulation" @change="param.dvbs2.acm_minSpeed = correctModcodSpeed(param.dvbs2.acm_minModulation, param.dvbs2.acm_minSpeed)">
<option value="qpsk">QPSK</option>
<option value="8psk">8PSK</option>
<option value="16apsk">16APSK</option>
<option value="32apsk">32APSK</option>
</select>
</label>
<label v-show="param.dvbs2.mode === 'acm'">
<span>Скорость кода (мин. режим)</span>
<select v-model="param.dvbs2.acm_minSpeed">
<option v-for="speed in getAvailableModcods(param.dvbs2.acm_minModulation)" v-bind:value="speed">{{ speed }}</option>
</select>
</label>
<label v-show="param.dvbs2.mode === 'acm'">
<span>Запас ОСШ</span>
<input v-model="param.dvbs2.snrReserve" type="number" step="0.01">
</label>
<h3>Авто-регулировка мощности</h3>
<label>
<span>Авто-регулировка мощности</span>
<span class="toggle-input">
<input type="checkbox" v-model="param.acm.en" />
<span class="slider"></span>
</span>
</label>
<label>
<span>Максимальное ослабление</span>
<input v-model="param.acm.maxAttenuation" type="number" step="0.01"/>
</label>
<label>
<span>Минимальное ослабление</span>
<input v-model="param.acm.minAttenuation" type="number" step="0.01"/>
</label>
<label>
<span>Требуемое ОСШ</span>
<input v-model="param.acm.requiredSnr" type="number" step="0.01"/>
</label>
</div>
<div class="settings-set-container">
<h3>Настройка приемника</h3>
<label>
<span>Режим управления усилением</span>
<select v-model="param.rx.gainMode">
<option value="auto">АРУ</option>
<option value="manual">РРУ</option>
</select>
</label>
<label v-show="param.rx.gainMode === 'manual'">
<span>Усиление, dB</span>
<input v-model="param.rx.manualGain" type="number"/>
</label>
<label>
<span>Инверсия спектра</span>
<span class="toggle-input">
<input type="checkbox" v-model="param.rx.spectrumInversion" />
<span class="slider"></span>
</span>
</label>
<label>
<span>Центральная частота, кГц</span>
<input v-model="param.rx.centerFreq" type="number" step="0.01"/>
</label>
<label>
<span>Символьная скорость, Бод</span>
<input v-model="param.rx.cymRate" type="number"/>
</label>
<label>
<span>Roll-off</span>
<select v-model="param.rx.rolloff">
<option :value="5">0.05</option>
<option :value="10">0.10</option>
<option :value="15">0.15</option>
<option :value="20">0.20</option>
<option :value="25">0.25</option>
</select>
</label>
</div>
</div>
<button class="action-button" @click="settingsSubmitRxTx()">Сохранить <span class="submit-spinner" v-show="submitStatus.rxTx"></span></button>
<h2 v-show="param.general.isCinC === true">Настройки режима CinC</h2>
<div v-show="param.general.isCinC === true" class="settings-set-container">
<label>
<span>Метод расчета задержки</span>
<select v-model="param.cinc.mode">
<option value="positional">Позиционированием</option>
<option value="delay">Окном задержки</option>
</select>
</label>
<h3 v-show="param.cinc.mode === 'positional'">Настройки позиционирования</h3>
<label v-show="param.cinc.mode === 'positional'">
<span>Широта станции</span>
<input v-model="param.cinc.position.station.latitude" type="number" step="0.000001"/>
</label>
<label v-show="param.cinc.mode === 'positional'">
<span>Долгота станции</span>
<input v-model="param.cinc.position.station.longitude" type="number" step="0.000001"/>
</label>
<label v-show="param.cinc.mode === 'positional'">
<span>Подспутниковая точка</span>
<input v-model="param.cinc.position.satelliteLongitude" type="number" step="0.000001"/>
</label>
<h3 v-show="param.cinc.mode === 'delay'">Задержка до спутника</h3>
<label v-show="param.cinc.mode === 'delay'">
<span>от, мс</span>
<input v-model="param.cinc.delayMin" type="number"/>
</label>
<label v-show="param.cinc.mode === 'delay'">
<span>до, мс</span>
<input v-model="param.cinc.delayMax" type="number"/>
</label>
</div>
<button class="action-button" v-show="param.general.isCinC" @click="settingsSubmitCinC()" type="submit">Сохранить <span class="submit-spinner" v-show="submitStatus.cinc"></span></button>
<h2>Настройки питания и опорного генератора</h2>
<div class="tabs-item-flex-container">
<div class="settings-set-container">
<h3>Настройки BUC</h3>
<label>
<span>Подача опоры 10МГц</span>
<span class="toggle-input">
<input type="checkbox" v-model="param.buc.refClk10M" />
<span class="slider"></span>
</span>
</label>
<label>
<span>Питание BUC</span>
<select v-model="param.buc.powering">
<option value="0">выкл</option>
<option value="24">24В</option>
<option value="48">48В</option>
</select>
</label>
</div>
<div class="settings-set-container">
<h3>Настройки LNB</h3>
<label>
<span>Подача опоры 10МГц</span>
<span class="toggle-input">
<input type="checkbox" v-model="param.lnb.refClk10M" />
<span class="slider"></span>
</span>
</label>
<label>
<span>Питание LNB</span>
<select v-model="param.lnb.powering">
<option value="0">выкл</option>
<option value="13">13В</option>
<option value="18">18В</option>
<option value="24">24В</option>
</select>
</label>
</div>
<div class="settings-set-container">
<h3>Сервисные настройки</h3>
<label>
<span>Подача опоры 10МГц на 'Выход 10МГц'</span>
<span class="toggle-input">
<input type="checkbox" v-model="param.serviceSettings.refClk10M" />
<span class="slider"></span>
</span>
</label>
<label>
<span>Автозапуск BUC и LNB при включении</span>
<span class="toggle-input">
<input type="checkbox" v-model="param.serviceSettings.autoStart" />
<span class="slider"></span>
</span>
</label>
</div>
</div>
<button class="action-button" @click="settingsSubmitBucLnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.bucLnb"></span></button> <button class="action-button" @click="settingsSubmitBucLnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.bucLnb"></span></button>
{% endif %}
{% endfor %}
</div> </div>

View File

@ -0,0 +1,41 @@
{% macro build_widget_checkbox(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
<span>{{ widget.label }}</span>
<span class="toggle-input">
<input type="checkbox" v-model="param{{ param_group | title }}.{{ widget.name }}" />
<span class="slider"></span>
</span>
</label>{% endmacro %}
{% macro build_widget_number(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
</label>{% endmacro %}
{% macro build_widget_select(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
<span>{{ widget.label }}</span>
<select v-model="param{{ param_group | title }}.{{ widget.name }}">
{% for opt in widget['values'] %}
<option :value="{{ opt.value }}">{{ opt.label }}</option>
{% endfor %}
</select>
</label>{% endmacro %}
{% macro build_widget_flex_container(param_group, widget) %}<div class="tabs-item-flex-container"{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
{% for w in widget.childs %}{{ build_widget(param_group, w) }}{% endfor %}
</div>
{% endmacro %}
{% macro build_widget_settings_container(param_group, widget) %}<div class="settings-set-container"{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
{% for w in widget.childs %}{{ build_widget(param_group, w) }}{% endfor %}
</div>
{% endmacro %}
{% macro build_widget(param_group, widget) %}{% if widget.widget == 'flex-container' %}{{ build_widget_flex_container(param_group, widget) }}
{% elif widget.widget == 'settings-container' %}{{ build_widget_settings_container(param_group, widget) }}
{% elif widget.widget == 'h2' %}<h2{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>{{ widget.label }}</h2>
{% elif widget.widget == 'h3' %}<h3{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>{{ widget.label }}</h3>
{% elif widget.widget == 'checkbox' %}{{ build_widget_checkbox(param_group, widget) }}
{% elif widget.widget == 'number' %}{{ build_widget_number(param_group, widget) }}
{% elif widget.widget == 'select' %}{{ build_widget_select(param_group, widget) }}
{% else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>
{% endif %}
{% endmacro %}

View File

@ -74,7 +74,7 @@
// false - означает что статистика не отправляется, true - отправляется // false - означает что статистика не отправляется, true - отправляется
submitStatus: { submitStatus: {
{% for pg in params.groupsList %} {% for pg in params.paramGroupsList %}
{{ pg }}: false, {{ pg }}: false,
{% endfor %} {% endfor %}
firmwareUpload: false, firmwareUpload: false,
@ -141,7 +141,7 @@
let d = await fetch("/api/get/settings") let d = await fetch("/api/get/settings")
let vals = await d.json() let vals = await d.json()
this.settingFetchComplete = true this.settingFetchComplete = true
{% for pg in params.groupsList %} {% for pg in params.paramGroupsList %}
this.update{{ pg | capitalize }}Settings(vals) this.update{{ pg | capitalize }}Settings(vals)
{% endfor %} {% endfor %}
} }

View File

@ -45,6 +45,7 @@
<div class="tabs-header"> <div class="tabs-header">
<span style="font-weight:bold">RCSM-101</span> <span style="font-weight:bold">RCSM-101</span>
<a href="#monitoring" class="tabs-btn" @click="activeTab = 'monitoring'" :class="{ active: activeTab === 'monitoring' }">Мониторинг</a> <a href="#monitoring" class="tabs-btn" @click="activeTab = 'monitoring'" :class="{ active: activeTab === 'monitoring' }">Мониторинг</a>
<a href="#setup" class="tabs-btn" @click="activeTab = 'setup'" :class="{ active: activeTab === 'setup' }">Настройки</a>
<a href="#qos" class="tabs-btn" @click="activeTab = 'qos'" :class="{ active: activeTab === 'qos' }">QoS</a> <a href="#qos" class="tabs-btn" @click="activeTab = 'qos'" :class="{ active: activeTab === 'qos' }">QoS</a>
<a href="/logout" class="tabs-btn">Выход</a> <a href="/logout" class="tabs-btn">Выход</a>
</div> </div>
@ -121,7 +122,34 @@
</table> </table>
</div> </div>
</div> </div>
<div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete">
<h2>Настройки приема/передачи</h2>
<div class="settings-set-container">
<label>
<span>Режим работы</span>
<select v-model="paramRxtx.isCinC">
<option :value="true">CinC</option>
<option :value="false">SCPC</option>
</select>
</label>
</div>
<div class="tabs-item-flex-container">
<div class="settings-set-container">
<h3>Настройки приема/передачи</h3>
<label>
<span>Режим работы</span>
<select v-model="paramRxtx.isCinC">
<option :value="true">CinC</option>
<option :value="false">SCPC</option>
</select>
</label>
</div>
</div>
<button class="action-button" @click="settingsSubmitBucLnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.bucLnb"></span></button>
</div>
<div class="tabs-body-item" v-if="activeTab === 'qos' && settingFetchComplete"> <div class="tabs-body-item" v-if="activeTab === 'qos' && settingFetchComplete">
<h2>Настройки QoS</h2> <h2>Настройки QoS</h2>
<div class="settings-set-container"> <div class="settings-set-container">
@ -224,26 +252,12 @@
<button class="action-button" @click="settingsSubmitQoS()">Применить <span class="submit-spinner" v-show="submitStatus.qos"></span></button> <button class="action-button" @click="settingsSubmitQoS()">Применить <span class="submit-spinner" v-show="submitStatus.qos"></span></button>
<h2>Настройки TCP-акселерации</h2>
<div class="settings-set-container">
<label>
<span>Активировать акселерацию</span>
<span class="toggle-input"><input type="checkbox" v-model="paramsTcpAccel.en" /><span class="slider"></span></span>
</label>
<label>
<span>Максимальное количество соединений</span>
<input type="number" v-model="paramsTcpAccel.maxConnections" min="1" max="10000" />
</label>
</div>
<button class="action-button" @click="settingsSubmitTcpAccel()">Применить <span class="submit-spinner" v-show="submitStatus.tcpAccel"></span></button>
</div>
<p>Последнее обновление статистики: {{ lastUpdateTime }}</p> <p>Последнее обновление статистики: {{ lastUpdateTime }}</p>
</div> </div>
</div> </div>
<script src="/js/vue.js"></script> <script src="/js/vue.js"></script>
<script> <script>
const availableTabs = ['monitoring', 'qos'] const availableTabs = ['monitoring', 'setup', 'qos']
// default-js.js // default-js.js
// для обновления высоты хидера // для обновления высоты хидера
@ -393,8 +407,6 @@
// false - означает что статистика не отправляется, true - отправляется // false - означает что статистика не отправляется, true - отправляется
submitStatus: { submitStatus: {
qos: false,
tcpaccel: false,
firmwareUpload: false, firmwareUpload: false,
firmwareUpgrade: false, firmwareUpgrade: false,
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю // когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
@ -444,6 +456,9 @@
statOs: {uptime: '?'}, statOs: {uptime: '?'},
// ========== include end from 'common/monitoring-data.js.j2' // ========== include end from 'common/monitoring-data.js.j2'
// ========== include from 'common/setup-data.js.j2'
// ========== include end from 'common/setup-data.js.j2'
// ========== include from 'common/qos-data.js.j2' // ========== include from 'common/qos-data.js.j2'
paramsQos: { paramsQos: {
en: false, en: false,
@ -452,10 +467,6 @@
rt3: [], rt3: [],
cd: [], cd: [],
}, },
paramsTcpAccel: {
en: false,
maxConnections: 128
},
// ========== include end from 'common/qos-data.js.j2' // ========== include end from 'common/qos-data.js.j2'
uploadFw: { uploadFw: {
@ -571,6 +582,97 @@
}) })
}, // ========== include end from 'common/monitoring-methods.js.j2' }, // ========== include end from 'common/monitoring-methods.js.j2'
// ========== include from 'common/setup-methods.js.j2'
settingsSubmitCinC() {
if (this.submitStatus.cinc) { return }
let query = {
"cinc.mode": this.param.cinc.mode,
"cinc.searchBandwidth": this.param.cinc.searchBandwidth,
"cinc.position.station.latitude": this.param.cinc.position.station.latitude,
"cinc.position.station.longitude": this.param.cinc.position.station.longitude,
"cinc.position.satelliteLongitude": this.param.cinc.position.satelliteLongitude,
"cinc.delayMin": this.param.cinc.delayMin,
"cinc.delayMax": this.param.cinc.delayMax
}
this.submitStatus.cinc = true
fetch('/api/set/cinc', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(query)
}).then(async (resp) => {
this.submitStatus.cinc = false
this.updateCincSettings(await resp.json())
}).catch((reason) => {
this.submitStatus.cinc = false
alert(`Ошибка при применении настроек: ${reason}`)
})
},
settingsSubmitBucLnb() {
if (this.submitStatus.bucLnb) { return }
let query = {
"buc.refClk10M": this.param.buc.refClk10M,
"buc.powering": parseInt(this.param.buc.powering),
"lnb.refClk10M": this.param.lnb.refClk10M,
"lnb.powering": parseInt(this.param.lnb.powering),
"serviceSettings.refClk10M": this.param.serviceSettings.refClk10M,
"serviceSettings.autoStart": this.param.serviceSettings.autoStart
}
if (confirm('Вы уверены, что хотите сохранить настройки BUC и LNB?')) {
this.submitStatus.bucLnb = true
fetch('/api/set/bucLnb', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(query)
}).then(async (resp) => {
this.submitStatus.bucLnb = false
this.updateBucLnbSettings(await resp.json())
}).catch((reason) => {
this.submitStatus.bucLnb = false
alert(`Ошибка при применении настроек: ${reason}`)
})
}
},
updateCincSettings(vals) {
this.submitStatus.cinc = false
this.param.cinc.mode = vals["settings"]["cinc.mode"]
this.param.cinc.searchBandwidth = vals["settings"]["cinc.searchBandwidth"]
this.param.cinc.position.station.latitude = vals["settings"]["cinc.position.station.latitude"]
this.param.cinc.position.station.longitude = vals["settings"]["cinc.position.station.longitude"]
this.param.cinc.position.satelliteLongitude = vals["settings"]["cinc.position.satelliteLongitude"]
this.param.cinc.delayMin = vals["settings"]["cinc.delayMin"]
this.param.cinc.delayMax = vals["settings"]["cinc.delayMax"]
},
updateBucLnbSettings(vals) {
this.submitStatus.bucLnb = false
this.param.buc.refClk10M = vals["settings"]["buc.refClk10M"]
this.param.buc.powering = vals["settings"]["buc.powering"]
this.param.lnb.refClk10M = vals["settings"]["lnb.refClk10M"]
this.param.lnb.powering = vals["settings"]["lnb.powering"]
this.param.serviceSettings.refClk10M = vals["settings"]["serviceSettings.refClk10M"]
this.param.serviceSettings.autoStart = vals["settings"]["serviceSettings.autoStart"]
},
updateSettings(vals) {
this.settingFetchComplete = true
this.updateRxTxSettings(vals)
this.updateCincSettings(vals)
this.updateBucLnbSettings(vals)
this.updateQosSettings(vals)
this.updateNetworkSettings(vals)
this.updateDebugSendSettings(vals)
}, // ========== include end from 'common/setup-methods.js.j2'
// ========== include from 'common/qos-methods.js.j2' // ========== include from 'common/qos-methods.js.j2'
settingsSubmitQoS() { settingsSubmitQoS() {
if (this.submitStatus.qos) { return } if (this.submitStatus.qos) { return }
@ -644,27 +746,6 @@
}) })
}, },
settingsSubmitTcpAccel() {
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}`)
})
},
updateQosSettings(vals) { updateQosSettings(vals) {
this.submitStatus.qos = false this.submitStatus.qos = false
this.paramsQos.en = vals["settings"]["qos.enabled"] this.paramsQos.en = vals["settings"]["qos.enabled"]
@ -812,7 +893,8 @@
} }
return result return result
}, // ========== include end from 'common/qos-methods.js.j2' },
// ========== include end from 'common/qos-methods.js.j2'
performUpdateSettings() { performUpdateSettings() {
@ -820,8 +902,6 @@
let d = await fetch("/api/get/settings") let d = await fetch("/api/get/settings")
let vals = await d.json() let vals = await d.json()
this.settingFetchComplete = true this.settingFetchComplete = true
this.updateQosSettings(vals)
this.updateTcpaccelSettings(vals)
} }
doFetchSettings().then(() => {}) doFetchSettings().then(() => {})

View File

@ -45,6 +45,7 @@
<div class="tabs-header"> <div class="tabs-header">
<span style="font-weight:bold">RCSM-101 TDMA</span> <span style="font-weight:bold">RCSM-101 TDMA</span>
<a href="#monitoring" class="tabs-btn" @click="activeTab = 'monitoring'" :class="{ active: activeTab === 'monitoring' }">Мониторинг</a> <a href="#monitoring" class="tabs-btn" @click="activeTab = 'monitoring'" :class="{ active: activeTab === 'monitoring' }">Мониторинг</a>
<a href="#setup" class="tabs-btn" @click="activeTab = 'setup'" :class="{ active: activeTab === 'setup' }">Настройки</a>
<a href="#admin" class="tabs-btn" @click="activeTab = 'admin'" :class="{ active: activeTab === 'admin' }">Администрирование</a> <a href="#admin" class="tabs-btn" @click="activeTab = 'admin'" :class="{ active: activeTab === 'admin' }">Администрирование</a>
<a href="/logout" class="tabs-btn">Выход</a> <a href="/logout" class="tabs-btn">Выход</a>
</div> </div>
@ -108,7 +109,49 @@
</table> </table>
</div> </div>
</div> </div>
<div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete">
<h2>Настройки приема/передачи</h2>
<div class="tabs-item-flex-container">
<div class="settings-set-container">
<h3>Настройки передатчика</h3>
<label>
<span>Включить передатчик</span>
<span class="toggle-input">
<input type="checkbox" v-model="paramRxtx.txEn" />
<span class="slider"></span>
</span>
</label>
<label>
<span>Входные данные</span>
<select v-model="paramRxtx.txIsTestInput">
<option :value="true">Тест</option>
<option :value="false">SCPC</option>
</select>
</label>
</div>
<div class="settings-set-container">
<h3>Настройки приемника</h3>
<label>
<span>Режим управления усилением</span>
<select v-model="paramRxtx.rxAgcEn">
<option :value="true">АРУ</option>
<option :value="false">РРУ</option>
</select>
</label>
<label>
<span>Инверсия спектра</span>
<span class="toggle-input">
<input type="checkbox" v-model="paramRxtx.rxSpectrumInversion" />
<span class="slider"></span>
</span>
</label>
</div>
</div>
<button class="action-button" @click="settingsSubmitBucLnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.bucLnb"></span></button>
</div>
<div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete"> <div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete">
<h2>Настройки сети</h2> <h2>Настройки сети</h2>
<div class="settings-set-container"> <div class="settings-set-container">
@ -200,7 +243,7 @@
</div> </div>
<script src="/js/vue.js"></script> <script src="/js/vue.js"></script>
<script> <script>
const availableTabs = ['monitoring', 'admin'] const availableTabs = ['monitoring', 'setup', 'admin']
// default-js.js // default-js.js
// для обновления высоты хидера // для обновления высоты хидера
@ -391,6 +434,9 @@
statOs: {uptime: '?'}, statOs: {uptime: '?'},
// ========== include end from 'common/monitoring-data.js.j2' // ========== include end from 'common/monitoring-data.js.j2'
// ========== include from 'common/setup-data.js.j2'
// ========== include end from 'common/setup-data.js.j2'
// ========== include from 'common/admin-data.js.j2' // ========== include from 'common/admin-data.js.j2'
// ========== include end from 'common/admin-data.js.j2' // ========== include end from 'common/admin-data.js.j2'
@ -498,6 +544,97 @@
}) })
}, // ========== include end from 'common/monitoring-methods.js.j2' }, // ========== include end from 'common/monitoring-methods.js.j2'
// ========== include from 'common/setup-methods.js.j2'
settingsSubmitCinC() {
if (this.submitStatus.cinc) { return }
let query = {
"cinc.mode": this.param.cinc.mode,
"cinc.searchBandwidth": this.param.cinc.searchBandwidth,
"cinc.position.station.latitude": this.param.cinc.position.station.latitude,
"cinc.position.station.longitude": this.param.cinc.position.station.longitude,
"cinc.position.satelliteLongitude": this.param.cinc.position.satelliteLongitude,
"cinc.delayMin": this.param.cinc.delayMin,
"cinc.delayMax": this.param.cinc.delayMax
}
this.submitStatus.cinc = true
fetch('/api/set/cinc', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(query)
}).then(async (resp) => {
this.submitStatus.cinc = false
this.updateCincSettings(await resp.json())
}).catch((reason) => {
this.submitStatus.cinc = false
alert(`Ошибка при применении настроек: ${reason}`)
})
},
settingsSubmitBucLnb() {
if (this.submitStatus.bucLnb) { return }
let query = {
"buc.refClk10M": this.param.buc.refClk10M,
"buc.powering": parseInt(this.param.buc.powering),
"lnb.refClk10M": this.param.lnb.refClk10M,
"lnb.powering": parseInt(this.param.lnb.powering),
"serviceSettings.refClk10M": this.param.serviceSettings.refClk10M,
"serviceSettings.autoStart": this.param.serviceSettings.autoStart
}
if (confirm('Вы уверены, что хотите сохранить настройки BUC и LNB?')) {
this.submitStatus.bucLnb = true
fetch('/api/set/bucLnb', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(query)
}).then(async (resp) => {
this.submitStatus.bucLnb = false
this.updateBucLnbSettings(await resp.json())
}).catch((reason) => {
this.submitStatus.bucLnb = false
alert(`Ошибка при применении настроек: ${reason}`)
})
}
},
updateCincSettings(vals) {
this.submitStatus.cinc = false
this.param.cinc.mode = vals["settings"]["cinc.mode"]
this.param.cinc.searchBandwidth = vals["settings"]["cinc.searchBandwidth"]
this.param.cinc.position.station.latitude = vals["settings"]["cinc.position.station.latitude"]
this.param.cinc.position.station.longitude = vals["settings"]["cinc.position.station.longitude"]
this.param.cinc.position.satelliteLongitude = vals["settings"]["cinc.position.satelliteLongitude"]
this.param.cinc.delayMin = vals["settings"]["cinc.delayMin"]
this.param.cinc.delayMax = vals["settings"]["cinc.delayMax"]
},
updateBucLnbSettings(vals) {
this.submitStatus.bucLnb = false
this.param.buc.refClk10M = vals["settings"]["buc.refClk10M"]
this.param.buc.powering = vals["settings"]["buc.powering"]
this.param.lnb.refClk10M = vals["settings"]["lnb.refClk10M"]
this.param.lnb.powering = vals["settings"]["lnb.powering"]
this.param.serviceSettings.refClk10M = vals["settings"]["serviceSettings.refClk10M"]
this.param.serviceSettings.autoStart = vals["settings"]["serviceSettings.autoStart"]
},
updateSettings(vals) {
this.settingFetchComplete = true
this.updateRxTxSettings(vals)
this.updateCincSettings(vals)
this.updateBucLnbSettings(vals)
this.updateQosSettings(vals)
this.updateNetworkSettings(vals)
this.updateDebugSendSettings(vals)
}, // ========== include end from 'common/setup-methods.js.j2'
// ========== include from 'common/admin-methods.js.j2' // ========== include from 'common/admin-methods.js.j2'
settingsSubmitNetwork() { settingsSubmitNetwork() {
if (this.submitStatus.network) { return } if (this.submitStatus.network) { return }