Доработка. Улучшение документации.

This commit is contained in:
lepshiy
2024-07-25 16:10:22 +03:00
parent bae7a949e4
commit d826f8745c
47 changed files with 3607 additions and 3507 deletions

View File

@@ -1,21 +1,20 @@
# Copyright (c) 2020-2023 Mansur Isaev and contributors - MIT License
# See `LICENSE.md` included in the source distribution for details.
## Logger class.
class_name Logger
extends Node
## Класс журнал событий.
class_name Logger extends Node
## Emitted when the logger create a message.
## Выдается, когда журнал событий создаёт сообщение.
signal logged(message: Dictionary)
enum {
INFO = 1, ## Info level.
DEBUG = 1<<1, ## Warning level.
WARNING = 1<<2, ## Debug level.
ERROR = 1<<3, ## Error level.
FATAL = 1<<4, ## Fatal level.
MAX = FATAL, ## Bitwise left shift for custom levels.
INFO = 1, ## Информационный уровень.
DEBUG = 1<<1, ## Уровень предупреждения.
WARNING = 1<<2, ## Уровень отладки.
ERROR = 1<<3, ## Уровень ошибок.
FATAL = 1<<4, ## Критический уровень.
MAX = FATAL, ## Побитовый сдвиг влево для пользовательских уровней.
}
@@ -41,7 +40,7 @@ var _names = {
var _msg_array: Array
var _filters: Array
# Can be overridden to define custom default values.
## Преопределение пользовательских значений по умолчанию.
func _enter_tree() -> void:
set_log_enabled(ProjectSettings.get_setting("plugins/logger/log_enabled", true))
set_default_output_enabled(ProjectSettings.get_setting("plugins/logger/default_output", false))
@@ -58,11 +57,11 @@ func _enter_tree() -> void:
func _exit_tree() -> void:
_close_file()
## Return [param true] if logger has level.
## Возвращает [param true], если у журнала события есть уровень.
func has_level(level: int) -> bool:
return _names.has(level)
## Set the level enabled.
## Установить включенный уровень.
func set_level(level: int, enabled: bool) -> void:
assert(has_level(level), "Invalid level.")
if not has_level(level):
@@ -73,8 +72,8 @@ func set_level(level: int, enabled: bool) -> void:
else:
_level &= ~level
## Add a custom log level. The level value must be unique and be greater than [member MAX].
## To call the custom level use [method message] method.
## Добавить пользовательский уровень журнала. Значение уровня должно быть уникальным и превышать [member MAX].
## Для вызова пользовательского уровня используйте метод - [method message].
func add_level(level: int, nm: String) -> void:
assert(not has_level(level), "Has level.")
assert(level > MAX and not level % 2, "Invalid level.")
@@ -84,27 +83,27 @@ func add_level(level: int, nm: String) -> void:
_names[level] = nm
set_level(level, true)
## Return the level name.
## Возвращает имя уровня.
func get_level_name(level: int) -> String:
return _names[level]
## Set Log enabled. Disable ALL messages.
## Установить включенный журнал. Отключить ВСЕ сообщения.
func set_log_enabled(enabled: bool) -> void:
_log_enabled = enabled
## Return [param true] if Log enabled.
## Возвращает [param true], если журнал включен.
func is_log_enabled() -> bool:
return _log_enabled
## Set default output enabled.
## Установка выхода по умолчанию включена.
func set_default_output_enabled(enabled: bool) -> void:
_default_output_enabled = enabled
## Returns [param true] if default output is enabled.
## Возвращает [param true], если вывод по умолчанию включен.
func is_default_output_enabled() -> bool:
return _default_output_enabled
## Set file write enabled.
## Установить разрешение на запись файла.
func set_file_write_enabled(enabled: bool) -> void:
if _file_write_enabled == enabled:
return
@@ -116,11 +115,11 @@ func set_file_write_enabled(enabled: bool) -> void:
else:
_close_file()
## Returns [param true] if write to a file is enabled.
## Возвращает [param true], если запись в файл разрешена.
func is_file_write_enabled() -> bool:
return _file_write_enabled
## Set the path to the log file.
## Задать путь к файлу журнала.
func set_file_path(path: String) -> void:
assert(path.is_absolute_path(), "Invalid path.")
if not path.is_absolute_path() or _file_path == path:
@@ -131,32 +130,32 @@ func set_file_path(path: String) -> void:
if is_file_write_enabled():
_open_file()
## Return path to log file.
## Возвращает путь к файлу журнала.
func get_file_path() -> String:
return _file_path
## Create an info message.
## Создать информационное сообщение.
func info(text: String) -> void:
message(INFO, text)
## Create a debug message. Debug build only.
## Создать отладочное сообщение. Только для отладочной сборки.
func debug(text: String) -> void:
if OS.is_debug_build():
message(DEBUG, text)
## Create a warning message.
## Создать предупреждающее сообщение.
func warning(text: String) -> void:
message(WARNING, text)
## Create an error message.
## Создать сообщение об ошибке.
func error(text: String) -> void:
message(ERROR, text)
## Create a fatal error message.
## Создать сообщение о критической ошибке.
func fatal(text: String) -> void:
message(FATAL, text)
## Format string for log file.
## Форматировать строку для файла.
func format_file(msg: Dictionary) -> String:
return _format_file.format(
{
@@ -171,7 +170,7 @@ func format_file(msg: Dictionary) -> String:
}
)
## Format string for editor output.
## Форматировать строку для вывода редактора.
func format_stdout(msg: Dictionary) -> String:
return _format_default_output.format(
{
@@ -186,7 +185,7 @@ func format_stdout(msg: Dictionary) -> String:
}
)
## Create a message with a custom level.
## Создать сообщение с пользовательским уровнем.
func message(level: int, text: String) -> void:
assert(has_level(level), "Has not level.")
assert(text, "Invalid message text.")

View File

@@ -2,11 +2,10 @@
# See `LICENSE.md` included in the source distribution for details.
@tool
## LoggerOutput class.
class_name LoggerOutput
extends RichTextLabel
## Класс вывода журнала событий.
class_name LoggerOutput extends RichTextLabel
## Emited when handle [signal Logger.logged] signal.
## Выдаётся при ошибке сигнала - [signal Logger.logged].
signal handled()
@@ -33,11 +32,11 @@ func _exit_tree() -> void:
if is_instance_valid(_logger) and _logger.logged.is_connected(handle_message):
_logger.logged.disconnect(handle_message)
## Return the level color or [member Color.WHITE].
## Вернуть цвет уровня или [member Color.WHITE].
func get_color(level: int) -> Color:
return colors.get(level, Color.WHITE)
## Set the logger.
## Установить журнал событий.
func set_logger(logger: Logger) -> void:
assert(is_instance_valid(logger), "Invalid Logger.")
if not is_instance_valid(logger) or is_same(_logger, logger):
@@ -51,11 +50,11 @@ func set_logger(logger: Logger) -> void:
_logger = logger
## Return the logger.
## Вернуть журнал событий.
func get_logger() -> Logger:
return _logger
## Return formatted string from message.
## Вернуть строку после форматирования из сообщения.
func format(message: Dictionary) -> String:
return format_text.format(
{
@@ -70,7 +69,7 @@ func format(message: Dictionary) -> String:
}
)
## Handle the message.
## Обработать сообщение.
func handle_message(message: Dictionary) -> void:
push_color(get_color(message["level"]))
append_text(format(message) + "\n")

View File

@@ -111,6 +111,29 @@ theme/default_font_subpixel_positioning=3
theme/lcd_subpixel_layout=0
common/drop_mouse_on_gui_input_disabled=true
[input]
up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)
]
}
down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
]
}
left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)
]
}
right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
]
}
[input_devices]
buffering/agile_event_flushing=true

View File

@@ -1,16 +1,16 @@
extends Control
class_name bip_ extends Control
var selected: bool
# Функция присваивает заданое значение видимости селектору
## Функция присваивает заданое значение видимости селектору.
func set_sel_visible(value: bool):
selected = value
$selector.visible = value
# Функция присваивает заданое значение видимости селектору
## Функция присваивает заданое значение видимости селектору.
func set_track_visible(value: bool): $track.visible = value
# Функция присваивает заданое значение видимости индикатору выполнения
## Функция присваивает заданое значение видимости индикатору выполнения.
func set_ecm_visible(value: bool): $ecm_done.visible = value

View File

@@ -1,6 +1,6 @@
extends Sprite2D
class_name Diagram extends Sprite2D
var fs_default_colors: Array # Цвета по умолчанию для блоков ФС
var fs_default_colors: Array ## Цвета по умолчанию для блоков ФС.
func _ready() -> void:
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
@@ -30,7 +30,7 @@ func get_radius_inner_1() -> float: return material.get('shader_parameter/radiu
func set_view_mode(val: int): material.set('shader_parameter/mode', val);
func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)
## Закрашивание по умолчанию блоков ФС цветами из настроек
## Закрашивание по умолчанию блоков ФС цветами из настроек.
func set_def_colors():
var color0: Vector3 = ProjectSettings.get_setting('application/interfer/default_color0', Vector3(0.38, 0.47, 0.51))
var color1: Vector3 = ProjectSettings.get_setting('application/interfer/default_color1', Vector3(0.39, 0.44, 0.50))

View File

@@ -1,7 +1,7 @@
extends NinePatchRect
class_name frm_ecm_list extends NinePatchRect
# Called when the node enters the scene tree for the first time.
## Called when the node enters the scene tree for the first time.
func _ready():
$grd_forced/btn_cancel.button_connect('pressed', Callable(self, 'on_btn_cancel_pressed').bind($grd_forced/btn_cancel))

View File

@@ -1,4 +1,4 @@
extends ScrollContainer
class_name scroll_ecm_params extends ScrollContainer
## Отображает список параметров помехи в таблице.
@@ -33,7 +33,7 @@ func init_table():
$table.set_meta('id', 0)
# Called when the node enters the scene tree for the first time.
## Called when the node enters the scene tree for the first time.
func _ready():
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected'))
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel'))

View File

@@ -1,6 +1,6 @@
extends ScrollContainer
class_name scroll_params extends ScrollContainer
## Отображение параметров цели
## Отображение параметров цели.
const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
@@ -23,7 +23,7 @@ const TABLE_PARAMS = {
'rkrp': [5, 'Рекомендуемая помеха'] }
## Обрабатывает сигнал [signal threats.threat_selected]
## Обрабатывает сигнал [signal threats.threat_selected].
func on_threat_selected(th):
$table.set_meta('id', th.id)
on_threat_update(th)

