Compare commits

..

90 Commits

Author SHA1 Message Date
kira-a-k
de876c9a76 Доработка. Кнопка показа схемы и снятие выбора прибора 2025-11-24 20:01:44 +03:00
kira-a-k
d51c16b98e Доработка дебаг 2025-11-23 20:38:53 +03:00
kira-a-k
185b940433 Удаление лишней глобальной группы "debag_control" 2025-11-22 12:40:53 +03:00
kira-a-k
a4fe9409c7 Merge remote-tracking branch 'refs/remotes/kotik/prd-control'
# Conflicts:
#	scenes/pribor-prd-k/pribor-prd-k.tscn
#	scenes/pribor-prd-n/pribor-prd-n.tscn
#	scenes/pribor-prd-v/pribor-prd-v.tscn
#	scenes/контроль/контроль.tscn
2025-11-21 19:49:04 +03:00
kira-a-k
c8f125b1a1 Добавлен переключатель дебаг - "Отладка" в настройках 2025-11-21 18:56:26 +03:00
lepshiy
30dc8a2592 Добавлен переключатель дебаг - в нижнем правом углу режима "Контроль", переключатель "Отладка" 2025-11-19 09:05:33 +03:00
TotMaxim
a8b085a514 Доработка проверки яу 07б
и корректировка температур ум в контроле
2025-11-18 19:59:45 +03:00
TotMaxim
3fb2601aca Доработка мини баров + сообщения оператору 2025-11-18 16:24:05 +03:00
TotMaxim
38c2aa9f80 Рефактор. pribor-prd.gd и позиции сцены 2025-11-17 23:35:43 +03:00
kira-a-k
f3f593a597 Поднятие сцен контроля приборов. Line separator - LF 2025-11-17 23:10:15 +03:00
TotMaxim
f39212232a Модификация провекри и результата контроля ум, если 3 луча проходят по мощности, то ум считается исправным 2025-11-17 21:16:48 +03:00
kira-a-k
2d23772546 Merge branch 'master' of https://totmaxim.ru/velelepie/uarep-ctl
# Conflicts:
#	scripts/pribor-prd.gd
2025-11-17 21:14:40 +03:00
kira-a-k
f0685d70e0 Line separator - LF 2025-11-17 21:13:26 +03:00
kira-a-k
e509f85f5c Merge remote-tracking branch 'refs/remotes/kotik/prd-control' 2025-11-17 21:01:43 +03:00
TotMaxim
dc362ad26f Изменения границ температур на усилителях в контроле 2025-11-17 15:07:29 +03:00
TotMaxim
208406971f Отображение ПРД-К интерфейса в контроле 2025-11-17 14:37:56 +03:00
TotMaxim
9eb31c0d4a После объединения 2025-11-17 14:28:03 +03:00
TotMaxim
033e9869f1 Merge remote-tracking branch 'kitya/Dniissasha' into prd-control
# Conflicts:
#	project.godot
#	scenes/работа/работа.gd
#	scripts/interfer.gd
#	scripts/signaller.gd
#	scripts/threats.gd
2025-11-17 14:08:57 +03:00
TotMaxim
5e78e06626 Доработка индикации прогресс бара, проверку загрузки файла, сброс результатов контроля 2025-11-17 13:58:11 +03:00
TotMaxim
56a0fd8af8 Доработка перехода из одной литеры в дургую, провекра ecm, корректировка подписей 2025-11-17 12:49:35 +03:00
lepshiy
0670bf4b09 Проверка и копирование/создание "config/setting_prd_control.json" 2025-11-17 09:30:51 +03:00
lepshiy
06197096bd Merge remote-tracking branch 'refs/remotes/kot/prd-control'
# Conflicts:
#	scenes/tabs-switch/lbl_ready.gd
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/tilemap/tilemap.gd
#	scenes/контроль/control_prd.gd
#	scenes/контроль/control_prd.gd.uid
#	scenes/контроль/контроль.tscn
2025-11-17 09:04:10 +03:00
kira-a-k
28fea4035c Merge remote-tracking branch 'refs/remotes/kotik/prd-control'
# Conflicts:
#	scenes/tabs-switch/lbl_ready.gd
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/tilemap/tilemap.gd
#	scenes/контроль/control_prd.gd
#	scenes/контроль/control_prd.gd.uid
#	scenes/контроль/контроль.tscn
2025-11-16 22:44:28 +03:00
TotMaxim
5293313f0e Доработка отображения мощностей и конфертацию json парсера 2025-11-16 22:27:38 +03:00
TotMaxim
04da0d0cfd исправления обработки кнопки "тренаж" 2025-11-16 20:50:41 +03:00
TotMaxim
89bc19ec98 добавления файлов конфигурации для контроля прд 2025-11-16 20:17:15 +03:00
TotMaxim
9f32e293a0 доработка нового блока (блок-к.tscn) 2025-11-16 20:12:44 +03:00
TotMaxim
217281ce51 доработка мониторинга температур контроля 2025-11-16 19:30:59 +03:00
TotMaxim
de86d281ca загрузка json 2025-11-16 16:43:32 +03:00
TotMaxim
9727eb04a9 Корректировка интерфейса контроля 2025-11-16 14:05:57 +03:00
lepshiy
e1cd37bcfd Доработка. 2025-11-14 14:05:07 +03:00
lepshiy
dcd806309c Merge remote-tracking branch 'refs/remotes/sasha/master'
# Conflicts:
#	scenes/tilemap/tilemap.gd
#	scenes/работа/работа.gd
#	scripts/settings.gd
#	scripts/signaller.gd
#	scripts/trassa.gd
2025-11-14 13:23:28 +03:00
lepshiy
3915bd59d1 Доработка. 2025-11-14 13:23:15 +03:00
MaD_CaT
ae96a8aa97 [PATCH] Доработка. Счётчик опасных целей не считает свои, если опция работать по своим отключена. 2025-11-13 14:06:32 +03:00
MaD_CaT
9aeacea4d7 [PATCH] Доработка. Добавлен приоритет цели и помехи, в автомате помехи с меньшим приоритетом снимаются. 2025-11-13 14:03:39 +03:00
MaD_CaT
22fe43a062 [PATCH] Доработка. Минимальная ширина полосы 5Мгц. Ширина полосы для цели х1.5. (По результатам испытаний) 2025-11-13 13:56:47 +03:00
MaD_CaT
cee75d02cf [PATCH] Доработка. Колонка со статусом выполнения помехи для конкретной цели. (замечание "комиссии") 2025-11-13 13:17:18 +03:00
MaD_CaT
4f3f4ff7f8 [PATCH] Доработка. Более яркий сектор для которого назначена помеха (замечание "комиссии") 2025-11-13 13:05:51 +03:00
sasha80
3cbba93658 Исправление. Адрес для Трассы не загружается из файла настроек 2025-11-13 11:34:16 +03:00
sasha80
9d476859b1 Рефактор 2025-11-13 11:33:08 +03:00
TotMaxim
69b455f811 Добавление анимации кнопки запуска контроля 2025-11-13 00:23:39 +03:00
TotMaxim
9856e300e9 Отладил отображение контроля фс и зависимости от резальтата 2025-11-12 21:40:57 +03:00
TotMaxim
87e360e1a9 После отладки, добавление индикации состояний эмс ячеек 2025-11-12 20:47:35 +03:00
lepshiy
5a7c719c56 Анимация кнопки "Запуск контроля". Доделать. 2025-11-12 16:36:05 +03:00
lepshiy
8754dcc7f0 Line separators - LF 2025-11-12 16:35:27 +03:00
MaD_CaT
64cbf59ac6 [PATCH] Доработка. При выполняемом сеансе помехи кнопка подавить красная (замечание "комиссии") 2025-11-12 16:34:04 +03:00
MaD_CaT
77b822f3b8 [PATCH] Доработка. Номер цели и номер сеанса помехи в заголовке таблиц теперь отображается значком (замечание "комиссии") 2025-11-12 16:25:48 +03:00
MaD_CaT
eb0978599a [PATCH] Исправление. Обновление состояния выполнения помехи по цели при программном снятии помехи. 2025-11-12 16:22:09 +03:00
MaD_CaT
51f3e961c1 [PATCH] Исправление. Учёт курса при снятии помехи со своей цели. 2025-11-12 16:19:24 +03:00
lepshiy
6fce003c59 Merge remote-tracking branch 'refs/remotes/kot/prd-control' 2025-11-12 09:26:35 +03:00
TotMaxim
2980aa9f15 корректировка объединений 2025-11-11 16:41:39 +03:00
TotMaxim
5b5b5d31c6 Merge remote-tracking branch 'origin/MAD_CAT' into prd-control
# Conflicts:
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/эмс2/эмс_тг.gd
#	scripts/signaller.gd
2025-11-11 16:37:37 +03:00
TotMaxim
1785d23e43 Подтянул прд-н и прд-к 2025-11-11 15:17:25 +03:00
TotMaxim
85c02f3f6c Отлажен прд-в гд, осталась проблема "обращение к удалённому элементу", мониторинг температур 2025-11-11 14:39:39 +03:00
MaD_CaT
3f469935bc Доработка. Колонка со статусом выполнения помехи для конкретной цели. (замечание комиссии) 2025-11-10 16:10:08 +03:00
TotMaxim
15be378743 состояние, где нужна отладка темепературы, мощности, модулей ФС 2025-11-10 14:00:04 +03:00
MaD_CaT
6ea649cf31 Доработка. Более яркий сектор для которого назначена помеха (замечание комиссии) 2025-11-10 12:15:10 +03:00
MaD_CaT
78b6f5a14e Доработка. При выполняемом сеансе помехи кнопка подавить красная (замечание комиссии) 2025-11-10 12:01:56 +03:00
MaD_CaT
1e500dec2c Доработка. Номер цели и номер сеанса помехи в заголовке таблиц теперь отображается значком (замечание комиссии) 2025-11-10 11:51:51 +03:00
MaD_CaT
6a5eae450c Исправление. Обновление состояния выполнения помехи по цели при программном снятии помехи. 2025-11-10 11:31:22 +03:00
MaD_CaT
f6ee2d95a4 Исправление. Учёт курса при снятии помехи со своей цели. 2025-11-10 11:05:05 +03:00
TotMaxim
94f0eccaa1 доработан переход из контроля и позицию приборов в сцене 2025-11-10 10:23:43 +03:00
kira-a-k
3ac243f420 Merge branch 'refs/heads/govno_style'
# Conflicts:
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/эмс2/эмс_тг.gd
2025-11-09 23:31:41 +03:00
kira-a-k
e7440a7eae Line separator - LF 2025-11-09 23:24:01 +03:00
kira-a-k
a886024662 Возврат видимости сцены и прогресса 2025-11-09 23:07:51 +03:00
kira-a-k
c6219254ed Положение приборов по сетке 2025-11-09 22:15:31 +03:00
TotMaxim
2d4fd57789 lineseparators 2025-11-09 22:14:58 +03:00
kira-a-k
fe7ef9a699 Merge remote-tracking branch 'refs/remotes/kotik/prd-control'
# Conflicts:
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/контроль/кнопка-прибора.gd
2025-11-09 20:44:11 +03:00
TotMaxim
71176c4869 Забрал изменения по выбору приборов + отредактировал положение индикаторов внешнее управление, состояния и тренажа 2025-11-09 16:18:31 +03:00
TotMaxim
36e47bbd13 Глобальное изменение: Параллеьный контроль. Новая ветка prd-control. Первый коммит инициализации. 2025-11-09 15:45:22 +03:00
kira-a-k
f3ee8965c0 Доработка контроля - выделение и выбор прибора по стрелкам 2025-11-08 16:54:29 +03:00
kira-a-k
9daae7b6b9 zalupa1 2025-11-08 13:37:26 +03:00
kira-a-k
f002e9125e zalupa 2025-11-08 13:31:48 +03:00
MaD_CaT
cebf645e4d Godot4. Исправление сепараторов на LF 2025-11-08 12:18:38 +03:00
MaD_CaT
9720726d91 [PATCH] Доработка. Подсчёт опасных целей 1 раз в секунду. 2025-11-08 11:16:06 +03:00
MaD_CaT
06e909ad9c [PATCH] Доработка. Изменение кодов состояния выполнения помехи для 5П-28 2025-11-08 11:09:45 +03:00
MaD_CaT
16ca216bdd [PATCH] Доработка. Добавлено отображение информации от Трассы на экране ЭМС ТГ. 2025-11-08 11:07:54 +03:00
sasha80
91b79266df Доработка. Рефактор 2025-11-08 11:04:31 +03:00
sasha80
379504994c Доработка. Скрипт для отладки 2025-11-08 11:04:11 +03:00
sasha80
1fc284939c Доработка. Цели с распознанным протоколом выделить цветом 2025-11-06 21:39:52 +03:00
MaD_CaT
77e15627d0 Доработка. Подсчёт опасных целей 1 раз в секунду. 2025-11-06 12:41:46 +03:00
MaD_CaT
effbbb9272 Доработка. Изменение кодов состояния выполнения помехи для 5П-28 2025-11-05 12:28:33 +03:00
MaD_CaT
56343338c2 Доработка. Добавлено отображение информации от Трассы на экране ЭМС ТГ. 2025-11-05 11:22:49 +03:00
sasha80
10fca2d34c Доработка. В процессе. Статическая проверка 2025-11-04 23:35:08 +03:00
sasha80
3bff1cd90f Доработка. Статическая проверка 2025-11-04 15:33:24 +03:00
lepshiy
5657892887 Трасса - кластер 2025-11-01 15:21:59 +03:00
lepshiy
606f5ea689 Merge remote-tracking branch 'refs/remotes/Sasha/master' 2025-10-28 15:33:29 +03:00
lepshiy
6c62419bdb Экран ЭМС ТГ - картинки 2025-10-28 11:10:57 +03:00
sasha80
5991a079c7 Доработка. Важное пояснение 2025-10-24 16:14:29 +03:00
sasha80
2a29e4bd54 Доработка. Важное пояснение 2025-10-24 16:05:42 +03:00
43 changed files with 1575 additions and 221 deletions

