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

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

View File

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

View File

@@ -111,6 +111,29 @@ theme/default_font_subpixel_positioning=3
theme/lcd_subpixel_layout=0 theme/lcd_subpixel_layout=0
common/drop_mouse_on_gui_input_disabled=true 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] [input_devices]
buffering/agile_event_flushing=true buffering/agile_event_flushing=true

View File

@@ -1,16 +1,16 @@
extends Control class_name bip_ extends Control
var selected: bool var selected: bool
# Функция присваивает заданое значение видимости селектору ## Функция присваивает заданое значение видимости селектору.
func set_sel_visible(value: bool): func set_sel_visible(value: bool):
selected = value selected = value
$selector.visible = value $selector.visible = value
# Функция присваивает заданое значение видимости селектору ## Функция присваивает заданое значение видимости селектору.
func set_track_visible(value: bool): $track.visible = value func set_track_visible(value: bool): $track.visible = value
# Функция присваивает заданое значение видимости индикатору выполнения ## Функция присваивает заданое значение видимости индикатору выполнения.
func set_ecm_visible(value: bool): $ecm_done.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: func _ready() -> void:
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode')) 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_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_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)
## Закрашивание по умолчанию блоков ФС цветами из настроек ## Закрашивание по умолчанию блоков ФС цветами из настроек.
func set_def_colors(): func set_def_colors():
var color0: Vector3 = ProjectSettings.get_setting('application/interfer/default_color0', Vector3(0.38, 0.47, 0.51)) 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)) 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(): func _ready():
$grd_forced/btn_cancel.button_connect('pressed', Callable(self, 'on_btn_cancel_pressed').bind($grd_forced/btn_cancel)) $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) $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(): func _ready():
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected')) signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected'))
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel')) 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 CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы. const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
@@ -23,7 +23,7 @@ const TABLE_PARAMS = {
'rkrp': [5, 'Рекомендуемая помеха'] } 'rkrp': [5, 'Рекомендуемая помеха'] }
## Обрабатывает сигнал [signal threats.threat_selected] ## Обрабатывает сигнал [signal threats.threat_selected].
func on_threat_selected(th): func on_threat_selected(th):
$table.set_meta('id', th.id) $table.set_meta('id', th.id)
on_threat_update(th) 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') call_deferred('init_table')
## Перестраивает индекс таблицы. Вызывать при удалении строки ## Перестраивает индекс таблицы. Вызывать при удалении строки.
func rehash(table_index: Dictionary): func rehash(table_index: Dictionary):
var rows_count = $table.get_rows_count() var rows_count = $table.get_rows_count()
for i_row in rows_count: for i_row in rows_count:
@@ -54,21 +54,21 @@ func rehash(table_index: Dictionary):
table_index[int(item.text)] = i_row table_index[int(item.text)] = i_row
## Обрабатывает сигнал [b]threat_update[/b] ## Обрабатывает сигнал [b]threat_update[/b].
func on_threat_update(th, table_index: Dictionary): func on_threat_update(th, table_index: Dictionary):
var row = map_th_to_row(th) var row = map_th_to_row(th)
var i_row = table_index[th.id] var i_row = table_index[th.id]
$table.set_row_text(i_row, row) $table.set_row_text(i_row, row)
## Обрабатывает сигнал [b]threat_lost[/b] ## Обрабатывает сигнал [b]threat_lost[/b].
func on_threat_lost(th, table_index: Dictionary): func on_threat_lost(th, table_index: Dictionary):
$table.remove_row(table_index[th.id]) $table.remove_row(table_index[th.id])
table_index.clear() table_index.clear()
rehash(table_index) rehash(table_index)
## Обрабатывает сигнал [b]threat_new[/b] ## Обрабатывает сигнал [b]threat_new[/b].
func on_threat_new(th, table_index): func on_threat_new(th, table_index):
var i_row = $table.get_rows_count() var i_row = $table.get_rows_count()
$table.add_row(TABLE_ROW) $table.add_row(TABLE_ROW)
@@ -79,7 +79,7 @@ func on_threat_new(th, table_index):
table_index[th.id] = i_row table_index[th.id] = i_row
## Преобразует цель в строку таблицы ## Преобразует цель в строку таблицы.
func map_th_to_row(th) -> Array: func map_th_to_row(th) -> Array:
var row: = Array() var row: = Array()
row.resize(TABLE_COLUMN_PARAM.size()) row.resize(TABLE_COLUMN_PARAM.size())
@@ -90,7 +90,7 @@ func map_th_to_row(th) -> Array:
return row return row
## Выделяет выбранную цель в таблице ## Выделяет выбранную цель в таблице.
func on_rto_threat_sel(th_id, tbl): func on_rto_threat_sel(th_id, tbl):
for i in tbl.get_rows_count(): for i in tbl.get_rows_count():
var node = tbl.get_node2(0, i) var node = tbl.get_node2(0, i)
@@ -99,6 +99,6 @@ func on_rto_threat_sel(th_id, tbl):
break break
## Снимает выделение цели ## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected() 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() 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) item.set(value_name, test_res)
## Вызывается при клике мыши на элементе контроля ## Вызывается при клике мыши на элементе контроля.
## [param block_a] - Кликнутый элемент контроля ## [param block_a] - Кликнутый элемент контроля.
func _on_item_pressed(block_a: Control): func _on_item_pressed(block_a: Control):
var metas = block_a.get_meta_list() var metas = block_a.get_meta_list()
print_debug(block_a) print_debug(block_a)

View File