View File

@@ -1,4 +1,4 @@
extends ScrollContainer
class_name scroll_threats extends ScrollContainer
## Отображает список целей в таблице.
@@ -46,7 +46,7 @@ func _ready() -> void:
call_deferred('init_table')
## Перестраивает индекс таблицы. Вызывать при удалении строки
## Перестраивает индекс таблицы. Вызывать при удалении строки.
func rehash(table_index: Dictionary):
var rows_count = $table.get_rows_count()
for i_row in rows_count:
@@ -54,21 +54,21 @@ func rehash(table_index: Dictionary):
table_index[int(item.text)] = i_row
## Обрабатывает сигнал [b]threat_update[/b]
## Обрабатывает сигнал [b]threat_update[/b].
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)
## Обрабатывает сигнал [b]threat_lost[/b]
## Обрабатывает сигнал [b]threat_lost[/b].
func on_threat_lost(th, table_index: Dictionary):
$table.remove_row(table_index[th.id])
table_index.clear()
rehash(table_index)
## Обрабатывает сигнал [b]threat_new[/b]
## Обрабатывает сигнал [b]threat_new[/b].
func on_threat_new(th, table_index):
var i_row = $table.get_rows_count()
$table.add_row(TABLE_ROW)
@@ -79,7 +79,7 @@ func on_threat_new(th, table_index):
table_index[th.id] = i_row
## Преобразует цель в строку таблицы
## Преобразует цель в строку таблицы.
func map_th_to_row(th) -> Array:
var row: = Array()
row.resize(TABLE_COLUMN_PARAM.size())
@@ -90,7 +90,7 @@ func map_th_to_row(th) -> Array:
return row
## Выделяет выбранную цель в таблице
## Выделяет выбранную цель в таблице.
func on_rto_threat_sel(th_id, tbl):
for i in tbl.get_rows_count():
var node = tbl.get_node2(0, i)
@@ -99,6 +99,6 @@ func on_rto_threat_sel(th_id, tbl):
break
## Снимает выделение цели
## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()

View File

@@ -1,4 +1,4 @@
extends "res://scenes/контроль/прибор.gd"
class_name pribor_rtr extends "res://scenes/контроль/прибор.gd"
static var json_parser: JSON = JSON.new()
@@ -123,8 +123,8 @@ func map_error_codes_to_item(data, item, value_name: StringName):
item.set(value_name, test_res)
## Вызывается при клике мыши на элементе контроля
## [param block_a] - Кликнутый элемент контроля
## Вызывается при клике мыши на элементе контроля.
## [param block_a] - Кликнутый элемент контроля.
func _on_item_pressed(block_a: Control):
var metas = block_a.get_meta_list()
print_debug(block_a)

View File