View File

@@ -36,3 +36,4 @@
- После клонирования запустить скрипт `git-hooks-config.sh`
- В среде **Windows** запуск скрипта `git-hooks-config.sh` производить из оболочки `git bash`
- Нужно обновить `settings.json`
- поиск циклических зависимостей (не реализованно)

164
check-graph.py Normal file
View File

@@ -0,0 +1,164 @@
# -*- coding: utf-8 -*-
import os
import re
import networkx as nx
# pip install networkx plotly numpy scipy
def build_class_graph(directory):
"""Builds a directed acyclic graph of class dependencies."""
# Create a graph to store the dependencies
graph = nx.DiGraph()
dependencies = {}
# Find all .gd files in the directory
for root, dirs, files in os.walk(directory):
for file in files:
if not file.endswith(".gd"):
continue
file_path = os.path.join(root, file)
# Find the class name in the file
with open(file_path, "r", encoding="utf-8") as f:
contents = f.read()
match = re.search(r"^class_name\s+(\w+)", contents, re.MULTILINE)
if not match:
continue
class_name = match.group(1)
graph.add_node(class_name)
# Find the dependencies of the class
for dep_match in re.finditer(
r"^\s*extends\s+(\w+)", contents, re.MULTILINE
):
dep_name = dep_match.group(1)
graph.add_edge(class_name, dep_name)
# Find all uses of the class name in other files
for root2, dirs2, files2 in os.walk(directory):
for file2 in files2:
if not file2.endswith(".gd"):
continue
if file_path == os.path.join(root2, file2):
continue
with open(os.path.join(root2, file2), "r", encoding="utf-8") as f2:
contents2 = f2.read()
if re.search(rf"\b{class_name}\b", contents2):
print(
file2.ljust(30, " "),
f"--> class_name {class_name}".ljust(50, " "),
f" from {file}",
)
graph.add_edge(class_name, file2)
dependencies[file2] = file
pos = nx.planar_layout(graph)
# Set the node positions in the graph
nx.set_node_attributes(graph, pos, "pos")
return graph, dependencies
def debug_graph(graph):
"""Builds and visualizes a graph of class dependencies in the directory."""
import plotly.graph_objects as go
# Create the plotly figure
fig = go.Figure()
# Add the nodes to the figure
for node in graph.nodes():
x, y = graph.nodes[node]["pos"]
fig.add_trace(
go.Scatter(
x=[x],
y=[y],
text=[node],
hovertext=[f"Class: {node}"],
mode="markers",
marker=dict(
symbol="circle", size=20, line=dict(width=1, color="black"),
),
name=node,
)
)
# Add the edges to the figure
for edge in graph.edges():
x0, y0 = graph.nodes[edge[0]]["pos"]
x1, y1 = graph.nodes[edge[1]]["pos"]
fig.add_trace(
go.Scatter(
x=[x0, x1],
y=[y0, y1],
text=[f"{edge[0]} -> {edge[1]}", ""],
hovertext=[f"Depends on: {edge[1]}", ""],
mode="lines+markers+text",
line=dict(width=2, color="black"),
marker=dict(size=0),
textposition="middle right",
showlegend=True,
)
)
# Customize the layout and style of the figure
fig.update_layout(
title="Class Dependency Graph",
title_font_size=24,
margin=dict(l=20, r=20, t=50, b=20),
hovermode="closest",
plot_bgcolor="white",
showlegend=True,
)
# Show the figure
fig.show()
def find_circular_dependencies(dependencies):
"""Finds circular dependencies between classes in the directory."""
circular_dependencies = []
for file, dependency in dependencies.items():
visited = set()
path = [file]
while dependency and dependency not in visited:
visited.add(dependency)
path.append(dependency)
dependency = dependencies.get(dependency)
# Circular check
if dependency in path:
start_index = path.index(dependency)
circular_dependency = path[start_index:]
if circular_dependency not in circular_dependencies:
circular_dependencies.append(circular_dependency)
break
# Convert circular_dependencies to dependency paths
dependency_paths = []
for circular_dependency in circular_dependencies:
dependency_path = " -> ".join(circular_dependency)
dependency_paths.append(dependency_path)
return dependency_paths
# Example usage
graph, dependencies = build_class_graph("./")
debug_graph(graph)
circular_deps = find_circular_dependencies(dependencies)
print("----------------------------------")
if circular_deps:
print(" Circular dependencies found!")
for dep in circular_deps:
print("\t", dep)
else:
print(" No circular dependencies found.")
print("----------------------------------")

View File

@@ -0,0 +1,219 @@
{
"device_constants": {
"PRD_N": {
"constants": {
"POWER_UKP_1": 31,
"POWER_UKP_2": 63,
"DKM_BIT_2": 1,
"DKM_BIT_3": 2,
"BASE_ADDR_EMS_G": 288,
"ADDR_UG_LITERA_1": 262,
"ADDR_UG_LITERA_2": 264,
"ADDR_UG_LITERA_3": 266,
"TEMP_THRESHOLD": 70,
"POWER_THRESHOLD": 40,
"RAY_DOU_NUM": 3,
"ATT_UM_2": 2,
"ATT_UM_3": 3,
"POWER_UM": 100,
"TIMER_DELAY": 10.0,
"STATE_MASHINE_TIMER": 0.3
},
"pribor_config": {
"1н": {"angle": 0.0, "sectors": [4, 8]},
"2н": {"angle": 90.0, "sectors": [7, 11]},
"3н": {"angle": 180.0, "sectors": [6, 10]},
"4н": {"angle": 270.0, "sectors": [5, 9]}
},
"fs_params": {
"2": {"freq": 932.0, "width": 100.0},
"3": {"freq": 1157.0, "width": 100.0}
},
"start_litera": 2,
"progress_max": 20
},
"PRD_V": {
"constants": {
"POWER_UKP_1": 31,
"POWER_UKP_2": 63,
"DKM_BIT_4": 3,
"DKM_BIT_5": 4,
"BASE_ADDR_EMS_G": 288,
"ADDR_UG_LITERA_1": 262,
"ADDR_UG_LITERA_2": 264,
"ADDR_UG_LITERA_3": 266,
"TEMP_THRESHOLD": 70,
"POWER_THRESHOLD": 40,
"RAY_DOU_NUM": 3,
"ATT_UM_4": 2,
"ATT_UM_5": 3,
"POWER_UM": 100,
"TIMER_DELAY": 10.0,
"STATE_MASHINE_TIMER": 0.3
},
"pribor_config": {
"1в": {"angle": 0.0, "sectors": [12, 16]},
"2в": {"angle": 90.0, "sectors": [15, 19]},
"3в": {"angle": 180.0, "sectors": [14, 18]},
"4в": {"angle": 270.0, "sectors": [13, 17]}
},
"fs_params": {
"4": {"freq": 1227.0, "width": 100.0},
"5": {"freq": 1575.0, "width": 110.0}
},
"start_litera": 4,
"progress_max": 20
},
"PRD_K": {
"constants": {
"POWER_UKP_1": 31,
"POWER_UKP_2": 63,
"DKM_BIT_1": 0,
"DKM_BIT_6": 5,
"DKM_BIT_7": 6,
"BASE_ADDR_EMS_G": 288,
"ADDR_UG_LITERA_1": 262,
"ADDR_UG_LITERA_2": 264,
"ADDR_UG_LITERA_3": 266,
"TEMP_THRESHOLD": 40,
"POWER_THRESHOLD": 40,
"RAY_DOU_NUM": 3,
"ATT_UM_1": 0,
"ATT_UM_6": 3,
"ATT_UM_7": 2,
"POWER_UM": 100,
"TIMER_DELAY": 10.0,
"STATE_MASHINE_TIMER": 0.3
},
"pribor_config": {
"1к": {"angle": 0.0, "sectors": [0, 20, 24]},
"2к": {"angle": 90.0, "sectors": [3, 23, 27]},
"3к": {"angle": 180.0, "sectors": [2, 22, 26]},
"4к": {"angle": 270.0, "sectors": [1, 21, 25]}
},
"fs_params": {
"1": {"freq": 450.0, "width": 80.0},
"6": {"freq": 2450.0, "width": 110.0},
"7": {"freq": 4750.0, "width": 110.0}
},
"start_litera": 1,
"progress_max": 30
}
},
"base_configs": {
"block_ip": {
"maa2000_1": [0, false],
"maa2000_2": [1, false],
"ip9_50_1": [2, false],
"ip9_50_2": [3, false],
"ip12_50_1": [4, false],
"ip5_25": [7, false]
},
"block_kasseta": {
"yau07": false,
"ems": false,
"ug": false,
"ukp1": false,
"ukp2": false
}
},
"device_configs": {
"PRD_N": {
"block_ip": "base",
"block_kasseta": "base",
"control_results": {
"block_ip": false,
"temperature": true,
"dkm_2": false,
"dkm_3": false,
"dou_2": false,
"dou_3": false,
"fs_2": 0,
"fs_3": 0
}
},
"PRD_V": {
"block_ip": "base",
"block_kasseta": "base",
"control_results": {
"block_ip": false,
"temperature": true,
"dkm_4": false,
"dkm_5": false,
"dou_4": false,
"dou_5": false,
"fs_4": 0,
"fs_5": 0
}
},
"PRD_K": {
"block_ip": {
"maa2000_1": [0, false],
"maa2000_2": [1, false],
"ip9_50_1": [2, false],
"ip9_50_2": [3, false],
"ip12_50_1": [4, false],
"ip9_50_3": [5, false],
"ip12_50_2": [6, false],
"ip5_25": [7, false]
},
"block_kasseta": "base",
"control_results": {
"block_ip": false,
"temperature": true,
"dkm_1": false,
"dkm_6": false,
"dkm_7": false,
"dou_6": false,
"dou_7": false,
"fs_1": 0,
"fs_6": 0,
"fs_7": 0
}
}
},
"ray_types": ["RAY_m5", "RAY_5", "RAY_15", "RAY_25", "RAY_35", "RAY_45"],
"data_indices": {
"STATUS_BOARD": 0,
"IN_BLANK_PRD": 1,
"IN_IMPULS_PRD": 7,
"OUT_BLANK_PRD": 13,
"OUT_IMPULS_PRD": 19,
"DRY_CONTACT": 27,
"DKM": 28,
"POWER_UKP_1": 31,
"TEMPERATURE_UKP_1": 47,
"POWER_UKP_2": 63,
"TEMPERATURE_UKP_2": 79
},
"fs_keys": {
"1": "fs_1",
"2": "fs_2",
"3": "fs_3",
"4": "fs_4",
"5": "fs_5",
"6": "fs_6",
"7": "fs_7"
},
"temperature_constants": {
"CONST_MIN_TEMP": -25,
"MAXIMUM_CODE_ADC": 3796,
"MINIMUM_CODE_AD": 2660,
"TEMPERATURE_UKP_1": 47,
"TEMPERATURE_UKP_2": 79
},
"ems_input_bits_config": {
"PRD_N": {"bit1": 9, "bit2": 10},
"PRD_V": {"bit1": 11, "bit2": 12},
"PRD_K": {"bit1": 13, "bit2": 14, "bit_lit": 8}
},
"fs_rules":[
{"key": "fs_1", "min": 0, "max": 4},
{"key": "fs_2", "min": 4, "max": 8},
{"key": "fs_3", "min": 8, "max": 12},
{"key": "fs_4", "min": 12, "max": 16},
{"key": "fs_5", "min": 16, "max": 20},
{"key": "fs_6", "min": 20, "max": 24},
{"key": "fs_7", "min": 24, "max": 27}
]
}