@@ -1,16 +1,16 @@
extends Sprite2D class_name main_tilemap extends Sprite2D
## Возможные состояния конечного автомата заданий ## Возможные состояния конечного автомата заданий.
enum TASK_STATE { enum TASK_STATE {
DONE, ## Выполнено DONE, ## Выполнено.
WAIT, ## Ожидание плитки WAIT, ## Ожидание плитки.
RUN, ## Запуск выполнения RUN, ## Запуск выполнения.
CHECK, ## Проверка пустого места CHECK, ## Проверка пустого места.
ERROR ## Ошибка ERROR ## Ошибка.
} }
## Координаты для проверок [lng, lat] ## Координаты для проверок [lng, lat].
const TEST_DATA: = { const TEST_DATA: = {
'Калиниград': [ 20.51095, 54.70649 ], 'Калиниград': [ 20.51095, 54.70649 ],
'Москва': [ 37.6156, 55.7522 ], 'Москва': [ 37.6156, 55.7522 ],
@@ -40,21 +40,20 @@ const MAP_RELATIVE_RADIUSES: = {
} }
var map_image: Image ## Изображение с картой var map_image: Image ## Изображение с картой.
var map_tile_state: TASK_STATE ## Текущее состояние конечного автомата плитки var map_tile_state: TASK_STATE ## Текущее состояние конечного автомата плитки.
var map_bcs: Vector3 ## Яркость, контраст насыщенность var map_bcs: Vector3 ## Яркость, контраст насыщенность.
var map_server_addr: String ## Адрес сервера изображений карт в проекции Меркатора var map_server_addr: String ## Адрес сервера изображений карт в проекции Меркатора.
var map_tile_format: String ## var map_tile_format: String ##
var map_tile_stack: Array ## Стек для хранения плиток карты var map_tile_stack: Array ## Стек для хранения плиток карты.
var map_request: HTTPRequest ## Обработчик запросов http var map_request: HTTPRequest ## Обработчик запросов http.
var map_zoom: int ## Уровень детализации карты var map_zoom: int ## Уровень детализации карты.
var map_tile: Rect2i ## Область одной плитки: [x-координата области, y-координата области, x-индекс плитки, y-индекс плитки] var map_tile: Rect2i ## Область одной плитки: [x-координата области, y-координата области, x-индекс плитки, y-индекс плитки].
var map_mode: int ## Режим карты: 0 - приоритет РТО, 1 - приоритет РЛС var map_mode: int ## Режим карты: 0 - приоритет РТО, 1 - приоритет РЛС.
var prev_tiles_dic: Dictionary ## var prev_tiles_dic: Dictionary ##
var lnglat: Array ## Текущие координаты var lnglat: Array ## Текущие координаты.
var root_rect: Rect2i var root_rect: Rect2i
func _ready(): func _ready():
lnglat = TEST_DATA['Таганрог'] lnglat = TEST_DATA['Таганрог']
map_tile_state = TASK_STATE.DONE map_tile_state = TASK_STATE.DONE
@@ -74,6 +73,7 @@ func _ready():
log.info('Модуль географической карты готов') log.info('Модуль географической карты готов')
func _on_map_mode_changed(mode: int) -> void: func _on_map_mode_changed(mode: int) -> void:
var map_image_size = ProjectSettings.get_setting(MAP_MODES[mode]) var map_image_size = ProjectSettings.get_setting(MAP_MODES[mode])
material.set('shader_parameter/radius', MAP_RELATIVE_RADIUSES[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) img_tile_to_map_image(img_tile, dst_pos)
mark_image_center(map_image) mark_image_center(map_image)
texture = ImageTexture.create_from_image(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="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="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"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_pmqvj"]
resource_local_to_scene = true resource_local_to_scene = true
shader = ExtResource("1_tsdui") shader = ExtResource("1_tsdui")
shader_parameter/radius = 0.39 shader_parameter/radius = 0.39
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ys5v4"]
[node name="tilemap" type="Sprite2D"] [node name="tilemap" type="Sprite2D"]
material = SubResource("ShaderMaterial_pmqvj") material = SubResource("ShaderMaterial_pmqvj")
position = Vector2(560, 560) position = Vector2(560, 560)
script = ExtResource("1_mkfgj") 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: func _ready() -> void:
$lbl_commit.text = 'Текущая версия ПО УАРЭП: \"%s\"' % commit.VCS_HEAD $lbl_commit.text = 'Текущая версия ПО УАРЭП: \"%s\"' % commit.VCS_HEAD
if not OS.get_cmdline_args().has('++ограниченный'): if not OS.get_cmdline_args().has('++ограниченный'):

View File

@@ -1,43 +1,43 @@
@tool @tool
extends Panel class_name work extends Panel
## Основной скрипт для режима "Работа" ## Основной скрипт для режима "Работа".
@export var Bip: PackedScene ## Индикатор излучения цели @export var Bip: PackedScene ## Индикатор излучения цели.
@export var col_grey: Color ## Второй цвет для фона @export var col_grey: Color ## Второй цвет для фона.
@export var col_red: Color ## Первый цвет для фона @export var col_red: Color ## Первый цвет для фона.
@export var drag_scale_band: float ## Масштаб изменения параметра от движения мыши для строба по радиальному размеру @export var drag_scale_band: float ## Масштаб изменения параметра от движения мыши для строба по радиальному размеру.
@export var drag_scale_width: float ## Масштаб изменения параметра от движения мыши для строба по угловому размеру @export var drag_scale_width: float ## Масштаб изменения параметра от движения мыши для строба по угловому размеру.
@export var freq_high: float ## Верхняя рабочая частота, МГЦ. @export var freq_high: float ## Верхняя рабочая частота, МГЦ.
@export var freq_low: float ## Нижняя рабочая частота, МГЦ. @export var freq_low: float ## Нижняя рабочая частота, МГЦ.
@export var radius_center: Vector2 ## Координаты центра диаграммы пеленг-частота @export var radius_center: Vector2 ## Координаты центра диаграммы пеленг-частота.
@export var radius_internal: float ## Внутренний радиус диаграммы пеленг-частота @export var radius_internal: float ## Внутренний радиус диаграммы пеленг-частота.
@export var radius_outter: float ## Внешний радиус диаграммы пеленг-частота @export var radius_outter: float ## Внешний радиус диаграммы пеленг-частота.
@export var strob_max_band: float ## Максимальная ширина строба по углу @export var strob_max_band: float ## Максимальная ширина строба по углу.
@export var strob_max_width: float ## Максимальная ширина строба по углу @export var strob_max_width: float ## Максимальная ширина строба по углу.
@export var strob_min_band: float ## Минимальная ширина строба по частоте @export var strob_min_band: float ## Минимальная ширина строба по частоте.
@export var strob_min_width: float ## Минимальная ширина строба по углу @export var strob_min_width: float ## Минимальная ширина строба по углу.
@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон @export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон.
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании.
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания.
var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели.
var drag_pos_begin: Vector2 ## Точка начала перетаскивания var drag_pos_begin: Vector2 ## Точка начала перетаскивания.
var max_zoom: int ## Максимальный уровень детализации var max_zoom: int ## Максимальный уровень детализации.
var min_zoom: int ## Минимальный уровень детализации var min_zoom: int ## Минимальный уровень детализации.
var shift_pressed: bool ## Кнопка SHIFT нажата var shift_pressed: bool ## Кнопка SHIFT нажата.
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания var strob_band_begin: float ## Ширина строба в момент начала перетаскивания.
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания.
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания.
signal drag_begin ## Вызывается в момент начала перетаскивания signal drag_begin ## Вызывается в момент начала перетаскивания.
signal drag_continue ## Вызывается во время продолжения перетаскивания signal drag_continue ## Вызывается во время продолжения перетаскивания.
signal drag_end ## Вызывается в момент завершения перетаскивания signal drag_end ## Вызывается в момент завершения перетаскивания.
## Границы секторов блоков ФС по частоте в режиме РТО ## Границы секторов блоков ФС по частоте в режиме РТО.
const fs_band_rto: Dictionary = { const fs_band_rto: Dictionary = {
0: [200.0, 250.0], 0: [200.0, 250.0],
1: [250.0, 300.0], 1: [250.0, 300.0],
@@ -47,7 +47,7 @@ const fs_band_rto: Dictionary = {
5: [450.0, 500.0], 5: [450.0, 500.0],
6: [500.0, 550.0] } 6: [500.0, 550.0] }
## Границы секторов блоков ФС по частоте в режиме РЛС ## Границы секторов блоков ФС по частоте в режиме РЛС.
const fs_band_rls: Dictionary = { const fs_band_rls: Dictionary = {
0: [480.0, 490.0], 0: [480.0, 490.0],
1: [490.0, 500.0], 1: [490.0, 500.0],
@@ -57,7 +57,7 @@ const fs_band_rls: Dictionary = {
5: [530.0, 540.0], 5: [530.0, 540.0],
6: [540.0, 550.0] } 6: [540.0, 550.0] }
## Границы секторов блоков ФС по пеленгу ## Границы секторов блоков ФС по пеленгу.
const fs_sectors: Dictionary = { const fs_sectors: Dictionary = {
0: [0.0, 90.0], 0: [0.0, 90.0],
3: [90.0, 180.0], 3: [90.0, 180.0],
@@ -77,29 +77,29 @@ var fs_band = fs_band_rto # Текущий режим блоков ФС
var fs_selected: Dictionary # Словарь выбранных секторов var fs_selected: Dictionary # Словарь выбранных секторов
var fs_active: Dictionary # Словарь секторов назначенных на подавление var fs_active: Dictionary # Словарь секторов назначенных на подавление
## Состояние перетаскивания ## Состояние перетаскивания.
enum DragFSM { enum DragFSM {
DRAG, ## В процессе DRAG, ## В процессе.
IDLE, ## Не активно, ожидание IDLE, ## Не активно, ожидание.
OFF ## Выключено OFF ## Выключено.
} }
## Состояние перетаскивания ## Состояние перетаскивания.
enum BtnSel { enum BtnSel {
SECTOR, ## В процессе SECTOR, ## В процессе.
THREAT, ## Не активно, ожидание THREAT, ## Не активно, ожидание.
FS ## Выключено FS ## Выключено.
} }
## Обработчик сигнала изменения списка целей ## Обработчик сигнала изменения списка целей.
func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '%02d' % threats.size() 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_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns)
## Обработчик нажатия на кнопку вид ## Обработчик нажатия на кнопку вид.
func on_button_view_toggled(toggled: bool): func on_button_view_toggled(toggled: bool):
signaller.emit_signal('map_mode_changed', int(toggled)) signaller.emit_signal('map_mode_changed', int(toggled))
if toggled: if toggled:
@@ -124,7 +124,7 @@ func _exit_tree() -> void:
timer1.queue_free() timer1.queue_free()
## Производит инициализацию ## Производит инициализацию.
func _ready(): func _ready():
min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5) min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5)
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19) 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('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected')) signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
interfer.connect('interfer_update', Callable(self, 'on_interfer_new')) 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: func on_enter_tree() -> void:
call_deferred('_on_btn_scale_pressed') call_deferred('_on_btn_scale_pressed')
@@ -157,7 +172,7 @@ func on_enter_tree() -> void:
$tilemap.position = $canvas.get_strob_center() $tilemap.position = $canvas.get_strob_center()
## Производит отображение цели на диаграмму ## Производит отображение цели на диаграмму.
func map_threat_to_bip(th: threats.Threat, bip: Control): func map_threat_to_bip(th: threats.Threat, bip: Control):
bip.position = tools.pos_calc( bip.position = tools.pos_calc(
th.freq, th.freq,
@@ -169,13 +184,13 @@ func map_threat_to_bip(th: threats.Threat, bip: Control):
freq_high) - bip.size / 2 freq_high) - bip.size / 2
## Обработчик сигнала обновления цели ## Обработчик сигнала обновления цели.
func on_threat_update(th): func on_threat_update(th):
var bip = get_node('%d' % th.id) var bip = get_node('%d' % th.id)
map_threat_to_bip(th, bip) map_threat_to_bip(th, bip)
## Обработчик выбора помехи для цели ## Обработчик выбора помехи для цели.
func on_interfer_new(ecm): func on_interfer_new(ecm):
if interfer.thrs.has(ecm.ispp): if interfer.thrs.has(ecm.ispp):
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) set_fs_color(ecm)
## Обработчик выключения всех помех ## Обработчик выключения всех помех.
func on_interfer_off_all(): func on_interfer_off_all():
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for bip in bips: for bip in bips:
@@ -202,7 +217,7 @@ func on_interfer_off_all():
update_fs_colors() update_fs_colors()
## Обработчик сигнала обнаружения цели ## Обработчик сигнала обнаружения цели.
func on_threat_new(th) -> void: func on_threat_new(th) -> void:
var bip = Bip.instantiate() var bip = Bip.instantiate()
bip.name = '%d' % th.id bip.name = '%d' % th.id
@@ -210,20 +225,20 @@ func on_threat_new(th) -> void:
add_child(bip) add_child(bip)
## Обработчик сигнала потери цели ## Обработчик сигнала потери цели.
func on_threat_lost(th) -> void: func on_threat_lost(th) -> void:
var bip = get_node('%d' % th.id) var bip = get_node('%d' % th.id)
remove_child(bip) remove_child(bip)
bip.free() bip.free()
## обработчик нажатия на цель на экране ## обработчик нажатия на цель на экране.
func on_bip_pressed(th_id, _ecm_btns): func on_bip_pressed(th_id, _ecm_btns):
if btn_select == BtnSel.THREAT: if btn_select == BtnSel.THREAT:
signaller.emit_signal('rto_threat_sel', th_id) signaller.emit_signal('rto_threat_sel', th_id)
## Обработчик выбора РТО цели ## Обработчик выбора РТО цели.
func on_rto_threat_sel(th_id, ecm_btns): func on_rto_threat_sel(th_id, ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips: for item in bips:
@@ -236,7 +251,7 @@ func on_rto_threat_sel(th_id, ecm_btns):
set_btns_disabled(false, btn) set_btns_disabled(false, btn)
## Обработчик снятия выбора РТО цели ## Обработчик снятия выбора РТО цели.
func on_rto_threat_unsel(th_id, _ecm_btns): func on_rto_threat_unsel(th_id, _ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips: for item in bips:
@@ -246,13 +261,13 @@ func on_rto_threat_unsel(th_id, _ecm_btns):
set_ecm_btns_state(true) set_ecm_btns_state(true)
## Обработчик нажатия кнопки "Строб". Управляет отображением строба ## Обработчик нажатия кнопки "Строб". Управляет отображением строба.
func on_button_strobe_pressed() -> void: func on_button_strobe_pressed() -> void:
drag_fsm = DragFSM.IDLE if $btns_select/btn_strob.is_pressed() else DragFSM.OFF drag_fsm = DragFSM.IDLE if $btns_select/btn_strob.is_pressed() else DragFSM.OFF
$canvas.set_strob_visible(drag_fsm == DragFSM.IDLE) $canvas.set_strob_visible(drag_fsm == DragFSM.IDLE)
## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей ## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей.
func on_button_select(btn_this, btn_others) -> void: func on_button_select(btn_this, btn_others) -> void:
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
btn_select = btn_this.get_meta('state') 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) set_ecm_btns_state(true)
## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе ## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе.
func on_button_pressed(btn_this, btn_others) -> void: func on_button_pressed(btn_this, btn_others) -> void:
var fs_arr: Array = [] var fs_arr: Array = []
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) 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) signaller.emit_signal('interfer_init', btn_this, fs_arr)
## Управляет состоянием кнопок в радиогруппе при выборе помехи ## Управляет состоянием кнопок в радиогруппе при выборе помехи.
func on_interfer_selected(ecm, btns) -> void: func on_interfer_selected(ecm, btns) -> void:
var ecm_name: String var ecm_name: String
if ecm != null: if ecm != null:
@@ -287,21 +302,21 @@ func on_interfer_selected(ecm, btns) -> void:
btn.set_pressed(false) btn.set_pressed(false)
## Возвращает ширину строба по направлению ## Возвращает ширину строба по направлению.
func get_strob_width(pos: Vector2, prev: float) -> float: func get_strob_width(pos: Vector2, prev: float) -> float:
var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width 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) strob_dir_width = tools.clip_value(strob_dir_width, strob_min_width, strob_max_width)
return strob_dir_width return strob_dir_width
## Возвращает ширину строба по частоте ## Возвращает ширину строба по частоте.
func get_strob_band(pos: Vector2, prev: float) -> float: func get_strob_band(pos: Vector2, prev: float) -> float:
var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band 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) strob_dir_band = tools.clip_value(strob_dir_band, strob_min_band, strob_max_band)
return strob_dir_band return strob_dir_band
## Устанавливает центр строба по частоте и направлению ## Устанавливает центр строба по частоте и направлению.
func set_strob(pos: Vector2) -> void: func set_strob(pos: Vector2) -> void:
var radp: Vector2 = tools.map_dec_to_rad(radius_center, pos) var radp: Vector2 = tools.map_dec_to_rad(radius_center, pos)
if radp.y < $canvas.get_radius_outter(): if radp.y < $canvas.get_radius_outter():
@@ -309,7 +324,7 @@ func set_strob(pos: Vector2) -> void:
$canvas.set_strob_radius(radp.y) $canvas.set_strob_radius(radp.y)
## Обработка движения мыши для управления стробом. Вызывается во время движения мыши ## Обработка движения мыши для управления стробом. Вызывается во время движения мыши.
func _on_drag_continue(event) -> void: func _on_drag_continue(event) -> void:
if drag_button == MOUSE_BUTTON_RIGHT: if drag_button == MOUSE_BUTTON_RIGHT:
if shift_pressed: if shift_pressed:
@@ -322,7 +337,7 @@ func _on_drag_continue(event) -> void:
set_strob(event.position) set_strob(event.position)
## Обработка движения мыши для управления стробом. Вызывается при нажатии мыши ## Обработка движения мыши для управления стробом. Вызывается при нажатии мыши.
func _on_drag_begin(event) -> void: func _on_drag_begin(event) -> void:
drag_pos_begin = event.position drag_pos_begin = event.position
if drag_button == MOUSE_BUTTON_LEFT: if drag_button == MOUSE_BUTTON_LEFT:
@@ -332,7 +347,7 @@ func _on_drag_begin(event) -> void:
strob_band_begin = $canvas.get_strob_band() strob_band_begin = $canvas.get_strob_band()
## Обработчик событий ввода. Вызывается godot ## Обработчик событий ввода. Вызывается godot.
func _input(event) -> void: func _input(event) -> void:
if not is_visible_in_tree(): return if not is_visible_in_tree(): return
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
@@ -355,21 +370,21 @@ func _input(event) -> void:
shift_pressed = event.pressed shift_pressed = event.pressed
## Вызывается по нажатию кнопки "Детализация" ## Вызывается по нажатию кнопки "Детализация".
func _on_btn_scale_pressed() -> void: func _on_btn_scale_pressed() -> void:
var zoom = $btn_zoom.get_meta('zoom') var zoom = $btn_zoom.get_meta('zoom')
zoom = zoom + 1 if zoom < max_zoom else min_zoom zoom = zoom + 1 if zoom < max_zoom else min_zoom
signaller.emit_signal('zoom_changed', zoom) signaller.emit_signal('zoom_changed', zoom)
## Вызывается по завершению изменения детализации карты ## Вызывается по завершению изменения детализации карты.
func _on_zoom_complete(zoom: int) -> void: func _on_zoom_complete(zoom: int) -> void:
var prefix = $btn_zoom.get_meta('prefix') var prefix = $btn_zoom.get_meta('prefix')
$btn_zoom/lbl.text = '%s %d' % [prefix, zoom] $btn_zoom/lbl.text = '%s %d' % [prefix, zoom]
$btn_zoom.set_meta('zoom', zoom) $btn_zoom.set_meta('zoom', zoom)
# Обработчик нажатия по сектору формирователя сигналов ## Обработчик нажатия по сектору формирователя сигналов.
func sel_fs_sector(event): func sel_fs_sector(event):
if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT): if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT):
var center: Vector2 = $tilemap.position 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="Script" path="res://scenes/работа/работа.gd" id="1_niok4"]
[ext_resource type="PackedScene" uid="uid://nl1vklubr5kr" path="res://scenes/bip/bip.tscn" id="2_br3s6"] [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 = ExtResource("11_ekapd")
shader_parameter/radius = 0.39 shader_parameter/radius = 0.39
[sub_resource type="ImageTexture" id="ImageTexture_cnmvt"]
[node name="Работа" type="Panel"] [node name="Работа" type="Panel"]
script = ExtResource("1_niok4") script = ExtResource("1_niok4")
Bip = ExtResource("2_br3s6") Bip = ExtResource("2_br3s6")
@@ -120,6 +122,33 @@ size_flags_vertical = 3
text = "Подавление" text = "Подавление"
toggle_mode = true 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")] [node name="btn_zoom" parent="." instance=ExtResource("9_oey3x")]
layout_mode = 0 layout_mode = 0
offset_left = 12.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 TableHeader = preload('res://table/header.tscn')
const CellYemsButton = preload('res://scenes/эмс/кнопка-эмс.tscn') const CellYemsButton = preload('res://scenes/эмс/кнопка-эмс.tscn')
const CellLineEdit = preload('res://table/ячейка-2.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 CellFront = preload('res://scenes/cell/cell-front.tscn')
const CellFrontRear = preload('res://scenes/cell/cell-front-rear.tscn') const CellFrontRear = preload('res://scenes/cell/cell-front-rear.tscn')
# Режимы работы выходов ## Режимы работы выходов.
const OUT_MODE: Array = ['Работа', 'Контроль', '1', '0'] # const OUT_MODE: Array = ['Работа', 'Контроль', '1', '0'] #
const COLUMN_OPTS_BTN: Array = [5] const COLUMN_OPTS_BTN: Array = [5]
const TABLE_ENTRY_COLUMNS: Array = [2,3] 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] const IN_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty, CellLEEmpty]
var g_boards: Dictionary # Словарь плат ЭМС var g_boards: Dictionary ## Словарь плат ЭМС.
var posx: int = 125 # Позиция элементов по x var posx: int = 125 ## Позиция элементов по x.
var posy: int = 70 # Позиция элементов по y var posy: int = 70 ## Позиция элементов по y.
func _ready() -> void: func _ready() -> void:
call_deferred('init_boards') call_deferred('init_boards')
## Инициализация основных элементов экрана ЭМС ## Инициализация основных элементов экрана ЭМС.
func init_boards(): func init_boards():
# Выставление позиций элементов ЭМС на экране # Выставление позиций элементов ЭМС на экране
$scrollin.set_position(Vector2(posx,posy)) $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, 'выход') on_disconnect($scrl_out_set/tbl_out_set, selected_rows_out, 'выход')
## Разрывает связь входа и выхода, [param tbl] - таблица, [param selected_rows] - выбранные строки ## Разрывает связь входа и выхода, [param tbl] - таблица, [param selected_rows] - выбранные строки.
## [param type_dev] - тип, 'вход' или 'выход' ## [param type_dev] - тип, 'вход' или 'выход'.
func on_disconnect(tbl, selected_rows, type_dev: String): func on_disconnect(tbl, selected_rows, type_dev: String):
var dev = tbl.get_node_user_data(0, 0) var dev = tbl.get_node_user_data(0, 0)
var user_data: Array = tbl.get_node_user_data(0, selected_rows[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) set_out_dev(dev)
## Обработчик нажатия кнопки "Прочитать" ## Обработчик нажатия кнопки "Прочитать".
func on_btn_flash_read(btn): func on_btn_flash_read(btn):
await get_tree().create_timer(0.1).timeout await get_tree().create_timer(0.1).timeout
btn.pressed = false btn.pressed = false
## Обработчик нажатия кнопки "Записать" ## Обработчик нажатия кнопки "Записать".
func on_btn_flash_write(btn): func on_btn_flash_write(btn):
await get_tree().create_timer(0.1).timeout await get_tree().create_timer(0.1).timeout
btn.pressed = false btn.pressed = false
## Инициализация таблицы с файлами настроек ЭМС ## Инициализация таблицы с файлами настроек ЭМС.
func init_tbl_files(): func init_tbl_files():
$scrl_files/tbl_files.set_header([TableHeader, TableHeader, TableHeader]) $scrl_files/tbl_files.set_header([TableHeader, TableHeader, TableHeader])
$scrl_files/tbl_files.set_header_text(['Имя файла', 'Дата изменения', 'Размер']) $scrl_files/tbl_files.set_header_text(['Имя файла', 'Дата изменения', 'Размер'])
$scrl_files/tbl_files.set_columns_min_size([200, 120, 70]) $scrl_files/tbl_files.set_columns_min_size([200, 120, 70])
## Инициализация таблиц входов ## Инициализация таблиц входов.
func init_tbl_in(): func init_tbl_in():
# Инициализация основной таблицы входов, в ней отображается информация о параметрах и состоянии # Инициализация основной таблицы входов, в ней отображается информация о параметрах и состоянии
var header_type: Array = [TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader] 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')) $scrl_in_set/tbl_in_set.connect('selected_changed', Callable(self, 'on_selected_changed_si'))
## Обработчик редактирования Entry в таблице параметров входов/выходов ## Обработчик редактирования Entry в таблице параметров входов/выходов.
func on_edit_entry(text : String, entry): func on_edit_entry(text : String, entry):
print_debug(text, entry) print_debug(text, entry)
## Обработчик выбора строки в таблице входов ## Обработчик выбора строки в таблице входов.
func on_selected_changed_in(i_row: int): func on_selected_changed_in(i_row: int):
var selecter_rows: Array = [] var selecter_rows: Array = []
$scrollin/tbl_in.get_selected_rows(selecter_rows) $scrollin/tbl_in.get_selected_rows(selecter_rows)
@@ -156,19 +156,19 @@ func on_selected_changed_in(i_row: int):
set_in_dev(dev) set_in_dev(dev)
## Обработчик нажатия на таблицу входов ## Обработчик нажатия на таблицу входов.
func on_row_pressed_in(i_row: int): func on_row_pressed_in(i_row: int):
on_row_pressed(i_row, $scrollin/tbl_in) on_row_pressed(i_row, $scrollin/tbl_in)
on_selected_changed_in(i_row) on_selected_changed_in(i_row)
## Выбор входного устройства, для отображения в таблице соединений входа и изменения параметров ## Выбор входного устройства, для отображения в таблице соединений входа и изменения параметров.
func set_in_dev(dev): func set_in_dev(dev):
var row_type: Array = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState] 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]) 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): func on_selected_changed_si(i_row: int):
if i_row < 2: if i_row < 2:
return return
@@ -181,7 +181,7 @@ func on_selected_changed_si(i_row: int):
on_row_pressed_out(i) on_row_pressed_out(i)
## Обработчик нажатия на таблицу соединений входа и изменения параметров ## Обработчик нажатия на таблицу соединений входа и изменения параметров.
func on_row_pressed_si(i_row: int): func on_row_pressed_si(i_row: int):
if i_row < 2: if i_row < 2:
return return
@@ -189,7 +189,7 @@ func on_row_pressed_si(i_row: int):
on_selected_changed_si(i_row) on_selected_changed_si(i_row)
## Инициализация таблиц выходов ## Инициализация таблиц выходов.
func init_tbl_out(): func init_tbl_out():
# Инициализация основной таблицы выходов, в ней отображается информация о параметрах и состоянии # Инициализация основной таблицы выходов, в ней отображается информация о параметрах и состоянии
var header_text = ['Выходы', 'Соединитель', 'мкс', 'мкс', 'Состояние', 'Режим'] 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')) $scrl_out_set/tbl_out_set.connect('selected_changed', Callable(self, 'on_selected_changed_so'))
## Обработчик выбора строки в таблице соединений выхода и изменения параметров ## Обработчик выбора строки в таблице соединений выхода и изменения параметров.
func on_selected_changed_so(i_row: int): func on_selected_changed_so(i_row: int):
if i_row < 2: if i_row < 2:
return return
@@ -238,7 +238,7 @@ func on_selected_changed_so(i_row: int):
on_row_pressed_in(i) on_row_pressed_in(i)
## Обработчик нажатия на таблицу соединений выхода и изменения параметров ## Обработчик нажатия на таблицу соединений выхода и изменения параметров.
func on_row_pressed_so(i_row: int): func on_row_pressed_so(i_row: int):
if i_row < 2: if i_row < 2:
return return
@@ -246,7 +246,7 @@ func on_row_pressed_so(i_row: int):
on_selected_changed_so(i_row) on_selected_changed_so(i_row)
## Обработчик выбора строки в таблице выходов ## Обработчик выбора строки в таблице выходов.
func on_selected_changed_out(i_row: int): func on_selected_changed_out(i_row: int):
var selecter_rows: Array = [] var selecter_rows: Array = []
$scrollout/tbl_out.get_selected_rows(selecter_rows) $scrollout/tbl_out.get_selected_rows(selecter_rows)
@@ -255,13 +255,13 @@ func on_selected_changed_out(i_row: int):
set_out_dev(dev) set_out_dev(dev)
## Обработчик выбора строки в таблице выходов ## Обработчик выбора строки в таблице выходов.
func on_row_pressed_out(i_row: int): func on_row_pressed_out(i_row: int):
on_row_pressed(i_row, $scrollout/tbl_out) on_row_pressed(i_row, $scrollout/tbl_out)
on_selected_changed_out(i_row) on_selected_changed_out(i_row)
## Выбор выходного устройства, для отображения в таблице соединений выхода и изменения параметров ## Выбор выходного устройства, для отображения в таблице соединений выхода и изменения параметров.
func set_out_dev(dev): func set_out_dev(dev):
var row_type: Array = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState, CellOptBtn] 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]) 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) mode.select(mode_index)
## Выбор входного или выходного устройства [param tbl] - таблица, [param dev] - устройство, ## Выбор входного или выходного устройства.[br]
## [param row_type] - массив с типами колонок, [param row_type_conn] - массив с пустыми LineEdit ## [param tbl] - таблица,[br]
## [param lbl_text] - текст отображаемый во 2 строке: пример: ('Список соединённых входов :') ## [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): func set_dev(tbl, dev, row_type, row_type_conn, lbl_text, row_size):
tbl.clear_rows() tbl.clear_rows()
tbl.add_row(row_type) 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, []) tbl.connect_columns(self, 'text_submitted', 'on_edit_entry', TABLE_ENTRY_COLUMNS, [])
## Обработчик нажатия кнопки connect ## Обработчик нажатия кнопки connect.
func on_btn_connect(): func on_btn_connect():
var in_row_index: Array = [] var in_row_index: Array = []
var out_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) add_connection_dev($scrl_in_set/tbl_in_set, out_dev, in_dev, IN_SET_ROW, out_user_data)
## образовывает связь между выбранным входом и выходом [param tbl] - таблица, [param dev1] - устройство1, ## Образовывает связь между выбранным входом и выходом.[br]
## [param dev2] - устройство 2, [param set_row] - массив с пустыми LineEdit ## [param tbl] - таблица,[br]
## [param user_data] - пользовательские данные устройства1 ## [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): func add_connection_dev(tbl, dev1, dev2, set_row, user_data):
if not dev1.connector in dev2.connect_devs: if not dev1.connector in dev2.connect_devs:
tbl.add_row(set_row) 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 dev2.connect_devs[dev1.connector] = user_data
## Отключает возможность редактирования LineEdit в таблице [param tbl] - таблица, ## Отключает возможность редактирования LineEdit в таблице.[br]
## [param num_col] - номер колонки, [param i_row] - номер столбца ## [param tbl] - таблица,[br]
## [param num_col] - номер колонки,[br]
## [param i_row] - номер столбца.[br]
func disable_edit(tbl, num_col: int, i_row: int): func disable_edit(tbl, num_col: int, i_row: int):
for col in range(num_col): for col in range(num_col):
var node: LineEdit = tbl.get_node2(col, i_row) var node: LineEdit = tbl.get_node2(col, i_row)
node.editable = false node.editable = false
## Обработчик выбора строки с таблице ## Обработчик выбора строки с таблице.
func on_row_pressed(i_row: int, tbl): func on_row_pressed(i_row: int, tbl):
tbl.clear_rows_selected() tbl.clear_rows_selected()
var is_row_selected = tbl.is_row_selected(i_row) 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 ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от КАПС РПБ, мс.
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм.
class CapsRpb: class CapsRpb:
signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось.
signal data_received(unit: CapsRpb) ## Сигнал данные приняты signal data_received(unit: CapsRpb) ## Сигнал данные приняты.
signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды.
signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения.
static var json_conv: = JSON.new() static var json_conv: = JSON.new()
var online: = false ## Состояние связи с источником сообщений var online: = false ## Состояние связи с источником сообщений.
var name: String ## Имя экземпляра var name: String ## Имя экземпляра.
var json_dic: Dictionary ## Аппарат для разбора сообщений var json_dic: Dictionary ## Аппарат для разбора сообщений.
var tick: = 0 ## Тик время последнего обновления, мс var tick: = 0 ## Тик время последнего обновления, мс.
var tx_data: = PackedByteArray() ## Пакет для отправки var tx_data: = PackedByteArray() ## Пакет для отправки.
var tx_stack: Array ## Массив пакетов для отправки var tx_stack: Array ## Массив пакетов для отправки.
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]]) func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm): self.name = nm func _init(nm): self.name = nm