@@ -1,16 +1,16 @@
extends Sprite2D
class_name main_tilemap extends Sprite2D
## Возможные состояния конечного автомата заданий
## Возможные состояния конечного автомата заданий.
enum TASK_STATE {
DONE, ## Выполнено
WAIT, ## Ожидание плитки
RUN, ## Запуск выполнения
CHECK, ## Проверка пустого места
ERROR ## Ошибка
DONE, ## Выполнено.
WAIT, ## Ожидание плитки.
RUN, ## Запуск выполнения.
CHECK, ## Проверка пустого места.
ERROR ## Ошибка.
}
## Координаты для проверок [lng, lat]
## Координаты для проверок [lng, lat].
const TEST_DATA: = {
'Калиниград': [ 20.51095, 54.70649 ],
'Москва': [ 37.6156, 55.7522 ],
@@ -40,21 +40,20 @@ const MAP_RELATIVE_RADIUSES: = {
}
var map_image: Image ## Изображение с картой
var map_tile_state: TASK_STATE ## Текущее состояние конечного автомата плитки
var map_bcs: Vector3 ## Яркость, контраст насыщенность
var map_server_addr: String ## Адрес сервера изображений карт в проекции Меркатора
var map_image: Image ## Изображение с картой.
var map_tile_state: TASK_STATE ## Текущее состояние конечного автомата плитки.
var map_bcs: Vector3 ## Яркость, контраст насыщенность.
var map_server_addr: String ## Адрес сервера изображений карт в проекции Меркатора.
var map_tile_format: String ##
var map_tile_stack: Array ## Стек для хранения плиток карты
var map_request: HTTPRequest ## Обработчик запросов http
var map_zoom: int ## Уровень детализации карты
var map_tile: Rect2i ## Область одной плитки: [x-координата области, y-координата области, x-индекс плитки, y-индекс плитки]
var map_mode: int ## Режим карты: 0 - приоритет РТО, 1 - приоритет РЛС
var map_tile_stack: Array ## Стек для хранения плиток карты.
var map_request: HTTPRequest ## Обработчик запросов http.
var map_zoom: int ## Уровень детализации карты.
var map_tile: Rect2i ## Область одной плитки: [x-координата области, y-координата области, x-индекс плитки, y-индекс плитки].
var map_mode: int ## Режим карты: 0 - приоритет РТО, 1 - приоритет РЛС.
var prev_tiles_dic: Dictionary ##
var lnglat: Array ## Текущие координаты
var lnglat: Array ## Текущие координаты.
var root_rect: Rect2i
func _ready():
lnglat = TEST_DATA['Таганрог']
map_tile_state = TASK_STATE.DONE
@@ -74,6 +73,7 @@ func _ready():
log.info('Модуль географической карты готов')
func _on_map_mode_changed(mode: int) -> void:
var map_image_size = ProjectSettings.get_setting(MAP_MODES[mode])
material.set('shader_parameter/radius', MAP_RELATIVE_RADIUSES[mode])
@@ -171,3 +171,4 @@ func _map_request_completed(result, response_code, headers, data):
img_tile_to_map_image(img_tile, dst_pos)
mark_image_center(map_image)
texture = ImageTexture.create_from_image(map_image)

View File

@@ -1,14 +1,41 @@
[gd_scene load_steps=4 format=3 uid="uid://bbq6nklh36yij"]
[gd_scene load_steps=6 format=3 uid="uid://bbq6nklh36yij"]
[ext_resource type="Script" path="res://scenes/tilemap/tilemap.gd" id="1_mkfgj"]
[ext_resource type="Shader" path="res://shaders/tilemap.gdshader" id="1_tsdui"]
[ext_resource type="Script" path="res://scenes/tilemap/Node2D.gd" id="3_lr4ti"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_pmqvj"]
resource_local_to_scene = true
shader = ExtResource("1_tsdui")
shader_parameter/radius = 0.39
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ys5v4"]
[node name="tilemap" type="Sprite2D"]
material = SubResource("ShaderMaterial_pmqvj")
position = Vector2(560, 560)
script = ExtResource("1_mkfgj")
[node name="Panel" type="Panel" parent="."]
offset_left = -563.0
offset_top = -557.0
offset_right = 1022.0
offset_bottom = 641.0
theme_override_styles/panel = SubResource("StyleBoxEmpty_ys5v4")
[node name="Node2D" type="Node2D" parent="."]
script = ExtResource("3_lr4ti")
[node name="LineEdit" type="LineEdit" parent="Node2D"]
offset_left = -490.0
offset_top = 518.0
offset_right = -244.0
offset_bottom = 565.0
[node name="VBoxContainer" type="VBoxContainer" parent="Node2D"]
offset_left = -499.0
offset_top = 200.0
offset_right = -239.0
offset_bottom = 430.0
[connection signal="gui_input" from="Panel" to="." method="_on_panel_gui_input"]

View File

@@ -1,7 +1,7 @@
extends Panel
class_name setting extends Panel
# Called when the node enters the scene tree for the first time.
## Вызывается, когда узел впервые попадает в дерево сцены.
func _ready() -> void:
$lbl_commit.text = 'Текущая версия ПО УАРЭП: \"%s\"' % commit.VCS_HEAD
if not OS.get_cmdline_args().has('++ограниченный'):

View File

@@ -1,43 +1,43 @@
@tool
extends Panel
class_name work extends Panel
## Основной скрипт для режима "Работа"
## Основной скрипт для режима "Работа".
@export var Bip: PackedScene ## Индикатор излучения цели
@export var col_grey: Color ## Второй цвет для фона
@export var col_red: Color ## Первый цвет для фона
@export var drag_scale_band: float ## Масштаб изменения параметра от движения мыши для строба по радиальному размеру
@export var drag_scale_width: float ## Масштаб изменения параметра от движения мыши для строба по угловому размеру
@export var Bip: PackedScene ## Индикатор излучения цели.
@export var col_grey: Color ## Второй цвет для фона.
@export var col_red: Color ## Первый цвет для фона.
@export var drag_scale_band: float ## Масштаб изменения параметра от движения мыши для строба по радиальному размеру.
@export var drag_scale_width: float ## Масштаб изменения параметра от движения мыши для строба по угловому размеру.
@export var freq_high: float ## Верхняя рабочая частота, МГЦ.
@export var freq_low: float ## Нижняя рабочая частота, МГЦ.
@export var radius_center: Vector2 ## Координаты центра диаграммы пеленг-частота
@export var radius_internal: float ## Внутренний радиус диаграммы пеленг-частота
@export var radius_outter: float ## Внешний радиус диаграммы пеленг-частота
@export var strob_max_band: float ## Максимальная ширина строба по углу
@export var strob_max_width: float ## Максимальная ширина строба по углу
@export var strob_min_band: float ## Минимальная ширина строба по частоте
@export var strob_min_width: float ## Минимальная ширина строба по углу
@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон
@export var radius_center: Vector2 ## Координаты центра диаграммы пеленг-частота.
@export var radius_internal: float ## Внутренний радиус диаграммы пеленг-частота.
@export var radius_outter: float ## Внешний радиус диаграммы пеленг-частота.
@export var strob_max_band: float ## Максимальная ширина строба по углу.
@export var strob_max_width: float ## Максимальная ширина строба по углу.
@export var strob_min_band: float ## Минимальная ширина строба по частоте.
@export var strob_min_width: float ## Минимальная ширина строба по углу.
@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон.
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания
var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели
var drag_pos_begin: Vector2 ## Точка начала перетаскивания
var max_zoom: int ## Максимальный уровень детализации
var min_zoom: int ## Минимальный уровень детализации
var shift_pressed: bool ## Кнопка SHIFT нажата
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании.
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания.
var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели.
var drag_pos_begin: Vector2 ## Точка начала перетаскивания.
var max_zoom: int ## Максимальный уровень детализации.
var min_zoom: int ## Минимальный уровень детализации.
var shift_pressed: bool ## Кнопка SHIFT нажата.
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания.
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания.
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания.
signal drag_begin ## Вызывается в момент начала перетаскивания
signal drag_continue ## Вызывается во время продолжения перетаскивания
signal drag_end ## Вызывается в момент завершения перетаскивания
signal drag_begin ## Вызывается в момент начала перетаскивания.
signal drag_continue ## Вызывается во время продолжения перетаскивания.
signal drag_end ## Вызывается в момент завершения перетаскивания.
## Границы секторов блоков ФС по частоте в режиме РТО
## Границы секторов блоков ФС по частоте в режиме РТО.
const fs_band_rto: Dictionary = {
0: [200.0, 250.0],
1: [250.0, 300.0],
@@ -47,7 +47,7 @@ const fs_band_rto: Dictionary = {
5: [450.0, 500.0],
6: [500.0, 550.0] }
## Границы секторов блоков ФС по частоте в режиме РЛС
## Границы секторов блоков ФС по частоте в режиме РЛС.
const fs_band_rls: Dictionary = {
0: [480.0, 490.0],
1: [490.0, 500.0],
@@ -57,7 +57,7 @@ const fs_band_rls: Dictionary = {
5: [530.0, 540.0],
6: [540.0, 550.0] }
## Границы секторов блоков ФС по пеленгу
## Границы секторов блоков ФС по пеленгу.
const fs_sectors: Dictionary = {
0: [0.0, 90.0],
3: [90.0, 180.0],
@@ -77,29 +77,29 @@ var fs_band = fs_band_rto # Текущий режим блоков ФС
var fs_selected: Dictionary # Словарь выбранных секторов
var fs_active: Dictionary # Словарь секторов назначенных на подавление
## Состояние перетаскивания
## Состояние перетаскивания.
enum DragFSM {
DRAG, ## В процессе
IDLE, ## Не активно, ожидание
OFF ## Выключено
DRAG, ## В процессе.
IDLE, ## Не активно, ожидание.
OFF ## Выключено.
}
## Состояние перетаскивания
## Состояние перетаскивания.
enum BtnSel {
SECTOR, ## В процессе
THREAT, ## Не активно, ожидание
FS ## Выключено
SECTOR, ## В процессе.
THREAT, ## Не активно, ожидание.
FS ## Выключено.
}
## Обработчик сигнала изменения списка целей
## Обработчик сигнала изменения списка целей.
func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '%02d' % threats.size()
## Обработчик выбора цели
## Обработчик выбора цели.
func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns)
## Обработчик нажатия на кнопку вид
## Обработчик нажатия на кнопку вид.
func on_button_view_toggled(toggled: bool):
signaller.emit_signal('map_mode_changed', int(toggled))
if toggled:
@@ -124,7 +124,7 @@ func _exit_tree() -> void:
timer1.queue_free()
## Производит инициализацию
## Производит инициализацию.
func _ready():
min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5)
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19)
@@ -149,7 +149,22 @@ func _ready():
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
interfer.connect('interfer_update', Callable(self, 'on_interfer_new'))
var items_list = []
recurse(get_tree().get_root(), items_list)
print_debug(items_list)
func recurse(obj, items_list: Array):
var childrens = obj.get_children()
for ch in childrens:
items_list.append(ch)
recurse(ch, items_list)
func get_all_nodes(root):
var nodes = []
nodes.append(root)
for child in root.get_children():
nodes.append_array(get_all_nodes(child))
return nodes
func on_enter_tree() -> void:
call_deferred('_on_btn_scale_pressed')
@@ -157,7 +172,7 @@ func on_enter_tree() -> void:
$tilemap.position = $canvas.get_strob_center()
## Производит отображение цели на диаграмму
## Производит отображение цели на диаграмму.
func map_threat_to_bip(th: threats.Threat, bip: Control):
bip.position = tools.pos_calc(
th.freq,
@@ -169,13 +184,13 @@ func map_threat_to_bip(th: threats.Threat, bip: Control):
freq_high) - bip.size / 2
## Обработчик сигнала обновления цели
## Обработчик сигнала обновления цели.
func on_threat_update(th):
var bip = get_node('%d' % th.id)
map_threat_to_bip(th, bip)
## Обработчик выбора помехи для цели
## Обработчик выбора помехи для цели.
func on_interfer_new(ecm):
if interfer.thrs.has(ecm.ispp):
if interfer.thrs.has(ecm.ispp):
@@ -192,7 +207,7 @@ func on_interfer_new(ecm):
set_fs_color(ecm)
## Обработчик выключения всех помех
## Обработчик выключения всех помех.
func on_interfer_off_all():
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for bip in bips:
@@ -202,7 +217,7 @@ func on_interfer_off_all():
update_fs_colors()
## Обработчик сигнала обнаружения цели
## Обработчик сигнала обнаружения цели.
func on_threat_new(th) -> void:
var bip = Bip.instantiate()
bip.name = '%d' % th.id
@@ -210,20 +225,20 @@ func on_threat_new(th) -> void:
add_child(bip)
## Обработчик сигнала потери цели
## Обработчик сигнала потери цели.
func on_threat_lost(th) -> void:
var bip = get_node('%d' % th.id)
remove_child(bip)
bip.free()
## обработчик нажатия на цель на экране
## обработчик нажатия на цель на экране.
func on_bip_pressed(th_id, _ecm_btns):
if btn_select == BtnSel.THREAT:
signaller.emit_signal('rto_threat_sel', th_id)
## Обработчик выбора РТО цели
## Обработчик выбора РТО цели.
func on_rto_threat_sel(th_id, ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips:
@@ -236,7 +251,7 @@ func on_rto_threat_sel(th_id, ecm_btns):
set_btns_disabled(false, btn)
## Обработчик снятия выбора РТО цели
## Обработчик снятия выбора РТО цели.
func on_rto_threat_unsel(th_id, _ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips:
@@ -246,13 +261,13 @@ func on_rto_threat_unsel(th_id, _ecm_btns):
set_ecm_btns_state(true)
## Обработчик нажатия кнопки "Строб". Управляет отображением строба
## Обработчик нажатия кнопки "Строб". Управляет отображением строба.
func on_button_strobe_pressed() -> void:
drag_fsm = DragFSM.IDLE if $btns_select/btn_strob.is_pressed() else DragFSM.OFF
$canvas.set_strob_visible(drag_fsm == DragFSM.IDLE)
## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей
## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей.
func on_button_select(btn_this, btn_others) -> void:
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
btn_select = btn_this.get_meta('state')
@@ -262,7 +277,7 @@ func on_button_select(btn_this, btn_others) -> void:
set_ecm_btns_state(true)
## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе
## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе.
func on_button_pressed(btn_this, btn_others) -> void:
var fs_arr: Array = []
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
@@ -271,7 +286,7 @@ func on_button_pressed(btn_this, btn_others) -> void:
signaller.emit_signal('interfer_init', btn_this, fs_arr)
## Управляет состоянием кнопок в радиогруппе при выборе помехи
## Управляет состоянием кнопок в радиогруппе при выборе помехи.
func on_interfer_selected(ecm, btns) -> void:
var ecm_name: String
if ecm != null:
@@ -287,21 +302,21 @@ func on_interfer_selected(ecm, btns) -> void:
btn.set_pressed(false)
## Возвращает ширину строба по направлению
## Возвращает ширину строба по направлению.
func get_strob_width(pos: Vector2, prev: float) -> float:
var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width
strob_dir_width = tools.clip_value(strob_dir_width, strob_min_width, strob_max_width)
return strob_dir_width
## Возвращает ширину строба по частоте
## Возвращает ширину строба по частоте.
func get_strob_band(pos: Vector2, prev: float) -> float:
var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band
strob_dir_band = tools.clip_value(strob_dir_band, strob_min_band, strob_max_band)
return strob_dir_band
## Устанавливает центр строба по частоте и направлению
## Устанавливает центр строба по частоте и направлению.
func set_strob(pos: Vector2) -> void:
var radp: Vector2 = tools.map_dec_to_rad(radius_center, pos)
if radp.y < $canvas.get_radius_outter():
@@ -309,7 +324,7 @@ func set_strob(pos: Vector2) -> void:
$canvas.set_strob_radius(radp.y)
## Обработка движения мыши для управления стробом. Вызывается во время движения мыши
## Обработка движения мыши для управления стробом. Вызывается во время движения мыши.
func _on_drag_continue(event) -> void:
if drag_button == MOUSE_BUTTON_RIGHT:
if shift_pressed:
@@ -322,7 +337,7 @@ func _on_drag_continue(event) -> void:
set_strob(event.position)
## Обработка движения мыши для управления стробом. Вызывается при нажатии мыши
## Обработка движения мыши для управления стробом. Вызывается при нажатии мыши.
func _on_drag_begin(event) -> void:
drag_pos_begin = event.position
if drag_button == MOUSE_BUTTON_LEFT:
@@ -332,7 +347,7 @@ func _on_drag_begin(event) -> void:
strob_band_begin = $canvas.get_strob_band()
## Обработчик событий ввода. Вызывается godot
## Обработчик событий ввода. Вызывается godot.
func _input(event) -> void:
if not is_visible_in_tree(): return
if event is InputEventMouseMotion:
@@ -355,21 +370,21 @@ func _input(event) -> void:
shift_pressed = event.pressed
## Вызывается по нажатию кнопки "Детализация"
## Вызывается по нажатию кнопки "Детализация".
func _on_btn_scale_pressed() -> void:
var zoom = $btn_zoom.get_meta('zoom')
zoom = zoom + 1 if zoom < max_zoom else min_zoom
signaller.emit_signal('zoom_changed', zoom)
## Вызывается по завершению изменения детализации карты
## Вызывается по завершению изменения детализации карты.
func _on_zoom_complete(zoom: int) -> void:
var prefix = $btn_zoom.get_meta('prefix')
$btn_zoom/lbl.text = '%s %d' % [prefix, zoom]
$btn_zoom.set_meta('zoom', zoom)
# Обработчик нажатия по сектору формирователя сигналов
## Обработчик нажатия по сектору формирователя сигналов.
func sel_fs_sector(event):
if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT):
var center: Vector2 = $tilemap.position

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=14 format=3 uid="uid://b276iygic5itk"]
[gd_scene load_steps=15 format=3 uid="uid://b276iygic5itk"]
[ext_resource type="Script" path="res://scenes/работа/работа.gd" id="1_niok4"]
[ext_resource type="PackedScene" uid="uid://nl1vklubr5kr" path="res://scenes/bip/bip.tscn" id="2_br3s6"]
@@ -18,6 +18,8 @@ resource_local_to_scene = true
shader = ExtResource("11_ekapd")
shader_parameter/radius = 0.39
[sub_resource type="ImageTexture" id="ImageTexture_cnmvt"]
[node name="Работа" type="Panel"]
script = ExtResource("1_niok4")
Bip = ExtResource("2_br3s6")
@@ -120,6 +122,33 @@ size_flags_vertical = 3
text = "Подавление"
toggle_mode = true
[node name="bt_navig_u" type="TextureButton" parent="."]
layout_mode = 0
offset_left = 530.0
offset_top = 428.0
offset_right = 570.0
offset_bottom = 468.0
[node name="bt_navig_l" type="TextureButton" parent="."]
layout_mode = 0
offset_left = 410.0
offset_top = 532.0
offset_right = 460.0
offset_bottom = 581.0
texture_normal = SubResource("ImageTexture_cnmvt")
[node name="bt_navig_r" type="TextureButton" parent="."]
layout_mode = 0
offset_left = 651.0
offset_top = 540.0
offset_right = 691.0
offset_bottom = 580.0
[node name="bt_navig_d" type="TextureButton" parent="."]
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="btn_zoom" parent="." instance=ExtResource("9_oey3x")]
layout_mode = 0
offset_left = 12.0

View File

@@ -1,6 +1,6 @@
extends Panel
class_name ems extends Panel
# Предзагрузка ячеек таблиц
## Предзагрузка ячеек таблиц.
const TableHeader = preload('res://table/header.tscn')
const CellYemsButton = preload('res://scenes/эмс/кнопка-эмс.tscn')
const CellLineEdit = preload('res://table/ячейка-2.tscn')
@@ -10,7 +10,7 @@ const CellLEEmpty = preload('res://scenes/эмс/line-edit-empty.tscn')
const CellFront = preload('res://scenes/cell/cell-front.tscn')
const CellFrontRear = preload('res://scenes/cell/cell-front-rear.tscn')
# Режимы работы выходов
## Режимы работы выходов.
const OUT_MODE: Array = ['Работа', 'Контроль', '1', '0'] #
const COLUMN_OPTS_BTN: Array = [5]
const TABLE_ENTRY_COLUMNS: Array = [2,3]
@@ -18,16 +18,16 @@ const OUT_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty,
const IN_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty, CellLEEmpty]
var g_boards: Dictionary # Словарь плат ЭМС
var posx: int = 125 # Позиция элементов по x
var posy: int = 70 # Позиция элементов по y
var g_boards: Dictionary ## Словарь плат ЭМС.
var posx: int = 125 ## Позиция элементов по x.
var posy: int = 70 ## Позиция элементов по y.
func _ready() -> void:
call_deferred('init_boards')
## Инициализация основных элементов экрана ЭМС
## Инициализация основных элементов экрана ЭМС.
func init_boards():
# Выставление позиций элементов ЭМС на экране
$scrollin.set_position(Vector2(posx,posy))
@@ -68,8 +68,8 @@ func on_btn_disconnect():
on_disconnect($scrl_out_set/tbl_out_set, selected_rows_out, 'выход')
## Разрывает связь входа и выхода, [param tbl] - таблица, [param selected_rows] - выбранные строки
## [param type_dev] - тип, 'вход' или 'выход'
## Разрывает связь входа и выхода, [param tbl] - таблица, [param selected_rows] - выбранные строки.
## [param type_dev] - тип, 'вход' или 'выход'.
func on_disconnect(tbl, selected_rows, type_dev: String):
var dev = tbl.get_node_user_data(0, 0)
var user_data: Array = tbl.get_node_user_data(0, selected_rows[0])
@@ -85,26 +85,26 @@ func on_disconnect(tbl, selected_rows, type_dev: String):
set_out_dev(dev)
## Обработчик нажатия кнопки "Прочитать"
## Обработчик нажатия кнопки "Прочитать".
func on_btn_flash_read(btn):
await get_tree().create_timer(0.1).timeout
btn.pressed = false
## Обработчик нажатия кнопки "Записать"
## Обработчик нажатия кнопки "Записать".
func on_btn_flash_write(btn):
await get_tree().create_timer(0.1).timeout
btn.pressed = false
## Инициализация таблицы с файлами настроек ЭМС
## Инициализация таблицы с файлами настроек ЭМС.
func init_tbl_files():
$scrl_files/tbl_files.set_header([TableHeader, TableHeader, TableHeader])
$scrl_files/tbl_files.set_header_text(['Имя файла', 'Дата изменения', 'Размер'])
$scrl_files/tbl_files.set_columns_min_size([200, 120, 70])
## Инициализация таблиц входов
## Инициализация таблиц входов.
func init_tbl_in():
# Инициализация основной таблицы входов, в ней отображается информация о параметрах и состоянии
var header_type: Array = [TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader]
@@ -142,12 +142,12 @@ func init_tbl_in():
$scrl_in_set/tbl_in_set.connect('selected_changed', Callable(self, 'on_selected_changed_si'))
## Обработчик редактирования Entry в таблице параметров входов/выходов
## Обработчик редактирования Entry в таблице параметров входов/выходов.
func on_edit_entry(text : String, entry):
print_debug(text, entry)
## Обработчик выбора строки в таблице входов
## Обработчик выбора строки в таблице входов.
func on_selected_changed_in(i_row: int):
var selecter_rows: Array = []
$scrollin/tbl_in.get_selected_rows(selecter_rows)
@@ -156,19 +156,19 @@ func on_selected_changed_in(i_row: int):
set_in_dev(dev)
## Обработчик нажатия на таблицу входов
## Обработчик нажатия на таблицу входов.
func on_row_pressed_in(i_row: int):
on_row_pressed(i_row, $scrollin/tbl_in)
on_selected_changed_in(i_row)
## Выбор входного устройства, для отображения в таблице соединений входа и изменения параметров
## Выбор входного устройства, для отображения в таблице соединений входа и изменения параметров.
func set_in_dev(dev):
var row_type: Array = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState]
set_dev($scrl_in_set/tbl_in_set, dev, row_type, IN_SET_ROW, 'Список соединённых выходов :', [250, 100, 70, 70, 70])
## Обработчик выбора строки в таблице соединений входа и изменения параметров
## Обработчик выбора строки в таблице соединений входа и изменения параметров.
func on_selected_changed_si(i_row: int):
if i_row < 2:
return
@@ -181,7 +181,7 @@ func on_selected_changed_si(i_row: int):
on_row_pressed_out(i)
## Обработчик нажатия на таблицу соединений входа и изменения параметров
## Обработчик нажатия на таблицу соединений входа и изменения параметров.
func on_row_pressed_si(i_row: int):
if i_row < 2:
return
@@ -189,7 +189,7 @@ func on_row_pressed_si(i_row: int):
on_selected_changed_si(i_row)
## Инициализация таблиц выходов
## Инициализация таблиц выходов.
func init_tbl_out():
# Инициализация основной таблицы выходов, в ней отображается информация о параметрах и состоянии
var header_text = ['Выходы', 'Соединитель', 'мкс', 'мкс', 'Состояние', 'Режим']
@@ -225,7 +225,7 @@ func init_tbl_out():
$scrl_out_set/tbl_out_set.connect('selected_changed', Callable(self, 'on_selected_changed_so'))
## Обработчик выбора строки в таблице соединений выхода и изменения параметров
## Обработчик выбора строки в таблице соединений выхода и изменения параметров.
func on_selected_changed_so(i_row: int):
if i_row < 2:
return
@@ -238,7 +238,7 @@ func on_selected_changed_so(i_row: int):
on_row_pressed_in(i)
## Обработчик нажатия на таблицу соединений выхода и изменения параметров
## Обработчик нажатия на таблицу соединений выхода и изменения параметров.
func on_row_pressed_so(i_row: int):
if i_row < 2:
return
@@ -246,7 +246,7 @@ func on_row_pressed_so(i_row: int):
on_selected_changed_so(i_row)
## Обработчик выбора строки в таблице выходов
## Обработчик выбора строки в таблице выходов.
func on_selected_changed_out(i_row: int):
var selecter_rows: Array = []
$scrollout/tbl_out.get_selected_rows(selecter_rows)
@@ -255,13 +255,13 @@ func on_selected_changed_out(i_row: int):
set_out_dev(dev)
## Обработчик выбора строки в таблице выходов
## Обработчик выбора строки в таблице выходов.
func on_row_pressed_out(i_row: int):
on_row_pressed(i_row, $scrollout/tbl_out)
on_selected_changed_out(i_row)
## Выбор выходного устройства, для отображения в таблице соединений выхода и изменения параметров
## Выбор выходного устройства, для отображения в таблице соединений выхода и изменения параметров.
func set_out_dev(dev):
var row_type: Array = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState, CellOptBtn]
set_dev($scrl_out_set/tbl_out_set, dev, row_type, OUT_SET_ROW, 'Список соединённых входов :', [250, 100, 70, 70, 70, 100])
@@ -273,9 +273,12 @@ func set_out_dev(dev):
mode.select(mode_index)
## Выбор входного или выходного устройства [param tbl] - таблица, [param dev] - устройство,
## [param row_type] - массив с типами колонок, [param row_type_conn] - массив с пустыми LineEdit
## [param lbl_text] - текст отображаемый во 2 строке: пример: ('Список соединённых входов :')
## Выбор входного или выходного устройства.[br]
## [param tbl] - таблица,[br]
## [param dev] - устройство,[br]
## [param row_type] - массив с типами колонок,[br]
## [param row_type_conn] - массив с пустыми LineEdit,[br]
## [param lbl_text] - текст отображаемый во 2 строке: пример: ('Список соединённых входов :').[br]
func set_dev(tbl, dev, row_type, row_type_conn, lbl_text, row_size):
tbl.clear_rows()
tbl.add_row(row_type)
@@ -311,7 +314,7 @@ func set_dev(tbl, dev, row_type, row_type_conn, lbl_text, row_size):
tbl.connect_columns(self, 'text_submitted', 'on_edit_entry', TABLE_ENTRY_COLUMNS, [])
## Обработчик нажатия кнопки connect
## Обработчик нажатия кнопки connect.
func on_btn_connect():
var in_row_index: Array = []
var out_row_index: Array = []
@@ -326,9 +329,12 @@ func on_btn_connect():
add_connection_dev($scrl_in_set/tbl_in_set, out_dev, in_dev, IN_SET_ROW, out_user_data)
## образовывает связь между выбранным входом и выходом [param tbl] - таблица, [param dev1] - устройство1,
## [param dev2] - устройство 2, [param set_row] - массив с пустыми LineEdit
## [param user_data] - пользовательские данные устройства1
## Образовывает связь между выбранным входом и выходом.[br]
## [param tbl] - таблица,[br]
## [param dev1] - устройство1,[br]
## [param dev2] - устройство 2,[br]
## [param set_row] - массив с пустыми LineEdit,[br]
## [param user_data] - пользовательские данные устройства1.[br]
func add_connection_dev(tbl, dev1, dev2, set_row, user_data):
if not dev1.connector in dev2.connect_devs:
tbl.add_row(set_row)
@@ -340,15 +346,17 @@ func add_connection_dev(tbl, dev1, dev2, set_row, user_data):
dev2.connect_devs[dev1.connector] = user_data
## Отключает возможность редактирования LineEdit в таблице [param tbl] - таблица,
## [param num_col] - номер колонки, [param i_row] - номер столбца
## Отключает возможность редактирования 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 range(num_col):
var node: LineEdit = tbl.get_node2(col, i_row)
node.editable = false
## Обработчик выбора строки с таблице
## Обработчик выбора строки с таблице.
func on_row_pressed(i_row: int, tbl):
tbl.clear_rows_selected()
var is_row_selected = tbl.is_row_selected(i_row)