2
generate-sertificate.sh Normal file
View File

@@ -0,0 +1,2 @@
#openssl req -x509 -newkey rsa:4096 -keyout key.pem -nodes -out cert.pem -sha256 -days 365 -subj "/C=RU/ST=NTC/L=TNIIS/O=Company Name/OU=Org/CN=www.example.com"
openssl req -new -x509 -keyout "html/server.pem" -out "html/server.pem" -days 365 -nodes

17
https-server.py Normal file
View File

@@ -0,0 +1,17 @@
#!/usr/bin/env python3
from http import server # Python 3
import ssl
import os
class MyHTTPRequestHandler(server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if __name__ == '__main__':
html_dir = os.path.join(os.path.dirname(__file__), 'html')
os.chdir(html_dir)
srv = server.HTTPServer(('', 8000), MyHTTPRequestHandler)
sdc = ssl.create_default_context()
srv.serve_forever()

View File

@@ -28,7 +28,7 @@ interfer/center_offset=Vector2(200, 225)
interfer/default_color0=Color(0.38, 0.47, 0.51, 1)
interfer/default_color1=Color(0.39, 0.44, 0.5, 1)
interfer/select_color=Color(1, 1, 1, 1)
interfer/interfer_color=Color(0.58, 0.47, 0.51, 1)
interfer/interfer_color=Color(0.9, 0.1, 0.25, 0.9)
interfer/resend_timeout=1000.0
config/external_cu=false
config/unit_rr_request_period=20.0
@@ -36,7 +36,7 @@ config/kems_files_path="user://kems/"
config/emsg_files_path="user://emsg/"
config/settings_path="user://settings.json"
config/unit_bpo_request_period=20.0
interfer/emit_color=Color(0.58, 0.471, 0.51, 0.2)
interfer/emit_color=Color(0.9, 0.1, 0.25, 0.5)
interfer/closed_sectors=Color(0, 0, 0, 1)
[autoload]

View File

@@ -6,6 +6,10 @@ var selected: bool
func set_track_visible(value: bool): $track.visible = value
## Задаёт цвет точки
func set_bip_color(val: Color): $bip.set_instance_shader_parameter('color', val)
## Присваивает заданное значение видимости индикатору выполнения.
func set_ecm_visible(value: bool): $ecm_done.visible = value

View File

@@ -35,8 +35,10 @@ func get_radius_outter() -> float: return material.get('shader_parameter/radius
func get_radius_inner_0() -> float: return material.get('shader_parameter/radius_inner_0')
func get_radius_inner_1() -> float: return material.get('shader_parameter/radius_inner_1')
func get_band_colors(val: Array): return material.get('shader_parameter/ant_band_c')
func get_band_failures(val: Array): return material.get('shader_parameter/ant_band_m')
func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)
func set_band_failures(val: Array): material.set('shader_parameter/ant_band_m', val)
## Добавляет сектор запрета[br]
## [param id] - Индекс сектора запрета.[br]

View File

@@ -7,8 +7,8 @@ const TableHeader = preload('res://table/header.tscn') ## Ячейка за
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда.
const TABLE_HEADERS_TEXT = ['Номер', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 75, 100, 90, 170 ] ## Ширины колонок.
const TABLE_HEADERS_TEXT = ['', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 65, 100, 90, 170 ] ## Ширины колонок.
## Состояние выполнения сеанса помехи
const INTERFER_STATE = {
@@ -122,7 +122,8 @@ func on_interfer_new(ecm, table_index):
# Будем надеяться, что отложенные вызовы производятся в том же порядке
$table.call_deferred('clear_rows_selected')
$table.call_deferred('set_row_selected', i_row, true)
signaller.emit_signal('interfer_selected', ecm)
if not interfer.auto_enabled:
signaller.emit_signal('interfer_selected', ecm)
func on_interfer_off(ecm, table_index):

View File

@@ -0,0 +1,23 @@
[gd_scene load_steps=2 format=3 uid="uid://d012h4hxf2anf"]
[ext_resource type="Texture2D" uid="uid://b3woliae871je" path="res://data/отметка-неопред.png" id="1_0a4l0"]
[node name="emit-led" type="Control"]
layout_mode = 3
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="texture-led" type="TextureButton" parent="."]
visible = false
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 26.0
offset_top = 11.0
offset_right = 3.0
offset_bottom = -12.0
grow_horizontal = 2
grow_vertical = 2
texture_normal = ExtResource("1_0a4l0")

View File

@@ -35,5 +35,5 @@ script = ExtResource("2_empn3")
[node name="table" type="GridContainer" parent="scroll"]
layout_mode = 2
columns = 4
columns = 5
script = ExtResource("3_4bupu")

View File

@@ -5,14 +5,16 @@ class_name scroll_threats extends ScrollContainer
const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ## Ячейка заголовок таблицы.
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, EmitLed ] ## Описание ряда.
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto', 'emit' ] ## Параметры цели отображаемые в таблице.
const TABLE_HEADERS_TEXT = ['', 'Пеленг', 'Частота, МГц', 'Протокол', 'Помеха' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 65, 70, 110, 140, 65] ## Ширины колонок.
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader ] ## Описание ряда заголовка.
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit ] ## Описание ряда.
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto' ] ## Параметры цели отображаемые в таблице.
const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Частота, МГц', 'Протокол' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 65, 145, 145, 90 ] ## Ширины колонок.
const TABLE_TEXT_ROWS = 4
const EMIT_STATE_COL = 4
## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()
@@ -63,6 +65,17 @@ func on_threat_update(th, table_index: Dictionary):
var row = map_th_to_row(th)
var i_row = table_index[th.id]
$table.set_row_text(i_row, row)
var emit_node = $table.get_node2(EMIT_STATE_COL, i_row)
var emit_txr = emit_node.get_node('texture-led')
if th.emit_state == 0:
emit_txr.visible = false
elif th.emit_state == 1:
emit_txr.visible = true
emit_txr.self_modulate = Color.ORANGE
elif th.emit_state == 2:
emit_txr.visible = true
emit_txr.self_modulate = Color.RED
## Обрабатывает сигнал [b]threat_lost[/b].
@@ -78,7 +91,7 @@ func on_threat_new(th, table_index):
$table.add_row(TABLE_ROW)
var row = map_th_to_row(th)
$table.set_row_text(i_row, row)
$table.set_row_editable(i_row, false)
disable_edit($table, TABLE_TEXT_ROWS, i_row)
$table.set_node_user_data(0, i_row, th)
table_index[th.id] = i_row
@@ -86,10 +99,11 @@ func on_threat_new(th, table_index):
## Преобразует цель в строку таблицы.
func map_th_to_row(th) -> Array:
var row: = Array()
row.resize(TABLE_COLUMN_PARAM.size())
row.resize(TABLE_TEXT_ROWS)
var i_col: int = 0
for param_name in TABLE_COLUMN_PARAM:
var val = th.get(param_name)
if val == null: continue
row[i_col] = '%0.1f' % val if val is float else '%s' % val
if not th.fflags[param_name]:
row[i_col] = ''
@@ -104,3 +118,13 @@ func on_rto_threat_sel(th_id, tbl):
if node.text.to_int() == th_id:
row_pressed(i)
break
## Отключает возможность редактирования LineEdit в таблице.[br]
## [param tbl] - таблица,[br]
## [param num_col] - номер колонки,[br]
## [param i_row] - номер столбца.[br]
func disable_edit(tbl, num_col: int, i_row: int):
for col in num_col:
var node: LineEdit = tbl.get_node2(col, i_row)
node.editable = false

View File

@@ -1 +1 @@
uid://b5ykwyk5vpi6
uid://b5ykwyk5vpi6

View File

@@ -47,11 +47,10 @@ theme_override_styles/tab_focus = SubResource("StyleBoxEmpty_41d34")
theme_override_styles/tab_disabled = SubResource("StyleBoxEmpty_cw2ss")
theme_override_styles/tabbar_background = SubResource("StyleBoxEmpty_nmdfd")
theme_override_styles/panel = SubResource("StyleBoxEmpty_vap7n")
current_tab = 3
current_tab = 0
script = ExtResource("1_fg0vd")
[node name="Работа" parent="tab_switch" instance=ExtResource("2_u7p16")]
visible = false
layout_mode = 2
metadata/_tab_index = 0
@@ -66,6 +65,7 @@ layout_mode = 2
metadata/_tab_index = 2
[node name="ЭМС" parent="tab_switch" instance=ExtResource("5_u71bh")]
visible = false
layout_mode = 2
metadata/_tab_index = 3
@@ -95,15 +95,13 @@ script = ExtResource("8_tidwt")
metadata/_edit_lock_ = true
[node name="remote_control" type="Label" parent="."]
visible = false
layout_mode = 2
offset_left = 1358.0
offset_right = 1501.0
offset_left = 1244.0
offset_right = 1401.0
offset_bottom = 27.0
tooltip_text = "Комплекс находится под внешним управлением"
mouse_filter = 0
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 14
theme_override_styles/normal = SubResource("StyleBoxFlat_o1r22")
text = "Внешнее управление"
horizontal_alignment = 1

View File

@@ -1,11 +1,11 @@
extends Button
func _ready():
connect("toggled", Callable(self, "_on_button_toggled"))
func _on_button_toggled(mode: bool):
if mode:
tooltip_text = "Режим \"Тренаж\" задействован\nТекущее состояние: включено"
else:
tooltip_text = "Задейстовать режим \"Тренаж\"\nТекущее состояние: отключено"
extends Button
func _ready():
connect("toggled", Callable(self, "_on_button_toggled"))
func _on_button_toggled(mode: bool):
if mode:
tooltip_text = "Режим \"Тренаж\" задействован\nТекущее состояние: включено"
else:
tooltip_text = "Задейстовать режим \"Тренаж\"\nТекущее состояние: отключено"

View File

@@ -1 +1 @@
uid://roajn6c6wvc1
uid://roajn6c6wvc1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://ce5mtxqd1ndru"]
[ext_resource type="Texture2D" uid="uid://cgqo5gucd2be0" path="res://scenes/tilemap/dot.png" id="2_rq0y0"]
[ext_resource type="Texture2D" uid="uid://cgqo5gucd2be0" path="res://data/dot.png" id="2_rq0y0"]
[node name="rect" type="TextureRect"]
offset_left = -16.0

View File

@@ -1,8 +1,7 @@
[gd_scene load_steps=2 format=3 uid="uid://c2523fcn14gn4"]
[ext_resource type="Texture2D" uid="uid://cj1f2uy6qfvki" path="res://scenes/tilemap/23900.png" id="1_v0nwa"]
[ext_resource type="Texture2D" uid="uid://cj1f2uy6qfvki" path="res://data/23900.png" id="1_v0nwa"]
[node name="23900" type="Sprite2D"]
rotation = 4.71239
scale = Vector2(0.496934, 0.496934)
texture = ExtResource("1_v0nwa")

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://cv342kc1jj5hb"]
[ext_resource type="Texture2D" uid="uid://mobingoxskg1" path="res://scenes/tilemap/threat.png" id="1_pvxsy"]
[ext_resource type="Texture2D" uid="uid://mobingoxskg1" path="res://data/threat.png" id="1_pvxsy"]
[node name="Threat" type="Sprite2D"]
scale = Vector2(0.0244268, 0.0244268)

View File

@@ -727,7 +727,7 @@ func blend_mask(val: bool) -> void:
func update_coordinates_label(lon: float, lat: float) -> void:
coordinates_label = 'Координаты:\nNS:%f\nEW:%f' % [lat, lon]
coordinates_label = 'Координаты: NS:%f, EW:%f' % [lat, lon]
signaller.emit_signal('update_coordinates_map', coordinates_label)

View File