View File

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

View File

@@ -1,8 +1,8 @@
extends Node class_name Iterfer extends Node
## Представление помехи ## Представление помехи.
## Режимы помехи ## Режимы помехи.
const ITERFER_MODE = { const ITERFER_MODE = {
'off': ['Откл', ['freq', 'width'], 0], 'off': ['Откл', ['freq', 'width'], 0],
'auto': ['АВТО', ['freq', 'width'], 1000], 'auto': ['АВТО', ['freq', 'width'], 1000],
@@ -27,16 +27,16 @@ const WIDTH_MAX = 120
const WIDTH_MIN = 0 const WIDTH_MIN = 0
const SOURCE_INTERFER = ['th','fs','cu'] const SOURCE_INTERFER = ['th','fs','cu']
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей.
const INTERFER_OFF = 'off' const INTERFER_OFF = 'off'
const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен.
var msg_ss: int = 0 ## счётчик сообщений var msg_ss: int = 0 ## Счётчик сообщений.
var id_array: Array ## Массив id воздействий var id_array: Array ## Массив id воздействий.
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия.
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия.
var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия.
## Сеанс помехи ## Сеанс помехи.
class Interfer: class Interfer:
var ss: int = 0 ## Счётчик сообщений. var ss: int = 0 ## Счётчик сообщений.
var ispp: int = 0 ## Индекс сеанса. var ispp: int = 0 ## Индекс сеанса.
@@ -48,7 +48,7 @@ class Interfer:
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров). var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров. var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_tx: int ## Тик время обновления цели, мс. var tick_tx: int ## Тик время обновления цели, мс.
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха var source_interfer: String = '' ## Тип объекта по которой поставлена помеха.
func _to_string() -> String: func _to_string() -> String:
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni] 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(): func _ready():
var ecms: Dictionary = {} ## Словарь помех var ecms: Dictionary = {} ## Словарь помех.
for i in range(ID_INTERFERS_LEN): # Заполняет массив ID целей for i in range(ID_INTERFERS_LEN): # Заполняет массив ID целей
id_array.append(i + 1) id_array.append(i + 1)
var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп') 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)) signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit, ecms))
# Проверяет состояние отправки пакета и если не доставлен, повторяет отправку ## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку.
func on_timer_check_state(unit, ecms, resend_timeout): func on_timer_check_state(unit, ecms, resend_timeout):
var tick = Time.get_ticks_msec() var tick = Time.get_ticks_msec()
for ecm in ecms.values(): for ecm in ecms.values():
@@ -124,7 +124,7 @@ func on_timer_check_state(unit, ecms, resend_timeout):
ecm.tick_tx = tick ecm.tick_tx = tick
## Производит приём состояния помех. [param unit] -> [param ecms] ## Производит приём состояния помех. [param unit] -> [param ecms].
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
if not unit.json_dic.has('ts'): return if not unit.json_dic.has('ts'): return
if not (unit.json_dic['ts'] is float): 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) call_deferred('emit_signal', 'interfer_resized', ecms)
## Вызыватся, когда пользователь выбрал помеху и выбраны цели ## Вызыватся, когда пользователь выбрал помеху и выбраны цели.
func on_interfer_create(btn, sel_threats, fs_arr, _unit, ecms): func on_interfer_create(btn, sel_threats, fs_arr, _unit, ecms):
for item in sel_threats: for item in sel_threats:
var param: Dictionary = {} var param: Dictionary = {}
@@ -262,5 +262,5 @@ func push_id(id : int):
id_array.sort() id_array.sort()
## отправляет словаhь помех в юнит, для запаковки и отправки в 5П28 ## Отправляет словарь помех в юнит, для запаковки и отправки в 5П28.
func on_get_interfers(unit, ecms): unit.pack_interfers(cu, ecms) 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-плитками. ## Утилиты для работы с меркаторовскими XYZ-плитками.
const R2D: = 180.0 / PI const R2D: = 180.0 / PI
const RE: = 6378137.0 ## Радиус Земли экваториальный в метрах const RE: = 6378137.0 ## Радиус Земли экваториальный в метрах.
const RP: = 6356752.31424518 ## Радиус Земли полярный в метрах const RP: = 6356752.31424518 ## Радиус Земли полярный в метрах.
const CE: = 2.0 * PI * RE ## Длина окружности Земли в метрах по экватору const CE: = 2.0 * PI * RE ## Длина окружности Земли в метрах по экватору.
const CP: = 2.0 * PI * RP ## Длина окружности Земли в метрах через полюсы const CP: = 2.0 * PI * RP ## Длина окружности Земли в метрах через полюсы.
const EPSILON: = 1e-14 const EPSILON: = 1e-14
const LL_EPSILON: = 1e-11 const LL_EPSILON: = 1e-11
const MAX_ZOOM: = 20 const MAX_ZOOM: = 20
@@ -14,15 +14,15 @@ const MAX_NORTH = 85.051129
const MAX_SOUTH = -85.051129 const MAX_SOUTH = -85.051129
## XYZ-плитка веб-меркатора [param x], [param y], [param z] индексы ## XYZ-плитка веб-меркатора [param x], [param y], [param z] индексы.
# [b]x[/b] и [b]y[/b] плитки и уровень масштабирования [b]z[/b]. ## [b]x[/b] и [b]y[/b] плитки и уровень масштабирования [b]z[/b].
class Tile: class Tile:
var x: int var x: int
var y: int var y: int
var z: int var z: int
var lng: float ## Координаты, которые плитка должна покрывать, долгота, градусы var lng: float ## Координаты, которые плитка должна покрывать, долгота, градусы.
var lat: float ## Широта, градусы var lat: float ## Широта, градусы.
var is_root: bool ## Признак, что плитка корневая (покрывает координаты) var is_root: bool ## Признак, что плитка корневая (покрывает координаты).
func as_array(): return [self.x, self.y, self.z] func as_array(): return [self.x, self.y, self.z]
@@ -62,7 +62,7 @@ class LngLat:
var lng: float = 0.0 ## Долгота в десятичных градусах восточной долготы. var lng: float = 0.0 ## Долгота в десятичных градусах восточной долготы.
var lat: float = 0.0 ## Широта в десятичных градусах северной широты. var lat: float = 0.0 ## Широта в десятичных градусах северной широты.
## Возвращает в виде массива ## Возвращает в виде массива.
func as_array() -> Array: return [self.lng, self.lat] func as_array() -> Array: return [self.lng, self.lat]
func _to_string() -> String: return '[%f, %f, %f]' % [self.x, self.y, self.z] func _to_string() -> String: return '[%f, %f, %f]' % [self.x, self.y, self.z]
@@ -79,7 +79,7 @@ class LngLatBbox:
var east: float ## Восток var east: float ## Восток
var north: float ## Север var north: float ## Север
## Возвращает в виде массива ## Возвращает в виде массива.
func as_array() -> Array: return [self.west, self.south, self.east, self.north] 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] 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 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)) func asinh(val: float): return log(val + sqrt(val * val + 1.0))
# Преобразует [param lon] в градусах восточной долготы, [param lat] в градусах ## Преобразует [param lon] в градусах восточной долготы, [param lat] в градусах.
# северной долготы, [param alt] высоты в метрах в фиксированные координаты (x, y, z) Земли. ## северной долготы, [param alt] высоты в метрах в фиксированные координаты (x, y, z) Земли.
func lnglat_to_ecef(lng: float, lat: float, alt: float = 0.0) -> Array: func lnglat_to_ecef(lng: float, lat: float, alt: float = 0.0) -> Array:
alt += (RE + RP) / 2.0 alt += (RE + RP) / 2.0
var latrad: float = radians(lat) var latrad: float = radians(lat)
@@ -148,7 +148,7 @@ func find_up_left(tiles: Array):
return null return null
## Lon./lat. to tile numbers ## [param lon]/[param lat]. для номера плитки.
func deg2num(lng: float, lat: float, zoom: int): func deg2num(lng: float, lat: float, zoom: int):
var n: = float(1 << zoom) var n: = float(1 << zoom)
var xtile: = int((lng + 180.0) / 360.0 * n) var xtile: = int((lng + 180.0) / 360.0 * n)
@@ -156,7 +156,7 @@ func deg2num(lng: float, lat: float, zoom: int):
return [xtile, ytile] return [xtile, ytile]
## Tile numbers to lon./lat. ## Номера плитки для [param lon]/[param lat].
func num2deg(x: int, y: int, zoom: int): func num2deg(x: int, y: int, zoom: int):
var n: = float(1 << zoom) var n: = float(1 << zoom)
var lng: = float(x) / n * 360.0 - 180.0 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)] return [lng, degrees(lat)]
## Расстояние по горизонтали в метрах, представленное одним пикселем ## Расстояние по горизонтали в метрах, представленное одним пикселем.
## [param lat] - Широта, градусы.[br] ## [param lat] - Широта, градусы.[br]
## [param zoom] - Уровень детализации.[br] ## [param zoom] - Уровень детализации.[br]
## [param size] - Размер плитки в пикселях.[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) return (CE / float(size)) * cos(radians(lat)) / float(2 ** zoom)
## Расстояние по горизонтали в метрах, представленное одной плиткой ## Расстояние по горизонтали в метрах, представленное одной плиткой.
## [param lat] - Широта, градусы.[br] ## [param lat] - Широта, градусы.[br]
## [param zoom] - Уровень детализации.[br] ## [param zoom] - Уровень детализации.[br]
func dist_per_tile(lat: float, zoom: int) -> float: 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] 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: func get_tiles_bounds(tiles: Array[Tile]) -> Array:
var mm = [] var mm = []
for t in tiles: mm.append(bounds(t).west) for t in tiles: mm.append(bounds(t).west)
@@ -245,7 +245,7 @@ func get_tiles_bounds(tiles: Array[Tile]) -> Array:
## Возвращает левую верхнюю долготу и широту плитки.[br] ## Возвращает левую верхнюю долготу и широту плитки.[br]
## [param tile] Плитка.[br] ## [param tile] - Плитка.[br]
## [codeblock] ## [codeblock]
## >>> ul(Tile(x=0, y=0, z=1)) ## >>> ul(Tile(x=0, y=0, z=1))
## LngLat(lng=-180.0, lat=85.0511287798066) ## 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]) return LngLat.new(ll[0], ll[1])
## Соседи плитки. [method neighbors] возвращает до восьми ## Соседи плитки. [method neighbors] возвращает до восьми.[br]
## соседних плиток, при этом плитки будут опущены, если они не являются действительными, например. ## Cоседних плиток, при этом плитки будут опущены, если они не являются действительными, например:[br]
## Tile(-1, -1, z). [param tile]: Плитка или последовательность int ## Tile(-1, -1, z). [param tile]: Плитка или последовательность int.[br]
## Может быть либо экземпляр Tile, либо 3 ints, X, Y, Z. ## Может быть либо экземпляр Tile, либо 3 ints, X, Y, Z.[br]
## [return] Массив ## [return] Массив
## [codeblock] ## [codeblock]
## >>> neighbors(Tile(486, 332, 10)) ## >>> neighbors(Tile(486, 332, 10))
@@ -343,7 +343,7 @@ func neighbors(tile: Tile) -> Array:
return tiles return tiles
## Возвращает все плитки в радиусе [param r] вокруг заданной плитки [param tile] ## Возвращает все плитки в радиусе [param r] вокруг заданной плитки [param tile].
func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array: func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array:
var xys = {} var xys = {}
var mi: int = 2 ** tile.z var mi: int = 2 ** tile.z
@@ -361,7 +361,7 @@ func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array:
return tiles return tiles
## Возвращает все плитки по периметру заданной плитки ## Возвращает все плитки по периметру заданной плитки.
func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array: func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array:
var tiles = [] var tiles = []
for i in range(-mr, mr + 1): for i in range(-mr, mr + 1):
@@ -375,7 +375,7 @@ func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array:
## Получение меркаторской граничной рамки веб-плитки.[br] ## Получение меркаторской граничной рамки веб-плитки.[br]
## [param tile] - Плитка.[br] ## [param tile] - Плитка.[br]
## [i]Эпсилон вычитается из правой границы и прибавляется к нижней[/i] ## [i]Эпсилон вычитается из правой границы и прибавляется к нижней.[/i]
func xy_bounds(tile: Tile, zoom: int) -> Bbox: func xy_bounds(tile: Tile, zoom: int) -> Bbox:
var tile_size = CE / pow(2, zoom) var tile_size = CE / pow(2, zoom)
var left = tile.x * tile_size - CE / 2 var left = tile.x * tile_size - CE / 2
@@ -393,7 +393,7 @@ func _xy(lng: float, lat: float, truncate=false) -> Array:
return [x, y] return [x, y]
## Получение плитки, содержащей долготу и широту ## Получение плитки, содержащей долготу и широту.
## [param lng], [param lat] - Пара долготы и широты в десятичных градусах.[br] ## [param lng], [param lat] - Пара долготы и широты в десятичных градусах.[br]
## [param zoom] - Уровень масштабирования веб-меркатора.[br] ## [param zoom] - Уровень масштабирования веб-меркатора.[br]
## [param truncate] - Нужно ли усекать вводимые данные до границ веб-меркатора.[br] ## [param truncate] - Нужно ли усекать вводимые данные до границ веб-меркатора.[br]
@@ -419,7 +419,7 @@ func create_tile(lng: float, lat: float, zoom: int, truncate: bool=false) -> Til
## Получение четверного ключа плитки.[br] ## Получение четверного ключа плитки.[br]
## [param tile] - Плитка ## [param tile] - Плитка.
func quadkey(tile: Tile, zoom: int) -> String: func quadkey(tile: Tile, zoom: int) -> String:
var rs: = '' var rs: = ''
for z in range(zoom, 0, -1): for z in range(zoom, 0, -1):
@@ -650,7 +650,7 @@ func _get_bbox_zoom(bbox: Array):
## [param tile] - Плитка.[br] ## [param tile] - Плитка.[br]
## [param fid] - Идентификатор объекта.[br] ## [param fid] - Идентификатор объекта.[br]
## [param props] - Необязательные дополнительные свойства признака.[br] ## [param props] - Необязательные дополнительные свойства признака.[br]
## [param projected] - Можно создать нестандартный веб-меркатор GeoJSON передав 'mercator'[br] ## [param projected] - Можно создать нестандартный веб-меркатор GeoJSON передав 'mercator'.[br]
## [param buffer] - Необязательное буферное расстояние для полигона GeoJSON.[br] ## [param buffer] - Необязательное буферное расстояние для полигона GeoJSON.[br]
## [param precision] - Координаты GeoJSON будут усечены до данного количества знаков после запятой.[br] ## [param precision] - Координаты GeoJSON будут усечены до данного количества знаков после запятой.[br]
func feature(tile: Tile, fid:String = 'null', props=null, projected='geographic', buffer=null) -> Dictionary: 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: class ModbusClient:
## Состояние автомата выполнения команды ## Состояние автомата выполнения команды.
enum CmdState { enum CmdState {
DONE, ## Команда выполнена DONE, ## Команда выполнена.
FAIL, ## Команда не выполнена FAIL, ## Команда не выполнена.
SEND, ## Буфер готов для отправки SEND, ## Буфер готов для отправки.
WAIT ## Ожидание выполнения WAIT ## Ожидание выполнения.
} }
var name: String var name: String
var unit: = 1 ## Адрес устройства Modbus var unit: = 1 ## Адрес устройства Modbus.
var cmd_state: = CmdState.DONE ## Код текущей команды var cmd_state: = CmdState.DONE ## Код текущей команды.
var tx_data: PackedByteArray ## Данные для отправки var tx_data: PackedByteArray ## Данные для отправки.
var online: = false ## Флаг. Если установлен, устройство на связи. Активный уровень - [b]true[/b]. var online: = false ## Флаг. Если установлен, устройство на связи. Активный уровень - [b]true[/b].
var tick_rx: = 0 ## Время приёма крайнего сообщения var tick_rx: = 0 ## Время приёма крайнего сообщения.
var tick_tx: = 0 ## Время отправки крайнего сообщения var tick_tx: = 0 ## Время отправки крайнего сообщения.
static var json_conv: = JSON.new() static var json_conv: = JSON.new()
signal command_done() ## Вызывается при успешном выполнении команды signal command_done() ## Вызывается при успешном выполнении команды.
signal command_fail() ## Вызывается при возникновении ошибки во время выполнения команды signal command_fail() ## Вызывается при возникновении ошибки во время выполнения команды.
signal line_changed() ## Вызывается при смене состояния связи с ячейкой signal line_changed() ## Вызывается при смене состояния связи с ячейкой.
signal data_received() ## Вызывается при приёме сообщения, до его разбора signal data_received() ## Вызывается при приёме сообщения, до его разбора.
signal parse_failed(msg: String) ## Вызывается при возникновении ошибки во время разбора пакета. Передаёт сообщение об ошибке signal parse_failed(msg: String) ## Вызывается при возникновении ошибки во время разбора пакета. Передаёт сообщение об ошибке.
signal holding_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения signal holding_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения.
signal input_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов signal input_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов.
signal info_received(msg: String) ## Вызывается при получении информационного сообщения signal info_received(msg: String) ## Вызывается при получении информационного сообщения.
signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации.
func _init(nm: String, u: int = 1): func _init(nm: String, u: int = 1):
unit = u unit = u
name = nm name = nm
## Изменяет состояние. Вызывать периодически[br] ## Изменяет состояние. Вызывать периодически.[br]
## [param tick] - Текущщее время в мс[br] ## [param tick] - Текущщее время в мс.[br]
func process(tick: int): func process(tick: int):
if online and ((tick - tick_rx) > ONLINE_TIMEOUT): if online and ((tick - tick_rx) > ONLINE_TIMEOUT):
online = false online = false
@@ -53,9 +53,9 @@ class ModbusClient:
cmd_state = CmdState.WAIT cmd_state = CmdState.WAIT
return rc return rc
## Производит разбор принятых данных. Вызывать при приёме данных на сокете[br] ## Производит разбор принятых данных. Вызывать при приёме данных на сокете.[br]
## [param data] - Данные принятые на сокете[br] ## [param data] - Данные принятые на сокете.[br]
## [param tick] - Текущщее время в мс[br] ## [param tick] - Текущщее время в мс.[br]
func parse(data: PackedByteArray, tick: int) -> bool: func parse(data: PackedByteArray, tick: int) -> bool:
tick_rx = tick tick_rx = tick
if not online: 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} 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: class SocketTCP extends TCPServer:
const RX_TIMEOUT: int = 1000 # Время сброса счётчика принятия части пакета const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета.
var peerstream: = PacketPeerStream.new() var peerstream: = PacketPeerStream.new()
var unit_key: Array # Клюс юнита var unit_key: Array ## Клюс юнита.
var head_len: int = 8 # Длинна заголовка команды var head_len: int = 8 ## Длинна заголовка команды.
var len_place: int = 4 # Номер начального байта с длинной блока данных var len_place: int = 4 ## Номер начального байта с длинной блока данных.
var type_len: int = 4 # Количество байт в размере длинны var type_len: int = 4 ## Количество байт в размере длинны.
var rx_tick: int # Время приёма последнего пакета var rx_tick: int ## Время приёма последнего пакета.
var rx_all: bool = true # Флаг, что пакет принят полностью var rx_all: bool = true ## Флаг, что пакет принят полностью.
var rx_len: int # Количество принятых байт var rx_len: int ## Количество принятых байт.
var rx_data: PackedByteArray # Принятые данные var rx_data: PackedByteArray ## Принятые данные.
var data_len: int # Размер ожидаемых данных var data_len: int ## Размер ожидаемых данных.
func send_to(data): func send_to(data):
var peer = peerstream.get_stream_peer() var peer = peerstream.get_stream_peer()