View File

@@ -1,26 +1,26 @@
extends Node
class_name STC extends Node
## Реализация "Протокол информационного сопряжения
## СПО АСУ изделия «МП550» с СПО «Управления КАПС РПБ»"
## Реализация "Протокол информационного сопряжения.
## СПО АСУ изделия «МП550» с СПО «Управления КАПС РПБ».
const ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от КАПС РПБ, мс
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм
const ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от КАПС РПБ, мс.
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм.
class CapsRpb:
signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось
signal data_received(unit: CapsRpb) ## Сигнал данные приняты
signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды
signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения
signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось.
signal data_received(unit: CapsRpb) ## Сигнал данные приняты.
signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды.
signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения.
static var json_conv: = JSON.new()
var online: = false ## Состояние связи с источником сообщений
var name: String ## Имя экземпляра
var json_dic: Dictionary ## Аппарат для разбора сообщений
var tick: = 0 ## Тик время последнего обновления, мс
var tx_data: = PackedByteArray() ## Пакет для отправки
var tx_stack: Array ## Массив пакетов для отправки
var online: = false ## Состояние связи с источником сообщений.
var name: String ## Имя экземпляра.
var json_dic: Dictionary ## Аппарат для разбора сообщений.
var tick: = 0 ## Тик время последнего обновления, мс.
var tx_data: = PackedByteArray() ## Пакет для отправки.
var tx_stack: Array ## Массив пакетов для отправки.
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm): self.name = nm