@@ -0,0 +1,80 @@
extends Button
var base_style: StyleBoxFlat
var tween
var pulsing: bool = false
var original_text: String
func _ready():
original_text = text
_setup_styles()
_setup_signals()
func _setup_styles() -> void:
if get("theme_override_styles/disabled") == null:
base_style = StyleBoxFlat.new()
base_style.border_color = Color(1.0, 0.5, 0.0)
base_style.border_width_top = 4
base_style.border_width_bottom = 4
base_style.border_width_left = 4
base_style.border_width_right = 4
base_style.bg_color = Color(0.2, 0.2, 0.2)
set("theme_override_styles/disabled", base_style)
else:
base_style = get("theme_override_styles/disabled")
set("theme_override_colors/font_disabled_color", Color(1.0, 1.0, 1.0))
func _setup_signals() -> void:
connect("pressed", Callable(self, "_on_pressed"))
if not signaller:
return
var signals_to_connect := ["режим_работа", "режим_журнал", "режим_эмс", "режим_настройки", "режим_контроль"]
for signal_name in signals_to_connect:
if signaller.has_signal(signal_name):
signaller.connect(signal_name, Callable(self, "_on_status_change"))
func _on_pressed():
disabled = true
text = "Идет выполнение контроля"
_start_pulse()
func _start_pulse():
if pulsing:
return
pulsing = true
tween = create_tween()
tween.set_loops()
var color1 = Color(1.0, 0.5, 0.0) # оранжевый
var color2 = Color(0.4, 0.4, 0.4) # серый
tween.tween_property(base_style, "border_color", color2, 0.5)\
.set_trans(Tween.TRANS_SINE)\
.set_ease(Tween.EASE_IN_OUT)
tween.tween_property(base_style, "border_color", color1, 0.5)\
.set_trans(Tween.TRANS_SINE)\
.set_ease(Tween.EASE_IN_OUT)
func _stop_pulse():
if tween:
tween.kill()
tween = null
base_style.border_color = Color(1.0, 0.5, 0.0)
pulsing = false
disabled = false
text = original_text
tooltip_text = ''
func _on_status_change():
_stop_pulse()
func _exit_tree() -> void:
if tween:
tween.kill()

View File

@@ -0,0 +1 @@
uid://xjs7owe2iexn

View File

