Доработка. Улучшение документации.
This commit is contained in:
@@ -1,21 +1,20 @@
|
||||
# Copyright (c) 2020-2023 Mansur Isaev and contributors - MIT License
|
||||
# See `LICENSE.md` included in the source distribution for details.
|
||||
|
||||
## Logger class.
|
||||
class_name Logger
|
||||
extends Node
|
||||
## Класс журнал событий.
|
||||
class_name Logger extends Node
|
||||
|
||||
## Emitted when the logger create a message.
|
||||
## Выдается, когда журнал событий создаёт сообщение.
|
||||
signal logged(message: Dictionary)
|
||||
|
||||
|
||||
enum {
|
||||
INFO = 1, ## Info level.
|
||||
DEBUG = 1<<1, ## Warning level.
|
||||
WARNING = 1<<2, ## Debug level.
|
||||
ERROR = 1<<3, ## Error level.
|
||||
FATAL = 1<<4, ## Fatal level.
|
||||
MAX = FATAL, ## Bitwise left shift for custom levels.
|
||||
INFO = 1, ## Информационный уровень.
|
||||
DEBUG = 1<<1, ## Уровень предупреждения.
|
||||
WARNING = 1<<2, ## Уровень отладки.
|
||||
ERROR = 1<<3, ## Уровень ошибок.
|
||||
FATAL = 1<<4, ## Критический уровень.
|
||||
MAX = FATAL, ## Побитовый сдвиг влево для пользовательских уровней.
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +40,7 @@ var _names = {
|
||||
var _msg_array: Array
|
||||
var _filters: Array
|
||||
|
||||
# Can be overridden to define custom default values.
|
||||
## Преопределение пользовательских значений по умолчанию.
|
||||
func _enter_tree() -> void:
|
||||
set_log_enabled(ProjectSettings.get_setting("plugins/logger/log_enabled", true))
|
||||
set_default_output_enabled(ProjectSettings.get_setting("plugins/logger/default_output", false))
|
||||
@@ -58,11 +57,11 @@ func _enter_tree() -> void:
|
||||
func _exit_tree() -> void:
|
||||
_close_file()
|
||||
|
||||
## Return [param true] if logger has level.
|
||||
## Возвращает [param true], если у журнала события есть уровень.
|
||||
func has_level(level: int) -> bool:
|
||||
return _names.has(level)
|
||||
|
||||
## Set the level enabled.
|
||||
## Установить включенный уровень.
|
||||
func set_level(level: int, enabled: bool) -> void:
|
||||
assert(has_level(level), "Invalid level.")
|
||||
if not has_level(level):
|
||||
@@ -73,8 +72,8 @@ func set_level(level: int, enabled: bool) -> void:
|
||||
else:
|
||||
_level &= ~level
|
||||
|
||||
## Add a custom log level. The level value must be unique and be greater than [member MAX].
|
||||
## To call the custom level use [method message] method.
|
||||
## Добавить пользовательский уровень журнала. Значение уровня должно быть уникальным и превышать [member MAX].
|
||||
## Для вызова пользовательского уровня используйте метод - [method message].
|
||||
func add_level(level: int, nm: String) -> void:
|
||||
assert(not has_level(level), "Has level.")
|
||||
assert(level > MAX and not level % 2, "Invalid level.")
|
||||
@@ -84,27 +83,27 @@ func add_level(level: int, nm: String) -> void:
|
||||
_names[level] = nm
|
||||
set_level(level, true)
|
||||
|
||||
## Return the level name.
|
||||
## Возвращает имя уровня.
|
||||
func get_level_name(level: int) -> String:
|
||||
return _names[level]
|
||||
|
||||
## Set Log enabled. Disable ALL messages.
|
||||
## Установить включенный журнал. Отключить ВСЕ сообщения.
|
||||
func set_log_enabled(enabled: bool) -> void:
|
||||
_log_enabled = enabled
|
||||
|
||||
## Return [param true] if Log enabled.
|
||||
## Возвращает [param true], если журнал включен.
|
||||
func is_log_enabled() -> bool:
|
||||
return _log_enabled
|
||||
|
||||
## Set default output enabled.
|
||||
## Установка выхода по умолчанию включена.
|
||||
func set_default_output_enabled(enabled: bool) -> void:
|
||||
_default_output_enabled = enabled
|
||||
|
||||
## Returns [param true] if default output is enabled.
|
||||
## Возвращает [param true], если вывод по умолчанию включен.
|
||||
func is_default_output_enabled() -> bool:
|
||||
return _default_output_enabled
|
||||
|
||||
## Set file write enabled.
|
||||
## Установить разрешение на запись файла.
|
||||
func set_file_write_enabled(enabled: bool) -> void:
|
||||
if _file_write_enabled == enabled:
|
||||
return
|
||||
@@ -116,11 +115,11 @@ func set_file_write_enabled(enabled: bool) -> void:
|
||||
else:
|
||||
_close_file()
|
||||
|
||||
## Returns [param true] if write to a file is enabled.
|
||||
## Возвращает [param true], если запись в файл разрешена.
|
||||
func is_file_write_enabled() -> bool:
|
||||
return _file_write_enabled
|
||||
|
||||
## Set the path to the log file.
|
||||
## Задать путь к файлу журнала.
|
||||
func set_file_path(path: String) -> void:
|
||||
assert(path.is_absolute_path(), "Invalid path.")
|
||||
if not path.is_absolute_path() or _file_path == path:
|
||||
@@ -131,32 +130,32 @@ func set_file_path(path: String) -> void:
|
||||
if is_file_write_enabled():
|
||||
_open_file()
|
||||
|
||||
## Return path to log file.
|
||||
## Возвращает путь к файлу журнала.
|
||||
func get_file_path() -> String:
|
||||
return _file_path
|
||||
|
||||
## Create an info message.
|
||||
## Создать информационное сообщение.
|
||||
func info(text: String) -> void:
|
||||
message(INFO, text)
|
||||
|
||||
## Create a debug message. Debug build only.
|
||||
## Создать отладочное сообщение. Только для отладочной сборки.
|
||||
func debug(text: String) -> void:
|
||||
if OS.is_debug_build():
|
||||
message(DEBUG, text)
|
||||
|
||||
## Create a warning message.
|
||||
## Создать предупреждающее сообщение.
|
||||
func warning(text: String) -> void:
|
||||
message(WARNING, text)
|
||||
|
||||
## Create an error message.
|
||||
## Создать сообщение об ошибке.
|
||||
func error(text: String) -> void:
|
||||
message(ERROR, text)
|
||||
|
||||
## Create a fatal error message.
|
||||
## Создать сообщение о критической ошибке.
|
||||
func fatal(text: String) -> void:
|
||||
message(FATAL, text)
|
||||
|
||||
## Format string for log file.
|
||||
## Форматировать строку для файла.
|
||||
func format_file(msg: Dictionary) -> String:
|
||||
return _format_file.format(
|
||||
{
|
||||
@@ -171,7 +170,7 @@ func format_file(msg: Dictionary) -> String:
|
||||
}
|
||||
)
|
||||
|
||||
## Format string for editor output.
|
||||
## Форматировать строку для вывода редактора.
|
||||
func format_stdout(msg: Dictionary) -> String:
|
||||
return _format_default_output.format(
|
||||
{
|
||||
@@ -186,7 +185,7 @@ func format_stdout(msg: Dictionary) -> String:
|
||||
}
|
||||
)
|
||||
|
||||
## Create a message with a custom level.
|
||||
## Создать сообщение с пользовательским уровнем.
|
||||
func message(level: int, text: String) -> void:
|
||||
assert(has_level(level), "Has not level.")
|
||||
assert(text, "Invalid message text.")
|
||||
|
||||
@@ -2,11 +2,10 @@
|
||||
# See `LICENSE.md` included in the source distribution for details.
|
||||
|
||||
@tool
|
||||
## LoggerOutput class.
|
||||
class_name LoggerOutput
|
||||
extends RichTextLabel
|
||||
## Класс вывода журнала событий.
|
||||
class_name LoggerOutput extends RichTextLabel
|
||||
|
||||
## Emited when handle [signal Logger.logged] signal.
|
||||
## Выдаётся при ошибке сигнала - [signal Logger.logged].
|
||||
signal handled()
|
||||
|
||||
|
||||
@@ -33,11 +32,11 @@ func _exit_tree() -> void:
|
||||
if is_instance_valid(_logger) and _logger.logged.is_connected(handle_message):
|
||||
_logger.logged.disconnect(handle_message)
|
||||
|
||||
## Return the level color or [member Color.WHITE].
|
||||
## Вернуть цвет уровня или [member Color.WHITE].
|
||||
func get_color(level: int) -> Color:
|
||||
return colors.get(level, Color.WHITE)
|
||||
|
||||
## Set the logger.
|
||||
## Установить журнал событий.
|
||||
func set_logger(logger: Logger) -> void:
|
||||
assert(is_instance_valid(logger), "Invalid Logger.")
|
||||
if not is_instance_valid(logger) or is_same(_logger, logger):
|
||||
@@ -51,11 +50,11 @@ func set_logger(logger: Logger) -> void:
|
||||
|
||||
_logger = logger
|
||||
|
||||
## Return the logger.
|
||||
## Вернуть журнал событий.
|
||||
func get_logger() -> Logger:
|
||||
return _logger
|
||||
|
||||
## Return formatted string from message.
|
||||
## Вернуть строку после форматирования из сообщения.
|
||||
func format(message: Dictionary) -> String:
|
||||
return format_text.format(
|
||||
{
|
||||
@@ -70,7 +69,7 @@ func format(message: Dictionary) -> String:
|
||||
}
|
||||
)
|
||||
|
||||
## Handle the message.
|
||||
## Обработать сообщение.
|
||||
func handle_message(message: Dictionary) -> void:
|
||||
push_color(get_color(message["level"]))
|
||||
append_text(format(message) + "\n")
|
||||
|
||||
@@ -111,6 +111,29 @@ theme/default_font_subpixel_positioning=3
|
||||
theme/lcd_subpixel_layout=0
|
||||
common/drop_mouse_on_gui_input_disabled=true
|
||||
|
||||
[input]
|
||||
|
||||
up={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
down={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
left={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
right={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[input_devices]
|
||||
|
||||
buffering/agile_event_flushing=true
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
extends Control
|
||||
class_name bip_ extends Control
|
||||
|
||||
var selected: bool
|
||||
|
||||
# Функция присваивает заданое значение видимости селектору
|
||||
## Функция присваивает заданое значение видимости селектору.
|
||||
func set_sel_visible(value: bool):
|
||||
selected = value
|
||||
$selector.visible = value
|
||||
|
||||
|
||||
# Функция присваивает заданое значение видимости селектору
|
||||
## Функция присваивает заданое значение видимости селектору.
|
||||
func set_track_visible(value: bool): $track.visible = value
|
||||
# Функция присваивает заданое значение видимости индикатору выполнения
|
||||
## Функция присваивает заданое значение видимости индикатору выполнения.
|
||||
func set_ecm_visible(value: bool): $ecm_done.visible = value
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
extends Sprite2D
|
||||
class_name Diagram extends Sprite2D
|
||||
|
||||
var fs_default_colors: Array # Цвета по умолчанию для блоков ФС
|
||||
var fs_default_colors: Array ## Цвета по умолчанию для блоков ФС.
|
||||
|
||||
func _ready() -> void:
|
||||
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
|
||||
@@ -30,7 +30,7 @@ func get_radius_inner_1() -> float: return material.get('shader_parameter/radiu
|
||||
func set_view_mode(val: int): material.set('shader_parameter/mode', val);
|
||||
func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)
|
||||
|
||||
## Закрашивание по умолчанию блоков ФС цветами из настроек
|
||||
## Закрашивание по умолчанию блоков ФС цветами из настроек.
|
||||
func set_def_colors():
|
||||
var color0: Vector3 = ProjectSettings.get_setting('application/interfer/default_color0', Vector3(0.38, 0.47, 0.51))
|
||||
var color1: Vector3 = ProjectSettings.get_setting('application/interfer/default_color1', Vector3(0.39, 0.44, 0.50))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
extends NinePatchRect
|
||||
class_name frm_ecm_list extends NinePatchRect
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
## Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
$grd_forced/btn_cancel.button_connect('pressed', Callable(self, 'on_btn_cancel_pressed').bind($grd_forced/btn_cancel))
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
extends ScrollContainer
|
||||
class_name scroll_ecm_params extends ScrollContainer
|
||||
|
||||
## Отображает список параметров помехи в таблице.
|
||||
|
||||
@@ -33,7 +33,7 @@ func init_table():
|
||||
$table.set_meta('id', 0)
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
## Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected'))
|
||||
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel'))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
extends ScrollContainer
|
||||
class_name scroll_params extends ScrollContainer
|
||||
|
||||
## Отображение параметров цели
|
||||
## Отображение параметров цели.
|
||||
|
||||
const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
|
||||
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
|
||||
@@ -23,7 +23,7 @@ const TABLE_PARAMS = {
|
||||
'rkrp': [5, 'Рекомендуемая помеха'] }
|
||||
|
||||
|
||||
## Обрабатывает сигнал [signal threats.threat_selected]
|
||||
## Обрабатывает сигнал [signal threats.threat_selected].
|
||||
func on_threat_selected(th):
|
||||
$table.set_meta('id', th.id)
|
||||
on_threat_update(th)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
extends ScrollContainer
|
||||
class_name scroll_threats extends ScrollContainer
|
||||
|
||||
## Отображает список целей в таблице.
|
||||
|
||||
@@ -46,7 +46,7 @@ func _ready() -> void:
|
||||
call_deferred('init_table')
|
||||
|
||||
|
||||
## Перестраивает индекс таблицы. Вызывать при удалении строки
|
||||
## Перестраивает индекс таблицы. Вызывать при удалении строки.
|
||||
func rehash(table_index: Dictionary):
|
||||
var rows_count = $table.get_rows_count()
|
||||
for i_row in rows_count:
|
||||
@@ -54,21 +54,21 @@ func rehash(table_index: Dictionary):
|
||||
table_index[int(item.text)] = i_row
|
||||
|
||||
|
||||
## Обрабатывает сигнал [b]threat_update[/b]
|
||||
## Обрабатывает сигнал [b]threat_update[/b].
|
||||
func on_threat_update(th, table_index: Dictionary):
|
||||
var row = map_th_to_row(th)
|
||||
var i_row = table_index[th.id]
|
||||
$table.set_row_text(i_row, row)
|
||||
|
||||
|
||||
## Обрабатывает сигнал [b]threat_lost[/b]
|
||||
## Обрабатывает сигнал [b]threat_lost[/b].
|
||||
func on_threat_lost(th, table_index: Dictionary):
|
||||
$table.remove_row(table_index[th.id])
|
||||
table_index.clear()
|
||||
rehash(table_index)
|
||||
|
||||
|
||||
## Обрабатывает сигнал [b]threat_new[/b]
|
||||
## Обрабатывает сигнал [b]threat_new[/b].
|
||||
func on_threat_new(th, table_index):
|
||||
var i_row = $table.get_rows_count()
|
||||
$table.add_row(TABLE_ROW)
|
||||
@@ -79,7 +79,7 @@ func on_threat_new(th, table_index):
|
||||
table_index[th.id] = i_row
|
||||
|
||||
|
||||
## Преобразует цель в строку таблицы
|
||||
## Преобразует цель в строку таблицы.
|
||||
func map_th_to_row(th) -> Array:
|
||||
var row: = Array()
|
||||
row.resize(TABLE_COLUMN_PARAM.size())
|
||||
@@ -90,7 +90,7 @@ func map_th_to_row(th) -> Array:
|
||||
return row
|
||||
|
||||
|
||||
## Выделяет выбранную цель в таблице
|
||||
## Выделяет выбранную цель в таблице.
|
||||
func on_rto_threat_sel(th_id, tbl):
|
||||
for i in tbl.get_rows_count():
|
||||
var node = tbl.get_node2(0, i)
|
||||
@@ -99,6 +99,6 @@ func on_rto_threat_sel(th_id, tbl):
|
||||
break
|
||||
|
||||
|
||||
## Снимает выделение цели
|
||||
## Снимает выделение цели.
|
||||
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
extends "res://scenes/контроль/прибор.gd"
|
||||
class_name pribor_rtr extends "res://scenes/контроль/прибор.gd"
|
||||
|
||||
|
||||
static var json_parser: JSON = JSON.new()
|
||||
@@ -123,8 +123,8 @@ func map_error_codes_to_item(data, item, value_name: StringName):
|
||||
item.set(value_name, test_res)
|
||||
|
||||
|
||||
## Вызывается при клике мыши на элементе контроля
|
||||
## [param block_a] - Кликнутый элемент контроля
|
||||
## Вызывается при клике мыши на элементе контроля.
|
||||
## [param block_a] - Кликнутый элемент контроля.
|
||||
func _on_item_pressed(block_a: Control):
|
||||
var metas = block_a.get_meta_list()
|
||||
print_debug(block_a)
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
extends Sprite2D
|
||||
class_name main_tilemap extends Sprite2D
|
||||
|
||||
## Возможные состояния конечного автомата заданий
|
||||
## Возможные состояния конечного автомата заданий.
|
||||
enum TASK_STATE {
|
||||
DONE, ## Выполнено
|
||||
WAIT, ## Ожидание плитки
|
||||
RUN, ## Запуск выполнения
|
||||
CHECK, ## Проверка пустого места
|
||||
ERROR ## Ошибка
|
||||
DONE, ## Выполнено.
|
||||
WAIT, ## Ожидание плитки.
|
||||
RUN, ## Запуск выполнения.
|
||||
CHECK, ## Проверка пустого места.
|
||||
ERROR ## Ошибка.
|
||||
}
|
||||
|
||||
|
||||
## Координаты для проверок [lng, lat]
|
||||
## Координаты для проверок [lng, lat].
|
||||
const TEST_DATA: = {
|
||||
'Калиниград': [ 20.51095, 54.70649 ],
|
||||
'Москва': [ 37.6156, 55.7522 ],
|
||||
@@ -40,21 +40,20 @@ const MAP_RELATIVE_RADIUSES: = {
|
||||
}
|
||||
|
||||
|
||||
var map_image: Image ## Изображение с картой
|
||||
var map_tile_state: TASK_STATE ## Текущее состояние конечного автомата плитки
|
||||
var map_bcs: Vector3 ## Яркость, контраст насыщенность
|
||||
var map_server_addr: String ## Адрес сервера изображений карт в проекции Меркатора
|
||||
var map_image: Image ## Изображение с картой.
|
||||
var map_tile_state: TASK_STATE ## Текущее состояние конечного автомата плитки.
|
||||
var map_bcs: Vector3 ## Яркость, контраст насыщенность.
|
||||
var map_server_addr: String ## Адрес сервера изображений карт в проекции Меркатора.
|
||||
var map_tile_format: String ##
|
||||
var map_tile_stack: Array ## Стек для хранения плиток карты
|
||||
var map_request: HTTPRequest ## Обработчик запросов http
|
||||
var map_zoom: int ## Уровень детализации карты
|
||||
var map_tile: Rect2i ## Область одной плитки: [x-координата области, y-координата области, x-индекс плитки, y-индекс плитки]
|
||||
var map_mode: int ## Режим карты: 0 - приоритет РТО, 1 - приоритет РЛС
|
||||
var map_tile_stack: Array ## Стек для хранения плиток карты.
|
||||
var map_request: HTTPRequest ## Обработчик запросов http.
|
||||
var map_zoom: int ## Уровень детализации карты.
|
||||
var map_tile: Rect2i ## Область одной плитки: [x-координата области, y-координата области, x-индекс плитки, y-индекс плитки].
|
||||
var map_mode: int ## Режим карты: 0 - приоритет РТО, 1 - приоритет РЛС.
|
||||
var prev_tiles_dic: Dictionary ##
|
||||
var lnglat: Array ## Текущие координаты
|
||||
var lnglat: Array ## Текущие координаты.
|
||||
var root_rect: Rect2i
|
||||
|
||||
|
||||
func _ready():
|
||||
lnglat = TEST_DATA['Таганрог']
|
||||
map_tile_state = TASK_STATE.DONE
|
||||
@@ -74,6 +73,7 @@ func _ready():
|
||||
log.info('Модуль географической карты готов')
|
||||
|
||||
|
||||
|
||||
func _on_map_mode_changed(mode: int) -> void:
|
||||
var map_image_size = ProjectSettings.get_setting(MAP_MODES[mode])
|
||||
material.set('shader_parameter/radius', MAP_RELATIVE_RADIUSES[mode])
|
||||
@@ -171,3 +171,4 @@ func _map_request_completed(result, response_code, headers, data):
|
||||
img_tile_to_map_image(img_tile, dst_pos)
|
||||
mark_image_center(map_image)
|
||||
texture = ImageTexture.create_from_image(map_image)
|
||||
|
||||
|
||||
@@ -1,14 +1,41 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://bbq6nklh36yij"]
|
||||
[gd_scene load_steps=6 format=3 uid="uid://bbq6nklh36yij"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/tilemap/tilemap.gd" id="1_mkfgj"]
|
||||
[ext_resource type="Shader" path="res://shaders/tilemap.gdshader" id="1_tsdui"]
|
||||
[ext_resource type="Script" path="res://scenes/tilemap/Node2D.gd" id="3_lr4ti"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_pmqvj"]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource("1_tsdui")
|
||||
shader_parameter/radius = 0.39
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ys5v4"]
|
||||
|
||||
[node name="tilemap" type="Sprite2D"]
|
||||
material = SubResource("ShaderMaterial_pmqvj")
|
||||
position = Vector2(560, 560)
|
||||
script = ExtResource("1_mkfgj")
|
||||
|
||||
[node name="Panel" type="Panel" parent="."]
|
||||
offset_left = -563.0
|
||||
offset_top = -557.0
|
||||
offset_right = 1022.0
|
||||
offset_bottom = 641.0
|
||||
theme_override_styles/panel = SubResource("StyleBoxEmpty_ys5v4")
|
||||
|
||||
[node name="Node2D" type="Node2D" parent="."]
|
||||
script = ExtResource("3_lr4ti")
|
||||
|
||||
[node name="LineEdit" type="LineEdit" parent="Node2D"]
|
||||
offset_left = -490.0
|
||||
offset_top = 518.0
|
||||
offset_right = -244.0
|
||||
offset_bottom = 565.0
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="Node2D"]
|
||||
offset_left = -499.0
|
||||
offset_top = 200.0
|
||||
offset_right = -239.0
|
||||
offset_bottom = 430.0
|
||||
|
||||
[connection signal="gui_input" from="Panel" to="." method="_on_panel_gui_input"]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
extends Panel
|
||||
class_name setting extends Panel
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
## Вызывается, когда узел впервые попадает в дерево сцены.
|
||||
func _ready() -> void:
|
||||
$lbl_commit.text = 'Текущая версия ПО УАРЭП: \"%s\"' % commit.VCS_HEAD
|
||||
if not OS.get_cmdline_args().has('++ограниченный'):
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
@tool
|
||||
|
||||
extends Panel
|
||||
class_name work extends Panel
|
||||
|
||||
## Основной скрипт для режима "Работа"
|
||||
## Основной скрипт для режима "Работа".
|
||||
|
||||
@export var Bip: PackedScene ## Индикатор излучения цели
|
||||
@export var col_grey: Color ## Второй цвет для фона
|
||||
@export var col_red: Color ## Первый цвет для фона
|
||||
@export var drag_scale_band: float ## Масштаб изменения параметра от движения мыши для строба по радиальному размеру
|
||||
@export var drag_scale_width: float ## Масштаб изменения параметра от движения мыши для строба по угловому размеру
|
||||
@export var Bip: PackedScene ## Индикатор излучения цели.
|
||||
@export var col_grey: Color ## Второй цвет для фона.
|
||||
@export var col_red: Color ## Первый цвет для фона.
|
||||
@export var drag_scale_band: float ## Масштаб изменения параметра от движения мыши для строба по радиальному размеру.
|
||||
@export var drag_scale_width: float ## Масштаб изменения параметра от движения мыши для строба по угловому размеру.
|
||||
@export var freq_high: float ## Верхняя рабочая частота, МГЦ.
|
||||
@export var freq_low: float ## Нижняя рабочая частота, МГЦ.
|
||||
@export var radius_center: Vector2 ## Координаты центра диаграммы пеленг-частота
|
||||
@export var radius_internal: float ## Внутренний радиус диаграммы пеленг-частота
|
||||
@export var radius_outter: float ## Внешний радиус диаграммы пеленг-частота
|
||||
@export var strob_max_band: float ## Максимальная ширина строба по углу
|
||||
@export var strob_max_width: float ## Максимальная ширина строба по углу
|
||||
@export var strob_min_band: float ## Минимальная ширина строба по частоте
|
||||
@export var strob_min_width: float ## Минимальная ширина строба по углу
|
||||
@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон
|
||||
@export var radius_center: Vector2 ## Координаты центра диаграммы пеленг-частота.
|
||||
@export var radius_internal: float ## Внутренний радиус диаграммы пеленг-частота.
|
||||
@export var radius_outter: float ## Внешний радиус диаграммы пеленг-частота.
|
||||
@export var strob_max_band: float ## Максимальная ширина строба по углу.
|
||||
@export var strob_max_width: float ## Максимальная ширина строба по углу.
|
||||
@export var strob_min_band: float ## Минимальная ширина строба по частоте.
|
||||
@export var strob_min_width: float ## Минимальная ширина строба по углу.
|
||||
@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон.
|
||||
|
||||
|
||||
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании
|
||||
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания
|
||||
var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели
|
||||
var drag_pos_begin: Vector2 ## Точка начала перетаскивания
|
||||
var max_zoom: int ## Максимальный уровень детализации
|
||||
var min_zoom: int ## Минимальный уровень детализации
|
||||
var shift_pressed: bool ## Кнопка SHIFT нажата
|
||||
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания
|
||||
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания
|
||||
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания
|
||||
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании.
|
||||
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания.
|
||||
var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели.
|
||||
var drag_pos_begin: Vector2 ## Точка начала перетаскивания.
|
||||
var max_zoom: int ## Максимальный уровень детализации.
|
||||
var min_zoom: int ## Минимальный уровень детализации.
|
||||
var shift_pressed: bool ## Кнопка SHIFT нажата.
|
||||
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания.
|
||||
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания.
|
||||
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания.
|
||||
|
||||
|
||||
signal drag_begin ## Вызывается в момент начала перетаскивания
|
||||
signal drag_continue ## Вызывается во время продолжения перетаскивания
|
||||
signal drag_end ## Вызывается в момент завершения перетаскивания
|
||||
signal drag_begin ## Вызывается в момент начала перетаскивания.
|
||||
signal drag_continue ## Вызывается во время продолжения перетаскивания.
|
||||
signal drag_end ## Вызывается в момент завершения перетаскивания.
|
||||
|
||||
## Границы секторов блоков ФС по частоте в режиме РТО
|
||||
## Границы секторов блоков ФС по частоте в режиме РТО.
|
||||
const fs_band_rto: Dictionary = {
|
||||
0: [200.0, 250.0],
|
||||
1: [250.0, 300.0],
|
||||
@@ -47,7 +47,7 @@ const fs_band_rto: Dictionary = {
|
||||
5: [450.0, 500.0],
|
||||
6: [500.0, 550.0] }
|
||||
|
||||
## Границы секторов блоков ФС по частоте в режиме РЛС
|
||||
## Границы секторов блоков ФС по частоте в режиме РЛС.
|
||||
const fs_band_rls: Dictionary = {
|
||||
0: [480.0, 490.0],
|
||||
1: [490.0, 500.0],
|
||||
@@ -57,7 +57,7 @@ const fs_band_rls: Dictionary = {
|
||||
5: [530.0, 540.0],
|
||||
6: [540.0, 550.0] }
|
||||
|
||||
## Границы секторов блоков ФС по пеленгу
|
||||
## Границы секторов блоков ФС по пеленгу.
|
||||
const fs_sectors: Dictionary = {
|
||||
0: [0.0, 90.0],
|
||||
3: [90.0, 180.0],
|
||||
@@ -77,29 +77,29 @@ var fs_band = fs_band_rto # Текущий режим блоков ФС
|
||||
var fs_selected: Dictionary # Словарь выбранных секторов
|
||||
var fs_active: Dictionary # Словарь секторов назначенных на подавление
|
||||
|
||||
## Состояние перетаскивания
|
||||
## Состояние перетаскивания.
|
||||
enum DragFSM {
|
||||
DRAG, ## В процессе
|
||||
IDLE, ## Не активно, ожидание
|
||||
OFF ## Выключено
|
||||
DRAG, ## В процессе.
|
||||
IDLE, ## Не активно, ожидание.
|
||||
OFF ## Выключено.
|
||||
}
|
||||
|
||||
## Состояние перетаскивания
|
||||
## Состояние перетаскивания.
|
||||
enum BtnSel {
|
||||
SECTOR, ## В процессе
|
||||
THREAT, ## Не активно, ожидание
|
||||
FS ## Выключено
|
||||
SECTOR, ## В процессе.
|
||||
THREAT, ## Не активно, ожидание.
|
||||
FS ## Выключено.
|
||||
}
|
||||
|
||||
## Обработчик сигнала изменения списка целей
|
||||
## Обработчик сигнала изменения списка целей.
|
||||
func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '%02d' % threats.size()
|
||||
|
||||
|
||||
## Обработчик выбора цели
|
||||
## Обработчик выбора цели.
|
||||
func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns)
|
||||
|
||||
|
||||
## Обработчик нажатия на кнопку вид
|
||||
## Обработчик нажатия на кнопку вид.
|
||||
func on_button_view_toggled(toggled: bool):
|
||||
signaller.emit_signal('map_mode_changed', int(toggled))
|
||||
if toggled:
|
||||
@@ -124,7 +124,7 @@ func _exit_tree() -> void:
|
||||
timer1.queue_free()
|
||||
|
||||
|
||||
## Производит инициализацию
|
||||
## Производит инициализацию.
|
||||
func _ready():
|
||||
min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5)
|
||||
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19)
|
||||
@@ -149,7 +149,22 @@ func _ready():
|
||||
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
|
||||
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
|
||||
interfer.connect('interfer_update', Callable(self, 'on_interfer_new'))
|
||||
var items_list = []
|
||||
recurse(get_tree().get_root(), items_list)
|
||||
print_debug(items_list)
|
||||
|
||||
func recurse(obj, items_list: Array):
|
||||
var childrens = obj.get_children()
|
||||
for ch in childrens:
|
||||
items_list.append(ch)
|
||||
recurse(ch, items_list)
|
||||
|
||||
func get_all_nodes(root):
|
||||
var nodes = []
|
||||
nodes.append(root)
|
||||
for child in root.get_children():
|
||||
nodes.append_array(get_all_nodes(child))
|
||||
return nodes
|
||||
|
||||
func on_enter_tree() -> void:
|
||||
call_deferred('_on_btn_scale_pressed')
|
||||
@@ -157,7 +172,7 @@ func on_enter_tree() -> void:
|
||||
$tilemap.position = $canvas.get_strob_center()
|
||||
|
||||
|
||||
## Производит отображение цели на диаграмму
|
||||
## Производит отображение цели на диаграмму.
|
||||
func map_threat_to_bip(th: threats.Threat, bip: Control):
|
||||
bip.position = tools.pos_calc(
|
||||
th.freq,
|
||||
@@ -169,13 +184,13 @@ func map_threat_to_bip(th: threats.Threat, bip: Control):
|
||||
freq_high) - bip.size / 2
|
||||
|
||||
|
||||
## Обработчик сигнала обновления цели
|
||||
## Обработчик сигнала обновления цели.
|
||||
func on_threat_update(th):
|
||||
var bip = get_node('%d' % th.id)
|
||||
map_threat_to_bip(th, bip)
|
||||
|
||||
|
||||
## Обработчик выбора помехи для цели
|
||||
## Обработчик выбора помехи для цели.
|
||||
func on_interfer_new(ecm):
|
||||
if interfer.thrs.has(ecm.ispp):
|
||||
if interfer.thrs.has(ecm.ispp):
|
||||
@@ -192,7 +207,7 @@ func on_interfer_new(ecm):
|
||||
set_fs_color(ecm)
|
||||
|
||||
|
||||
## Обработчик выключения всех помех
|
||||
## Обработчик выключения всех помех.
|
||||
func on_interfer_off_all():
|
||||
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
|
||||
for bip in bips:
|
||||
@@ -202,7 +217,7 @@ func on_interfer_off_all():
|
||||
update_fs_colors()
|
||||
|
||||
|
||||
## Обработчик сигнала обнаружения цели
|
||||
## Обработчик сигнала обнаружения цели.
|
||||
func on_threat_new(th) -> void:
|
||||
var bip = Bip.instantiate()
|
||||
bip.name = '%d' % th.id
|
||||
@@ -210,20 +225,20 @@ func on_threat_new(th) -> void:
|
||||
add_child(bip)
|
||||
|
||||
|
||||
## Обработчик сигнала потери цели
|
||||
## Обработчик сигнала потери цели.
|
||||
func on_threat_lost(th) -> void:
|
||||
var bip = get_node('%d' % th.id)
|
||||
remove_child(bip)
|
||||
bip.free()
|
||||
|
||||
|
||||
## обработчик нажатия на цель на экране
|
||||
## обработчик нажатия на цель на экране.
|
||||
func on_bip_pressed(th_id, _ecm_btns):
|
||||
if btn_select == BtnSel.THREAT:
|
||||
signaller.emit_signal('rto_threat_sel', th_id)
|
||||
|
||||
|
||||
## Обработчик выбора РТО цели
|
||||
## Обработчик выбора РТО цели.
|
||||
func on_rto_threat_sel(th_id, ecm_btns):
|
||||
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
|
||||
for item in bips:
|
||||
@@ -236,7 +251,7 @@ func on_rto_threat_sel(th_id, ecm_btns):
|
||||
set_btns_disabled(false, btn)
|
||||
|
||||
|
||||
## Обработчик снятия выбора РТО цели
|
||||
## Обработчик снятия выбора РТО цели.
|
||||
func on_rto_threat_unsel(th_id, _ecm_btns):
|
||||
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
|
||||
for item in bips:
|
||||
@@ -246,13 +261,13 @@ func on_rto_threat_unsel(th_id, _ecm_btns):
|
||||
set_ecm_btns_state(true)
|
||||
|
||||
|
||||
## Обработчик нажатия кнопки "Строб". Управляет отображением строба
|
||||
## Обработчик нажатия кнопки "Строб". Управляет отображением строба.
|
||||
func on_button_strobe_pressed() -> void:
|
||||
drag_fsm = DragFSM.IDLE if $btns_select/btn_strob.is_pressed() else DragFSM.OFF
|
||||
$canvas.set_strob_visible(drag_fsm == DragFSM.IDLE)
|
||||
|
||||
|
||||
## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей
|
||||
## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей.
|
||||
func on_button_select(btn_this, btn_others) -> void:
|
||||
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
|
||||
btn_select = btn_this.get_meta('state')
|
||||
@@ -262,7 +277,7 @@ func on_button_select(btn_this, btn_others) -> void:
|
||||
set_ecm_btns_state(true)
|
||||
|
||||
|
||||
## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе
|
||||
## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе.
|
||||
func on_button_pressed(btn_this, btn_others) -> void:
|
||||
var fs_arr: Array = []
|
||||
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
|
||||
@@ -271,7 +286,7 @@ func on_button_pressed(btn_this, btn_others) -> void:
|
||||
signaller.emit_signal('interfer_init', btn_this, fs_arr)
|
||||
|
||||
|
||||
## Управляет состоянием кнопок в радиогруппе при выборе помехи
|
||||
## Управляет состоянием кнопок в радиогруппе при выборе помехи.
|
||||
func on_interfer_selected(ecm, btns) -> void:
|
||||
var ecm_name: String
|
||||
if ecm != null:
|
||||
@@ -287,21 +302,21 @@ func on_interfer_selected(ecm, btns) -> void:
|
||||
btn.set_pressed(false)
|
||||
|
||||
|
||||
## Возвращает ширину строба по направлению
|
||||
## Возвращает ширину строба по направлению.
|
||||
func get_strob_width(pos: Vector2, prev: float) -> float:
|
||||
var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width
|
||||
strob_dir_width = tools.clip_value(strob_dir_width, strob_min_width, strob_max_width)
|
||||
return strob_dir_width
|
||||
|
||||
|
||||
## Возвращает ширину строба по частоте
|
||||
## Возвращает ширину строба по частоте.
|
||||
func get_strob_band(pos: Vector2, prev: float) -> float:
|
||||
var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band
|
||||
strob_dir_band = tools.clip_value(strob_dir_band, strob_min_band, strob_max_band)
|
||||
return strob_dir_band
|
||||
|
||||
|
||||
## Устанавливает центр строба по частоте и направлению
|
||||
## Устанавливает центр строба по частоте и направлению.
|
||||
func set_strob(pos: Vector2) -> void:
|
||||
var radp: Vector2 = tools.map_dec_to_rad(radius_center, pos)
|
||||
if radp.y < $canvas.get_radius_outter():
|
||||
@@ -309,7 +324,7 @@ func set_strob(pos: Vector2) -> void:
|
||||
$canvas.set_strob_radius(radp.y)
|
||||
|
||||
|
||||
## Обработка движения мыши для управления стробом. Вызывается во время движения мыши
|
||||
## Обработка движения мыши для управления стробом. Вызывается во время движения мыши.
|
||||
func _on_drag_continue(event) -> void:
|
||||
if drag_button == MOUSE_BUTTON_RIGHT:
|
||||
if shift_pressed:
|
||||
@@ -322,7 +337,7 @@ func _on_drag_continue(event) -> void:
|
||||
set_strob(event.position)
|
||||
|
||||
|
||||
## Обработка движения мыши для управления стробом. Вызывается при нажатии мыши
|
||||
## Обработка движения мыши для управления стробом. Вызывается при нажатии мыши.
|
||||
func _on_drag_begin(event) -> void:
|
||||
drag_pos_begin = event.position
|
||||
if drag_button == MOUSE_BUTTON_LEFT:
|
||||
@@ -332,7 +347,7 @@ func _on_drag_begin(event) -> void:
|
||||
strob_band_begin = $canvas.get_strob_band()
|
||||
|
||||
|
||||
## Обработчик событий ввода. Вызывается godot
|
||||
## Обработчик событий ввода. Вызывается godot.
|
||||
func _input(event) -> void:
|
||||
if not is_visible_in_tree(): return
|
||||
if event is InputEventMouseMotion:
|
||||
@@ -355,21 +370,21 @@ func _input(event) -> void:
|
||||
shift_pressed = event.pressed
|
||||
|
||||
|
||||
## Вызывается по нажатию кнопки "Детализация"
|
||||
## Вызывается по нажатию кнопки "Детализация".
|
||||
func _on_btn_scale_pressed() -> void:
|
||||
var zoom = $btn_zoom.get_meta('zoom')
|
||||
zoom = zoom + 1 if zoom < max_zoom else min_zoom
|
||||
signaller.emit_signal('zoom_changed', zoom)
|
||||
|
||||
|
||||
## Вызывается по завершению изменения детализации карты
|
||||
## Вызывается по завершению изменения детализации карты.
|
||||
func _on_zoom_complete(zoom: int) -> void:
|
||||
var prefix = $btn_zoom.get_meta('prefix')
|
||||
$btn_zoom/lbl.text = '%s %d' % [prefix, zoom]
|
||||
$btn_zoom.set_meta('zoom', zoom)
|
||||
|
||||
|
||||
# Обработчик нажатия по сектору формирователя сигналов
|
||||
## Обработчик нажатия по сектору формирователя сигналов.
|
||||
func sel_fs_sector(event):
|
||||
if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT):
|
||||
var center: Vector2 = $tilemap.position
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=14 format=3 uid="uid://b276iygic5itk"]
|
||||
[gd_scene load_steps=15 format=3 uid="uid://b276iygic5itk"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/работа/работа.gd" id="1_niok4"]
|
||||
[ext_resource type="PackedScene" uid="uid://nl1vklubr5kr" path="res://scenes/bip/bip.tscn" id="2_br3s6"]
|
||||
@@ -18,6 +18,8 @@ resource_local_to_scene = true
|
||||
shader = ExtResource("11_ekapd")
|
||||
shader_parameter/radius = 0.39
|
||||
|
||||
[sub_resource type="ImageTexture" id="ImageTexture_cnmvt"]
|
||||
|
||||
[node name="Работа" type="Panel"]
|
||||
script = ExtResource("1_niok4")
|
||||
Bip = ExtResource("2_br3s6")
|
||||
@@ -120,6 +122,33 @@ size_flags_vertical = 3
|
||||
text = "Подавление"
|
||||
toggle_mode = true
|
||||
|
||||
[node name="bt_navig_u" type="TextureButton" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 530.0
|
||||
offset_top = 428.0
|
||||
offset_right = 570.0
|
||||
offset_bottom = 468.0
|
||||
|
||||
[node name="bt_navig_l" type="TextureButton" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 410.0
|
||||
offset_top = 532.0
|
||||
offset_right = 460.0
|
||||
offset_bottom = 581.0
|
||||
texture_normal = SubResource("ImageTexture_cnmvt")
|
||||
|
||||
[node name="bt_navig_r" type="TextureButton" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 651.0
|
||||
offset_top = 540.0
|
||||
offset_right = 691.0
|
||||
offset_bottom = 580.0
|
||||
|
||||
[node name="bt_navig_d" type="TextureButton" parent="."]
|
||||
layout_mode = 0
|
||||
offset_right = 40.0
|
||||
offset_bottom = 40.0
|
||||
|
||||
[node name="btn_zoom" parent="." instance=ExtResource("9_oey3x")]
|
||||
layout_mode = 0
|
||||
offset_left = 12.0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
extends Panel
|
||||
class_name ems extends Panel
|
||||
|
||||
# Предзагрузка ячеек таблиц
|
||||
## Предзагрузка ячеек таблиц.
|
||||
const TableHeader = preload('res://table/header.tscn')
|
||||
const CellYemsButton = preload('res://scenes/эмс/кнопка-эмс.tscn')
|
||||
const CellLineEdit = preload('res://table/ячейка-2.tscn')
|
||||
@@ -10,7 +10,7 @@ const CellLEEmpty = preload('res://scenes/эмс/line-edit-empty.tscn')
|
||||
const CellFront = preload('res://scenes/cell/cell-front.tscn')
|
||||
const CellFrontRear = preload('res://scenes/cell/cell-front-rear.tscn')
|
||||
|
||||
# Режимы работы выходов
|
||||
## Режимы работы выходов.
|
||||
const OUT_MODE: Array = ['Работа', 'Контроль', '1', '0'] #
|
||||
const COLUMN_OPTS_BTN: Array = [5]
|
||||
const TABLE_ENTRY_COLUMNS: Array = [2,3]
|
||||
@@ -18,16 +18,16 @@ const OUT_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty,
|
||||
const IN_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty, CellLEEmpty]
|
||||
|
||||
|
||||
var g_boards: Dictionary # Словарь плат ЭМС
|
||||
var posx: int = 125 # Позиция элементов по x
|
||||
var posy: int = 70 # Позиция элементов по y
|
||||
var g_boards: Dictionary ## Словарь плат ЭМС.
|
||||
var posx: int = 125 ## Позиция элементов по x.
|
||||
var posy: int = 70 ## Позиция элементов по y.
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
call_deferred('init_boards')
|
||||
|
||||
|
||||
## Инициализация основных элементов экрана ЭМС
|
||||
## Инициализация основных элементов экрана ЭМС.
|
||||
func init_boards():
|
||||
# Выставление позиций элементов ЭМС на экране
|
||||
$scrollin.set_position(Vector2(posx,posy))
|
||||
@@ -68,8 +68,8 @@ func on_btn_disconnect():
|
||||
on_disconnect($scrl_out_set/tbl_out_set, selected_rows_out, 'выход')
|
||||
|
||||
|
||||
## Разрывает связь входа и выхода, [param tbl] - таблица, [param selected_rows] - выбранные строки
|
||||
## [param type_dev] - тип, 'вход' или 'выход'
|
||||
## Разрывает связь входа и выхода, [param tbl] - таблица, [param selected_rows] - выбранные строки.
|
||||
## [param type_dev] - тип, 'вход' или 'выход'.
|
||||
func on_disconnect(tbl, selected_rows, type_dev: String):
|
||||
var dev = tbl.get_node_user_data(0, 0)
|
||||
var user_data: Array = tbl.get_node_user_data(0, selected_rows[0])
|
||||
@@ -85,26 +85,26 @@ func on_disconnect(tbl, selected_rows, type_dev: String):
|
||||
set_out_dev(dev)
|
||||
|
||||
|
||||
## Обработчик нажатия кнопки "Прочитать"
|
||||
## Обработчик нажатия кнопки "Прочитать".
|
||||
func on_btn_flash_read(btn):
|
||||
await get_tree().create_timer(0.1).timeout
|
||||
btn.pressed = false
|
||||
|
||||
|
||||
## Обработчик нажатия кнопки "Записать"
|
||||
## Обработчик нажатия кнопки "Записать".
|
||||
func on_btn_flash_write(btn):
|
||||
await get_tree().create_timer(0.1).timeout
|
||||
btn.pressed = false
|
||||
|
||||
|
||||
## Инициализация таблицы с файлами настроек ЭМС
|
||||
## Инициализация таблицы с файлами настроек ЭМС.
|
||||
func init_tbl_files():
|
||||
$scrl_files/tbl_files.set_header([TableHeader, TableHeader, TableHeader])
|
||||
$scrl_files/tbl_files.set_header_text(['Имя файла', 'Дата изменения', 'Размер'])
|
||||
$scrl_files/tbl_files.set_columns_min_size([200, 120, 70])
|
||||
|
||||
|
||||
## Инициализация таблиц входов
|
||||
## Инициализация таблиц входов.
|
||||
func init_tbl_in():
|
||||
# Инициализация основной таблицы входов, в ней отображается информация о параметрах и состоянии
|
||||
var header_type: Array = [TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader]
|
||||
@@ -142,12 +142,12 @@ func init_tbl_in():
|
||||
$scrl_in_set/tbl_in_set.connect('selected_changed', Callable(self, 'on_selected_changed_si'))
|
||||
|
||||
|
||||
## Обработчик редактирования Entry в таблице параметров входов/выходов
|
||||
## Обработчик редактирования Entry в таблице параметров входов/выходов.
|
||||
func on_edit_entry(text : String, entry):
|
||||
print_debug(text, entry)
|
||||
|
||||
|
||||
## Обработчик выбора строки в таблице входов
|
||||
## Обработчик выбора строки в таблице входов.
|
||||
func on_selected_changed_in(i_row: int):
|
||||
var selecter_rows: Array = []
|
||||
$scrollin/tbl_in.get_selected_rows(selecter_rows)
|
||||
@@ -156,19 +156,19 @@ func on_selected_changed_in(i_row: int):
|
||||
set_in_dev(dev)
|
||||
|
||||
|
||||
## Обработчик нажатия на таблицу входов
|
||||
## Обработчик нажатия на таблицу входов.
|
||||
func on_row_pressed_in(i_row: int):
|
||||
on_row_pressed(i_row, $scrollin/tbl_in)
|
||||
on_selected_changed_in(i_row)
|
||||
|
||||
|
||||
## Выбор входного устройства, для отображения в таблице соединений входа и изменения параметров
|
||||
## Выбор входного устройства, для отображения в таблице соединений входа и изменения параметров.
|
||||
func set_in_dev(dev):
|
||||
var row_type: Array = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState]
|
||||
set_dev($scrl_in_set/tbl_in_set, dev, row_type, IN_SET_ROW, 'Список соединённых выходов :', [250, 100, 70, 70, 70])
|
||||
|
||||
|
||||
## Обработчик выбора строки в таблице соединений входа и изменения параметров
|
||||
## Обработчик выбора строки в таблице соединений входа и изменения параметров.
|
||||
func on_selected_changed_si(i_row: int):
|
||||
if i_row < 2:
|
||||
return
|
||||
@@ -181,7 +181,7 @@ func on_selected_changed_si(i_row: int):
|
||||
on_row_pressed_out(i)
|
||||
|
||||
|
||||
## Обработчик нажатия на таблицу соединений входа и изменения параметров
|
||||
## Обработчик нажатия на таблицу соединений входа и изменения параметров.
|
||||
func on_row_pressed_si(i_row: int):
|
||||
if i_row < 2:
|
||||
return
|
||||
@@ -189,7 +189,7 @@ func on_row_pressed_si(i_row: int):
|
||||
on_selected_changed_si(i_row)
|
||||
|
||||
|
||||
## Инициализация таблиц выходов
|
||||
## Инициализация таблиц выходов.
|
||||
func init_tbl_out():
|
||||
# Инициализация основной таблицы выходов, в ней отображается информация о параметрах и состоянии
|
||||
var header_text = ['Выходы', 'Соединитель', 'мкс', 'мкс', 'Состояние', 'Режим']
|
||||
@@ -225,7 +225,7 @@ func init_tbl_out():
|
||||
$scrl_out_set/tbl_out_set.connect('selected_changed', Callable(self, 'on_selected_changed_so'))
|
||||
|
||||
|
||||
## Обработчик выбора строки в таблице соединений выхода и изменения параметров
|
||||
## Обработчик выбора строки в таблице соединений выхода и изменения параметров.
|
||||
func on_selected_changed_so(i_row: int):
|
||||
if i_row < 2:
|
||||
return
|
||||
@@ -238,7 +238,7 @@ func on_selected_changed_so(i_row: int):
|
||||
on_row_pressed_in(i)
|
||||
|
||||
|
||||
## Обработчик нажатия на таблицу соединений выхода и изменения параметров
|
||||
## Обработчик нажатия на таблицу соединений выхода и изменения параметров.
|
||||
func on_row_pressed_so(i_row: int):
|
||||
if i_row < 2:
|
||||
return
|
||||
@@ -246,7 +246,7 @@ func on_row_pressed_so(i_row: int):
|
||||
on_selected_changed_so(i_row)
|
||||
|
||||
|
||||
## Обработчик выбора строки в таблице выходов
|
||||
## Обработчик выбора строки в таблице выходов.
|
||||
func on_selected_changed_out(i_row: int):
|
||||
var selecter_rows: Array = []
|
||||
$scrollout/tbl_out.get_selected_rows(selecter_rows)
|
||||
@@ -255,13 +255,13 @@ func on_selected_changed_out(i_row: int):
|
||||
set_out_dev(dev)
|
||||
|
||||
|
||||
## Обработчик выбора строки в таблице выходов
|
||||
## Обработчик выбора строки в таблице выходов.
|
||||
func on_row_pressed_out(i_row: int):
|
||||
on_row_pressed(i_row, $scrollout/tbl_out)
|
||||
on_selected_changed_out(i_row)
|
||||
|
||||
|
||||
## Выбор выходного устройства, для отображения в таблице соединений выхода и изменения параметров
|
||||
## Выбор выходного устройства, для отображения в таблице соединений выхода и изменения параметров.
|
||||
func set_out_dev(dev):
|
||||
var row_type: Array = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState, CellOptBtn]
|
||||
set_dev($scrl_out_set/tbl_out_set, dev, row_type, OUT_SET_ROW, 'Список соединённых входов :', [250, 100, 70, 70, 70, 100])
|
||||
@@ -273,9 +273,12 @@ func set_out_dev(dev):
|
||||
mode.select(mode_index)
|
||||
|
||||
|
||||
## Выбор входного или выходного устройства [param tbl] - таблица, [param dev] - устройство,
|
||||
## [param row_type] - массив с типами колонок, [param row_type_conn] - массив с пустыми LineEdit
|
||||
## [param lbl_text] - текст отображаемый во 2 строке: пример: ('Список соединённых входов :')
|
||||
## Выбор входного или выходного устройства.[br]
|
||||
## [param tbl] - таблица,[br]
|
||||
## [param dev] - устройство,[br]
|
||||
## [param row_type] - массив с типами колонок,[br]
|
||||
## [param row_type_conn] - массив с пустыми LineEdit,[br]
|
||||
## [param lbl_text] - текст отображаемый во 2 строке: пример: ('Список соединённых входов :').[br]
|
||||
func set_dev(tbl, dev, row_type, row_type_conn, lbl_text, row_size):
|
||||
tbl.clear_rows()
|
||||
tbl.add_row(row_type)
|
||||
@@ -311,7 +314,7 @@ func set_dev(tbl, dev, row_type, row_type_conn, lbl_text, row_size):
|
||||
tbl.connect_columns(self, 'text_submitted', 'on_edit_entry', TABLE_ENTRY_COLUMNS, [])
|
||||
|
||||
|
||||
## Обработчик нажатия кнопки connect
|
||||
## Обработчик нажатия кнопки connect.
|
||||
func on_btn_connect():
|
||||
var in_row_index: Array = []
|
||||
var out_row_index: Array = []
|
||||
@@ -326,9 +329,12 @@ func on_btn_connect():
|
||||
add_connection_dev($scrl_in_set/tbl_in_set, out_dev, in_dev, IN_SET_ROW, out_user_data)
|
||||
|
||||
|
||||
## образовывает связь между выбранным входом и выходом [param tbl] - таблица, [param dev1] - устройство1,
|
||||
## [param dev2] - устройство 2, [param set_row] - массив с пустыми LineEdit
|
||||
## [param user_data] - пользовательские данные устройства1
|
||||
## Образовывает связь между выбранным входом и выходом.[br]
|
||||
## [param tbl] - таблица,[br]
|
||||
## [param dev1] - устройство1,[br]
|
||||
## [param dev2] - устройство 2,[br]
|
||||
## [param set_row] - массив с пустыми LineEdit,[br]
|
||||
## [param user_data] - пользовательские данные устройства1.[br]
|
||||
func add_connection_dev(tbl, dev1, dev2, set_row, user_data):
|
||||
if not dev1.connector in dev2.connect_devs:
|
||||
tbl.add_row(set_row)
|
||||
@@ -340,15 +346,17 @@ func add_connection_dev(tbl, dev1, dev2, set_row, user_data):
|
||||
dev2.connect_devs[dev1.connector] = user_data
|
||||
|
||||
|
||||
## Отключает возможность редактирования LineEdit в таблице [param tbl] - таблица,
|
||||
## [param num_col] - номер колонки, [param i_row] - номер столбца
|
||||
## Отключает возможность редактирования LineEdit в таблице.[br]
|
||||
## [param tbl] - таблица,[br]
|
||||
## [param num_col] - номер колонки,[br]
|
||||
## [param i_row] - номер столбца.[br]
|
||||
func disable_edit(tbl, num_col: int, i_row: int):
|
||||
for col in range(num_col):
|
||||
var node: LineEdit = tbl.get_node2(col, i_row)
|
||||
node.editable = false
|
||||
|
||||
|
||||
## Обработчик выбора строки с таблице
|
||||
## Обработчик выбора строки с таблице.
|
||||
func on_row_pressed(i_row: int, tbl):
|
||||
tbl.clear_rows_selected()
|
||||
var is_row_selected = tbl.is_row_selected(i_row)
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
extends Node
|
||||
class_name STC extends Node
|
||||
|
||||
## Реализация "Протокол информационного сопряжения
|
||||
## СПО АСУ изделия «МП‑550» с СПО «Управления КАПС РПБ»"
|
||||
## Реализация "Протокол информационного сопряжения.
|
||||
## СПО АСУ изделия «МП‑550» с СПО «Управления КАПС РПБ».
|
||||
|
||||
|
||||
const ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от КАПС РПБ, мс
|
||||
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм
|
||||
const ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от КАПС РПБ, мс.
|
||||
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм.
|
||||
|
||||
|
||||
class CapsRpb:
|
||||
signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось
|
||||
signal data_received(unit: CapsRpb) ## Сигнал данные приняты
|
||||
signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды
|
||||
signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения
|
||||
signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось.
|
||||
signal data_received(unit: CapsRpb) ## Сигнал данные приняты.
|
||||
signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды.
|
||||
signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения.
|
||||
|
||||
static var json_conv: = JSON.new()
|
||||
var online: = false ## Состояние связи с источником сообщений
|
||||
var name: String ## Имя экземпляра
|
||||
var json_dic: Dictionary ## Аппарат для разбора сообщений
|
||||
var tick: = 0 ## Тик время последнего обновления, мс
|
||||
var tx_data: = PackedByteArray() ## Пакет для отправки
|
||||
var tx_stack: Array ## Массив пакетов для отправки
|
||||
var online: = false ## Состояние связи с источником сообщений.
|
||||
var name: String ## Имя экземпляра.
|
||||
var json_dic: Dictionary ## Аппарат для разбора сообщений.
|
||||
var tick: = 0 ## Тик время последнего обновления, мс.
|
||||
var tx_data: = PackedByteArray() ## Пакет для отправки.
|
||||
var tx_stack: Array ## Массив пакетов для отправки.
|
||||
|
||||
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||||
func _init(nm): self.name = nm
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
extends Node
|
||||
class_name HotKeys extends Node
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@@ -11,7 +11,7 @@ func _input(event: InputEvent) -> void:
|
||||
signaller.emit_signal('full_screen')
|
||||
|
||||
|
||||
## Переключает режим окна программы полный - обычный экран
|
||||
## Переключает режим окна программы полный - обычный экран.
|
||||
func toggle_full_screen(id: int) -> void:
|
||||
var mode = DisplayServer.window_get_mode(id)
|
||||
mode = DisplayServer.WINDOW_MODE_WINDOWED \
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
extends Node
|
||||
class_name Iterfer extends Node
|
||||
|
||||
## Представление помехи
|
||||
## Представление помехи.
|
||||
|
||||
## Режимы помехи
|
||||
## Режимы помехи.
|
||||
const ITERFER_MODE = {
|
||||
'off': ['Откл', ['freq', 'width'], 0],
|
||||
'auto': ['АВТО', ['freq', 'width'], 1000],
|
||||
@@ -27,16 +27,16 @@ const WIDTH_MAX = 120
|
||||
const WIDTH_MIN = 0
|
||||
|
||||
const SOURCE_INTERFER = ['th','fs','cu']
|
||||
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей
|
||||
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей.
|
||||
const INTERFER_OFF = 'off'
|
||||
const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен
|
||||
var msg_ss: int = 0 ## счётчик сообщений
|
||||
var id_array: Array ## Массив id воздействий
|
||||
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия
|
||||
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия
|
||||
var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия
|
||||
const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен.
|
||||
var msg_ss: int = 0 ## Счётчик сообщений.
|
||||
var id_array: Array ## Массив id воздействий.
|
||||
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия.
|
||||
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия.
|
||||
var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия.
|
||||
|
||||
## Сеанс помехи
|
||||
## Сеанс помехи.
|
||||
class Interfer:
|
||||
var ss: int = 0 ## Счётчик сообщений.
|
||||
var ispp: int = 0 ## Индекс сеанса.
|
||||
@@ -48,7 +48,7 @@ class Interfer:
|
||||
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
|
||||
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
|
||||
var tick_tx: int ## Тик время обновления цели, мс.
|
||||
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха
|
||||
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха.
|
||||
|
||||
func _to_string() -> String:
|
||||
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
|
||||
@@ -94,7 +94,7 @@ signal interfer_resized(ecms: Dictionary) ## Вызывается пр
|
||||
|
||||
|
||||
func _ready():
|
||||
var ecms: Dictionary = {} ## Словарь помех
|
||||
var ecms: Dictionary = {} ## Словарь помех.
|
||||
for i in range(ID_INTERFERS_LEN): # Заполняет массив ID целей
|
||||
id_array.append(i + 1)
|
||||
var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп')
|
||||
@@ -114,7 +114,7 @@ func _ready():
|
||||
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit, ecms))
|
||||
|
||||
|
||||
# Проверяет состояние отправки пакета и если не доставлен, повторяет отправку
|
||||
## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку.
|
||||
func on_timer_check_state(unit, ecms, resend_timeout):
|
||||
var tick = Time.get_ticks_msec()
|
||||
for ecm in ecms.values():
|
||||
@@ -124,7 +124,7 @@ func on_timer_check_state(unit, ecms, resend_timeout):
|
||||
ecm.tick_tx = tick
|
||||
|
||||
|
||||
## Производит приём состояния помех. [param unit] -> [param ecms]
|
||||
## Производит приём состояния помех. [param unit] -> [param ecms].
|
||||
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
|
||||
if not unit.json_dic.has('ts'): return
|
||||
if not (unit.json_dic['ts'] is float): return
|
||||
@@ -150,7 +150,7 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
|
||||
call_deferred('emit_signal', 'interfer_resized', ecms)
|
||||
|
||||
|
||||
## Вызыватся, когда пользователь выбрал помеху и выбраны цели
|
||||
## Вызыватся, когда пользователь выбрал помеху и выбраны цели.
|
||||
func on_interfer_create(btn, sel_threats, fs_arr, _unit, ecms):
|
||||
for item in sel_threats:
|
||||
var param: Dictionary = {}
|
||||
@@ -262,5 +262,5 @@ func push_id(id : int):
|
||||
id_array.sort()
|
||||
|
||||
|
||||
## отправляет словаhь помех в юнит, для запаковки и отправки в 5П28
|
||||
## Отправляет словарь помех в юнит, для запаковки и отправки в 5П28.
|
||||
func on_get_interfers(unit, ecms): unit.pack_interfers(cu, ecms)
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
extends Node
|
||||
class_name Mercator extends Node
|
||||
|
||||
## Утилиты для работы с меркаторовскими XYZ-плитками.
|
||||
|
||||
const R2D: = 180.0 / PI
|
||||
const RE: = 6378137.0 ## Радиус Земли экваториальный в метрах
|
||||
const RP: = 6356752.31424518 ## Радиус Земли полярный в метрах
|
||||
const CE: = 2.0 * PI * RE ## Длина окружности Земли в метрах по экватору
|
||||
const CP: = 2.0 * PI * RP ## Длина окружности Земли в метрах через полюсы
|
||||
const RE: = 6378137.0 ## Радиус Земли экваториальный в метрах.
|
||||
const RP: = 6356752.31424518 ## Радиус Земли полярный в метрах.
|
||||
const CE: = 2.0 * PI * RE ## Длина окружности Земли в метрах по экватору.
|
||||
const CP: = 2.0 * PI * RP ## Длина окружности Земли в метрах через полюсы.
|
||||
const EPSILON: = 1e-14
|
||||
const LL_EPSILON: = 1e-11
|
||||
const MAX_ZOOM: = 20
|
||||
@@ -14,15 +14,15 @@ const MAX_NORTH = 85.051129
|
||||
const MAX_SOUTH = -85.051129
|
||||
|
||||
|
||||
## XYZ-плитка веб-меркатора [param x], [param y], [param z] индексы
|
||||
# [b]x[/b] и [b]y[/b] плитки и уровень масштабирования [b]z[/b].
|
||||
## XYZ-плитка веб-меркатора [param x], [param y], [param z] индексы.
|
||||
## [b]x[/b] и [b]y[/b] плитки и уровень масштабирования [b]z[/b].
|
||||
class Tile:
|
||||
var x: int
|
||||
var y: int
|
||||
var z: int
|
||||
var lng: float ## Координаты, которые плитка должна покрывать, долгота, градусы
|
||||
var lat: float ## Широта, градусы
|
||||
var is_root: bool ## Признак, что плитка корневая (покрывает координаты)
|
||||
var lng: float ## Координаты, которые плитка должна покрывать, долгота, градусы.
|
||||
var lat: float ## Широта, градусы.
|
||||
var is_root: bool ## Признак, что плитка корневая (покрывает координаты).
|
||||
|
||||
func as_array(): return [self.x, self.y, self.z]
|
||||
|
||||
@@ -62,7 +62,7 @@ class LngLat:
|
||||
var lng: float = 0.0 ## Долгота в десятичных градусах восточной долготы.
|
||||
var lat: float = 0.0 ## Широта в десятичных градусах северной широты.
|
||||
|
||||
## Возвращает в виде массива
|
||||
## Возвращает в виде массива.
|
||||
func as_array() -> Array: return [self.lng, self.lat]
|
||||
|
||||
func _to_string() -> String: return '[%f, %f, %f]' % [self.x, self.y, self.z]
|
||||
@@ -79,7 +79,7 @@ class LngLatBbox:
|
||||
var east: float ## Восток
|
||||
var north: float ## Север
|
||||
|
||||
## Возвращает в виде массива
|
||||
## Возвращает в виде массива.
|
||||
func as_array() -> Array: return [self.west, self.south, self.east, self.north]
|
||||
|
||||
func _to_string() -> String: return '[%f, %f, %f, %f]' % [self.west, self.south, self.east, self.north]
|
||||
@@ -114,12 +114,12 @@ func radians(v: float) -> float: return (v * PI) / 180.0
|
||||
func rshift(val: int, n: int) -> int: return (val % 0x100000000) >> n
|
||||
|
||||
|
||||
# Возвращает арксинус гиперболический от значения [param val]
|
||||
## Возвращает арксинус гиперболический от значения [param val].
|
||||
func asinh(val: float): return log(val + sqrt(val * val + 1.0))
|
||||
|
||||
|
||||
# Преобразует [param lon] в градусах восточной долготы, [param lat] в градусах
|
||||
# северной долготы, [param alt] высоты в метрах в фиксированные координаты (x, y, z) Земли.
|
||||
## Преобразует [param lon] в градусах восточной долготы, [param lat] в градусах.
|
||||
## северной долготы, [param alt] высоты в метрах в фиксированные координаты (x, y, z) Земли.
|
||||
func lnglat_to_ecef(lng: float, lat: float, alt: float = 0.0) -> Array:
|
||||
alt += (RE + RP) / 2.0
|
||||
var latrad: float = radians(lat)
|
||||
@@ -148,7 +148,7 @@ func find_up_left(tiles: Array):
|
||||
return null
|
||||
|
||||
|
||||
## Lon./lat. to tile numbers
|
||||
## [param lon]/[param lat]. для номера плитки.
|
||||
func deg2num(lng: float, lat: float, zoom: int):
|
||||
var n: = float(1 << zoom)
|
||||
var xtile: = int((lng + 180.0) / 360.0 * n)
|
||||
@@ -156,7 +156,7 @@ func deg2num(lng: float, lat: float, zoom: int):
|
||||
return [xtile, ytile]
|
||||
|
||||
|
||||
## Tile numbers to lon./lat.
|
||||
## Номера плитки для [param lon]/[param lat].
|
||||
func num2deg(x: int, y: int, zoom: int):
|
||||
var n: = float(1 << zoom)
|
||||
var lng: = float(x) / n * 360.0 - 180.0
|
||||
@@ -164,7 +164,7 @@ func num2deg(x: int, y: int, zoom: int):
|
||||
return [lng, degrees(lat)]
|
||||
|
||||
|
||||
## Расстояние по горизонтали в метрах, представленное одним пикселем
|
||||
## Расстояние по горизонтали в метрах, представленное одним пикселем.
|
||||
## [param lat] - Широта, градусы.[br]
|
||||
## [param zoom] - Уровень детализации.[br]
|
||||
## [param size] - Размер плитки в пикселях.[br]
|
||||
@@ -172,7 +172,7 @@ func dist_per_pixel(lat: float, zoom: int, size: int = 256) -> float:
|
||||
return (CE / float(size)) * cos(radians(lat)) / float(2 ** zoom)
|
||||
|
||||
|
||||
## Расстояние по горизонтали в метрах, представленное одной плиткой
|
||||
## Расстояние по горизонтали в метрах, представленное одной плиткой.
|
||||
## [param lat] - Широта, градусы.[br]
|
||||
## [param zoom] - Уровень детализации.[br]
|
||||
func dist_per_tile(lat: float, zoom: int) -> float:
|
||||
@@ -226,7 +226,7 @@ func get_degrees_bounds(m: float, lng: float, lat: float) -> Array[float]:
|
||||
return [x_y[0] - m, x_y[1] - m, x_y[0] + m, x_y[1] + m]
|
||||
|
||||
|
||||
## Возвращает границы плиток в градусах
|
||||
## Возвращает границы плиток в градусах.
|
||||
func get_tiles_bounds(tiles: Array[Tile]) -> Array:
|
||||
var mm = []
|
||||
for t in tiles: mm.append(bounds(t).west)
|
||||
@@ -245,7 +245,7 @@ func get_tiles_bounds(tiles: Array[Tile]) -> Array:
|
||||
|
||||
|
||||
## Возвращает левую верхнюю долготу и широту плитки.[br]
|
||||
## [param tile] Плитка.[br]
|
||||
## [param tile] - Плитка.[br]
|
||||
## [codeblock]
|
||||
## >>> ul(Tile(x=0, y=0, z=1))
|
||||
## LngLat(lng=-180.0, lat=85.0511287798066)
|
||||
@@ -322,10 +322,10 @@ func lnglat(x: float, y: float, truncate: bool = false) -> LngLat:
|
||||
return LngLat.new(ll[0], ll[1])
|
||||
|
||||
|
||||
## Соседи плитки. [method neighbors] возвращает до восьми
|
||||
## соседних плиток, при этом плитки будут опущены, если они не являются действительными, например.
|
||||
## Tile(-1, -1, z). [param tile]: Плитка или последовательность int
|
||||
## Может быть либо экземпляр Tile, либо 3 ints, X, Y, Z.
|
||||
## Соседи плитки. [method neighbors] возвращает до восьми.[br]
|
||||
## Cоседних плиток, при этом плитки будут опущены, если они не являются действительными, например:[br]
|
||||
## Tile(-1, -1, z). [param tile]: Плитка или последовательность int.[br]
|
||||
## Может быть либо экземпляр Tile, либо 3 ints, X, Y, Z.[br]
|
||||
## [return] Массив
|
||||
## [codeblock]
|
||||
## >>> neighbors(Tile(486, 332, 10))
|
||||
@@ -343,7 +343,7 @@ func neighbors(tile: Tile) -> Array:
|
||||
return tiles
|
||||
|
||||
|
||||
## Возвращает все плитки в радиусе [param r] вокруг заданной плитки [param tile]
|
||||
## Возвращает все плитки в радиусе [param r] вокруг заданной плитки [param tile].
|
||||
func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array:
|
||||
var xys = {}
|
||||
var mi: int = 2 ** tile.z
|
||||
@@ -361,7 +361,7 @@ func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array:
|
||||
return tiles
|
||||
|
||||
|
||||
## Возвращает все плитки по периметру заданной плитки
|
||||
## Возвращает все плитки по периметру заданной плитки.
|
||||
func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array:
|
||||
var tiles = []
|
||||
for i in range(-mr, mr + 1):
|
||||
@@ -375,7 +375,7 @@ func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array:
|
||||
|
||||
## Получение меркаторской граничной рамки веб-плитки.[br]
|
||||
## [param tile] - Плитка.[br]
|
||||
## [i]Эпсилон вычитается из правой границы и прибавляется к нижней[/i]
|
||||
## [i]Эпсилон вычитается из правой границы и прибавляется к нижней.[/i]
|
||||
func xy_bounds(tile: Tile, zoom: int) -> Bbox:
|
||||
var tile_size = CE / pow(2, zoom)
|
||||
var left = tile.x * tile_size - CE / 2
|
||||
@@ -393,7 +393,7 @@ func _xy(lng: float, lat: float, truncate=false) -> Array:
|
||||
return [x, y]
|
||||
|
||||
|
||||
## Получение плитки, содержащей долготу и широту
|
||||
## Получение плитки, содержащей долготу и широту.
|
||||
## [param lng], [param lat] - Пара долготы и широты в десятичных градусах.[br]
|
||||
## [param zoom] - Уровень масштабирования веб-меркатора.[br]
|
||||
## [param truncate] - Нужно ли усекать вводимые данные до границ веб-меркатора.[br]
|
||||
@@ -419,7 +419,7 @@ func create_tile(lng: float, lat: float, zoom: int, truncate: bool=false) -> Til
|
||||
|
||||
|
||||
## Получение четверного ключа плитки.[br]
|
||||
## [param tile] - Плитка
|
||||
## [param tile] - Плитка.
|
||||
func quadkey(tile: Tile, zoom: int) -> String:
|
||||
var rs: = ''
|
||||
for z in range(zoom, 0, -1):
|
||||
@@ -650,7 +650,7 @@ func _get_bbox_zoom(bbox: Array):
|
||||
## [param tile] - Плитка.[br]
|
||||
## [param fid] - Идентификатор объекта.[br]
|
||||
## [param props] - Необязательные дополнительные свойства признака.[br]
|
||||
## [param projected] - Можно создать нестандартный веб-меркатор GeoJSON передав 'mercator'[br]
|
||||
## [param projected] - Можно создать нестандартный веб-меркатор GeoJSON передав 'mercator'.[br]
|
||||
## [param buffer] - Необязательное буферное расстояние для полигона GeoJSON.[br]
|
||||
## [param precision] - Координаты GeoJSON будут усечены до данного количества знаков после запятой.[br]
|
||||
func feature(tile: Tile, fid:String = 'null', props=null, projected='geographic', buffer=null) -> Dictionary:
|
||||
|
||||
@@ -1,44 +1,44 @@
|
||||
extends Node
|
||||
class_name mod_bus extends Node
|
||||
|
||||
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды
|
||||
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды.
|
||||
|
||||
class ModbusClient:
|
||||
|
||||
## Состояние автомата выполнения команды
|
||||
## Состояние автомата выполнения команды.
|
||||
enum CmdState {
|
||||
DONE, ## Команда выполнена
|
||||
FAIL, ## Команда не выполнена
|
||||
SEND, ## Буфер готов для отправки
|
||||
WAIT ## Ожидание выполнения
|
||||
DONE, ## Команда выполнена.
|
||||
FAIL, ## Команда не выполнена.
|
||||
SEND, ## Буфер готов для отправки.
|
||||
WAIT ## Ожидание выполнения.
|
||||
}
|
||||
|
||||
var name: String
|
||||
var unit: = 1 ## Адрес устройства Modbus
|
||||
var cmd_state: = CmdState.DONE ## Код текущей команды
|
||||
var tx_data: PackedByteArray ## Данные для отправки
|
||||
var unit: = 1 ## Адрес устройства Modbus.
|
||||
var cmd_state: = CmdState.DONE ## Код текущей команды.
|
||||
var tx_data: PackedByteArray ## Данные для отправки.
|
||||
var online: = false ## Флаг. Если установлен, устройство на связи. Активный уровень - [b]true[/b].
|
||||
var tick_rx: = 0 ## Время приёма крайнего сообщения
|
||||
var tick_tx: = 0 ## Время отправки крайнего сообщения
|
||||
var tick_rx: = 0 ## Время приёма крайнего сообщения.
|
||||
var tick_tx: = 0 ## Время отправки крайнего сообщения.
|
||||
|
||||
static var json_conv: = JSON.new()
|
||||
|
||||
signal command_done() ## Вызывается при успешном выполнении команды
|
||||
signal command_fail() ## Вызывается при возникновении ошибки во время выполнения команды
|
||||
signal line_changed() ## Вызывается при смене состояния связи с ячейкой
|
||||
signal data_received() ## Вызывается при приёме сообщения, до его разбора
|
||||
signal parse_failed(msg: String) ## Вызывается при возникновении ошибки во время разбора пакета. Передаёт сообщение об ошибке
|
||||
signal command_done() ## Вызывается при успешном выполнении команды.
|
||||
signal command_fail() ## Вызывается при возникновении ошибки во время выполнения команды.
|
||||
signal line_changed() ## Вызывается при смене состояния связи с ячейкой.
|
||||
signal data_received() ## Вызывается при приёме сообщения, до его разбора.
|
||||
signal parse_failed(msg: String) ## Вызывается при возникновении ошибки во время разбора пакета. Передаёт сообщение об ошибке.
|
||||
|
||||
signal holding_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения
|
||||
signal input_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов
|
||||
signal info_received(msg: String) ## Вызывается при получении информационного сообщения
|
||||
signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации
|
||||
signal holding_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения.
|
||||
signal input_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов.
|
||||
signal info_received(msg: String) ## Вызывается при получении информационного сообщения.
|
||||
signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации.
|
||||
|
||||
func _init(nm: String, u: int = 1):
|
||||
unit = u
|
||||
name = nm
|
||||
|
||||
## Изменяет состояние. Вызывать периодически[br]
|
||||
## [param tick] - Текущщее время в мс[br]
|
||||
## Изменяет состояние. Вызывать периодически.[br]
|
||||
## [param tick] - Текущщее время в мс.[br]
|
||||
func process(tick: int):
|
||||
if online and ((tick - tick_rx) > ONLINE_TIMEOUT):
|
||||
online = false
|
||||
@@ -53,9 +53,9 @@ class ModbusClient:
|
||||
cmd_state = CmdState.WAIT
|
||||
return rc
|
||||
|
||||
## Производит разбор принятых данных. Вызывать при приёме данных на сокете[br]
|
||||
## [param data] - Данные принятые на сокете[br]
|
||||
## [param tick] - Текущщее время в мс[br]
|
||||
## Производит разбор принятых данных. Вызывать при приёме данных на сокете.[br]
|
||||
## [param data] - Данные принятые на сокете.[br]
|
||||
## [param tick] - Текущщее время в мс.[br]
|
||||
func parse(data: PackedByteArray, tick: int) -> bool:
|
||||
tick_rx = tick
|
||||
if not online:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
extends Node
|
||||
class_name rep_network extends Node
|
||||
|
||||
|
||||
const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb, 'udp-json-mbcs': modbus.ModbusClient}
|
||||
@@ -11,17 +11,17 @@ class Socket extends PacketPeerUDP:
|
||||
|
||||
|
||||
class SocketTCP extends TCPServer:
|
||||
const RX_TIMEOUT: int = 1000 # Время сброса счётчика принятия части пакета
|
||||
const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета.
|
||||
var peerstream: = PacketPeerStream.new()
|
||||
var unit_key: Array # Клюс юнита
|
||||
var head_len: int = 8 # Длинна заголовка команды
|
||||
var len_place: int = 4 # Номер начального байта с длинной блока данных
|
||||
var type_len: int = 4 # Количество байт в размере длинны
|
||||
var rx_tick: int # Время приёма последнего пакета
|
||||
var rx_all: bool = true # Флаг, что пакет принят полностью
|
||||
var rx_len: int # Количество принятых байт
|
||||
var rx_data: PackedByteArray # Принятые данные
|
||||
var data_len: int # Размер ожидаемых данных
|
||||
var unit_key: Array ## Клюс юнита.
|
||||
var head_len: int = 8 ## Длинна заголовка команды.
|
||||
var len_place: int = 4 ## Номер начального байта с длинной блока данных.
|
||||
var type_len: int = 4 ## Количество байт в размере длинны.
|
||||
var rx_tick: int ## Время приёма последнего пакета.
|
||||
var rx_all: bool = true ## Флаг, что пакет принят полностью.
|
||||
var rx_len: int ## Количество принятых байт.
|
||||
var rx_data: PackedByteArray ## Принятые данные.
|
||||
var data_len: int ## Размер ожидаемых данных.
|
||||
|
||||
func send_to(data):
|
||||
var peer = peerstream.get_stream_peer()
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
extends Node
|
||||
|
||||
## Параметры
|
||||
class_name rep_settings extends Node
|
||||
|
||||
## Параметры.
|
||||
|
||||
@export var UnitProfiles: = { \
|
||||
# Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий
|
||||
@@ -34,7 +33,7 @@ extends Node
|
||||
'уарэп-спт25-2': ['uart', '/dev/tty3', 115200, false, 'Адрес прибора СПТ-25 (G2)'],
|
||||
}
|
||||
|
||||
## Параметры цели
|
||||
## Параметры цели.
|
||||
@export var ThreatParams = {
|
||||
'time_lost': 5000 ## Время после последнего обновления в мс, через которое цель считается потерянной.
|
||||
}
|
||||
@@ -43,7 +42,7 @@ extends Node
|
||||
func _ready() -> void: log.info('Модуль настроек готов')
|
||||
|
||||
|
||||
## Возвращает ключ устройства
|
||||
## Возвращает ключ устройства.
|
||||
func get_unit_key(unit_name: String) -> Array:
|
||||
assert(UnitProfiles.has(unit_name), 'ошибка: нет такого устройства \"%s\"' % unit_name)
|
||||
var item = UnitProfiles[unit_name]
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
class_name Signaller extends Node
|
||||
|
||||
## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют
|
||||
## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют.
|
||||
## два и более узла, из разных файлов. Должен быть помещён в автозагрузку.
|
||||
|
||||
func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl)
|
||||
|
||||
## Вызывается при переходе в режим [b]Работа[/b]
|
||||
## Вызывается при переходе в режим [b]Работа[/b].
|
||||
signal режим_работа()
|
||||
|
||||
|
||||
## Вызывается при переходе в режим [b]Контроль[/b]
|
||||
## Вызывается при переходе в режим [b]Контроль[/b].
|
||||
signal режим_контроль()
|
||||
|
||||
|
||||
## Вызывается при переходе в режим [b]Журнал[/b]
|
||||
## Вызывается при переходе в режим [b]Журнал[/b].
|
||||
signal режим_журнал()
|
||||
|
||||
|
||||
## Вызывается при переходе в режим [b]ЭМС[/b]
|
||||
## Вызывается при переходе в режим [b]ЭМС[/b].
|
||||
signal режим_эмс()
|
||||
|
||||
|
||||
## Вызывается при переходе в режим [b]Настройка[/b]
|
||||
## Вызывается при переходе в режим [b]Настройка[/b].
|
||||
signal режим_настройки()
|
||||
|
||||
|
||||
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели и помехи[/b]
|
||||
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели и помехи[/b].
|
||||
signal full_auto()
|
||||
|
||||
|
||||
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели[/b]
|
||||
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора цели[/b].
|
||||
signal threat_auto()
|
||||
|
||||
|
||||
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора помехи[/b]
|
||||
## Вызывается, когда оператор переводит программу в режим [b]Автомат выбора помехи[/b].
|
||||
signal interfer_auto()
|
||||
|
||||
|
||||
## Вызывается, когда оператор переводит программу в режим [b]Ручной[/b]
|
||||
## Вызывается, когда оператор переводит программу в режим [b]Ручной[/b].
|
||||
signal manual_control()
|
||||
|
||||
|
||||
@@ -59,21 +59,21 @@ signal full_screen(id: int)
|
||||
|
||||
|
||||
## Вызывается, когда пользователь выбирает цель.[br]
|
||||
## [param th_id] - Отметка цели на экране
|
||||
## [param th_id] - Отметка цели на экране.
|
||||
signal rto_threat_sel (th_id: int)
|
||||
|
||||
|
||||
## Вызывается, когда пользователь нажимает на значёк цели.[br]
|
||||
## [param th_id] - Отметка цели на экране
|
||||
## [param th_id] - Отметка цели на экране.
|
||||
signal bip_pressed (th_id: int)
|
||||
|
||||
|
||||
## Вызывается, когда пользователь снимает выделение с цели.[br]
|
||||
## [param th_id] - Отметка цели на экране
|
||||
## [param th_id] - Отметка цели на экране.
|
||||
signal rto_threat_unsel (th_id: int)
|
||||
|
||||
|
||||
## Вызывается, когда пользователь снимает выделение со всех целей
|
||||
## Вызывается, когда пользователь снимает выделение со всех целей.
|
||||
signal rto_threat_unsel_all ()
|
||||
|
||||
|
||||
@@ -100,32 +100,32 @@ signal interfer_new (ecm: interfer.Interfer)
|
||||
signal interfer_off (ecm: interfer.Interfer, ecms: Dictionary, thrs: Dictionary)
|
||||
|
||||
|
||||
## Вызывается при нажатии отключить все помехи
|
||||
## Вызывается при нажатии отключить все помехи.
|
||||
signal interfer_off_all ()
|
||||
|
||||
|
||||
## Вызывается при получении внешнего целеуказания
|
||||
## Вызывается при получении внешнего целеуказания.
|
||||
## [param interfer_params] - Параметры полученной помехи от 5П-28.[br]
|
||||
signal interfer_rcv(interfer_params: Array)
|
||||
|
||||
|
||||
## Вызывается, когда отключается действующая помеха.[br]
|
||||
## [param ecm] - Выбранная помеха
|
||||
## [param ecm] - Выбранная помеха.
|
||||
signal interfer_selected (ecm: interfer.Interfer)
|
||||
|
||||
|
||||
## Вызывается, когда отключается выбираем помеху по сектору в таблице.[br]
|
||||
## [param ecm] - Выбранная помеха
|
||||
## [param ecm] - Выбранная помеха.
|
||||
signal fs_selected(ecm: interfer.Interfer)
|
||||
|
||||
|
||||
## Вызывается при запросе изменения уровня детализации карты.[br]
|
||||
## [param zoom] - Вновь установленный уровень детализации
|
||||
## [param zoom] - Вновь установленный уровень детализации.
|
||||
signal zoom_changed(zoom: int)
|
||||
|
||||
|
||||
## Вызывается при завершении изменения уровня детализации карты.[br]
|
||||
## [param zoom] - Вновь установленный уровень детализации
|
||||
## [param zoom] - Вновь установленный уровень детализации.
|
||||
signal zoom_complete(zoom: int)
|
||||
|
||||
|
||||
@@ -135,5 +135,5 @@ signal map_coords_changed(lan: float, lat: float)
|
||||
|
||||
|
||||
## Вызывается при изменении размера изображения для отображения карты.[br]
|
||||
## [param mode] - Вновь установленный режим
|
||||
## [param mode] - Вновь установленный режим.
|
||||
signal map_mode_changed(mode: int)
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
extends Node
|
||||
class_name tcp5_p28 extends Node
|
||||
|
||||
## Реализация "Протокол информационного сопряжения
|
||||
## СПО АСУ изделия «МП‑550» с СПО 5П-28"
|
||||
## Реализация "Протокол информационного сопряжения.
|
||||
## СПО АСУ изделия «МП‑550» с СПО 5П-28".
|
||||
|
||||
|
||||
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от 5П-28, мс
|
||||
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм
|
||||
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от 5П-28, мс.
|
||||
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм.
|
||||
|
||||
## Тип модуляции для запаковки в пакет для 5П-28
|
||||
## Тип модуляции для запаковки в пакет для 5П-28.
|
||||
const MOD_TYPES: Array = ['',
|
||||
'am',
|
||||
'ook',
|
||||
@@ -41,18 +41,18 @@ class TCP5P28:
|
||||
const CMD_TYPE_TH: int = 2
|
||||
const CMD_TYPE_IN: int = 3
|
||||
|
||||
signal line_changed(unit: TCP5P28) ## Сигнал состояние связи изменилось
|
||||
signal data_received(unit: TCP5P28) ## Сигнал данные приняты
|
||||
signal command_fail(unit: TCP5P28) ## Сигнал при не выполнении команды
|
||||
signal parse_error(unit: TCP5P28, msg: String) ## Сигнал ошибки разбора сообщения
|
||||
signal get_threats(unit: TCP5P28) ## Сигнал запрос целей
|
||||
signal get_interfers(unit: TCP5P28) ## Запрос состояния выполнения целеуказания
|
||||
signal line_changed(unit: TCP5P28) ## Сигнал состояние связи изменилось.
|
||||
signal data_received(unit: TCP5P28) ## Сигнал данные приняты.
|
||||
signal command_fail(unit: TCP5P28) ## Сигнал при не выполнении команды.
|
||||
signal parse_error(unit: TCP5P28, msg: String) ## Сигнал ошибки разбора сообщения.
|
||||
signal get_threats(unit: TCP5P28) ## Сигнал запрос целей.
|
||||
signal get_interfers(unit: TCP5P28) ## Запрос состояния выполнения целеуказания.
|
||||
|
||||
var online: = false ## Состояние связи с источником сообщений
|
||||
var name: String ## Имя экземпляра
|
||||
var rx_tick: = 0 ## Тик время последнего приёма, мс
|
||||
var tx_data: = PackedByteArray() ## Пакет для отправки
|
||||
var tx_stack: Array ## Массив пакетов для отправки
|
||||
var online: = false ## Состояние связи с источником сообщений.
|
||||
var name: String ## Имя экземпляра.
|
||||
var rx_tick: = 0 ## Тик время последнего приёма, мс.
|
||||
var tx_data: = PackedByteArray() ## Пакет для отправки.
|
||||
var tx_stack: Array ## Массив пакетов для отправки.
|
||||
|
||||
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||||
func _init(nm): self.name = nm
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
extends Node
|
||||
|
||||
## Работа с целями
|
||||
## Работа с целями.
|
||||
|
||||
|
||||
## Цель
|
||||
@@ -26,7 +26,7 @@ class Threat:
|
||||
var tick_rx: int ## Тик время обновления цели, мс.
|
||||
var tmod: String ## Тип модуляции.
|
||||
var width: float ## Ширина занимаемого диапазона частот, МГц.
|
||||
var selected: bool ## Флаг, что цель выбрана
|
||||
var selected: bool ## Флаг, что цель выбрана.
|
||||
|
||||
func _init(): clear_fflags()
|
||||
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]
|
||||
@@ -62,7 +62,7 @@ func _ready() -> void:
|
||||
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(threats))
|
||||
signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats))
|
||||
|
||||
## Периодически удаляет устаревшие цели
|
||||
## Периодически удаляет устаревшие цели.
|
||||
func on_timer_check_lost(time_lost: int, threats: Dictionary):
|
||||
var tick = Time.get_ticks_msec()
|
||||
var sz: = threats.size()
|
||||
@@ -74,7 +74,7 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary):
|
||||
call_deferred('emit_signal', 'threats_resized', threats)
|
||||
|
||||
|
||||
## отправляет словарь целей в юнит, для запаковки и отправки в 5П28
|
||||
## отправляет словарь целей в юнит, для запаковки и отправки в 5П28.
|
||||
func on_get_threats(unit, threats): unit.pack_threats(threats)
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ func on_get_threats(unit, threats): unit.pack_threats(threats)
|
||||
func on_rto_threat_unsel(th_id, threats): threats[th_id].selected = false
|
||||
|
||||
|
||||
## Снимает выделение со всех целей
|
||||
## Снимает выделение со всех целей.
|
||||
func on_rto_threat_unsel_all(threats):
|
||||
for th in threats.values():
|
||||
signaller.emit_signal('rto_threat_unsel', th.id)
|
||||
@@ -92,14 +92,14 @@ func on_rto_threat_unsel_all(threats):
|
||||
func on_rto_threat_sel(th_id, threats): on_threat_selected(threats[th_id], threats)
|
||||
|
||||
|
||||
## Выбирает цель, если выбрать в таблице
|
||||
## Выбирает цель, если выбрать в таблице.
|
||||
func on_threat_selected(th, threats):
|
||||
for threat in threats.values():
|
||||
threat.selected = false
|
||||
th.selected = true
|
||||
|
||||
|
||||
## Формирует список выбранных целей для включения помехи
|
||||
## Формирует список выбранных целей для включения помехи.
|
||||
func on_interfer_init(btn, fs_arr, threats):
|
||||
var sel_threats: Array = []
|
||||
for threat in threats.values():
|
||||
@@ -109,7 +109,7 @@ func on_interfer_init(btn, fs_arr, threats):
|
||||
signaller.emit_signal('interfer_create', btn, sel_threats, fs_arr)
|
||||
|
||||
|
||||
## Производит приём целей
|
||||
## Производит приём целей.
|
||||
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
|
||||
if not unit.json_dic.has('ts'): return
|
||||
if unit.json_dic['ts'] != 5: return
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
@tool
|
||||
extends Node
|
||||
class_name Tools extends Node
|
||||
|
||||
## Простые часто используемые функции
|
||||
## Простые часто используемые функции.
|
||||
|
||||
|
||||
## Возвращает округлённое значение [param v] с точностью [param a]
|
||||
## Возвращает округлённое значение [param v] с точностью [param a].
|
||||
func round_to(v: float, a: float) -> float: return snappedf(v, -a if v < 0 else a)
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ func radians(val: float): return (val * PI) / 180.0
|
||||
func ibytes_to_word(buf: PackedByteArray, i: int) -> int: return buf[i] + (buf[i + 1] * 256)
|
||||
|
||||
|
||||
## Возвращает расстояние от центра координат до точки
|
||||
## Возвращает расстояние от центра координат до точки.
|
||||
func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y)
|
||||
|
||||
|
||||
@@ -70,21 +70,21 @@ func get_string_slice(s_in: String, s_out: Array, i0: int, i1: int):
|
||||
s_out[0] += s_in[i]
|
||||
|
||||
|
||||
## Производит преобразование из декартовой в полярную систему координат
|
||||
## Производит преобразование из декартовой в полярную систему координат.
|
||||
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float):
|
||||
var r = ((freq - f0) / (f1 - f0)) * r1 + r0
|
||||
var aoa_rad = radians(aoa) - PI / 2.0
|
||||
return Vector2(cos(aoa_rad), sin(aoa_rad)) * r + pos0
|
||||
|
||||
|
||||
## Отсекает значение до заданного диапазона
|
||||
## Отсекает значение до заданного диапазона.
|
||||
func clip_value(val, val_min, val_max):
|
||||
if val < val_min: val = val_min
|
||||
if val > val_max: val = val_max
|
||||
return val
|
||||
|
||||
|
||||
## Возвращает массив с именами членов [param obj]
|
||||
## Возвращает массив с именами членов [param obj].
|
||||
func get_members_names(obj: Object) -> Array:
|
||||
var pl = obj.get_property_list()
|
||||
var names: = Array()
|
||||
@@ -92,7 +92,7 @@ func get_members_names(obj: Object) -> Array:
|
||||
return names
|
||||
|
||||
|
||||
## Проверяет, что заданный массив [param val] похож на ip-адрес
|
||||
## Проверяет, что заданный массив [param val] похож на ip-адрес.
|
||||
func is_array_ipaddr(val: Array):
|
||||
return (val.size() == 2) \
|
||||
and (val[0] is String) \
|
||||
@@ -111,7 +111,7 @@ func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2:
|
||||
return Vector2(ang + 360.0 * float(ang < 0.0), hypot(x1, y1))
|
||||
|
||||
|
||||
## Переводит значение val из диапазона a0...a1 в диапазон b0...b1
|
||||
## Переводит значение val из диапазона a0...a1 в диапазон b0...b1.
|
||||
func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
|
||||
return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0
|
||||
|
||||
@@ -131,7 +131,7 @@ func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
|
||||
return odd_nodes > 0
|
||||
|
||||
|
||||
## Записывает слово [param val] в элемент байтовго массива [param buf]
|
||||
## Записывает слово [param val] в элемент байтовго массива [param buf].
|
||||
## расположенный по индексу [param index] (младшее слово).[br]
|
||||
## [i]Следует использовать встроенные в[/i] [b]PackedByteArray[/b] [i]методы вместо этой функции.[/i]
|
||||
func set_wordi(buf: PackedByteArray, index: int, val: int) -> void:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
extends Node
|
||||
class_name yau_07 extends Node
|
||||
|
||||
## Протокол ячейки ЯУ-07
|
||||
## Протокол ячейки ЯУ-07.
|
||||
|
||||
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды
|
||||
const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды
|
||||
@@ -8,47 +8,47 @@ const RETRY_COUNT = 5 ## Количество повторных отпр
|
||||
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
|
||||
|
||||
|
||||
## Ячейка ЯУ-07
|
||||
## Ячейка ЯУ-07.
|
||||
class YaU07:
|
||||
|
||||
## Коды выполняемых команд
|
||||
## Коды выполняемых команд.
|
||||
enum CmdCode {
|
||||
READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07
|
||||
WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07
|
||||
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07
|
||||
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07
|
||||
READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07.
|
||||
WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07.
|
||||
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07.
|
||||
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07.
|
||||
}
|
||||
|
||||
## Состояние автомата выполнения команды
|
||||
## Состояние автомата выполнения команды.
|
||||
enum CmdState {
|
||||
UNCK, ## Номер команды не ининциирован
|
||||
SEND, ## Буфер готов для отправки
|
||||
WAIT, ## Ожидание выполнения
|
||||
DONE, ## Команда выполнена
|
||||
FAIL ## Команда не выполнена
|
||||
UNCK, ## Номер команды не ининциирован.
|
||||
SEND, ## Буфер готов для отправки.
|
||||
WAIT, ## Ожидание выполнения.
|
||||
DONE, ## Команда выполнена.
|
||||
FAIL ## Команда не выполнена.
|
||||
}
|
||||
|
||||
signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой
|
||||
signal command_done(unit: YaU07) ## Вызывается после выполнения команды
|
||||
signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена
|
||||
signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой.
|
||||
signal command_done(unit: YaU07) ## Вызывается после выполнения команды.
|
||||
signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена.
|
||||
signal parse_failed(unit: YaU07)
|
||||
|
||||
var name: = String()
|
||||
var cmd_num_rx: = 0 ## Номер команды принятый
|
||||
var cmd_num_tx: = 0 ## Номер команды переданный
|
||||
var cmd_state = CmdState.UNCK ## Состояние выполнения команды
|
||||
var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07
|
||||
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07
|
||||
var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду
|
||||
var tick = 0.0 ## Текущее тик-время в мс
|
||||
var cmd_tick_tx = 0.0 ## Время последней отправки команды
|
||||
var cmd_tick_rx = 0.0 ## Время последнего приёма команды
|
||||
var status: = PackedByteArray() ## Поле "состояние прибора"
|
||||
var tx_data: = PackedByteArray() ## Буфер отправленный
|
||||
var tx_len = 0 ## Длина последнего отправленного пакета
|
||||
var isa_ports = {} ## Результат выполнения команды "читать порт"
|
||||
var isa_block = {} ## Результат выполнения команды "читать массив из порта"
|
||||
var online = false ## Состояние связи с ячейкой
|
||||
var cmd_num_rx: = 0 ## Номер команды принятый.
|
||||
var cmd_num_tx: = 0 ## Номер команды переданный.
|
||||
var cmd_state = CmdState.UNCK ## Состояние выполнения команды.
|
||||
var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07.
|
||||
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07.
|
||||
var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду.
|
||||
var tick = 0.0 ## Текущее тик-время в мс.
|
||||
var cmd_tick_tx = 0.0 ## Время последней отправки команды.
|
||||
var cmd_tick_rx = 0.0 ## Время последнего приёма команды.
|
||||
var status: = PackedByteArray() ## Поле "состояние прибора".
|
||||
var tx_data: = PackedByteArray() ## Буфер отправленный.
|
||||
var tx_len = 0 ## Длина последнего отправленного пакета.
|
||||
var isa_ports = {} ## Результат выполнения команды "читать порт".
|
||||
var isa_block = {} ## Результат выполнения команды "читать массив из порта".
|
||||
var online = false ## Состояние связи с ячейкой.
|
||||
|
||||
func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||||
|
||||
@@ -134,9 +134,9 @@ class YaU07:
|
||||
tx_data.encode_u16(9, int(port[0]))
|
||||
cmd_state = CmdState.SEND
|
||||
return true
|
||||
## Возвращает код команды ЯУ-07
|
||||
## rx_data - Принятые данные
|
||||
## Возвращает - Код команды не найден, 0...255 - код команды
|
||||
## Возвращает код команды ЯУ-07.
|
||||
## rx_data - Принятые данные.
|
||||
## Возвращает - Код команды не найден, 0...255 - код команды.
|
||||
func get_cmd_code(rx_data: PackedByteArray):
|
||||
|
||||
var rx_data_len = rx_data.size()
|
||||
@@ -185,11 +185,11 @@ class YaU07:
|
||||
return true
|
||||
|
||||
|
||||
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07
|
||||
## для команд "читать порты" или "записать порты"[br]
|
||||
## [param rx_data] - Принятые данные[br]
|
||||
## Возвращает [b]true[/b] - Данные обработаны успешно[br]
|
||||
## Возвращает [b]false[/b] - Данные не обработаны из за ошибки[br]
|
||||
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07.
|
||||
## для команд "читать порты" или "записать порты".[br]
|
||||
## [param rx_data] - Принятые данные.[br]
|
||||
## Возвращает [b]true[/b] - Данные обработаны успешно.[br]
|
||||
## Возвращает [b]false[/b] - Данные не обработаны из за ошибки.[br]
|
||||
func parse(rx_data: PackedByteArray) -> bool:
|
||||
|
||||
cmd_tick_rx = tick
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
extends Node
|
||||
class_name yems_boards extends Node
|
||||
|
||||
class EmsBoard:
|
||||
var id_board: String
|
||||
var in_devs: Dictionary ## Словарь с входными устройствами
|
||||
var out_devs: Dictionary ## Словарь с выходными устройствами
|
||||
var base_addr_isa: int ## Базовый адрес ячейки isa
|
||||
var in_devs: Dictionary ## Словарь с входными устройствами.
|
||||
var out_devs: Dictionary ## Словарь с выходными устройствами.
|
||||
var base_addr_isa: int ## Базовый адрес ячейки isa.
|
||||
var in_tbl: Array
|
||||
var out_tbl: Array
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
extends Node
|
||||
class_name yerms_consts extends Node
|
||||
|
||||
##
|
||||
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
|
||||
const INPUT_ROWS1 = [
|
||||
[12,['283333 МР-231S, Строб ЭМС', 'X52', '0.00', '0.00']],
|
||||
[13,['29НРЛС МР-231-3, УИЗП', 'X54', '0.00', '0.00']],
|
||||
@@ -16,7 +16,7 @@ const INPUT_ROWS1 = [
|
||||
[38,['394302-01, 4302-04, УИЗП', 'X46', '0.00', '0.00']],
|
||||
[31,['40НРЛС МР-231S, УИЗП', 'X51', '0.00', '0.00']]]
|
||||
|
||||
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС
|
||||
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
|
||||
const OUTPUT_ROWS1 = [
|
||||
[41,['41НРЛС МР-231S, БИ', 'X61', '0.00', '0.00']],
|
||||
[42,['42НРЛС МР-231S', 'X62', '0.00', '0.00']],
|
||||
@@ -32,7 +32,7 @@ const OUTPUT_ROWS1 = [
|
||||
[66,['524302-01, 4302-04, БИ', 'X66', '0.00', '0.00']],
|
||||
[68,['53НРЛС 11111111', 'X69', '0.00', '0.00']]]
|
||||
|
||||
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС
|
||||
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
|
||||
const INPUT_ROWS = [
|
||||
[1,['УИЗП №1', 'Х7', '0.00', '0.00']],
|
||||
[2,['УИЗПФ №1', 'Х8', '0.00', '0.00']],
|
||||
@@ -93,7 +93,7 @@ const INPUT_ROWS = [
|
||||
[57,['СЗИ Е Лб','Х49 : 1', '0.00', '0.00']],
|
||||
[58,['СЗИ Е ПрБ','Х49 : 50', '0.00', '0.00']]]
|
||||
|
||||
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС
|
||||
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
|
||||
const OUTPUT_ROWS = [
|
||||
[11,['Бланк №1','Х6', '0.00', '0.00']],
|
||||
[12,['Бланк №2','Х9', '0.00', '0.00']],
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
extends Node
|
||||
class_name yems_dev extends Node
|
||||
|
||||
|
||||
class InDev:
|
||||
var id: int ## Идентификатор индекс устройства
|
||||
var dev_name: String ## Имя подключаемого комплекса
|
||||
var connector: String ## Номер разъёма в приборе
|
||||
var delay: float ## Задержка фронта импульса
|
||||
var offset: float ## Смещение фронта импульса
|
||||
var state: int ## Состояние входа
|
||||
var freq: int ## Предполагаемая частота на которой работает комплекс
|
||||
var ports_data: Dictionary ## Словарь состояния портов устройства
|
||||
var tbl_row_id: int ## Индекс устройства в таблице выходов
|
||||
var out_dots: Array ## Список выходных устройств в порядке, как в таблице и точки матрицы
|
||||
var connect_devs: Dictionary ## Список присоединённых устройств
|
||||
var board: String ## Плата в которой находится устройство
|
||||
var id: int ## Идентификатор индекс устройства.
|
||||
var dev_name: String ## Имя подключаемого комплекса.
|
||||
var connector: String ## Номер разъёма в приборе.
|
||||
var delay: float ## Задержка фронта импульса.
|
||||
var offset: float ## Смещение фронта импульса.
|
||||
var state: int ## Состояние входа.
|
||||
var freq: int ## Предполагаемая частота на которой работает комплекс.
|
||||
var ports_data: Dictionary ## Словарь состояния портов устройства.
|
||||
var tbl_row_id: int ## Индекс устройства в таблице выходов.
|
||||
var out_dots: Array ## Список выходных устройств в порядке, как в таблице и точки матрицы.
|
||||
var connect_devs: Dictionary ## Список присоединённых устройств.
|
||||
var board: String ## Плата в которой находится устройство.
|
||||
|
||||
func _init(dev_id : int, params : Array, row_id : int):
|
||||
id = dev_id
|
||||
@@ -25,7 +25,7 @@ class InDev:
|
||||
|
||||
|
||||
class OutDev extends InDev:
|
||||
var mode: String ## Режим работы выхода
|
||||
var mode: String ## Режим работы выхода.
|
||||
|
||||
func _init(dev_id : int, params : Array, row_id : int):
|
||||
id = dev_id
|
||||
|
||||
Reference in New Issue
Block a user