View File

@@ -1,4 +1,4 @@
extends Node
class_name HotKeys extends Node
func _ready() -> void:
@@ -11,7 +11,7 @@ func _input(event: InputEvent) -> void:
signaller.emit_signal('full_screen')
## Переключает режим окна программы полный - обычный экран
## Переключает режим окна программы полный - обычный экран.
func toggle_full_screen(id: int) -> void:
var mode = DisplayServer.window_get_mode(id)
mode = DisplayServer.WINDOW_MODE_WINDOWED \

View File

@@ -1,8 +1,8 @@
extends Node
class_name Iterfer extends Node
## Представление помехи
## Представление помехи.
## Режимы помехи
## Режимы помехи.
const ITERFER_MODE = {
'off': ['Откл', ['freq', 'width'], 0],
'auto': ['АВТО', ['freq', 'width'], 1000],
@@ -27,16 +27,16 @@ const WIDTH_MAX = 120
const WIDTH_MIN = 0
const SOURCE_INTERFER = ['th','fs','cu']
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей.
const INTERFER_OFF = 'off'
const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен
var msg_ss: int = 0 ## счётчик сообщений
var id_array: Array ## Массив id воздействий
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия
var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия
const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен.
var msg_ss: int = 0 ## Счётчик сообщений.
var id_array: Array ## Массив id воздействий.
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия.
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия.
var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия.
## Сеанс помехи
## Сеанс помехи.
class Interfer:
var ss: int = 0 ## Счётчик сообщений.
var ispp: int = 0 ## Индекс сеанса.
@@ -48,7 +48,7 @@ class Interfer:
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_tx: int ## Тик время обновления цели, мс.
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха.
func _to_string() -> String:
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
@@ -94,7 +94,7 @@ signal interfer_resized(ecms: Dictionary) ## Вызывается пр
func _ready():
var ecms: Dictionary = {} ## Словарь помех
var ecms: Dictionary = {} ## Словарь помех.
for i in range(ID_INTERFERS_LEN): # Заполняет массив ID целей
id_array.append(i + 1)
var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп')
@@ -114,7 +114,7 @@ func _ready():
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit, ecms))
# Проверяет состояние отправки пакета и если не доставлен, повторяет отправку
## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку.
func on_timer_check_state(unit, ecms, resend_timeout):
var tick = Time.get_ticks_msec()
for ecm in ecms.values():
@@ -124,7 +124,7 @@ func on_timer_check_state(unit, ecms, resend_timeout):
ecm.tick_tx = tick
## Производит приём состояния помех. [param unit] -> [param ecms]
## Производит приём состояния помех. [param unit] -> [param ecms].
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
if not unit.json_dic.has('ts'): return
if not (unit.json_dic['ts'] is float): return
@@ -150,7 +150,7 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
call_deferred('emit_signal', 'interfer_resized', ecms)
## Вызыватся, когда пользователь выбрал помеху и выбраны цели
## Вызыватся, когда пользователь выбрал помеху и выбраны цели.
func on_interfer_create(btn, sel_threats, fs_arr, _unit, ecms):
for item in sel_threats:
var param: Dictionary = {}
@@ -262,5 +262,5 @@ func push_id(id : int):
id_array.sort()
## отправляет словаhь помех в юнит, для запаковки и отправки в 5П28
## Отправляет словарь помех в юнит, для запаковки и отправки в 5П28.
func on_get_interfers(unit, ecms): unit.pack_interfers(cu, ecms)

View File