@@ -0,0 +1,410 @@
[gd_scene load_steps=15 format=3 uid="uid://ffi1njkjceb5"]
[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="1_uojqc"]
[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="2_a8ar3"]
[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="3_xwd13"]
[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_eobkx"]
[ext_resource type="Texture2D" uid="uid://00871pb6moln" path="res://data/прогресс-фон-1.png" id="5_mg57e"]
[ext_resource type="Texture2D" uid="uid://c1k856fxhrjnh" path="res://data/прогресс-заполнение-1.png" id="6_of7rd"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3nd2u"]
[sub_resource type="GDScript" id="GDScript_oj3k3"]
script/source = "@tool
class_name blok_v extends PanelContainer
@export var textures: Array
@export var animation_duration: float = 1.5
signal pressed(control: PanelContainer)
## Значения уровней
@export var value0: Array:
set(v):
value0.assign(v)
var items: Array = get_level_nodes()
var count: int = min(items.size(), v.size())
for i in count:
set_value0_animated(items[i], v[i])
## Значение уровня
@export var value1: float:
set(v):
value1 = v
if not is_inside_tree():
return
$margin/vbox/grid1/level7.value = v
$margin/vbox/grid1/level7.tint_progress = Color.RED if v >= 50 else Color.GOLD if v >= 40 else Color.WHITE
@export var min_value0: float:
set(v):
min_value0 = v
var items: = get_level_nodes()
set_group_param(items, 'min_value', v)
@export var min_value1: float:
set(v):
min_value1 = v
if not is_inside_tree():
return
$margin/vbox/grid1/level7.min_value = v
@export var max_value0: float:
set(v):
max_value0 = v
var items: = get_level_nodes()
set_group_param(items, 'max_value', v)
@export var max_value1: float:
set(v):
max_value1 = v
if not is_inside_tree():
return
$margin/vbox/grid1/level7.max_value = v
@export var step0: float:
set(v):
step0 = v
var items: = get_level_nodes()
set_group_param(items, 'step', v)
@export var step1: float:
set(v):
step1 = v
if not is_inside_tree():
return
$margin/vbox/grid1/level7.step = v
@export var value_name0: String:
set(v):
value_name0 = v
var items: Array = get_name_nodes()
set_group_param(items, 'text', v)
@export var value_name1: String:
set(v):
value_name1 = v
if not is_inside_tree():
return
$margin/vbox/grid2/lbl7.text = v
@export var fname: String:
set(v):
fname = v
if not is_inside_tree():
return
$margin/vbox/grid0/fname.text = v
@export var rname: String:
set(v):
rname = v
if not is_inside_tree():
return
$margin/vbox/grid0/rname.text = v
@export var state: int:
set(v):
state = tools.clip_value(v, 0, textures.size() - 1)
if not is_inside_tree():
return
$margin/vbox/grid0/state.texture = textures[state]
@export var alignment: int:
set(v):
alignment = v
if is_inside_tree():
$margin/vbox.alignment = v
@export var value0_info: String:
set(v):
value0_info = v
@export var value1_info: String:
set(v):
value1_info = v
func _on_button_pressed(): emit_signal('pressed', self)
func set_value0(value: Array): value0.assign(value)
func _enter_tree() -> void: call_deferred('_enter_tree_defered')
func _ready():
var items: Array = get_level_nodes()
for item in items:
item.connect('value_changed', on_level_changed.bind(item, value0_info))
on_level_changed(item.value, item, value0_info)
var level7: = $margin/vbox/grid1/level7
level7.connect('value_changed', on_level_changed.bind(level7, value1_info))
on_level_changed(level7.value, level7, value1_info)
func on_level_changed(_val: float, item: TextureProgressBar, info: String):
item.tooltip_text = '%s\\nТекущее: %0.2f\\nДиапазон: %0.2f…%0.2f' % [info, item.value, item.min_value, item.max_value]
func set_group_param(items: Array, param: StringName, v) -> void:
if not is_inside_tree():
return
if not get_tree():
return
for i in items.size():
items[i].set(param, v)
func set_value0_by_index(index: int, value: float) -> void:
var items: Array = get_level_nodes()
items[index].value = value
func _enter_tree_defered():
var items: Array = get_level_nodes()
var count: int = min(items.size(), value0.size())
for i in count:
items[i].min_value = min_value0
items[i].max_value = 1400 # max_value0: TODO для отладки
items[i].step = step0
items = get_name_nodes()
set_group_param(items, 'text', value_name0)
if is_inside_tree():
$margin/vbox/grid1/level7.value = value1
$margin/vbox/grid1/level7.min_value = min_value1
$margin/vbox/grid1/level7.max_value = max_value1
$margin/vbox/grid1/level7.step = step1
$margin/vbox/grid2/lbl7.text = value_name1
$margin/vbox.alignment = alignment
$margin/vbox/grid0/rname.text = rname
$margin/vbox/grid0/fname.text = fname
$margin/vbox/grid0/state.texture = textures[state]
func get_level_nodes() -> Array:
if not is_inside_tree():
return []
if not get_tree():
return []
return [$margin/vbox/grid1/level1]
func get_name_nodes() -> Array:
if not is_inside_tree():
return []
if not get_tree():
return []
return [$margin/vbox/grid2/lbl1]
func set_value0_animated(target_node, target_value: float) -> void:
var tween: Tween = create_tween()
tween.set_ease(Tween.EASE_OUT)
tween.set_trans(Tween.TRANS_QUINT)
tween.tween_property(target_node, 'value', target_value, animation_duration)
"
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rceim"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8yvwo"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6qu57"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mlxje"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3dspb"]
[sub_resource type="GDScript" id="GDScript_45hqb"]
script/source = "@tool
extends MarginContainer
func _enter_tree() -> void:
margins = [8, 8, 8, 8]
@export var margins: Array:
set(vals):
add_theme_constant_override('margin_top', vals[0])
add_theme_constant_override('margin_left', vals[1])
add_theme_constant_override('margin_bottom', vals[2])
add_theme_constant_override('margin_right', vals[3])
get:
var vals = [0, 0, 0, 0]
vals[0] = get_theme_constant('margin_top')
vals[1] = get_theme_constant('margin_left')
vals[2] = get_theme_constant('margin_bottom')
vals[3] = get_theme_constant('margin_right')
return vals
"
[node name="блок-к" type="PanelContainer"]
editor_description = "Элемент замены из ЗИП"
offset_right = 160.0
offset_bottom = 88.0
theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u")
script = SubResource("GDScript_oj3k3")
textures = [ExtResource("1_uojqc"), ExtResource("2_a8ar3"), ExtResource("3_xwd13")]
value0 = [20.0, 30.0, 40.0, 50.0, 60.0, 70.0]
value1 = -40.0
min_value1 = -40.0
max_value0 = 1400.0
max_value1 = 55.0
step0 = 1.0
step1 = 1.0
value_name0 = "P,%"
value_name1 = "°C"
fname = "Блок В"
rname = "A1"
[node name="button" type="Button" parent="."]
layout_mode = 2
theme_override_styles/focus = SubResource("StyleBoxEmpty_rceim")
theme_override_styles/disabled = SubResource("StyleBoxEmpty_8yvwo")
theme_override_styles/hover = SubResource("StyleBoxEmpty_6qu57")
theme_override_styles/pressed = SubResource("StyleBoxEmpty_mlxje")
theme_override_styles/normal = SubResource("StyleBoxEmpty_3dspb")
[node name="rect" type="NinePatchRect" parent="."]
layout_mode = 2
texture = ExtResource("4_eobkx")
draw_center = false
region_rect = Rect2(0, 0, 63, 63)
patch_margin_left = 17
patch_margin_top = 17
patch_margin_right = 17
patch_margin_bottom = 15
[node name="margin" type="MarginContainer" parent="."]
layout_mode = 2
theme_override_constants/margin_left = 8
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 8
theme_override_constants/margin_bottom = 8
script = SubResource("GDScript_45hqb")
margins = [8, 8, 8, 8]
[node name="vbox" type="VBoxContainer" parent="margin"]
layout_mode = 2
[node name="grid0" type="GridContainer" parent="margin/vbox"]
layout_mode = 2
columns = 3
[node name="state" type="TextureRect" parent="margin/vbox/grid0"]
custom_minimum_size = Vector2(24, 24)
layout_mode = 2
size_flags_horizontal = 2
size_flags_vertical = 6
texture = ExtResource("1_uojqc")
expand_mode = 1
[node name="fname" type="Label" parent="margin/vbox/grid0"]
self_modulate = Color(1, 1, 1, 0.627451)
custom_minimum_size = Vector2(0, 20)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_font_sizes/font_size = 17
text = "Блок В"
horizontal_alignment = 1
vertical_alignment = 1
[node name="rname" type="Label" parent="margin/vbox/grid0"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 6
theme_override_font_sizes/font_size = 18
text = "A1"
horizontal_alignment = 2
vertical_alignment = 1
[node name="grid1" type="GridContainer" parent="margin/vbox"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 3
columns = 7
[node name="level1" type="TextureProgressBar" parent="margin/vbox/grid1" groups=["уровни"]]
custom_minimum_size = Vector2(30, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00
Диапазон: 0.00…1400.00"
mouse_filter = 0
max_value = 1400.0
fill_mode = 3
nine_patch_stretch = true
stretch_margin_left = 8
stretch_margin_top = 8
stretch_margin_right = 8
stretch_margin_bottom = 8
texture_under = ExtResource("5_mg57e")
texture_progress = ExtResource("6_of7rd")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="level7" type="TextureProgressBar" parent="margin/vbox/grid1"]
custom_minimum_size = Vector2(30, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: -40.00
Диапазон: -40.00…60.00"
mouse_filter = 0
min_value = -40.0
max_value = 55.0
value = -40.0
fill_mode = 3
nine_patch_stretch = true
stretch_margin_left = 8
stretch_margin_top = 8
stretch_margin_right = 8
stretch_margin_bottom = 8
texture_under = ExtResource("5_mg57e")
texture_progress = ExtResource("6_of7rd")
tint_under = Color(0.890196, 0.486275, 0.196078, 1)
tint_over = Color(0.890196, 0.486275, 0.196078, 1)
[node name="grid2" type="GridContainer" parent="margin/vbox"]
clip_contents = true
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
columns = 7
[node name="lbl1" type="Label" parent="margin/vbox/grid2" groups=["названия"]]
clip_contents = true
custom_minimum_size = Vector2(30, 0)
layout_mode = 2
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 8
text = "P,%"
horizontal_alignment = 1
[node name="lbl7" type="Label" parent="margin/vbox/grid2"]
clip_contents = true
custom_minimum_size = Vector2(30, 0)
layout_mode = 2
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 8
text = "°C"
horizontal_alignment = 1
[connection signal="pressed" from="button" to="." method="_on_button_pressed"]

View File

@@ -5,7 +5,23 @@ extends TextureButton
@export var state_colors: Array
func _on_toggled(toggled_on): $frame.visible = toggled_on
func _enter_tree() -> void: $label.self_modulate = state_colors[state]
func _enter_tree() -> void:
$label.self_modulate = state_colors[state]
ProjectSettings.connect('settings_changed', _on_settings_changed)
func _exit_tree() -> void:
ProjectSettings.disconnect('settings_changed', _on_settings_changed)
func _on_settings_changed():
if not is_inside_tree(): return
var white_color = ProjectSettings.get_setting('Схема прибора. Белый цвет', Color.DIM_GRAY)
var black_color = ProjectSettings.get_setting('Схема прибора. Чёрный цвет', Color.CORAL)
$pic_functional.material.set('shader_parameter/white', white_color)
$pic_functional.material.set('shader_parameter/black', black_color)
@export var state: int:
@@ -14,3 +30,10 @@ func _enter_tree() -> void: $label.self_modulate = state_colors[state]
state = v
if is_inside_tree():
$label.self_modulate = state_colors[v]
@export var show_functional: bool:
set(v):
show_functional = v
if is_inside_tree():
$pic_functional.visible = v

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=18 format=3 uid="uid://lwmw4egynmd1"]
[gd_scene load_steps=26 format=3 uid="uid://lwmw4egynmd1"]
[ext_resource type="Texture2D" uid="uid://bar8k5qef7kch" path="res://data/УФ.png" id="2_0nvm1"]
[ext_resource type="Script" uid="uid://q3gmpsqspjfp" path="res://scenes/контроль/внешний.gd" id="2_8r80x"]
@@ -12,9 +12,16 @@
[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="7_6j01w"]
[ext_resource type="Texture2D" uid="uid://u3tnejvpm8it" path="res://data/disconnect-a.png" id="8_gs2be"]
[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="8_isjua"]
[ext_resource type="Shader" uid="uid://83fx15q1xlid" path="res://shaders/two-color.gdshader" id="9_71ec4"]
[ext_resource type="Texture2D" uid="uid://b4isaggma6q3" path="res://data/Грани22.png" id="9_iqgf5"]
[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="9_ll0vs"]
[ext_resource type="Texture2D" uid="uid://bktiige0i2lhl" path="res://data/У-РЭП-РПД-Н.png" id="9_qe1go"]
[ext_resource type="Texture2D" uid="uid://b2vf7en1jj8dv" path="res://data/У-РЭП-РПД-В.png" id="9_w6m6a"]
[ext_resource type="Texture2D" uid="uid://u7h3l0jjrsnp" path="res://data/У-УФ.png" id="11_gjf0t"]
[ext_resource type="Script" uid="uid://bncy1x53jp73d" path="res://scenes/контроль/connect_pribor.gd" id="11_u7tym"]
[ext_resource type="Texture2D" uid="uid://vdhmga62vjsj" path="res://data/АФСП-РТР.png" id="13_32yvq"]
[ext_resource type="Texture2D" uid="uid://dm350ta8noa0v" path="res://data/У-РЭП-РПД-К.png" id="16_32yvq"]
[ext_resource type="Texture2D" uid="uid://c3cyog3gy24ft" path="res://data/У-ЭП.png" id="16_gjf0t"]
[sub_resource type="GDScript" id="GDScript_iqgf5"]
script/source = "extends Panel
@@ -45,6 +52,9 @@ const PRIBORS_RES = \\
}
var cur_pribor_node = null
func on_line_changed(u, conn_node, _pribor_meta): conn_node.set_val(u.online)
func on_serv_changed(u, pribor_node, _pribor_meta): pribor_node.state = int(u.serviceability)
@@ -52,12 +62,14 @@ func on_serv_changed(u, pribor_node, _pribor_meta): pribor_node.state = int(u.se
func on_mode_changed():
clean_pribor_items()
reset_pribor_buttons()
$chk_show_functional.disabled = true
func reset_pribor_buttons():
var pribor_buttons: = get_tree().get_nodes_in_group('pribor_buttons')
for node in pribor_buttons:
node.button_pressed = false
node.show_functional = false
func _ready():
@@ -117,6 +129,10 @@ func clean_pribor_items():
func on_pribor_press(pribor_path, header_text, pribor_node):
if cur_pribor_node:
cur_pribor_node.show_functional = false
$chk_show_functional.button_pressed = false
cur_pribor_node = pribor_node
clean_pribor_items()
var pribor_obj = load(pribor_path)
if not pribor_obj:
@@ -127,6 +143,7 @@ func on_pribor_press(pribor_path, header_text, pribor_node):
push_error('экземпляр не создан: \\\"%s\\\" (%s)' % [pribor_path, header_text])
return
$lbl_header.text = header_text
$chk_show_functional.disabled = false
var meta_list = pribor_node.get_meta_list()
if meta_list.find('unit_name') > -1:
var unit_name = pribor_node.get_meta('unit_name')
@@ -143,8 +160,26 @@ func on_serviceability_changed(prd_module: Object, prd_pribor:Node)-> void:
func on_update_uf_serviceability(uf_serviceaability: bool, uf_pribor: Node)-> void:
uf_pribor.state = 1 if uf_serviceaability else 2
func _on_chk_show_functional_toggled(toggled_on: bool) -> void:
if cur_pribor_node:
cur_pribor_node.show_functional = toggled_on
func _on_gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
if cur_pribor_node:
cur_pribor_node.show_functional = false
var pribor_buttons := get_tree().get_nodes_in_group('pribor_buttons')
for node in pribor_buttons:
node.button_pressed = false
clean_pribor_items()
cur_pribor_node = null
$chk_show_functional.button_pressed = false
$chk_show_functional.disabled = true
$lbl_header.text = \"\"
"
[sub_resource type="SpriteFrames" id="SpriteFrames_foasq"]
@@ -161,6 +196,12 @@ animations = [{
"speed": 5.0
}]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_71ec4"]
shader = ExtResource("9_71ec4")
shader_parameter/white = Vector3(0.14, 0.13, 0.13)
shader_parameter/black = Vector3(0.95, 0.55, 0.05)
shader_parameter/gamma = 2.0
[node name="Контроль" type="Panel"]
anchors_preset = 15
anchor_right = 1.0
@@ -169,6 +210,8 @@ grow_horizontal = 2
grow_vertical = 2
script = SubResource("GDScript_iqgf5")
metadata/_edit_lock_ = true
metadata/_edit_vertical_guides_ = [21.0, 1578.0]
metadata/_edit_horizontal_guides_ = [200.0, 51.0]
[node name="capsrpb" type="TextureRect" parent="." groups=["pribor_pics"]]
editor_description = "Кнопка для отображения внешних соединений."
@@ -389,6 +432,27 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_1"]
visible = false
light_mask = 3
position = Vector2(35, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_n_1"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1029.0
offset_top = 9.0
offset_right = 576.0
offset_bottom = 830.0
scale = Vector2(0.97094, 0.97094)
texture = ExtResource("9_qe1go")
[node name="connect_pribor2" type="AnimatedSprite2D" parent="pribor_prd_n_1"]
light_mask = 3
position = Vector2(35, -10)
scale = Vector2(0.625, 0.625)
@@ -449,6 +513,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_uf"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1155.0
offset_top = -362.0
offset_right = -96.0001
offset_bottom = 311.0
scale = Vector2(0.789429, 0.789429)
texture = ExtResource("11_gjf0t")
[node name="pribor_rtr" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -493,16 +569,6 @@ patch_margin_top = 16
patch_margin_right = 16
patch_margin_bottom = 16
[node name="label2" type="Label" parent="pribor_rtr"]
layout_mode = 0
offset_left = 12.0
offset_top = -54.0
offset_right = 95.0
offset_bottom = -35.0
text = "РТР"
horizontal_alignment = 1
vertical_alignment = 1
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_rtr"]
light_mask = 3
position = Vector2(55, -15)
@@ -511,6 +577,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_rtr"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1036.0
offset_top = -394.0
offset_right = 927.0
offset_bottom = 595.0
scale = Vector2(0.792688, 0.792688)
texture = ExtResource("13_32yvq")
[node name="pribor_afsp_1" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -558,17 +636,6 @@ patch_margin_top = 16
patch_margin_right = 16
patch_margin_bottom = 16
[node name="label2" type="Label" parent="pribor_afsp_1"]
layout_mode = 0
offset_left = 165.0
offset_top = -245.0
offset_right = 262.0
offset_bottom = -225.0
scale = Vector2(5, 5)
text = "АФСП 1"
horizontal_alignment = 1
vertical_alignment = 1
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_afsp_1"]
light_mask = 3
position = Vector2(415, -40)
@@ -577,6 +644,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_afsp_1"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -5120.0
offset_top = -895.0
offset_right = -3157.0
offset_bottom = 93.9999
scale = Vector2(3.96323, 3.96323)
texture = ExtResource("13_32yvq")
[node name="pribor_afsp_2" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -625,17 +704,6 @@ patch_margin_top = 16
patch_margin_right = 16
patch_margin_bottom = 16
[node name="label2" type="Label" parent="pribor_afsp_2"]
layout_mode = 0
offset_left = 200.0
offset_top = -240.0
offset_right = 297.0
offset_bottom = -220.0
scale = Vector2(5, 5)
text = "АФСП 2"
horizontal_alignment = 1
vertical_alignment = 1
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_afsp_2"]
light_mask = 3
position = Vector2(425, -40)
@@ -644,6 +712,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_afsp_2"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -6070.0
offset_top = -900.0
offset_right = -4107.0
offset_bottom = 89.0001
scale = Vector2(3.96409, 4.54663)
texture = ExtResource("13_32yvq")
[node name="pribor_uyep" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -695,6 +775,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.872305
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_uyep"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1292.0
offset_top = -365.0
offset_right = 821.0
offset_bottom = 764.0
scale = Vector2(0.736875, 0.814493)
texture = ExtResource("16_gjf0t")
[node name="pribor_prd_v_2" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -747,6 +839,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_v_2"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1419.0
offset_top = -480.0
offset_right = 173.0
offset_bottom = 328.0
scale = Vector2(0.977411, 0.977411)
texture = ExtResource("9_w6m6a")
[node name="pribor_prd_n_2" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -794,6 +898,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_2"]
visible = false
light_mask = 3
position = Vector2(40, -10)
scale = Vector2(0.625, 0.625)
@@ -801,6 +906,26 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_n_2"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1419.0
offset_top = -145.0
offset_right = 186.0
offset_bottom = 676.0
scale = Vector2(0.96888, 0.96888)
texture = ExtResource("9_qe1go")
[node name="connect_pribor2" type="AnimatedSprite2D" parent="pribor_prd_n_2"]
light_mask = 3
position = Vector2(35, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pribor_prd_k_2" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -853,6 +978,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_k_2"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1418.0
offset_top = -314.0
offset_right = 345.0
offset_bottom = 649.0
scale = Vector2(0.881522, 0.881522)
texture = ExtResource("16_32yvq")
[node name="pribor_prd_v_3" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -905,6 +1042,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_v_3"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1026.0
offset_top = -601.0
offset_right = 566.0
offset_bottom = 207.0
scale = Vector2(0.975409, 0.975409)
texture = ExtResource("9_w6m6a")
[node name="pribor_prd_n_3" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -957,6 +1106,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_n_3"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1302.0
offset_top = -602.0
offset_right = 303.0
offset_bottom = 219.0
scale = Vector2(0.969291, 0.969291)
texture = ExtResource("9_qe1go")
[node name="pribor_prd_k_3" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -1009,6 +1170,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_k_3"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1167.0
offset_top = -602.0
offset_right = 596.0
offset_bottom = 361.0
scale = Vector2(0.882165, 0.896739)
texture = ExtResource("16_32yvq")
[node name="pribor_prd_v_1" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -1061,6 +1234,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_v_1"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1304.0
offset_top = 2.0
offset_right = 288.0
offset_bottom = 810.0
scale = Vector2(0.974661, 0.974661)
texture = ExtResource("9_w6m6a")
[node name="pribor_prd_k_1" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -1113,6 +1298,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_k_1"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -1163.0
offset_top = 10.0
offset_right = 600.0
offset_bottom = 973.0
scale = Vector2(0.883479, 0.883479)
texture = ExtResource("16_32yvq")
[node name="pribor_prd_v_4" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -1164,6 +1361,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_v_4"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -923.0
offset_top = -144.0
offset_right = 669.0
offset_bottom = 664.0
scale = Vector2(0.976707, 0.976707)
texture = ExtResource("9_w6m6a")
[node name="pribor_prd_n_4" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -1215,6 +1424,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_n_4"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -919.0
offset_top = -485.0
offset_right = 686.0
offset_bottom = 336.0
scale = Vector2(0.968111, 0.968111)
texture = ExtResource("9_qe1go")
[node name="pribor_prd_k_4" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -1266,6 +1487,18 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pic_functional" type="TextureRect" parent="pribor_prd_k_4"]
visible = false
z_index = 1
material = SubResource("ShaderMaterial_71ec4")
layout_mode = 0
offset_left = -924.0
offset_top = -315.0
offset_right = 839.0
offset_bottom = 648.0
scale = Vector2(0.879295, 0.879295)
texture = ExtResource("16_32yvq")
[node name="txr_legend0" type="TextureRect" parent="."]
layout_mode = 0
offset_left = 219.0
@@ -1387,6 +1620,18 @@ points = PackedVector2Array(-8, 0, 608, 0)
width = 2.0
default_color = Color(1, 1, 1, 0.352941)
[node name="chk_show_functional" type="CheckButton" parent="."]
layout_mode = 0
offset_left = 1050.0
offset_top = 26.0
offset_right = 1429.0
offset_bottom = 60.0
theme_override_font_sizes/font_size = 22
disabled = true
text = "Показть функциональную схему Э2"
flat = true
[connection signal="gui_input" from="." to="." method="_on_gui_input"]
[connection signal="toggled" from="pribor_prd_n_1" to="pribor_prd_n_1" method="_on_toggled"]
[connection signal="toggled" from="pribor_uf" to="pribor_uf" method="_on_toggled"]
[connection signal="toggled" from="pribor_rtr" to="pribor_rtr" method="_on_toggled"]
@@ -1404,3 +1649,4 @@ default_color = Color(1, 1, 1, 0.352941)
[connection signal="toggled" from="pribor_prd_v_4" to="pribor_prd_v_4" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_n_4" to="pribor_prd_n_4" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_k_4" to="pribor_prd_k_4" method="_on_toggled"]
[connection signal="toggled" from="chk_show_functional" to="." method="_on_chk_show_functional_toggled"]

View File

@@ -9,6 +9,7 @@ script/source = "class_name configure extends Panel
const TableHeader = preload('res://table/header.tscn')
const TableToggle = preload('res://table/settings-toggle.tscn')
const TableEdit = preload('res://table/ячейка-2.tscn')
const TableColor = preload('res://table/color-picker.tscn')
const ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
const HEADER_ROW = [TableHeader, TableHeader]
@@ -64,9 +65,11 @@ const SETTING_TABLE = [
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'],
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], ]
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ],
['Схема прибора. Белый цвет', TableEdit, TableColor, 'Настройка отображаемого цвета фона' ],
['Схема прибора. Чёрный цвет', TableEdit, TableColor, 'Настройка отображаемого цвета схемы' ], ]
const EXTERNAL_CU = 16 ## Внешнее целеуказание
const TRASSA = 17

View File

@@ -31,7 +31,8 @@ var strob_band_begin: float ## Ширина строба в моме
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания.
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания.
var view_mode: MapViewMode ## Режим отображения карты
var thrs_dict: Dictionary ## Ссылка на словарь целей
var thrs_dict: Dictionary ## Ссылка на словарь целей
var gos_flag = true ## Флаг работать по своим целям
var color_ecm: Color
var color_select: Color
var color_emit: Color
@@ -55,6 +56,7 @@ var fs_selected: Dictionary ## Словарь выбранных сектор
var fs_active: Dictionary ## Словарь секторов назначенных на подавление
var fs_emit: Dictionary ## Словарь секторов назначенных на подавление
var fs_closed: Dictionary ## Словарь для секторов запрета
var fs_failed: Array ## Индикация сломанных секторов (модули ФС). AntBandState.ANT_BAND_READY - исправен, AntBandState.ANT_BAND_FAILURE - сломан.
## Состояние перетаскивания.
enum DragFSM {
@@ -78,6 +80,11 @@ enum MapViewMode {
}
enum AntBandState {
ANT_BAND_READY = 1,
ANT_BAND_FAILED = 0
}
const VAL_TO_EVENT = {
false: 'manual_control', ## Выбор целей и установка помех вручную.
true: 'full_auto' } ## Выбор целей и установка помех автоматически.
@@ -91,7 +98,14 @@ func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns)
func on_enter_tree() -> void: call_deferred('on_button_strobe_pressed')
func clear_all_klaster(): $canvas.clear_all_seczap()
func on_user_panning(): $btn_center.button_pressed = false
func on_settings_changed():
gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true)
color_emit = ProjectSettings.get_setting('application/interfer/emit_color', Color(0.58, 0.47, 0.51, 1.0))
color_ecm = ProjectSettings.get_setting('application/interfer/interfer_color', Color(0.58, 0.47, 0.51, 1.0))
color_select = ProjectSettings.get_setting('application/interfer/select_color', Color(1.0, 1.0, 1.0, 1.0))
@@ -109,9 +123,7 @@ func on_settings_changed():
## Обработчик сигнала изменения списка целей.
func on_threats_resized(ths: Dictionary):
$count_all_pad/count_all.text = '%02d' % ths.size()
var c: int = ths.values().filter(func(th: threats.Threat): return th.proto != '').size()
$count_danger_pad/count_danger.text = '%02d' % c
count_threats(ths)
thrs_dict = ths
@@ -144,10 +156,18 @@ func _exit_tree() -> void:
timer1.queue_free()
func init_fs_failed():
var sectors_count = $canvas.fs_default_colors.size()
fs_failed.resize(sectors_count)
for i in fs_failed.size():
fs_failed[i] = AntBandState.ANT_BAND_READY
## Производит инициализацию.
func _ready():
ProjectSettings.connect('settings_changed', on_settings_changed)
on_settings_changed()
init_fs_failed()
min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5)
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19)
drag_fsm = DragFSM.OFF
@@ -167,6 +187,7 @@ func _ready():
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes))
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
signaller.connect('on_prog_ecm_off', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno').bind(nodes))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
@@ -179,6 +200,7 @@ func _ready():
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
signaller.connect('sector_klaster', Callable(self, 'sector_klaster'))
signaller.connect('clear_klaster', Callable(self, 'clear_all_klaster'))
signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update'))
var unit_nav = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_navi_data_received)
on_btn_center_toggled(true)
@@ -186,16 +208,13 @@ func _ready():
func sector_klaster(sector_data):
if sector_data["draw"]:
var rect: Rect2 = sector_data["rect"]
var color: Color = sector_data["color"]
var id: int = sector_data["index"]
if sector_data['draw']:
var rect: Rect2 = sector_data['rect']
var color: Color = sector_data['color']
var id: int = sector_data['index']
$canvas.add_seczap(id, Vector4(rect.position.x, rect.position.y, rect.size.x, rect.size.y))
$canvas.set_seczap_color(id, color)
else:
pass
func clear_all_klaster(): $canvas.clear_all_seczap()
func on_navi_data_received(data: Dictionary):
var k = data.get('k', 0.0)
@@ -203,10 +222,6 @@ func on_navi_data_received(data: Dictionary):
course = k
func on_user_panning():
$btn_center.button_pressed = false
func on_chk_interfer_prinuditelno(_interfer_sectors):
$chk_auto.set_pressed_no_signal(false)
on_value_changed(false)
@@ -252,9 +267,10 @@ func map_threat_to_bip(th: threats.Threat, bip: Control) -> bool:
## Обработчик сигнала обновления цели.
func on_threat_update(th):
func on_threat_update(th: threats.Threat):
var bip = get_node('%d' % th.id)
bip.update(th.tick_rx)
bip.set_bip_color(Color.CORAL if th.proto else Color.WHITE)
bip.visible = map_threat_to_bip(th, bip)
@@ -519,6 +535,14 @@ func update_fs_colors():
else:
fs_colors[key] = color_select
$canvas.set_band_colors(fs_colors)
$canvas.set_band_failures(fs_failed)
if fs_emit.size():
if $btn_activate.pressed:
$btn_activate.self_modulate = Color.RED
else:
$btn_activate.self_modulate = Color.WHITE
else:
$btn_activate.self_modulate = Color.WHITE
func unsel_fs_all(need_btns_off: bool):
@@ -567,8 +591,9 @@ func on_interfer_prinuditelno (prenuditelno_sectors, btns):
## Вызывается при получении информации о состоянии модулей ФС от КАПС РПБ.
func on_fs_update_state(_fs_dict: Dictionary):
pass
func on_fs_update_state(fs_dict: Dictionary):
for key in fs_dict.keys():
fs_failed[key] = fs_dict[key].isg
func on_btn_center_toggled(toggled_on: bool) -> void:
@@ -579,6 +604,8 @@ func on_btn_center_toggled(toggled_on: bool) -> void:
func on_btn_activate_toggled(toggled_on: bool) -> void:
$btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено')
signaller.emit_signal('emit_changed', toggled_on)
if not toggled_on:
$btn_activate.self_modulate = Color.WHITE
func on_update_coordinates_label(coordinates_label) -> void:
@@ -595,6 +622,7 @@ func on_btn_close(btn):
fs_closed.merge(fs_selected)
signaller.emit_signal('update_fs_closed', fs_closed)
func on_btn_work(btn):
await get_tree().create_timer(0.2).timeout
btn.pressed = false
@@ -604,6 +632,21 @@ func on_btn_work(btn):
fs_closed[fs_index] = null
signaller.emit_signal('update_fs_closed', fs_closed)
func _on_btn_all_work_pressed() -> void:
fs_closed.clear()
signaller.emit_signal('update_fs_closed', fs_closed)
func on_th_aoa_update(ths):
count_threats(ths)
func count_threats(ths):
$count_all_pad/count_all.text = '%02d' % ths.size()
var c: int = 0
if gos_flag:
c = ths.values().filter(func(th: threats.Threat): return th.proto != '').size()
else:
c = ths.values().filter(func(th: threats.Threat): return ((th.proto != '') and th.proto not in interfer.gos_protocols)).size()
$count_danger_pad/count_danger.text = '%02d' % c

View File

@@ -306,18 +306,18 @@ vertical_alignment = 1
[node name="coordinates_map" type="Label" parent="."]
layout_mode = 0
offset_left = 999.0
offset_top = 128.0
offset_right = 1111.0
offset_bottom = 147.0
offset_left = 660.0
offset_top = -24.0
offset_right = 772.0
offset_bottom = -5.0
text = "Координаты:"
[node name="scale_map" type="Label" parent="."]
layout_mode = 0
offset_left = 999.0
offset_top = 202.0
offset_right = 1109.0
offset_bottom = 223.0
offset_left = 1003.0
offset_top = -24.0
offset_right = 1113.0
offset_bottom = -3.0
text = "Масштаб:"
[node name="zoom_plus" type="Button" parent="."]
@@ -379,12 +379,12 @@ texture_normal = ExtResource("14_ggrwd")
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
[connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"]
[connection signal="toggled" from="chk_auto" to="." method="on_value_changed"]
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"]
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"]
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"]
[connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"]
[connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"]
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"]
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"]
[connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="pressed" from="btn_all_work" to="." method="_on_btn_all_work_pressed"]

View File

@@ -1,6 +1,7 @@
[gd_scene load_steps=34 format=3 uid="uid://musb21x2u0xs"]
[gd_scene load_steps=35 format=3 uid="uid://musb21x2u0xs"]
[ext_resource type="Texture2D" uid="uid://hkcvl2waf63s" path="res://scenes/эмс2/вид сверху.png" id="1_b7vcf"]
[ext_resource type="Script" uid="uid://bvlqgv7aapebl" path="res://scenes/эмс2/эмсг.gd" id="1_l3ueu"]
[ext_resource type="Texture2D" uid="uid://0w6q4vfst0ry" path="res://scenes/эмс2/OP-63.png" id="3_8gk36"]
[ext_resource type="Texture2D" uid="uid://coxhivvc6uibs" path="res://scenes/эмс2/Состояние РЭС 40.png" id="4_b3mus"]
[ext_resource type="Texture2D" uid="uid://073el51yholj" path="res://scenes/эмс2/454.png" id="4_nqi0i"]
@@ -39,6 +40,7 @@ load_path = "res://.godot/imported/Окно частот0.png-6b01791c971bddb013
load_path = "res://.godot/imported/Скруглённый квадрат серый.png-4655829309cca3b1dec2c9ae01376d54.ctex"
[node name="Panel" type="Panel"]
script = ExtResource("1_l3ueu")
[node name="Sprite2D" type="Sprite2D" parent="."]
modulate = Color(1, 0.596078, 0.4, 1)
@@ -106,6 +108,15 @@ position = Vector2(275.641, 38.4615)
scale = Vector2(3.20513, 3.20513)
texture = ExtResource("6_m57px")
[node name="lbl_trassa" type="Label" parent="454"]
layout_mode = 0
offset_left = -42.0
offset_top = -135.0
offset_right = 221.0
offset_bottom = -36.0
theme_override_font_sizes/font_size = 100
text = "Трасса"
[node name="Го" type="TextureRect" parent="."]
layout_mode = 0
offset_left = 488.0

View File

@@ -0,0 +1,38 @@
extends Panel
func _ready() -> void:
var unit_trassa = network.get_unit_instance('уарэп-трасса')
unit_trassa.connect('line_changed', Callable(self, 'on_trassa_line_changed'))
signaller.connect('sector_klaster', Callable(self, 'on_sector_klaster').bind(unit_trassa))
func on_trassa_line_changed(unit_trassa):
if unit_trassa.online:
$'454/СостояниеРэс3'.self_modulate = Color.WEB_GREEN
$'СкруглённыйПрямоугольникБелый/Label3'.text = 'Трасса'
$'СкруглённыйПрямоугольникБелый/Label4'.text = 'Трасса'
$'СкруглённыйПрямоугольникБелый/Label5'.text = 'Активный'
$'СкруглённыйПрямоугольникБелый/Label6'.text = str(unit_trassa.daa)
$'СкруглённыйПрямоугольникБелый/Label7'.text = str(unit_trassa.dap)
$'СкруглённыйПрямоугольникБелый/Label8'.text = '1'
$'СкруглённыйПрямоугольникБелый/Label9'.text = str(unit_trassa.lfb)
$'СкруглённыйПрямоугольникБелый/Label10'.text = str(unit_trassa.lfb)
else:
$'454/СостояниеРэс3'.self_modulate = Color.WHITE
$'СкруглённыйПрямоугольникБелый/Label3'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label4'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label5'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label6'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label7'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label8'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label9'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label10'.text = '-'
func on_sector_klaster(data, unit_trassa):
$'СкруглённыйПрямоугольникБелый/Label6'.text = str(unit_trassa.dap)
$'СкруглённыйПрямоугольникБелый/Label7'.text = str(unit_trassa.daa)
$'СкруглённыйПрямоугольникБелый/Label8'.text = '1'
$'СкруглённыйПрямоугольникБелый/Label9'.text = str(unit_trassa.lfb)
$'СкруглённыйПрямоугольникБелый/Label10'.text = str(unit_trassa.hfb)

View File

@@ -0,0 +1 @@
uid://bvlqgv7aapebl

1
scripts/.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://durllxmhtejp1

View File

@@ -93,6 +93,7 @@ const ID_INTERFERS_LEN = 63 ## Размер пула номеров целе
const INTERFER_OFF = 'off'
const INTERFER_IQFILE = 'IQ-файл'
const POW_DEFAULT: float = 50.0
const PERIOD_DEFAULT = 7.5
var msg6_num: int = 0 ## Счётчик сообщений "тип 6"
var msg8_num: int = 0 ## Счётчик сообщений "тип 8"
var id_array: Array ## Массив id воздействий.
@@ -125,6 +126,7 @@ class Interfer:
var modulation: bool ## Модуляция для включения усилителей
var um: float ## Угол места для помехи.
var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ
var priority: int = 0 ## Приоритет помехи
func _to_string() -> String:
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
@@ -214,7 +216,7 @@ func _ready() -> void:
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms, unit_caps))
ProjectSettings.connect('settings_changed', on_settings_changed)
var unit_nav = network.get_unit_instance('навигация')
var unit_nav: = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps))
@@ -257,22 +259,34 @@ func on_timer_check_state(unit_instance, ecms, resend_timeout) -> void:
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> void:
gos_nmfs.clear()
for thr in threats.values():
if not gos_flag: # Составляется список запретных секторов работы
if (thr.proto in gos_protocols) and thr.fflags.proto:
var fs_arr: Array = []
prd.find_fs_index(thr.aoa, thr.freq, fs_arr)
if fs_arr.size():
for item in fs_arr:
var nmfs = prd.FS_PRD[item][1]
gos_nmfs.append(nmfs)
var fs_arr: Array = []
var th_aoa = fposmod(thr.aoa - course, 360)
prd.find_fs_index(th_aoa, thr.freq, fs_arr)
if fs_arr.size():
for item in fs_arr:
var nmfs = prd.FS_PRD[item][1]
thr.nmfs = nmfs
if (thr.proto in gos_protocols) and thr.fflags.proto and (not gos_flag):
gos_nmfs.append(nmfs)
thr.emit_state = 0
for ecm in ecms.values():
if thr.nmfs == ecm.nmfs:
set_th_emit(thr, ecm)
var ecm_active = true
if not gos_flag:
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
ecm_active = false
if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed):
interfer_off(ecm, unit_instance)
var th_id = thr.id
for ecm_i in thrs.keys():
if thrs[ecm_i] == th_id:
var ecm = ecms[ecm_i]
ecm.params['freq'] = thr.freq
ecm.kni = thr.aoa - course
if ecm.kni < 0:
ecm.kni += 360
ecm.kni = fposmod(thr.aoa - course, 360)
call_ecm_proc(ecm)
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
@@ -283,23 +297,11 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
signaller.emit_signal('fs_update_color', ecms)
prd.update_fs_state(ecms, trenazh_mode)
for ecm in ecms.values():
var ecm_active = true
if not gos_flag:
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
ecm_active = false
if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed):
interfer_off(ecm, unit_instance)
if not auto_enabled:
return
if auto_enabled:
for thr in threats.values():
var fs_arr: Array = []
prd.find_fs_index(thr.aoa, thr.freq, fs_arr)
var th_aoa = fposmod(thr.aoa - course, 360)
prd.find_fs_index(th_aoa, thr.freq, fs_arr)
if fs_arr.size():
var need_continue = false
for item in fs_arr:
@@ -366,22 +368,29 @@ func map_mpchf_to_seczaps(unit_instance: unit.Unit, _seczaps: Dictionary):
## Вызыватся, когда пользователь выбрал помеху и выбраны цели.
func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> void:
for item in sel_threats:
if auto_enabled:
var need_continue = false
for ecm in ecms.values():
if ecm.nmfs == item.nmfs:
if item.priority > ecm.priority:
interfer_off(ecm, u)
elif item.priority < ecm.priority:
need_continue = true
break
if need_continue: continue
var param: Dictionary = {}
var kni: float = item.aoa - course
if kni < 0:
kni += 360.0
var id = item.id
param['freq'] = item.freq
param['width'] = item.width
param['width'] = item.width * 1.5
if (item.rkrp != '') and item.fflags.rkrp and auto_enabled:
var krp = get_krp(item)
if krp != '':
interfer_name = krp
set_rparams(item, param)
if (param['width'] < settings.WIDTH_MIN):
param['width'] = settings.WIDTH_MIN
elif (param['width'] > settings.WIDTH_MAX):
param['width'] = settings.WIDTH_MAX
check_width(param)
interfer_create(u, interfer_name, ecms, param, kni, id, thrs, SOURCE_INTERFER[0], power)
for item in fs_arr:
@@ -390,10 +399,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
var id = item[3]
param['freq'] = item[1]
param['width'] = item[2]
if (param['width'] < settings.WIDTH_MIN):
param['width'] = settings.WIDTH_MIN
elif (param['width'] > settings.WIDTH_MAX):
param['width'] = settings.WIDTH_MAX
check_width(param)
interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1], power)
@@ -433,7 +439,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
var sz = ecms.size()
var ispp: int = 0
param['dur'] = 1.0 # Необходимо добавить параметры управления
param['period'] = 1.0 # Необходимо добавить параметры управления
param['period'] = param.get('period', PERIOD_DEFAULT)
var key = dict.find_key(id)
if source_interfer != SOURCE_INTERFER[2]:
if key != null:
@@ -454,13 +460,16 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
ecm = Interfer.new()
ecm.ispp = ispp
ecms[ispp] = ecm
ecm.modulation = emit_enable
ecm.kni = kni
ecm.krp = interfer_name
ecm.params = param
ecm.powp = power
ecm.source_interfer = source_interfer
ecm.modulation = emit_enable
ecm.um = param.get('um', 15.0) # Значение по умолчанию
if source_interfer == SOURCE_INTERFER[0]:
if thrs_dict.has(dict[ispp]):
ecm.priority = thrs_dict[dict[ispp]].priority
call_ecm_proc(ecm)
var set_nmfs_ok = set_nmfs(ecm)
if set_nmfs_ok != Error.OK:
@@ -477,7 +486,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
func send_ecm(ecm, unit0) -> void:
if ecm.krp != INTERFER_OFF:
if not emit_enable:
if not ecm.modulation:
ecm.svk = 0
call_deferred('emit_signal', 'interfer_update', ecm)
return
@@ -512,8 +521,10 @@ func push_id(id: int) -> void:
id_array.sort()
func on_emit_changed(state, _ecms) -> void:
func on_emit_changed(state, ecms) -> void:
emit_enable = state
for ecm in ecms.values():
ecm.modulation = state
func call_all_diap(ecm, ecm_params: Dictionary):
@@ -561,8 +572,11 @@ func on_threats_update(threat, ecms, unit_caps):
for ecm_i in thrs.keys():
if thrs[ecm_i] == th_id:
ecm = ecms[ecm_i]
ecm.priority = threat.priority
ecm.params['freq'] = threat.freq
ecm.params['width'] = threat.width
var width = threat.width * 1.5
ecm.params['width'] = width
check_width(ecm.params)
if (threat.rkrp != '') and threat.fflags.rkrp and auto_enabled:
var krp = get_krp(threat)
if krp != '':
@@ -576,58 +590,8 @@ func on_threats_update(threat, ecms, unit_caps):
if ecm.kni < 0:
ecm.kni += 360
set_nmfs(ecm)
if threat.tmod != 'fm':
if ecm != null:
send_ecm(ecm, unit_caps)
return
var th_fm_dict: Dictionary
var fs_index_arr: Array
prd.find_fs_index(threat.aoa, threat.freq, fs_index_arr)
if fs_index_arr.size() == 0:
if ecm != null:
send_ecm(ecm, unit_caps)
return
var fs_index = fs_index_arr[0]
var nmfs = prd.FS_PRD[fs_index][1]
if ecm == null:
for ecm_i in ecms.values():
if nmfs != ecm_i.nmfs: continue
if ecm_i.svk != 1: continue
ecm = ecm_i
if ecm == null: return
for th_index in thrs_dict:
if thrs_dict[th_index].tmod != 'fm': continue
fs_index_arr = []
prd.find_fs_index(thrs_dict[th_index].aoa, thrs_dict[th_index].freq, fs_index_arr)
if fs_index_arr.size() == 0: continue
if fs_index_arr[0] != fs_index: continue
th_fm_dict[th_index] = thrs_dict[th_index]
if len(th_fm_dict) > 1:
pass
send_ecm(ecm, unit_caps)
func get_freq_range(freq_range_dict: Dictionary, th_dict: Dictionary):
for key_i in th_dict:
var min_range: int = 6000
var key_min = null
for key_j in th_dict:
if key_i == key_j: continue
var width = (th_dict[key_i].width / 2) + (th_dict[key_j].width / 2)
var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq) + width
if freq_range < min_range:
key_min = key_j
min_range = freq_range
var max_width = 0
for key in PDCHM_PARAMS['files'].keys():
if max_width < key: max_width = key
if min_range > max_width:
th_dict.erase(key_i)
continue
else:
if key_min == null: continue
freq_range_dict[key_i] = [th_dict[key_i], th_dict[key_min], min_range]
if ecm != null:
send_ecm(ecm, unit_caps)
func find_threat(freq: int, aoa: float):
@@ -649,12 +613,11 @@ func set_rparams(threat: threats.Threat, params: Dictionary):
params['freq'] = threat.rparams['freq']
else:
params['freq'] = threat.freq
if threat.rparams.has('period'):
params['period'] = threat.rparams['period']
if threat.rparams.has('width'):
params['width'] = threat.rparams['width']
params['width'] = threat.rparams['width'] * 1.5
else:
params['width'] = threat.width
params['width'] = threat.width * 1.5
check_width(params)
if threat.rparams.has('filename'):
params['filename'] = threat.rparams['filename']
@@ -677,6 +640,7 @@ func get_krp(threat: threats.Threat):
func on_interfer_off(ecm: Interfer, ecms):
var sz = ecms.size()
signaller.emit_signal('on_prog_ecm_off', ecm)
ecms.erase(ecm.ispp)
thrs.erase(ecm.ispp)
interfer.cu.erase(ecm.ispp)
@@ -712,3 +676,20 @@ func call_ecm_proc(ecm):
func on_update_fs_closed(fs_dict):
fs_closed = fs_dict
func set_th_emit(th: threats.Threat, ecm: Interfer):
var freq_min = ecm.params['freq'] - ecm.params.get('width', settings.WIDTH_MAX)/2
var freq_max = ecm.params['freq'] + ecm.params.get('width', settings.WIDTH_MAX)/2
if (th.freq >= freq_min) and (th.freq <= freq_max):
if ecm.svk == 1:
th.emit_state = 2
elif th.emit_state == 2:
return
else:
th.emit_state = 1
func check_width(param: Dictionary):
if (param['width'] < settings.WIDTH_MIN): param['width'] = settings.WIDTH_MIN
elif (param['width'] > settings.WIDTH_MAX): param['width'] = settings.WIDTH_MAX

View File

@@ -10,7 +10,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \
'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'],
'уарэп-яу07-общий': ['yau07rx', ['*', 50000, true, true], 'IP-адрес для приёма широковещательных сообщений от ЯУ-07'],
'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', '127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'],
'уарэп-трасса': ['trassa', ['127.0.0.1', '127.0.0.1', 50200, 10004, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'],
'уарэп-трасса': ['trassa', ['192.168.11.34', '192.168.11.105', 50200, 10004, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'],
'уарэп-эмс': ['yau07tx', ['10.1.1.52', 50052, false, false], 'IP-адрес прибора УФ'],
'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В2'],
'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'],
@@ -51,7 +51,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \
const FREQ_MAX: = 6000.0
const FREQ_MIN: = 400.0
const WIDTH_MAX: = 120.0
const WIDTH_MIN: = 0.0
const WIDTH_MIN: = 5.0
const DUR_MAX: = 1000000.0
const PERIOD_MAX: = 1000000.0
const UM_MIN: = -5.0

View File

@@ -30,6 +30,8 @@ signal режим_журнал()
## Вызывается при переходе в режим [b]ЭМС[/b].
signal режим_эмс()
## Вызывается при переходе в режим [b]ЭМС ТГ[/b].
signal режим_эмс2()
## Вызывается при переходе в режим [b]Настройка[/b].
signal режимастройки()
@@ -212,3 +214,8 @@ signal sector_klaster (new_sector_data)
signal clear_klaster ()
## Вызывается при программном отключении помехи.[br]
## [param ecm] - выключаемая помеха ([b]true[/b]
signal on_prog_ecm_off(ecm: interfer.Interfer)

View File

@@ -29,9 +29,9 @@ const MOD_TYPES: Array = [
const CU_STATE: Dictionary = {
0: 2, # Подготовка к выполнению
1: 1, # Выполняется
2: 9, # Ошибка в команде
2: 3, # Ошибка в команде
3: 7, # Занят выполнением другого ЦУ
4: 9, # Неисправность
4: 2, # Неисправность
}
class TCP5P28 extends unit.Unit:
@@ -135,7 +135,7 @@ class TCP5P28 extends unit.Unit:
continue
var cu = ecms[id]
cu_data.encode_u16(0, cu.ispp)
var state: int = CU_STATE[cu.svk] if CU_STATE.has(cu.svk) else 9
var state: int = CU_STATE[cu.svk] if CU_STATE.has(cu.svk) else 8
cu_data.encode_u8(2, state) # Состояние выполнения команды
cu_data.encode_u8(3, 0xFF) # Эффективность работы помехи
data.append_array(cu_data)

View File

@@ -28,6 +28,9 @@ class Threat:
var width: float ## Ширина занимаемого диапазона частот, МГц.
var selected: bool ## Флаг, что цель выбрана.
var auto_selected: bool = false ## Флаг автомата для целей
var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется
var nmfs: int ## Индекс модуля ФС, в зону действия которого попала цель
var priority: int ## Приоритет опасности цели
func _init(): clear_fflags()
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]
@@ -140,6 +143,10 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
th.clear_fflags()
th.set_from_dic(dic_th)
th.tick_rx = unit.tick
if th.fflags.proto and th.proto != '':
th.priority = 1
else:
th.priority = 0
call_deferred('emit_signal', 'threat_update', th)
else:
var th: = Threat.new()

View File

@@ -35,6 +35,10 @@ class Trassa extends unit.Unit:
[2000, 6000, 500, 100],
[3500, 6000, 524, 50],
[390, 6000, 374, 50*7]]
var lfb = 0
var hfb = 0
var dap = 0
var daa = 0
# Инициализация
func _init(nm: StringName, buttons: Array = []) -> void:
@@ -105,10 +109,10 @@ class Trassa extends unit.Unit:
if txe == true or rxe == true:
sector_data["draw"] = true
if data.has("lfb") and data.has("hfb") and data.has("dap") and data.has("daa"):
var lfb = int(data["lfb"])
var hfb = int(data["hfb"])
var dap = int(data["dap"])
var daa = int(data["daa"])
lfb = int(data["lfb"])
hfb = int(data["hfb"])
dap = int(data["dap"])
daa = int(data["daa"])
for i in range(set_klaster.size()):
var mapping = set_klaster[i]
if lfb == mapping[0] and hfb == mapping[1]:

View File

@@ -4,6 +4,7 @@
"Адрес БПО левого борта": "http://172.22.246.13:8081/selftest?presetType=bpo&400000000",
"Адрес БПО правого борта": "http://172.22.246.11:8082/selftest?presetType=bpo&400000000",
"Виртуальная клавиатура": false,
"Включить работу по своим целям": true,
"Внешнее указание Трасса": false,
"Внешнее управление": false,
"Кнопка «JTIDS»": false,
@@ -26,29 +27,31 @@
"Период опроса состояния АФСП, секунды": "30",
"Период опроса состояния БПО, секунды": "30",
"Скрыть вкладку ЭМС 2": true,
"Список своих протоколов": "j11",
"Схема прибора. Белый цвет": [1.0, 1.0, 1.0],
"Схема прибора. Чёрный цвет": [0.0, 0.0, 0.0],
"Текущая версия ПО УАРЭП": "master b2633d8 Thu Sep 11 16:26:39 2025 +0300",
"Шаблон адреса сервера карт": "http://10.1.1.2:8001/osm_tiles/{z}/{x}/{y}.png",
"Шаблон адреса сервера карт": "http://169.254.27.71:8001/osm_tiles/{z}/{x}/{y}.png",
"навигация": [
"*",
60000,
true,
true
],
"уареп-трасса": "127.0.0.1,127.0.0.1,50200,10004",
"уарэп-5п28": [
"127.0.0.1",
50777
],
"уарэп-капсрпб": [
"192.168.11.102",
"192.168.11.105",
"127.0.0.1",
"127.0.0.1",
42023,
42022,
false,
true
],
"уарэп-спт25-1": [
"/home/user/tty0",
"/home/sasha/dev/tty0",
0,
19200,
"N",
@@ -56,15 +59,23 @@
1
],
"уарэп-спт25-2": [
"/home/user/tty1",
"/home/sasha/dev/tty4",
0,
19200,
"N",
8,
1
],
"уарэп-трасса": [
"127.0.0.1",
"127.0.0.1",
50200,
10004,
false,
true
],
"уарэп-щ3": [
"/home/user/tty3",
"/home/sasha/dev/tty2",
7,
19200,
"N",

View File

@@ -7,6 +7,9 @@ code = "shader_type canvas_item;
#define RADIUS_INNER_0 200.0 /* Радиус внутренний для режима приоритет РТО */
#define RADIUS_INNER_1 480.0 /* Радиус внутренний для режима приоритет РЛС */
#define ANTENAS_COUNT 28 /* Количество антенн */
#define ANT_BAND_READY 1U /* Антенна (модуль ФС) готова или исправна */
#define ANT_BAND_FAILED 0U /* Антенна (модуль ФС) не исправно */
uniform vec2 pc0 = vec2(560, 560); /* Центр сетки антенн */
uniform float rotation: hint_range(0.0, 360.0) = 0.0; /* */
@@ -14,9 +17,13 @@ uniform vec4 color0: source_color = vec4(0.38, 0.47, 0.51, 0.4);
uniform vec4 color1: source_color = vec4(0.39, 0.44, 0.50, 0.4);
uniform float radius_inner_0 = RADIUS_INNER_0;
uniform float radius_inner_1 = RADIUS_INNER_1;
uniform float radius_outter = 550.0; /* Радиус внешний. Должно быть равно ant_band_r1_6 */
uniform float radius_outter = 550.0; /* Радиус внешний. Должно быть равно ant_band_r1_6 */
uniform float alpha: hint_range(0.0, 1.0) = 0.5;
uniform int mode = 0; /* Режим отображения. Приоритет РТО - 0, приоритет РЛС - 1 */
uniform int mode = 0; /* Режим отображения. Приоритет РТО - 0, приоритет РЛС - 1 */
uniform float ffr: hint_range(0.0, 1.0) = 0.2; /* Индикация неисправности модулей ФС. Заметность штриховки. */
uniform float sfr: hint_range(0.0, 10.0) = 0.0; /* Индикация неисправности модулей ФС. Скорость движения штрховки */
uniform float afr: hint_range(0.0, 180.0) = 0.0; /* Индикация неисправности модулей ФС. Наклон штрховки */
uniform float pfr: hint_range(1.0, 20.0) = 10.0; /* Индикация неисправности модулей ФС. Частота штриховки */
const int ant_band_count_0 = 2;
const int ant_band_count_1 = 2;
@@ -42,7 +49,8 @@ const float ant_band_r1_4[] = {450.0, 530.0};
const float ant_band_r1_5[] = {500.0, 540.0};
const float ant_band_r1_6[] = {550.0, 550.0};
uniform vec4 ant_band_c[28];
uniform vec4 ant_band_c[ANTENAS_COUNT];
uniform uint ant_band_m[ANTENAS_COUNT];
const float d4 = 90.0;
const float ds = 1.0;
@@ -79,6 +87,12 @@ void antenas(inout vec4 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, inout
col.rgb = ant_band_c[j].rgb;
index++;
col.a = alpha + (random_timed(uv) - 0.5f) * ant_band_c[j].a;
if (ant_band_m[j] == ANT_BAND_FAILED)
{
vec2 uvr = uv;
rotate_vec2(uvr, radians(afr), pc0);
col.a *= (1.0 - ffr) + tanh(10.0 * sin(TIME * sfr + 2.0 * PI * uvr.x / pfr)) * ffr;
}
float v = float(i & 1);
vec4 color = v * col + (1.0f - v) * col;
sector(c, uv, p0, float(i) * da, da, r0, r1, color);
@@ -120,4 +134,9 @@ shader_parameter/radius_inner_1 = 480.0
shader_parameter/radius_outter = 550.0
shader_parameter/alpha = 0.5
shader_parameter/mode = 0
shader_parameter/ffr = 0.2
shader_parameter/sfr = 0.0
shader_parameter/afr = 0.0
shader_parameter/pfr = 10.0
shader_parameter/ant_band_c = PackedVector4Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
shader_parameter/ant_band_m = PackedInt32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

View File

@@ -326,7 +326,9 @@ func _set_row_selected(i_row: int, selected: bool = true) -> void:
var selector = nodes[selector_key]
nodes.erase(selector_key)
if is_instance_valid(selector):
node.remove_child(selector)
var prnt = selector.get_parent_control()
if prnt:
prnt.remove_child(selector)
selector.queue_free()
else:
push_warning('обращение к удалённому элементу \"%s\"' % selector_key)

12
uarep-ctl.linux.x86_64 Normal file
View File

@@ -0,0 +1,12 @@
#!/bin/bash
DATE_TIME=$(date "+%F %H-%M-%S")
LOG_PATH="/home/${USER}/$(basename "$0")-${DATE_TIME}.log" # Путь к файлу журнала.
# { Вывод этого скрипта в файл журнала и консоль одновременно
# shellcheck disable=SC2015,SC2086
test $1 = x$'\x00' && shift || { set -o pipefail ; ( exec 2>&1 ; $0 $'\x00' "$@" ) | tee "${LOG_PATH}" ; exit $? ; }
# }
/opt/uarep-ctl/bin/uarep-ctl.linux.x86_64 -f -t --screen 1