Compare commits
20 Commits
4c555d5400
...
master
Author | SHA1 | Date | |
---|---|---|---|
89004bcf31 | |||
b580ac6b37 | |||
7cd096a269 | |||
beca00ff70 | |||
ed6694b99d | |||
305a8c54fa | |||
297e681b75 | |||
32720ca365 | |||
33bbdafc3d | |||
bfcdc88da9 | |||
760a6858ee | |||
e9ff1d099a | |||
11e4561551 | |||
081ef1b84f | |||
bb90a3fec2 | |||
9fbe88b64d | |||
996e711436 | |||
57ba61da41 | |||
b9a25e8734 | |||
1e185a987d |
@@ -8,9 +8,9 @@ test for build:
|
|||||||
- cpp-test-universal
|
- cpp-test-universal
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
variables:
|
||||||
|
GIT_SUBMODULE_STRATEGY: recursive
|
||||||
script:
|
script:
|
||||||
- git submodule init
|
|
||||||
- git submodule update
|
|
||||||
- cmake -DCMAKE_BUILD_TYPE=Debug -DMODEM_TYPE=TDMA -B cmake-build-debug-tdma
|
- cmake -DCMAKE_BUILD_TYPE=Debug -DMODEM_TYPE=TDMA -B cmake-build-debug-tdma
|
||||||
- cmake -DCMAKE_BUILD_TYPE=Debug -DMODEM_TYPE=SCPC -B cmake-build-debug-scpc
|
- cmake -DCMAKE_BUILD_TYPE=Debug -DMODEM_TYPE=SCPC -B cmake-build-debug-scpc
|
||||||
- cmake -DCMAKE_BUILD_TYPE=Debug -DMODEM_TYPE=SHPS -B cmake-build-debug-shps
|
- cmake -DCMAKE_BUILD_TYPE=Debug -DMODEM_TYPE=SHPS -B cmake-build-debug-shps
|
||||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -1,3 +1,9 @@
|
|||||||
[submodule "dependencies/control_system_client"]
|
[submodule "dependencies/control_system_client"]
|
||||||
path = dependencies/control_system_client
|
path = dependencies/control_system_client
|
||||||
url = http://gitlab.devrss.vg/mf-tdma/protocol_processing/control_system_client.git
|
url = http://gitlab.devrss.vg/mf-tdma/protocol_processing/control_system_client.git
|
||||||
|
[submodule "dependencies/control_system_client_tdma"]
|
||||||
|
path = dependencies/control_system_client_tdma
|
||||||
|
url = http://gitlab.devrss.vg/mf-tdma/protocol_processing/control_system_client.git
|
||||||
|
[submodule "dependencies/control_system_client_shps"]
|
||||||
|
path = dependencies/control_system_client_shps
|
||||||
|
url = http://gitlab.devrss.vg/mf-tdma/protocol_processing/control_system_client.git
|
||||||
|
@@ -18,12 +18,15 @@ endif()
|
|||||||
if("${MODEM_TYPE}" STREQUAL "SCPC")
|
if("${MODEM_TYPE}" STREQUAL "SCPC")
|
||||||
add_definitions(-DMODEM_IS_SCPC)
|
add_definitions(-DMODEM_IS_SCPC)
|
||||||
message(STATUS "Selected SCPC modem")
|
message(STATUS "Selected SCPC modem")
|
||||||
|
add_subdirectory(dependencies/control_system_client) # подключение правильного control system client SCPC, ветка main
|
||||||
elseif ("${MODEM_TYPE}" STREQUAL "TDMA")
|
elseif ("${MODEM_TYPE}" STREQUAL "TDMA")
|
||||||
add_definitions(-DMODEM_IS_TDMA)
|
add_definitions(-DMODEM_IS_TDMA)
|
||||||
message(STATUS "Selected TDMA modem")
|
message(STATUS "Selected TDMA modem")
|
||||||
|
add_subdirectory(dependencies/control_system_client_tdma) # подключение правильного control system client TDMA, ветка terminal-tdma
|
||||||
elseif ("${MODEM_TYPE}" STREQUAL "SHPS")
|
elseif ("${MODEM_TYPE}" STREQUAL "SHPS")
|
||||||
add_definitions(-DMODEM_IS_SHPS)
|
add_definitions(-DMODEM_IS_SHPS)
|
||||||
message(STATUS "Selected SHPS modem")
|
message(STATUS "Selected SHPS modem")
|
||||||
|
add_subdirectory(dependencies/control_system_client_shps) # подключение правильного control system client SHPS, ветка shps
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "You must set `MODEM_TYPE` \"SCPC\" or \"TDMA\" or \"SHPS\"!")
|
message(FATAL_ERROR "You must set `MODEM_TYPE` \"SCPC\" or \"TDMA\" or \"SHPS\"!")
|
||||||
endif()
|
endif()
|
||||||
@@ -52,7 +55,6 @@ add_compile_options(-Wall -Wextra -Wsign-conversion -DPROJECT_GIT_REVISION="${PR
|
|||||||
# максимальный размер тела запроса 200mb
|
# максимальный размер тела запроса 200mb
|
||||||
add_definitions(-DHTTP_MAX_PAYLOAD=200000000)
|
add_definitions(-DHTTP_MAX_PAYLOAD=200000000)
|
||||||
|
|
||||||
add_subdirectory(dependencies/control_system_client)
|
|
||||||
|
|
||||||
include_directories(src/)
|
include_directories(src/)
|
||||||
|
|
||||||
|
2
dependencies/control_system_client
vendored
2
dependencies/control_system_client
vendored
Submodule dependencies/control_system_client updated: 92fcb8ab67...76d6dcdb08
1
dependencies/control_system_client_shps
vendored
Submodule
1
dependencies/control_system_client_shps
vendored
Submodule
Submodule dependencies/control_system_client_shps added at 9241716931
1
dependencies/control_system_client_tdma
vendored
Submodule
1
dependencies/control_system_client_tdma
vendored
Submodule
Submodule dependencies/control_system_client_tdma added at 78694fd775
33
devtool.py
33
devtool.py
@@ -44,6 +44,25 @@ def cp_get_dma_debug(base_url, param_name):
|
|||||||
return res.content.decode('utf-8')
|
return res.content.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
def cp_set_network(base_url, param_name, value):
|
||||||
|
session = do_login(base_url)
|
||||||
|
res = session.post(f"{base_url}/dev/cpapicall", params={
|
||||||
|
"f": "SetDmaDebug",
|
||||||
|
"param": param_name,
|
||||||
|
"value": value
|
||||||
|
})
|
||||||
|
return res.content.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
def cp_get_network(base_url, param_name):
|
||||||
|
session = do_login(base_url)
|
||||||
|
res = session.post(f"{base_url}/dev/cpapicall", params={
|
||||||
|
"f": "GetDmaDebug",
|
||||||
|
"param": param_name
|
||||||
|
})
|
||||||
|
return res.content.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
def set_logging(base_url, value):
|
def set_logging(base_url, value):
|
||||||
print(cp_set_dma_debug(base_url, "log_bool", value))
|
print(cp_set_dma_debug(base_url, "log_bool", value))
|
||||||
|
|
||||||
@@ -53,6 +72,8 @@ if __name__ == '__main__':
|
|||||||
print(f"Usage: {sys.argv[0]} http(s)://terminal-url logging on|off")
|
print(f"Usage: {sys.argv[0]} http(s)://terminal-url logging on|off")
|
||||||
print(f" set_dma_debug <param_name> <value>")
|
print(f" set_dma_debug <param_name> <value>")
|
||||||
print(f" get_dma_debug <param_name>")
|
print(f" get_dma_debug <param_name>")
|
||||||
|
print(f" set_network <param_name> <value>")
|
||||||
|
print(f" get_network <param_name>")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
if sys.argv[2] == "logging":
|
if sys.argv[2] == "logging":
|
||||||
@@ -67,7 +88,17 @@ if __name__ == '__main__':
|
|||||||
print(cp_set_dma_debug(sys.argv[1], sys.argv[3], sys.argv[4]))
|
print(cp_set_dma_debug(sys.argv[1], sys.argv[3], sys.argv[4]))
|
||||||
elif sys.argv[2] == "get_dma_debug":
|
elif sys.argv[2] == "get_dma_debug":
|
||||||
if len(sys.argv) != 4:
|
if len(sys.argv) != 4:
|
||||||
print("Wrong set dma debug usage!")
|
print("Wrong get dma debug usage!")
|
||||||
|
else:
|
||||||
|
print(cp_get_dma_debug(sys.argv[1], sys.argv[3]))
|
||||||
|
elif sys.argv[2] == "set_network":
|
||||||
|
if len(sys.argv) != 5:
|
||||||
|
print("Wrong set network usage!")
|
||||||
|
else:
|
||||||
|
print(cp_set_dma_debug(sys.argv[1], sys.argv[3], sys.argv[4]))
|
||||||
|
elif sys.argv[2] == "get_network":
|
||||||
|
if len(sys.argv) != 4:
|
||||||
|
print("Wrong get dma debug usage!")
|
||||||
else:
|
else:
|
||||||
print(cp_get_dma_debug(sys.argv[1], sys.argv[3]))
|
print(cp_get_dma_debug(sys.argv[1], sys.argv[3]))
|
||||||
else:
|
else:
|
||||||
|
@@ -42,7 +42,7 @@
|
|||||||
{"widget": "number-int", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 200000, "max": 54000000, "step": 1},
|
{"widget": "number-int", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 200000, "max": 54000000, "step": 1},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Roll-off", "name": "rxRolloff",
|
"widget": "select", "label": "Roll-off", "name": "rxRolloff",
|
||||||
"values": [{"label": "0.02", "value": "2"}, {"label": "0.05", "value": "5"}, {"label": "0.10", "value": "10"}, {"label": "0.15", "value": "15"}, {"label": "0.20", "value": "20"}, {"label": "0.25", "value": "25"}]
|
"values": [{"label": "0.02", "value": "20"}, {"label": "0.05", "value": "50"}, {"label": "0.10", "value": "100"}, {"label": "0.15", "value": "150"}, {"label": "0.20", "value": "200"}, {"label": "0.25", "value": "250"}]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,8 @@
|
|||||||
{"label": "Выкл", "value": "0"},
|
{"label": "Выкл", "value": "0"},
|
||||||
{"label": "24В", "value": "24"}
|
{"label": "24В", "value": "24"}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
{"widget": "number-int", "label": "Частота LO, кГц", "name": "bucLoKhz", "min": 0, "max": 40000000, "step": 1}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -81,7 +82,8 @@
|
|||||||
{"label": "18В", "value": "18"},
|
{"label": "18В", "value": "18"},
|
||||||
{"label": "24В", "value": "24"}
|
{"label": "24В", "value": "24"}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
{"widget": "number-int", "label": "Частота LO, кГц", "name": "lnbLoKhz", "min": 0, "max": 40000000, "step": 1}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -101,17 +103,17 @@
|
|||||||
"widget": "settings-container",
|
"widget": "settings-container",
|
||||||
"childs": [
|
"childs": [
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Метод расчета задержки", "name": "dpdiIsPositional",
|
"widget": "select", "label": "Метод расчета задержки", "name": "isPositional",
|
||||||
"values": [
|
"values": [
|
||||||
{"label": "Позиционированием", "value": "true"},
|
{"label": "Позиционированием", "value": "true"},
|
||||||
{"label": "Окном задержки", "value": "false"}
|
{"label": "Окном задержки", "value": "false"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{"widget": "h2", "label": "Настройки позиционирования", "v_show": "paramDpdi.dpdiIsPositional === true"},
|
{"widget": "h2", "label": "Настройки позиционирования", "v_show": "paramDpdi.isPositional === true"},
|
||||||
{"widget": "number", "label": "Широта станции", "name": "dpdiPositionStationLatitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
{"widget": "number", "label": "Широта станции", "name": "positionStationLatitude", "v_show": "paramDpdi.isPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
||||||
{"widget": "number", "label": "Долгота станции", "name": "dpdiPositionStationLongitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
{"widget": "number", "label": "Долгота станции", "name": "positionStationLongitude", "v_show": "paramDpdi.isPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
||||||
{"widget": "number", "label": "Подспутниковая точка", "name": "dpdiPositionSatelliteLongitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
{"widget": "number", "label": "Подспутниковая точка", "name": "positionSatelliteLongitude", "v_show": "paramDpdi.isPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
||||||
{"widget": "number", "label": "Задержка до спутника, мс", "name": "dpdiDelay", "v_show": "paramDpdi.dpdiIsPositional === false", "min": 0, "step": 0.1, "max": 400}]
|
{"widget": "number", "label": "Задержка до спутника, мс", "name": "delay", "v_show": "paramDpdi.isPositional === false", "min": 0, "step": 0.1, "max": 400}]
|
||||||
},
|
},
|
||||||
{"widget": "submit"}
|
{"widget": "submit"}
|
||||||
],
|
],
|
||||||
@@ -120,10 +122,9 @@
|
|||||||
{
|
{
|
||||||
"widget": "settings-container",
|
"widget": "settings-container",
|
||||||
"childs": [
|
"childs": [
|
||||||
{"widget": "text", "label": "Пароль для входа в сеть ЦЗС", "name": "netCesPassword"},
|
|
||||||
{"widget": "h3", "label": "Настройки интерфейса управления"},
|
{"widget": "h3", "label": "Настройки интерфейса управления"},
|
||||||
{"widget": "ip-address", "label": "IP Интерфейса управления (/24)", "name": "netManagementIp"},
|
{"widget": "ip-address-mask", "label": "Интерфейс управления (a.d.d.r/mask)", "name": "managementIp"},
|
||||||
{"widget": "text", "label": "Имя веб-сервера", "name": "netServerName"}
|
{"widget": "text", "label": "Имя веб-сервера", "name": "serverName"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -170,11 +171,11 @@
|
|||||||
"values": [{"label": "Ethernet", "value": "false"}, {"label": "Тест", "value": "true"}]
|
"values": [{"label": "Ethernet", "value": "false"}, {"label": "Тест", "value": "true"}]
|
||||||
},
|
},
|
||||||
{"widget": "h3", "label": "Параметры передачи"},
|
{"widget": "h3", "label": "Параметры передачи"},
|
||||||
{"widget": "number-int", "label": "Центральная частота, КГц", "name": "txCentralFreq", "min": 950000, "max": 6000000, "step": 0.01},
|
{"widget": "number-int", "label": "Центральная частота, КГц", "name": "txCentralFreq", "min": 100000, "max": 6000000, "step": 0.01},
|
||||||
{"widget": "number-int", "label": "Символьная скорость, Бод", "name": "txBaudrate", "min": 200000, "max": 54000000},
|
{"widget": "number-int", "label": "Символьная скорость, Бод", "name": "txBaudrate", "min": 200000, "max": 54000000},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Roll-off", "name": "txRolloff",
|
"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"}]
|
"values": [{"label": "0.02", "value": "20"}, {"label": "0.05", "value": "50"}, {"label": "0.10", "value": "100"}, {"label": "0.15", "value": "150"}, {"label": "0.20", "value": "200"}, {"label": "0.25", "value": "250"}]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Номер последовательности Голда", "name": "txGoldan",
|
"widget": "select", "label": "Номер последовательности Голда", "name": "txGoldan",
|
||||||
@@ -217,7 +218,7 @@
|
|||||||
{"widget": "checkbox", "label": "Авто-регулировка мощности", "name": "aupcEn"},
|
{"widget": "checkbox", "label": "Авто-регулировка мощности", "name": "aupcEn"},
|
||||||
{"widget": "number", "label": "Минимальное ослабление, дБ", "name": "aupcMinAttenuation", "min": 0, "step": 0.1, "max": 10},
|
{"widget": "number", "label": "Минимальное ослабление, дБ", "name": "aupcMinAttenuation", "min": 0, "step": 0.1, "max": 10},
|
||||||
{"widget": "number", "label": "Максимальное ослабление, дБ", "name": "aupcMaxAttenuation", "min": 0, "step": 0.1, "max": 10},
|
{"widget": "number", "label": "Максимальное ослабление, дБ", "name": "aupcMaxAttenuation", "min": 0, "step": 0.1, "max": 10},
|
||||||
{"widget": "number", "label": "Требуемое ОСШ", "name": "aupcRequiredSnr", "min": 0, "step": 0.01, "max": 10}
|
{"widget": "number", "label": "Требуемое ОСШ", "name": "aupcRequiredSnr", "min": 0, "step": 0.01, "max": 30}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -231,11 +232,11 @@
|
|||||||
{"widget": "number", "label": "Усиление, дБ", "name": "rxManualGain", "min": -40, "step": 0.01, "max": 40, "v_show": "paramRxtx.rxAgcEn === false"},
|
{"widget": "number", "label": "Усиление, дБ", "name": "rxManualGain", "min": -40, "step": 0.01, "max": 40, "v_show": "paramRxtx.rxAgcEn === false"},
|
||||||
{"widget": "watch-expr", "label": "Текущее усиление", "expr": "paramRxtx.rxManualGain", "v_show": "paramRxtx.rxAgcEn === true"},
|
{"widget": "watch-expr", "label": "Текущее усиление", "expr": "paramRxtx.rxManualGain", "v_show": "paramRxtx.rxAgcEn === true"},
|
||||||
{"widget": "checkbox", "label": "Инверсия спектра", "name": "rxSpectrumInversion"},
|
{"widget": "checkbox", "label": "Инверсия спектра", "name": "rxSpectrumInversion"},
|
||||||
{"widget": "number-int", "label": "Центральная частота, КГц", "name": "rxCentralFreq", "min": 950000, "max": 6000000, "step": 0.01},
|
{"widget": "number-int", "label": "Центральная частота, КГц", "name": "rxCentralFreq", "min": 100000, "max": 6000000, "step": 0.01},
|
||||||
{"widget": "number-int", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 200000, "max": 54000000},
|
{"widget": "number-int", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 200000, "max": 54000000},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Roll-off", "name": "rxRolloff",
|
"widget": "select", "label": "Roll-off", "name": "rxRolloff",
|
||||||
"values": [{"label": "0.02", "value": "2"}, {"label": "0.05", "value": "5"}, {"label": "0.10", "value": "10"}, {"label": "0.15", "value": "15"}, {"label": "0.20", "value": "20"}, {"label": "0.25", "value": "25"}]
|
"values": [{"label": "0.02", "value": "20"}, {"label": "0.05", "value": "50"}, {"label": "0.10", "value": "100"}, {"label": "0.15", "value": "150"}, {"label": "0.20", "value": "200"}, {"label": "0.25", "value": "250"}]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Номер последовательности Голда", "name": "rxGoldan",
|
"widget": "select", "label": "Номер последовательности Голда", "name": "rxGoldan",
|
||||||
@@ -252,20 +253,20 @@
|
|||||||
"widget": "settings-container", "v_show": "paramRxtx.isCinC",
|
"widget": "settings-container", "v_show": "paramRxtx.isCinC",
|
||||||
"childs": [
|
"childs": [
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Метод расчета задержки", "name": "dpdiIsPositional",
|
"widget": "select", "label": "Метод расчета задержки", "name": "isPositional",
|
||||||
"values": [
|
"values": [
|
||||||
{"label": "Позиционированием", "value": "true"},
|
{"label": "Позиционированием", "value": "true"},
|
||||||
{"label": "Окном задержки", "value": "false"}
|
{"label": "Окном задержки", "value": "false"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{"widget": "number", "label": "Полоса поиска, КГц ±", "name": "dpdiSearchBandwidth", "min": 0, "step": 1, "max": 100},
|
{"widget": "number", "label": "Полоса поиска, КГц ±", "name": "searchBandwidth", "min": 0, "step": 1, "max": 100},
|
||||||
{"widget": "h2", "label": "Настройки позиционирования", "v_show": "paramDpdi.dpdiIsPositional === true"},
|
{"widget": "h2", "label": "Настройки позиционирования", "v_show": "paramDpdi.isPositional === true"},
|
||||||
{"widget": "number", "label": "Широта станции", "name": "dpdiPositionStationLatitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
{"widget": "number", "label": "Широта станции", "name": "positionStationLatitude", "v_show": "paramDpdi.isPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
||||||
{"widget": "number", "label": "Долгота станции", "name": "dpdiPositionStationLongitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
{"widget": "number", "label": "Долгота станции", "name": "positionStationLongitude", "v_show": "paramDpdi.isPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
||||||
{"widget": "number", "label": "Подспутниковая точка", "name": "dpdiPositionSatelliteLongitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
{"widget": "number", "label": "Подспутниковая точка", "name": "positionSatelliteLongitude", "v_show": "paramDpdi.isPositional === true", "min": -180, "step": 0.000001, "max": 180},
|
||||||
{"widget": "h2", "label": "Задержка до спутника", "v_show": "paramDpdi.dpdiIsPositional === false"},
|
{"widget": "h2", "label": "Задержка до спутника", "v_show": "paramDpdi.isPositional === false"},
|
||||||
{"widget": "number", "label": "от, мс", "name": "dpdiDelayMin", "v_show": "paramDpdi.dpdiIsPositional === false", "min": 0, "step": 0.1, "max": 400},
|
{"widget": "number", "label": "от, мс", "name": "delayMin", "v_show": "paramDpdi.isPositional === false", "min": 0, "step": 0.1, "max": 400},
|
||||||
{"widget": "number", "label": "до, мс", "name": "dpdiDelayMax", "v_show": "paramDpdi.dpdiIsPositional === false", "min": 0, "step": 0.1, "max": 400}]
|
{"widget": "number", "label": "до, мс", "name": "delayMax", "v_show": "paramDpdi.isPositional === false", "min": 0, "step": 0.1, "max": 400}]
|
||||||
},
|
},
|
||||||
{"widget": "submit", "v_show": "paramRxtx.isCinC"}
|
{"widget": "submit", "v_show": "paramRxtx.isCinC"}
|
||||||
],
|
],
|
||||||
@@ -322,14 +323,14 @@
|
|||||||
"widget": "settings-container",
|
"widget": "settings-container",
|
||||||
"childs": [
|
"childs": [
|
||||||
{"widget": "h3", "label": "Настройки интерфейса управления"},
|
{"widget": "h3", "label": "Настройки интерфейса управления"},
|
||||||
{"widget": "ip-address", "label": "Интерфейс управления (/24)", "name": "netManagementIp"},
|
{"widget": "ip-address-mask", "label": "Интерфейс управления (a.d.d.r/mask)", "name": "managementIp"},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Режим сети", "name": "netIsL2",
|
"widget": "select", "label": "Режим сети", "name": "isL2",
|
||||||
"values": [{"label": "Маршрутизатор", "value": "false"}, {"label": "Коммутатор", "value": "true"}]
|
"values": [{"label": "Маршрутизатор", "value": "false"}, {"label": "Коммутатор", "value": "true"}]
|
||||||
},
|
},
|
||||||
{"widget": "ip-address", "label": "Интерфейс данных (/24)", "name": "netDataIp", "v_show": "paramNetwork.netIsL2 === false"},
|
{"widget": "ip-address", "label": "Интерфейс данных (/24)", "name": "dataIp", "v_show": "paramNetwork.isL2 === false"},
|
||||||
{"widget": "number", "label": "MTU интерфейса данных", "name": "netDataMtu", "min": 1500, "step": 1, "max": 2000},
|
{"widget": "number", "label": "MTU интерфейса данных", "name": "dataMtu", "min": 1500, "step": 1, "max": 2000},
|
||||||
{"widget": "text", "label": "Имя веб-сервера", "name": "netServerName"}
|
{"widget": "text", "label": "Имя веб-сервера", "name": "serverName"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -363,23 +364,30 @@
|
|||||||
"widget": "select", "label": "Режим работы модулятора", "name": "txModulatorIsTest",
|
"widget": "select", "label": "Режим работы модулятора", "name": "txModulatorIsTest",
|
||||||
"values": [{"label": "Нормальный", "value": "false"}, {"label": "Тест (CW)", "value": "true"}]
|
"values": [{"label": "Нормальный", "value": "false"}, {"label": "Тест (CW)", "value": "true"}]
|
||||||
},
|
},
|
||||||
|
{"widget": "number", "label": "Ослабление, дБ", "name": "txAttenuation", "max": 0, "min": -40, "step": 0.25},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Входные данные", "name": "txIsTestInput",
|
"widget": "select", "label": "Входные данные", "name": "txIsTestInput",
|
||||||
"values": [{"label": "Ethernet", "value": "false"}, {"label": "Тест", "value": "true"}]
|
"values": [{"label": "Ethernet", "value": "false"}, {"label": "Тест", "value": "true"}]
|
||||||
},
|
},
|
||||||
{"widget": "h3", "label": "Параметры передачи"},
|
{"widget": "h3", "label": "Параметры передачи"},
|
||||||
{"widget": "number", "label": "Центральная частота, КГц", "name": "txCentralFreq", "min": 950000, "max": 6000000, "step": 0.01},
|
{"widget": "number-int", "label": "Центральная частота, КГц", "name": "txCentralFreq", "min": 70000, "max": 6000000, "step": 100},
|
||||||
{"widget": "number", "label": "Символьная скорость, Бод", "name": "txBaudrate", "min": 200000, "max": 54000000},
|
{"widget": "number-int", "label": "Символьная скорость, Бод", "name": "txBaudrate", "min": 128000, "max": 30000000},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Roll-off", "name": "txRolloff",
|
"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"}]
|
"values": [{"label": "0.02", "value": "20"}, {"label": "0.05", "value": "50"}, {"label": "0.10", "value": "100"}, {"label": "0.15", "value": "150"}, {"label": "0.20", "value": "200"}, {"label": "0.25", "value": "250"}, {"label": "0.30", "value": "300"}, {"label": "0.35", "value": "350"}]
|
||||||
},
|
},
|
||||||
{"widget": "number", "label": "Коэф. расширения", "name": "txSpreadCoef", "max": 1000, "min": -1000, "step": 0.01},
|
{"widget": "number", "label": "Коэф. расширения", "name": "txSpreadCoef", "max": 1024, "min": 8, "step": 2},
|
||||||
{
|
{"widget": "number", "label": "Кол-во пакетов на преамбулу", "name": "txFieldsDataPreamble", "max": 255, "min": 1, "step": 1}
|
||||||
"widget": "select", "label": "Номер последовательности Голда", "name": "txGoldan",
|
]
|
||||||
"values": [{"label": "0", "value": "0"}, {"label": "1", "value": "1"}]
|
},
|
||||||
},
|
{
|
||||||
{"widget": "number", "label": "Ослабление, дБ", "name": "txAttenuation", "max": 0, "min": -40, "step": 0.25}
|
"widget": "settings-container",
|
||||||
|
"childs": [
|
||||||
|
{"widget": "h3", "label": "Авто-регулировка мощности"},
|
||||||
|
{"widget": "checkbox", "label": "Авто-регулировка мощности", "name": "aupcEn"},
|
||||||
|
{"widget": "number", "label": "Минимальное ослабление, дБ", "name": "aupcMinAttenuation", "min": 0, "step": 0.1, "max": 10},
|
||||||
|
{"widget": "number", "label": "Максимальное ослабление, дБ", "name": "aupcMaxAttenuation", "min": 0, "step": 0.1, "max": 10},
|
||||||
|
{"widget": "number", "label": "Требуемое ОСШ", "name": "aupcRequiredSnr", "min": 0, "step": 0.01, "max": 30}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -393,17 +401,15 @@
|
|||||||
{"widget": "number", "label": "Усиление, дБ", "name": "rxManualGain", "min": -40, "step": 0.01, "max": 40, "v_show": "paramRxtx.rxAgcEn === false"},
|
{"widget": "number", "label": "Усиление, дБ", "name": "rxManualGain", "min": -40, "step": 0.01, "max": 40, "v_show": "paramRxtx.rxAgcEn === false"},
|
||||||
{"widget": "watch-expr", "label": "Текущее усиление", "expr": "paramRxtx.rxManualGain", "v_show": "paramRxtx.rxAgcEn === true"},
|
{"widget": "watch-expr", "label": "Текущее усиление", "expr": "paramRxtx.rxManualGain", "v_show": "paramRxtx.rxAgcEn === true"},
|
||||||
{"widget": "checkbox", "label": "Инверсия спектра", "name": "rxSpectrumInversion"},
|
{"widget": "checkbox", "label": "Инверсия спектра", "name": "rxSpectrumInversion"},
|
||||||
{"widget": "number", "label": "Центральная частота, КГц", "name": "rxCentralFreq", "min": 950000, "max": 6000000, "step": 0.01},
|
{"widget": "number-int", "label": "Центральная частота, КГц", "name": "rxCentralFreq", "min": 70000, "max": 6000000, "step": 100},
|
||||||
{"widget": "number", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 200000, "max": 54000000},
|
{"widget": "number-int", "label": "Символьная скорость, Бод", "name": "rxBaudrate", "min": 128000, "max": 30000000},
|
||||||
{
|
{
|
||||||
"widget": "select", "label": "Roll-off", "name": "rxRolloff",
|
"widget": "select", "label": "Roll-off", "name": "rxRolloff",
|
||||||
"values": [{"label": "0.02", "value": "2"}, {"label": "0.05", "value": "5"}, {"label": "0.10", "value": "10"}, {"label": "0.15", "value": "15"}, {"label": "0.20", "value": "20"}, {"label": "0.25", "value": "25"}]
|
"values": [{"label": "0.02", "value": "20"}, {"label": "0.05", "value": "50"}, {"label": "0.10", "value": "100"}, {"label": "0.15", "value": "150"}, {"label": "0.20", "value": "200"}, {"label": "0.25", "value": "250"}, {"label": "0.30", "value": "300"}, {"label": "0.35", "value": "350"}]
|
||||||
},
|
},
|
||||||
{"widget": "number", "label": "Коэф. расширения", "name": "rxSpreadCoef", "max": 1000, "min": -1000, "step": 0.01},
|
{"widget": "number", "label": "Коэф. расширения", "name": "rxSpreadCoef", "max": 1024, "min": 8, "step": 2},
|
||||||
{
|
{"widget": "number", "label": "Порог коррелятора", "name": "rxFftShift", "max": 4096, "min": 256, "step": 1},
|
||||||
"widget": "select", "label": "Номер последовательности Голда", "name": "rxGoldan",
|
{"widget": "number", "label": "Кол-во пакетов на преамбулу", "name": "rxFieldsDataPreamble", "max": 255, "min": 1, "step": 1}
|
||||||
"values": [{"label": "0", "value": "0"}, {"label": "1", "value": "1"}]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -455,6 +461,23 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"network": [
|
||||||
|
{"widget": "h2", "label": "Настройки сети"},
|
||||||
|
{
|
||||||
|
"widget": "settings-container",
|
||||||
|
"childs": [
|
||||||
|
{"widget": "h3", "label": "Настройки интерфейса управления"},
|
||||||
|
{"widget": "ip-address-mask", "label": "Интерфейс управления (a.d.d.r/mask)", "name": "managementIp"},
|
||||||
|
{
|
||||||
|
"widget": "select", "label": "Режим сети", "name": "isL2",
|
||||||
|
"values": [{"label": "Маршрутизатор", "value": "false"}, {"label": "Коммутатор", "value": "true"}]
|
||||||
|
},
|
||||||
|
{"widget": "ip-address", "label": "Интерфейс данных (/24)", "name": "dataIp", "v_show": "paramNetwork.isL2 === false"},
|
||||||
|
{"widget": "number", "label": "MTU интерфейса данных", "name": "dataMtu", "min": 1500, "step": 1, "max": 2000},
|
||||||
|
{"widget": "text", "label": "Имя веб-сервера", "name": "serverName"}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"tabs": [
|
"tabs": [
|
||||||
|
@@ -63,6 +63,22 @@
|
|||||||
}
|
}
|
||||||
this.submitStatus.firmwareUpgradeOta = false
|
this.submitStatus.firmwareUpgradeOta = false
|
||||||
},
|
},
|
||||||
|
async settingsPerformSetCesPassword() {
|
||||||
|
if (this.submitStatus.cesPassword) { return }
|
||||||
|
this.submitStatus.cesPassword = true
|
||||||
|
try {
|
||||||
|
await fetch('/api/set/cesPassword', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({'password': this.cesPasswordValue})
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
console.log("failed to perform set CES password: ", e)
|
||||||
|
}
|
||||||
|
this.submitStatus.cesPassword = false
|
||||||
|
},
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
doModemReboot() {
|
doModemReboot() {
|
||||||
@@ -72,3 +88,130 @@
|
|||||||
this.submitStatus.modemReboot = 30
|
this.submitStatus.modemReboot = 30
|
||||||
fetch('/api/reboot', { method: 'POST' }).then((r) => {})
|
fetch('/api/reboot', { method: 'POST' }).then((r) => {})
|
||||||
},
|
},
|
||||||
|
async restoreAllSettings() {
|
||||||
|
// Порядок применения настроек
|
||||||
|
const settingsApplyOrder = ['qos', 'tcpaccel', 'dpdi', 'rxtx', 'buclnb', 'network'];
|
||||||
|
|
||||||
|
// 1. Чтение JSON-файла, выбранного пользователем
|
||||||
|
const fileInput = document.createElement('input');
|
||||||
|
fileInput.type = 'file';
|
||||||
|
fileInput.accept = '.json';
|
||||||
|
|
||||||
|
const filePromise = new Promise((resolve, reject) => {
|
||||||
|
fileInput.onchange = e => {
|
||||||
|
const file = e.target.files[0];
|
||||||
|
if (!file) {
|
||||||
|
reject(new Error('Файл не выбран'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = event => {
|
||||||
|
try {
|
||||||
|
const jsonData = JSON.parse(event.target.result);
|
||||||
|
resolve(jsonData);
|
||||||
|
} catch (error) {
|
||||||
|
reject(new Error('Ошибка парсинга JSON'));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
reader.onerror = () => reject(new Error('Ошибка чтения файла'));
|
||||||
|
reader.readAsText(file);
|
||||||
|
};
|
||||||
|
fileInput.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const settingsToApply = await filePromise;
|
||||||
|
const errors = [];
|
||||||
|
|
||||||
|
// 2. Перебор групп параметров в заданном порядке
|
||||||
|
for (const groupName of settingsApplyOrder) {
|
||||||
|
if (!settingsToApply.hasOwnProperty(groupName)) {
|
||||||
|
continue; // Пропускаем группы, которых нет в файле
|
||||||
|
}
|
||||||
|
|
||||||
|
const groupSettings = settingsToApply[groupName];
|
||||||
|
if (typeof groupSettings !== 'object' || groupSettings === null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 2.1. POST-запрос для применения группы параметров
|
||||||
|
const postResponse = await fetch(`/api/set/${groupName}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(groupSettings)
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!postResponse.ok) {
|
||||||
|
throw new Error(`HTTP error ${postResponse.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const postResult = await postResponse.json();
|
||||||
|
if (postResult.status !== 'ok') {
|
||||||
|
throw new Error(`API error: ${postResult.message || 'unknown error'}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.2. Проверка примененных параметров
|
||||||
|
const getResponse = await fetch('/api/get/settings', { method: 'GET' });
|
||||||
|
if (!getResponse.ok) {
|
||||||
|
throw new Error(`HTTP error ${getResponse.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchSettingsResult = await getResponse.json();
|
||||||
|
if (fetchSettingsResult.status !== 'ok') {
|
||||||
|
throw new Error('Не удалось получить текущие настройки');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка соответствия параметров
|
||||||
|
const appliedGroup = fetchSettingsResult.settings[groupName] || {};
|
||||||
|
const failedSettings = [];
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(groupSettings)) {
|
||||||
|
if (appliedGroup[key] !== value) {
|
||||||
|
failedSettings.push(`${key} (ожидалось: ${value}, получено: ${appliedGroup[key]})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failedSettings.length > 0) {
|
||||||
|
throw new Error(`Не совпадают параметры: ${failedSettings.join(', ')}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (groupError) {
|
||||||
|
errors.push(`Группа ${groupName}: ${groupError.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Показ ошибок, если они есть
|
||||||
|
if (errors.length > 0) {
|
||||||
|
const errorMessage = errors.join('\n\n') +
|
||||||
|
'\n\nНекоторые настройки могли примениться некорректно.\nСтраница будет перезагружена.';
|
||||||
|
alert(errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
alert(`Ошибка при восстановлении настроек: ${error.message}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Перезагрузка страницы
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
async dumpAllSettings() {
|
||||||
|
function downloadAsFile(data, filename) {
|
||||||
|
let a = document.createElement("a");
|
||||||
|
let file = new Blob([data], {type: 'application/json'});
|
||||||
|
a.href = URL.createObjectURL(file);
|
||||||
|
a.download = filename;
|
||||||
|
a.click();
|
||||||
|
}
|
||||||
|
const response = await fetch('/api/get/settings', { method: 'GET' })
|
||||||
|
if (response.ok) {
|
||||||
|
const jres = await response.json()
|
||||||
|
if (jres["status"] === "ok") {
|
||||||
|
downloadAsFile(JSON.stringify(jres["settings"], null, 4), "backup-" + this.about.firmwareVersion + "-" + this.about.modemSn + ".json")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
@@ -21,7 +21,18 @@
|
|||||||
<div>
|
<div>
|
||||||
<button class="dangerous-button" onclick="fetch('/api/resetSettings', { method: 'POST' }).then((r) => { window.location.reload(); })">Сбросить модем до заводских настроек</button>
|
<button class="dangerous-button" onclick="fetch('/api/resetSettings', { method: 'POST' }).then((r) => { window.location.reload(); })">Сбросить модем до заводских настроек</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<button class="action-button" @click="dumpAllSettings()">Сохранить бекап конфигурации</button>
|
||||||
|
<button class="dangerous-button" @click="restoreAllSettings()">Восстановить бекап конфигурации</button>
|
||||||
|
</div>{% endraw %}{% if modem == 'tdma' %}
|
||||||
|
|
||||||
|
<h2>Вход в сеть ЦЗС</h2>
|
||||||
|
<div class="settings-set-container statistics-container">
|
||||||
|
<label>
|
||||||
|
<span>Хеш-строка пароля (выдается оператором NMS)</span>
|
||||||
|
<input v-model="cesPasswordValue" type="text">
|
||||||
|
</label>
|
||||||
|
<button class="action-button" @click="settingsPerformSetCesPassword()">Установить пароль<span class="submit-spinner" v-show="submitStatus.cesPassword"></span></button>
|
||||||
|
</div>{% endif %}{% raw %}
|
||||||
|
|
||||||
<h2>Обновление ПО</h2>
|
<h2>Обновление ПО</h2>
|
||||||
<div class="settings-set-container statistics-container">
|
<div class="settings-set-container statistics-container">
|
||||||
|
@@ -29,42 +29,42 @@
|
|||||||
this.statRx.freq_search_lock = vals["state"]["rx"]["freq_search_lock"]
|
this.statRx.freq_search_lock = vals["state"]["rx"]["freq_search_lock"]
|
||||||
this.statRx.afc_lock = vals["state"]["rx"]["afc_lock"]
|
this.statRx.afc_lock = vals["state"]["rx"]["afc_lock"]
|
||||||
this.statRx.pkt_sync = vals["state"]["rx"]["pkt_sync"]
|
this.statRx.pkt_sync = vals["state"]["rx"]["pkt_sync"]
|
||||||
this.statRx.snr = vals["state"]["rx"]["snr"]
|
this.statRx.snr = Math.round(vals["state"]["rx"]["snr"] * 10) / 10
|
||||||
this.statRx.rssi = vals["state"]["rx"]["rssi"]
|
this.statRx.rssi = Math.round(vals["state"]["rx"]["rssi"] * 10) / 10
|
||||||
this.statRx.modcod = modcodToStr(vals["state"]["rx"]["modcod"])
|
this.statRx.modcod = modcodToStr(vals["state"]["rx"]["modcod"])
|
||||||
this.statRx.frameSizeNormal = vals["state"]["rx"]["frameSizeNormal"]
|
this.statRx.frameSizeNormal = vals["state"]["rx"]["frameSizeNormal"]
|
||||||
this.statRx.isPilots = vals["state"]["rx"]["isPilots"]
|
this.statRx.isPilots = vals["state"]["rx"]["isPilots"]
|
||||||
this.statRx.symError = vals["state"]["rx"]["symError"]
|
this.statRx.symError = vals["state"]["rx"]["symError"]
|
||||||
this.statRx.freqErr = vals["state"]["rx"]["freqErr"]
|
this.statRx.freqErr = Math.round(vals["state"]["rx"]["freqErr"] * 100) / 100
|
||||||
this.statRx.freqErrAcc = vals["state"]["rx"]["freqErrAcc"]
|
this.statRx.freqErrAcc = Math.round(vals["state"]["rx"]["freqErrAcc"] * 100) / 100
|
||||||
this.statRx.inputSignalLevel = vals["state"]["rx"]["inputSignalLevel"]
|
this.statRx.inputSignalLevel = vals["state"]["rx"]["inputSignalLevel"]
|
||||||
this.statRx.pllError = vals["state"]["rx"]["pllError"]
|
this.statRx.pllError = Math.round(vals["state"]["rx"]["pllError"] * 100) / 100
|
||||||
this.statRx.speedOnRxKbit = vals["state"]["rx"]["speedOnRxKbit"]
|
this.statRx.speedOnRxKbit = Math.round(vals["state"]["rx"]["speedOnRxKbit"] * 100) / 100
|
||||||
this.statRx.speedOnIifKbit = vals["state"]["rx"]["speedOnIifKbit"]
|
this.statRx.speedOnIifKbit = Math.round(vals["state"]["rx"]["speedOnIifKbit"] * 100) / 100
|
||||||
this.statRx.packetsOk = vals["state"]["rx"]["packetsOk"]
|
this.statRx.packetsOk = vals["state"]["rx"]["packetsOk"]
|
||||||
this.statRx.packetsBad = vals["state"]["rx"]["packetsBad"]
|
this.statRx.packetsBad = vals["state"]["rx"]["packetsBad"]
|
||||||
this.statRx.packetsDummy = vals["state"]["rx"]["packetsDummy"]
|
this.statRx.packetsDummy = vals["state"]["rx"]["packetsDummy"]
|
||||||
|
|
||||||
{% if modem == 'scpc' %}
|
{% if modem == 'scpc' %}
|
||||||
this.statTx.state = vals["state"]["tx"]["state"]
|
this.statTx.state = vals["state"]["tx"]["state"]
|
||||||
this.statTx.snr = vals["state"]["tx"]["snr"]
|
this.statTx.snr = Math.round(vals["state"]["tx"]["snr"] * 100) / 100
|
||||||
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
||||||
this.statTx.frameSizeNormal = vals["state"]["tx"]["frameSizeNormal"]
|
this.statTx.frameSizeNormal = vals["state"]["tx"]["frameSizeNormal"]
|
||||||
this.statTx.isPilots = vals["state"]["tx"]["isPilots"]
|
this.statTx.isPilots = vals["state"]["tx"]["isPilots"]
|
||||||
this.statTx.speedOnTxKbit = vals["state"]["tx"]["speedOnTxKbit"]
|
this.statTx.speedOnTxKbit = Math.round(vals["state"]["tx"]["speedOnTxKbit"] * 100) / 100
|
||||||
this.statTx.speedOnIifKbit = vals["state"]["tx"]["speedOnIifKbit"]
|
this.statTx.speedOnIifKbit = Math.round(vals["state"]["tx"]["speedOnIifKbit"] * 100) / 100
|
||||||
|
|
||||||
this.statCinc.occ = vals["state"]["cinc"]["occ"]
|
this.statCinc.occ = vals["state"]["cinc"]["occ"]
|
||||||
this.statCinc.correlator = vals["state"]["cinc"]["correlator"]
|
this.statCinc.correlator = vals["state"]["cinc"]["correlator"]
|
||||||
this.statCinc.correlatorFails = vals["state"]["cinc"]["correlatorFails"]
|
this.statCinc.correlatorFails = vals["state"]["cinc"]["correlatorFails"]
|
||||||
this.statCinc.freqErr = vals["state"]["cinc"]["freqErr"]
|
this.statCinc.freqErr = Math.round(vals["state"]["cinc"]["freqErr"] * 100) / 100
|
||||||
this.statCinc.freqErrAcc = vals["state"]["cinc"]["freqErrAcc"]
|
this.statCinc.freqErrAcc = Math.round(vals["state"]["cinc"]["freqErrAcc"] * 100) / 100
|
||||||
this.statCinc.channelDelay = vals["state"]["cinc"]["channelDelay"]
|
this.statCinc.channelDelay = vals["state"]["cinc"]["channelDelay"]
|
||||||
{% else %}
|
{% else %}
|
||||||
this.statTx.state = vals["state"]["tx"]["state"]
|
this.statTx.state = vals["state"]["tx"]["state"]
|
||||||
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
||||||
this.statTx.speedOnTxKbit = vals["state"]["tx"]["speedOnTxKbit"]
|
this.statTx.speedOnTxKbit = Math.round(vals["state"]["tx"]["speedOnTxKbit"] * 100) / 100
|
||||||
this.statTx.speedOnIifKbit = vals["state"]["tx"]["speedOnIifKbit"]
|
this.statTx.speedOnIifKbit = Math.round(vals["state"]["tx"]["speedOnIifKbit"] * 100) / 100
|
||||||
this.statTx.centerFreq = vals["state"]["tx"]["centerFreq"]
|
this.statTx.centerFreq = vals["state"]["tx"]["centerFreq"]
|
||||||
this.statTx.symSpeed = vals["state"]["tx"]["symSpeed"]
|
this.statTx.symSpeed = vals["state"]["tx"]["symSpeed"]
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -91,9 +91,9 @@
|
|||||||
} else {
|
} else {
|
||||||
this.statOs.uptime = '?'
|
this.statOs.uptime = '?'
|
||||||
}
|
}
|
||||||
this.statOs.load1 = vals["state"]["device"]["load1min"]
|
this.statOs.load1 = Math.round(vals["state"]["device"]["load1min"] * 100) / 100
|
||||||
this.statOs.load5 = vals["state"]["device"]["load5min"]
|
this.statOs.load5 = Math.round(vals["state"]["device"]["load5min"] * 100) / 100
|
||||||
this.statOs.load15 = vals["state"]["device"]["load15min"]
|
this.statOs.load15 = Math.round(vals["state"]["device"]["load15min"] * 100) / 100
|
||||||
this.statOs.totalram = vals["state"]["device"]["totalram"]
|
this.statOs.totalram = vals["state"]["device"]["totalram"]
|
||||||
this.statOs.freeram = vals["state"]["device"]["freeram"]
|
this.statOs.freeram = vals["state"]["device"]["freeram"]
|
||||||
},
|
},
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<div class="settings-set-container statistics-container">
|
<div class="settings-set-container statistics-container">
|
||||||
<h2>Статистика приема</h2>
|
<h2>Статистика приема</h2>
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>{% endraw %}{% if modem != 'shps' %}{% raw %}
|
||||||
<tr><th>Прием</th><td><span :class="{ indicator_bad: statRx.state === false, indicator_good: statRx.state === true, indicator: true }"></span></td></tr>
|
<tr><th>Прием</th><td><span :class="{ indicator_bad: statRx.state === false, indicator_good: statRx.state === true, indicator: true }"></span></td></tr>
|
||||||
<tr><th>Захват символьной</th><td><span :class="{ indicator_bad: statRx.sym_sync_lock === false, indicator_good: statRx.sym_sync_lock === true, indicator: true }"></span></td></tr>
|
<tr><th>Захват символьной</th><td><span :class="{ indicator_bad: statRx.sym_sync_lock === false, indicator_good: statRx.sym_sync_lock === true, indicator: true }"></span></td></tr>
|
||||||
<tr><th>Захват ФАПЧ</th><td><span :class="{ indicator_bad: statRx.afc_lock === false, indicator_good: statRx.afc_lock === true, indicator: true }"></span></td></tr>
|
<tr><th>Захват ФАПЧ</th><td><span :class="{ indicator_bad: statRx.afc_lock === false, indicator_good: statRx.afc_lock === true, indicator: true }"></span></td></tr>
|
||||||
@@ -22,7 +22,17 @@
|
|||||||
<tr><td colspan="2" style="padding-top: 1em; text-align: center">Статистика пакетов</td></tr>
|
<tr><td colspan="2" style="padding-top: 1em; text-align: center">Статистика пакетов</td></tr>
|
||||||
<tr><th>Качественных пакетов</th><td>{{ statRx.packetsOk }}</td></tr>
|
<tr><th>Качественных пакетов</th><td>{{ statRx.packetsOk }}</td></tr>
|
||||||
<tr><th>Поврежденных пакетов</th><td>{{ statRx.packetsBad }}</td></tr>
|
<tr><th>Поврежденных пакетов</th><td>{{ statRx.packetsBad }}</td></tr>
|
||||||
<tr><th>DUMMY</th><td>{{ statRx.packetsDummy }}</td></tr>
|
<tr><th>DUMMY</th><td>{{ statRx.packetsDummy }}</td></tr>{% endraw %}{% else %}{% raw %}
|
||||||
|
<tr><th>Прием</th><td><span :class="{ indicator_bad: statRx.state === false, indicator_good: statRx.state === true, indicator: true }"></span></td></tr>
|
||||||
|
<tr><th>ОСШ/RSSI</th><td>{{ statRx.snr }} / {{ statRx.rssi }}</td></tr>
|
||||||
|
<tr><th>Частотная ошибка, Гц</th><td>{{ statRx.freqErrAcc }}</td></tr>
|
||||||
|
<tr><th>Ур. входного сигнала</th><td>{{ statRx.inputSignalLevel }}</td></tr>
|
||||||
|
<tr><th>Ошибка ФАПЧ</th><td>{{ statRx.pllError }}</td></tr>
|
||||||
|
<tr><th>Инф. скорость на приеме</th><td>{{ statRx.speedOnRxKbit }} кбит/с</td></tr>
|
||||||
|
<tr><th>Инф. скорость на интерфейсе</th><td>{{ statRx.speedOnIifKbit }} кбит/с</td></tr>
|
||||||
|
<tr><td colspan="2" style="padding-top: 1em; text-align: center">Статистика пакетов</td></tr>
|
||||||
|
<tr><th>Качественных пакетов</th><td>{{ statRx.packetsOk }}</td></tr>
|
||||||
|
<tr><th>Поврежденных пакетов</th><td>{{ statRx.packetsBad }}</td></tr>{% endraw %}{% endif %}{% raw %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<button class="action-button" @click="resetPacketsStatistics()"> Сброс статистики </button>
|
<button class="action-button" @click="resetPacketsStatistics()"> Сброс статистики </button>
|
||||||
@@ -39,7 +49,7 @@
|
|||||||
<tr><th>Инф. скорость на передаче</th><td>{{ statTx.speedOnTxKbit }} кбит/с</td></tr>
|
<tr><th>Инф. скорость на передаче</th><td>{{ statTx.speedOnTxKbit }} кбит/с</td></tr>
|
||||||
<tr><th>Инф. скорость на интерфейсе</th><td>{{ statTx.speedOnIifKbit }} кбит/с</td></tr>
|
<tr><th>Инф. скорость на интерфейсе</th><td>{{ statTx.speedOnIifKbit }} кбит/с</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>{% endraw %}{% else %}{% raw %}
|
</table>{% endraw %}{% elif modem == 'tdma' %}{% raw %}
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th>Передача</th><td><span :class="{ indicator_bad: statTx.state === false, indicator_good: statTx.state === true, indicator: true }"></span></td></tr>
|
<tr><th>Передача</th><td><span :class="{ indicator_bad: statTx.state === false, indicator_good: statTx.state === true, indicator: true }"></span></td></tr>
|
||||||
@@ -49,6 +59,15 @@
|
|||||||
<tr><th>Центральная частота</th><td>{{ statTx.centerFreq }} кГц</td></tr>
|
<tr><th>Центральная частота</th><td>{{ statTx.centerFreq }} кГц</td></tr>
|
||||||
<tr><th>Символьная скорость</th><td>{{ statTx.symSpeed }} ksymb</td></tr>
|
<tr><th>Символьная скорость</th><td>{{ statTx.symSpeed }} ksymb</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
</table>{% endraw %}{% elif modem == 'shps' %}{% raw %}
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr><th>Передача</th><td><span :class="{ indicator_bad: statTx.state === false, indicator_good: statTx.state === true, indicator: true }"></span></td></tr>
|
||||||
|
<tr><th>Инф. скорость на передаче</th><td>{{ statTx.speedOnTxKbit }} кбит/с</td></tr>
|
||||||
|
<tr><th>Инф. скорость на интерфейсе</th><td>{{ statTx.speedOnIifKbit }} кбит/с</td></tr>
|
||||||
|
<tr><th>Центральная частота</th><td>{{ statTx.centerFreq }} кГц</td></tr>
|
||||||
|
<tr><th>Символьная скорость</th><td>{{ statTx.symSpeed }} ksymb</td></tr>
|
||||||
|
</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 statistics-container" v-if="paramRxtx.isCinC === true">
|
<div class="settings-set-container statistics-container" v-if="paramRxtx.isCinC === true">
|
||||||
|
@@ -58,6 +58,10 @@
|
|||||||
<span>{{ widget.label }}</span>
|
<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]?)$">
|
<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 %}
|
</label>{% endmacro %}
|
||||||
|
{% macro build_widget_ip_address_mask(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]?)\/([0-9]|[1-2][0-9]|3[0-2])$">
|
||||||
|
</label>{% endmacro %}
|
||||||
|
|
||||||
{% macro build_widget_text(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
|
{% macro build_widget_text(param_group, widget) %}<label{% if widget.v_show %} v-show="{{ widget.v_show }}"{% endif %}>
|
||||||
<span>{{ widget.label }}</span>
|
<span>{{ widget.label }}</span>
|
||||||
@@ -78,22 +82,23 @@
|
|||||||
{% elif widget.widget == 'modulation-modcod' %}{{ build_widget_modulation_modcod(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 == 'modulation-speed' %}{{ build_widget_modulation_speed(param_group, widget) }}
|
||||||
{% elif widget.widget == 'ip-address' %}{{ build_widget_ip_address(param_group, widget) }}
|
{% elif widget.widget == 'ip-address' %}{{ build_widget_ip_address(param_group, widget) }}
|
||||||
|
{% elif widget.widget == 'ip-address-mask' %}{{ build_widget_ip_address_mask(param_group, widget) }}
|
||||||
{% elif widget.widget == 'text' %}{{ build_widget_text(param_group, widget) }}
|
{% elif widget.widget == 'text' %}{{ build_widget_text(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 %}
|
||||||
|
|
||||||
{% macro build_getter_js(param_group, widget) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
|
{% macro build_getter_js(param_group, widget) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
|
||||||
elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed', 'text'] %}this.param{{ param_group | title }}.{{ widget.name }}{%
|
elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'ip-address-mask', 'modulation-modcod', 'modulation-speed', 'text'] %}this.param{{ param_group | title }}.{{ widget.name }}{%
|
||||||
elif widget.widget == 'number-int' %}parseFloat(this.param{{ param_group | title }}.{{ widget.name }}.replace(/[^0-9,.]/g, '').replace(',', '.')){%
|
elif widget.widget == 'number-int' %}parseFloat(this.param{{ param_group | title }}.{{ widget.name }}.replace(/[^0-9,.]/g, '').replace(',', '.')){%
|
||||||
else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>{% endif %}{% endmacro %}
|
else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>{% endif %}{% endmacro %}
|
||||||
|
|
||||||
{% macro build_setter_js(param_group, widget, expr) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
|
{% macro build_setter_js(param_group, widget, expr) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
|
||||||
elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed', 'text'] %}this.param{{ param_group | title }}.{{ widget.name }} = {{ expr }}{%
|
elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'ip-address-mask', 'modulation-modcod', 'modulation-speed', 'text'] %}this.param{{ param_group | title }}.{{ widget.name }} = {{ expr }}{%
|
||||||
elif widget.widget == 'number-int' %}this.param{{ param_group | title }}.{{ widget.name }} = this.inputFormatNumber({{ expr }}, {{ js_build_number_number_validator(widget) }}){%
|
elif widget.widget == 'number-int' %}this.param{{ param_group | title }}.{{ widget.name }} = this.inputFormatNumber({{ expr }}, {{ js_build_number_number_validator(widget) }}){%
|
||||||
else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>{% endif %}{% endmacro %}
|
else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>{% endif %}{% endmacro %}
|
||||||
|
|
||||||
{% macro build_setter(param_group, widget, expr) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
|
{% macro build_setter(param_group, widget, expr) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
|
||||||
elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed', 'text'] %}param{{ param_group | title }}.{{ widget.name }} = {{ expr }}{%
|
elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'ip-address-mask', 'modulation-modcod', 'modulation-speed', 'text'] %}param{{ param_group | title }}.{{ widget.name }} = {{ expr }}{%
|
||||||
elif widget.widget == 'number-int' %}param{{ param_group | title }}.{{ widget.name }} = inputFormatNumber({{ expr }}, {{ js_build_number_number_validator(widget) }}){%
|
elif widget.widget == 'number-int' %}param{{ param_group | title }}.{{ widget.name }} = inputFormatNumber({{ expr }}, {{ js_build_number_number_validator(widget) }}){%
|
||||||
else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>{% endif %}{% endmacro %}
|
else %}<p>Widget '{{ widget.widget }}' not defined!</p><p>{{ widget }}</p>{% endif %}{% endmacro %}
|
||||||
|
@@ -99,10 +99,14 @@
|
|||||||
firmwareUpgrade: false,
|
firmwareUpgrade: false,
|
||||||
{% if modem == 'tdma' %}
|
{% if modem == 'tdma' %}
|
||||||
firmwareUpgradeOta: false,
|
firmwareUpgradeOta: false,
|
||||||
|
cesPassword: false,
|
||||||
{% endif %}
|
{% endif %}
|
||||||
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
|
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
|
||||||
modemReboot: null
|
modemReboot: null
|
||||||
},
|
},
|
||||||
|
{% if modem == 'tdma' %}
|
||||||
|
cesPasswordValue: '',
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
// ========== include from 'common/all-params-data.js.j2'
|
// ========== include from 'common/all-params-data.js.j2'
|
||||||
{% include 'common/all-params-data.js.j2' %}
|
{% include 'common/all-params-data.js.j2' %}
|
||||||
|
@@ -73,7 +73,7 @@ void api_driver::proxy::CpProxy::getAcmSettings(ACM_parameters_serv_ &dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void api_driver::proxy::CpProxy::setAcmSettings(ACM_parameters_serv_ &dest) {
|
void api_driver::proxy::CpProxy::setAcmSettings(ACM_parameters_serv_ &dest) {
|
||||||
CPAPI_PROXY_CALL_HELPER("CpProxy::setAcmSettings", CP_GetAcmParams, (sid, &dest), "struct {...}");
|
CPAPI_PROXY_CALL_HELPER("CpProxy::setAcmSettings", CP_SetAcmParams, (sid, dest), "struct {...}");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -6,11 +6,11 @@
|
|||||||
#define API_OBJECT_DEBUG_METRICS_ENABLE
|
#define API_OBJECT_DEBUG_METRICS_ENABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MODEM_IS_SCPC)
|
#if defined(MODEM_IS_SCPC) || defined(MODEM_IS_SHPS)
|
||||||
#define API_STRUCT_ACM_ENABLE
|
#define API_STRUCT_ACM_ENABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MODEM_IS_SCPC) || defined(MODEM_IS_TDMA)
|
#if defined(MODEM_IS_SCPC) || defined(MODEM_IS_TDMA) || defined(MODEM_IS_SHPS)
|
||||||
#define API_OBJECT_NETWORK_SETTINGS_ENABLE
|
#define API_OBJECT_NETWORK_SETTINGS_ENABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -9,50 +9,6 @@
|
|||||||
|
|
||||||
#define TIME_NOW() std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count()
|
#define TIME_NOW() std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count()
|
||||||
|
|
||||||
typedef boost::property_tree::ptree::path_type json_path;
|
|
||||||
|
|
||||||
// static int calculateSubnetMask(const std::string& subnet_mask) {
|
|
||||||
// int mask = 0;
|
|
||||||
// std::istringstream iss(subnet_mask);
|
|
||||||
// std::string octet;
|
|
||||||
// while (std::getline(iss, octet, '.')) {
|
|
||||||
// int octet_value = std::stoi(octet);
|
|
||||||
// for (int i = 7; i >= 0; i--) {
|
|
||||||
// if (octet_value & (1 << i)) {
|
|
||||||
// mask++;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return mask;
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Преобразует строку вида `1.2.3.4/24` в пару строк вида `1.2.3.4` `255.255.255.0`
|
|
||||||
*/
|
|
||||||
// std::pair<std::string, std::string> splitIpAndMask(const std::string& input) {
|
|
||||||
// auto pos = input.find('/');
|
|
||||||
// if (pos == std::string::npos) {
|
|
||||||
// // Обработка ошибки: нет символа '/'
|
|
||||||
// throw std::runtime_error("address not contains mask");
|
|
||||||
// }
|
|
||||||
// std::string ip = input.substr(0, pos);
|
|
||||||
// const unsigned int mask_int = std::stoul(input.substr(pos + 1));
|
|
||||||
//
|
|
||||||
// if (mask_int > 32) {
|
|
||||||
// throw std::runtime_error("invalid mask");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// std::string mask_binary = std::string(mask_int, '1') + std::string(32 - mask_int, '0');
|
|
||||||
// std::string mask_str;
|
|
||||||
//
|
|
||||||
// for (unsigned int i = 0; i < 4; ++i) {
|
|
||||||
// std::string octet = mask_binary.substr(i * 8u, 8);
|
|
||||||
// int octet_value = std::stoi(octet, nullptr, 2);
|
|
||||||
// mask_str += std::to_string(octet_value) + (i < 3 ? "." : "");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// 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) {
|
||||||
return !std::isspace(ch);
|
return !std::isspace(ch);
|
||||||
@@ -94,14 +50,13 @@ std::string makeTimepointFromMillis(int64_t unix_time_ms) {
|
|||||||
#ifdef API_OBJECT_DEBUG_METRICS_ENABLE
|
#ifdef API_OBJECT_DEBUG_METRICS_ENABLE
|
||||||
api_driver::obj::StatisticsLogger::StatisticsLogger(): timeStart(TIME_NOW()) {}
|
api_driver::obj::StatisticsLogger::StatisticsLogger(): timeStart(TIME_NOW()) {}
|
||||||
|
|
||||||
std::string api_driver::obj::StatisticsLogger::getSettings() {
|
nlohmann::json api_driver::obj::StatisticsLogger::getSettings() {
|
||||||
std::lock_guard _lock(mutex);
|
std::lock_guard _lock(mutex);
|
||||||
std::stringstream res;
|
nlohmann::json res;
|
||||||
res << "{\"en\":" << boolAsStr(this->logEn);
|
res["en"] = this->logEn;
|
||||||
res << ",\"logPeriodMs\":" << logPeriodMs;
|
res["logPeriodMs"] = logPeriodMs.load();
|
||||||
res << ",\"maxAgeMs\":" << maxAgeMs;
|
res["maxAgeMs"] = maxAgeMs.load();
|
||||||
res << '}';
|
return res;
|
||||||
return res.str();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void api_driver::obj::StatisticsLogger::setSettings(const nlohmann::json& data) {
|
void api_driver::obj::StatisticsLogger::setSettings(const nlohmann::json& data) {
|
||||||
@@ -178,6 +133,49 @@ api_driver::obj::StatisticsLogger::~StatisticsLogger() = default;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE
|
#ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE
|
||||||
|
static int calculateSubnetMask(const std::string& subnet_mask) {
|
||||||
|
int mask = 0;
|
||||||
|
std::istringstream iss(subnet_mask);
|
||||||
|
std::string octet;
|
||||||
|
while (std::getline(iss, octet, '.')) {
|
||||||
|
int octet_value = std::stoi(octet);
|
||||||
|
for (int i = 7; i >= 0; i--) {
|
||||||
|
if (octet_value & (1 << i)) {
|
||||||
|
mask++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Преобразует строку вида `1.2.3.4/24` в пару строк вида `1.2.3.4` `255.255.255.0`
|
||||||
|
*/
|
||||||
|
std::pair<std::string, std::string> splitIpAndMask(const std::string& input) {
|
||||||
|
auto pos = input.find('/');
|
||||||
|
if (pos == std::string::npos) {
|
||||||
|
// Обработка ошибки: нет символа '/'
|
||||||
|
throw std::runtime_error("address not contains mask");
|
||||||
|
}
|
||||||
|
std::string ip = input.substr(0, pos);
|
||||||
|
const unsigned int mask_int = std::stoul(input.substr(pos + 1));
|
||||||
|
|
||||||
|
if (mask_int > 32) {
|
||||||
|
throw std::runtime_error("invalid mask");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string mask_binary = std::string(mask_int, '1') + std::string(32 - mask_int, '0');
|
||||||
|
std::string mask_str;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < 4; ++i) {
|
||||||
|
std::string octet = mask_binary.substr(i * 8u, 8);
|
||||||
|
int octet_value = std::stoi(octet, nullptr, 2);
|
||||||
|
mask_str += std::to_string(octet_value) + (i < 3 ? "." : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::make_pair(ip, mask_str);
|
||||||
|
}
|
||||||
|
|
||||||
api_driver::obj::TerminalNetworkSettings::TerminalNetworkSettings() { loadDefaults(); }
|
api_driver::obj::TerminalNetworkSettings::TerminalNetworkSettings() { loadDefaults(); }
|
||||||
|
|
||||||
api_driver::obj::TerminalNetworkSettings::TerminalNetworkSettings(const TerminalNetworkSettings &src) = default;
|
api_driver::obj::TerminalNetworkSettings::TerminalNetworkSettings(const TerminalNetworkSettings &src) = default;
|
||||||
@@ -185,7 +183,7 @@ api_driver::obj::TerminalNetworkSettings::TerminalNetworkSettings(const Terminal
|
|||||||
api_driver::obj::TerminalNetworkSettings & api_driver::obj::TerminalNetworkSettings::operator=(const TerminalNetworkSettings &src) = default;
|
api_driver::obj::TerminalNetworkSettings & api_driver::obj::TerminalNetworkSettings::operator=(const TerminalNetworkSettings &src) = default;
|
||||||
|
|
||||||
void api_driver::obj::TerminalNetworkSettings::loadDefaults() {
|
void api_driver::obj::TerminalNetworkSettings::loadDefaults() {
|
||||||
managementIp = "0.0.0.0";
|
managementIp = "0.0.0.0/24";
|
||||||
managementGateway = "";
|
managementGateway = "";
|
||||||
isL2 = true;
|
isL2 = true;
|
||||||
dataIp = "0.0.0.0";
|
dataIp = "0.0.0.0";
|
||||||
@@ -197,8 +195,8 @@ void api_driver::obj::TerminalNetworkSettings::updateCallback(proxy::CpProxy &cp
|
|||||||
loadDefaults();
|
loadDefaults();
|
||||||
try {
|
try {
|
||||||
managementIp = cp.getNetwork("addr");
|
managementIp = cp.getNetwork("addr");
|
||||||
// s.managementIp += "/";
|
managementIp += "/";
|
||||||
// s.managementIp += std::to_string(calculateSubnetMask(cp.getNetwork("mask")));
|
managementIp += std::to_string(calculateSubnetMask(cp.getNetwork("mask")));
|
||||||
|
|
||||||
managementGateway = cp.getNetwork("gateway");
|
managementGateway = cp.getNetwork("gateway");
|
||||||
if (cp.getNetwork("mode") == "tun") {
|
if (cp.getNetwork("mode") == "tun") {
|
||||||
@@ -228,12 +226,13 @@ void api_driver::obj::TerminalNetworkSettings::updateFromJson(const nlohmann::js
|
|||||||
void api_driver::obj::TerminalNetworkSettings::store(proxy::CpProxy& cp) {
|
void api_driver::obj::TerminalNetworkSettings::store(proxy::CpProxy& cp) {
|
||||||
try {
|
try {
|
||||||
cp.setNetwork("mode", isL2 ? "tap" : "tun");
|
cp.setNetwork("mode", isL2 ? "tap" : "tun");
|
||||||
cp.setNetwork("addr", managementIp);
|
auto [mAddr, mMask] = splitIpAndMask(managementIp);
|
||||||
|
cp.setNetwork("addr", mAddr);
|
||||||
|
cp.setNetwork("mask", mMask);
|
||||||
|
|
||||||
if (!isL2) {
|
if (!isL2) {
|
||||||
cp.setNetwork("addr_data", dataIp);
|
cp.setNetwork("addr_data", dataIp);
|
||||||
}
|
}
|
||||||
cp.setNetwork("mask", "255.255.255.0");
|
|
||||||
cp.setNetwork("gateway", managementGateway);
|
cp.setNetwork("gateway", managementGateway);
|
||||||
|
|
||||||
// cp.setNetwork("data_mtu", std::to_string(dataMtu));
|
// cp.setNetwork("data_mtu", std::to_string(dataMtu));
|
||||||
@@ -355,19 +354,23 @@ void api_driver::obj::TerminalState::updateCallback(proxy::CpProxy& cp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fRxState = demod.locks.sym_sync_lock && demod.locks.freq_lock && demod.locks.afc_lock && demod.locks.pkt_sync;
|
fRxState = demod.locks.sym_sync_lock && demod.locks.freq_lock && demod.locks.afc_lock && demod.locks.pkt_sync;
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
fRxSymSyncLock = demod.locks.sym_sync_lock;
|
fRxSymSyncLock = demod.locks.sym_sync_lock;
|
||||||
fRxFreqSearchLock = demod.locks.freq_lock;
|
fRxFreqSearchLock = demod.locks.freq_lock;
|
||||||
fRxAfcLock = demod.locks.afc_lock;
|
fRxAfcLock = demod.locks.afc_lock;
|
||||||
fRxPktSync = demod.locks.pkt_sync;
|
fRxPktSync = demod.locks.pkt_sync;
|
||||||
|
#endif
|
||||||
|
|
||||||
fRxSnr = demod.snr;
|
fRxSnr = demod.snr;
|
||||||
fRxRssi = demod.rssi;
|
fRxRssi = demod.rssi;
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
fRxModcod = demod.modcod;
|
fRxModcod = demod.modcod;
|
||||||
fRxFrameSizeNormal = !demod.is_short;
|
fRxFrameSizeNormal = !demod.is_short;
|
||||||
fRxIsPilots = demod.is_pilots;
|
fRxIsPilots = demod.is_pilots;
|
||||||
|
|
||||||
fRxSymError = demod.sym_err;
|
fRxSymError = demod.sym_err;
|
||||||
fRxFreqErr = demod.crs_freq_err;
|
fRxFreqErr = demod.crs_freq_err;
|
||||||
|
#endif
|
||||||
fRxFreqErrAcc = demod.fine_freq_err;
|
fRxFreqErrAcc = demod.fine_freq_err;
|
||||||
fRxInputSignalLevel = demod.if_overload;
|
fRxInputSignalLevel = demod.if_overload;
|
||||||
fRxPllError = demod.afc_err;
|
fRxPllError = demod.afc_err;
|
||||||
@@ -375,9 +378,10 @@ void api_driver::obj::TerminalState::updateCallback(proxy::CpProxy& cp) {
|
|||||||
fRxSpeedOnIifKbit = static_cast<double>(demod.speed_in_bytes_rx_iface) / 128.0;
|
fRxSpeedOnIifKbit = static_cast<double>(demod.speed_in_bytes_rx_iface) / 128.0;
|
||||||
fRxPacketsOk = demod.packet_ok_cnt;
|
fRxPacketsOk = demod.packet_ok_cnt;
|
||||||
fRxPacketsBad = demod.packet_bad_cnt;
|
fRxPacketsBad = demod.packet_bad_cnt;
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
fRxPacketsDummy = demod.dummy_cnt;
|
fRxPacketsDummy = demod.dummy_cnt;
|
||||||
|
|
||||||
fTxModcod = mod.modcod;
|
fTxModcod = mod.modcod;
|
||||||
|
#endif
|
||||||
fTxSpeedOnTxKbit = static_cast<double>(mod.speed_in_bytes_tx) / 128.0;
|
fTxSpeedOnTxKbit = static_cast<double>(mod.speed_in_bytes_tx) / 128.0;
|
||||||
fTxSpeedOnIifKbit = static_cast<double>(mod.speed_in_bytes_tx_iface) / 128.0;
|
fTxSpeedOnIifKbit = static_cast<double>(mod.speed_in_bytes_tx_iface) / 128.0;
|
||||||
#ifdef MODEM_IS_SCPC
|
#ifdef MODEM_IS_SCPC
|
||||||
@@ -391,10 +395,8 @@ void api_driver::obj::TerminalState::updateCallback(proxy::CpProxy& cp) {
|
|||||||
fCincFreqErrAcc = cinc.freq_fine_estimate;
|
fCincFreqErrAcc = cinc.freq_fine_estimate;
|
||||||
fCincChannelDelay = cinc.delay_dpdi;
|
fCincChannelDelay = cinc.delay_dpdi;
|
||||||
#endif
|
#endif
|
||||||
#ifdef MODEM_IS_TDMA
|
|
||||||
fTxCenterFreq = modSet.central_freq_in_kGz;
|
fTxCenterFreq = modSet.central_freq_in_kGz;
|
||||||
fTxSymSpeed = static_cast<double>(modSet.baudrate) / 1000.0;
|
fTxSymSpeed = static_cast<double>(modSet.baudrate) / 1000.0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nlohmann::json api_driver::obj::TerminalState::asJson() {
|
nlohmann::json api_driver::obj::TerminalState::asJson() {
|
||||||
@@ -407,19 +409,23 @@ nlohmann::json api_driver::obj::TerminalState::asJson() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
res["rx"]["state"] = fRxState;
|
res["rx"]["state"] = fRxState;
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
res["rx"]["sym_sync_lock"] = fRxSymSyncLock;
|
res["rx"]["sym_sync_lock"] = fRxSymSyncLock;
|
||||||
res["rx"]["freq_search_lock"] = fRxFreqSearchLock;
|
res["rx"]["freq_search_lock"] = fRxFreqSearchLock;
|
||||||
res["rx"]["afc_lock"] = fRxAfcLock;
|
res["rx"]["afc_lock"] = fRxAfcLock;
|
||||||
res["rx"]["pkt_sync"] = fRxPktSync;
|
res["rx"]["pkt_sync"] = fRxPktSync;
|
||||||
|
#endif
|
||||||
|
|
||||||
res["rx"]["snr"] = fRxSnr;
|
res["rx"]["snr"] = fRxSnr;
|
||||||
res["rx"]["rssi"] = fRxRssi;
|
res["rx"]["rssi"] = fRxRssi;
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
res["rx"]["modcod"] = fRxModcod;
|
res["rx"]["modcod"] = fRxModcod;
|
||||||
res["rx"]["frameSizeNormal"] = fRxFrameSizeNormal;
|
res["rx"]["frameSizeNormal"] = fRxFrameSizeNormal;
|
||||||
res["rx"]["isPilots"] = fRxIsPilots;
|
res["rx"]["isPilots"] = fRxIsPilots;
|
||||||
|
|
||||||
res["rx"]["symError"] = fRxSymError;
|
res["rx"]["symError"] = fRxSymError;
|
||||||
res["rx"]["freqErr"] = fRxFreqErr;
|
res["rx"]["freqErr"] = fRxFreqErr;
|
||||||
|
#endif
|
||||||
res["rx"]["freqErrAcc"] = fRxFreqErrAcc;
|
res["rx"]["freqErrAcc"] = fRxFreqErrAcc;
|
||||||
res["rx"]["inputSignalLevel"] = fRxInputSignalLevel;
|
res["rx"]["inputSignalLevel"] = fRxInputSignalLevel;
|
||||||
res["rx"]["pllError"] = fRxPllError;
|
res["rx"]["pllError"] = fRxPllError;
|
||||||
@@ -427,9 +433,10 @@ nlohmann::json api_driver::obj::TerminalState::asJson() {
|
|||||||
res["rx"]["speedOnIifKbit"] = fRxSpeedOnIifKbit;
|
res["rx"]["speedOnIifKbit"] = fRxSpeedOnIifKbit;
|
||||||
res["rx"]["packetsOk"] = fRxPacketsOk;
|
res["rx"]["packetsOk"] = fRxPacketsOk;
|
||||||
res["rx"]["packetsBad"] = fRxPacketsBad;
|
res["rx"]["packetsBad"] = fRxPacketsBad;
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
res["rx"]["packetsDummy"] = fRxPacketsDummy;
|
res["rx"]["packetsDummy"] = fRxPacketsDummy;
|
||||||
|
|
||||||
res["tx"]["modcod"] = fTxModcod;
|
res["tx"]["modcod"] = fTxModcod;
|
||||||
|
#endif
|
||||||
res["tx"]["state"] = fTxState;
|
res["tx"]["state"] = fTxState;
|
||||||
res["tx"]["speedOnTxKbit"] = fTxSpeedOnTxKbit;
|
res["tx"]["speedOnTxKbit"] = fTxSpeedOnTxKbit;
|
||||||
res["tx"]["speedOnIifKbit"] = fTxSpeedOnIifKbit;
|
res["tx"]["speedOnIifKbit"] = fTxSpeedOnIifKbit;
|
||||||
@@ -454,10 +461,8 @@ nlohmann::json api_driver::obj::TerminalState::asJson() {
|
|||||||
res["cinc"]["correlator"] = nullptr;
|
res["cinc"]["correlator"] = nullptr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef MODEM_IS_TDMA
|
|
||||||
res["tx"]["centerFreq"] = fTxCenterFreq;
|
res["tx"]["centerFreq"] = fTxCenterFreq;
|
||||||
res["tx"]["symSpeed"] = fTxSymSpeed;
|
res["tx"]["symSpeed"] = fTxSymSpeed;
|
||||||
#endif
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -662,6 +667,7 @@ void api_driver::obj::TerminalRxTxSettings::updateMainSettings(const nlohmann::j
|
|||||||
#endif
|
#endif
|
||||||
#ifdef MODEM_IS_SHPS
|
#ifdef MODEM_IS_SHPS
|
||||||
mod.koef_spread = data.value("txSpreadCoef", mod.koef_spread);
|
mod.koef_spread = data.value("txSpreadCoef", mod.koef_spread);
|
||||||
|
mod.txFieldsDataPreamble = data.value("txFieldsDataPreamble", mod.txFieldsDataPreamble);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// демодулятор
|
// демодулятор
|
||||||
@@ -676,16 +682,17 @@ void api_driver::obj::TerminalRxTxSettings::updateMainSettings(const nlohmann::j
|
|||||||
#endif
|
#endif
|
||||||
#ifdef MODEM_IS_SHPS
|
#ifdef MODEM_IS_SHPS
|
||||||
dem.koef_spread = data.value("rxSpreadCoef", dem.koef_spread);
|
dem.koef_spread = data.value("rxSpreadCoef", dem.koef_spread);
|
||||||
|
dem.rxFftShift = data.value("rxFftShift", dem.rxFftShift);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef API_STRUCT_ACM_ENABLE
|
#ifdef API_STRUCT_ACM_ENABLE
|
||||||
// ACM
|
// ACM
|
||||||
#ifndef MODEM_IS_SHPS
|
#ifdef MODEM_IS_SCPC
|
||||||
// в ШПС этих настроек нет
|
// эти настройки только в SCPC
|
||||||
acm.period_pack_acm = data.value("dvbServicePacketPeriod", acm.period_pack_acm);
|
acm.period_pack_acm = data.value("dvbServicePacketPeriod", acm.period_pack_acm);
|
||||||
acm.enable_acm = data.value("dvbIsAcm", acm.enable_acm);
|
acm.enable_acm = data.value("dvbIsAcm", acm.enable_acm);
|
||||||
acm.min_modcod_acm = buildModcodFromJson(data, acm.min_modcod_acm, "dvbAcmMin", acmIsFrameSizeNormal, acmIsPilots);
|
acm.min_modcod_acm = buildModcodFromJson(data, acm.min_modcod_acm, "dvbAcmMin", acmIsFrameSizeNormal, acmIsPilots);
|
||||||
acm.min_modcod_acm = buildModcodFromJson(data, acm.max_modcod_acm, "dvbAcmMax", acmIsFrameSizeNormal, acmIsPilots);
|
acm.max_modcod_acm = buildModcodFromJson(data, acm.max_modcod_acm, "dvbAcmMax", acmIsFrameSizeNormal, acmIsPilots);
|
||||||
acm.snr_threashold_acm = data.value("dvbSnrReserve", acm.snr_threashold_acm); // запас ОСШ
|
acm.snr_threashold_acm = data.value("dvbSnrReserve", acm.snr_threashold_acm); // запас ОСШ
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -740,7 +747,7 @@ void api_driver::obj::TerminalRxTxSettings::updateDpdiSettings(const nlohmann::j
|
|||||||
dpdi.max_delay = data.value("delayMax", dpdi.max_delay);
|
dpdi.max_delay = data.value("delayMax", dpdi.max_delay);
|
||||||
#else
|
#else
|
||||||
dpdi.min_delay = 0;
|
dpdi.min_delay = 0;
|
||||||
dpdi.max_delay = data.value("dpdiDelay", dpdi.max_delay);
|
dpdi.max_delay = data.value("delay", dpdi.max_delay);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
void api_driver::obj::TerminalRxTxSettings::storeDpdiSettings(proxy::CpProxy &cp) {
|
void api_driver::obj::TerminalRxTxSettings::storeDpdiSettings(proxy::CpProxy &cp) {
|
||||||
@@ -770,6 +777,9 @@ void api_driver::obj::TerminalRxTxSettings::updateBuclnbSettings(const nlohmann:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
buclnb.is_ref_10MHz_buc = data.value("bucRefClk10M", buclnb.is_ref_10MHz_buc);
|
buclnb.is_ref_10MHz_buc = data.value("bucRefClk10M", buclnb.is_ref_10MHz_buc);
|
||||||
|
#ifdef MODEM_IS_TDMA
|
||||||
|
buclnb.lo_buc_inkHz = data.value("bucLoKhz", buclnb.lo_buc_inkHz);
|
||||||
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
// напряжение lnb
|
// напряжение lnb
|
||||||
@@ -789,8 +799,10 @@ void api_driver::obj::TerminalRxTxSettings::updateBuclnbSettings(const nlohmann:
|
|||||||
default: buclnb.lnb = voltage_lnb::DISABLE;
|
default: buclnb.lnb = voltage_lnb::DISABLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buclnb.is_ref_10MHz_lnb = data.value("lnbRefClk10M", buclnb.is_ref_10MHz_lnb);
|
buclnb.is_ref_10MHz_lnb = data.value("lnbRefClk10M", buclnb.is_ref_10MHz_lnb);
|
||||||
|
#ifdef MODEM_IS_TDMA
|
||||||
|
buclnb.lo_lnb_inkHz = data.value("lnbLoKhz", buclnb.lo_lnb_inkHz);
|
||||||
|
#endif
|
||||||
|
|
||||||
buclnb.is_ref_10MHz_output = data.value("srvRefClk10M", buclnb.is_ref_10MHz_output);
|
buclnb.is_ref_10MHz_output = data.value("srvRefClk10M", buclnb.is_ref_10MHz_output);
|
||||||
buclnb.is_save_current_state = data.value("bucLnbAutoStart", buclnb.is_save_current_state);
|
buclnb.is_save_current_state = data.value("bucLnbAutoStart", buclnb.is_save_current_state);
|
||||||
@@ -837,6 +849,7 @@ nlohmann::json api_driver::obj::TerminalRxTxSettings::asJson() const {
|
|||||||
rxtx["txAttenuation"] = mod.attenuation;
|
rxtx["txAttenuation"] = mod.attenuation;
|
||||||
#ifdef MODEM_IS_SHPS
|
#ifdef MODEM_IS_SHPS
|
||||||
rxtx["txSpreadCoef"] = mod.koef_spread;
|
rxtx["txSpreadCoef"] = mod.koef_spread;
|
||||||
|
rxtx["txFieldsDataPreamble"] = mod.txFieldsDataPreamble;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MODEM_IS_SCPC) || defined(MODEM_IS_SHPS)
|
#if defined(MODEM_IS_SCPC) || defined(MODEM_IS_SHPS)
|
||||||
@@ -861,14 +874,14 @@ nlohmann::json api_driver::obj::TerminalRxTxSettings::asJson() const {
|
|||||||
rxtx["rxGoldan"] = dem.gold_seq_is_active ? 1 : 0;
|
rxtx["rxGoldan"] = dem.gold_seq_is_active ? 1 : 0;
|
||||||
#endif
|
#endif
|
||||||
#ifdef MODEM_IS_SHPS
|
#ifdef MODEM_IS_SHPS
|
||||||
rxtx["txSpreadCoef"] = mod.koef_spread;
|
|
||||||
rxtx["rxSpreadCoef"] = dem.koef_spread;
|
rxtx["rxSpreadCoef"] = dem.koef_spread;
|
||||||
|
rxtx["rxFftShift"] = dem.rxFftShift;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef API_STRUCT_ACM_ENABLE
|
#ifdef API_STRUCT_ACM_ENABLE
|
||||||
// ACM
|
// ACM
|
||||||
#ifndef MODEM_IS_SHPS
|
#ifdef MODEM_IS_SCPC
|
||||||
// в ШПС этих настроек нет
|
// эти настройки только в SCPC
|
||||||
rxtx["dvbServicePacketPeriod"] = acm.period_pack_acm;
|
rxtx["dvbServicePacketPeriod"] = acm.period_pack_acm;
|
||||||
rxtx["dvbIsAcm"] = acm.enable_acm;
|
rxtx["dvbIsAcm"] = acm.enable_acm;
|
||||||
|
|
||||||
@@ -921,6 +934,9 @@ nlohmann::json api_driver::obj::TerminalRxTxSettings::asJson() const {
|
|||||||
#endif
|
#endif
|
||||||
default: bl["bucPowering"] = 0;
|
default: bl["bucPowering"] = 0;
|
||||||
}
|
}
|
||||||
|
#ifdef MODEM_IS_TDMA
|
||||||
|
bl["bucLoKhz"] = buclnb.lo_buc_inkHz;
|
||||||
|
#endif
|
||||||
|
|
||||||
bl["bucRefClk10M"] = buclnb.is_ref_10MHz_buc;
|
bl["bucRefClk10M"] = buclnb.is_ref_10MHz_buc;
|
||||||
switch (buclnb.lnb) {
|
switch (buclnb.lnb) {
|
||||||
@@ -930,6 +946,9 @@ nlohmann::json api_driver::obj::TerminalRxTxSettings::asJson() const {
|
|||||||
default: bl["lnbPowering"] = 0;
|
default: bl["lnbPowering"] = 0;
|
||||||
}
|
}
|
||||||
bl["lnbRefClk10M"] = buclnb.is_ref_10MHz_lnb;
|
bl["lnbRefClk10M"] = buclnb.is_ref_10MHz_lnb;
|
||||||
|
#ifdef MODEM_IS_TDMA
|
||||||
|
bl["lnbLoKhz"] = buclnb.lo_lnb_inkHz;
|
||||||
|
#endif
|
||||||
|
|
||||||
bl["srvRefClk10M"] = buclnb.is_ref_10MHz_output;
|
bl["srvRefClk10M"] = buclnb.is_ref_10MHz_output;
|
||||||
bl["bucLnbAutoStart"] = buclnb.is_save_current_state;
|
bl["bucLnbAutoStart"] = buclnb.is_save_current_state;
|
||||||
|
@@ -7,8 +7,6 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <shared_mutex>
|
#include <shared_mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
//#include <boost/property_tree/ptree_fwd.hpp>
|
|
||||||
|
|
||||||
#include "common/nlohmann/json.hpp"
|
#include "common/nlohmann/json.hpp"
|
||||||
|
|
||||||
|
|
||||||
@@ -30,7 +28,7 @@ namespace api_driver::obj {
|
|||||||
*
|
*
|
||||||
* @return {"en": bool, "logPeriodMs": int, "maxAgeMs": int}
|
* @return {"en": bool, "logPeriodMs": int, "maxAgeMs": int}
|
||||||
*/
|
*/
|
||||||
std::string getSettings();
|
nlohmann::json getSettings();
|
||||||
void setSettings(const nlohmann::json& data);
|
void setSettings(const nlohmann::json& data);
|
||||||
|
|
||||||
void updateCallback(proxy::CpProxy& cp);
|
void updateCallback(proxy::CpProxy& cp);
|
||||||
@@ -136,19 +134,22 @@ namespace api_driver::obj {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool fRxState{};
|
bool fRxState{};
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
bool fRxSymSyncLock{};
|
bool fRxSymSyncLock{};
|
||||||
bool fRxFreqSearchLock{};
|
bool fRxFreqSearchLock{};
|
||||||
bool fRxAfcLock{};
|
bool fRxAfcLock{};
|
||||||
bool fRxPktSync{};
|
bool fRxPktSync{};
|
||||||
|
#endif
|
||||||
|
|
||||||
float fRxSnr{};
|
float fRxSnr{};
|
||||||
float fRxRssi{};
|
float fRxRssi{};
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
uint16_t fRxModcod{};
|
uint16_t fRxModcod{};
|
||||||
bool fRxFrameSizeNormal{};
|
bool fRxFrameSizeNormal{};
|
||||||
bool fRxIsPilots{};
|
bool fRxIsPilots{};
|
||||||
|
|
||||||
double fRxSymError{};
|
double fRxSymError{};
|
||||||
double fRxFreqErr{};
|
double fRxFreqErr{};
|
||||||
|
#endif
|
||||||
double fRxFreqErrAcc{};
|
double fRxFreqErrAcc{};
|
||||||
double fRxInputSignalLevel{};
|
double fRxInputSignalLevel{};
|
||||||
double fRxPllError{};
|
double fRxPllError{};
|
||||||
@@ -156,9 +157,10 @@ namespace api_driver::obj {
|
|||||||
double fRxSpeedOnIifKbit{};
|
double fRxSpeedOnIifKbit{};
|
||||||
uint32_t fRxPacketsOk{};
|
uint32_t fRxPacketsOk{};
|
||||||
uint32_t fRxPacketsBad{};
|
uint32_t fRxPacketsBad{};
|
||||||
|
#ifndef MODEM_IS_SHPS
|
||||||
uint32_t fRxPacketsDummy{};
|
uint32_t fRxPacketsDummy{};
|
||||||
|
|
||||||
uint16_t fTxModcod{};
|
uint16_t fTxModcod{};
|
||||||
|
#endif
|
||||||
double fTxSpeedOnTxKbit{};
|
double fTxSpeedOnTxKbit{};
|
||||||
double fTxSpeedOnIifKbit{};
|
double fTxSpeedOnIifKbit{};
|
||||||
#ifdef MODEM_IS_SCPC
|
#ifdef MODEM_IS_SCPC
|
||||||
@@ -172,10 +174,8 @@ namespace api_driver::obj {
|
|||||||
int32_t fCincFreqErrAcc{};
|
int32_t fCincFreqErrAcc{};
|
||||||
float fCincChannelDelay{};
|
float fCincChannelDelay{};
|
||||||
#endif
|
#endif
|
||||||
#ifdef MODEM_IS_TDMA
|
|
||||||
double fTxCenterFreq;
|
double fTxCenterFreq;
|
||||||
double fTxSymSpeed;
|
double fTxSymSpeed;
|
||||||
#endif
|
|
||||||
|
|
||||||
TerminalState();
|
TerminalState();
|
||||||
|
|
||||||
|
36
src/main.cpp
36
src/main.cpp
@@ -227,7 +227,7 @@ public:
|
|||||||
resultJson["status"] = "ok";
|
resultJson["status"] = "ok";
|
||||||
resultJson["state"] = api->loadTerminalState();
|
resultJson["state"] = api->loadTerminalState();
|
||||||
} catch (std::exception& e) {
|
} catch (std::exception& e) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/qos): Can't set QoS settings: " << e.what();
|
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/get/statistics): Can't get terminal state: " << e.what();
|
||||||
resultJson.clear();
|
resultJson.clear();
|
||||||
resultJson["status"] = "error";
|
resultJson["status"] = "error";
|
||||||
resultJson["error"] = e.what();
|
resultJson["error"] = e.what();
|
||||||
@@ -436,6 +436,36 @@ public:
|
|||||||
auto result = resultJson.dump();
|
auto result = resultJson.dump();
|
||||||
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());
|
||||||
}));
|
}));
|
||||||
|
#ifdef MODEM_IS_TDMA
|
||||||
|
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/set/cesPassword", this->auth, http::auth::User::EDIT_SETTINGS, [this](const http::server::Request& req, auto& rep) {
|
||||||
|
if (req.method != "POST") {
|
||||||
|
http::server::stockReply(http::server::bad_request, rep);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rep.status = http::server::ok;
|
||||||
|
rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)});
|
||||||
|
nlohmann::json resultJson;
|
||||||
|
|
||||||
|
try {
|
||||||
|
auto reqJson = nlohmann::json::parse(std::string(req.payload.begin(), req.payload.end()));
|
||||||
|
auto password = reqJson["password"].get<std::string>();
|
||||||
|
|
||||||
|
this->api->executeInApi([&password](auto& cp) {
|
||||||
|
cp.setNetwork("ces_password", password);
|
||||||
|
});
|
||||||
|
resultJson["status"] = "ok";
|
||||||
|
} catch (std::exception& e) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/cesPassword): Can't set CES password: " << e.what();
|
||||||
|
resultJson.clear();
|
||||||
|
resultJson["status"] = "error";
|
||||||
|
resultJson["error"] = e.what();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto result = resultJson.dump();
|
||||||
|
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||||
|
}));
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/reboot", this->auth, 0, [this](const auto& req, auto& rep) {
|
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/reboot", this->auth, 0, [this](const auto& req, auto& rep) {
|
||||||
@@ -595,6 +625,8 @@ public:
|
|||||||
}));
|
}));
|
||||||
#ifdef API_OBJECT_DEBUG_METRICS_ENABLE
|
#ifdef API_OBJECT_DEBUG_METRICS_ENABLE
|
||||||
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/dev/settings", this->auth, http::auth::User::DEVELOPER, [this](const auto& req, auto& rep) {
|
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/dev/settings", this->auth, http::auth::User::DEVELOPER, [this](const auto& req, auto& rep) {
|
||||||
|
rep.status = http::server::ok;
|
||||||
|
rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::text_plain)});
|
||||||
nlohmann::json resultJson;
|
nlohmann::json resultJson;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -603,7 +635,7 @@ public:
|
|||||||
resultJson["logstat"] = api->getLoggingStatisticsSettings();
|
resultJson["logstat"] = api->getLoggingStatisticsSettings();
|
||||||
} else if (req.method == "POST") {
|
} else if (req.method == "POST") {
|
||||||
auto reqJson = nlohmann::json::parse(std::string(req.payload.begin(), req.payload.end()));
|
auto reqJson = nlohmann::json::parse(std::string(req.payload.begin(), req.payload.end()));
|
||||||
api->setQosSettings(reqJson);
|
api->setLoggingStatisticsSettings(reqJson);
|
||||||
|
|
||||||
resultJson["status"] = "ok";
|
resultJson["status"] = "ok";
|
||||||
resultJson["logstat"] = api->getLoggingStatisticsSettings();
|
resultJson["logstat"] = api->getLoggingStatisticsSettings();
|
||||||
|
@@ -107,7 +107,7 @@ void api_driver::ApiDriver::setDpdiSettings(const nlohmann::json& data) {
|
|||||||
|
|
||||||
std::lock_guard _lapi(this->daemon->cpApiMutex);
|
std::lock_guard _lapi(this->daemon->cpApiMutex);
|
||||||
this->daemon->cp.setDmaDebug("begin_save_config", "");
|
this->daemon->cp.setDmaDebug("begin_save_config", "");
|
||||||
rxtx.storeMainSettings(this->daemon->cp);
|
rxtx.storeDpdiSettings(this->daemon->cp);
|
||||||
this->daemon->cp.setDmaDebug("save_config", "");
|
this->daemon->cp.setDmaDebug("save_config", "");
|
||||||
rxtx.updateCallback(this->daemon->cp);
|
rxtx.updateCallback(this->daemon->cp);
|
||||||
{
|
{
|
||||||
@@ -186,7 +186,7 @@ std::string api_driver::ApiDriver::getOtaFileLocation() const {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MODEM_IS_SCPC
|
#ifdef MODEM_IS_SCPC
|
||||||
std::string api_driver::ApiDriver::getLoggingStatisticsSettings() {
|
nlohmann::json api_driver::ApiDriver::getLoggingStatisticsSettings() {
|
||||||
return this->daemon->statsLogs.getSettings();
|
return this->daemon->statsLogs.getSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -78,7 +78,7 @@ namespace api_driver {
|
|||||||
void executeInApi(const std::function<void(proxy::CpProxy&)> &callback);
|
void executeInApi(const std::function<void(proxy::CpProxy&)> &callback);
|
||||||
|
|
||||||
#ifdef API_OBJECT_DEBUG_METRICS_ENABLE
|
#ifdef API_OBJECT_DEBUG_METRICS_ENABLE
|
||||||
std::string getLoggingStatisticsSettings();
|
nlohmann::json getLoggingStatisticsSettings();
|
||||||
void setLoggingStatisticsSettings(const nlohmann::json& data);
|
void setLoggingStatisticsSettings(const nlohmann::json& data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -160,7 +160,7 @@
|
|||||||
<h3>Параметры передачи</h3>
|
<h3>Параметры передачи</h3>
|
||||||
<label>
|
<label>
|
||||||
<span>Центральная частота, КГц</span>
|
<span>Центральная частота, КГц</span>
|
||||||
<input type="text" v-model.lazy="paramRxtx.txCentralFreq" @change="e => paramRxtx.txCentralFreq = inputFormatNumber(inputFormatNumber(e.target.value, {min:950000,max:6000000,step:0.01}), {min:950000,max:6000000,step:0.01})"/>
|
<input type="text" v-model.lazy="paramRxtx.txCentralFreq" @change="e => paramRxtx.txCentralFreq = inputFormatNumber(inputFormatNumber(e.target.value, {min:100000,max:6000000,step:0.01}), {min:100000,max:6000000,step:0.01})"/>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Символьная скорость, Бод</span>
|
<span>Символьная скорость, Бод</span>
|
||||||
@@ -169,12 +169,12 @@
|
|||||||
<label>
|
<label>
|
||||||
<span>Roll-off</span>
|
<span>Roll-off</span>
|
||||||
<select v-model="paramRxtx.txRolloff">
|
<select v-model="paramRxtx.txRolloff">
|
||||||
<option :value="2">0.02</option>
|
<option :value="20">0.02</option>
|
||||||
<option :value="5">0.05</option>
|
<option :value="50">0.05</option>
|
||||||
<option :value="10">0.10</option>
|
<option :value="100">0.10</option>
|
||||||
<option :value="15">0.15</option>
|
<option :value="150">0.15</option>
|
||||||
<option :value="20">0.20</option>
|
<option :value="200">0.20</option>
|
||||||
<option :value="25">0.25</option>
|
<option :value="250">0.25</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
@@ -274,7 +274,7 @@
|
|||||||
</label>
|
</label>
|
||||||
<label><span>Минимальное ослабление, дБ</span><input type="number" v-model="paramRxtx.aupcMinAttenuation" max="10" step="0.1"/></label>
|
<label><span>Минимальное ослабление, дБ</span><input type="number" v-model="paramRxtx.aupcMinAttenuation" max="10" step="0.1"/></label>
|
||||||
<label><span>Максимальное ослабление, дБ</span><input type="number" v-model="paramRxtx.aupcMaxAttenuation" max="10" step="0.1"/></label>
|
<label><span>Максимальное ослабление, дБ</span><input type="number" v-model="paramRxtx.aupcMaxAttenuation" max="10" step="0.1"/></label>
|
||||||
<label><span>Требуемое ОСШ</span><input type="number" v-model="paramRxtx.aupcRequiredSnr" max="10" step="0.01"/></label>
|
<label><span>Требуемое ОСШ</span><input type="number" v-model="paramRxtx.aupcRequiredSnr" max="30" step="0.01"/></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<h3>Настройки приемника</h3>
|
<h3>Настройки приемника</h3>
|
||||||
@@ -295,7 +295,7 @@
|
|||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Центральная частота, КГц</span>
|
<span>Центральная частота, КГц</span>
|
||||||
<input type="text" v-model.lazy="paramRxtx.rxCentralFreq" @change="e => paramRxtx.rxCentralFreq = inputFormatNumber(inputFormatNumber(e.target.value, {min:950000,max:6000000,step:0.01}), {min:950000,max:6000000,step:0.01})"/>
|
<input type="text" v-model.lazy="paramRxtx.rxCentralFreq" @change="e => paramRxtx.rxCentralFreq = inputFormatNumber(inputFormatNumber(e.target.value, {min:100000,max:6000000,step:0.01}), {min:100000,max:6000000,step:0.01})"/>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Символьная скорость, Бод</span>
|
<span>Символьная скорость, Бод</span>
|
||||||
@@ -304,12 +304,12 @@
|
|||||||
<label>
|
<label>
|
||||||
<span>Roll-off</span>
|
<span>Roll-off</span>
|
||||||
<select v-model="paramRxtx.rxRolloff">
|
<select v-model="paramRxtx.rxRolloff">
|
||||||
<option :value="2">0.02</option>
|
<option :value="20">0.02</option>
|
||||||
<option :value="5">0.05</option>
|
<option :value="50">0.05</option>
|
||||||
<option :value="10">0.10</option>
|
<option :value="100">0.10</option>
|
||||||
<option :value="15">0.15</option>
|
<option :value="150">0.15</option>
|
||||||
<option :value="20">0.20</option>
|
<option :value="200">0.20</option>
|
||||||
<option :value="25">0.25</option>
|
<option :value="250">0.25</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
@@ -326,19 +326,19 @@
|
|||||||
<div class="settings-set-container" v-show="paramRxtx.isCinC">
|
<div class="settings-set-container" v-show="paramRxtx.isCinC">
|
||||||
<label>
|
<label>
|
||||||
<span>Метод расчета задержки</span>
|
<span>Метод расчета задержки</span>
|
||||||
<select v-model="paramDpdi.dpdiIsPositional">
|
<select v-model="paramDpdi.isPositional">
|
||||||
<option :value="true">Позиционированием</option>
|
<option :value="true">Позиционированием</option>
|
||||||
<option :value="false">Окном задержки</option>
|
<option :value="false">Окном задержки</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label><span>Полоса поиска, КГц ±</span><input type="number" v-model="paramDpdi.dpdiSearchBandwidth" max="100" step="1"/></label>
|
<label><span>Полоса поиска, КГц ±</span><input type="number" v-model="paramDpdi.searchBandwidth" max="100" step="1"/></label>
|
||||||
<h2 v-show="paramDpdi.dpdiIsPositional === true">Настройки позиционирования</h2>
|
<h2 v-show="paramDpdi.isPositional === true">Настройки позиционирования</h2>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Широта станции</span><input type="number" v-model="paramDpdi.dpdiPositionStationLatitude" min="-180" max="180" step="1e-06"/></label>
|
<label v-show="paramDpdi.isPositional === true"><span>Широта станции</span><input type="number" v-model="paramDpdi.positionStationLatitude" min="-180" max="180" step="1e-06"/></label>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Долгота станции</span><input type="number" v-model="paramDpdi.dpdiPositionStationLongitude" min="-180" max="180" step="1e-06"/></label>
|
<label v-show="paramDpdi.isPositional === true"><span>Долгота станции</span><input type="number" v-model="paramDpdi.positionStationLongitude" min="-180" max="180" step="1e-06"/></label>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Подспутниковая точка</span><input type="number" v-model="paramDpdi.dpdiPositionSatelliteLongitude" min="-180" max="180" step="1e-06"/></label>
|
<label v-show="paramDpdi.isPositional === true"><span>Подспутниковая точка</span><input type="number" v-model="paramDpdi.positionSatelliteLongitude" min="-180" max="180" step="1e-06"/></label>
|
||||||
<h2 v-show="paramDpdi.dpdiIsPositional === false">Задержка до спутника</h2>
|
<h2 v-show="paramDpdi.isPositional === false">Задержка до спутника</h2>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === false"><span>от, мс</span><input type="number" v-model="paramDpdi.dpdiDelayMin" max="400" step="0.1"/></label>
|
<label v-show="paramDpdi.isPositional === false"><span>от, мс</span><input type="number" v-model="paramDpdi.delayMin" max="400" step="0.1"/></label>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === false"><span>до, мс</span><input type="number" v-model="paramDpdi.dpdiDelayMax" max="400" step="0.1"/></label>
|
<label v-show="paramDpdi.isPositional === false"><span>до, мс</span><input type="number" v-model="paramDpdi.delayMax" max="400" step="0.1"/></label>
|
||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitDpdi()" v-show="paramRxtx.isCinC">Сохранить <span class="submit-spinner" v-show="submitStatus.dpdi"></span></button>
|
<button class="action-button" @click="settingsSubmitDpdi()" v-show="paramRxtx.isCinC">Сохранить <span class="submit-spinner" v-show="submitStatus.dpdi"></span></button>
|
||||||
<h2>Настройки питания и опорного генератора</h2>
|
<h2>Настройки питания и опорного генератора</h2>
|
||||||
@@ -494,24 +494,24 @@
|
|||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<h3>Настройки интерфейса управления</h3>
|
<h3>Настройки интерфейса управления</h3>
|
||||||
<label>
|
<label>
|
||||||
<span>Интерфейс управления (/24)</span>
|
<span>Интерфейс управления (a.d.d.r/mask)</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="paramNetwork.managementIp" 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]?)\/([0-9]|[1-2][0-9]|3[0-2])$">
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Режим сети</span>
|
<span>Режим сети</span>
|
||||||
<select v-model="paramNetwork.netIsL2">
|
<select v-model="paramNetwork.isL2">
|
||||||
<option :value="false">Маршрутизатор</option>
|
<option :value="false">Маршрутизатор</option>
|
||||||
<option :value="true">Коммутатор</option>
|
<option :value="true">Коммутатор</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label v-show="paramNetwork.netIsL2 === false">
|
<label v-show="paramNetwork.isL2 === false">
|
||||||
<span>Интерфейс данных (/24)</span>
|
<span>Интерфейс данных (/24)</span>
|
||||||
<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]?)$">
|
<input v-model="paramNetwork.dataIp" 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>
|
</label>
|
||||||
<label><span>MTU интерфейса данных</span><input type="number" v-model="paramNetwork.netDataMtu" min="1500" max="2000" step="1"/></label>
|
<label><span>MTU интерфейса данных</span><input type="number" v-model="paramNetwork.dataMtu" min="1500" max="2000" step="1"/></label>
|
||||||
<label>
|
<label>
|
||||||
<span>Имя веб-сервера</span>
|
<span>Имя веб-сервера</span>
|
||||||
<input v-model="paramNetwork.netServerName" type="text">
|
<input v-model="paramNetwork.serverName" type="text">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitNetwork()">Сохранить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
<button class="action-button" @click="settingsSubmitNetwork()">Сохранить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
@@ -533,6 +533,8 @@
|
|||||||
<div>
|
<div>
|
||||||
<button class="dangerous-button" onclick="fetch('/api/resetSettings', { method: 'POST' }).then((r) => { window.location.reload(); })">Сбросить модем до заводских настроек</button>
|
<button class="dangerous-button" onclick="fetch('/api/resetSettings', { method: 'POST' }).then((r) => { window.location.reload(); })">Сбросить модем до заводских настроек</button>
|
||||||
</div>
|
</div>
|
||||||
|
<button class="action-button" @click="dumpAllSettings()">Сохранить бекап конфигурации</button>
|
||||||
|
<button class="dangerous-button" @click="restoreAllSettings()">Восстановить бекап конфигурации</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>Обновление ПО</h2>
|
<h2>Обновление ПО</h2>
|
||||||
@@ -602,7 +604,7 @@
|
|||||||
txIsTestInput: false,
|
txIsTestInput: false,
|
||||||
txCentralFreq: 0,
|
txCentralFreq: 0,
|
||||||
txBaudrate: 0,
|
txBaudrate: 0,
|
||||||
txRolloff: 2,
|
txRolloff: 20,
|
||||||
txGoldan: 0,
|
txGoldan: 0,
|
||||||
txAttenuation: -40,
|
txAttenuation: -40,
|
||||||
dvbServicePacketPeriod: 0,
|
dvbServicePacketPeriod: 0,
|
||||||
@@ -625,17 +627,17 @@
|
|||||||
rxSpectrumInversion: false,
|
rxSpectrumInversion: false,
|
||||||
rxCentralFreq: 0,
|
rxCentralFreq: 0,
|
||||||
rxBaudrate: 0,
|
rxBaudrate: 0,
|
||||||
rxRolloff: 2,
|
rxRolloff: 20,
|
||||||
rxGoldan: 0,
|
rxGoldan: 0,
|
||||||
},
|
},
|
||||||
paramDpdi: {
|
paramDpdi: {
|
||||||
dpdiIsPositional: true,
|
isPositional: true,
|
||||||
dpdiSearchBandwidth: 0,
|
searchBandwidth: 0,
|
||||||
dpdiPositionStationLatitude: -180,
|
positionStationLatitude: -180,
|
||||||
dpdiPositionStationLongitude: -180,
|
positionStationLongitude: -180,
|
||||||
dpdiPositionSatelliteLongitude: -180,
|
positionSatelliteLongitude: -180,
|
||||||
dpdiDelayMin: 0,
|
delayMin: 0,
|
||||||
dpdiDelayMax: 0,
|
delayMax: 0,
|
||||||
},
|
},
|
||||||
paramBuclnb: {
|
paramBuclnb: {
|
||||||
bucRefClk10M: false,
|
bucRefClk10M: false,
|
||||||
@@ -646,11 +648,11 @@
|
|||||||
bucLnbAutoStart: false,
|
bucLnbAutoStart: false,
|
||||||
},
|
},
|
||||||
paramNetwork: {
|
paramNetwork: {
|
||||||
netManagementIp: null,
|
managementIp: null,
|
||||||
netIsL2: false,
|
isL2: false,
|
||||||
netDataIp: null,
|
dataIp: null,
|
||||||
netDataMtu: 1500,
|
dataMtu: 1500,
|
||||||
netServerName: null,
|
serverName: null,
|
||||||
},
|
},
|
||||||
// ========== include end from 'common/all-params-data.js.j2'
|
// ========== include end from 'common/all-params-data.js.j2'
|
||||||
|
|
||||||
@@ -827,13 +829,13 @@
|
|||||||
if (this.submitStatus.dpdi) { return }
|
if (this.submitStatus.dpdi) { return }
|
||||||
|
|
||||||
let query = {
|
let query = {
|
||||||
"dpdiIsPositional": this.paramDpdi.dpdiIsPositional,
|
"isPositional": this.paramDpdi.isPositional,
|
||||||
"dpdiSearchBandwidth": this.paramDpdi.dpdiSearchBandwidth,
|
"searchBandwidth": this.paramDpdi.searchBandwidth,
|
||||||
"dpdiPositionStationLatitude": this.paramDpdi.dpdiPositionStationLatitude,
|
"positionStationLatitude": this.paramDpdi.positionStationLatitude,
|
||||||
"dpdiPositionStationLongitude": this.paramDpdi.dpdiPositionStationLongitude,
|
"positionStationLongitude": this.paramDpdi.positionStationLongitude,
|
||||||
"dpdiPositionSatelliteLongitude": this.paramDpdi.dpdiPositionSatelliteLongitude,
|
"positionSatelliteLongitude": this.paramDpdi.positionSatelliteLongitude,
|
||||||
"dpdiDelayMin": this.paramDpdi.dpdiDelayMin,
|
"delayMin": this.paramDpdi.delayMin,
|
||||||
"dpdiDelayMax": this.paramDpdi.dpdiDelayMax,
|
"delayMax": this.paramDpdi.delayMax,
|
||||||
}
|
}
|
||||||
|
|
||||||
this.submitStatus.dpdi = true
|
this.submitStatus.dpdi = true
|
||||||
@@ -866,11 +868,11 @@
|
|||||||
{ if (!confirm("Применение этих настроек может сделать модем недоступным! Продолжить?")) return }
|
{ if (!confirm("Применение этих настроек может сделать модем недоступным! Продолжить?")) return }
|
||||||
|
|
||||||
let query = {
|
let query = {
|
||||||
"netManagementIp": this.paramNetwork.netManagementIp,
|
"managementIp": this.paramNetwork.managementIp,
|
||||||
"netIsL2": this.paramNetwork.netIsL2,
|
"isL2": this.paramNetwork.isL2,
|
||||||
"netDataIp": this.paramNetwork.netDataIp,
|
"dataIp": this.paramNetwork.dataIp,
|
||||||
"netDataMtu": this.paramNetwork.netDataMtu,
|
"dataMtu": this.paramNetwork.dataMtu,
|
||||||
"netServerName": this.paramNetwork.netServerName,
|
"serverName": this.paramNetwork.serverName,
|
||||||
}
|
}
|
||||||
|
|
||||||
this.submitStatus.network = true
|
this.submitStatus.network = true
|
||||||
@@ -887,7 +889,7 @@
|
|||||||
this.paramRxtx.txAutoStart = vals["settings"]["rxtx"]["txAutoStart"]
|
this.paramRxtx.txAutoStart = vals["settings"]["rxtx"]["txAutoStart"]
|
||||||
this.paramRxtx.txModulatorIsTest = vals["settings"]["rxtx"]["txModulatorIsTest"]
|
this.paramRxtx.txModulatorIsTest = vals["settings"]["rxtx"]["txModulatorIsTest"]
|
||||||
this.paramRxtx.txIsTestInput = vals["settings"]["rxtx"]["txIsTestInput"]
|
this.paramRxtx.txIsTestInput = vals["settings"]["rxtx"]["txIsTestInput"]
|
||||||
this.paramRxtx.txCentralFreq = this.inputFormatNumber(vals["settings"]["rxtx"]["txCentralFreq"], {min:950000,max:6000000,step:0.01})
|
this.paramRxtx.txCentralFreq = this.inputFormatNumber(vals["settings"]["rxtx"]["txCentralFreq"], {min:100000,max:6000000,step:0.01})
|
||||||
this.paramRxtx.txBaudrate = this.inputFormatNumber(vals["settings"]["rxtx"]["txBaudrate"], {min:200000,max:54000000,})
|
this.paramRxtx.txBaudrate = this.inputFormatNumber(vals["settings"]["rxtx"]["txBaudrate"], {min:200000,max:54000000,})
|
||||||
this.paramRxtx.txRolloff = vals["settings"]["rxtx"]["txRolloff"]
|
this.paramRxtx.txRolloff = vals["settings"]["rxtx"]["txRolloff"]
|
||||||
this.paramRxtx.txGoldan = vals["settings"]["rxtx"]["txGoldan"]
|
this.paramRxtx.txGoldan = vals["settings"]["rxtx"]["txGoldan"]
|
||||||
@@ -910,20 +912,20 @@
|
|||||||
this.paramRxtx.rxAgcEn = vals["settings"]["rxtx"]["rxAgcEn"]
|
this.paramRxtx.rxAgcEn = vals["settings"]["rxtx"]["rxAgcEn"]
|
||||||
this.paramRxtx.rxManualGain = vals["settings"]["rxtx"]["rxManualGain"]
|
this.paramRxtx.rxManualGain = vals["settings"]["rxtx"]["rxManualGain"]
|
||||||
this.paramRxtx.rxSpectrumInversion = vals["settings"]["rxtx"]["rxSpectrumInversion"]
|
this.paramRxtx.rxSpectrumInversion = vals["settings"]["rxtx"]["rxSpectrumInversion"]
|
||||||
this.paramRxtx.rxCentralFreq = this.inputFormatNumber(vals["settings"]["rxtx"]["rxCentralFreq"], {min:950000,max:6000000,step:0.01})
|
this.paramRxtx.rxCentralFreq = this.inputFormatNumber(vals["settings"]["rxtx"]["rxCentralFreq"], {min:100000,max:6000000,step:0.01})
|
||||||
this.paramRxtx.rxBaudrate = this.inputFormatNumber(vals["settings"]["rxtx"]["rxBaudrate"], {min:200000,max:54000000,})
|
this.paramRxtx.rxBaudrate = this.inputFormatNumber(vals["settings"]["rxtx"]["rxBaudrate"], {min:200000,max:54000000,})
|
||||||
this.paramRxtx.rxRolloff = vals["settings"]["rxtx"]["rxRolloff"]
|
this.paramRxtx.rxRolloff = vals["settings"]["rxtx"]["rxRolloff"]
|
||||||
this.paramRxtx.rxGoldan = vals["settings"]["rxtx"]["rxGoldan"]
|
this.paramRxtx.rxGoldan = vals["settings"]["rxtx"]["rxGoldan"]
|
||||||
},
|
},
|
||||||
updateDpdiSettings(vals) {
|
updateDpdiSettings(vals) {
|
||||||
this.submitStatus.dpdi = false
|
this.submitStatus.dpdi = false
|
||||||
this.paramDpdi.dpdiIsPositional = vals["settings"]["dpdi"]["dpdiIsPositional"]
|
this.paramDpdi.isPositional = vals["settings"]["dpdi"]["isPositional"]
|
||||||
this.paramDpdi.dpdiSearchBandwidth = vals["settings"]["dpdi"]["dpdiSearchBandwidth"]
|
this.paramDpdi.searchBandwidth = vals["settings"]["dpdi"]["searchBandwidth"]
|
||||||
this.paramDpdi.dpdiPositionStationLatitude = vals["settings"]["dpdi"]["dpdiPositionStationLatitude"]
|
this.paramDpdi.positionStationLatitude = vals["settings"]["dpdi"]["positionStationLatitude"]
|
||||||
this.paramDpdi.dpdiPositionStationLongitude = vals["settings"]["dpdi"]["dpdiPositionStationLongitude"]
|
this.paramDpdi.positionStationLongitude = vals["settings"]["dpdi"]["positionStationLongitude"]
|
||||||
this.paramDpdi.dpdiPositionSatelliteLongitude = vals["settings"]["dpdi"]["dpdiPositionSatelliteLongitude"]
|
this.paramDpdi.positionSatelliteLongitude = vals["settings"]["dpdi"]["positionSatelliteLongitude"]
|
||||||
this.paramDpdi.dpdiDelayMin = vals["settings"]["dpdi"]["dpdiDelayMin"]
|
this.paramDpdi.delayMin = vals["settings"]["dpdi"]["delayMin"]
|
||||||
this.paramDpdi.dpdiDelayMax = vals["settings"]["dpdi"]["dpdiDelayMax"]
|
this.paramDpdi.delayMax = vals["settings"]["dpdi"]["delayMax"]
|
||||||
},
|
},
|
||||||
updateBuclnbSettings(vals) {
|
updateBuclnbSettings(vals) {
|
||||||
this.submitStatus.buclnb = false
|
this.submitStatus.buclnb = false
|
||||||
@@ -936,11 +938,11 @@
|
|||||||
},
|
},
|
||||||
updateNetworkSettings(vals) {
|
updateNetworkSettings(vals) {
|
||||||
this.submitStatus.network = false
|
this.submitStatus.network = false
|
||||||
this.paramNetwork.netManagementIp = vals["settings"]["network"]["netManagementIp"]
|
this.paramNetwork.managementIp = vals["settings"]["network"]["managementIp"]
|
||||||
this.paramNetwork.netIsL2 = vals["settings"]["network"]["netIsL2"]
|
this.paramNetwork.isL2 = vals["settings"]["network"]["isL2"]
|
||||||
this.paramNetwork.netDataIp = vals["settings"]["network"]["netDataIp"]
|
this.paramNetwork.dataIp = vals["settings"]["network"]["dataIp"]
|
||||||
this.paramNetwork.netDataMtu = vals["settings"]["network"]["netDataMtu"]
|
this.paramNetwork.dataMtu = vals["settings"]["network"]["dataMtu"]
|
||||||
this.paramNetwork.netServerName = vals["settings"]["network"]["netServerName"]
|
this.paramNetwork.serverName = vals["settings"]["network"]["serverName"]
|
||||||
},
|
},
|
||||||
// ========== include end from 'common/all-params-methods.js.j2'
|
// ========== include end from 'common/all-params-methods.js.j2'
|
||||||
|
|
||||||
@@ -974,35 +976,35 @@
|
|||||||
this.statRx.freq_search_lock = vals["state"]["rx"]["freq_search_lock"]
|
this.statRx.freq_search_lock = vals["state"]["rx"]["freq_search_lock"]
|
||||||
this.statRx.afc_lock = vals["state"]["rx"]["afc_lock"]
|
this.statRx.afc_lock = vals["state"]["rx"]["afc_lock"]
|
||||||
this.statRx.pkt_sync = vals["state"]["rx"]["pkt_sync"]
|
this.statRx.pkt_sync = vals["state"]["rx"]["pkt_sync"]
|
||||||
this.statRx.snr = vals["state"]["rx"]["snr"]
|
this.statRx.snr = Math.round(vals["state"]["rx"]["snr"] * 10) / 10
|
||||||
this.statRx.rssi = vals["state"]["rx"]["rssi"]
|
this.statRx.rssi = Math.round(vals["state"]["rx"]["rssi"] * 10) / 10
|
||||||
this.statRx.modcod = modcodToStr(vals["state"]["rx"]["modcod"])
|
this.statRx.modcod = modcodToStr(vals["state"]["rx"]["modcod"])
|
||||||
this.statRx.frameSizeNormal = vals["state"]["rx"]["frameSizeNormal"]
|
this.statRx.frameSizeNormal = vals["state"]["rx"]["frameSizeNormal"]
|
||||||
this.statRx.isPilots = vals["state"]["rx"]["isPilots"]
|
this.statRx.isPilots = vals["state"]["rx"]["isPilots"]
|
||||||
this.statRx.symError = vals["state"]["rx"]["symError"]
|
this.statRx.symError = vals["state"]["rx"]["symError"]
|
||||||
this.statRx.freqErr = vals["state"]["rx"]["freqErr"]
|
this.statRx.freqErr = Math.round(vals["state"]["rx"]["freqErr"] * 100) / 100
|
||||||
this.statRx.freqErrAcc = vals["state"]["rx"]["freqErrAcc"]
|
this.statRx.freqErrAcc = Math.round(vals["state"]["rx"]["freqErrAcc"] * 100) / 100
|
||||||
this.statRx.inputSignalLevel = vals["state"]["rx"]["inputSignalLevel"]
|
this.statRx.inputSignalLevel = vals["state"]["rx"]["inputSignalLevel"]
|
||||||
this.statRx.pllError = vals["state"]["rx"]["pllError"]
|
this.statRx.pllError = Math.round(vals["state"]["rx"]["pllError"] * 100) / 100
|
||||||
this.statRx.speedOnRxKbit = vals["state"]["rx"]["speedOnRxKbit"]
|
this.statRx.speedOnRxKbit = Math.round(vals["state"]["rx"]["speedOnRxKbit"] * 100) / 100
|
||||||
this.statRx.speedOnIifKbit = vals["state"]["rx"]["speedOnIifKbit"]
|
this.statRx.speedOnIifKbit = Math.round(vals["state"]["rx"]["speedOnIifKbit"] * 100) / 100
|
||||||
this.statRx.packetsOk = vals["state"]["rx"]["packetsOk"]
|
this.statRx.packetsOk = vals["state"]["rx"]["packetsOk"]
|
||||||
this.statRx.packetsBad = vals["state"]["rx"]["packetsBad"]
|
this.statRx.packetsBad = vals["state"]["rx"]["packetsBad"]
|
||||||
this.statRx.packetsDummy = vals["state"]["rx"]["packetsDummy"]
|
this.statRx.packetsDummy = vals["state"]["rx"]["packetsDummy"]
|
||||||
|
|
||||||
this.statTx.state = vals["state"]["tx"]["state"]
|
this.statTx.state = vals["state"]["tx"]["state"]
|
||||||
this.statTx.snr = vals["state"]["tx"]["snr"]
|
this.statTx.snr = Math.round(vals["state"]["tx"]["snr"] * 100) / 100
|
||||||
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
||||||
this.statTx.frameSizeNormal = vals["state"]["tx"]["frameSizeNormal"]
|
this.statTx.frameSizeNormal = vals["state"]["tx"]["frameSizeNormal"]
|
||||||
this.statTx.isPilots = vals["state"]["tx"]["isPilots"]
|
this.statTx.isPilots = vals["state"]["tx"]["isPilots"]
|
||||||
this.statTx.speedOnTxKbit = vals["state"]["tx"]["speedOnTxKbit"]
|
this.statTx.speedOnTxKbit = Math.round(vals["state"]["tx"]["speedOnTxKbit"] * 100) / 100
|
||||||
this.statTx.speedOnIifKbit = vals["state"]["tx"]["speedOnIifKbit"]
|
this.statTx.speedOnIifKbit = Math.round(vals["state"]["tx"]["speedOnIifKbit"] * 100) / 100
|
||||||
|
|
||||||
this.statCinc.occ = vals["state"]["cinc"]["occ"]
|
this.statCinc.occ = vals["state"]["cinc"]["occ"]
|
||||||
this.statCinc.correlator = vals["state"]["cinc"]["correlator"]
|
this.statCinc.correlator = vals["state"]["cinc"]["correlator"]
|
||||||
this.statCinc.correlatorFails = vals["state"]["cinc"]["correlatorFails"]
|
this.statCinc.correlatorFails = vals["state"]["cinc"]["correlatorFails"]
|
||||||
this.statCinc.freqErr = vals["state"]["cinc"]["freqErr"]
|
this.statCinc.freqErr = Math.round(vals["state"]["cinc"]["freqErr"] * 100) / 100
|
||||||
this.statCinc.freqErrAcc = vals["state"]["cinc"]["freqErrAcc"]
|
this.statCinc.freqErrAcc = Math.round(vals["state"]["cinc"]["freqErrAcc"] * 100) / 100
|
||||||
this.statCinc.channelDelay = vals["state"]["cinc"]["channelDelay"]
|
this.statCinc.channelDelay = vals["state"]["cinc"]["channelDelay"]
|
||||||
|
|
||||||
this.statDevice.adrv = vals["state"]["device"]["adrv"]
|
this.statDevice.adrv = vals["state"]["device"]["adrv"]
|
||||||
@@ -1022,9 +1024,9 @@
|
|||||||
} else {
|
} else {
|
||||||
this.statOs.uptime = '?'
|
this.statOs.uptime = '?'
|
||||||
}
|
}
|
||||||
this.statOs.load1 = vals["state"]["device"]["load1min"]
|
this.statOs.load1 = Math.round(vals["state"]["device"]["load1min"] * 100) / 100
|
||||||
this.statOs.load5 = vals["state"]["device"]["load5min"]
|
this.statOs.load5 = Math.round(vals["state"]["device"]["load5min"] * 100) / 100
|
||||||
this.statOs.load15 = vals["state"]["device"]["load15min"]
|
this.statOs.load15 = Math.round(vals["state"]["device"]["load15min"] * 100) / 100
|
||||||
this.statOs.totalram = vals["state"]["device"]["totalram"]
|
this.statOs.totalram = vals["state"]["device"]["totalram"]
|
||||||
this.statOs.freeram = vals["state"]["device"]["freeram"]
|
this.statOs.freeram = vals["state"]["device"]["freeram"]
|
||||||
},
|
},
|
||||||
@@ -1363,6 +1365,133 @@
|
|||||||
}
|
}
|
||||||
this.submitStatus.modemReboot = 30
|
this.submitStatus.modemReboot = 30
|
||||||
fetch('/api/reboot', { method: 'POST' }).then((r) => {})
|
fetch('/api/reboot', { method: 'POST' }).then((r) => {})
|
||||||
|
},
|
||||||
|
async restoreAllSettings() {
|
||||||
|
// Порядок применения настроек
|
||||||
|
const settingsApplyOrder = ['qos', 'tcpaccel', 'dpdi', 'rxtx', 'buclnb', 'network'];
|
||||||
|
|
||||||
|
// 1. Чтение JSON-файла, выбранного пользователем
|
||||||
|
const fileInput = document.createElement('input');
|
||||||
|
fileInput.type = 'file';
|
||||||
|
fileInput.accept = '.json';
|
||||||
|
|
||||||
|
const filePromise = new Promise((resolve, reject) => {
|
||||||
|
fileInput.onchange = e => {
|
||||||
|
const file = e.target.files[0];
|
||||||
|
if (!file) {
|
||||||
|
reject(new Error('Файл не выбран'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = event => {
|
||||||
|
try {
|
||||||
|
const jsonData = JSON.parse(event.target.result);
|
||||||
|
resolve(jsonData);
|
||||||
|
} catch (error) {
|
||||||
|
reject(new Error('Ошибка парсинга JSON'));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
reader.onerror = () => reject(new Error('Ошибка чтения файла'));
|
||||||
|
reader.readAsText(file);
|
||||||
|
};
|
||||||
|
fileInput.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const settingsToApply = await filePromise;
|
||||||
|
const errors = [];
|
||||||
|
|
||||||
|
// 2. Перебор групп параметров в заданном порядке
|
||||||
|
for (const groupName of settingsApplyOrder) {
|
||||||
|
if (!settingsToApply.hasOwnProperty(groupName)) {
|
||||||
|
continue; // Пропускаем группы, которых нет в файле
|
||||||
|
}
|
||||||
|
|
||||||
|
const groupSettings = settingsToApply[groupName];
|
||||||
|
if (typeof groupSettings !== 'object' || groupSettings === null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 2.1. POST-запрос для применения группы параметров
|
||||||
|
const postResponse = await fetch(`/api/set/${groupName}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(groupSettings)
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!postResponse.ok) {
|
||||||
|
throw new Error(`HTTP error ${postResponse.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const postResult = await postResponse.json();
|
||||||
|
if (postResult.status !== 'ok') {
|
||||||
|
throw new Error(`API error: ${postResult.message || 'unknown error'}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.2. Проверка примененных параметров
|
||||||
|
const getResponse = await fetch('/api/get/settings', { method: 'GET' });
|
||||||
|
if (!getResponse.ok) {
|
||||||
|
throw new Error(`HTTP error ${getResponse.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchSettingsResult = await getResponse.json();
|
||||||
|
if (fetchSettingsResult.status !== 'ok') {
|
||||||
|
throw new Error('Не удалось получить текущие настройки');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка соответствия параметров
|
||||||
|
const appliedGroup = fetchSettingsResult.settings[groupName] || {};
|
||||||
|
const failedSettings = [];
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(groupSettings)) {
|
||||||
|
if (appliedGroup[key] !== value) {
|
||||||
|
failedSettings.push(`${key} (ожидалось: ${value}, получено: ${appliedGroup[key]})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failedSettings.length > 0) {
|
||||||
|
throw new Error(`Не совпадают параметры: ${failedSettings.join(', ')}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (groupError) {
|
||||||
|
errors.push(`Группа ${groupName}: ${groupError.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Показ ошибок, если они есть
|
||||||
|
if (errors.length > 0) {
|
||||||
|
const errorMessage = errors.join('\n\n') +
|
||||||
|
'\n\nНекоторые настройки могли примениться некорректно.\nСтраница будет перезагружена.';
|
||||||
|
alert(errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
alert(`Ошибка при восстановлении настроек: ${error.message}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Перезагрузка страницы
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
async dumpAllSettings() {
|
||||||
|
function downloadAsFile(data, filename) {
|
||||||
|
let a = document.createElement("a");
|
||||||
|
let file = new Blob([data], {type: 'application/json'});
|
||||||
|
a.href = URL.createObjectURL(file);
|
||||||
|
a.download = filename;
|
||||||
|
a.click();
|
||||||
|
}
|
||||||
|
const response = await fetch('/api/get/settings', { method: 'GET' })
|
||||||
|
if (response.ok) {
|
||||||
|
const jres = await response.json()
|
||||||
|
if (jres["status"] === "ok") {
|
||||||
|
downloadAsFile(JSON.stringify(jres["settings"], null, 4), "backup-" + this.about.firmwareVersion + "-" + this.about.modemSn + ".json")
|
||||||
|
}
|
||||||
|
}
|
||||||
}, // ========== include end from 'common/admin-methods.js.j2'
|
}, // ========== include end from 'common/admin-methods.js.j2'
|
||||||
|
|
||||||
|
|
||||||
|
@@ -58,16 +58,8 @@
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th>Прием</th><td><span :class="{ indicator_bad: statRx.state === false, indicator_good: statRx.state === true, indicator: true }"></span></td></tr>
|
<tr><th>Прием</th><td><span :class="{ indicator_bad: statRx.state === false, indicator_good: statRx.state === true, indicator: true }"></span></td></tr>
|
||||||
<tr><th>Захват символьной</th><td><span :class="{ indicator_bad: statRx.sym_sync_lock === false, indicator_good: statRx.sym_sync_lock === true, indicator: true }"></span></td></tr>
|
|
||||||
<tr><th>Захват ФАПЧ</th><td><span :class="{ indicator_bad: statRx.afc_lock === false, indicator_good: statRx.afc_lock === true, indicator: true }"></span></td></tr>
|
|
||||||
<tr><th>Захват поиска по частоте</th><td><span :class="{ indicator_bad: statRx.freq_search_lock === false, indicator_good: statRx.freq_search_lock === true, indicator: true }"></span></td></tr>
|
|
||||||
<tr><th>Захват пакетной синхр.</th><td><span :class="{ indicator_bad: statRx.pkt_sync === false, indicator_good: statRx.pkt_sync === true, indicator: true }"></span></td></tr>
|
|
||||||
<tr><th>ОСШ/RSSI</th><td>{{ statRx.snr }} / {{ statRx.rssi }}</td></tr>
|
<tr><th>ОСШ/RSSI</th><td>{{ statRx.snr }} / {{ statRx.rssi }}</td></tr>
|
||||||
<tr><th>Modcod</th><td>{{ statRx.modcod }}</td></tr>
|
<tr><th>Частотная ошибка, Гц</th><td>{{ statRx.freqErrAcc }}</td></tr>
|
||||||
<tr><th>Размер кадра</th><td>{{ statRx.frameSizeNormal ? 'normal' : 'short' }}</td></tr>
|
|
||||||
<tr><th>Пилот-символы</th><td>{{ statRx.isPilots ? 'pilots' : 'no pilots' }}</td></tr>
|
|
||||||
<tr><th>Символьная ошибка</th><td>{{ statRx.symError }}</td></tr>
|
|
||||||
<tr><th>Грубая/точная част. ошибка, Гц</th><td>{{ statRx.freqErr }} / {{ statRx.freqErrAcc }}</td></tr>
|
|
||||||
<tr><th>Ур. входного сигнала</th><td>{{ statRx.inputSignalLevel }}</td></tr>
|
<tr><th>Ур. входного сигнала</th><td>{{ statRx.inputSignalLevel }}</td></tr>
|
||||||
<tr><th>Ошибка ФАПЧ</th><td>{{ statRx.pllError }}</td></tr>
|
<tr><th>Ошибка ФАПЧ</th><td>{{ statRx.pllError }}</td></tr>
|
||||||
<tr><th>Инф. скорость на приеме</th><td>{{ statRx.speedOnRxKbit }} кбит/с</td></tr>
|
<tr><th>Инф. скорость на приеме</th><td>{{ statRx.speedOnRxKbit }} кбит/с</td></tr>
|
||||||
@@ -75,7 +67,6 @@
|
|||||||
<tr><td colspan="2" style="padding-top: 1em; text-align: center">Статистика пакетов</td></tr>
|
<tr><td colspan="2" style="padding-top: 1em; text-align: center">Статистика пакетов</td></tr>
|
||||||
<tr><th>Качественных пакетов</th><td>{{ statRx.packetsOk }}</td></tr>
|
<tr><th>Качественных пакетов</th><td>{{ statRx.packetsOk }}</td></tr>
|
||||||
<tr><th>Поврежденных пакетов</th><td>{{ statRx.packetsBad }}</td></tr>
|
<tr><th>Поврежденных пакетов</th><td>{{ statRx.packetsBad }}</td></tr>
|
||||||
<tr><th>DUMMY</th><td>{{ statRx.packetsDummy }}</td></tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<button class="action-button" @click="resetPacketsStatistics()"> Сброс статистики </button>
|
<button class="action-button" @click="resetPacketsStatistics()"> Сброс статистики </button>
|
||||||
@@ -85,7 +76,6 @@
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th>Передача</th><td><span :class="{ indicator_bad: statTx.state === false, indicator_good: statTx.state === true, indicator: true }"></span></td></tr>
|
<tr><th>Передача</th><td><span :class="{ indicator_bad: statTx.state === false, indicator_good: statTx.state === true, indicator: true }"></span></td></tr>
|
||||||
<tr><th>Modcod</th><td>{{ statTx.modcod }}</td></tr>
|
|
||||||
<tr><th>Инф. скорость на передаче</th><td>{{ statTx.speedOnTxKbit }} кбит/с</td></tr>
|
<tr><th>Инф. скорость на передаче</th><td>{{ statTx.speedOnTxKbit }} кбит/с</td></tr>
|
||||||
<tr><th>Инф. скорость на интерфейсе</th><td>{{ statTx.speedOnIifKbit }} кбит/с</td></tr>
|
<tr><th>Инф. скорость на интерфейсе</th><td>{{ statTx.speedOnIifKbit }} кбит/с</td></tr>
|
||||||
<tr><th>Центральная частота</th><td>{{ statTx.centerFreq }} кГц</td></tr>
|
<tr><th>Центральная частота</th><td>{{ statTx.centerFreq }} кГц</td></tr>
|
||||||
@@ -127,6 +117,7 @@
|
|||||||
<option :value="true">Тест (CW)</option>
|
<option :value="true">Тест (CW)</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
<label><span>Ослабление, дБ</span><input type="number" v-model="paramRxtx.txAttenuation" min="-40" step="0.25"/></label>
|
||||||
<label>
|
<label>
|
||||||
<span>Входные данные</span>
|
<span>Входные данные</span>
|
||||||
<select v-model="paramRxtx.txIsTestInput">
|
<select v-model="paramRxtx.txIsTestInput">
|
||||||
@@ -135,28 +126,39 @@
|
|||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<h3>Параметры передачи</h3>
|
<h3>Параметры передачи</h3>
|
||||||
<label><span>Центральная частота, КГц</span><input type="number" v-model="paramRxtx.txCentralFreq" min="950000" max="6000000" step="0.01"/></label>
|
<label>
|
||||||
<label><span>Символьная скорость, Бод</span><input type="number" v-model="paramRxtx.txBaudrate" min="200000" max="54000000"/></label>
|
<span>Центральная частота, КГц</span>
|
||||||
|
<input type="text" v-model.lazy="paramRxtx.txCentralFreq" @change="e => paramRxtx.txCentralFreq = inputFormatNumber(inputFormatNumber(e.target.value, {min:70000,max:6000000,step:100}), {min:70000,max:6000000,step:100})"/>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Символьная скорость, Бод</span>
|
||||||
|
<input type="text" v-model.lazy="paramRxtx.txBaudrate" @change="e => paramRxtx.txBaudrate = inputFormatNumber(inputFormatNumber(e.target.value, {min:128000,max:30000000,}), {min:128000,max:30000000,})"/>
|
||||||
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Roll-off</span>
|
<span>Roll-off</span>
|
||||||
<select v-model="paramRxtx.txRolloff">
|
<select v-model="paramRxtx.txRolloff">
|
||||||
<option :value="2">0.02</option>
|
<option :value="20">0.02</option>
|
||||||
<option :value="5">0.05</option>
|
<option :value="50">0.05</option>
|
||||||
<option :value="10">0.10</option>
|
<option :value="100">0.10</option>
|
||||||
<option :value="15">0.15</option>
|
<option :value="150">0.15</option>
|
||||||
<option :value="20">0.20</option>
|
<option :value="200">0.20</option>
|
||||||
<option :value="25">0.25</option>
|
<option :value="250">0.25</option>
|
||||||
|
<option :value="300">0.30</option>
|
||||||
|
<option :value="350">0.35</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label><span>Коэф. расширения</span><input type="number" v-model="paramRxtx.txSpreadCoef" min="-1000" max="1000" step="0.01"/></label>
|
<label><span>Коэф. расширения</span><input type="number" v-model="paramRxtx.txSpreadCoef" min="8" max="1024" step="2"/></label>
|
||||||
|
<label><span>Кол-во пакетов на преамбулу</span><input type="number" v-model="paramRxtx.txFieldsDataPreamble" min="1" max="255" step="1"/></label>
|
||||||
|
</div>
|
||||||
|
<div class="settings-set-container">
|
||||||
|
<h3>Авто-регулировка мощности</h3>
|
||||||
<label>
|
<label>
|
||||||
<span>Номер последовательности Голда</span>
|
<span>Авто-регулировка мощности</span>
|
||||||
<select v-model="paramRxtx.txGoldan">
|
<span class="toggle-input"><input type="checkbox" v-model="paramRxtx.aupcEn" /><span class="slider"></span></span>
|
||||||
<option :value="0">0</option>
|
|
||||||
<option :value="1">1</option>
|
|
||||||
</select>
|
|
||||||
</label>
|
</label>
|
||||||
<label><span>Ослабление, дБ</span><input type="number" v-model="paramRxtx.txAttenuation" min="-40" step="0.25"/></label>
|
<label><span>Минимальное ослабление, дБ</span><input type="number" v-model="paramRxtx.aupcMinAttenuation" max="10" step="0.1"/></label>
|
||||||
|
<label><span>Максимальное ослабление, дБ</span><input type="number" v-model="paramRxtx.aupcMaxAttenuation" max="10" step="0.1"/></label>
|
||||||
|
<label><span>Требуемое ОСШ</span><input type="number" v-model="paramRxtx.aupcRequiredSnr" max="30" step="0.01"/></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<h3>Настройки приемника</h3>
|
<h3>Настройки приемника</h3>
|
||||||
@@ -175,27 +177,30 @@
|
|||||||
<span>Инверсия спектра</span>
|
<span>Инверсия спектра</span>
|
||||||
<span class="toggle-input"><input type="checkbox" v-model="paramRxtx.rxSpectrumInversion" /><span class="slider"></span></span>
|
<span class="toggle-input"><input type="checkbox" v-model="paramRxtx.rxSpectrumInversion" /><span class="slider"></span></span>
|
||||||
</label>
|
</label>
|
||||||
<label><span>Центральная частота, КГц</span><input type="number" v-model="paramRxtx.rxCentralFreq" min="950000" max="6000000" step="0.01"/></label>
|
<label>
|
||||||
<label><span>Символьная скорость, Бод</span><input type="number" v-model="paramRxtx.rxBaudrate" min="200000" max="54000000"/></label>
|
<span>Центральная частота, КГц</span>
|
||||||
|
<input type="text" v-model.lazy="paramRxtx.rxCentralFreq" @change="e => paramRxtx.rxCentralFreq = inputFormatNumber(inputFormatNumber(e.target.value, {min:70000,max:6000000,step:100}), {min:70000,max:6000000,step:100})"/>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Символьная скорость, Бод</span>
|
||||||
|
<input type="text" v-model.lazy="paramRxtx.rxBaudrate" @change="e => paramRxtx.rxBaudrate = inputFormatNumber(inputFormatNumber(e.target.value, {min:128000,max:30000000,}), {min:128000,max:30000000,})"/>
|
||||||
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Roll-off</span>
|
<span>Roll-off</span>
|
||||||
<select v-model="paramRxtx.rxRolloff">
|
<select v-model="paramRxtx.rxRolloff">
|
||||||
<option :value="2">0.02</option>
|
<option :value="20">0.02</option>
|
||||||
<option :value="5">0.05</option>
|
<option :value="50">0.05</option>
|
||||||
<option :value="10">0.10</option>
|
<option :value="100">0.10</option>
|
||||||
<option :value="15">0.15</option>
|
<option :value="150">0.15</option>
|
||||||
<option :value="20">0.20</option>
|
<option :value="200">0.20</option>
|
||||||
<option :value="25">0.25</option>
|
<option :value="250">0.25</option>
|
||||||
</select>
|
<option :value="300">0.30</option>
|
||||||
</label>
|
<option :value="350">0.35</option>
|
||||||
<label><span>Коэф. расширения</span><input type="number" v-model="paramRxtx.rxSpreadCoef" min="-1000" max="1000" step="0.01"/></label>
|
|
||||||
<label>
|
|
||||||
<span>Номер последовательности Голда</span>
|
|
||||||
<select v-model="paramRxtx.rxGoldan">
|
|
||||||
<option :value="0">0</option>
|
|
||||||
<option :value="1">1</option>
|
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
<label><span>Коэф. расширения</span><input type="number" v-model="paramRxtx.rxSpreadCoef" min="8" max="1024" step="2"/></label>
|
||||||
|
<label><span>Порог коррелятора</span><input type="number" v-model="paramRxtx.rxFftShift" min="256" max="4096" step="1"/></label>
|
||||||
|
<label><span>Кол-во пакетов на преамбулу</span><input type="number" v-model="paramRxtx.rxFieldsDataPreamble" min="1" max="255" step="1"/></label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitRxtx()">Сохранить <span class="submit-spinner" v-show="submitStatus.rxtx"></span></button>
|
<button class="action-button" @click="settingsSubmitRxtx()">Сохранить <span class="submit-spinner" v-show="submitStatus.rxtx"></span></button>
|
||||||
@@ -246,6 +251,31 @@
|
|||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitBuclnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.buclnb"></span></button>
|
<button class="action-button" @click="settingsSubmitBuclnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.buclnb"></span></button>
|
||||||
</div> <div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete">
|
</div> <div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete">
|
||||||
|
<h2>Настройки сети</h2>
|
||||||
|
<div class="settings-set-container">
|
||||||
|
<h3>Настройки интерфейса управления</h3>
|
||||||
|
<label>
|
||||||
|
<span>Интерфейс управления (a.d.d.r/mask)</span>
|
||||||
|
<input v-model="paramNetwork.managementIp" 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]?)\/([0-9]|[1-2][0-9]|3[0-2])$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Режим сети</span>
|
||||||
|
<select v-model="paramNetwork.isL2">
|
||||||
|
<option :value="false">Маршрутизатор</option>
|
||||||
|
<option :value="true">Коммутатор</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<label v-show="paramNetwork.isL2 === false">
|
||||||
|
<span>Интерфейс данных (/24)</span>
|
||||||
|
<input v-model="paramNetwork.dataIp" 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>
|
||||||
|
<label><span>MTU интерфейса данных</span><input type="number" v-model="paramNetwork.dataMtu" min="1500" max="2000" step="1"/></label>
|
||||||
|
<label>
|
||||||
|
<span>Имя веб-сервера</span>
|
||||||
|
<input v-model="paramNetwork.serverName" type="text">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<button class="action-button" @click="settingsSubmitNetwork()">Сохранить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
|
|
||||||
<h2>Система</h2>
|
<h2>Система</h2>
|
||||||
<div class="settings-set-container statistics-container">
|
<div class="settings-set-container statistics-container">
|
||||||
@@ -264,6 +294,8 @@
|
|||||||
<div>
|
<div>
|
||||||
<button class="dangerous-button" onclick="fetch('/api/resetSettings', { method: 'POST' }).then((r) => { window.location.reload(); })">Сбросить модем до заводских настроек</button>
|
<button class="dangerous-button" onclick="fetch('/api/resetSettings', { method: 'POST' }).then((r) => { window.location.reload(); })">Сбросить модем до заводских настроек</button>
|
||||||
</div>
|
</div>
|
||||||
|
<button class="action-button" @click="dumpAllSettings()">Сохранить бекап конфигурации</button>
|
||||||
|
<button class="dangerous-button" @click="restoreAllSettings()">Восстановить бекап конфигурации</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>Обновление ПО</h2>
|
<h2>Обновление ПО</h2>
|
||||||
@@ -316,6 +348,7 @@
|
|||||||
submitStatus: {
|
submitStatus: {
|
||||||
rxtx: false,
|
rxtx: false,
|
||||||
buclnb: false,
|
buclnb: false,
|
||||||
|
network: false,
|
||||||
firmwareUpload: false,
|
firmwareUpload: false,
|
||||||
firmwareUpgrade: false,
|
firmwareUpgrade: false,
|
||||||
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
|
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
|
||||||
@@ -327,21 +360,26 @@
|
|||||||
txEn: false,
|
txEn: false,
|
||||||
txAutoStart: false,
|
txAutoStart: false,
|
||||||
txModulatorIsTest: false,
|
txModulatorIsTest: false,
|
||||||
txIsTestInput: false,
|
|
||||||
txCentralFreq: 950000,
|
|
||||||
txBaudrate: 200000,
|
|
||||||
txRolloff: 2,
|
|
||||||
txSpreadCoef: -1000,
|
|
||||||
txGoldan: 0,
|
|
||||||
txAttenuation: -40,
|
txAttenuation: -40,
|
||||||
|
txIsTestInput: false,
|
||||||
|
txCentralFreq: 0,
|
||||||
|
txBaudrate: 0,
|
||||||
|
txRolloff: 20,
|
||||||
|
txSpreadCoef: 8,
|
||||||
|
txFieldsDataPreamble: 1,
|
||||||
|
aupcEn: false,
|
||||||
|
aupcMinAttenuation: 0,
|
||||||
|
aupcMaxAttenuation: 0,
|
||||||
|
aupcRequiredSnr: 0,
|
||||||
rxAgcEn: false,
|
rxAgcEn: false,
|
||||||
rxManualGain: -40,
|
rxManualGain: -40,
|
||||||
rxSpectrumInversion: false,
|
rxSpectrumInversion: false,
|
||||||
rxCentralFreq: 950000,
|
rxCentralFreq: 0,
|
||||||
rxBaudrate: 200000,
|
rxBaudrate: 0,
|
||||||
rxRolloff: 2,
|
rxRolloff: 20,
|
||||||
rxSpreadCoef: -1000,
|
rxSpreadCoef: 8,
|
||||||
rxGoldan: 0,
|
rxFftShift: 256,
|
||||||
|
rxFieldsDataPreamble: 1,
|
||||||
},
|
},
|
||||||
paramBuclnb: {
|
paramBuclnb: {
|
||||||
bucRefClk10M: false,
|
bucRefClk10M: false,
|
||||||
@@ -351,6 +389,13 @@
|
|||||||
srvRefClk10M: false,
|
srvRefClk10M: false,
|
||||||
bucLnbAutoStart: false,
|
bucLnbAutoStart: false,
|
||||||
},
|
},
|
||||||
|
paramNetwork: {
|
||||||
|
managementIp: null,
|
||||||
|
isL2: false,
|
||||||
|
dataIp: null,
|
||||||
|
dataMtu: 1500,
|
||||||
|
serverName: null,
|
||||||
|
},
|
||||||
// ========== include end from 'common/all-params-data.js.j2'
|
// ========== include end from 'common/all-params-data.js.j2'
|
||||||
|
|
||||||
// ========== include from 'common/monitoring-data.js.j2'
|
// ========== include from 'common/monitoring-data.js.j2'
|
||||||
@@ -468,21 +513,26 @@
|
|||||||
"txEn": this.paramRxtx.txEn,
|
"txEn": this.paramRxtx.txEn,
|
||||||
"txAutoStart": this.paramRxtx.txAutoStart,
|
"txAutoStart": this.paramRxtx.txAutoStart,
|
||||||
"txModulatorIsTest": this.paramRxtx.txModulatorIsTest,
|
"txModulatorIsTest": this.paramRxtx.txModulatorIsTest,
|
||||||
|
"txAttenuation": this.paramRxtx.txAttenuation,
|
||||||
"txIsTestInput": this.paramRxtx.txIsTestInput,
|
"txIsTestInput": this.paramRxtx.txIsTestInput,
|
||||||
"txCentralFreq": this.paramRxtx.txCentralFreq,
|
"txCentralFreq": parseFloat(this.paramRxtx.txCentralFreq.replace(/[^0-9,.]/g, '').replace(',', '.')),
|
||||||
"txBaudrate": this.paramRxtx.txBaudrate,
|
"txBaudrate": parseFloat(this.paramRxtx.txBaudrate.replace(/[^0-9,.]/g, '').replace(',', '.')),
|
||||||
"txRolloff": this.paramRxtx.txRolloff,
|
"txRolloff": this.paramRxtx.txRolloff,
|
||||||
"txSpreadCoef": this.paramRxtx.txSpreadCoef,
|
"txSpreadCoef": this.paramRxtx.txSpreadCoef,
|
||||||
"txGoldan": this.paramRxtx.txGoldan,
|
"txFieldsDataPreamble": this.paramRxtx.txFieldsDataPreamble,
|
||||||
"txAttenuation": this.paramRxtx.txAttenuation,
|
"aupcEn": this.paramRxtx.aupcEn,
|
||||||
|
"aupcMinAttenuation": this.paramRxtx.aupcMinAttenuation,
|
||||||
|
"aupcMaxAttenuation": this.paramRxtx.aupcMaxAttenuation,
|
||||||
|
"aupcRequiredSnr": this.paramRxtx.aupcRequiredSnr,
|
||||||
"rxAgcEn": this.paramRxtx.rxAgcEn,
|
"rxAgcEn": this.paramRxtx.rxAgcEn,
|
||||||
"rxManualGain": this.paramRxtx.rxManualGain,
|
"rxManualGain": this.paramRxtx.rxManualGain,
|
||||||
"rxSpectrumInversion": this.paramRxtx.rxSpectrumInversion,
|
"rxSpectrumInversion": this.paramRxtx.rxSpectrumInversion,
|
||||||
"rxCentralFreq": this.paramRxtx.rxCentralFreq,
|
"rxCentralFreq": parseFloat(this.paramRxtx.rxCentralFreq.replace(/[^0-9,.]/g, '').replace(',', '.')),
|
||||||
"rxBaudrate": this.paramRxtx.rxBaudrate,
|
"rxBaudrate": parseFloat(this.paramRxtx.rxBaudrate.replace(/[^0-9,.]/g, '').replace(',', '.')),
|
||||||
"rxRolloff": this.paramRxtx.rxRolloff,
|
"rxRolloff": this.paramRxtx.rxRolloff,
|
||||||
"rxSpreadCoef": this.paramRxtx.rxSpreadCoef,
|
"rxSpreadCoef": this.paramRxtx.rxSpreadCoef,
|
||||||
"rxGoldan": this.paramRxtx.rxGoldan,
|
"rxFftShift": this.paramRxtx.rxFftShift,
|
||||||
|
"rxFieldsDataPreamble": this.paramRxtx.rxFieldsDataPreamble,
|
||||||
}
|
}
|
||||||
|
|
||||||
this.submitStatus.rxtx = true
|
this.submitStatus.rxtx = true
|
||||||
@@ -510,27 +560,50 @@
|
|||||||
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
|
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
|
||||||
.finally(() => { this.submitStatus.buclnb = false })
|
.finally(() => { this.submitStatus.buclnb = false })
|
||||||
},
|
},
|
||||||
|
settingsSubmitNetwork() {
|
||||||
|
if (this.submitStatus.network) { return }
|
||||||
|
{ if (!confirm("Применение этих настроек может сделать модем недоступным! Продолжить?")) return }
|
||||||
|
|
||||||
|
let query = {
|
||||||
|
"managementIp": this.paramNetwork.managementIp,
|
||||||
|
"isL2": this.paramNetwork.isL2,
|
||||||
|
"dataIp": this.paramNetwork.dataIp,
|
||||||
|
"dataMtu": this.paramNetwork.dataMtu,
|
||||||
|
"serverName": this.paramNetwork.serverName,
|
||||||
|
}
|
||||||
|
|
||||||
|
this.submitStatus.network = true
|
||||||
|
fetch('/api/set/network', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(query), credentials: 'same-origin' })
|
||||||
|
.then(async (resp) => { let vals = await resp.json(); if (vals['status'] !== 'ok') { throw new Error(vals['error'] ? vals['error'] : "Server returns undefined error") } this.updateNetworkSettings(vals) })
|
||||||
|
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
|
||||||
|
.finally(() => { this.submitStatus.network = false })
|
||||||
|
},
|
||||||
|
|
||||||
updateRxtxSettings(vals) {
|
updateRxtxSettings(vals) {
|
||||||
this.submitStatus.rxtx = false
|
this.submitStatus.rxtx = false
|
||||||
this.paramRxtx.txEn = vals["settings"]["rxtx"]["txEn"]
|
this.paramRxtx.txEn = vals["settings"]["rxtx"]["txEn"]
|
||||||
this.paramRxtx.txAutoStart = vals["settings"]["rxtx"]["txAutoStart"]
|
this.paramRxtx.txAutoStart = vals["settings"]["rxtx"]["txAutoStart"]
|
||||||
this.paramRxtx.txModulatorIsTest = vals["settings"]["rxtx"]["txModulatorIsTest"]
|
this.paramRxtx.txModulatorIsTest = vals["settings"]["rxtx"]["txModulatorIsTest"]
|
||||||
|
this.paramRxtx.txAttenuation = vals["settings"]["rxtx"]["txAttenuation"]
|
||||||
this.paramRxtx.txIsTestInput = vals["settings"]["rxtx"]["txIsTestInput"]
|
this.paramRxtx.txIsTestInput = vals["settings"]["rxtx"]["txIsTestInput"]
|
||||||
this.paramRxtx.txCentralFreq = vals["settings"]["rxtx"]["txCentralFreq"]
|
this.paramRxtx.txCentralFreq = this.inputFormatNumber(vals["settings"]["rxtx"]["txCentralFreq"], {min:70000,max:6000000,step:100})
|
||||||
this.paramRxtx.txBaudrate = vals["settings"]["rxtx"]["txBaudrate"]
|
this.paramRxtx.txBaudrate = this.inputFormatNumber(vals["settings"]["rxtx"]["txBaudrate"], {min:128000,max:30000000,})
|
||||||
this.paramRxtx.txRolloff = vals["settings"]["rxtx"]["txRolloff"]
|
this.paramRxtx.txRolloff = vals["settings"]["rxtx"]["txRolloff"]
|
||||||
this.paramRxtx.txSpreadCoef = vals["settings"]["rxtx"]["txSpreadCoef"]
|
this.paramRxtx.txSpreadCoef = vals["settings"]["rxtx"]["txSpreadCoef"]
|
||||||
this.paramRxtx.txGoldan = vals["settings"]["rxtx"]["txGoldan"]
|
this.paramRxtx.txFieldsDataPreamble = vals["settings"]["rxtx"]["txFieldsDataPreamble"]
|
||||||
this.paramRxtx.txAttenuation = vals["settings"]["rxtx"]["txAttenuation"]
|
this.paramRxtx.aupcEn = vals["settings"]["rxtx"]["aupcEn"]
|
||||||
|
this.paramRxtx.aupcMinAttenuation = vals["settings"]["rxtx"]["aupcMinAttenuation"]
|
||||||
|
this.paramRxtx.aupcMaxAttenuation = vals["settings"]["rxtx"]["aupcMaxAttenuation"]
|
||||||
|
this.paramRxtx.aupcRequiredSnr = vals["settings"]["rxtx"]["aupcRequiredSnr"]
|
||||||
this.paramRxtx.rxAgcEn = vals["settings"]["rxtx"]["rxAgcEn"]
|
this.paramRxtx.rxAgcEn = vals["settings"]["rxtx"]["rxAgcEn"]
|
||||||
this.paramRxtx.rxManualGain = vals["settings"]["rxtx"]["rxManualGain"]
|
this.paramRxtx.rxManualGain = vals["settings"]["rxtx"]["rxManualGain"]
|
||||||
this.paramRxtx.rxSpectrumInversion = vals["settings"]["rxtx"]["rxSpectrumInversion"]
|
this.paramRxtx.rxSpectrumInversion = vals["settings"]["rxtx"]["rxSpectrumInversion"]
|
||||||
this.paramRxtx.rxCentralFreq = vals["settings"]["rxtx"]["rxCentralFreq"]
|
this.paramRxtx.rxCentralFreq = this.inputFormatNumber(vals["settings"]["rxtx"]["rxCentralFreq"], {min:70000,max:6000000,step:100})
|
||||||
this.paramRxtx.rxBaudrate = vals["settings"]["rxtx"]["rxBaudrate"]
|
this.paramRxtx.rxBaudrate = this.inputFormatNumber(vals["settings"]["rxtx"]["rxBaudrate"], {min:128000,max:30000000,})
|
||||||
this.paramRxtx.rxRolloff = vals["settings"]["rxtx"]["rxRolloff"]
|
this.paramRxtx.rxRolloff = vals["settings"]["rxtx"]["rxRolloff"]
|
||||||
this.paramRxtx.rxSpreadCoef = vals["settings"]["rxtx"]["rxSpreadCoef"]
|
this.paramRxtx.rxSpreadCoef = vals["settings"]["rxtx"]["rxSpreadCoef"]
|
||||||
this.paramRxtx.rxGoldan = vals["settings"]["rxtx"]["rxGoldan"]
|
this.paramRxtx.rxFftShift = vals["settings"]["rxtx"]["rxFftShift"]
|
||||||
|
this.paramRxtx.rxFieldsDataPreamble = vals["settings"]["rxtx"]["rxFieldsDataPreamble"]
|
||||||
},
|
},
|
||||||
updateBuclnbSettings(vals) {
|
updateBuclnbSettings(vals) {
|
||||||
this.submitStatus.buclnb = false
|
this.submitStatus.buclnb = false
|
||||||
@@ -541,6 +614,14 @@
|
|||||||
this.paramBuclnb.srvRefClk10M = vals["settings"]["buclnb"]["srvRefClk10M"]
|
this.paramBuclnb.srvRefClk10M = vals["settings"]["buclnb"]["srvRefClk10M"]
|
||||||
this.paramBuclnb.bucLnbAutoStart = vals["settings"]["buclnb"]["bucLnbAutoStart"]
|
this.paramBuclnb.bucLnbAutoStart = vals["settings"]["buclnb"]["bucLnbAutoStart"]
|
||||||
},
|
},
|
||||||
|
updateNetworkSettings(vals) {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
this.paramNetwork.managementIp = vals["settings"]["network"]["managementIp"]
|
||||||
|
this.paramNetwork.isL2 = vals["settings"]["network"]["isL2"]
|
||||||
|
this.paramNetwork.dataIp = vals["settings"]["network"]["dataIp"]
|
||||||
|
this.paramNetwork.dataMtu = vals["settings"]["network"]["dataMtu"]
|
||||||
|
this.paramNetwork.serverName = vals["settings"]["network"]["serverName"]
|
||||||
|
},
|
||||||
// ========== include end from 'common/all-params-methods.js.j2'
|
// ========== include end from 'common/all-params-methods.js.j2'
|
||||||
|
|
||||||
// ========== include from 'common/monitoring-methods.js.j2'
|
// ========== include from 'common/monitoring-methods.js.j2'
|
||||||
@@ -572,26 +653,26 @@
|
|||||||
this.statRx.freq_search_lock = vals["state"]["rx"]["freq_search_lock"]
|
this.statRx.freq_search_lock = vals["state"]["rx"]["freq_search_lock"]
|
||||||
this.statRx.afc_lock = vals["state"]["rx"]["afc_lock"]
|
this.statRx.afc_lock = vals["state"]["rx"]["afc_lock"]
|
||||||
this.statRx.pkt_sync = vals["state"]["rx"]["pkt_sync"]
|
this.statRx.pkt_sync = vals["state"]["rx"]["pkt_sync"]
|
||||||
this.statRx.snr = vals["state"]["rx"]["snr"]
|
this.statRx.snr = Math.round(vals["state"]["rx"]["snr"] * 10) / 10
|
||||||
this.statRx.rssi = vals["state"]["rx"]["rssi"]
|
this.statRx.rssi = Math.round(vals["state"]["rx"]["rssi"] * 10) / 10
|
||||||
this.statRx.modcod = modcodToStr(vals["state"]["rx"]["modcod"])
|
this.statRx.modcod = modcodToStr(vals["state"]["rx"]["modcod"])
|
||||||
this.statRx.frameSizeNormal = vals["state"]["rx"]["frameSizeNormal"]
|
this.statRx.frameSizeNormal = vals["state"]["rx"]["frameSizeNormal"]
|
||||||
this.statRx.isPilots = vals["state"]["rx"]["isPilots"]
|
this.statRx.isPilots = vals["state"]["rx"]["isPilots"]
|
||||||
this.statRx.symError = vals["state"]["rx"]["symError"]
|
this.statRx.symError = vals["state"]["rx"]["symError"]
|
||||||
this.statRx.freqErr = vals["state"]["rx"]["freqErr"]
|
this.statRx.freqErr = Math.round(vals["state"]["rx"]["freqErr"] * 100) / 100
|
||||||
this.statRx.freqErrAcc = vals["state"]["rx"]["freqErrAcc"]
|
this.statRx.freqErrAcc = Math.round(vals["state"]["rx"]["freqErrAcc"] * 100) / 100
|
||||||
this.statRx.inputSignalLevel = vals["state"]["rx"]["inputSignalLevel"]
|
this.statRx.inputSignalLevel = vals["state"]["rx"]["inputSignalLevel"]
|
||||||
this.statRx.pllError = vals["state"]["rx"]["pllError"]
|
this.statRx.pllError = Math.round(vals["state"]["rx"]["pllError"] * 100) / 100
|
||||||
this.statRx.speedOnRxKbit = vals["state"]["rx"]["speedOnRxKbit"]
|
this.statRx.speedOnRxKbit = Math.round(vals["state"]["rx"]["speedOnRxKbit"] * 100) / 100
|
||||||
this.statRx.speedOnIifKbit = vals["state"]["rx"]["speedOnIifKbit"]
|
this.statRx.speedOnIifKbit = Math.round(vals["state"]["rx"]["speedOnIifKbit"] * 100) / 100
|
||||||
this.statRx.packetsOk = vals["state"]["rx"]["packetsOk"]
|
this.statRx.packetsOk = vals["state"]["rx"]["packetsOk"]
|
||||||
this.statRx.packetsBad = vals["state"]["rx"]["packetsBad"]
|
this.statRx.packetsBad = vals["state"]["rx"]["packetsBad"]
|
||||||
this.statRx.packetsDummy = vals["state"]["rx"]["packetsDummy"]
|
this.statRx.packetsDummy = vals["state"]["rx"]["packetsDummy"]
|
||||||
|
|
||||||
this.statTx.state = vals["state"]["tx"]["state"]
|
this.statTx.state = vals["state"]["tx"]["state"]
|
||||||
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
||||||
this.statTx.speedOnTxKbit = vals["state"]["tx"]["speedOnTxKbit"]
|
this.statTx.speedOnTxKbit = Math.round(vals["state"]["tx"]["speedOnTxKbit"] * 100) / 100
|
||||||
this.statTx.speedOnIifKbit = vals["state"]["tx"]["speedOnIifKbit"]
|
this.statTx.speedOnIifKbit = Math.round(vals["state"]["tx"]["speedOnIifKbit"] * 100) / 100
|
||||||
this.statTx.centerFreq = vals["state"]["tx"]["centerFreq"]
|
this.statTx.centerFreq = vals["state"]["tx"]["centerFreq"]
|
||||||
this.statTx.symSpeed = vals["state"]["tx"]["symSpeed"]
|
this.statTx.symSpeed = vals["state"]["tx"]["symSpeed"]
|
||||||
|
|
||||||
@@ -612,9 +693,9 @@
|
|||||||
} else {
|
} else {
|
||||||
this.statOs.uptime = '?'
|
this.statOs.uptime = '?'
|
||||||
}
|
}
|
||||||
this.statOs.load1 = vals["state"]["device"]["load1min"]
|
this.statOs.load1 = Math.round(vals["state"]["device"]["load1min"] * 100) / 100
|
||||||
this.statOs.load5 = vals["state"]["device"]["load5min"]
|
this.statOs.load5 = Math.round(vals["state"]["device"]["load5min"] * 100) / 100
|
||||||
this.statOs.load15 = vals["state"]["device"]["load15min"]
|
this.statOs.load15 = Math.round(vals["state"]["device"]["load15min"] * 100) / 100
|
||||||
this.statOs.totalram = vals["state"]["device"]["totalram"]
|
this.statOs.totalram = vals["state"]["device"]["totalram"]
|
||||||
this.statOs.freeram = vals["state"]["device"]["freeram"]
|
this.statOs.freeram = vals["state"]["device"]["freeram"]
|
||||||
},
|
},
|
||||||
@@ -695,6 +776,133 @@
|
|||||||
}
|
}
|
||||||
this.submitStatus.modemReboot = 30
|
this.submitStatus.modemReboot = 30
|
||||||
fetch('/api/reboot', { method: 'POST' }).then((r) => {})
|
fetch('/api/reboot', { method: 'POST' }).then((r) => {})
|
||||||
|
},
|
||||||
|
async restoreAllSettings() {
|
||||||
|
// Порядок применения настроек
|
||||||
|
const settingsApplyOrder = ['qos', 'tcpaccel', 'dpdi', 'rxtx', 'buclnb', 'network'];
|
||||||
|
|
||||||
|
// 1. Чтение JSON-файла, выбранного пользователем
|
||||||
|
const fileInput = document.createElement('input');
|
||||||
|
fileInput.type = 'file';
|
||||||
|
fileInput.accept = '.json';
|
||||||
|
|
||||||
|
const filePromise = new Promise((resolve, reject) => {
|
||||||
|
fileInput.onchange = e => {
|
||||||
|
const file = e.target.files[0];
|
||||||
|
if (!file) {
|
||||||
|
reject(new Error('Файл не выбран'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = event => {
|
||||||
|
try {
|
||||||
|
const jsonData = JSON.parse(event.target.result);
|
||||||
|
resolve(jsonData);
|
||||||
|
} catch (error) {
|
||||||
|
reject(new Error('Ошибка парсинга JSON'));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
reader.onerror = () => reject(new Error('Ошибка чтения файла'));
|
||||||
|
reader.readAsText(file);
|
||||||
|
};
|
||||||
|
fileInput.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const settingsToApply = await filePromise;
|
||||||
|
const errors = [];
|
||||||
|
|
||||||
|
// 2. Перебор групп параметров в заданном порядке
|
||||||
|
for (const groupName of settingsApplyOrder) {
|
||||||
|
if (!settingsToApply.hasOwnProperty(groupName)) {
|
||||||
|
continue; // Пропускаем группы, которых нет в файле
|
||||||
|
}
|
||||||
|
|
||||||
|
const groupSettings = settingsToApply[groupName];
|
||||||
|
if (typeof groupSettings !== 'object' || groupSettings === null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 2.1. POST-запрос для применения группы параметров
|
||||||
|
const postResponse = await fetch(`/api/set/${groupName}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(groupSettings)
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!postResponse.ok) {
|
||||||
|
throw new Error(`HTTP error ${postResponse.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const postResult = await postResponse.json();
|
||||||
|
if (postResult.status !== 'ok') {
|
||||||
|
throw new Error(`API error: ${postResult.message || 'unknown error'}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.2. Проверка примененных параметров
|
||||||
|
const getResponse = await fetch('/api/get/settings', { method: 'GET' });
|
||||||
|
if (!getResponse.ok) {
|
||||||
|
throw new Error(`HTTP error ${getResponse.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchSettingsResult = await getResponse.json();
|
||||||
|
if (fetchSettingsResult.status !== 'ok') {
|
||||||
|
throw new Error('Не удалось получить текущие настройки');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка соответствия параметров
|
||||||
|
const appliedGroup = fetchSettingsResult.settings[groupName] || {};
|
||||||
|
const failedSettings = [];
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(groupSettings)) {
|
||||||
|
if (appliedGroup[key] !== value) {
|
||||||
|
failedSettings.push(`${key} (ожидалось: ${value}, получено: ${appliedGroup[key]})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failedSettings.length > 0) {
|
||||||
|
throw new Error(`Не совпадают параметры: ${failedSettings.join(', ')}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (groupError) {
|
||||||
|
errors.push(`Группа ${groupName}: ${groupError.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Показ ошибок, если они есть
|
||||||
|
if (errors.length > 0) {
|
||||||
|
const errorMessage = errors.join('\n\n') +
|
||||||
|
'\n\nНекоторые настройки могли примениться некорректно.\nСтраница будет перезагружена.';
|
||||||
|
alert(errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
alert(`Ошибка при восстановлении настроек: ${error.message}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Перезагрузка страницы
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
async dumpAllSettings() {
|
||||||
|
function downloadAsFile(data, filename) {
|
||||||
|
let a = document.createElement("a");
|
||||||
|
let file = new Blob([data], {type: 'application/json'});
|
||||||
|
a.href = URL.createObjectURL(file);
|
||||||
|
a.download = filename;
|
||||||
|
a.click();
|
||||||
|
}
|
||||||
|
const response = await fetch('/api/get/settings', { method: 'GET' })
|
||||||
|
if (response.ok) {
|
||||||
|
const jres = await response.json()
|
||||||
|
if (jres["status"] === "ok") {
|
||||||
|
downloadAsFile(JSON.stringify(jres["settings"], null, 4), "backup-" + this.about.firmwareVersion + "-" + this.about.modemSn + ".json")
|
||||||
|
}
|
||||||
|
}
|
||||||
}, // ========== include end from 'common/admin-methods.js.j2'
|
}, // ========== include end from 'common/admin-methods.js.j2'
|
||||||
|
|
||||||
|
|
||||||
@@ -705,6 +913,7 @@
|
|||||||
this.settingFetchComplete = true
|
this.settingFetchComplete = true
|
||||||
this.updateRxtxSettings(vals)
|
this.updateRxtxSettings(vals)
|
||||||
this.updateBuclnbSettings(vals)
|
this.updateBuclnbSettings(vals)
|
||||||
|
this.updateNetworkSettings(vals)
|
||||||
|
|
||||||
if ('netServerName' in vals['settings']) {
|
if ('netServerName' in vals['settings']) {
|
||||||
document.getElementsByTagName('title')[0].innerText = vals['settings']['netServerName']
|
document.getElementsByTagName('title')[0].innerText = vals['settings']['netServerName']
|
||||||
|
@@ -158,12 +158,12 @@
|
|||||||
<label>
|
<label>
|
||||||
<span>Roll-off</span>
|
<span>Roll-off</span>
|
||||||
<select v-model="paramRxtx.rxRolloff">
|
<select v-model="paramRxtx.rxRolloff">
|
||||||
<option :value="2">0.02</option>
|
<option :value="20">0.02</option>
|
||||||
<option :value="5">0.05</option>
|
<option :value="50">0.05</option>
|
||||||
<option :value="10">0.10</option>
|
<option :value="100">0.10</option>
|
||||||
<option :value="15">0.15</option>
|
<option :value="150">0.15</option>
|
||||||
<option :value="20">0.20</option>
|
<option :value="200">0.20</option>
|
||||||
<option :value="25">0.25</option>
|
<option :value="250">0.25</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -173,16 +173,16 @@
|
|||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<label>
|
<label>
|
||||||
<span>Метод расчета задержки</span>
|
<span>Метод расчета задержки</span>
|
||||||
<select v-model="paramDpdi.dpdiIsPositional">
|
<select v-model="paramDpdi.isPositional">
|
||||||
<option :value="true">Позиционированием</option>
|
<option :value="true">Позиционированием</option>
|
||||||
<option :value="false">Окном задержки</option>
|
<option :value="false">Окном задержки</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<h2 v-show="paramDpdi.dpdiIsPositional === true">Настройки позиционирования</h2>
|
<h2 v-show="paramDpdi.isPositional === true">Настройки позиционирования</h2>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Широта станции</span><input type="number" v-model="paramDpdi.dpdiPositionStationLatitude" min="-180" max="180" step="1e-06"/></label>
|
<label v-show="paramDpdi.isPositional === true"><span>Широта станции</span><input type="number" v-model="paramDpdi.positionStationLatitude" min="-180" max="180" step="1e-06"/></label>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Долгота станции</span><input type="number" v-model="paramDpdi.dpdiPositionStationLongitude" min="-180" max="180" step="1e-06"/></label>
|
<label v-show="paramDpdi.isPositional === true"><span>Долгота станции</span><input type="number" v-model="paramDpdi.positionStationLongitude" min="-180" max="180" step="1e-06"/></label>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Подспутниковая точка</span><input type="number" v-model="paramDpdi.dpdiPositionSatelliteLongitude" min="-180" max="180" step="1e-06"/></label>
|
<label v-show="paramDpdi.isPositional === true"><span>Подспутниковая точка</span><input type="number" v-model="paramDpdi.positionSatelliteLongitude" min="-180" max="180" step="1e-06"/></label>
|
||||||
<label v-show="paramDpdi.dpdiIsPositional === false"><span>Задержка до спутника, мс</span><input type="number" v-model="paramDpdi.dpdiDelay" max="400" step="0.1"/></label>
|
<label v-show="paramDpdi.isPositional === false"><span>Задержка до спутника, мс</span><input type="number" v-model="paramDpdi.delay" max="400" step="0.1"/></label>
|
||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitDpdi()">Сохранить <span class="submit-spinner" v-show="submitStatus.dpdi"></span></button>
|
<button class="action-button" @click="settingsSubmitDpdi()">Сохранить <span class="submit-spinner" v-show="submitStatus.dpdi"></span></button>
|
||||||
<h2>Настройки питания и опорного генератора</h2>
|
<h2>Настройки питания и опорного генератора</h2>
|
||||||
@@ -200,6 +200,10 @@
|
|||||||
<option :value="24">24В</option>
|
<option :value="24">24В</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Частота LO, кГц</span>
|
||||||
|
<input type="text" v-model.lazy="paramBuclnb.bucLoKhz" @change="e => paramBuclnb.bucLoKhz = inputFormatNumber(inputFormatNumber(e.target.value, {max:40000000,step:1}), {max:40000000,step:1})"/>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<h3>Настройки LNB</h3>
|
<h3>Настройки LNB</h3>
|
||||||
@@ -216,6 +220,10 @@
|
|||||||
<option :value="24">24В</option>
|
<option :value="24">24В</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Частота LO, кГц</span>
|
||||||
|
<input type="text" v-model.lazy="paramBuclnb.lnbLoKhz" @change="e => paramBuclnb.lnbLoKhz = inputFormatNumber(inputFormatNumber(e.target.value, {max:40000000,step:1}), {max:40000000,step:1})"/>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<h3>Сервисные настройки</h3>
|
<h3>Сервисные настройки</h3>
|
||||||
@@ -233,18 +241,14 @@
|
|||||||
</div> <div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete">
|
</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">
|
||||||
<label>
|
|
||||||
<span>Пароль для входа в сеть ЦЗС</span>
|
|
||||||
<input v-model="paramNetwork.netCesPassword" type="text">
|
|
||||||
</label>
|
|
||||||
<h3>Настройки интерфейса управления</h3>
|
<h3>Настройки интерфейса управления</h3>
|
||||||
<label>
|
<label>
|
||||||
<span>IP Интерфейса управления (/24)</span>
|
<span>Интерфейс управления (a.d.d.r/mask)</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="paramNetwork.managementIp" 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]?)\/([0-9]|[1-2][0-9]|3[0-2])$">
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Имя веб-сервера</span>
|
<span>Имя веб-сервера</span>
|
||||||
<input v-model="paramNetwork.netServerName" type="text">
|
<input v-model="paramNetwork.serverName" type="text">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitNetwork()">Сохранить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
<button class="action-button" @click="settingsSubmitNetwork()">Сохранить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
@@ -266,6 +270,16 @@
|
|||||||
<div>
|
<div>
|
||||||
<button class="dangerous-button" onclick="fetch('/api/resetSettings', { method: 'POST' }).then((r) => { window.location.reload(); })">Сбросить модем до заводских настроек</button>
|
<button class="dangerous-button" onclick="fetch('/api/resetSettings', { method: 'POST' }).then((r) => { window.location.reload(); })">Сбросить модем до заводских настроек</button>
|
||||||
</div>
|
</div>
|
||||||
|
<button class="action-button" @click="dumpAllSettings()">Сохранить бекап конфигурации</button>
|
||||||
|
<button class="dangerous-button" @click="restoreAllSettings()">Восстановить бекап конфигурации</button>
|
||||||
|
</div>
|
||||||
|
<h2>Вход в сеть ЦЗС</h2>
|
||||||
|
<div class="settings-set-container statistics-container">
|
||||||
|
<label>
|
||||||
|
<span>Хеш-строка пароля (выдается оператором NMS)</span>
|
||||||
|
<input v-model="cesPasswordValue" type="text">
|
||||||
|
</label>
|
||||||
|
<button class="action-button" @click="settingsPerformSetCesPassword()">Установить пароль<span class="submit-spinner" v-show="submitStatus.cesPassword"></span></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>Обновление ПО</h2>
|
<h2>Обновление ПО</h2>
|
||||||
@@ -325,9 +339,11 @@
|
|||||||
firmwareUpload: false,
|
firmwareUpload: false,
|
||||||
firmwareUpgrade: false,
|
firmwareUpgrade: false,
|
||||||
firmwareUpgradeOta: false,
|
firmwareUpgradeOta: false,
|
||||||
|
cesPassword: false,
|
||||||
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
|
// когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю
|
||||||
modemReboot: null
|
modemReboot: null
|
||||||
},
|
},
|
||||||
|
cesPasswordValue: '',
|
||||||
|
|
||||||
// ========== include from 'common/all-params-data.js.j2'
|
// ========== include from 'common/all-params-data.js.j2'
|
||||||
paramRxtx: {
|
paramRxtx: {
|
||||||
@@ -340,27 +356,28 @@
|
|||||||
rxSpectrumInversion: false,
|
rxSpectrumInversion: false,
|
||||||
rxCentralFreq: 0,
|
rxCentralFreq: 0,
|
||||||
rxBaudrate: 0,
|
rxBaudrate: 0,
|
||||||
rxRolloff: 2,
|
rxRolloff: 20,
|
||||||
},
|
},
|
||||||
paramBuclnb: {
|
paramBuclnb: {
|
||||||
bucRefClk10M: false,
|
bucRefClk10M: false,
|
||||||
bucPowering: 0,
|
bucPowering: 0,
|
||||||
|
bucLoKhz: 0,
|
||||||
lnbRefClk10M: false,
|
lnbRefClk10M: false,
|
||||||
lnbPowering: 0,
|
lnbPowering: 0,
|
||||||
|
lnbLoKhz: 0,
|
||||||
srvRefClk10M: false,
|
srvRefClk10M: false,
|
||||||
bucLnbAutoStart: false,
|
bucLnbAutoStart: false,
|
||||||
},
|
},
|
||||||
paramDpdi: {
|
paramDpdi: {
|
||||||
dpdiIsPositional: true,
|
isPositional: true,
|
||||||
dpdiPositionStationLatitude: -180,
|
positionStationLatitude: -180,
|
||||||
dpdiPositionStationLongitude: -180,
|
positionStationLongitude: -180,
|
||||||
dpdiPositionSatelliteLongitude: -180,
|
positionSatelliteLongitude: -180,
|
||||||
dpdiDelay: 0,
|
delay: 0,
|
||||||
},
|
},
|
||||||
paramNetwork: {
|
paramNetwork: {
|
||||||
netCesPassword: null,
|
managementIp: null,
|
||||||
netManagementIp: null,
|
serverName: null,
|
||||||
netServerName: null,
|
|
||||||
},
|
},
|
||||||
// ========== include end from 'common/all-params-data.js.j2'
|
// ========== include end from 'common/all-params-data.js.j2'
|
||||||
|
|
||||||
@@ -503,8 +520,10 @@
|
|||||||
let query = {
|
let query = {
|
||||||
"bucRefClk10M": this.paramBuclnb.bucRefClk10M,
|
"bucRefClk10M": this.paramBuclnb.bucRefClk10M,
|
||||||
"bucPowering": this.paramBuclnb.bucPowering,
|
"bucPowering": this.paramBuclnb.bucPowering,
|
||||||
|
"bucLoKhz": parseFloat(this.paramBuclnb.bucLoKhz.replace(/[^0-9,.]/g, '').replace(',', '.')),
|
||||||
"lnbRefClk10M": this.paramBuclnb.lnbRefClk10M,
|
"lnbRefClk10M": this.paramBuclnb.lnbRefClk10M,
|
||||||
"lnbPowering": this.paramBuclnb.lnbPowering,
|
"lnbPowering": this.paramBuclnb.lnbPowering,
|
||||||
|
"lnbLoKhz": parseFloat(this.paramBuclnb.lnbLoKhz.replace(/[^0-9,.]/g, '').replace(',', '.')),
|
||||||
"srvRefClk10M": this.paramBuclnb.srvRefClk10M,
|
"srvRefClk10M": this.paramBuclnb.srvRefClk10M,
|
||||||
"bucLnbAutoStart": this.paramBuclnb.bucLnbAutoStart,
|
"bucLnbAutoStart": this.paramBuclnb.bucLnbAutoStart,
|
||||||
}
|
}
|
||||||
@@ -519,11 +538,11 @@
|
|||||||
if (this.submitStatus.dpdi) { return }
|
if (this.submitStatus.dpdi) { return }
|
||||||
|
|
||||||
let query = {
|
let query = {
|
||||||
"dpdiIsPositional": this.paramDpdi.dpdiIsPositional,
|
"isPositional": this.paramDpdi.isPositional,
|
||||||
"dpdiPositionStationLatitude": this.paramDpdi.dpdiPositionStationLatitude,
|
"positionStationLatitude": this.paramDpdi.positionStationLatitude,
|
||||||
"dpdiPositionStationLongitude": this.paramDpdi.dpdiPositionStationLongitude,
|
"positionStationLongitude": this.paramDpdi.positionStationLongitude,
|
||||||
"dpdiPositionSatelliteLongitude": this.paramDpdi.dpdiPositionSatelliteLongitude,
|
"positionSatelliteLongitude": this.paramDpdi.positionSatelliteLongitude,
|
||||||
"dpdiDelay": this.paramDpdi.dpdiDelay,
|
"delay": this.paramDpdi.delay,
|
||||||
}
|
}
|
||||||
|
|
||||||
this.submitStatus.dpdi = true
|
this.submitStatus.dpdi = true
|
||||||
@@ -537,9 +556,8 @@
|
|||||||
{ if (!confirm("Применение этих настроек может сделать модем недоступным! Продолжить?")) return }
|
{ if (!confirm("Применение этих настроек может сделать модем недоступным! Продолжить?")) return }
|
||||||
|
|
||||||
let query = {
|
let query = {
|
||||||
"netCesPassword": this.paramNetwork.netCesPassword,
|
"managementIp": this.paramNetwork.managementIp,
|
||||||
"netManagementIp": this.paramNetwork.netManagementIp,
|
"serverName": this.paramNetwork.serverName,
|
||||||
"netServerName": this.paramNetwork.netServerName,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.submitStatus.network = true
|
this.submitStatus.network = true
|
||||||
@@ -566,24 +584,25 @@
|
|||||||
this.submitStatus.buclnb = false
|
this.submitStatus.buclnb = false
|
||||||
this.paramBuclnb.bucRefClk10M = vals["settings"]["buclnb"]["bucRefClk10M"]
|
this.paramBuclnb.bucRefClk10M = vals["settings"]["buclnb"]["bucRefClk10M"]
|
||||||
this.paramBuclnb.bucPowering = vals["settings"]["buclnb"]["bucPowering"]
|
this.paramBuclnb.bucPowering = vals["settings"]["buclnb"]["bucPowering"]
|
||||||
|
this.paramBuclnb.bucLoKhz = this.inputFormatNumber(vals["settings"]["buclnb"]["bucLoKhz"], {max:40000000,step:1})
|
||||||
this.paramBuclnb.lnbRefClk10M = vals["settings"]["buclnb"]["lnbRefClk10M"]
|
this.paramBuclnb.lnbRefClk10M = vals["settings"]["buclnb"]["lnbRefClk10M"]
|
||||||
this.paramBuclnb.lnbPowering = vals["settings"]["buclnb"]["lnbPowering"]
|
this.paramBuclnb.lnbPowering = vals["settings"]["buclnb"]["lnbPowering"]
|
||||||
|
this.paramBuclnb.lnbLoKhz = this.inputFormatNumber(vals["settings"]["buclnb"]["lnbLoKhz"], {max:40000000,step:1})
|
||||||
this.paramBuclnb.srvRefClk10M = vals["settings"]["buclnb"]["srvRefClk10M"]
|
this.paramBuclnb.srvRefClk10M = vals["settings"]["buclnb"]["srvRefClk10M"]
|
||||||
this.paramBuclnb.bucLnbAutoStart = vals["settings"]["buclnb"]["bucLnbAutoStart"]
|
this.paramBuclnb.bucLnbAutoStart = vals["settings"]["buclnb"]["bucLnbAutoStart"]
|
||||||
},
|
},
|
||||||
updateDpdiSettings(vals) {
|
updateDpdiSettings(vals) {
|
||||||
this.submitStatus.dpdi = false
|
this.submitStatus.dpdi = false
|
||||||
this.paramDpdi.dpdiIsPositional = vals["settings"]["dpdi"]["dpdiIsPositional"]
|
this.paramDpdi.isPositional = vals["settings"]["dpdi"]["isPositional"]
|
||||||
this.paramDpdi.dpdiPositionStationLatitude = vals["settings"]["dpdi"]["dpdiPositionStationLatitude"]
|
this.paramDpdi.positionStationLatitude = vals["settings"]["dpdi"]["positionStationLatitude"]
|
||||||
this.paramDpdi.dpdiPositionStationLongitude = vals["settings"]["dpdi"]["dpdiPositionStationLongitude"]
|
this.paramDpdi.positionStationLongitude = vals["settings"]["dpdi"]["positionStationLongitude"]
|
||||||
this.paramDpdi.dpdiPositionSatelliteLongitude = vals["settings"]["dpdi"]["dpdiPositionSatelliteLongitude"]
|
this.paramDpdi.positionSatelliteLongitude = vals["settings"]["dpdi"]["positionSatelliteLongitude"]
|
||||||
this.paramDpdi.dpdiDelay = vals["settings"]["dpdi"]["dpdiDelay"]
|
this.paramDpdi.delay = vals["settings"]["dpdi"]["delay"]
|
||||||
},
|
},
|
||||||
updateNetworkSettings(vals) {
|
updateNetworkSettings(vals) {
|
||||||
this.submitStatus.network = false
|
this.submitStatus.network = false
|
||||||
this.paramNetwork.netCesPassword = vals["settings"]["network"]["netCesPassword"]
|
this.paramNetwork.managementIp = vals["settings"]["network"]["managementIp"]
|
||||||
this.paramNetwork.netManagementIp = vals["settings"]["network"]["netManagementIp"]
|
this.paramNetwork.serverName = vals["settings"]["network"]["serverName"]
|
||||||
this.paramNetwork.netServerName = vals["settings"]["network"]["netServerName"]
|
|
||||||
},
|
},
|
||||||
// ========== include end from 'common/all-params-methods.js.j2'
|
// ========== include end from 'common/all-params-methods.js.j2'
|
||||||
|
|
||||||
@@ -616,26 +635,26 @@
|
|||||||
this.statRx.freq_search_lock = vals["state"]["rx"]["freq_search_lock"]
|
this.statRx.freq_search_lock = vals["state"]["rx"]["freq_search_lock"]
|
||||||
this.statRx.afc_lock = vals["state"]["rx"]["afc_lock"]
|
this.statRx.afc_lock = vals["state"]["rx"]["afc_lock"]
|
||||||
this.statRx.pkt_sync = vals["state"]["rx"]["pkt_sync"]
|
this.statRx.pkt_sync = vals["state"]["rx"]["pkt_sync"]
|
||||||
this.statRx.snr = vals["state"]["rx"]["snr"]
|
this.statRx.snr = Math.round(vals["state"]["rx"]["snr"] * 10) / 10
|
||||||
this.statRx.rssi = vals["state"]["rx"]["rssi"]
|
this.statRx.rssi = Math.round(vals["state"]["rx"]["rssi"] * 10) / 10
|
||||||
this.statRx.modcod = modcodToStr(vals["state"]["rx"]["modcod"])
|
this.statRx.modcod = modcodToStr(vals["state"]["rx"]["modcod"])
|
||||||
this.statRx.frameSizeNormal = vals["state"]["rx"]["frameSizeNormal"]
|
this.statRx.frameSizeNormal = vals["state"]["rx"]["frameSizeNormal"]
|
||||||
this.statRx.isPilots = vals["state"]["rx"]["isPilots"]
|
this.statRx.isPilots = vals["state"]["rx"]["isPilots"]
|
||||||
this.statRx.symError = vals["state"]["rx"]["symError"]
|
this.statRx.symError = vals["state"]["rx"]["symError"]
|
||||||
this.statRx.freqErr = vals["state"]["rx"]["freqErr"]
|
this.statRx.freqErr = Math.round(vals["state"]["rx"]["freqErr"] * 100) / 100
|
||||||
this.statRx.freqErrAcc = vals["state"]["rx"]["freqErrAcc"]
|
this.statRx.freqErrAcc = Math.round(vals["state"]["rx"]["freqErrAcc"] * 100) / 100
|
||||||
this.statRx.inputSignalLevel = vals["state"]["rx"]["inputSignalLevel"]
|
this.statRx.inputSignalLevel = vals["state"]["rx"]["inputSignalLevel"]
|
||||||
this.statRx.pllError = vals["state"]["rx"]["pllError"]
|
this.statRx.pllError = Math.round(vals["state"]["rx"]["pllError"] * 100) / 100
|
||||||
this.statRx.speedOnRxKbit = vals["state"]["rx"]["speedOnRxKbit"]
|
this.statRx.speedOnRxKbit = Math.round(vals["state"]["rx"]["speedOnRxKbit"] * 100) / 100
|
||||||
this.statRx.speedOnIifKbit = vals["state"]["rx"]["speedOnIifKbit"]
|
this.statRx.speedOnIifKbit = Math.round(vals["state"]["rx"]["speedOnIifKbit"] * 100) / 100
|
||||||
this.statRx.packetsOk = vals["state"]["rx"]["packetsOk"]
|
this.statRx.packetsOk = vals["state"]["rx"]["packetsOk"]
|
||||||
this.statRx.packetsBad = vals["state"]["rx"]["packetsBad"]
|
this.statRx.packetsBad = vals["state"]["rx"]["packetsBad"]
|
||||||
this.statRx.packetsDummy = vals["state"]["rx"]["packetsDummy"]
|
this.statRx.packetsDummy = vals["state"]["rx"]["packetsDummy"]
|
||||||
|
|
||||||
this.statTx.state = vals["state"]["tx"]["state"]
|
this.statTx.state = vals["state"]["tx"]["state"]
|
||||||
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
this.statTx.modcod = modcodToStr(vals["state"]["tx"]["modcod"])
|
||||||
this.statTx.speedOnTxKbit = vals["state"]["tx"]["speedOnTxKbit"]
|
this.statTx.speedOnTxKbit = Math.round(vals["state"]["tx"]["speedOnTxKbit"] * 100) / 100
|
||||||
this.statTx.speedOnIifKbit = vals["state"]["tx"]["speedOnIifKbit"]
|
this.statTx.speedOnIifKbit = Math.round(vals["state"]["tx"]["speedOnIifKbit"] * 100) / 100
|
||||||
this.statTx.centerFreq = vals["state"]["tx"]["centerFreq"]
|
this.statTx.centerFreq = vals["state"]["tx"]["centerFreq"]
|
||||||
this.statTx.symSpeed = vals["state"]["tx"]["symSpeed"]
|
this.statTx.symSpeed = vals["state"]["tx"]["symSpeed"]
|
||||||
|
|
||||||
@@ -659,9 +678,9 @@
|
|||||||
} else {
|
} else {
|
||||||
this.statOs.uptime = '?'
|
this.statOs.uptime = '?'
|
||||||
}
|
}
|
||||||
this.statOs.load1 = vals["state"]["device"]["load1min"]
|
this.statOs.load1 = Math.round(vals["state"]["device"]["load1min"] * 100) / 100
|
||||||
this.statOs.load5 = vals["state"]["device"]["load5min"]
|
this.statOs.load5 = Math.round(vals["state"]["device"]["load5min"] * 100) / 100
|
||||||
this.statOs.load15 = vals["state"]["device"]["load15min"]
|
this.statOs.load15 = Math.round(vals["state"]["device"]["load15min"] * 100) / 100
|
||||||
this.statOs.totalram = vals["state"]["device"]["totalram"]
|
this.statOs.totalram = vals["state"]["device"]["totalram"]
|
||||||
this.statOs.freeram = vals["state"]["device"]["freeram"]
|
this.statOs.freeram = vals["state"]["device"]["freeram"]
|
||||||
},
|
},
|
||||||
@@ -745,6 +764,22 @@
|
|||||||
}
|
}
|
||||||
this.submitStatus.firmwareUpgradeOta = false
|
this.submitStatus.firmwareUpgradeOta = false
|
||||||
},
|
},
|
||||||
|
async settingsPerformSetCesPassword() {
|
||||||
|
if (this.submitStatus.cesPassword) { return }
|
||||||
|
this.submitStatus.cesPassword = true
|
||||||
|
try {
|
||||||
|
await fetch('/api/set/cesPassword', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({'password': this.cesPasswordValue})
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
console.log("failed to perform set CES password: ", e)
|
||||||
|
}
|
||||||
|
this.submitStatus.cesPassword = false
|
||||||
|
},
|
||||||
|
|
||||||
doModemReboot() {
|
doModemReboot() {
|
||||||
if (this.submitStatus.modemReboot !== null) {
|
if (this.submitStatus.modemReboot !== null) {
|
||||||
@@ -752,6 +787,133 @@
|
|||||||
}
|
}
|
||||||
this.submitStatus.modemReboot = 30
|
this.submitStatus.modemReboot = 30
|
||||||
fetch('/api/reboot', { method: 'POST' }).then((r) => {})
|
fetch('/api/reboot', { method: 'POST' }).then((r) => {})
|
||||||
|
},
|
||||||
|
async restoreAllSettings() {
|
||||||
|
// Порядок применения настроек
|
||||||
|
const settingsApplyOrder = ['qos', 'tcpaccel', 'dpdi', 'rxtx', 'buclnb', 'network'];
|
||||||
|
|
||||||
|
// 1. Чтение JSON-файла, выбранного пользователем
|
||||||
|
const fileInput = document.createElement('input');
|
||||||
|
fileInput.type = 'file';
|
||||||
|
fileInput.accept = '.json';
|
||||||
|
|
||||||
|
const filePromise = new Promise((resolve, reject) => {
|
||||||
|
fileInput.onchange = e => {
|
||||||
|
const file = e.target.files[0];
|
||||||
|
if (!file) {
|
||||||
|
reject(new Error('Файл не выбран'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = event => {
|
||||||
|
try {
|
||||||
|
const jsonData = JSON.parse(event.target.result);
|
||||||
|
resolve(jsonData);
|
||||||
|
} catch (error) {
|
||||||
|
reject(new Error('Ошибка парсинга JSON'));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
reader.onerror = () => reject(new Error('Ошибка чтения файла'));
|
||||||
|
reader.readAsText(file);
|
||||||
|
};
|
||||||
|
fileInput.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const settingsToApply = await filePromise;
|
||||||
|
const errors = [];
|
||||||
|
|
||||||
|
// 2. Перебор групп параметров в заданном порядке
|
||||||
|
for (const groupName of settingsApplyOrder) {
|
||||||
|
if (!settingsToApply.hasOwnProperty(groupName)) {
|
||||||
|
continue; // Пропускаем группы, которых нет в файле
|
||||||
|
}
|
||||||
|
|
||||||
|
const groupSettings = settingsToApply[groupName];
|
||||||
|
if (typeof groupSettings !== 'object' || groupSettings === null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 2.1. POST-запрос для применения группы параметров
|
||||||
|
const postResponse = await fetch(`/api/set/${groupName}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(groupSettings)
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!postResponse.ok) {
|
||||||
|
throw new Error(`HTTP error ${postResponse.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const postResult = await postResponse.json();
|
||||||
|
if (postResult.status !== 'ok') {
|
||||||
|
throw new Error(`API error: ${postResult.message || 'unknown error'}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.2. Проверка примененных параметров
|
||||||
|
const getResponse = await fetch('/api/get/settings', { method: 'GET' });
|
||||||
|
if (!getResponse.ok) {
|
||||||
|
throw new Error(`HTTP error ${getResponse.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchSettingsResult = await getResponse.json();
|
||||||
|
if (fetchSettingsResult.status !== 'ok') {
|
||||||
|
throw new Error('Не удалось получить текущие настройки');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка соответствия параметров
|
||||||
|
const appliedGroup = fetchSettingsResult.settings[groupName] || {};
|
||||||
|
const failedSettings = [];
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(groupSettings)) {
|
||||||
|
if (appliedGroup[key] !== value) {
|
||||||
|
failedSettings.push(`${key} (ожидалось: ${value}, получено: ${appliedGroup[key]})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failedSettings.length > 0) {
|
||||||
|
throw new Error(`Не совпадают параметры: ${failedSettings.join(', ')}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (groupError) {
|
||||||
|
errors.push(`Группа ${groupName}: ${groupError.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Показ ошибок, если они есть
|
||||||
|
if (errors.length > 0) {
|
||||||
|
const errorMessage = errors.join('\n\n') +
|
||||||
|
'\n\nНекоторые настройки могли примениться некорректно.\nСтраница будет перезагружена.';
|
||||||
|
alert(errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
alert(`Ошибка при восстановлении настроек: ${error.message}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Перезагрузка страницы
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
async dumpAllSettings() {
|
||||||
|
function downloadAsFile(data, filename) {
|
||||||
|
let a = document.createElement("a");
|
||||||
|
let file = new Blob([data], {type: 'application/json'});
|
||||||
|
a.href = URL.createObjectURL(file);
|
||||||
|
a.download = filename;
|
||||||
|
a.click();
|
||||||
|
}
|
||||||
|
const response = await fetch('/api/get/settings', { method: 'GET' })
|
||||||
|
if (response.ok) {
|
||||||
|
const jres = await response.json()
|
||||||
|
if (jres["status"] === "ok") {
|
||||||
|
downloadAsFile(JSON.stringify(jres["settings"], null, 4), "backup-" + this.about.firmwareVersion + "-" + this.about.modemSn + ".json")
|
||||||
|
}
|
||||||
|
}
|
||||||
}, // ========== include end from 'common/admin-methods.js.j2'
|
}, // ========== include end from 'common/admin-methods.js.j2'
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user