@@ -1,12 +1,12 @@
extends Node
class_name Mercator extends Node
## Утилиты для работы с меркаторовскими XYZ-плитками.
const R2D: = 180.0 / PI
const RE: = 6378137.0 ## Радиус Земли экваториальный в метрах
const RP: = 6356752.31424518 ## Радиус Земли полярный в метрах
const CE: = 2.0 * PI * RE ## Длина окружности Земли в метрах по экватору
const CP: = 2.0 * PI * RP ## Длина окружности Земли в метрах через полюсы
const RE: = 6378137.0 ## Радиус Земли экваториальный в метрах.
const RP: = 6356752.31424518 ## Радиус Земли полярный в метрах.
const CE: = 2.0 * PI * RE ## Длина окружности Земли в метрах по экватору.
const CP: = 2.0 * PI * RP ## Длина окружности Земли в метрах через полюсы.
const EPSILON: = 1e-14
const LL_EPSILON: = 1e-11
const MAX_ZOOM: = 20
@@ -14,15 +14,15 @@ const MAX_NORTH = 85.051129
const MAX_SOUTH = -85.051129
## XYZ-плитка веб-меркатора [param x], [param y], [param z] индексы
# [b]x[/b] и [b]y[/b] плитки и уровень масштабирования [b]z[/b].
## XYZ-плитка веб-меркатора [param x], [param y], [param z] индексы.
## [b]x[/b] и [b]y[/b] плитки и уровень масштабирования [b]z[/b].
class Tile:
var x: int
var y: int
var z: int
var lng: float ## Координаты, которые плитка должна покрывать, долгота, градусы
var lat: float ## Широта, градусы
var is_root: bool ## Признак, что плитка корневая (покрывает координаты)
var lng: float ## Координаты, которые плитка должна покрывать, долгота, градусы.
var lat: float ## Широта, градусы.
var is_root: bool ## Признак, что плитка корневая (покрывает координаты).
func as_array(): return [self.x, self.y, self.z]
@@ -62,7 +62,7 @@ class LngLat:
var lng: float = 0.0 ## Долгота в десятичных градусах восточной долготы.
var lat: float = 0.0 ## Широта в десятичных градусах северной широты.
## Возвращает в виде массива
## Возвращает в виде массива.
func as_array() -> Array: return [self.lng, self.lat]
func _to_string() -> String: return '[%f, %f, %f]' % [self.x, self.y, self.z]
@@ -79,7 +79,7 @@ class LngLatBbox:
var east: float ## Восток
var north: float ## Север
## Возвращает в виде массива
## Возвращает в виде массива.
func as_array() -> Array: return [self.west, self.south, self.east, self.north]
func _to_string() -> String: return '[%f, %f, %f, %f]' % [self.west, self.south, self.east, self.north]
@@ -114,12 +114,12 @@ func radians(v: float) -> float: return (v * PI) / 180.0
func rshift(val: int, n: int) -> int: return (val % 0x100000000) >> n
# Возвращает арксинус гиперболический от значения [param val]
## Возвращает арксинус гиперболический от значения [param val].
func asinh(val: float): return log(val + sqrt(val * val + 1.0))
# Преобразует [param lon] в градусах восточной долготы, [param lat] в градусах
# северной долготы, [param alt] высоты в метрах в фиксированные координаты (x, y, z) Земли.
## Преобразует [param lon] в градусах восточной долготы, [param lat] в градусах.
## северной долготы, [param alt] высоты в метрах в фиксированные координаты (x, y, z) Земли.
func lnglat_to_ecef(lng: float, lat: float, alt: float = 0.0) -> Array:
alt += (RE + RP) / 2.0
var latrad: float = radians(lat)
@@ -148,7 +148,7 @@ func find_up_left(tiles: Array):
return null
## Lon./lat. to tile numbers
## [param lon]/[param lat]. для номера плитки.
func deg2num(lng: float, lat: float, zoom: int):
var n: = float(1 << zoom)
var xtile: = int((lng + 180.0) / 360.0 * n)
@@ -156,7 +156,7 @@ func deg2num(lng: float, lat: float, zoom: int):
return [xtile, ytile]
## Tile numbers to lon./lat.
## Номера плитки для [param lon]/[param lat].
func num2deg(x: int, y: int, zoom: int):
var n: = float(1 << zoom)
var lng: = float(x) / n * 360.0 - 180.0
@@ -164,7 +164,7 @@ func num2deg(x: int, y: int, zoom: int):
return [lng, degrees(lat)]
## Расстояние по горизонтали в метрах, представленное одним пикселем
## Расстояние по горизонтали в метрах, представленное одним пикселем.
## [param lat] - Широта, градусы.[br]
## [param zoom] - Уровень детализации.[br]
## [param size] - Размер плитки в пикселях.[br]
@@ -172,7 +172,7 @@ func dist_per_pixel(lat: float, zoom: int, size: int = 256) -> float:
return (CE / float(size)) * cos(radians(lat)) / float(2 ** zoom)
## Расстояние по горизонтали в метрах, представленное одной плиткой
## Расстояние по горизонтали в метрах, представленное одной плиткой.
## [param lat] - Широта, градусы.[br]
## [param zoom] - Уровень детализации.[br]
func dist_per_tile(lat: float, zoom: int) -> float:
@@ -226,7 +226,7 @@ func get_degrees_bounds(m: float, lng: float, lat: float) -> Array[float]:
return [x_y[0] - m, x_y[1] - m, x_y[0] + m, x_y[1] + m]
## Возвращает границы плиток в градусах
## Возвращает границы плиток в градусах.
func get_tiles_bounds(tiles: Array[Tile]) -> Array:
var mm = []
for t in tiles: mm.append(bounds(t).west)
@@ -245,7 +245,7 @@ func get_tiles_bounds(tiles: Array[Tile]) -> Array:
## Возвращает левую верхнюю долготу и широту плитки.[br]
## [param tile] Плитка.[br]
## [param tile] - Плитка.[br]
## [codeblock]
## >>> ul(Tile(x=0, y=0, z=1))
## LngLat(lng=-180.0, lat=85.0511287798066)
@@ -322,10 +322,10 @@ func lnglat(x: float, y: float, truncate: bool = false) -> LngLat:
return LngLat.new(ll[0], ll[1])
## Соседи плитки. [method neighbors] возвращает до восьми
## соседних плиток, при этом плитки будут опущены, если они не являются действительными, например.
## Tile(-1, -1, z). [param tile]: Плитка или последовательность int
## Может быть либо экземпляр Tile, либо 3 ints, X, Y, Z.
## Соседи плитки. [method neighbors] возвращает до восьми.[br]
## Cоседних плиток, при этом плитки будут опущены, если они не являются действительными, например:[br]
## Tile(-1, -1, z). [param tile]: Плитка или последовательность int.[br]
## Может быть либо экземпляр Tile, либо 3 ints, X, Y, Z.[br]
## [return] Массив
## [codeblock]
## >>> neighbors(Tile(486, 332, 10))
@@ -343,7 +343,7 @@ func neighbors(tile: Tile) -> Array:
return tiles
## Возвращает все плитки в радиусе [param r] вокруг заданной плитки [param tile]
## Возвращает все плитки в радиусе [param r] вокруг заданной плитки [param tile].
func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array:
var xys = {}
var mi: int = 2 ** tile.z
@@ -361,7 +361,7 @@ func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array:
return tiles
## Возвращает все плитки по периметру заданной плитки
## Возвращает все плитки по периметру заданной плитки.
func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array:
var tiles = []
for i in range(-mr, mr + 1):
@@ -375,7 +375,7 @@ func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array:
## Получение меркаторской граничной рамки веб-плитки.[br]
## [param tile] - Плитка.[br]
## [i]Эпсилон вычитается из правой границы и прибавляется к нижней[/i]
## [i]Эпсилон вычитается из правой границы и прибавляется к нижней.[/i]
func xy_bounds(tile: Tile, zoom: int) -> Bbox:
var tile_size = CE / pow(2, zoom)
var left = tile.x * tile_size - CE / 2
@@ -393,7 +393,7 @@ func _xy(lng: float, lat: float, truncate=false) -> Array:
return [x, y]
## Получение плитки, содержащей долготу и широту
## Получение плитки, содержащей долготу и широту.
## [param lng], [param lat] - Пара долготы и широты в десятичных градусах.[br]
## [param zoom] - Уровень масштабирования веб-меркатора.[br]
## [param truncate] - Нужно ли усекать вводимые данные до границ веб-меркатора.[br]
@@ -419,7 +419,7 @@ func create_tile(lng: float, lat: float, zoom: int, truncate: bool=false) -> Til
## Получение четверного ключа плитки.[br]
## [param tile] - Плитка
## [param tile] - Плитка.
func quadkey(tile: Tile, zoom: int) -> String:
var rs: = ''
for z in range(zoom, 0, -1):
@@ -650,7 +650,7 @@ func _get_bbox_zoom(bbox: Array):
## [param tile] - Плитка.[br]
## [param fid] - Идентификатор объекта.[br]
## [param props] - Необязательные дополнительные свойства признака.[br]
## [param projected] - Можно создать нестандартный веб-меркатор GeoJSON передав 'mercator'[br]
## [param projected] - Можно создать нестандартный веб-меркатор GeoJSON передав 'mercator'.[br]
## [param buffer] - Необязательное буферное расстояние для полигона GeoJSON.[br]
## [param precision] - Координаты GeoJSON будут усечены до данного количества знаков после запятой.[br]
func feature(tile: Tile, fid:String = 'null', props=null, projected='geographic', buffer=null) -> Dictionary:

View File

@@ -1,44 +1,44 @@
extends Node
class_name mod_bus extends Node
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды.
class ModbusClient:
## Состояние автомата выполнения команды
## Состояние автомата выполнения команды.
enum CmdState {
DONE, ## Команда выполнена
FAIL, ## Команда не выполнена
SEND, ## Буфер готов для отправки
WAIT ## Ожидание выполнения
DONE, ## Команда выполнена.
FAIL, ## Команда не выполнена.
SEND, ## Буфер готов для отправки.
WAIT ## Ожидание выполнения.
}
var name: String
var unit: = 1 ## Адрес устройства Modbus
var cmd_state: = CmdState.DONE ## Код текущей команды
var tx_data: PackedByteArray ## Данные для отправки
var unit: = 1 ## Адрес устройства Modbus.
var cmd_state: = CmdState.DONE ## Код текущей команды.
var tx_data: PackedByteArray ## Данные для отправки.
var online: = false ## Флаг. Если установлен, устройство на связи. Активный уровень - [b]true[/b].
var tick_rx: = 0 ## Время приёма крайнего сообщения
var tick_tx: = 0 ## Время отправки крайнего сообщения
var tick_rx: = 0 ## Время приёма крайнего сообщения.
var tick_tx: = 0 ## Время отправки крайнего сообщения.
static var json_conv: = JSON.new()
signal command_done() ## Вызывается при успешном выполнении команды
signal command_fail() ## Вызывается при возникновении ошибки во время выполнения команды
signal line_changed() ## Вызывается при смене состояния связи с ячейкой
signal data_received() ## Вызывается при приёме сообщения, до его разбора
signal parse_failed(msg: String) ## Вызывается при возникновении ошибки во время разбора пакета. Передаёт сообщение об ошибке
signal command_done() ## Вызывается при успешном выполнении команды.
signal command_fail() ## Вызывается при возникновении ошибки во время выполнения команды.
signal line_changed() ## Вызывается при смене состояния связи с ячейкой.
signal data_received() ## Вызывается при приёме сообщения, до его разбора.
signal parse_failed(msg: String) ## Вызывается при возникновении ошибки во время разбора пакета. Передаёт сообщение об ошибке.
signal holding_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения
signal input_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов
signal info_received(msg: String) ## Вызывается при получении информационного сообщения
signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации
signal holding_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения.
signal input_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов.
signal info_received(msg: String) ## Вызывается при получении информационного сообщения.
signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации.
func _init(nm: String, u: int = 1):
unit = u
name = nm
## Изменяет состояние. Вызывать периодически[br]
## [param tick] - Текущщее время в мс[br]
## Изменяет состояние. Вызывать периодически.[br]
## [param tick] - Текущщее время в мс.[br]
func process(tick: int):
if online and ((tick - tick_rx) > ONLINE_TIMEOUT):
online = false
@@ -53,9 +53,9 @@ class ModbusClient:
cmd_state = CmdState.WAIT
return rc
## Производит разбор принятых данных. Вызывать при приёме данных на сокете[br]
## [param data] - Данные принятые на сокете[br]
## [param tick] - Текущщее время в мс[br]
## Производит разбор принятых данных. Вызывать при приёме данных на сокете.[br]
## [param data] - Данные принятые на сокете.[br]
## [param tick] - Текущщее время в мс.[br]
func parse(data: PackedByteArray, tick: int) -> bool:
tick_rx = tick
if not online:

View File

@@ -1,4 +1,4 @@
extends Node
class_name rep_network extends Node
const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb, 'udp-json-mbcs': modbus.ModbusClient}
@@ -11,17 +11,17 @@ class Socket extends PacketPeerUDP:
class SocketTCP extends TCPServer:
const RX_TIMEOUT: int = 1000 # Время сброса счётчика принятия части пакета
const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета.
var peerstream: = PacketPeerStream.new()
var unit_key: Array # Клюс юнита
var head_len: int = 8 # Длинна заголовка команды
var len_place: int = 4 # Номер начального байта с длинной блока данных
var type_len: int = 4 # Количество байт в размере длинны
var rx_tick: int # Время приёма последнего пакета
var rx_all: bool = true # Флаг, что пакет принят полностью
var rx_len: int # Количество принятых байт
var rx_data: PackedByteArray # Принятые данные
var data_len: int # Размер ожидаемых данных
var unit_key: Array ## Клюс юнита.
var head_len: int = 8 ## Длинна заголовка команды.
var len_place: int = 4 ## Номер начального байта с длинной блока данных.
var type_len: int = 4 ## Количество байт в размере длинны.
var rx_tick: int ## Время приёма последнего пакета.
var rx_all: bool = true ## Флаг, что пакет принят полностью.
var rx_len: int ## Количество принятых байт.
var rx_data: PackedByteArray ## Принятые данные.
var data_len: int ## Размер ожидаемых данных.
func send_to(data):
var peer = peerstream.get_stream_peer()