View File

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

View File

@@ -1,43 +1,43 @@
class_name Signaller extends Node class_name Signaller extends Node
## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют ## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют.
## два и более узла, из разных файлов. Должен быть помещён в автозагрузку. ## два и более узла, из разных файлов. Должен быть помещён в автозагрузку.
func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl) func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl)
## Вызывается при переходе в режим [b]Работа[/b] ## Вызывается при переходе в режим [b]Работа[/b].
signal режим_работа() signal режим_работа()
## Вызывается при переходе в режим [b]Контроль[/b] ## Вызывается при переходе в режим [b]Контроль[/b].
signal режимонтроль() signal режимонтроль()
## Вызывается при переходе в режим [b]Журнал[/b] ## Вызывается при переходе в режим [b]Журнал[/b].
signal режимурнал() signal режимурнал()
## Вызывается при переходе в режим [b]ЭМС[/b] ## Вызывается при переходе в режим [b]ЭМС[/b].
signal режим_эмс() signal режим_эмс()
## Вызывается при переходе в режим [b]Настройка[/b] ## Вызывается при переходе в режим [b]Настройка[/b].
signal режимастройки() signal режимастройки()
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели и помехи[/b] ## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели и помехи[/b].
signal full_auto() signal full_auto()
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели[/b] ## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели[/b].
signal threat_auto() signal threat_auto()
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора помехи[/b] ## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора помехи[/b].
signal interfer_auto() signal interfer_auto()
## Вызывается, когда оператор переводит программу в режим [b]Ручной[/b] ## Вызывается, когда оператор переводит программу в режим [b]Ручной[/b].
signal manual_control() signal manual_control()
@@ -59,21 +59,21 @@ signal full_screen(id: int)
## Вызывается, когда пользователь выбирает цель.[br] ## Вызывается, когда пользователь выбирает цель.[br]
## [param th_id] - Отметка цели на экране ## [param th_id] - Отметка цели на экране.
signal rto_threat_sel (th_id: int) signal rto_threat_sel (th_id: int)
## Вызывается, когда пользователь нажимает на значёк цели.[br] ## Вызывается, когда пользователь нажимает на значёк цели.[br]
## [param th_id] - Отметка цели на экране ## [param th_id] - Отметка цели на экране.
signal bip_pressed (th_id: int) signal bip_pressed (th_id: int)
## Вызывается, когда пользователь снимает выделение с цели.[br] ## Вызывается, когда пользователь снимает выделение с цели.[br]
## [param th_id] - Отметка цели на экране ## [param th_id] - Отметка цели на экране.
signal rto_threat_unsel (th_id: int) signal rto_threat_unsel (th_id: int)
## Вызывается, когда пользователь снимает выделение со всех целей ## Вызывается, когда пользователь снимает выделение со всех целей.
signal rto_threat_unsel_all () 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 (ecm: interfer.Interfer, ecms: Dictionary, thrs: Dictionary)
## Вызывается при нажатии отключить все помехи ## Вызывается при нажатии отключить все помехи.
signal interfer_off_all () signal interfer_off_all ()
## Вызывается при получении внешнего целеуказания ## Вызывается при получении внешнего целеуказания.
## [param interfer_params] - Параметры полученной помехи от 5П-28.[br] ## [param interfer_params] - Параметры полученной помехи от 5П-28.[br]
signal interfer_rcv(interfer_params: Array) signal interfer_rcv(interfer_params: Array)
## Вызывается, когда отключается действующая помеха.[br] ## Вызывается, когда отключается действующая помеха.[br]
## [param ecm] - Выбранная помеха ## [param ecm] - Выбранная помеха.
signal interfer_selected (ecm: interfer.Interfer) signal interfer_selected (ecm: interfer.Interfer)
## Вызывается, когда отключается выбираем помеху по сектору в таблице.[br] ## Вызывается, когда отключается выбираем помеху по сектору в таблице.[br]
## [param ecm] - Выбранная помеха ## [param ecm] - Выбранная помеха.
signal fs_selected(ecm: interfer.Interfer) signal fs_selected(ecm: interfer.Interfer)
## Вызывается при запросе изменения уровня детализации карты.[br] ## Вызывается при запросе изменения уровня детализации карты.[br]
## [param zoom] - Вновь установленный уровень детализации ## [param zoom] - Вновь установленный уровень детализации.
signal zoom_changed(zoom: int) signal zoom_changed(zoom: int)
## Вызывается при завершении изменения уровня детализации карты.[br] ## Вызывается при завершении изменения уровня детализации карты.[br]
## [param zoom] - Вновь установленный уровень детализации ## [param zoom] - Вновь установленный уровень детализации.
signal zoom_complete(zoom: int) signal zoom_complete(zoom: int)
@@ -135,5 +135,5 @@ signal map_coords_changed(lan: float, lat: float)
## Вызывается при изменении размера изображения для отображения карты.[br] ## Вызывается при изменении размера изображения для отображения карты.[br]
## [param mode] - Вновь установленный режим ## [param mode] - Вновь установленный режим.
signal map_mode_changed(mode: int) 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 ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от 5П-28, мс.
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм.
## Тип модуляции для запаковки в пакет для 5П-28 ## Тип модуляции для запаковки в пакет для 5П-28.
const MOD_TYPES: Array = ['', const MOD_TYPES: Array = ['',
'am', 'am',
'ook', 'ook',
@@ -41,18 +41,18 @@ class TCP5P28:
const CMD_TYPE_TH: int = 2 const CMD_TYPE_TH: int = 2
const CMD_TYPE_IN: int = 3 const CMD_TYPE_IN: int = 3
signal line_changed(unit: TCP5P28) ## Сигнал состояние связи изменилось signal line_changed(unit: TCP5P28) ## Сигнал состояние связи изменилось.
signal data_received(unit: TCP5P28) ## Сигнал данные приняты signal data_received(unit: TCP5P28) ## Сигнал данные приняты.
signal command_fail(unit: TCP5P28) ## Сигнал при не выполнении команды signal command_fail(unit: TCP5P28) ## Сигнал при не выполнении команды.
signal parse_error(unit: TCP5P28, msg: String) ## Сигнал ошибки разбора сообщения signal parse_error(unit: TCP5P28, msg: String) ## Сигнал ошибки разбора сообщения.
signal get_threats(unit: TCP5P28) ## Сигнал запрос целей signal get_threats(unit: TCP5P28) ## Сигнал запрос целей.
signal get_interfers(unit: TCP5P28) ## Запрос состояния выполнения целеуказания signal get_interfers(unit: TCP5P28) ## Запрос состояния выполнения целеуказания.
var online: = false ## Состояние связи с источником сообщений var online: = false ## Состояние связи с источником сообщений.
var name: String ## Имя экземпляра var name: String ## Имя экземпляра.
var rx_tick: = 0 ## Тик время последнего приёма, мс var rx_tick: = 0 ## Тик время последнего приёма, мс.
var tx_data: = PackedByteArray() ## Пакет для отправки var tx_data: = PackedByteArray() ## Пакет для отправки.
var tx_stack: Array ## Массив пакетов для отправки var tx_stack: Array ## Массив пакетов для отправки.
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]]) func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm): self.name = nm func _init(nm): self.name = nm

