Compare commits
No commits in common. "456faedf7d2f2508c1e397b57ca5d423819c9960" and "a7242c186dc7d95d34bfd6453e015019be3628ba" have entirely different histories.
456faedf7d
...
a7242c186d
@ -1,32 +1,41 @@
|
|||||||
{
|
{
|
||||||
|
"monitoring-params": {},
|
||||||
"modem_types": {
|
"modem_types": {
|
||||||
"tdma": {
|
"tdma": {
|
||||||
"modem_name": "RCSM-101 TDMA",
|
"modem_name": "RCSM-101 TDMA",
|
||||||
"dangerousParamGroups": {
|
|
||||||
"buclnb": "Применение неправильных настроек может вывести из строя оборудование! Продолжить?",
|
|
||||||
"network": "Применение этих настроек может сделать модем недоступным! Продолжить?"
|
|
||||||
},
|
|
||||||
"params": {
|
"params": {
|
||||||
"rxtx": [
|
"rxtx": [
|
||||||
{"widget": "h2", "label": "Настройки приема/передачи"},
|
{
|
||||||
|
"widget": "h2",
|
||||||
|
"label": "Настройки приема/передачи"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"widget": "flex-container",
|
"widget": "flex-container",
|
||||||
"childs": [
|
"childs": [
|
||||||
{
|
{
|
||||||
"widget": "settings-container",
|
"widget": "settings-container",
|
||||||
"childs": [
|
"childs": [
|
||||||
{"widget": "h3", "label": "Настройки передатчика"},
|
{ "widget": "h3", "label": "Настройки передатчика" },
|
||||||
{"widget": "checkbox", "label": "Включить передатчик", "name": "txEn"},
|
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Входные данные", "name": "txIsTestInput",
|
"widget": "checkbox",
|
||||||
"values": [
|
"label": "Включить передатчик",
|
||||||
{"label": "SCPC", "value": "false"},
|
"name": "txEn"
|
||||||
{"label": "Тест", "value": "true"}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{"widget": "number", "label": "Центральная частота, КГц", "name": "txCentralFreq", "min": 900000, "step": 0.01, "v_show": "paramRxrx.txIsTestInput"},
|
{
|
||||||
{"widget": "number", "label": "Символьная скорость, Бод", "name": "txBaudrate", "min": 0, "step": 1, "v_show": "paramRxrx.txIsTestInput"},
|
"widget": "select",
|
||||||
{"widget": "number", "label": "Ослабление, дБ", "name": "txAttenuation", "min": 0, "step": 1}
|
"label": "Входные данные",
|
||||||
|
"name": "txIsTestInput",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"label": "Тест",
|
||||||
|
"value": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "SCPC",
|
||||||
|
"value": "false"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -34,303 +43,115 @@
|
|||||||
"childs": [
|
"childs": [
|
||||||
{ "widget": "h3", "label": "Настройки приемника" },
|
{ "widget": "h3", "label": "Настройки приемника" },
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Режим управления усилением", "name": "rxAgcEn",
|
"widget": "select",
|
||||||
|
"label": "Режим управления усилением",
|
||||||
|
"name": "rxAgcEn",
|
||||||
"values": [
|
"values": [
|
||||||
{"label": "АРУ", "value": "true"},
|
{
|
||||||
{"label": "РРУ", "value": "false"}
|
"label": "АРУ",
|
||||||
|
"value": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "РРУ",
|
||||||
|
"value": "false"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{"widget": "number", "label": "Ручное усиление, дБ", "name": "rxManualGain", "v_show": "!paramRxtx.rxAgcEn", "min": -40},
|
|
||||||
{"widget": "checkbox", "label": "Инверсия спектра", "name": "rxSpectrumInversion"},
|
|
||||||
{"widget": "number", "label": "Центральная частота, КГц", "name": "rxCentralFreq", "min": 900000, "step": 0.01},
|
|
||||||
{"widget": "number", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 0, "step": 1},
|
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Roll-off", "name": "rxRolloff",
|
"widget": "checkbox",
|
||||||
"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"}]
|
"label": "Инверсия спектра",
|
||||||
|
"name": "rxSpectrumInversion"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"buclnb": [
|
|
||||||
{"widget": "h2", "label": "Настройки питания и опорного генератора"},
|
|
||||||
{
|
|
||||||
"widget": "flex-container",
|
|
||||||
"childs": [
|
|
||||||
{
|
|
||||||
"widget": "settings-container",
|
|
||||||
"childs": [
|
|
||||||
{"widget": "h3", "label": "Настройки BUC"},
|
|
||||||
{"widget": "checkbox", "label": "Подача опоры 10МГц", "name": "bucRefClk10M"},
|
|
||||||
{
|
|
||||||
"widget": "select", "label": "Питание BUC", "name": "bucPowering",
|
|
||||||
"values": [
|
|
||||||
{"label": "Выкл", "value": "0"},
|
|
||||||
{"label": "24В", "value": "24"}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"widget": "settings-container",
|
|
||||||
"childs": [
|
|
||||||
{"widget": "h3", "label": "Настройки LNB"},
|
|
||||||
{"widget": "checkbox", "label": "Подача опоры 10МГц", "name": "lnbRefClk10M"},
|
|
||||||
{
|
|
||||||
"widget": "select", "label": "Питание LNB", "name": "lnbPowering",
|
|
||||||
"values": [
|
|
||||||
{"label": "Выкл", "value": "0"},
|
|
||||||
{"label": "13В", "value": "13"},
|
|
||||||
{"label": "18В", "value": "18"},
|
|
||||||
{"label": "24В", "value": "24"}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"widget": "settings-container",
|
|
||||||
"childs": [
|
|
||||||
{"widget": "h3", "label": "Сервисные настройки"},
|
|
||||||
{"widget": "checkbox", "label": "Подача опоры 10МГц на 'Выход 10МГц'", "name": "srvRefClk10M"},
|
|
||||||
{"widget": "checkbox", "label": "Автозапуск BUC и LNB при включении", "name": "bucLnbAutoStart"}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"network": [
|
|
||||||
{"widget": "h2", "label": "Настройки сети"},
|
|
||||||
{
|
|
||||||
"widget": "settings-container",
|
|
||||||
"childs": [
|
|
||||||
{"widget": "h3", "label": "Настройки интерфейса управления"},
|
|
||||||
{"widget": "ip-address", "label": "Интерфейс управления (/24)", "name": "netManagementIp"},
|
|
||||||
{
|
|
||||||
"widget": "select", "label": "Режим сети", "name": "netIsL2",
|
|
||||||
"values": [{"label": "Маршрутизатор", "value": "false"}, {"label": "Коммутатор", "value": "true"}]
|
|
||||||
},
|
|
||||||
{"widget": "ip-address", "label": "Интерфейс данных (/24)", "name": "netDataIp", "v_show": "paramNetwork.netIsL2 === false"},
|
|
||||||
{"widget": "number", "label": "MTU интерфейса данных", "name": "netDataMtu", "min": 1500, "step": 1, "max": 2000}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"tabs": [
|
"tabs": [
|
||||||
{"name": "monitoring", "desc": "Мониторинг"},
|
{
|
||||||
{"name": "setup", "desc": "Настройки"},
|
"name": "monitoring",
|
||||||
{"name": "admin", "desc": "Администрирование"}
|
"desc": "Мониторинг"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "setup",
|
||||||
|
"desc": "Настройки"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "admin",
|
||||||
|
"desc": "Администрирование"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"scpc": {
|
"scpc": {
|
||||||
"modem_name": "RCSM-101",
|
"modem_name": "RCSM-101",
|
||||||
"dangerousParamGroups": {
|
|
||||||
"buclnb": "Применение неправильных настроек может вывести из строя оборудование! Продолжить?",
|
|
||||||
"network": "Применение этих настроек может сделать модем недоступным! Продолжить?"
|
|
||||||
},
|
|
||||||
"params": {
|
"params": {
|
||||||
"rxtx": [
|
"rxtx": [
|
||||||
{"widget": "h2", "label": "Настройки приема/передачи"},
|
{
|
||||||
|
"widget": "h2",
|
||||||
|
"label": "Настройки приема/передачи"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"widget": "settings-container",
|
"widget": "settings-container",
|
||||||
"childs": [
|
"childs": [
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Режим работы", "name": "isCinC",
|
"widget": "select",
|
||||||
"values": [{"label": "SCPC", "value": "false"}, {"label": "CinC", "value": "true"}]
|
"label": "Режим работы",
|
||||||
}
|
"name": "isCinC",
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"widget": "flex-container",
|
|
||||||
"childs": [
|
|
||||||
{
|
|
||||||
"widget": "settings-container",
|
|
||||||
"childs": [
|
|
||||||
{"widget": "h3", "label": "Настройки передатчика"},
|
|
||||||
{"widget": "checkbox", "label": "Включить передатчик", "name": "txEn"},
|
|
||||||
{"widget": "checkbox", "label": "Автоматический запуск передатчика", "name": "txAutoStart"},
|
|
||||||
{
|
|
||||||
"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": 0.01},
|
|
||||||
{"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": "select", "label": "Номер последовательности Голда", "name": "txGoldan",
|
|
||||||
"values": [{"label": "0", "value": "0"}, {"label": "1", "value": "1"}]
|
|
||||||
},
|
|
||||||
{"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": "aupcEn"},
|
|
||||||
{"widget": "number", "label": "Минимальное ослабление, дБ", "name": "aupcMinAttenuation", "min": 0, "step": 0.01, "max": 10},
|
|
||||||
{"widget": "number", "label": "Максимальное ослабление, дБ", "name": "aupcMaxAttenuation", "min": 0, "step": 0.01, "max": 10},
|
|
||||||
{"widget": "number", "label": "Требуемое ОСШ", "name": "aupcRequiredSnr", "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": 0.01},
|
|
||||||
{"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"}]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"widget": "select", "label": "Номер последовательности Голда", "name": "rxGoldan",
|
|
||||||
"values": [{"label": "0", "value": "0"}, {"label": "1", "value": "1"}]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"cinc": [
|
|
||||||
{"widget": "h2", "label": "Настройки режима CinC", "v_show": "paramRxtx.isCinC"},
|
|
||||||
{
|
|
||||||
"widget": "settings-container", "v_show": "paramRxtx.isCinC",
|
|
||||||
"childs": [
|
|
||||||
{
|
|
||||||
"widget": "select", "label": "Метод расчета задержки", "name": "cincIsPositional",
|
|
||||||
"values": [
|
"values": [
|
||||||
{"label": "Позиционированием", "value": "true"},
|
{
|
||||||
{"label": "Окном задержки", "value": "false"}
|
"label": "CinC",
|
||||||
|
"value": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "SCPC",
|
||||||
|
"value": "false"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
{"widget": "number", "label": "Полоса поиска, КГц ±", "name": "cincSearchBandwidth", "min": 0, "step": 1, "max": 100},
|
]
|
||||||
{"widget": "h2", "label": "Настройки позиционирования", "v_show": "paramCinc.cincIsPositional === true"},
|
|
||||||
{"widget": "number", "label": "Широта станции", "name": "cincPositionStationLatitude", "v_show": "paramCinc.cincIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
|
||||||
{"widget": "number", "label": "Долгота станции", "name": "cincPositionStationLongitude", "v_show": "paramCinc.cincIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
|
||||||
{"widget": "number", "label": "Подспутниковая точка", "name": "cincPositionSatelliteLongitude", "v_show": "paramCinc.cincIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
|
||||||
{"widget": "h2", "label": "Задержка до спутника", "v_show": "paramCinc.cincIsPositional === false"},
|
|
||||||
{"widget": "number", "label": "от, мс", "name": "cincDelayMin", "v_show": "paramCinc.cincIsPositional === false", "min": 0, "step": 0.1, "max": 400},
|
|
||||||
{"widget": "number", "label": "до, мс", "name": "cincDelayMax", "v_show": "paramCinc.cincIsPositional === false", "min": 0, "step": 0.1, "max": 400}]
|
|
||||||
},
|
},
|
||||||
{"widget": "submit", "v_show": "paramRxtx.isCinC"}
|
|
||||||
],
|
|
||||||
"buclnb": [
|
|
||||||
{"widget": "h2", "label": "Настройки питания и опорного генератора"},
|
|
||||||
{
|
{
|
||||||
"widget": "flex-container",
|
"widget": "flex-container",
|
||||||
"childs": [
|
"childs": [
|
||||||
{
|
{
|
||||||
"widget": "settings-container",
|
"widget": "settings-container",
|
||||||
"childs": [
|
"childs": [
|
||||||
{"widget": "h3", "label": "Настройки BUC"},
|
{ "widget": "h3", "label": "Настройки приема/передачи" },
|
||||||
{"widget": "checkbox", "label": "Подача опоры 10МГц", "name": "bucRefClk10M"},
|
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Питание BUC", "name": "bucPowering",
|
"widget": "select",
|
||||||
|
"label": "Режим работы",
|
||||||
|
"name": "isCinC",
|
||||||
"values": [
|
"values": [
|
||||||
{"label": "Выкл", "value": "0"},
|
{
|
||||||
{"label": "24В", "value": "24"},
|
"label": "CinC",
|
||||||
{"label": "48В", "value": "48"}
|
"value": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "SCPC",
|
||||||
|
"value": "false"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"widget": "settings-container",
|
|
||||||
"childs": [
|
|
||||||
{"widget": "h3", "label": "Настройки LNB"},
|
|
||||||
{"widget": "checkbox", "label": "Подача опоры 10МГц", "name": "lnbRefClk10M"},
|
|
||||||
{
|
|
||||||
"widget": "select", "label": "Питание LNB", "name": "lnbPowering",
|
|
||||||
"values": [
|
|
||||||
{"label": "Выкл", "value": "0"},
|
|
||||||
{"label": "13В", "value": "13"},
|
|
||||||
{"label": "18В", "value": "18"},
|
|
||||||
{"label": "24В", "value": "24"}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"widget": "settings-container",
|
|
||||||
"childs": [
|
|
||||||
{"widget": "h3", "label": "Сервисные настройки"},
|
|
||||||
{"widget": "checkbox", "label": "Подача опоры 10МГц на 'Выход 10МГц'", "name": "srvRefClk10M"},
|
|
||||||
{"widget": "checkbox", "label": "Автозапуск BUC и LNB при включении", "name": "bucLnbAutoStart"}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"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}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"network": [
|
|
||||||
{"widget": "h2", "label": "Настройки сети"},
|
|
||||||
{
|
|
||||||
"widget": "settings-container",
|
|
||||||
"childs": [
|
|
||||||
{"widget": "h3", "label": "Настройки интерфейса управления"},
|
|
||||||
{"widget": "ip-address", "label": "Интерфейс управления (/24)", "name": "netManagementIp"},
|
|
||||||
{
|
|
||||||
"widget": "select", "label": "Режим сети", "name": "netIsL2",
|
|
||||||
"values": [{"label": "Маршрутизатор", "value": "false"}, {"label": "Коммутатор", "value": "true"}]
|
|
||||||
},
|
|
||||||
{"widget": "ip-address", "label": "Интерфейс данных (/24)", "name": "netDataIp", "v_show": "paramNetwork.netIsL2 === false"},
|
|
||||||
{"widget": "number", "label": "MTU интерфейса данных", "name": "netDataMtu", "min": 1500, "step": 1, "max": 2000}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"tabs": [
|
"tabs": [
|
||||||
{"name": "monitoring", "desc": "Мониторинг"},
|
{
|
||||||
{"name": "setup", "desc": "Настройки"},
|
"name": "monitoring",
|
||||||
{"name": "qos", "desc": "QoS"},
|
"desc": "Мониторинг"
|
||||||
{"name": "admin", "desc": "Администрирование"}
|
},
|
||||||
|
{
|
||||||
|
"name": "setup",
|
||||||
|
"desc": "Настройки"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qos",
|
||||||
|
"desc": "QoS"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,64 +3,9 @@ from jinja2 import Environment, FileSystemLoader
|
|||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
|
||||||
with open('render-params.json') as f:
|
|
||||||
GLOBAL_CONFIG = json.load(f)
|
|
||||||
|
|
||||||
|
|
||||||
def extract_param_names(mc):
|
def extract_param_names(mc):
|
||||||
result = []
|
result = {}
|
||||||
|
|
||||||
def helper_extract(widget):
|
|
||||||
if 'childs' in widget:
|
|
||||||
r = []
|
|
||||||
for child in widget['childs']:
|
|
||||||
r += helper_extract(child)
|
|
||||||
return r
|
|
||||||
elif 'name' in widget:
|
|
||||||
match widget['widget']:
|
|
||||||
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 []
|
|
||||||
|
|
||||||
for cat in mc['params']:
|
|
||||||
ws = []
|
|
||||||
for w in mc['params'][cat]:
|
|
||||||
ws += helper_extract(w)
|
|
||||||
# ws.sort(key=lambda k: k['name'])
|
|
||||||
result.append({
|
|
||||||
"group": cat,
|
|
||||||
"params": ws
|
|
||||||
})
|
|
||||||
|
|
||||||
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"})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -69,12 +14,12 @@ def extract_param_groups(mc):
|
|||||||
|
|
||||||
|
|
||||||
def build_modem_env(modem):
|
def build_modem_env(modem):
|
||||||
if modem not in GLOBAL_CONFIG['modem_types']:
|
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!")
|
raise RuntimeError(f"Modem '{modem}' is not exist in config!")
|
||||||
|
|
||||||
mc = GLOBAL_CONFIG['modem_types'][modem]
|
mc = config['modem_types'][modem]
|
||||||
|
|
||||||
add_submit_widgets(mc['params'])
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"modem": modem,
|
"modem": modem,
|
||||||
@ -82,8 +27,7 @@ def build_modem_env(modem):
|
|||||||
"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": mc["params"],
|
"params": mc["params"],
|
||||||
"dangerousParamGroups": mc["dangerousParamGroups"] if 'dangerousParamGroups' in mc else {},
|
"paramGroupsWithNames": extract_param_names(mc),
|
||||||
"paramGroups": extract_param_names(mc),
|
|
||||||
"paramGroupsList": extract_param_groups(mc),
|
"paramGroupsList": extract_param_groups(mc),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,8 +44,9 @@ def render_modem(modem):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
for mt in GLOBAL_CONFIG['modem_types']:
|
render_modem('scpc')
|
||||||
print(f'Generating {mt} modem...')
|
render_modem('tdma')
|
||||||
render_modem(mt)
|
|
||||||
os.system(f'cp -u main-{mt}.html ../static')
|
os.system('cp -u main-tdma.html ../static')
|
||||||
|
os.system('cp -u main-scpc.html ../static')
|
||||||
|
|
||||||
|
0
front-generator/template/common/admin-data.js.j2
Normal file
0
front-generator/template/common/admin-data.js.j2
Normal file
@ -1,3 +1,55 @@
|
|||||||
|
settingsSubmitNetwork() {
|
||||||
|
if (this.submitStatus.network) { return }
|
||||||
|
let query = {
|
||||||
|
"network.managementIp": this.param.network.managementIp,
|
||||||
|
"network.managementGateway": this.param.network.managementGateway,
|
||||||
|
"network.mode": this.param.network.mode,
|
||||||
|
"network.dataIp": this.param.network.dataIp,
|
||||||
|
"network.dataMtu": this.param.network.dataMtu
|
||||||
|
}
|
||||||
|
if (confirm('Вы уверены, что хотите сохранить настройки сети? После этого модем может стать недоступным.')) {
|
||||||
|
this.submitStatus.network = true
|
||||||
|
fetch('/api/set/network', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(query)
|
||||||
|
}).then(async (resp) => {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
this.updateNetworkSettings(await resp.json())
|
||||||
|
}).catch((reason) => {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
alert(`Ошибка при применении настроек: ${reason}`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
settingsSubmitDebugSend() {
|
||||||
|
if (this.submitStatus.debugSend) { return }
|
||||||
|
let query = {
|
||||||
|
"debugSend.en": this.param.debugSend.en,
|
||||||
|
"debugSend.receiverIp": this.param.debugSend.receiverIp,
|
||||||
|
"debugSend.portCinC": this.param.debugSend.portCinC,
|
||||||
|
"debugSend.portData": this.param.debugSend.portData,
|
||||||
|
"debugSend.timeout": this.param.debugSend.timeout
|
||||||
|
}
|
||||||
|
this.submitStatus.debugSend = true
|
||||||
|
fetch('/api/set/debugSend', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(query)
|
||||||
|
}).then(async (resp) => {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
this.updateNetworkSettings(await resp.json())
|
||||||
|
}).catch((reason) => {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
alert(`Ошибка при применении настроек: ${reason}`)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
async settingsUploadUpdate() {
|
async settingsUploadUpdate() {
|
||||||
if (!this.uploadFw.filename) {
|
if (!this.uploadFw.filename) {
|
||||||
alert('Выберите файл для загрузки');
|
alert('Выберите файл для загрузки');
|
||||||
@ -53,6 +105,24 @@
|
|||||||
this.submitStatus.firmwareUpgrade = false
|
this.submitStatus.firmwareUpgrade = false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateNetworkSettings(vals) {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
this.param.network.managementIp = vals["settings"]["network.managementIp"]
|
||||||
|
this.param.network.managementGateway = vals["settings"]["network.managementGateway"]
|
||||||
|
this.param.network.mode = vals["settings"]["network.mode"]
|
||||||
|
this.param.network.dataIp = vals["settings"]["network.dataIp"]
|
||||||
|
this.param.network.dataMtu = vals["settings"]["network.dataMtu"]
|
||||||
|
},
|
||||||
|
|
||||||
|
updateDebugSendSettings(vals) {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
this.param.debugSend.en = vals["settings"]["debugSend.en"]
|
||||||
|
this.param.debugSend.receiverIp = vals["settings"]["debugSend.receiverIp"]
|
||||||
|
this.param.debugSend.portCinC = vals["settings"]["debugSend.portCinC"]
|
||||||
|
this.param.debugSend.portData = vals["settings"]["debugSend.portData"]
|
||||||
|
this.param.debugSend.timeout = vals["settings"]["debugSend.timeout"]
|
||||||
|
},
|
||||||
|
|
||||||
doModemReboot() {
|
doModemReboot() {
|
||||||
if (this.submitStatus.modemReboot !== null) {
|
if (this.submitStatus.modemReboot !== null) {
|
||||||
return
|
return
|
||||||
|
@ -1,11 +1,63 @@
|
|||||||
{% from 'common/widgets.j2' import build_widget %}
|
{% raw %}
|
||||||
<div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete">
|
<div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete">
|
||||||
{% if 'network' in params %}
|
<h2>Настройки сети</h2>
|
||||||
{% for w in params['network'] %}{{ build_widget('network', w) | indent(12, true) }}{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
{% raw %}
|
|
||||||
<h2>Система</h2>
|
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
|
<h3>Интерфейс управления</h3>
|
||||||
|
<label>
|
||||||
|
<span>IP адрес/маска</span>
|
||||||
|
<input v-model="param.network.managementIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Шлюз интерфейса управления</span>
|
||||||
|
<input v-model="param.network.managementGateway" type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Режим модема</span>
|
||||||
|
<select v-model="param.network.mode">
|
||||||
|
<option value="l2">Коммутатор</option>
|
||||||
|
<option value="l3">Маршрутизатор</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<h3>Интерфейс данных</h3>
|
||||||
|
<label v-if="param.network.mode === 'l3'">
|
||||||
|
<span>IP адрес/маска</span>
|
||||||
|
<input v-model="param.network.dataIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>MTU</span>
|
||||||
|
<input v-model="param.network.dataMtu" required type="number" min="1500" max="9000">
|
||||||
|
</label>
|
||||||
|
<button class="action-button" @click="settingsSubmitNetwork()">Применить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
|
</div>
|
||||||
|
<div class="settings-set-container">
|
||||||
|
<h3>Отладка</h3>
|
||||||
|
<label>
|
||||||
|
<span>Передача отладочной информации</span>
|
||||||
|
<span class="toggle-input">
|
||||||
|
<input type="checkbox" v-model="param.debugSend.en" />
|
||||||
|
<span class="slider"></span>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<label v-if="param.debugSend.en">
|
||||||
|
<span>IP адрес получателя</span>
|
||||||
|
<input v-model="param.debugSend.receiverIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Порт для данных</span>
|
||||||
|
<input v-model="param.debugSend.portCinC" type="number" min="0" max="65535">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Порт для CinC</span>
|
||||||
|
<input v-model="param.debugSend.portData" type="number" min="0" max="65535">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Таймаут</span>
|
||||||
|
<input v-model="param.debugSend.timeout" type="number" pattern="^[0-9]+$">
|
||||||
|
</label>
|
||||||
|
<button class="action-button" @click="settingsSubmitDebugSend()">Применить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
|
</div>
|
||||||
|
<div class="settings-set-container">
|
||||||
|
<h3>Управление ПО</h3>
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th>Версия ПО</th><td>{{ about.firmwareVersion }}</td></tr>
|
<tr><th>Версия ПО</th><td>{{ about.firmwareVersion }}</td></tr>
|
||||||
@ -30,5 +82,6 @@
|
|||||||
</label>
|
</label>
|
||||||
<button class="action-button" @click="settingsUploadUpdate()">Загрузить<span class="submit-spinner" v-show="submitStatus.firmwareUpload"></span></button>
|
<button class="action-button" @click="settingsUploadUpdate()">Загрузить<span class="submit-spinner" v-show="submitStatus.firmwareUpload"></span></button>
|
||||||
<button class="dangerous-button" v-show="uploadFw.sha256 !== null" @click="settingsPerformFirmwareUpgrade()">Обновить встроенное ПО <span class="submit-spinner" v-show="submitStatus.firmwareUpgrade"></span></button>
|
<button class="dangerous-button" v-show="uploadFw.sha256 !== null" @click="settingsPerformFirmwareUpgrade()">Обновить встроенное ПО <span class="submit-spinner" v-show="submitStatus.firmwareUpgrade"></span></button>
|
||||||
</div>{% endraw %}
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endraw %}
|
@ -1,7 +0,0 @@
|
|||||||
{% for g in paramGroups %}
|
|
||||||
param{{ g['group'] | title }}: {
|
|
||||||
{% for p in g['params'] %}
|
|
||||||
{{ p['name'] }}: {{ p['initValue'] }},
|
|
||||||
{% endfor %}
|
|
||||||
},
|
|
||||||
{% endfor %}
|
|
@ -1,29 +0,0 @@
|
|||||||
{% for g in paramGroups %}
|
|
||||||
settingsSubmit{{ g['group'] | title }}() {
|
|
||||||
if (this.submitStatus.{{ g['group'] }}) { return }
|
|
||||||
{% if g['group'] in dangerousParamGroups %}
|
|
||||||
{ if (!confirm("{{ dangerousParamGroups[g['group']] }}")) return }
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
let query = {
|
|
||||||
{% for p in g['params'] %}
|
|
||||||
"{{ p['name'] }}": this.param{{ g['group'] | title }}.{{ p['name'] }},
|
|
||||||
{% endfor %}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.submitStatus.{{ g['group'] }} = true
|
|
||||||
fetch('/api/set/{{ g["group"] }}', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(query) })
|
|
||||||
.then(async (resp) => { this.update{{ g['group'] | title }}Settings(await resp.json()) })
|
|
||||||
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
|
|
||||||
.finally(() => { this.submitStatus.{{ g['group'] }} = false })
|
|
||||||
},
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% for g in paramGroups %}
|
|
||||||
update{{ g['group'] | title }}Settings(vals) {
|
|
||||||
this.submitStatus.{{ g['group'] }} = false
|
|
||||||
{% for p in g['params'] %}
|
|
||||||
this.param{{ g['group'] | title }}.{{ p['name'] }} = vals["settings"]["{{ p['name'] }}"]
|
|
||||||
{% endfor %}
|
|
||||||
},
|
|
||||||
{% endfor %}
|
|
@ -43,5 +43,5 @@
|
|||||||
statDevice: { // температурные датчики
|
statDevice: { // температурные датчики
|
||||||
adrv: 0, zynq: 0, fpga: 0
|
adrv: 0, zynq: 0, fpga: 0
|
||||||
},
|
},
|
||||||
statOs: {uptime: '?', load1: '?', load5: '?', load15: '?', totalram: '?', freeram: '?'},
|
statOs: {uptime: '?'},
|
||||||
|
|
||||||
|
@ -1,19 +1,4 @@
|
|||||||
updateStatistics(vals) {
|
updateStatistics(vals) {
|
||||||
function modcodToStr(modcod) {
|
|
||||||
// модкоды из раздела 5.5.2.2 https://www.etsi.org/deliver/etsi_en/302300_302399/302307/01.01.02_60/en_302307v010102p.pdf
|
|
||||||
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]
|
|
||||||
}
|
|
||||||
|
|
||||||
this.lastUpdateTime = new Date();
|
this.lastUpdateTime = new Date();
|
||||||
this.initState = vals["mainState"]["initState"]
|
this.initState = vals["mainState"]["initState"]
|
||||||
{% if modem == 'scpc' %}
|
{% if modem == 'scpc' %}
|
||||||
@ -84,11 +69,6 @@
|
|||||||
} else {
|
} else {
|
||||||
this.statOs.uptime = '?'
|
this.statOs.uptime = '?'
|
||||||
}
|
}
|
||||||
this.statOs.load1 = vals["sysinfo"]["load1min"]
|
|
||||||
this.statOs.load5 = vals["sysinfo"]["load5min"]
|
|
||||||
this.statOs.load15 = vals["sysinfo"]["load15min"]
|
|
||||||
this.statOs.totalram = vals["sysinfo"]["totalram"]
|
|
||||||
this.statOs.freeram = vals["sysinfo"]["freeram"]
|
|
||||||
},
|
},
|
||||||
|
|
||||||
resetPacketsStatistics() {
|
resetPacketsStatistics() {
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>{% endraw %}{% endif %}{% raw %}
|
</table>{% endraw %}{% endif %}{% raw %}
|
||||||
</div>{% endraw %}{% if modem == 'scpc' %}{% raw %}
|
</div>{% endraw %}{% if modem == 'scpc' %}{% raw %}
|
||||||
<div class="settings-set-container" v-if="paramRxtx.isCinC === true">
|
<div class="settings-set-container" v-if="isCinC === true">
|
||||||
<h2>Статистика режима CinC</h2>
|
<h2>Статистика режима CinC</h2>
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
@ -75,8 +75,6 @@
|
|||||||
<tr><th>Температура ZYNQ</th><td>{{ statDevice.zynq }} °C</td></tr>
|
<tr><th>Температура ZYNQ</th><td>{{ statDevice.zynq }} °C</td></tr>
|
||||||
<tr><th>Температура FPGA</th><td>{{ statDevice.fpga }} °C</td></tr>
|
<tr><th>Температура FPGA</th><td>{{ statDevice.fpga }} °C</td></tr>
|
||||||
<tr><th>Uptime</th><td>{{ statOs.uptime }}</td></tr>
|
<tr><th>Uptime</th><td>{{ statOs.uptime }}</td></tr>
|
||||||
<tr><th>Load average</th><td>{{ statOs.load1 }} {{ statOs.load5 }} {{ statOs.load15 }}</td></tr>
|
|
||||||
<tr><th>RAM total/free</th><td>{{ statOs.totalram }}Mb/{{ statOs.freeram }}Mb</td></tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,8 +1,14 @@
|
|||||||
submitStatusQos: false,
|
paramsQos: {
|
||||||
paramQos: {
|
|
||||||
en: false,
|
en: false,
|
||||||
rt1: [],
|
rt1: [],
|
||||||
rt2: [],
|
rt2: [],
|
||||||
rt3: [],
|
rt3: [],
|
||||||
cd: [],
|
cd: [],
|
||||||
},
|
},
|
||||||
|
{% if 'tcpaccel' in params.paramGroupsList %}
|
||||||
|
paramsTcpAccel: {
|
||||||
|
en: false,
|
||||||
|
maxConnections: 128
|
||||||
|
},
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
@ -1,6 +1,29 @@
|
|||||||
|
{% 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.submitStatusQos) { return }
|
if (this.submitStatus.qos) { return }
|
||||||
this.submitStatusQos = true
|
this.submitStatus.qos = true
|
||||||
function _translateQosClass(trafficClass, qc) {
|
function _translateQosClass(trafficClass, qc) {
|
||||||
let res = {
|
let res = {
|
||||||
cir: qc['cir'],
|
cir: qc['cir'],
|
||||||
@ -43,18 +66,18 @@
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
let query = {
|
let query = {
|
||||||
"en": this.paramQos.en,
|
"en": this.paramsQos.en,
|
||||||
"rt1": [],
|
"rt1": [],
|
||||||
"rt2": [],
|
"rt2": [],
|
||||||
"rt3": [],
|
"rt3": [],
|
||||||
"cd": []
|
"cd": []
|
||||||
}
|
}
|
||||||
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.paramsQos.rt1.length; i++) { query.rt1.push(_translateQosClass('rt', this.paramsQos.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.paramsQos.rt2.length; i++) { query.rt2.push(_translateQosClass('rt', this.paramsQos.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.paramsQos.rt3.length; i++) { query.rt3.push(_translateQosClass('rt', this.paramsQos.rt3[i])) }
|
||||||
for (let i = 0; i < this.paramQos.cd.length; i++) { query.cd.push(_translateQosClass('rt', this.paramQos.cd[i])) }
|
for (let i = 0; i < this.paramsQos.cd.length; i++) { query.cd.push(_translateQosClass('rt', this.paramsQos.cd[i])) }
|
||||||
|
|
||||||
//console.log(query)
|
console.log(query)
|
||||||
fetch('/api/set/qos', {
|
fetch('/api/set/qos', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
@ -62,24 +85,24 @@
|
|||||||
},
|
},
|
||||||
body: JSON.stringify(query)
|
body: JSON.stringify(query)
|
||||||
}).then(async (resp) => {
|
}).then(async (resp) => {
|
||||||
this.submitStatusQos = false
|
this.submitStatus.qos = false
|
||||||
this.updateQosSettings(await resp.json())
|
this.updateQosSettings(await resp.json())
|
||||||
}).catch((reason) => {
|
}).catch((reason) => {
|
||||||
this.submitStatusQos = false
|
this.submitStatus.qos = false
|
||||||
alert(`Ошибка при применении настроек: ${reason}`)
|
alert(`Ошибка при применении настроек: ${reason}`)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
updateQosSettings(vals) {
|
updateQosSettings(vals) {
|
||||||
this.submitStatusQos = false
|
this.submitStatus.qos = false
|
||||||
this.paramQos.en = vals["settings"]["qos.enabled"]
|
this.paramsQos.en = vals["settings"]["qos.enabled"]
|
||||||
|
|
||||||
const qosProfile = vals["settings"]["qos.profile"]
|
const qosProfile = vals["settings"]["qos.profile"]
|
||||||
if (qosProfile !== null && qosProfile !== undefined) {
|
if (qosProfile !== null && qosProfile !== undefined) {
|
||||||
this.paramQos.rt1 = [] // .splice(0, this.paramQos.rt1.length)
|
this.paramsQos.rt1 = [] // .splice(0, this.paramsQos.rt1.length)
|
||||||
this.paramQos.rt2 = [] // .splice(0, this.paramQos.rt2.length)
|
this.paramsQos.rt2 = [] // .splice(0, this.paramsQos.rt2.length)
|
||||||
this.paramQos.rt3 = [] // .splice(0, this.paramQos.rt3.length)
|
this.paramsQos.rt3 = [] // .splice(0, this.paramsQos.rt3.length)
|
||||||
this.paramQos.cd = [] // .splice(0, this.paramQos.cd.length)
|
this.paramsQos.cd = [] // .splice(0, this.paramsQos.cd.length)
|
||||||
|
|
||||||
for (let trafficClass in qosProfile) {
|
for (let trafficClass in qosProfile) {
|
||||||
if (['rt1', 'rt2', 'rt3', 'cd'].indexOf(trafficClass) < 0) {
|
if (['rt1', 'rt2', 'rt3', 'cd'].indexOf(trafficClass) < 0) {
|
||||||
@ -114,10 +137,10 @@
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
switch (trafficClass) {
|
switch (trafficClass) {
|
||||||
case 'rt1': this.paramQos.rt1.push(result); break
|
case 'rt1': this.paramsQos.rt1.push(result); break
|
||||||
case 'rt2': this.paramQos.rt2.push(result); break
|
case 'rt2': this.paramsQos.rt2.push(result); break
|
||||||
case 'rt3': this.paramQos.rt3.push(result); break
|
case 'rt3': this.paramsQos.rt3.push(result); break
|
||||||
case 'cd': this.paramQos.cd.push(result); break
|
case 'cd': this.paramsQos.cd.push(result); break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -134,10 +157,10 @@
|
|||||||
filters: []
|
filters: []
|
||||||
}
|
}
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case 'rt1': this.paramQos.rt1.push(res); break
|
case 'rt1': this.paramsQos.rt1.push(res); break
|
||||||
case 'rt2': this.paramQos.rt2.push(res); break
|
case 'rt2': this.paramsQos.rt2.push(res); break
|
||||||
case 'rt3': this.paramQos.rt3.push(res); break
|
case 'rt3': this.paramsQos.rt3.push(res); break
|
||||||
case 'cd': this.paramQos.cd.push(res); break
|
case 'cd': this.paramsQos.cd.push(res); break
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -153,28 +176,28 @@
|
|||||||
dscp: ""
|
dscp: ""
|
||||||
}
|
}
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case 'rt1': this.paramQos.rt1[index].filters.push(rule); break
|
case 'rt1': this.paramsQos.rt1[index].filters.push(rule); break
|
||||||
case 'rt2': this.paramQos.rt2[index].filters.push(rule); break
|
case 'rt2': this.paramsQos.rt2[index].filters.push(rule); break
|
||||||
case 'rt3': this.paramQos.rt3[index].filters.push(rule); break
|
case 'rt3': this.paramsQos.rt3[index].filters.push(rule); break
|
||||||
case 'cd': this.paramQos.cd[index].filters.push(rule); break
|
case 'cd': this.paramsQos.cd[index].filters.push(rule); break
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
qosDelClass(name, index) {
|
qosDelClass(name, index) {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case 'rt1': this.paramQos.rt1.splice(index, 1); break
|
case 'rt1': this.paramsQos.rt1.splice(index, 1); break
|
||||||
case 'rt2': this.paramQos.rt2.splice(index, 1); break
|
case 'rt2': this.paramsQos.rt2.splice(index, 1); break
|
||||||
case 'rt3': this.paramQos.rt3.splice(index, 1); break
|
case 'rt3': this.paramsQos.rt3.splice(index, 1); break
|
||||||
case 'cd': this.paramQos.cd.splice(index, 1); break
|
case 'cd': this.paramsQos.cd.splice(index, 1); break
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
qosDelFilter(name, index, filterIndex) {
|
qosDelFilter(name, index, filterIndex) {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case 'rt1': this.paramQos.rt1[index].filters.splice(filterIndex, 1); break
|
case 'rt1': this.paramsQos.rt1[index].filters.splice(filterIndex, 1); break
|
||||||
case 'rt2': this.paramQos.rt2[index].filters.splice(filterIndex, 1); break
|
case 'rt2': this.paramsQos.rt2[index].filters.splice(filterIndex, 1); break
|
||||||
case 'rt3': this.paramQos.rt3[index].filters.splice(filterIndex, 1); break
|
case 'rt3': this.paramsQos.rt3[index].filters.splice(filterIndex, 1); break
|
||||||
case 'cd': this.paramQos.cd[index].filters.splice(filterIndex, 1); break
|
case 'cd': this.paramsQos.cd[index].filters.splice(filterIndex, 1); break
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
{% from 'common/widgets.j2' import build_widget %}
|
|
||||||
{% raw %}
|
{% raw %}
|
||||||
<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">
|
||||||
<label>
|
<label>
|
||||||
<span>Активировать QoS</span>
|
<span>Активировать QoS</span>
|
||||||
<span class="toggle-input"><input type="checkbox" v-model="paramQos.en" /><span class="slider"></span></span>
|
<span class="toggle-input"><input type="checkbox" v-model="paramsQos.en" /><span class="slider"></span></span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div v-for="classesGroup in ['rt1', 'rt2', 'rt3', 'cd']">
|
<div v-for="classesGroup in ['rt1', 'rt2', 'rt3', 'cd']">
|
||||||
<h3>Классы {{ classesGroup.toUpperCase() }} <button class="action-button" @click="qosAddClass(classesGroup)"> + </button></h3>
|
<h3>Классы {{ classesGroup.toUpperCase() }} <button class="action-button" @click="qosAddClass(classesGroup)"> + </button></h3>
|
||||||
<details v-for="(qosClass, index) in paramQos[classesGroup]" :key="index" class="settings-set-container">
|
<details v-for="(qosClass, index) in paramsQos[classesGroup]" :key="index" class="settings-set-container">
|
||||||
<summary>
|
<summary>
|
||||||
<span v-if="classesGroup === 'cd'">#{{ index }} CIR={{ qosClass.cir }}кбит, PIR={{ qosClass.pir }}кбит {{ qosClass.description }}</span>
|
<span v-if="classesGroup === 'cd'">#{{ index }} CIR={{ qosClass.cir }}кбит, PIR={{ qosClass.pir }}кбит {{ qosClass.description }}</span>
|
||||||
<span v-if="classesGroup !== 'cd'">#{{ index }} CBR={{ qosClass.cir }}кбит {{ qosClass.description }}</span>
|
<span v-if="classesGroup !== 'cd'">#{{ index }} CBR={{ qosClass.cir }}кбит {{ qosClass.description }}</span>
|
||||||
@ -99,9 +98,20 @@
|
|||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitQoS()">Применить <span class="submit-spinner" v-show="submitStatusQos"></span></button>
|
<button class="action-button" @click="settingsSubmitQoS()">Применить <span class="submit-spinner" v-show="submitStatus.qos"></span></button>
|
||||||
|
|
||||||
{% endraw %}{% if 'tcpaccel' in params %}
|
{% endraw %}{% if 'tcpaccel' in params.paramGroupsList %}{% raw %}
|
||||||
{% for w in params['tcpaccel'] %}{{ build_widget('tcpaccel', w) | indent(12, true) }}{% endfor %}
|
<h2>Настройки TCP-акселерации</h2>
|
||||||
{% endif %}
|
<div class="settings-set-container">
|
||||||
</div>
|
<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>
|
||||||
|
{% endraw %}{% endif %}
|
55
front-generator/template/common/setup-data.js.j2
Normal file
55
front-generator/template/common/setup-data.js.j2
Normal 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 %}
|
||||||
|
|
180
front-generator/template/common/setup-methods.js.j2
Normal file
180
front-generator/template/common/setup-methods.js.j2
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
{% if 'rxtx' in params.paramGroupsList %}
|
||||||
|
settingsSubmitRxtx() {
|
||||||
|
if (this.submitStatus.rxTx) { return }
|
||||||
|
// потом добавить: "dvbs2.isPilots": this.param.dvbs2.isPilots
|
||||||
|
let query = {
|
||||||
|
"general.isCinC": this.param.general.isCinC,
|
||||||
|
"general.txEn": this.param.general.txEn,
|
||||||
|
"general.modulatorMode": this.param.general.modulatorMode,
|
||||||
|
"general.autoStartTx": this.param.general.autoStartTx,
|
||||||
|
"general.isTestInputData": this.param.general.isTestInputData,
|
||||||
|
"tx.attenuation": this.param.tx.attenuation,
|
||||||
|
"tx.rolloff": this.param.tx.rolloff,
|
||||||
|
"tx.cymRate": this.param.tx.cymRate,
|
||||||
|
"tx.centerFreq": this.param.tx.centerFreq,
|
||||||
|
"dvbs2.isAcm": this.param.dvbs2.mode === 'acm',
|
||||||
|
"dvbs2.frameSizeNormal": this.param.dvbs2.frameSizeNormal,
|
||||||
|
"dvbs2.ccm_modcod": toModcod(this.param.dvbs2.ccm_modulation, this.param.dvbs2.ccm_speed),
|
||||||
|
"dvbs2.acm_minModcod": toModcod(this.param.dvbs2.acm_minModulation, this.param.dvbs2.acm_minSpeed),
|
||||||
|
"dvbs2.acm_maxModcod": toModcod(this.param.dvbs2.acm_maxModulation, this.param.dvbs2.acm_maxSpeed),
|
||||||
|
"dvbs2.snrReserve": this.param.dvbs2.snrReserve,
|
||||||
|
"dvbs2.servicePacketPeriod": this.param.dvbs2.servicePacketPeriod,
|
||||||
|
"acm.en": this.param.acm.en,
|
||||||
|
"acm.maxAttenuation": this.param.acm.maxAttenuation,
|
||||||
|
"acm.minAttenuation": this.param.acm.minAttenuation,
|
||||||
|
"acm.requiredSnr": this.param.acm.requiredSnr,
|
||||||
|
"rx.gainMode": this.param.rx.gainMode,
|
||||||
|
"rx.manualGain": this.param.rx.manualGain,
|
||||||
|
"rx.spectrumInversion": this.param.rx.spectrumInversion,
|
||||||
|
"rx.rolloff": this.param.rx.rolloff,
|
||||||
|
"rx.cymRate": this.param.rx.cymRate,
|
||||||
|
"rx.centerFreq": this.param.rx.centerFreq
|
||||||
|
}
|
||||||
|
|
||||||
|
this.submitStatus.rxTx = true
|
||||||
|
fetch('/api/set/rxtx', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(query)
|
||||||
|
}).then(async (resp) => {
|
||||||
|
this.submitStatus.rxTx = false
|
||||||
|
this.updateRxTxSettings(await resp.json())
|
||||||
|
}).catch((reason) => {
|
||||||
|
this.submitStatus.rxTx = false
|
||||||
|
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() {
|
||||||
|
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)
|
||||||
|
},
|
@ -2,7 +2,8 @@
|
|||||||
<div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete">
|
<div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete">
|
||||||
{% for cat in ['rxtx', 'cinc', 'buclnb'] %}
|
{% for cat in ['rxtx', 'cinc', 'buclnb'] %}
|
||||||
{% if cat in params %}
|
{% if cat in params %}
|
||||||
{% for w in params[cat] %}{{ build_widget(cat, w) | indent(12, true) }}{% endfor %}
|
{% for w in params[cat] %}{{ build_widget(cat, w) }}{% endfor %}
|
||||||
|
<button class="action-button" @click="settingsSubmitBucLnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.bucLnb"></span></button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
@ -1,63 +1,41 @@
|
|||||||
{% macro build_widget_checkbox(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
|
{% macro build_widget_checkbox(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
|
||||||
<span>{{ widget.label }}</span>
|
<span>{{ widget.label }}</span>
|
||||||
<span class="toggle-input"><input type="checkbox" v-model="param{{ param_group | title }}.{{ widget.name }}" /><span class="slider"></span></span>
|
<span class="toggle-input">
|
||||||
|
<input type="checkbox" v-model="param{{ param_group | title }}.{{ widget.name }}" />
|
||||||
|
<span class="slider"></span>
|
||||||
|
</span>
|
||||||
</label>{% endmacro %}
|
</label>{% endmacro %}
|
||||||
|
|
||||||
{# https://ru.stackoverflow.com/questions/1241064 #}
|
{% macro build_widget_number(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
|
||||||
{% macro build_widget_number(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}><span>{{ widget.label }}</span><input type="number" v-model="param{{ param_group | title }}.{{ widget.name }}"{% if widget['min'] %} min="{{ widget['min'] }}"{% endif %}{% if widget['max'] %} max="{{ widget['max'] }}"{% endif %}{% if widget['step'] %} step="{{ widget['step'] }}"{% endif %}/></label>{% endmacro %}
|
</label>{% endmacro %}
|
||||||
|
|
||||||
{% macro build_widget_select(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
|
{% macro build_widget_select(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
|
||||||
<span>{{ widget.label }}</span>
|
<span>{{ widget.label }}</span>
|
||||||
<select v-model="param{{ param_group | title }}.{{ widget.name }}">
|
<select v-model="param{{ param_group | title }}.{{ widget.name }}">
|
||||||
{% for opt in widget['values'] %} <option :value="{{ opt.value }}">{{ opt.label }}</option>
|
{% for opt in widget['values'] %}
|
||||||
|
<option :value="{{ opt.value }}">{{ opt.label }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</label>{% endmacro %}
|
</label>{% endmacro %}
|
||||||
|
|
||||||
{% macro build_widget_watch(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}><span>{{ widget.label }}</span><input type="text" readonly v-model="{{ widget.model }}"/></label>{% endmacro %}
|
|
||||||
|
|
||||||
{% macro build_widget_modulation_modcod(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 }}Modulation" @change="param{{ param_group | title }}.{{ widget.name }}Speed = correctModcodSpeed(param{{ param_group | title }}.{{ widget.name }}Modulation, param{{ param_group | title }}.{{ widget.name }}Speed)">
|
|
||||||
<option :value="'qpsk'">QPSK</option>
|
|
||||||
<option :value="'8psk'">8PSK</option>
|
|
||||||
<option :value="'16apsk'">16APSK</option>
|
|
||||||
<option :value="'32apsk'">32APSK</option>
|
|
||||||
</select>
|
|
||||||
</label>{% endmacro %}
|
|
||||||
|
|
||||||
{% macro build_widget_modulation_speed(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 }}Speed">
|
|
||||||
<option v-for="speed in getAvailableModcods(param{{ param_group | title }}.{{ widget.name }}Modulation)" v-bind:value="speed">{{ '{{' }} speed {{ '}}' }}</option>
|
|
||||||
</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 %}>
|
{% 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) | indent(4, true) }}{% endfor %}
|
{% for w in widget.childs %}{{ build_widget(param_group, w) }}{% endfor %}
|
||||||
</div>{% endmacro %}
|
</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 %}>
|
{% 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) | indent(4, true) }}{% endfor %}
|
{% for w in widget.childs %}{{ build_widget(param_group, w) }}{% endfor %}
|
||||||
</div>{% endmacro %}
|
</div>
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro build_widget_ip_address(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
|
|
||||||
<span>{{ widget.label }}</span>
|
|
||||||
<input v-model="param{{ param_group | title }}.{{ widget.name }}" required type="text" pattern="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$">
|
|
||||||
</label>{% endmacro %}
|
|
||||||
|
|
||||||
{% macro build_widget(param_group, widget) %}{% if widget.widget == 'flex-container' %}{{ build_widget_flex_container(param_group, widget) }}
|
{% 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 == '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 == '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 == 'h3' %}<h3{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>{{ widget.label }}</h3>
|
||||||
{% elif widget.widget == 'submit' %}<button class="action-button" @click="settingsSubmit{{ param_group | title }}()"{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>Сохранить <span class="submit-spinner" v-show="submitStatus.{{ param_group }}"></span></button>
|
|
||||||
{% elif widget.widget == 'checkbox' %}{{ build_widget_checkbox(param_group, widget) }}
|
{% elif widget.widget == 'checkbox' %}{{ build_widget_checkbox(param_group, widget) }}
|
||||||
{% elif widget.widget == 'number' %}{{ build_widget_number(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 == '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) }}
|
|
||||||
{% elif widget.widget == 'ip-address' %}{{ build_widget_ip_address(param_group, widget) }}
|
|
||||||
{% else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>
|
{% else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
141
front-generator/template/default-js.js
Normal file
141
front-generator/template/default-js.js
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
{% 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 %}
|
@ -63,24 +63,18 @@
|
|||||||
<script>
|
<script>
|
||||||
const availableTabs = ['{{ tab_names_array | join("', '") }}']
|
const availableTabs = ['{{ tab_names_array | join("', '") }}']
|
||||||
|
|
||||||
// для обновления высоты хидера
|
{% include '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]
|
|
||||||
}
|
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
{% if modem == 'scpc' %}
|
||||||
|
isCinC: false,
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
// false - означает что статистика не отправляется, true - отправляется
|
// false - означает что статистика не отправляется, true - отправляется
|
||||||
submitStatus: {
|
submitStatus: {
|
||||||
{% for pg in paramGroupsList %}
|
{% for pg in params.paramGroupsList %}
|
||||||
{{ pg }}: false,
|
{{ pg }}: false,
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
firmwareUpload: false,
|
firmwareUpload: false,
|
||||||
@ -89,13 +83,9 @@
|
|||||||
modemReboot: null
|
modemReboot: null
|
||||||
},
|
},
|
||||||
|
|
||||||
// ========== include from 'common/all-params-data.js.j2'
|
|
||||||
{% include 'common/all-params-data.js.j2' %}
|
|
||||||
// ========== include end from 'common/all-params-data.js.j2'
|
|
||||||
|
|
||||||
{% for tab in header_tabs %}
|
{% for tab in header_tabs %}
|
||||||
// ========== include from '{{ 'common/' ~ tab.name ~ '-data.js.j2' }}'
|
// ========== include from '{{ 'common/' ~ tab.name ~ '-data.js.j2' }}'
|
||||||
{% include 'common/' ~ tab.name ~ '-data.js.j2' ignore missing %}
|
{% include 'common/' ~ tab.name ~ '-data.js.j2' %}
|
||||||
// ========== include end from '{{ 'common/' ~ tab.name ~ '-data.js.j2' }}'
|
// ========== include end from '{{ 'common/' ~ tab.name ~ '-data.js.j2' }}'
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -138,29 +128,10 @@
|
|||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
},
|
},
|
||||||
getAvailableModcods(modulation) {
|
|
||||||
// NOTE модкоды со скоростью хода 3/5 не работают
|
|
||||||
switch (modulation) {
|
|
||||||
case 'qpsk':
|
|
||||||
return ['1/4', '1/3', '2/5', '1/2', '3/5', '2/3', '3/4', '4/5', '5/6', '8/9', '9/10']
|
|
||||||
case '8psk':
|
|
||||||
return ['3/5', '2/3', '3/4', '5/6', '8/9', '9/10']
|
|
||||||
case '16apsk':
|
|
||||||
return ['2/3', '3/4', '4/5', '5/6', '8/9', '9/10']
|
|
||||||
case '32apsk':
|
|
||||||
return ['3/4', '4/5', '5/6', '8/9', '9/10']
|
|
||||||
default:
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// ========== include from 'common/all-params-methods.js.j2'
|
|
||||||
{% include 'common/all-params-methods.js.j2' %}
|
|
||||||
// ========== include end from 'common/all-params-methods.js.j2'
|
|
||||||
|
|
||||||
{% for tab in header_tabs %}
|
{% for tab in header_tabs %}
|
||||||
// ========== include from '{{ 'common/' ~ tab.name ~ '-methods.js.j2' }}'
|
// ========== include from '{{ 'common/' ~ tab.name ~ '-methods.js.j2' }}'
|
||||||
{% include 'common/' ~ tab.name ~ '-methods.js.j2' ignore missing %}
|
{% include 'common/' ~ tab.name ~ '-methods.js.j2' %}
|
||||||
// ========== include end from '{{ 'common/' ~ tab.name ~ '-methods.js.j2' }}'
|
// ========== include end from '{{ 'common/' ~ tab.name ~ '-methods.js.j2' }}'
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -170,12 +141,9 @@
|
|||||||
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 paramGroupsList %}
|
{% for pg in params.paramGroupsList %}
|
||||||
this.update{{ pg | capitalize }}Settings(vals)
|
this.update{{ pg | capitalize }}Settings(vals)
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if 'qos' in tab_names_array %}
|
|
||||||
this.updateQosSettings(vals)
|
|
||||||
{% endif %}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
doFetchSettings().then(() => {})
|
doFetchSettings().then(() => {})
|
||||||
|
50
src/main.cpp
50
src/main.cpp
@ -286,7 +286,7 @@ public:
|
|||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/set/buclnb", this->auth, http::auth::User::SUPERUSER, [this](const auto& req, auto& rep) {
|
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/set/bucLnb", this->auth, http::auth::User::SUPERUSER, [this](const auto& req, auto& rep) {
|
||||||
if (req.method != "POST") {
|
if (req.method != "POST") {
|
||||||
http::server::stockReply(http::server::bad_request, rep);
|
http::server::stockReply(http::server::bad_request, rep);
|
||||||
}
|
}
|
||||||
@ -308,7 +308,7 @@ public:
|
|||||||
result += "}";
|
result += "}";
|
||||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||||
} catch (std::exception& e) {
|
} catch (std::exception& e) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/buclnb): Can't set BUC LNB settings: " << e.what();
|
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/bucLnb): Can't set settings: " << e.what();
|
||||||
const std::string result = R"({"status":"error"})";
|
const std::string result = R"({"status":"error"})";
|
||||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||||
}
|
}
|
||||||
@ -392,7 +392,35 @@ public:
|
|||||||
result += "}";
|
result += "}";
|
||||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||||
} catch (std::exception& e) {
|
} catch (std::exception& e) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/network): Can't set network settings: " << e.what();
|
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/rxtx): Can't set RX/TX settings: " << e.what();
|
||||||
|
const std::string result = R"({"status":"error"})";
|
||||||
|
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/set/debugSend", this->auth, http::auth::User::EDIT_SETTINGS, [this](const auto& req, auto& rep) {
|
||||||
|
if (req.method != "POST") {
|
||||||
|
http::server::stockReply(http::server::bad_request, rep);
|
||||||
|
}
|
||||||
|
|
||||||
|
rep.status = http::server::ok;
|
||||||
|
rep.headers.clear();
|
||||||
|
rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)});
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss.str(std::string(req.payload.begin(), req.payload.end()));
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
read_json(ss, pt);
|
||||||
|
|
||||||
|
api->setDebugSendSettings(pt);
|
||||||
|
|
||||||
|
std::string result = R"({"status":"ok","settings":)";
|
||||||
|
result += api->loadSettings();
|
||||||
|
result += "}";
|
||||||
|
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||||
|
} catch (std::exception& e) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/rxtx): Can't set RX/TX settings: " << e.what();
|
||||||
const std::string result = R"({"status":"error"})";
|
const std::string result = R"({"status":"error"})";
|
||||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||||
}
|
}
|
||||||
@ -457,16 +485,16 @@ public:
|
|||||||
|
|
||||||
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/dev", this->auth, http::auth::User::SUPERUSER, [this](const auto& req, auto& rep) {
|
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/dev", this->auth, http::auth::User::SUPERUSER, [this](const auto& req, auto& rep) {
|
||||||
boost::ignore_unused(req);
|
boost::ignore_unused(req);
|
||||||
sf->serve(DEV_HTML, rep);
|
sf->serve(INTERNET_JPG, rep);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/dev/fetchParams", this->auth, http::auth::User::SUPERUSER, [this](const auto& req, auto& rep) {
|
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/dev/fetchParams", this->auth, http::auth::User::SUPERUSER, [this](const auto& req, auto& rep) {
|
||||||
// rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)});
|
rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)});
|
||||||
// std::string result = R"({"status":"ok","fwsize":)";
|
std::string result = R"({"status":"ok","fwsize":)";
|
||||||
// result += std::to_string(req.payload.size());
|
result += std::to_string(req.payload.size());
|
||||||
// result += R"(,"sha256":")";
|
result += R"(,"sha256":")";
|
||||||
// result += "\"}";
|
result += "\"}";
|
||||||
// }));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
~ServerResources() = default;
|
~ServerResources() = default;
|
||||||
|
@ -16,48 +16,48 @@ typedef boost::property_tree::ptree::path_type json_path;
|
|||||||
|
|
||||||
static constexpr const char* DEFAULT_QOS_CLASSES = R"({"rt1":[],"rt2":[],"rt3":[],"cd":[]})";
|
static constexpr const char* DEFAULT_QOS_CLASSES = R"({"rt1":[],"rt2":[],"rt3":[],"cd":[]})";
|
||||||
|
|
||||||
// static int calculateSubnetMask(const std::string& subnet_mask) {
|
static int calculateSubnetMask(const std::string& subnet_mask) {
|
||||||
// int mask = 0;
|
int mask = 0;
|
||||||
// std::istringstream iss(subnet_mask);
|
std::istringstream iss(subnet_mask);
|
||||||
// std::string octet;
|
std::string octet;
|
||||||
// while (std::getline(iss, octet, '.')) {
|
while (std::getline(iss, octet, '.')) {
|
||||||
// int octet_value = std::stoi(octet);
|
int octet_value = std::stoi(octet);
|
||||||
// for (int i = 7; i >= 0; i--) {
|
for (int i = 7; i >= 0; i--) {
|
||||||
// if (octet_value & (1 << i)) {
|
if (octet_value & (1 << i)) {
|
||||||
// mask++;
|
mask++;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// return mask;
|
return mask;
|
||||||
// }
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Преобразует строку вида `1.2.3.4/24` в пару строк вида `1.2.3.4` `255.255.255.0`
|
* Преобразует строку вида `1.2.3.4/24` в пару строк вида `1.2.3.4` `255.255.255.0`
|
||||||
*/
|
*/
|
||||||
// std::pair<std::string, std::string> splitIpAndMask(const std::string& input) {
|
std::pair<std::string, std::string> splitIpAndMask(const std::string& input) {
|
||||||
// auto pos = input.find('/');
|
auto pos = input.find('/');
|
||||||
// if (pos == std::string::npos) {
|
if (pos == std::string::npos) {
|
||||||
// // Обработка ошибки: нет символа '/'
|
// Обработка ошибки: нет символа '/'
|
||||||
// throw std::runtime_error("address not contains mask");
|
throw std::runtime_error("address not contains mask");
|
||||||
// }
|
}
|
||||||
// std::string ip = input.substr(0, pos);
|
std::string ip = input.substr(0, pos);
|
||||||
// const unsigned int mask_int = std::stoul(input.substr(pos + 1));
|
const unsigned int mask_int = std::stoul(input.substr(pos + 1));
|
||||||
//
|
|
||||||
// if (mask_int > 32) {
|
if (mask_int > 32) {
|
||||||
// throw std::runtime_error("invalid mask");
|
throw std::runtime_error("invalid mask");
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// std::string mask_binary = std::string(mask_int, '1') + std::string(32 - mask_int, '0');
|
std::string mask_binary = std::string(mask_int, '1') + std::string(32 - mask_int, '0');
|
||||||
// std::string mask_str;
|
std::string mask_str;
|
||||||
//
|
|
||||||
// for (unsigned int i = 0; i < 4; ++i) {
|
for (unsigned int i = 0; i < 4; ++i) {
|
||||||
// std::string octet = mask_binary.substr(i * 8u, 8);
|
std::string octet = mask_binary.substr(i * 8u, 8);
|
||||||
// int octet_value = std::stoi(octet, nullptr, 2);
|
int octet_value = std::stoi(octet, nullptr, 2);
|
||||||
// mask_str += std::to_string(octet_value) + (i < 3 ? "." : "");
|
mask_str += std::to_string(octet_value) + (i < 3 ? "." : "");
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// return std::make_pair(ip, mask_str);
|
return std::make_pair(ip, mask_str);
|
||||||
// }
|
}
|
||||||
|
|
||||||
static inline void rtrim(std::string &s) {
|
static inline void rtrim(std::string &s) {
|
||||||
s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {
|
s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {
|
||||||
@ -67,8 +67,7 @@ static inline void rtrim(std::string &s) {
|
|||||||
|
|
||||||
class TerminalNetworkSettings {
|
class TerminalNetworkSettings {
|
||||||
public:
|
public:
|
||||||
std::string managementIp, managementGateway, dataIp;
|
std::string managementIp, managementGateway, mode, dataIp;
|
||||||
bool isL2 = true;
|
|
||||||
unsigned int dataMtu = 1500;
|
unsigned int dataMtu = 1500;
|
||||||
|
|
||||||
TerminalNetworkSettings() = default;
|
TerminalNetworkSettings() = default;
|
||||||
@ -78,10 +77,10 @@ public:
|
|||||||
TerminalNetworkSettings& operator= (const TerminalNetworkSettings& src) = default;
|
TerminalNetworkSettings& operator= (const TerminalNetworkSettings& src) = default;
|
||||||
|
|
||||||
void loadDefaults() {
|
void loadDefaults() {
|
||||||
managementIp = "0.0.0.0";
|
managementIp = "0.0.0.0/0";
|
||||||
managementGateway = "";
|
managementGateway = "";
|
||||||
isL2 = true;
|
mode = "l2";
|
||||||
dataIp = "0.0.0.0";
|
dataIp = "0.0.0.0/0";
|
||||||
dataMtu = 1500;
|
dataMtu = 1500;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -194,22 +193,21 @@ private:
|
|||||||
|
|
||||||
void updateNetworkSettings() {
|
void updateNetworkSettings() {
|
||||||
TerminalNetworkSettings s;
|
TerminalNetworkSettings s;
|
||||||
|
std::string tmp;
|
||||||
std::lock_guard lock(this->cpApiMutex);
|
std::lock_guard lock(this->cpApiMutex);
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &s.managementIp));
|
logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &tmp));
|
||||||
// s.managementIp = tmp + "/";
|
s.managementIp = tmp + "/";
|
||||||
// tmp.clear(); logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(mask)", CP_GetNetwork(sid, "mask", &tmp));
|
tmp.clear(); logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(mask)", CP_GetNetwork(sid, "mask", &tmp));
|
||||||
// s.managementIp += std::to_string(calculateSubnetMask(tmp));
|
s.managementIp += std::to_string(calculateSubnetMask(tmp));
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(gateway)", CP_GetNetwork(sid, "gateway", &s.managementGateway));
|
tmp.clear(); logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(gateway)", CP_GetNetwork(sid, "gateway", &s.managementGateway)); s.managementGateway = tmp;
|
||||||
std::string nm; logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &nm));
|
tmp.clear(); logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &tmp));
|
||||||
if (nm == "tun") {
|
if (tmp == "tun") {
|
||||||
s.isL2 = false;
|
s.mode = "l3";
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(addr_data)", CP_GetNetwork(sid, "addr_data", &s.dataIp));
|
logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(addr_data)", CP_GetNetwork(sid, "addr_data", &s.dataIp));
|
||||||
// s.dataIp += "/24";
|
s.dataIp += "/24";
|
||||||
} else {
|
} else {
|
||||||
s.isL2 = true;
|
s.mode = "l2";
|
||||||
// s.dataIp = "0.0.0.0/24";
|
s.dataIp = "0.0.0.0/24";
|
||||||
s.dataIp = "0.0.0.0";
|
|
||||||
}
|
}
|
||||||
s.dataMtu = 1500;
|
s.dataMtu = 1500;
|
||||||
|
|
||||||
@ -566,39 +564,41 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setNetworkSettings(TerminalNetworkSettings& s, bool readback = true) {
|
void setNetworkSettings(TerminalNetworkSettings& s, bool readback = true) {
|
||||||
// const auto mang = splitIpAndMask();
|
const auto mang = splitIpAndMask(s.managementIp);
|
||||||
// std::pair<std::string, std::string> data;
|
std::pair<std::string, std::string> data;
|
||||||
// if (!s.isL2) {
|
bool isL2;
|
||||||
// data = splitIpAndMask(s.dataIp);
|
if (s.mode == "l2") { isL2 = true; }
|
||||||
// }
|
else if (s.mode == "l3") { isL2 = false; data = splitIpAndMask(s.dataIp); }
|
||||||
|
else { throw std::runtime_error("invalid mode"); }
|
||||||
|
|
||||||
std::lock_guard lock(this->cpApiMutex);
|
std::lock_guard lock(this->cpApiMutex);
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(mode)", CP_SetNetwork(sid, "mode", s.isL2 ? "tap" : "tun"));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(mode)", CP_SetNetwork(sid, "mode", isL2 ? "tap" : "tun"));
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(addr)", CP_SetNetwork(sid, "addr", s.managementIp.c_str()));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(addr)", CP_SetNetwork(sid, "addr", mang.first.c_str()));
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(mask)", CP_SetNetwork(sid, "mask", "255.255.255.0"));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(mask)", CP_SetNetwork(sid, "mask", mang.second.c_str()));
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(gateway)", CP_SetNetwork(sid, "gateway", s.managementGateway.c_str()));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(gateway)", CP_SetNetwork(sid, "gateway", s.managementGateway.c_str()));
|
||||||
if (!s.isL2) {
|
if (!isL2) {
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(data_addr)", CP_SetNetwork(sid, "data_addr", s.dataIp.c_str()));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(data_addr)", CP_SetNetwork(sid, "data_addr", data.first.c_str()));
|
||||||
// TODO маска не устанавливается, потому что в API этого нет
|
// TODO маска не устанавливается, потому что в API этого нет
|
||||||
}
|
}
|
||||||
// TODO MTU не устанавливается, потому что в API этого нет
|
// TODO MTU не устанавливается, потому что в API этого нет
|
||||||
|
|
||||||
if (readback) {
|
if (readback) {
|
||||||
|
std::string tmp;
|
||||||
s.loadDefaults();
|
s.loadDefaults();
|
||||||
s.managementIp.clear();
|
s.managementIp.clear();
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &s.managementIp));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &s.managementIp));
|
||||||
// logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(mask)", CP_GetNetwork(sid, "mask", &tmp));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(mask)", CP_GetNetwork(sid, "mask", &tmp));
|
||||||
// s.managementIp += "/";
|
s.managementIp += "/";
|
||||||
// s.managementIp += std::to_string(calculateSubnetMask(tmp));
|
s.managementIp += std::to_string(calculateSubnetMask(tmp));
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(gateway)", CP_GetNetwork(sid, "gateway", &s.managementGateway));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(gateway)", CP_GetNetwork(sid, "gateway", &s.managementGateway));
|
||||||
std::string nm; logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &nm));
|
tmp.clear(); logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &tmp));
|
||||||
if (nm == "tun") {
|
if (tmp == "tun") {
|
||||||
s.isL2 = false;
|
s.mode = "l3";
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(addr_data)", CP_GetNetwork(sid, "addr_data", &s.dataIp));
|
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(addr_data)", CP_GetNetwork(sid, "addr_data", &s.dataIp));
|
||||||
} else {
|
} else {
|
||||||
s.isL2 = true;
|
s.mode = "l2";
|
||||||
s.dataIp = "0.0.0.0";
|
s.dataIp = "0.0.0.0/24";
|
||||||
}
|
}
|
||||||
s.dataMtu = 1500;
|
s.dataMtu = 1500;
|
||||||
{
|
{
|
||||||
@ -799,59 +799,6 @@ void api_driver::ApiDriver::resetPacketStatistics() const {
|
|||||||
this->daemon->resetPacketStatistics();
|
this->daemon->resetPacketStatistics();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MODEM_IS_SCPC
|
|
||||||
struct ModcodDef_t {const char* modulation; const char* speed;};
|
|
||||||
const static ModcodDef_t ModcodDefs[] = {
|
|
||||||
{.modulation = "dummy", .speed = "0"},
|
|
||||||
{.modulation = "qpsk", .speed = "1/4"},
|
|
||||||
{.modulation = "qpsk", .speed = "1/3"},
|
|
||||||
{.modulation = "qpsk", .speed = "2/5"},
|
|
||||||
{.modulation = "qpsk", .speed = "1/2"},
|
|
||||||
{.modulation = "qpsk", .speed = "3/5"},
|
|
||||||
{.modulation = "qpsk", .speed = "2/3"},
|
|
||||||
{.modulation = "qpsk", .speed = "3/4"},
|
|
||||||
{.modulation = "qpsk", .speed = "4/5"},
|
|
||||||
{.modulation = "qpsk", .speed = "5/6"},
|
|
||||||
{.modulation = "qpsk", .speed = "8/9"},
|
|
||||||
{.modulation = "qpsk", .speed = "9/10"},
|
|
||||||
{.modulation = "8psk", .speed = "3/5"},
|
|
||||||
{.modulation = "8psk", .speed = "2/3"},
|
|
||||||
{.modulation = "8psk", .speed = "3/4"},
|
|
||||||
{.modulation = "8psk", .speed = "5/6"},
|
|
||||||
{.modulation = "8psk", .speed = "8/9"},
|
|
||||||
{.modulation = "8psk", .speed = "9/10"},
|
|
||||||
{.modulation = "16apsk", .speed = "2/3"},
|
|
||||||
{.modulation = "16apsk", .speed = "3/4"},
|
|
||||||
{.modulation = "16apsk", .speed = "4/5"},
|
|
||||||
{.modulation = "16apsk", .speed = "5/6"},
|
|
||||||
{.modulation = "16apsk", .speed = "8/9"},
|
|
||||||
{.modulation = "16apsk", .speed = "9/10"},
|
|
||||||
{.modulation = "32apsk", .speed = "3/4"},
|
|
||||||
{.modulation = "32apsk", .speed = "4/5"},
|
|
||||||
{.modulation = "32apsk", .speed = "5/6"},
|
|
||||||
{.modulation = "32apsk", .speed = "8/9"},
|
|
||||||
{.modulation = "32apsk", .speed = "9/10"},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char* extractModcodModulation(uint32_t modcod, bool defaultQpsk1_4 = true) {
|
|
||||||
modcod >>= 2;
|
|
||||||
const auto* d = defaultQpsk1_4 ? ModcodDefs : ModcodDefs + 1;
|
|
||||||
if (modcod < 28) {
|
|
||||||
d = ModcodDefs + modcod;
|
|
||||||
}
|
|
||||||
return d->modulation;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* extractModcodSpeed(uint32_t modcod, bool defaultQpsk1_4 = true) {
|
|
||||||
modcod >>= 2;
|
|
||||||
const auto* d = defaultQpsk1_4 ? ModcodDefs : ModcodDefs + 1;
|
|
||||||
if (modcod < 28) {
|
|
||||||
d = ModcodDefs + modcod;
|
|
||||||
}
|
|
||||||
return d->speed;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::string api_driver::ApiDriver::loadSettings() const {
|
std::string api_driver::ApiDriver::loadSettings() const {
|
||||||
if (daemon == nullptr) {
|
if (daemon == nullptr) {
|
||||||
return R"({"error": "api daemon not started!"})";
|
return R"({"error": "api daemon not started!"})";
|
||||||
@ -871,92 +818,91 @@ std::string api_driver::ApiDriver::loadSettings() const {
|
|||||||
daemon->getNetworkSettings(network);
|
daemon->getNetworkSettings(network);
|
||||||
|
|
||||||
std::stringstream result;
|
std::stringstream result;
|
||||||
result << "{\n\"txAutoStart\":" << boolAsStr(modSettings.is_save_current_state);
|
|
||||||
#ifdef MODEM_IS_SCPC
|
#ifdef MODEM_IS_SCPC
|
||||||
result << ",\"txModulatorIsTest\":" << boolAsStr(!modSettings.is_carrier);
|
result << "{\n\"general.isCinC\":" << boolAsStr(modSettings.is_cinc);
|
||||||
#endif
|
result << ",\"general.txEn\":" << boolAsStr(modSettings.tx_is_on);
|
||||||
result << ",\"txIsTestInput\":" << boolAsStr(modSettings.is_test_data);
|
result << ",\"general.modulatorMode\":" << (modSettings.is_carrier ? "\"normal\"" : "\"test\"");
|
||||||
result << ",\"txCentralFreq\":"; writeDouble(result, modSettings.central_freq_in_kGz);
|
result << ",\"general.autoStartTx\":" << boolAsStr(modSettings.is_save_current_state);
|
||||||
result << ",\"txBaudrate\":" << modSettings.baudrate;
|
result << ",\"general.isTestInputData\":" << boolAsStr(modSettings.is_test_data);
|
||||||
result << ",\"txRolloff\":" << static_cast<int>(modSettings.rollof * 100);
|
result << ",\n\"tx.attenuation\":"; writeDouble(result, modSettings.attenuation);
|
||||||
#ifdef MODEM_IS_SCPC
|
result << ",\"tx.rolloff\":" << static_cast<int>(modSettings.rollof * 100);
|
||||||
// result << ",\"txGoldan\":" << static_cast<int>(modSettings.qold_seq_is_active); // TODO обновить библиотеку
|
result << ",\"tx.cymRate\":" << modSettings.baudrate;
|
||||||
#endif
|
result << ",\"tx.centerFreq\":"; writeDouble(result, modSettings.central_freq_in_kGz, 3);
|
||||||
result << ",\"txAttenuation\":"; writeDouble(result, modSettings.attenuation);
|
result << ",\"dvbs2.frameSizeNormal\":" << boolAsStr(!(modSettings.modcod_tx & 2));
|
||||||
|
result << ",\"dvbs2.ccm_modcod\":" << (modSettings.modcod_tx >> 2);
|
||||||
|
|
||||||
#ifdef MODEM_IS_SCPC
|
// result << ",\"dvbs2.isPilots\":" << "null";
|
||||||
result << ",\n\"isCinC\":" << boolAsStr(modSettings.is_cinc);
|
result << ",\n\"dvbs2.isAcm\":" << boolAsStr(acmSettings.enable);
|
||||||
result << ",\n\"dvbServicePacketPeriod\":" << acmSettings.period_pack;
|
result << ",\"dvbs2.acm_maxModcod\":" << (acmSettings.max_modcod >> 2);
|
||||||
result << ",\"dvbIsAcm\":" << boolAsStr(acmSettings.enable);
|
result << ",\"dvbs2.acm_minModcod\":" << (acmSettings.min_modcod >> 2);
|
||||||
result << ",\"txFrameSizeNormal\":" << boolAsStr((modSettings.modcod_tx & 2) == 0);
|
result << ",\"dvbs2.snrReserve\":"; writeDouble(result, acmSettings.snr_treashold_acm);
|
||||||
|
result << ",\"dvbs2.servicePacketPeriod\":" << acmSettings.period_pack;
|
||||||
|
|
||||||
result << R"(,"dvbCcmModulation":")" << extractModcodModulation(modSettings.modcod_tx) << "\"";
|
result << ",\n\"acm.en\":" << boolAsStr(acmSettings.enable_auto_atten);
|
||||||
result << R"(,"dvbCcmSpeed":")" << extractModcodSpeed(modSettings.modcod_tx) << "\"";
|
result << ",\"acm.maxAttenuation\":"; writeDouble(result, acmSettings.max_attenuation);
|
||||||
result << R"(,"dvbAcmMinModulation":")" << extractModcodModulation(acmSettings.min_modcod) << "\"";
|
result << ",\"acm.minAttenuation\":"; writeDouble(result, acmSettings.min_attenuation);
|
||||||
result << R"(,"dvbAcmMinSpeed":")" << extractModcodSpeed(acmSettings.min_modcod) << "\"";
|
result << ",\"acm.requiredSnr\":"; writeDouble(result, acmSettings.snr_treashold);
|
||||||
result << R"(,"dvbAcmMaxModulation":")" << extractModcodModulation(acmSettings.max_modcod) << "\"";
|
|
||||||
result << R"(,"dvbAcmMaxSpeed":")" << extractModcodSpeed(acmSettings.max_modcod) << "\"";
|
|
||||||
result << ",\"dvbSnrReserve\":"; writeDouble(result, acmSettings.snr_treashold_acm);
|
|
||||||
|
|
||||||
result << ",\n\"aupcEn\":" << boolAsStr(acmSettings.enable_auto_atten);
|
result << ",\n\"rx.gainMode\":" << (demodSettings.is_aru_on ? "\"auto\"" : "\"manual\"");
|
||||||
result << ",\"aupcMinAttenuation\":"; writeDouble(result, acmSettings.min_attenuation);
|
result << ",\"rx.manualGain\":"; writeDouble(result, demodSettings.gain);
|
||||||
result << ",\"aupcMaxAttenuation\":"; writeDouble(result, acmSettings.max_attenuation);
|
result << ",\"rx.spectrumInversion\":" << boolAsStr(demodSettings.is_rvt_iq);
|
||||||
result << ",\"aupcRequiredSnr\":"; writeDouble(result, acmSettings.snr_treashold);
|
result << ",\"rx.rolloff\":" << static_cast<int>(demodSettings.rollof * 100);
|
||||||
|
result << ",\"rx.cymRate\":" << demodSettings.baudrate;
|
||||||
|
result << ",\"rx.centerFreq\":"; writeDouble(result, demodSettings.central_freq_in_kGz);
|
||||||
|
|
||||||
result << ",\n\"cincIsPositional\":" << boolAsStr(!dpdiSettings.is_delay_window);
|
result << ",\n\"cinc.mode\":" << (dpdiSettings.is_delay_window ? "\"delay\"" : "\"positional\"");
|
||||||
result << ",\"cincSearchBandwidth\":" << dpdiSettings.freq_offset; // полоса поиска в кГц
|
result << ",\"cinc.searchBandwidth\":" << dpdiSettings.freq_offset; // полоса поиска в кГц
|
||||||
result << ",\"cincPositionStationLatitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.latitude_station_grad, dpdiSettings.latitude_station_minute), 6);
|
result << ",\"cinc.position.station.latitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.latitude_station_grad, dpdiSettings.latitude_station_minute), 6);
|
||||||
result << ",\"cincPositionStationLongitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.longitude_station_grad, dpdiSettings.longitude_station_minute), 6);
|
result << ",\"cinc.position.station.longitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.longitude_station_grad, dpdiSettings.longitude_station_minute), 6);
|
||||||
result << ",\"cincPositionSatelliteLongitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.longitude_sattelite_grad, dpdiSettings.longitude_sattelite_minute), 6);
|
result << ",\"cinc.position.satelliteLongitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.longitude_sattelite_grad, dpdiSettings.longitude_sattelite_minute), 6);
|
||||||
result << ",\"cincDelayMin\":" << dpdiSettings.min_delay;
|
result << ",\"cinc.delayMin\":" << dpdiSettings.min_delay;
|
||||||
result << ",\"cincDelayMax\":" << dpdiSettings.max_delay;
|
result << ",\"cinc.delayMax\":" << dpdiSettings.max_delay;
|
||||||
|
#else
|
||||||
|
result << "{\n\"tx.txEn\":" << boolAsStr(modSettings.tx_is_on);
|
||||||
|
result << ",\"tx.isTestInputData\":" << boolAsStr(modSettings.is_test_data);
|
||||||
|
result << ",\"tx.cymRate\":" << modSettings.baudrate;
|
||||||
|
result << ",\"tx.centerFreq\":"; writeDouble(result, modSettings.central_freq_in_kGz, 3);
|
||||||
|
result << ",\"tx.attenuation\":"; writeDouble(result, modSettings.attenuation);
|
||||||
|
|
||||||
|
result << ",\n\"rx.gainMode\":" << (demodSettings.is_aru_on ? "\"auto\"" : "\"manual\"");
|
||||||
|
result << ",\"rx.manualGain\":"; writeDouble(result, demodSettings.gain);
|
||||||
|
result << ",\"rx.spectrumInversion\":" << boolAsStr(demodSettings.is_rvt_iq);
|
||||||
|
result << ",\"rx.rolloff\":" << static_cast<int>(demodSettings.rollof * 100);
|
||||||
|
result << ",\"rx.cymRate\":" << demodSettings.baudrate;
|
||||||
|
result << ",\"rx.centerFreq\":"; writeDouble(result, demodSettings.central_freq_in_kGz);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
result << ",\n\"rxAgcEn\":" << boolAsStr(demodSettings.is_aru_on);
|
result << ",\n\"buc.refClk10M\":" << boolAsStr(bucLnb.is_ref_10MHz_buc);
|
||||||
result << ",\"rxSpectrumInversion\":" << boolAsStr(demodSettings.is_rvt_iq);
|
|
||||||
result << ",\"rxManualGain\":"; writeDouble(result, demodSettings.gain);
|
|
||||||
result << ",\"rxCentralFreq\":"; writeDouble(result, demodSettings.central_freq_in_kGz);
|
|
||||||
result << ",\"rxBaudrate\":" << demodSettings.baudrate;
|
|
||||||
result << ",\"rxRolloff\":" << static_cast<int>(demodSettings.rollof * 100);
|
|
||||||
#ifdef MODEM_IS_SCPC
|
|
||||||
// result << ",\"txGoldan\":" << static_cast<int>(demodSettings.qold_seq_is_active); // TODO обновить библиотеку
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// BUC LNB
|
|
||||||
result << ",\n\"bucRefClk10M\":" << boolAsStr(bucLnb.is_ref_10MHz_buc);
|
|
||||||
switch (bucLnb.buc) {
|
switch (bucLnb.buc) {
|
||||||
case voltage_buc::_24V: result << ",\"bucPowering\":24"; break;
|
case voltage_buc::_24V: result << ",\"buc.powering\":24"; break;
|
||||||
#ifdef MODEM_IS_SCPC
|
case voltage_buc::_48V: result << ",\"buc.powering\":48"; break;
|
||||||
case voltage_buc::_48V: result << ",\"bucPowering\":48"; break;
|
|
||||||
#endif
|
|
||||||
case voltage_buc::DISABLE:
|
case voltage_buc::DISABLE:
|
||||||
default: result << ",\"bucPowering\":0";
|
default: result << ",\"buc.powering\":0";
|
||||||
}
|
}
|
||||||
|
|
||||||
result << ",\"lnbRefClk10M\":" << boolAsStr(bucLnb.is_ref_10MHz_lnb);
|
result << ",\n\"lnb.refClk10M\":" << boolAsStr(bucLnb.is_ref_10MHz_lnb);
|
||||||
switch (bucLnb.lnb) {
|
switch (bucLnb.lnb) {
|
||||||
case voltage_lnb::_13V: result << ",\"lnbPowering\":13"; break;
|
case voltage_lnb::_13V: result << ",\"lnb.powering\":13"; break;
|
||||||
case voltage_lnb::_18V: result << ",\"lnbPowering\":18"; break;
|
case voltage_lnb::_18V: result << ",\"lnb.powering\":18"; break;
|
||||||
case voltage_lnb::_24V: result << ",\"lnbPowering\":24"; break;
|
case voltage_lnb::_24V: result << ",\"lnb.powering\":24"; break;
|
||||||
case voltage_lnb::DISABLE:
|
case voltage_lnb::DISABLE:
|
||||||
default: result << ",\"lnbPowering\":0";
|
default: result << ",\"lnb.powering\":0";
|
||||||
}
|
}
|
||||||
|
|
||||||
result << ",\"srvRefClk10M\":" << boolAsStr(bucLnb.is_ref_10MHz_output);
|
result << ",\n\"serviceSettings.refClk10M\":" << boolAsStr(bucLnb.is_ref_10MHz_output);
|
||||||
result << ",\"bucLnbAutoStart\":" << boolAsStr(bucLnb.is_save_current_state);
|
result << ",\"serviceSettings.autoStart\":" << boolAsStr(bucLnb.is_save_current_state);
|
||||||
|
|
||||||
// QoS
|
|
||||||
bool qosEnabled = false; std::string qosClasses;
|
bool qosEnabled = false; std::string qosClasses;
|
||||||
daemon->getQosSettings(qosEnabled, qosClasses);
|
daemon->getQosSettings(qosEnabled, qosClasses);
|
||||||
result << ",\n\"qosEnabled\":" << boolAsStr(qosEnabled);
|
result << ",\n\"qos.enabled\":" << boolAsStr(qosEnabled);
|
||||||
result << ",\"qosProfile\":" << qosClasses;
|
result << ",\"qos.profile\":" << qosClasses;
|
||||||
|
|
||||||
// сеть
|
// сеть
|
||||||
result << ",\"netManagementIp\":\n" << buildEscapedString(network.managementIp);
|
result << ",\"network.managementIp\":\n" << buildEscapedString(network.managementIp);
|
||||||
result << ",\"netIsL2\":\n" << boolAsStr(network.isL2);
|
result << ",\"network.managementGateway\":\n" << buildEscapedString(network.managementGateway);
|
||||||
result << ",\"netManagementGateway\":\n" << buildEscapedString(network.managementGateway);
|
result << ",\"network.mode\":\n" << buildEscapedString(network.mode);
|
||||||
result << ",\"netDataIp\":\n" << buildEscapedString(network.dataIp);
|
result << ",\"network.dataIp\":\n" << buildEscapedString(network.dataIp);
|
||||||
result << ",\"netDataMtu\":\n" << network.dataMtu;
|
result << ",\"network.dataMtu\":\n" << network.dataMtu;
|
||||||
|
|
||||||
result << "}";
|
result << "}";
|
||||||
return result.str();
|
return result.str();
|
||||||
@ -978,78 +924,64 @@ std::string api_driver::ApiDriver::loadFirmwareVersion() const {
|
|||||||
return result.str();
|
return result.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MODEM_IS_SCPC
|
|
||||||
static uint32_t buildModcodFromPt(const boost::property_tree::ptree& pt, const std::string& name, bool isShortFrame) {
|
|
||||||
uint32_t modcod = 0;
|
|
||||||
const auto mod = pt.get<std::string>(name + "Modulation");
|
|
||||||
const auto speed = pt.get<std::string>(name + "Speed");
|
|
||||||
uint32_t _index = 0;
|
|
||||||
for (const auto& m: ModcodDefs) {
|
|
||||||
if (mod == m.modulation) {
|
|
||||||
if (modcod == 0) modcod = _index;
|
|
||||||
if (speed == m.speed) {
|
|
||||||
modcod = _index;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_index++;
|
|
||||||
}
|
|
||||||
return (modcod << 2) | (isShortFrame ? 2 : 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void api_driver::ApiDriver::setRxTxSettings(boost::property_tree::ptree &pt) {
|
void api_driver::ApiDriver::setRxTxSettings(boost::property_tree::ptree &pt) {
|
||||||
modulator_settings mod{};
|
modulator_settings mod{};
|
||||||
demodulator_settings demod{};
|
demodulator_settings demod{};
|
||||||
#ifdef MODEM_IS_SCPC
|
#ifdef MODEM_IS_SCPC
|
||||||
ACM_parameters_serv_ acm{};
|
ACM_parameters_serv_ acm{};
|
||||||
daemon->getSettings(&mod, &demod, &acm, nullptr, nullptr);
|
|
||||||
#else
|
|
||||||
daemon->getSettings(&mod, &demod, nullptr);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// для модулятора
|
// для модулятора
|
||||||
#ifdef MODEM_IS_SCPC
|
#ifdef MODEM_IS_SCPC
|
||||||
mod.is_cinc = pt.get<bool>("isCinC");
|
mod.is_cinc = pt.get<bool>(json_path("general.isCinC", '/'));
|
||||||
#endif
|
mod.tx_is_on = pt.get<bool>(json_path("general.txEn", '/'));
|
||||||
mod.tx_is_on = pt.get<bool>("txEn");
|
auto tmp = pt.get<std::string>(json_path("general.modulatorMode", '/'));
|
||||||
#ifdef MODEM_IS_SCPC
|
if (tmp == "normal") { mod.is_carrier = true; }
|
||||||
mod.is_save_current_state = pt.get<bool>("txAutoStart");
|
else if (tmp == "test") { mod.is_carrier = false; }
|
||||||
mod.is_carrier = !pt.get<bool>("txModulatorIsTest");
|
else { throw std::runtime_error("api_driver::ApiDriver::setRxTxSettings(): Wrong carrier mode: " + tmp); }
|
||||||
#endif
|
mod.is_save_current_state = pt.get<bool>(json_path("general.autoStartTx", '/'));
|
||||||
mod.is_test_data = pt.get<bool>("txIsTestInput");
|
mod.is_test_data = pt.get<bool>(json_path("general.isTestInputData", '/'));
|
||||||
mod.central_freq_in_kGz = pt.get<double>("txCentralFreq");
|
mod.attenuation = pt.get<double>(json_path("tx.attenuation", '/'));
|
||||||
mod.baudrate = pt.get<uint32_t>("txBaudrate");
|
mod.rollof = pt.get<double>(json_path("tx.rolloff", '/')) / 100.0;
|
||||||
mod.rollof = pt.get<int>("txRolloff") / 100.0;
|
mod.baudrate = pt.get<uint32_t>(json_path("tx.cymRate", '/'));
|
||||||
#ifdef MODEM_IS_SCPC
|
mod.central_freq_in_kGz = pt.get<double>(json_path("tx.centerFreq", '/'));
|
||||||
//mod.qold_seq_is_active = pt.get<bool>("isCinC");
|
|
||||||
#endif
|
|
||||||
mod.attenuation = pt.get<double>("txAttenuation");
|
|
||||||
|
|
||||||
#ifdef MODEM_IS_SCPC
|
const bool acmIsShortFrame = !pt.get<bool>(json_path("dvbs2.frameSizeNormal", '/'));
|
||||||
const bool acmIsShortFrame = !pt.get<bool>("txFrameSizeNormal");
|
mod.modcod_tx = (pt.get<uint32_t>(json_path("dvbs2.ccm_modcod", '/')) << 2) | (acmIsShortFrame ? 2 : 0);
|
||||||
mod.modcod_tx = buildModcodFromPt(pt, "dvbCcm", acmIsShortFrame);
|
#else
|
||||||
|
mod.tx_is_on = pt.get<bool>(json_path("tx.txEn", '/'));
|
||||||
|
mod.is_test_data = pt.get<bool>(json_path("tx.isTestInputData", '/'));
|
||||||
|
mod.central_freq_in_kGz = pt.get<double>(json_path("tx.centerFreq", '/'));
|
||||||
|
mod.baudrate = pt.get<uint32_t>(json_path("tx.cymRate", '/'));
|
||||||
|
mod.attenuation = pt.get<double>(json_path("tx.attenuation", '/'));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// демодулятор
|
// демодулятор
|
||||||
demod.is_aru_on = pt.get<bool>("rxAgcEn");
|
#ifdef MODEM_IS_SCPC
|
||||||
demod.gain = pt.get<bool>("rxManualGain");
|
tmp = pt.get<std::string>(json_path("rx.gainMode", '/'));
|
||||||
demod.is_rvt_iq = pt.get<bool>("aupcEn");
|
#else
|
||||||
demod.central_freq_in_kGz = pt.get<double>("rxCentralFreq");
|
auto tmp = pt.get<std::string>(json_path("rx.gainMode", '/'));
|
||||||
demod.baudrate = pt.get<uint32_t>("rxBaudrate");
|
#endif
|
||||||
demod.rollof = pt.get<int>("rxRolloff") / 100.0;
|
if (tmp == "auto") { demod.is_aru_on = true; }
|
||||||
|
else if (tmp == "manual") { demod.is_aru_on = false; }
|
||||||
|
else { throw std::runtime_error("api_driver::ApiDriver::setRxTxSettings(): Wrong gain mode: " + tmp); }
|
||||||
|
demod.gain = pt.get<double>(json_path("rx.manualGain", '/'));
|
||||||
|
demod.baudrate = pt.get<uint32_t>(json_path("rx.cymRate", '/'));
|
||||||
|
demod.is_rvt_iq = pt.get<bool>(json_path("rx.spectrumInversion", '/'));
|
||||||
|
demod.rollof = pt.get<double>(json_path("rx.rolloff", '/')) / 100.0;
|
||||||
|
demod.central_freq_in_kGz = pt.get<double>(json_path("rx.centerFreq", '/'));
|
||||||
|
|
||||||
#ifdef MODEM_IS_SCPC
|
#ifdef MODEM_IS_SCPC
|
||||||
// ACM
|
// ACM
|
||||||
acm.period_pack = pt.get<uint32_t>("dvbServicePacketPeriod");
|
acm.enable = pt.get<bool>(json_path("dvbs2.isAcm", '/'));
|
||||||
acm.enable = pt.get<bool>("rxAgcEn");
|
acm.max_modcod = (pt.get<uint32_t>(json_path("dvbs2.acm_maxModcod", '/')) << 2) | (acmIsShortFrame ? 2 : 0);
|
||||||
acm.min_modcod = buildModcodFromPt(pt, "dvbAcmMin", acmIsShortFrame);
|
acm.min_modcod = (pt.get<uint32_t>(json_path("dvbs2.acm_minModcod", '/')) << 2) | (acmIsShortFrame ? 2 : 0);
|
||||||
acm.max_modcod = buildModcodFromPt(pt, "dvbAcmMax", acmIsShortFrame);
|
acm.snr_treashold_acm = pt.get<double>(json_path("dvbs2.snrReserve", '/')); // запас ОСШ
|
||||||
acm.snr_treashold_acm = pt.get<double>("dvbSnrReserve"); // запас ОСШ
|
acm.period_pack = pt.get<uint32_t>(json_path("dvbs2.servicePacketPeriod", '/'));
|
||||||
acm.enable_auto_atten = pt.get<bool>(json_path("aupcEn", '/'));
|
acm.enable_auto_atten = pt.get<bool>(json_path("acm.en", '/'));
|
||||||
acm.min_attenuation = pt.get<int>("aupcMinAttenuation");
|
acm.max_attenuation = pt.get<double>(json_path("acm.maxAttenuation", '/'));
|
||||||
acm.max_attenuation = pt.get<int>("aupcMaxAttenuation");
|
acm.min_attenuation = pt.get<double>(json_path("acm.minAttenuation", '/'));
|
||||||
acm.snr_treashold = pt.get<double>("aupcRequiredSnr");
|
acm.snr_treashold = pt.get<double>(json_path("acm.requiredSnr", '/')); // требуемый ОСШ
|
||||||
|
|
||||||
daemon->setSettingsRxTx(mod, demod, acm);
|
daemon->setSettingsRxTx(mod, demod, acm);
|
||||||
#else
|
#else
|
||||||
@ -1061,23 +993,30 @@ void api_driver::ApiDriver::setRxTxSettings(boost::property_tree::ptree &pt) {
|
|||||||
void api_driver::ApiDriver::setCincSettings(boost::property_tree::ptree &pt) {
|
void api_driver::ApiDriver::setCincSettings(boost::property_tree::ptree &pt) {
|
||||||
DPDI_parmeters s{};
|
DPDI_parmeters s{};
|
||||||
|
|
||||||
s.is_delay_window = !pt.get<bool>("cincIsPositional");
|
//result << ",\n\"cinc.mode\":" << (dpdiSettings.is_delay_window ? "\"delay\"" : "\"positional\"");
|
||||||
s.freq_offset = pt.get<uint32_t>("cincSearchBandwidth");
|
auto tmp = pt.get<std::string>(json_path("cinc.mode", '/'));
|
||||||
|
if (tmp == "delay") { s.is_delay_window = true; }
|
||||||
|
else if (tmp == "positional") { s.is_delay_window = false; }
|
||||||
|
else {
|
||||||
|
throw std::runtime_error("Wrong CinC mode: " + tmp);
|
||||||
|
}
|
||||||
|
|
||||||
auto ctmp = translateCoordinates(pt.get<double>("cincPositionStationLatitude"));
|
auto ctmp = translateCoordinates(pt.get<double>(json_path("cinc.position.station.latitude", '/')));
|
||||||
s.latitude_station_grad = std::get<0>(ctmp);
|
s.latitude_station_grad = std::get<0>(ctmp);
|
||||||
s.latitude_station_minute = std::get<1>(ctmp);
|
s.latitude_station_minute = std::get<1>(ctmp);
|
||||||
|
|
||||||
ctmp = translateCoordinates(pt.get<double>("cincPositionStationLongitude"));
|
ctmp = translateCoordinates(pt.get<double>(json_path("cinc.position.station.longitude", '/')));
|
||||||
s.longitude_station_grad = std::get<0>(ctmp);
|
s.longitude_station_grad = std::get<0>(ctmp);
|
||||||
s.longitude_station_minute = std::get<1>(ctmp);
|
s.longitude_station_minute = std::get<1>(ctmp);
|
||||||
|
|
||||||
ctmp = translateCoordinates(pt.get<double>("cincPositionSatelliteLongitude"));
|
ctmp = translateCoordinates(pt.get<double>(json_path("cinc.position.satelliteLongitude", '/')));
|
||||||
s.longitude_sattelite_grad = std::get<0>(ctmp);
|
s.longitude_sattelite_grad = std::get<0>(ctmp);
|
||||||
s.longitude_sattelite_minute = std::get<1>(ctmp);
|
s.longitude_sattelite_minute = std::get<1>(ctmp);
|
||||||
|
|
||||||
s.min_delay = pt.get<uint32_t>("cincDelayMin");
|
s.max_delay = pt.get<uint32_t>(json_path("cinc.delayMax", '/'));
|
||||||
s.max_delay = pt.get<uint32_t>("cincDelayMax");
|
s.min_delay = pt.get<uint32_t>(json_path("cinc.delayMin", '/'));
|
||||||
|
|
||||||
|
s.freq_offset = pt.get<uint32_t>(json_path("cinc.searchBandwidth", '/'));
|
||||||
|
|
||||||
this->daemon->setSettingsCinc(s);
|
this->daemon->setSettingsCinc(s);
|
||||||
}
|
}
|
||||||
@ -1085,13 +1024,19 @@ void api_driver::ApiDriver::setCincSettings(boost::property_tree::ptree &pt) {
|
|||||||
|
|
||||||
void api_driver::ApiDriver::setBucLnbSettings(boost::property_tree::ptree &pt) {
|
void api_driver::ApiDriver::setBucLnbSettings(boost::property_tree::ptree &pt) {
|
||||||
buc_lnb_settings s{};
|
buc_lnb_settings s{};
|
||||||
#ifdef MODEM_IS_SCPC
|
|
||||||
daemon->getSettings(nullptr, nullptr, nullptr, nullptr, &s);
|
|
||||||
#else
|
|
||||||
daemon->getSettings(nullptr, nullptr, &s);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
auto tmp = pt.get<int>("bucPowering");
|
auto tmp = pt.get<int>(json_path("lnb.powering", '/'));
|
||||||
|
switch (tmp) {
|
||||||
|
case 13: s.lnb = voltage_lnb::_13V; break;
|
||||||
|
case 18: s.lnb = voltage_lnb::_18V; break;
|
||||||
|
case 24: s.lnb = voltage_lnb::_24V; break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
s.lnb = voltage_lnb::DISABLE;
|
||||||
|
}
|
||||||
|
s.is_ref_10MHz_lnb = pt.get<bool>(json_path("lnb.refClk10M", '/'));
|
||||||
|
|
||||||
|
tmp = pt.get<int>(json_path("buc.powering", '/'));
|
||||||
switch (tmp) {
|
switch (tmp) {
|
||||||
case 24: s.buc = voltage_buc::_24V; break;
|
case 24: s.buc = voltage_buc::_24V; break;
|
||||||
#ifdef MODEM_IS_SCPC
|
#ifdef MODEM_IS_SCPC
|
||||||
@ -1101,21 +1046,11 @@ void api_driver::ApiDriver::setBucLnbSettings(boost::property_tree::ptree &pt) {
|
|||||||
default:
|
default:
|
||||||
s.lnb = voltage_lnb::DISABLE;
|
s.lnb = voltage_lnb::DISABLE;
|
||||||
}
|
}
|
||||||
s.is_ref_10MHz_buc = pt.get<bool>("bucRefClk10M");
|
|
||||||
|
|
||||||
tmp = pt.get<int>("lnbPowering");
|
s.is_ref_10MHz_buc = pt.get<bool>(json_path("buc.refClk10M", '/'));
|
||||||
switch (tmp) {
|
|
||||||
case 13: s.lnb = voltage_lnb::_13V; break;
|
|
||||||
case 18: s.lnb = voltage_lnb::_18V; break;
|
|
||||||
case 24: s.lnb = voltage_lnb::_24V; break;
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
s.lnb = voltage_lnb::DISABLE;
|
|
||||||
}
|
|
||||||
s.is_ref_10MHz_lnb = pt.get<bool>("lnbRefClk10M");
|
|
||||||
|
|
||||||
s.is_ref_10MHz_output = pt.get<bool>("srvRefClk10M");
|
s.is_ref_10MHz_output = pt.get<bool>(json_path("serviceSettings.refClk10M", '/'));
|
||||||
s.is_save_current_state = pt.get<bool>("bucLnbAutoStart");
|
s.is_save_current_state = pt.get<bool>(json_path("serviceSettings.autoStart", '/'));
|
||||||
|
|
||||||
this->daemon->setSettingsBucLnb(s);
|
this->daemon->setSettingsBucLnb(s);
|
||||||
}
|
}
|
||||||
@ -1132,17 +1067,19 @@ void api_driver::ApiDriver::setQosSettings(boost::property_tree::ptree &pt) {
|
|||||||
|
|
||||||
void api_driver::ApiDriver::setNetworkSettings(boost::property_tree::ptree &pt) {
|
void api_driver::ApiDriver::setNetworkSettings(boost::property_tree::ptree &pt) {
|
||||||
TerminalNetworkSettings s;
|
TerminalNetworkSettings s;
|
||||||
daemon->getNetworkSettings(s);
|
s.managementIp = pt.get<std::string>(json_path("network.managementIp", '/'));
|
||||||
|
s.managementGateway = pt.get<std::string>(json_path("network.managementGateway", '/'));
|
||||||
s.managementIp = pt.get<std::string>("netManagementIp");
|
s.mode = pt.get<std::string>(json_path("network.mode", '/'));
|
||||||
// s.managementGateway = pt.get<std::string>(json_path("network.managementGateway", '/'));
|
s.dataIp = pt.get<std::string>(json_path("network.dataIp", '/'));
|
||||||
s.isL2 = pt.get<bool>("netIsL2");
|
s.dataMtu = pt.get<unsigned int>(json_path("network.dataMtu", '/'));
|
||||||
s.dataIp = pt.get<std::string>("netDataIp");
|
|
||||||
s.dataMtu = pt.get<unsigned int>("netDataMtu");
|
|
||||||
|
|
||||||
daemon->setNetworkSettings(s);
|
daemon->setNetworkSettings(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void api_driver::ApiDriver::setDebugSendSettings(boost::property_tree::ptree &pt) {
|
||||||
|
boost::ignore_unused(pt);
|
||||||
|
}
|
||||||
|
|
||||||
void api_driver::ApiDriver::resetDefaultSettings() {
|
void api_driver::ApiDriver::resetDefaultSettings() {
|
||||||
daemon->resetDefaultSettings();
|
daemon->resetDefaultSettings();
|
||||||
}
|
}
|
||||||
@ -1161,34 +1098,35 @@ std::string api_driver::ApiDriver::loadSysInfo() {
|
|||||||
struct sysinfo info{};
|
struct sysinfo info{};
|
||||||
sysinfo(&info);
|
sysinfo(&info);
|
||||||
|
|
||||||
// struct sysinfo {
|
struct sysinfo {
|
||||||
// long uptime; /* Seconds since boot */
|
long uptime; /* Seconds since boot */
|
||||||
// unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
|
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
|
||||||
// unsigned long totalram; /* Total usable main memory size */
|
unsigned long totalram; /* Total usable main memory size */
|
||||||
// unsigned long freeram; /* Available memory size */
|
unsigned long freeram; /* Available memory size */
|
||||||
// unsigned long sharedram; /* Amount of shared memory */
|
unsigned long sharedram; /* Amount of shared memory */
|
||||||
// unsigned long bufferram; /* Memory used by buffers */
|
unsigned long bufferram; /* Memory used by buffers */
|
||||||
// unsigned long totalswap; /* Total swap space size */
|
unsigned long totalswap; /* Total swap space size */
|
||||||
// unsigned long freeswap; /* Swap space still available */
|
unsigned long freeswap; /* Swap space still available */
|
||||||
// unsigned short procs; /* Number of current processes */
|
unsigned short procs; /* Number of current processes */
|
||||||
// unsigned long totalhigh; /* Total high memory size */
|
unsigned long totalhigh; /* Total high memory size */
|
||||||
// unsigned long freehigh; /* Available high memory size */
|
unsigned long freehigh; /* Available high memory size */
|
||||||
// unsigned int mem_unit; /* Memory unit size in bytes */
|
unsigned int mem_unit; /* Memory unit size in bytes */
|
||||||
// };
|
};
|
||||||
|
|
||||||
double f_load = 1.0 / (1 << SI_LOAD_SHIFT);
|
|
||||||
|
|
||||||
result << "{\n\"uptime\":" << info.uptime;
|
result << "{\n\"uptime\":" << info.uptime;
|
||||||
result << ",\"load1min\":"; writeDouble(result, f_load * static_cast<double>(info.loads[0]), 2);
|
result << ",\"load1min\":" << info.loads[0];
|
||||||
result << ",\"load5min\":"; writeDouble(result, f_load * static_cast<double>(info.loads[1]), 2);
|
result << ",\"load5min\":" << info.loads[1];
|
||||||
result << ",\"load15min\":"; writeDouble(result, f_load * static_cast<double>(info.loads[2]), 2);
|
result << ",\"load15min\":" << info.loads[2];
|
||||||
result << ",\"totalram\":" << ((info.totalram * info.mem_unit) >> 20); // Mb
|
result << ",\"totalram\":" << info.totalram;
|
||||||
result << ",\"freeram\":" << ((info.freeram * info.mem_unit) >> 20); // Mb
|
result << ",\"freeram\":" << info.freeram;
|
||||||
// result << ",\"sharedram\":" << ((info.sharedram * info.mem_unit) >> 20); // Mb
|
result << ",\"sharedram\":" << info.sharedram;
|
||||||
// result << ",\"bufferram\":" << ((info.bufferram * info.mem_unit) >> 20); // Mb
|
result << ",\"bufferram\":" << info.bufferram;
|
||||||
// result << ",\"totalswap\":" << info.totalswap * info.mem_unit;
|
result << ",\"totalswap\":" << info.totalswap;
|
||||||
// result << ",\"freeswap\":" << info.freeswap * info.mem_unit;
|
result << ",\"freeswap\":" << info.freeswap;
|
||||||
result << ",\"procs\":" << static_cast<long>(info.procs);
|
result << ",\"procs\":" << static_cast<long>(info.procs);
|
||||||
|
result << ",\"totalhigh\":" << info.totalhigh;
|
||||||
|
result << ",\"freehigh\":" << info.freehigh;
|
||||||
|
result << ",\"mem_unit\":" << info.mem_unit;
|
||||||
result << "\n}";
|
result << "\n}";
|
||||||
return result.str();
|
return result.str();
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,8 @@ namespace api_driver {
|
|||||||
|
|
||||||
void setNetworkSettings(boost::property_tree::ptree & pt);
|
void setNetworkSettings(boost::property_tree::ptree & pt);
|
||||||
|
|
||||||
|
void setDebugSendSettings(boost::property_tree::ptree & pt);
|
||||||
|
|
||||||
void resetDefaultSettings();
|
void resetDefaultSettings();
|
||||||
|
|
||||||
void executeInApi(const std::function<void(TSID sid)>& callback);
|
void executeInApi(const std::function<void(TSID sid)>& callback);
|
||||||
|
@ -135,7 +135,7 @@ select * {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.settings-set-container th, .settings-set-container td {
|
.settings-set-container th, .settings-set-container td {
|
||||||
border-bottom: solid 1px var(--bg-element);
|
border-bottom: solid 1px var(--text-color2);
|
||||||
}
|
}
|
||||||
.settings-set-container table { border-collapse: collapse; }
|
.settings-set-container table { border-collapse: collapse; }
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -105,132 +105,112 @@
|
|||||||
<tr><th>Температура ZYNQ</th><td>{{ statDevice.zynq }} °C</td></tr>
|
<tr><th>Температура ZYNQ</th><td>{{ statDevice.zynq }} °C</td></tr>
|
||||||
<tr><th>Температура FPGA</th><td>{{ statDevice.fpga }} °C</td></tr>
|
<tr><th>Температура FPGA</th><td>{{ statDevice.fpga }} °C</td></tr>
|
||||||
<tr><th>Uptime</th><td>{{ statOs.uptime }}</td></tr>
|
<tr><th>Uptime</th><td>{{ statOs.uptime }}</td></tr>
|
||||||
<tr><th>Load average</th><td>{{ statOs.load1 }} {{ statOs.load5 }} {{ statOs.load15 }}</td></tr>
|
|
||||||
<tr><th>RAM total/free</th><td>{{ statOs.totalram }}Mb/{{ statOs.freeram }}Mb</td></tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete">
|
<div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete">
|
||||||
<h2>Настройки приема/передачи</h2>
|
<h2>Настройки приема/передачи</h2>
|
||||||
<div class="tabs-item-flex-container">
|
<div class="tabs-item-flex-container">
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<h3>Настройки передатчика</h3>
|
<h3>Настройки передатчика</h3>
|
||||||
<label>
|
<label>
|
||||||
<span>Включить передатчик</span>
|
<span>Включить передатчик</span>
|
||||||
<span class="toggle-input"><input type="checkbox" v-model="paramRxtx.txEn" /><span class="slider"></span></span>
|
<span class="toggle-input">
|
||||||
</label>
|
<input type="checkbox" v-model="paramRxtx.txEn" />
|
||||||
<label>
|
<span class="slider"></span>
|
||||||
<span>Входные данные</span>
|
</span>
|
||||||
<select v-model="paramRxtx.txIsTestInput">
|
</label>
|
||||||
<option :value="false">SCPC</option>
|
<label>
|
||||||
<option :value="true">Тест</option>
|
<span>Входные данные</span>
|
||||||
</select>
|
<select v-model="paramRxtx.txIsTestInput">
|
||||||
</label>
|
<option :value="true">Тест</option>
|
||||||
<label v-show="paramRxrx.txIsTestInput"><span>Центральная частота, КГц</span><input type="number" v-model="paramRxtx.txCentralFreq" min="900000" step="0.01"/></label>
|
<option :value="false">SCPC</option>
|
||||||
<label v-show="paramRxrx.txIsTestInput"><span>Символьная скорость, Бод</span><input type="number" v-model="paramRxtx.txBaudrate" step="1"/></label>
|
</select>
|
||||||
<label><span>Ослабление, дБ</span><input type="number" v-model="paramRxtx.txAttenuation" step="1"/></label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="settings-set-container">
|
|
||||||
<h3>Настройки приемника</h3>
|
<div class="settings-set-container">
|
||||||
<label>
|
<h3>Настройки приемника</h3>
|
||||||
<span>Режим управления усилением</span>
|
<label>
|
||||||
<select v-model="paramRxtx.rxAgcEn">
|
<span>Режим управления усилением</span>
|
||||||
<option :value="true">АРУ</option>
|
<select v-model="paramRxtx.rxAgcEn">
|
||||||
<option :value="false">РРУ</option>
|
<option :value="true">АРУ</option>
|
||||||
</select>
|
<option :value="false">РРУ</option>
|
||||||
</label>
|
</select>
|
||||||
<label v-show="!paramRxtx.rxAgcEn"><span>Ручное усиление, дБ</span><input type="number" v-model="paramRxtx.rxManualGain" min="-40"/></label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Инверсия спектра</span>
|
<span>Инверсия спектра</span>
|
||||||
<span class="toggle-input"><input type="checkbox" v-model="paramRxtx.rxSpectrumInversion" /><span class="slider"></span></span>
|
<span class="toggle-input">
|
||||||
</label>
|
<input type="checkbox" v-model="paramRxtx.rxSpectrumInversion" />
|
||||||
<label><span>Центральная частота, КГц</span><input type="number" v-model="paramRxtx.rxCentralFreq" min="900000" step="0.01"/></label>
|
<span class="slider"></span>
|
||||||
<label><span>Символьная скорость, Бод</span><input type="number" v-model="paramRxtx.rxBaudrate" step="1"/></label>
|
</span>
|
||||||
<label>
|
</label>
|
||||||
<span>Roll-off</span>
|
</div>
|
||||||
<select v-model="paramRxtx.rxRolloff">
|
|
||||||
<option :value="2">0.02</option>
|
</div>
|
||||||
<option :value="5">0.05</option>
|
|
||||||
<option :value="10">0.10</option>
|
<button class="action-button" @click="settingsSubmitBucLnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.bucLnb"></span></button>
|
||||||
<option :value="15">0.15</option>
|
</div>
|
||||||
<option :value="20">0.20</option>
|
<div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete">
|
||||||
<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>Настройки питания и опорного генератора</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="paramBuclnb.bucRefClk10M" /><span class="slider"></span></span>
|
|
||||||
</label>
|
|
||||||
<label>
|
|
||||||
<span>Питание BUC</span>
|
|
||||||
<select v-model="paramBuclnb.bucPowering">
|
|
||||||
<option :value="0">Выкл</option>
|
|
||||||
<option :value="24">24В</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="paramBuclnb.lnbRefClk10M" /><span class="slider"></span></span>
|
|
||||||
</label>
|
|
||||||
<label>
|
|
||||||
<span>Питание LNB</span>
|
|
||||||
<select v-model="paramBuclnb.lnbPowering">
|
|
||||||
<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="paramBuclnb.srvRefClk10M" /><span class="slider"></span></span>
|
|
||||||
</label>
|
|
||||||
<label>
|
|
||||||
<span>Автозапуск BUC и LNB при включении</span>
|
|
||||||
<span class="toggle-input"><input type="checkbox" v-model="paramBuclnb.bucLnbAutoStart" /><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">
|
|
||||||
<h2>Настройки сети</h2>
|
<h2>Настройки сети</h2>
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<h3>Настройки интерфейса управления</h3>
|
<h3>Интерфейс управления</h3>
|
||||||
<label>
|
<label>
|
||||||
<span>Интерфейс управления (/24)</span>
|
<span>IP адрес/маска</span>
|
||||||
<input v-model="paramNetwork.netManagementIp" required type="text" pattern="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$">
|
<input v-model="param.network.managementIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Режим сети</span>
|
<span>Шлюз интерфейса управления</span>
|
||||||
<select v-model="paramNetwork.netIsL2">
|
<input v-model="param.network.managementGateway" type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
<option :value="false">Маршрутизатор</option>
|
</label>
|
||||||
<option :value="true">Коммутатор</option>
|
<label>
|
||||||
|
<span>Режим модема</span>
|
||||||
|
<select v-model="param.network.mode">
|
||||||
|
<option value="l2">Коммутатор</option>
|
||||||
|
<option value="l3">Маршрутизатор</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label v-show="paramNetwork.netIsL2 === false">
|
<h3>Интерфейс данных</h3>
|
||||||
<span>Интерфейс данных (/24)</span>
|
<label v-if="param.network.mode === 'l3'">
|
||||||
<input v-model="paramNetwork.netDataIp" required type="text" pattern="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$">
|
<span>IP адрес/маска</span>
|
||||||
|
<input v-model="param.network.dataIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
</label>
|
</label>
|
||||||
<label><span>MTU интерфейса данных</span><input type="number" v-model="paramNetwork.netDataMtu" min="1500" max="2000" step="1"/></label>
|
<label>
|
||||||
|
<span>MTU</span>
|
||||||
|
<input v-model="param.network.dataMtu" required type="number" min="1500" max="9000">
|
||||||
|
</label>
|
||||||
|
<button class="action-button" @click="settingsSubmitNetwork()">Применить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitNetwork()">Сохранить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
|
||||||
|
|
||||||
<h2>Система</h2>
|
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
|
<h3>Отладка</h3>
|
||||||
|
<label>
|
||||||
|
<span>Передача отладочной информации</span>
|
||||||
|
<span class="toggle-input">
|
||||||
|
<input type="checkbox" v-model="param.debugSend.en" />
|
||||||
|
<span class="slider"></span>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<label v-if="param.debugSend.en">
|
||||||
|
<span>IP адрес получателя</span>
|
||||||
|
<input v-model="param.debugSend.receiverIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Порт для данных</span>
|
||||||
|
<input v-model="param.debugSend.portCinC" type="number" min="0" max="65535">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Порт для CinC</span>
|
||||||
|
<input v-model="param.debugSend.portData" type="number" min="0" max="65535">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Таймаут</span>
|
||||||
|
<input v-model="param.debugSend.timeout" type="number" pattern="^[0-9]+$">
|
||||||
|
</label>
|
||||||
|
<button class="action-button" @click="settingsSubmitDebugSend()">Применить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
|
</div>
|
||||||
|
<div class="settings-set-container">
|
||||||
|
<h3>Управление ПО</h3>
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th>Версия ПО</th><td>{{ about.firmwareVersion }}</td></tr>
|
<tr><th>Версия ПО</th><td>{{ about.firmwareVersion }}</td></tr>
|
||||||
@ -255,7 +235,9 @@
|
|||||||
</label>
|
</label>
|
||||||
<button class="action-button" @click="settingsUploadUpdate()">Загрузить<span class="submit-spinner" v-show="submitStatus.firmwareUpload"></span></button>
|
<button class="action-button" @click="settingsUploadUpdate()">Загрузить<span class="submit-spinner" v-show="submitStatus.firmwareUpload"></span></button>
|
||||||
<button class="dangerous-button" v-show="uploadFw.sha256 !== null" @click="settingsPerformFirmwareUpgrade()">Обновить встроенное ПО <span class="submit-spinner" v-show="submitStatus.firmwareUpgrade"></span></button>
|
<button class="dangerous-button" v-show="uploadFw.sha256 !== null" @click="settingsPerformFirmwareUpgrade()">Обновить встроенное ПО <span class="submit-spinner" v-show="submitStatus.firmwareUpgrade"></span></button>
|
||||||
</div> </div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<p>Последнее обновление статистики: {{ lastUpdateTime }}</p>
|
<p>Последнее обновление статистики: {{ lastUpdateTime }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -263,6 +245,7 @@
|
|||||||
<script>
|
<script>
|
||||||
const availableTabs = ['monitoring', 'setup', 'admin']
|
const availableTabs = ['monitoring', 'setup', 'admin']
|
||||||
|
|
||||||
|
// default-js.js
|
||||||
// для обновления высоты хидера
|
// для обновления высоты хидера
|
||||||
function updateHeaderHeight() { const header = document.querySelector('header'); document.body.style.setProperty('--header-height', `${header.offsetHeight}px`); }
|
function updateHeaderHeight() { const header = document.querySelector('header'); document.body.style.setProperty('--header-height', `${header.offsetHeight}px`); }
|
||||||
window.addEventListener('load', updateHeaderHeight); window.addEventListener('resize', updateHeaderHeight);
|
window.addEventListener('load', updateHeaderHeight); window.addEventListener('resize', updateHeaderHeight);
|
||||||
@ -275,50 +258,146 @@
|
|||||||
return availableTabs[0]
|
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
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
||||||
// false - означает что статистика не отправляется, true - отправляется
|
// false - означает что статистика не отправляется, true - отправляется
|
||||||
submitStatus: {
|
submitStatus: {
|
||||||
rxtx: false,
|
|
||||||
buclnb: false,
|
|
||||||
network: false,
|
|
||||||
firmwareUpload: false,
|
firmwareUpload: false,
|
||||||
firmwareUpgrade: false,
|
firmwareUpgrade: false,
|
||||||
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
|
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
|
||||||
modemReboot: null
|
modemReboot: null
|
||||||
},
|
},
|
||||||
|
|
||||||
// ========== include from 'common/all-params-data.js.j2'
|
|
||||||
paramRxtx: {
|
|
||||||
txEn: false,
|
|
||||||
txIsTestInput: false,
|
|
||||||
txCentralFreq: 900000,
|
|
||||||
txBaudrate: 0,
|
|
||||||
txAttenuation: 0,
|
|
||||||
rxAgcEn: true,
|
|
||||||
rxManualGain: -40,
|
|
||||||
rxSpectrumInversion: false,
|
|
||||||
rxCentralFreq: 900000,
|
|
||||||
rxBaudrate: 0,
|
|
||||||
rxRolloff: 2,
|
|
||||||
},
|
|
||||||
paramBuclnb: {
|
|
||||||
bucRefClk10M: false,
|
|
||||||
bucPowering: 0,
|
|
||||||
lnbRefClk10M: false,
|
|
||||||
lnbPowering: 0,
|
|
||||||
srvRefClk10M: false,
|
|
||||||
bucLnbAutoStart: false,
|
|
||||||
},
|
|
||||||
paramNetwork: {
|
|
||||||
netManagementIp: null,
|
|
||||||
netIsL2: false,
|
|
||||||
netDataIp: null,
|
|
||||||
netDataMtu: 1500,
|
|
||||||
},
|
|
||||||
// ========== include end from 'common/all-params-data.js.j2'
|
|
||||||
|
|
||||||
// ========== include from 'common/monitoring-data.js.j2'
|
// ========== include from 'common/monitoring-data.js.j2'
|
||||||
statRx: {
|
statRx: {
|
||||||
// индикаторы
|
// индикаторы
|
||||||
@ -352,7 +431,7 @@
|
|||||||
statDevice: { // температурные датчики
|
statDevice: { // температурные датчики
|
||||||
adrv: 0, zynq: 0, fpga: 0
|
adrv: 0, zynq: 0, fpga: 0
|
||||||
},
|
},
|
||||||
statOs: {uptime: '?', load1: '?', load5: '?', load15: '?', totalram: '?', freeram: '?'},
|
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 from 'common/setup-data.js.j2'
|
||||||
@ -400,132 +479,9 @@
|
|||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
},
|
},
|
||||||
getAvailableModcods(modulation) {
|
|
||||||
// NOTE модкоды со скоростью хода 3/5 не работают
|
|
||||||
switch (modulation) {
|
|
||||||
case 'qpsk':
|
|
||||||
return ['1/4', '1/3', '2/5', '1/2', '3/5', '2/3', '3/4', '4/5', '5/6', '8/9', '9/10']
|
|
||||||
case '8psk':
|
|
||||||
return ['3/5', '2/3', '3/4', '5/6', '8/9', '9/10']
|
|
||||||
case '16apsk':
|
|
||||||
return ['2/3', '3/4', '4/5', '5/6', '8/9', '9/10']
|
|
||||||
case '32apsk':
|
|
||||||
return ['3/4', '4/5', '5/6', '8/9', '9/10']
|
|
||||||
default:
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// ========== include from 'common/all-params-methods.js.j2'
|
|
||||||
settingsSubmitRxtx() {
|
|
||||||
if (this.submitStatus.rxtx) { return }
|
|
||||||
|
|
||||||
let query = {
|
|
||||||
"txEn": this.paramRxtx.txEn,
|
|
||||||
"txIsTestInput": this.paramRxtx.txIsTestInput,
|
|
||||||
"txCentralFreq": this.paramRxtx.txCentralFreq,
|
|
||||||
"txBaudrate": this.paramRxtx.txBaudrate,
|
|
||||||
"txAttenuation": this.paramRxtx.txAttenuation,
|
|
||||||
"rxAgcEn": this.paramRxtx.rxAgcEn,
|
|
||||||
"rxManualGain": this.paramRxtx.rxManualGain,
|
|
||||||
"rxSpectrumInversion": this.paramRxtx.rxSpectrumInversion,
|
|
||||||
"rxCentralFreq": this.paramRxtx.rxCentralFreq,
|
|
||||||
"rxBaudrate": this.paramRxtx.rxBaudrate,
|
|
||||||
"rxRolloff": this.paramRxtx.rxRolloff,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.submitStatus.rxtx = true
|
|
||||||
fetch('/api/set/rxtx', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(query) })
|
|
||||||
.then(async (resp) => { this.updateRxtxSettings(await resp.json()) })
|
|
||||||
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
|
|
||||||
.finally(() => { this.submitStatus.rxtx = false })
|
|
||||||
},
|
|
||||||
settingsSubmitBuclnb() {
|
|
||||||
if (this.submitStatus.buclnb) { return }
|
|
||||||
{ if (!confirm("Применение неправильных настроек может вывести из строя оборудование! Продолжить?")) return }
|
|
||||||
|
|
||||||
let query = {
|
|
||||||
"bucRefClk10M": this.paramBuclnb.bucRefClk10M,
|
|
||||||
"bucPowering": this.paramBuclnb.bucPowering,
|
|
||||||
"lnbRefClk10M": this.paramBuclnb.lnbRefClk10M,
|
|
||||||
"lnbPowering": this.paramBuclnb.lnbPowering,
|
|
||||||
"srvRefClk10M": this.paramBuclnb.srvRefClk10M,
|
|
||||||
"bucLnbAutoStart": this.paramBuclnb.bucLnbAutoStart,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.submitStatus.buclnb = true
|
|
||||||
fetch('/api/set/buclnb', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(query) })
|
|
||||||
.then(async (resp) => { this.updateBuclnbSettings(await resp.json()) })
|
|
||||||
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
|
|
||||||
.finally(() => { this.submitStatus.buclnb = false })
|
|
||||||
},
|
|
||||||
settingsSubmitNetwork() {
|
|
||||||
if (this.submitStatus.network) { return }
|
|
||||||
{ if (!confirm("Применение этих настроек может сделать модем недоступным! Продолжить?")) return }
|
|
||||||
|
|
||||||
let query = {
|
|
||||||
"netManagementIp": this.paramNetwork.netManagementIp,
|
|
||||||
"netIsL2": this.paramNetwork.netIsL2,
|
|
||||||
"netDataIp": this.paramNetwork.netDataIp,
|
|
||||||
"netDataMtu": this.paramNetwork.netDataMtu,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.submitStatus.network = true
|
|
||||||
fetch('/api/set/network', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(query) })
|
|
||||||
.then(async (resp) => { this.updateNetworkSettings(await resp.json()) })
|
|
||||||
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
|
|
||||||
.finally(() => { this.submitStatus.network = false })
|
|
||||||
},
|
|
||||||
|
|
||||||
updateRxtxSettings(vals) {
|
|
||||||
this.submitStatus.rxtx = false
|
|
||||||
this.paramRxtx.txEn = vals["settings"]["txEn"]
|
|
||||||
this.paramRxtx.txIsTestInput = vals["settings"]["txIsTestInput"]
|
|
||||||
this.paramRxtx.txCentralFreq = vals["settings"]["txCentralFreq"]
|
|
||||||
this.paramRxtx.txBaudrate = vals["settings"]["txBaudrate"]
|
|
||||||
this.paramRxtx.txAttenuation = vals["settings"]["txAttenuation"]
|
|
||||||
this.paramRxtx.rxAgcEn = vals["settings"]["rxAgcEn"]
|
|
||||||
this.paramRxtx.rxManualGain = vals["settings"]["rxManualGain"]
|
|
||||||
this.paramRxtx.rxSpectrumInversion = vals["settings"]["rxSpectrumInversion"]
|
|
||||||
this.paramRxtx.rxCentralFreq = vals["settings"]["rxCentralFreq"]
|
|
||||||
this.paramRxtx.rxBaudrate = vals["settings"]["rxBaudrate"]
|
|
||||||
this.paramRxtx.rxRolloff = vals["settings"]["rxRolloff"]
|
|
||||||
},
|
|
||||||
updateBuclnbSettings(vals) {
|
|
||||||
this.submitStatus.buclnb = false
|
|
||||||
this.paramBuclnb.bucRefClk10M = vals["settings"]["bucRefClk10M"]
|
|
||||||
this.paramBuclnb.bucPowering = vals["settings"]["bucPowering"]
|
|
||||||
this.paramBuclnb.lnbRefClk10M = vals["settings"]["lnbRefClk10M"]
|
|
||||||
this.paramBuclnb.lnbPowering = vals["settings"]["lnbPowering"]
|
|
||||||
this.paramBuclnb.srvRefClk10M = vals["settings"]["srvRefClk10M"]
|
|
||||||
this.paramBuclnb.bucLnbAutoStart = vals["settings"]["bucLnbAutoStart"]
|
|
||||||
},
|
|
||||||
updateNetworkSettings(vals) {
|
|
||||||
this.submitStatus.network = false
|
|
||||||
this.paramNetwork.netManagementIp = vals["settings"]["netManagementIp"]
|
|
||||||
this.paramNetwork.netIsL2 = vals["settings"]["netIsL2"]
|
|
||||||
this.paramNetwork.netDataIp = vals["settings"]["netDataIp"]
|
|
||||||
this.paramNetwork.netDataMtu = vals["settings"]["netDataMtu"]
|
|
||||||
},
|
|
||||||
// ========== include end from 'common/all-params-methods.js.j2'
|
|
||||||
|
|
||||||
// ========== include from 'common/monitoring-methods.js.j2'
|
// ========== include from 'common/monitoring-methods.js.j2'
|
||||||
updateStatistics(vals) {
|
updateStatistics(vals) {
|
||||||
function modcodToStr(modcod) {
|
|
||||||
// модкоды из раздела 5.5.2.2 https://www.etsi.org/deliver/etsi_en/302300_302399/302307/01.01.02_60/en_302307v010102p.pdf
|
|
||||||
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]
|
|
||||||
}
|
|
||||||
|
|
||||||
this.lastUpdateTime = new Date();
|
this.lastUpdateTime = new Date();
|
||||||
this.initState = vals["mainState"]["initState"]
|
this.initState = vals["mainState"]["initState"]
|
||||||
|
|
||||||
@ -576,11 +532,6 @@
|
|||||||
} else {
|
} else {
|
||||||
this.statOs.uptime = '?'
|
this.statOs.uptime = '?'
|
||||||
}
|
}
|
||||||
this.statOs.load1 = vals["sysinfo"]["load1min"]
|
|
||||||
this.statOs.load5 = vals["sysinfo"]["load5min"]
|
|
||||||
this.statOs.load15 = vals["sysinfo"]["load15min"]
|
|
||||||
this.statOs.totalram = vals["sysinfo"]["totalram"]
|
|
||||||
this.statOs.freeram = vals["sysinfo"]["freeram"]
|
|
||||||
},
|
},
|
||||||
|
|
||||||
resetPacketsStatistics() {
|
resetPacketsStatistics() {
|
||||||
@ -594,9 +545,149 @@
|
|||||||
}, // ========== include end from 'common/monitoring-methods.js.j2'
|
}, // ========== include end from 'common/monitoring-methods.js.j2'
|
||||||
|
|
||||||
// ========== include from 'common/setup-methods.js.j2'
|
// ========== include from 'common/setup-methods.js.j2'
|
||||||
// ========== include end 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() {
|
||||||
|
if (this.submitStatus.network) { return }
|
||||||
|
let query = {
|
||||||
|
"network.managementIp": this.param.network.managementIp,
|
||||||
|
"network.managementGateway": this.param.network.managementGateway,
|
||||||
|
"network.mode": this.param.network.mode,
|
||||||
|
"network.dataIp": this.param.network.dataIp,
|
||||||
|
"network.dataMtu": this.param.network.dataMtu
|
||||||
|
}
|
||||||
|
if (confirm('Вы уверены, что хотите сохранить настройки сети? После этого модем может стать недоступным.')) {
|
||||||
|
this.submitStatus.network = true
|
||||||
|
fetch('/api/set/network', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(query)
|
||||||
|
}).then(async (resp) => {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
this.updateNetworkSettings(await resp.json())
|
||||||
|
}).catch((reason) => {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
alert(`Ошибка при применении настроек: ${reason}`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
settingsSubmitDebugSend() {
|
||||||
|
if (this.submitStatus.debugSend) { return }
|
||||||
|
let query = {
|
||||||
|
"debugSend.en": this.param.debugSend.en,
|
||||||
|
"debugSend.receiverIp": this.param.debugSend.receiverIp,
|
||||||
|
"debugSend.portCinC": this.param.debugSend.portCinC,
|
||||||
|
"debugSend.portData": this.param.debugSend.portData,
|
||||||
|
"debugSend.timeout": this.param.debugSend.timeout
|
||||||
|
}
|
||||||
|
this.submitStatus.debugSend = true
|
||||||
|
fetch('/api/set/debugSend', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(query)
|
||||||
|
}).then(async (resp) => {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
this.updateNetworkSettings(await resp.json())
|
||||||
|
}).catch((reason) => {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
alert(`Ошибка при применении настроек: ${reason}`)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
async settingsUploadUpdate() {
|
async settingsUploadUpdate() {
|
||||||
if (!this.uploadFw.filename) {
|
if (!this.uploadFw.filename) {
|
||||||
alert('Выберите файл для загрузки');
|
alert('Выберите файл для загрузки');
|
||||||
@ -652,6 +743,24 @@
|
|||||||
this.submitStatus.firmwareUpgrade = false
|
this.submitStatus.firmwareUpgrade = false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateNetworkSettings(vals) {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
this.param.network.managementIp = vals["settings"]["network.managementIp"]
|
||||||
|
this.param.network.managementGateway = vals["settings"]["network.managementGateway"]
|
||||||
|
this.param.network.mode = vals["settings"]["network.mode"]
|
||||||
|
this.param.network.dataIp = vals["settings"]["network.dataIp"]
|
||||||
|
this.param.network.dataMtu = vals["settings"]["network.dataMtu"]
|
||||||
|
},
|
||||||
|
|
||||||
|
updateDebugSendSettings(vals) {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
this.param.debugSend.en = vals["settings"]["debugSend.en"]
|
||||||
|
this.param.debugSend.receiverIp = vals["settings"]["debugSend.receiverIp"]
|
||||||
|
this.param.debugSend.portCinC = vals["settings"]["debugSend.portCinC"]
|
||||||
|
this.param.debugSend.portData = vals["settings"]["debugSend.portData"]
|
||||||
|
this.param.debugSend.timeout = vals["settings"]["debugSend.timeout"]
|
||||||
|
},
|
||||||
|
|
||||||
doModemReboot() {
|
doModemReboot() {
|
||||||
if (this.submitStatus.modemReboot !== null) {
|
if (this.submitStatus.modemReboot !== null) {
|
||||||
return
|
return
|
||||||
@ -666,9 +775,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.updateRxtxSettings(vals)
|
|
||||||
this.updateBuclnbSettings(vals)
|
|
||||||
this.updateNetworkSettings(vals)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
doFetchSettings().then(() => {})
|
doFetchSettings().then(() => {})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user