View File

@@ -1,7 +1,6 @@
extends Node
## Параметры
class_name rep_settings extends Node
## Параметры.
@export var UnitProfiles: = { \
# Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий
@@ -34,7 +33,7 @@ extends Node
'уарэп-спт25-2': ['uart', '/dev/tty3', 115200, false, 'Адрес прибора СПТ-25 (G2)'],
}
## Параметры цели
## Параметры цели.
@export var ThreatParams = {
'time_lost': 5000 ## Время после последнего обновления в мс, через которое цель считается потерянной.
}
@@ -43,7 +42,7 @@ extends Node
func _ready() -> void: log.info('Модуль настроек готов')
## Возвращает ключ устройства
## Возвращает ключ устройства.
func get_unit_key(unit_name: String) -> Array:
assert(UnitProfiles.has(unit_name), 'ошибка: нет такого устройства \"%s\"' % unit_name)
var item = UnitProfiles[unit_name]

View File

@@ -1,43 +1,43 @@
class_name Signaller extends Node
## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют
## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют.
## два и более узла, из разных файлов. Должен быть помещён в автозагрузку.
func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl)
## Вызывается при переходе в режим [b]Работа[/b]
## Вызывается при переходе в режим [b]Работа[/b].
signal режим_работа()
## Вызывается при переходе в режим [b]Контроль[/b]
## Вызывается при переходе в режим [b]Контроль[/b].
signal режимонтроль()
## Вызывается при переходе в режим [b]Журнал[/b]
## Вызывается при переходе в режим [b]Журнал[/b].
signal режимурнал()
## Вызывается при переходе в режим [b]ЭМС[/b]
## Вызывается при переходе в режим [b]ЭМС[/b].
signal режим_эмс()
## Вызывается при переходе в режим [b]Настройка[/b]
## Вызывается при переходе в режим [b]Настройка[/b].
signal режимастройки()
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели и помехи[/b]
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели и помехи[/b].
signal full_auto()
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели[/b]
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели[/b].
signal threat_auto()
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора помехи[/b]
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора помехи[/b].
signal interfer_auto()
## Вызывается, когда оператор переводит программу в режим [b]Ручной[/b]
## Вызывается, когда оператор переводит программу в режим [b]Ручной[/b].
signal manual_control()
@@ -59,21 +59,21 @@ signal full_screen(id: int)
## Вызывается, когда пользователь выбирает цель.[br]
## [param th_id] - Отметка цели на экране
## [param th_id] - Отметка цели на экране.
signal rto_threat_sel (th_id: int)
## Вызывается, когда пользователь нажимает на значёк цели.[br]
## [param th_id] - Отметка цели на экране
## [param th_id] - Отметка цели на экране.
signal bip_pressed (th_id: int)
## Вызывается, когда пользователь снимает выделение с цели.[br]
## [param th_id] - Отметка цели на экране
## [param th_id] - Отметка цели на экране.
signal rto_threat_unsel (th_id: int)
## Вызывается, когда пользователь снимает выделение со всех целей
## Вызывается, когда пользователь снимает выделение со всех целей.
signal rto_threat_unsel_all ()
@@ -100,32 +100,32 @@ signal interfer_new (ecm: interfer.Interfer)
signal interfer_off (ecm: interfer.Interfer, ecms: Dictionary, thrs: Dictionary)
## Вызывается при нажатии отключить все помехи
## Вызывается при нажатии отключить все помехи.
signal interfer_off_all ()
## Вызывается при получении внешнего целеуказания
## Вызывается при получении внешнего целеуказания.
## [param interfer_params] - Параметры полученной помехи от 5П-28.[br]
signal interfer_rcv(interfer_params: Array)
## Вызывается, когда отключается действующая помеха.[br]
## [param ecm] - Выбранная помеха
## [param ecm] - Выбранная помеха.
signal interfer_selected (ecm: interfer.Interfer)
## Вызывается, когда отключается выбираем помеху по сектору в таблице.[br]
## [param ecm] - Выбранная помеха
## [param ecm] - Выбранная помеха.
signal fs_selected(ecm: interfer.Interfer)
## Вызывается при запросе изменения уровня детализации карты.[br]
## [param zoom] - Вновь установленный уровень детализации
## [param zoom] - Вновь установленный уровень детализации.
signal zoom_changed(zoom: int)
## Вызывается при завершении изменения уровня детализации карты.[br]
## [param zoom] - Вновь установленный уровень детализации
## [param zoom] - Вновь установленный уровень детализации.
signal zoom_complete(zoom: int)
@@ -135,5 +135,5 @@ signal map_coords_changed(lan: float, lat: float)
## Вызывается при изменении размера изображения для отображения карты.[br]
## [param mode] - Вновь установленный режим
## [param mode] - Вновь установленный режим.
signal map_mode_changed(mode: int)

View File

@@ -1,13 +1,13 @@
extends Node
class_name tcp5_p28 extends Node
## Реализация "Протокол информационного сопряжения
## СПО АСУ изделия «МП550» с СПО 5П-28"
## Реализация "Протокол информационного сопряжения.
## СПО АСУ изделия «МП550» с СПО 5П-28".
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от 5П-28, мс
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от 5П-28, мс.
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм.
## Тип модуляции для запаковки в пакет для 5П-28
## Тип модуляции для запаковки в пакет для 5П-28.
const MOD_TYPES: Array = ['',
'am',
'ook',
@@ -41,18 +41,18 @@ class TCP5P28:
const CMD_TYPE_TH: int = 2
const CMD_TYPE_IN: int = 3
signal line_changed(unit: TCP5P28) ## Сигнал состояние связи изменилось
signal data_received(unit: TCP5P28) ## Сигнал данные приняты
signal command_fail(unit: TCP5P28) ## Сигнал при не выполнении команды
signal parse_error(unit: TCP5P28, msg: String) ## Сигнал ошибки разбора сообщения
signal get_threats(unit: TCP5P28) ## Сигнал запрос целей
signal get_interfers(unit: TCP5P28) ## Запрос состояния выполнения целеуказания
signal line_changed(unit: TCP5P28) ## Сигнал состояние связи изменилось.
signal data_received(unit: TCP5P28) ## Сигнал данные приняты.
signal command_fail(unit: TCP5P28) ## Сигнал при не выполнении команды.
signal parse_error(unit: TCP5P28, msg: String) ## Сигнал ошибки разбора сообщения.
signal get_threats(unit: TCP5P28) ## Сигнал запрос целей.
signal get_interfers(unit: TCP5P28) ## Запрос состояния выполнения целеуказания.
var online: = false ## Состояние связи с источником сообщений
var name: String ## Имя экземпляра
var rx_tick: = 0 ## Тик время последнего приёма, мс
var tx_data: = PackedByteArray() ## Пакет для отправки
var tx_stack: Array ## Массив пакетов для отправки
var online: = false ## Состояние связи с источником сообщений.
var name: String ## Имя экземпляра.
var rx_tick: = 0 ## Тик время последнего приёма, мс.
var tx_data: = PackedByteArray() ## Пакет для отправки.
var tx_stack: Array ## Массив пакетов для отправки.
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm): self.name = nm

View File

@@ -1,6 +1,6 @@
extends Node
## Работа с целями
## Работа с целями.
## Цель
@@ -26,7 +26,7 @@ class Threat:
var tick_rx: int ## Тик время обновления цели, мс.
var tmod: String ## Тип модуляции.
var width: float ## Ширина занимаемого диапазона частот, МГц.
var selected: bool ## Флаг, что цель выбрана
var selected: bool ## Флаг, что цель выбрана.
func _init(): clear_fflags()
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]
@@ -62,7 +62,7 @@ func _ready() -> void:
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(threats))
signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats))
## Периодически удаляет устаревшие цели
## Периодически удаляет устаревшие цели.
func on_timer_check_lost(time_lost: int, threats: Dictionary):
var tick = Time.get_ticks_msec()
var sz: = threats.size()
@@ -74,7 +74,7 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary):
call_deferred('emit_signal', 'threats_resized', threats)
## отправляет словарь целей в юнит, для запаковки и отправки в 5П28
## отправляет словарь целей в юнит, для запаковки и отправки в 5П28.
func on_get_threats(unit, threats): unit.pack_threats(threats)
@@ -82,7 +82,7 @@ func on_get_threats(unit, threats): unit.pack_threats(threats)
func on_rto_threat_unsel(th_id, threats): threats[th_id].selected = false
## Снимает выделение со всех целей
## Снимает выделение со всех целей.
func on_rto_threat_unsel_all(threats):
for th in threats.values():
signaller.emit_signal('rto_threat_unsel', th.id)
@@ -92,14 +92,14 @@ func on_rto_threat_unsel_all(threats):
func on_rto_threat_sel(th_id, threats): on_threat_selected(threats[th_id], threats)
## Выбирает цель, если выбрать в таблице
## Выбирает цель, если выбрать в таблице.
func on_threat_selected(th, threats):
for threat in threats.values():
threat.selected = false
th.selected = true
## Формирует список выбранных целей для включения помехи
## Формирует список выбранных целей для включения помехи.
func on_interfer_init(btn, fs_arr, threats):
var sel_threats: Array = []
for threat in threats.values():
@@ -109,7 +109,7 @@ func on_interfer_init(btn, fs_arr, threats):
signaller.emit_signal('interfer_create', btn, sel_threats, fs_arr)
## Производит приём целей
## Производит приём целей.
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
if not unit.json_dic.has('ts'): return
if unit.json_dic['ts'] != 5: return

View File