View File

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

View File

@@ -1,10 +1,10 @@
@tool @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) 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 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) 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] s_out[0] += s_in[i]
## Производит преобразование из декартовой в полярную систему координат ## Производит преобразование из декартовой в полярную систему координат.
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float): 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 r = ((freq - f0) / (f1 - f0)) * r1 + r0
var aoa_rad = radians(aoa) - PI / 2.0 var aoa_rad = radians(aoa) - PI / 2.0
return Vector2(cos(aoa_rad), sin(aoa_rad)) * r + pos0 return Vector2(cos(aoa_rad), sin(aoa_rad)) * r + pos0
## Отсекает значение до заданного диапазона ## Отсекает значение до заданного диапазона.
func clip_value(val, val_min, val_max): func clip_value(val, val_min, val_max):
if val < val_min: val = val_min if val < val_min: val = val_min
if val > val_max: val = val_max if val > val_max: val = val_max
return val return val
## Возвращает массив с именами членов [param obj] ## Возвращает массив с именами членов [param obj].
func get_members_names(obj: Object) -> Array: func get_members_names(obj: Object) -> Array:
var pl = obj.get_property_list() var pl = obj.get_property_list()
var names: = Array() var names: = Array()
@@ -92,7 +92,7 @@ func get_members_names(obj: Object) -> Array:
return names return names
## Проверяет, что заданный массив [param val] похож на ip-адрес ## Проверяет, что заданный массив [param val] похож на ip-адрес.
func is_array_ipaddr(val: Array): func is_array_ipaddr(val: Array):
return (val.size() == 2) \ return (val.size() == 2) \
and (val[0] is String) \ 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)) 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: func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 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 return odd_nodes > 0
## Записывает слово [param val] в элемент байтовго массива [param buf] ## Записывает слово [param val] в элемент байтовго массива [param buf].
## расположенный по индексу [param index] (младшее слово).[br] ## расположенный по индексу [param index] (младшее слово).[br]
## [i]Следует использовать встроенные в[/i] [b]PackedByteArray[/b] [i]методы вместо этой функции.[/i] ## [i]Следует использовать встроенные в[/i] [b]PackedByteArray[/b] [i]методы вместо этой функции.[/i]
func set_wordi(buf: PackedByteArray, index: int, val: int) -> void: 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 ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды
const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды
@@ -8,47 +8,47 @@ const RETRY_COUNT = 5 ## Количество повторных отпр
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
## Ячейка ЯУ-07 ## Ячейка ЯУ-07.
class YaU07: class YaU07:
## Коды выполняемых команд ## Коды выполняемых команд.
enum CmdCode { enum CmdCode {
READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07 READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07.
WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07 WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07.
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07 WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07.
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07 READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07.
} }
## Состояние автомата выполнения команды ## Состояние автомата выполнения команды.
enum CmdState { enum CmdState {
UNCK, ## Номер команды не ининциирован UNCK, ## Номер команды не ининциирован.
SEND, ## Буфер готов для отправки SEND, ## Буфер готов для отправки.
WAIT, ## Ожидание выполнения WAIT, ## Ожидание выполнения.
DONE, ## Команда выполнена DONE, ## Команда выполнена.
FAIL ## Команда не выполнена FAIL ## Команда не выполнена.
} }
signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой.
signal command_done(unit: YaU07) ## Вызывается после выполнения команды signal command_done(unit: YaU07) ## Вызывается после выполнения команды.
signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена.
signal parse_failed(unit: YaU07) signal parse_failed(unit: YaU07)
var name: = String() var name: = String()
var cmd_num_rx: = 0 ## Номер команды принятый var cmd_num_rx: = 0 ## Номер команды принятый.
var cmd_num_tx: = 0 ## Номер команды переданный var cmd_num_tx: = 0 ## Номер команды переданный.
var cmd_state = CmdState.UNCK ## Состояние выполнения команды var cmd_state = CmdState.UNCK ## Состояние выполнения команды.
var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07 var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07.
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07 var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07.
var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду.
var tick = 0.0 ## Текущее тик-время в мс var tick = 0.0 ## Текущее тик-время в мс.
var cmd_tick_tx = 0.0 ## Время последней отправки команды var cmd_tick_tx = 0.0 ## Время последней отправки команды.
var cmd_tick_rx = 0.0 ## Время последнего приёма команды var cmd_tick_rx = 0.0 ## Время последнего приёма команды.
var status: = PackedByteArray() ## Поле "состояние прибора" var status: = PackedByteArray() ## Поле "состояние прибора".
var tx_data: = PackedByteArray() ## Буфер отправленный var tx_data: = PackedByteArray() ## Буфер отправленный.
var tx_len = 0 ## Длина последнего отправленного пакета var tx_len = 0 ## Длина последнего отправленного пакета.
var isa_ports = {} ## Результат выполнения команды "читать порт" var isa_ports = {} ## Результат выполнения команды "читать порт".
var isa_block = {} ## Результат выполнения команды "читать массив из порта" var isa_block = {} ## Результат выполнения команды "читать массив из порта".
var online = false ## Состояние связи с ячейкой var online = false ## Состояние связи с ячейкой.
func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) 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])) tx_data.encode_u16(9, int(port[0]))
cmd_state = CmdState.SEND cmd_state = CmdState.SEND
return true return true
## Возвращает код команды ЯУ-07 ## Возвращает код команды ЯУ-07.
## rx_data - Принятые данные ## rx_data - Принятые данные.
## Возвращает - Код команды не найден, 0...255 - код команды ## Возвращает - Код команды не найден, 0...255 - код команды.
func get_cmd_code(rx_data: PackedByteArray): func get_cmd_code(rx_data: PackedByteArray):
var rx_data_len = rx_data.size() var rx_data_len = rx_data.size()
@@ -185,11 +185,11 @@ class YaU07:
return true return true
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07 ## Заполняет состояние прибора данными прочитанными из портов ЯУ-07.
## для команд "читать порты" или "записать порты"[br] ## для команд "читать порты" или "записать порты".[br]
## [param rx_data] - Принятые данные[br] ## [param rx_data] - Принятые данные.[br]
## Возвращает [b]true[/b] - Данные обработаны успешно[br] ## Возвращает [b]true[/b] - Данные обработаны успешно.[br]
## Возвращает [b]false[/b] - Данные не обработаны из за ошибки[br] ## Возвращает [b]false[/b] - Данные не обработаны из за ошибки.[br]
func parse(rx_data: PackedByteArray) -> bool: func parse(rx_data: PackedByteArray) -> bool:
cmd_tick_rx = tick cmd_tick_rx = tick

View File

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

View File

@@ -1,6 +1,6 @@
extends Node class_name yerms_consts extends Node
## ## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_ROWS1 = [ const INPUT_ROWS1 = [
[12,['283333 МР-231S, Строб ЭМС', 'X52', '0.00', '0.00']], [12,['283333 МР-231S, Строб ЭМС', 'X52', '0.00', '0.00']],
[13,['29НРЛС МР-231-3, УИЗП', 'X54', '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']], [38,['394302-01, 4302-04, УИЗП', 'X46', '0.00', '0.00']],
[31,['40НРЛС МР-231S, УИЗП', 'X51', '0.00', '0.00']]] [31,['40НРЛС МР-231S, УИЗП', 'X51', '0.00', '0.00']]]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС ## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_ROWS1 = [ const OUTPUT_ROWS1 = [
[41,['41НРЛС МР-231S, БИ', 'X61', '0.00', '0.00']], [41,['41НРЛС МР-231S, БИ', 'X61', '0.00', '0.00']],
[42,['42НРЛС МР-231S', 'X62', '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']], [66,['524302-01, 4302-04, БИ', 'X66', '0.00', '0.00']],
[68,['53НРЛС 11111111', 'X69', '0.00', '0.00']]] [68,['53НРЛС 11111111', 'X69', '0.00', '0.00']]]
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС ## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_ROWS = [ const INPUT_ROWS = [
[1,['УИЗП №1', 'Х7', '0.00', '0.00']], [1,['УИЗП №1', 'Х7', '0.00', '0.00']],
[2,['УИЗПФ №1', 'Х8', '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']], [57,['СЗИ Е Лб','Х49 : 1', '0.00', '0.00']],
[58,['СЗИ Е ПрБ','Х49 : 50', '0.00', '0.00']]] [58,['СЗИ Е ПрБ','Х49 : 50', '0.00', '0.00']]]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС ## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_ROWS = [ const OUTPUT_ROWS = [
[11,['Бланк №1','Х6', '0.00', '0.00']], [11,['Бланк №1','Х6', '0.00', '0.00']],
[12,['Бланк №2','Х9', '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: class InDev:
var id: int ## Идентификатор индекс устройства var id: int ## Идентификатор индекс устройства.
var dev_name: String ## Имя подключаемого комплекса var dev_name: String ## Имя подключаемого комплекса.
var connector: String ## Номер разъёма в приборе var connector: String ## Номер разъёма в приборе.
var delay: float ## Задержка фронта импульса var delay: float ## Задержка фронта импульса.
var offset: float ## Смещение фронта импульса var offset: float ## Смещение фронта импульса.
var state: int ## Состояние входа var state: int ## Состояние входа.
var freq: int ## Предполагаемая частота на которой работает комплекс var freq: int ## Предполагаемая частота на которой работает комплекс.
var ports_data: Dictionary ## Словарь состояния портов устройства var ports_data: Dictionary ## Словарь состояния портов устройства.
var tbl_row_id: int ## Индекс устройства в таблице выходов var tbl_row_id: int ## Индекс устройства в таблице выходов.
var out_dots: Array ## Список выходных устройств в порядке, как в таблице и точки матрицы var out_dots: Array ## Список выходных устройств в порядке, как в таблице и точки матрицы.
var connect_devs: Dictionary ## Список присоединённых устройств var connect_devs: Dictionary ## Список присоединённых устройств.
var board: String ## Плата в которой находится устройство var board: String ## Плата в которой находится устройство.
func _init(dev_id : int, params : Array, row_id : int): func _init(dev_id : int, params : Array, row_id : int):
id = dev_id id = dev_id
@@ -25,7 +25,7 @@ class InDev:
class OutDev extends InDev: class OutDev extends InDev:
var mode: String ## Режим работы выхода var mode: String ## Режим работы выхода.
func _init(dev_id : int, params : Array, row_id : int): func _init(dev_id : int, params : Array, row_id : int):
id = dev_id id = dev_id