@@ -1,10 +1,10 @@
@tool
extends Node
class_name Tools extends Node
## Простые часто используемые функции
## Простые часто используемые функции.
## Возвращает округлённое значение [param v] с точностью [param a]
## Возвращает округлённое значение [param v] с точностью [param a].
func round_to(v: float, a: float) -> float: return snappedf(v, -a if v < 0 else a)
@@ -21,7 +21,7 @@ func radians(val: float): return (val * PI) / 180.0
func ibytes_to_word(buf: PackedByteArray, i: int) -> int: return buf[i] + (buf[i + 1] * 256)
## Возвращает расстояние от центра координат до точки
## Возвращает расстояние от центра координат до точки.
func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y)
@@ -70,21 +70,21 @@ func get_string_slice(s_in: String, s_out: Array, i0: int, i1: int):
s_out[0] += s_in[i]
## Производит преобразование из декартовой в полярную систему координат
## Производит преобразование из декартовой в полярную систему координат.
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float):
var r = ((freq - f0) / (f1 - f0)) * r1 + r0
var aoa_rad = radians(aoa) - PI / 2.0
return Vector2(cos(aoa_rad), sin(aoa_rad)) * r + pos0
## Отсекает значение до заданного диапазона
## Отсекает значение до заданного диапазона.
func clip_value(val, val_min, val_max):
if val < val_min: val = val_min
if val > val_max: val = val_max
return val
## Возвращает массив с именами членов [param obj]
## Возвращает массив с именами членов [param obj].
func get_members_names(obj: Object) -> Array:
var pl = obj.get_property_list()
var names: = Array()
@@ -92,7 +92,7 @@ func get_members_names(obj: Object) -> Array:
return names
## Проверяет, что заданный массив [param val] похож на ip-адрес
## Проверяет, что заданный массив [param val] похож на ip-адрес.
func is_array_ipaddr(val: Array):
return (val.size() == 2) \
and (val[0] is String) \
@@ -111,7 +111,7 @@ func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2:
return Vector2(ang + 360.0 * float(ang < 0.0), hypot(x1, y1))
## Переводит значение val из диапазона a0...a1 в диапазон b0...b1
## Переводит значение val из диапазона a0...a1 в диапазон b0...b1.
func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0
@@ -131,7 +131,7 @@ func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
return odd_nodes > 0
## Записывает слово [param val] в элемент байтовго массива [param buf]
## Записывает слово [param val] в элемент байтовго массива [param buf].
## расположенный по индексу [param index] (младшее слово).[br]
## [i]Следует использовать встроенные в[/i] [b]PackedByteArray[/b] [i]методы вместо этой функции.[/i]
func set_wordi(buf: PackedByteArray, index: int, val: int) -> void:

View File

@@ -1,6 +1,6 @@
extends Node
class_name yau_07 extends Node
## Протокол ячейки ЯУ-07
## Протокол ячейки ЯУ-07.
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды
const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды
@@ -8,47 +8,47 @@ const RETRY_COUNT = 5 ## Количество повторных отпр
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
## Ячейка ЯУ-07
## Ячейка ЯУ-07.
class YaU07:
## Коды выполняемых команд
## Коды выполняемых команд.
enum CmdCode {
READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07
WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07
READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07.
WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07.
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07.
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07.
}
## Состояние автомата выполнения команды
## Состояние автомата выполнения команды.
enum CmdState {
UNCK, ## Номер команды не ининциирован
SEND, ## Буфер готов для отправки
WAIT, ## Ожидание выполнения
DONE, ## Команда выполнена
FAIL ## Команда не выполнена
UNCK, ## Номер команды не ининциирован.
SEND, ## Буфер готов для отправки.
WAIT, ## Ожидание выполнения.
DONE, ## Команда выполнена.
FAIL ## Команда не выполнена.
}
signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой
signal command_done(unit: YaU07) ## Вызывается после выполнения команды
signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена
signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой.
signal command_done(unit: YaU07) ## Вызывается после выполнения команды.
signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена.
signal parse_failed(unit: YaU07)
var name: = String()
var cmd_num_rx: = 0 ## Номер команды принятый
var cmd_num_tx: = 0 ## Номер команды переданный
var cmd_state = CmdState.UNCK ## Состояние выполнения команды
var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07
var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду
var tick = 0.0 ## Текущее тик-время в мс
var cmd_tick_tx = 0.0 ## Время последней отправки команды
var cmd_tick_rx = 0.0 ## Время последнего приёма команды
var status: = PackedByteArray() ## Поле "состояние прибора"
var tx_data: = PackedByteArray() ## Буфер отправленный
var tx_len = 0 ## Длина последнего отправленного пакета
var isa_ports = {} ## Результат выполнения команды "читать порт"
var isa_block = {} ## Результат выполнения команды "читать массив из порта"
var online = false ## Состояние связи с ячейкой
var cmd_num_rx: = 0 ## Номер команды принятый.
var cmd_num_tx: = 0 ## Номер команды переданный.
var cmd_state = CmdState.UNCK ## Состояние выполнения команды.
var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07.
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07.
var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду.
var tick = 0.0 ## Текущее тик-время в мс.
var cmd_tick_tx = 0.0 ## Время последней отправки команды.
var cmd_tick_rx = 0.0 ## Время последнего приёма команды.
var status: = PackedByteArray() ## Поле "состояние прибора".
var tx_data: = PackedByteArray() ## Буфер отправленный.
var tx_len = 0 ## Длина последнего отправленного пакета.
var isa_ports = {} ## Результат выполнения команды "читать порт".
var isa_block = {} ## Результат выполнения команды "читать массив из порта".
var online = false ## Состояние связи с ячейкой.
func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
@@ -134,9 +134,9 @@ class YaU07:
tx_data.encode_u16(9, int(port[0]))
cmd_state = CmdState.SEND
return true
## Возвращает код команды ЯУ-07
## rx_data - Принятые данные
## Возвращает - Код команды не найден, 0...255 - код команды
## Возвращает код команды ЯУ-07.
## rx_data - Принятые данные.
## Возвращает - Код команды не найден, 0...255 - код команды.
func get_cmd_code(rx_data: PackedByteArray):
var rx_data_len = rx_data.size()
@@ -185,11 +185,11 @@ class YaU07:
return true
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07
## для команд "читать порты" или "записать порты"[br]
## [param rx_data] - Принятые данные[br]
## Возвращает [b]true[/b] - Данные обработаны успешно[br]
## Возвращает [b]false[/b] - Данные не обработаны из за ошибки[br]
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07.
## для команд "читать порты" или "записать порты".[br]
## [param rx_data] - Принятые данные.[br]
## Возвращает [b]true[/b] - Данные обработаны успешно.[br]
## Возвращает [b]false[/b] - Данные не обработаны из за ошибки.[br]
func parse(rx_data: PackedByteArray) -> bool:
cmd_tick_rx = tick

View File

@@ -1,10 +1,10 @@
extends Node
class_name yems_boards extends Node
class EmsBoard:
var id_board: String
var in_devs: Dictionary ## Словарь с входными устройствами
var out_devs: Dictionary ## Словарь с выходными устройствами
var base_addr_isa: int ## Базовый адрес ячейки isa
var in_devs: Dictionary ## Словарь с входными устройствами.
var out_devs: Dictionary ## Словарь с выходными устройствами.
var base_addr_isa: int ## Базовый адрес ячейки isa.
var in_tbl: Array
var out_tbl: Array

View File

@@ -1,6 +1,6 @@
extends Node
class_name yerms_consts extends Node
##
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_ROWS1 = [
[12,['283333 МР-231S, Строб ЭМС', 'X52', '0.00', '0.00']],
[13,['29НРЛС МР-231-3, УИЗП', 'X54', '0.00', '0.00']],
@@ -16,7 +16,7 @@ const INPUT_ROWS1 = [
[38,['394302-01, 4302-04, УИЗП', 'X46', '0.00', '0.00']],
[31,['40НРЛС МР-231S, УИЗП', 'X51', '0.00', '0.00']]]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_ROWS1 = [
[41,['41НРЛС МР-231S, БИ', 'X61', '0.00', '0.00']],
[42,['42НРЛС МР-231S', 'X62', '0.00', '0.00']],
@@ -32,7 +32,7 @@ const OUTPUT_ROWS1 = [
[66,['524302-01, 4302-04, БИ', 'X66', '0.00', '0.00']],
[68,['53НРЛС 11111111', 'X69', '0.00', '0.00']]]
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_ROWS = [
[1,['УИЗП №1', 'Х7', '0.00', '0.00']],
[2,['УИЗПФ №1', 'Х8', '0.00', '0.00']],
@@ -93,7 +93,7 @@ const INPUT_ROWS = [
[57,['СЗИ Е Лб','Х49 : 1', '0.00', '0.00']],
[58,['СЗИ Е ПрБ','Х49 : 50', '0.00', '0.00']]]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_ROWS = [
[11,['Бланк №1','Х6', '0.00', '0.00']],
[12,['Бланк №2','Х9', '0.00', '0.00']],

View File

@@ -1,19 +1,19 @@
extends Node
class_name yems_dev extends Node
class InDev:
var id: int ## Идентификатор индекс устройства
var dev_name: String ## Имя подключаемого комплекса
var connector: String ## Номер разъёма в приборе
var delay: float ## Задержка фронта импульса
var offset: float ## Смещение фронта импульса
var state: int ## Состояние входа
var freq: int ## Предполагаемая частота на которой работает комплекс
var ports_data: Dictionary ## Словарь состояния портов устройства
var tbl_row_id: int ## Индекс устройства в таблице выходов
var out_dots: Array ## Список выходных устройств в порядке, как в таблице и точки матрицы
var connect_devs: Dictionary ## Список присоединённых устройств
var board: String ## Плата в которой находится устройство
var id: int ## Идентификатор индекс устройства.
var dev_name: String ## Имя подключаемого комплекса.
var connector: String ## Номер разъёма в приборе.
var delay: float ## Задержка фронта импульса.
var offset: float ## Смещение фронта импульса.
var state: int ## Состояние входа.
var freq: int ## Предполагаемая частота на которой работает комплекс.
var ports_data: Dictionary ## Словарь состояния портов устройства.
var tbl_row_id: int ## Индекс устройства в таблице выходов.
var out_dots: Array ## Список выходных устройств в порядке, как в таблице и точки матрицы.
var connect_devs: Dictionary ## Список присоединённых устройств.
var board: String ## Плата в которой находится устройство.
func _init(dev_id : int, params : Array, row_id : int):
id = dev_id
@@ -25,7 +25,7 @@ class InDev:
class OutDev extends InDev:
var mode: String ## Режим работы выхода
var mode: String ## Режим работы выхода.
func _init(dev_id : int, params : Array, row_id : int):
id = dev_id