From 61977b002b12bc2b4b2a6e1fa7757a2bfdabdee2 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Mon, 30 Sep 2024 11:27:14 +0300 Subject: [PATCH 01/26] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D1=8B=20=D0=B2=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tabs-switch/tab-switch.gd | 6 +- scenes/tilemap/tilemap.gd | 240 ++++----- scenes/настройки/настройки.gd | 88 +++- scenes/настройки/настройки.tscn | 319 ++---------- scenes/эмс/эмс.gd | 446 ++++++++-------- scripts/mercator.gd | 852 +++++++++++++++---------------- scripts/repnetwork.gd | 236 ++++----- scripts/tcp5p28.gd | 330 ++++++------ table/table.gd | 714 +++++++++++++------------- 9 files changed, 1524 insertions(+), 1707 deletions(-) diff --git a/scenes/tabs-switch/tab-switch.gd b/scenes/tabs-switch/tab-switch.gd index d7715fe..31a8f96 100644 --- a/scenes/tabs-switch/tab-switch.gd +++ b/scenes/tabs-switch/tab-switch.gd @@ -4,9 +4,9 @@ const TAB_TOSIGNAL_NAME = {0: 'режим_работа', 1: 'режим_конт func _enter_tree() -> void: - repnetwork.logger_page = $Журнал + repnetwork.logger_page = $Журнал func _on_tab_changed(tab) -> void: - if TAB_TOSIGNAL_NAME.has(tab): - signaller.emit_signal(TAB_TOSIGNAL_NAME[tab]) + if TAB_TOSIGNAL_NAME.has(tab): + signaller.emit_signal(TAB_TOSIGNAL_NAME[tab]) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 4bd9c6d..4bf67e4 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -2,41 +2,41 @@ class_name main_tilemap extends Sprite2D ## Возможные состояния конечного автомата заданий. enum TASK_STATE { - DONE, ## Выполнено. - WAIT, ## Ожидание плитки. - RUN, ## Запуск выполнения. - CHECK, ## Проверка пустого места. - ERROR ## Ошибка. + DONE, ## Выполнено. + WAIT, ## Ожидание плитки. + RUN, ## Запуск выполнения. + CHECK, ## Проверка пустого места. + ERROR ## Ошибка. } ## Координаты для проверок [lng, lat]. const TEST_DATA: = { - 'Калиниград': [ 20.51095, 54.70649 ], - 'Москва': [ 37.6156, 55.7522 ], - 'Нью-Йорк': [ -74.006, 40.7143 ], - 'Сидней': [ 151.20732, -33.8678500 ], - 'Таганрог': [ 38.8969, 47.2362 ], - 'Хельсинки': [ 24.9354, 60.1695 ], - 'Азорские о-ва': [ 28.3996582, 38.5397568 ], - 'Мехико': [ -99.12766, 19.42847 ], - 'Белое море': [ 68.136606, 42.045546 ], - 'море Беллинсгаузена': [ -72.406587, -74.857997 ], - 'Фиджи': [ 178.065032, -17.713371 ], - 'Ноль': [ 0.0, 0.0 ], - 'Точка1': [ 170.0, 0.0 ], - 'Точка2': [-170.0, 0.0 ], - 'Море' : [ 19.4, 54.91 ] } + 'Калиниград': [ 20.51095, 54.70649 ], + 'Москва': [ 37.6156, 55.7522 ], + 'Нью-Йорк': [ -74.006, 40.7143 ], + 'Сидней': [ 151.20732, -33.8678500 ], + 'Таганрог': [ 38.8969, 47.2362 ], + 'Хельсинки': [ 24.9354, 60.1695 ], + 'Азорские о-ва': [ 28.3996582, 38.5397568 ], + 'Мехико': [ -99.12766, 19.42847 ], + 'Белое море': [ 68.136606, 42.045546 ], + 'море Беллинсгаузена': [ -72.406587, -74.857997 ], + 'Фиджи': [ 178.065032, -17.713371 ], + 'Ноль': [ 0.0, 0.0 ], + 'Точка1': [ 170.0, 0.0 ], + 'Точка2': [-170.0, 0.0 ], + 'Море' : [ 19.4, 54.91 ] } const MAP_MODES: = { - 0: 'application/config/map_image_size_rto', - 1: 'application/config/map_image_size_rls' } + 0: 'application/config/map_image_size_rto', + 1: 'application/config/map_image_size_rls' } const MAP_RELATIVE_RADIUSES: = { - 0: 0.39, - 1: 0.466 + 0: 0.39, + 1: 0.466 } @@ -53,122 +53,122 @@ var map_mode: int ## Режим карты: 0 - приорите var prev_tiles_dic: Dictionary ## var lnglat: Array ## Текущие координаты. var root_rect: Rect2i - + func _ready(): - lnglat = TEST_DATA['Таганрог'] - map_tile_state = TASK_STATE.DONE - map_request = HTTPRequest.new() - add_child(map_request) - map_request.request_completed.connect(self._map_request_completed) - map_bcs = ProjectSettings.get_setting('application/config/map_bcs', Vector3(1.0, 1.0, 1.0)) - map_server_addr = ProjectSettings.get_setting('application/config/map_server_addr') - map_tile_format = ProjectSettings.get_setting('application/config/map_tile_format', '%s/%d/%d/%d.png') - var map_image_size = ProjectSettings.get_setting(MAP_MODES[0], Vector2i(512, 512)) - var map_tile_size = ProjectSettings.get_setting('application/config/map_tile_size', 256) - map_image = Image.create(map_image_size.x, map_image_size.y, true, Image.FORMAT_RGB8) - map_tile = Rect2i(0, 0, map_tile_size, map_tile_size) - signaller.connect('zoom_changed', Callable(self, '_on_zoom_changed')) - signaller.connect('map_mode_changed', Callable(self, '_on_map_mode_changed')) - log.info('Адрес сервера поставщика карт: \"%s\"' % map_server_addr) - log.info('Модуль географической карты готов') + lnglat = TEST_DATA['Таганрог'] + map_tile_state = TASK_STATE.DONE + map_request = HTTPRequest.new() + add_child(map_request) + map_request.request_completed.connect(self._map_request_completed) + map_bcs = ProjectSettings.get_setting('application/config/map_bcs', Vector3(1.0, 1.0, 1.0)) + map_server_addr = ProjectSettings.get_setting('application/config/map_server_addr') + map_tile_format = ProjectSettings.get_setting('application/config/map_tile_format', '%s/%d/%d/%d.png') + var map_image_size = ProjectSettings.get_setting(MAP_MODES[0], Vector2i(512, 512)) + var map_tile_size = ProjectSettings.get_setting('application/config/map_tile_size', 256) + map_image = Image.create(map_image_size.x, map_image_size.y, true, Image.FORMAT_RGB8) + map_tile = Rect2i(0, 0, map_tile_size, map_tile_size) + signaller.connect('zoom_changed', Callable(self, '_on_zoom_changed')) + signaller.connect('map_mode_changed', Callable(self, '_on_map_mode_changed')) + log.info('Адрес сервера поставщика карт: \"%s\"' % map_server_addr) + 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]) - map_image.fill(Color(0, 0, 0, 0)) - map_image.resize(map_image_size.x, map_image_size.y) - map_tile_state = TASK_STATE.DONE - map_mode = mode - var tile: = mercator.create_tile(lnglat[0], lnglat[1], map_zoom) - map_tile_stack.clear() - map_tile_stack.append(tile) - prev_tiles_dic.clear() + var map_image_size = ProjectSettings.get_setting(MAP_MODES[mode]) + material.set('shader_parameter/radius', MAP_RELATIVE_RADIUSES[mode]) + map_image.fill(Color(0, 0, 0, 0)) + map_image.resize(map_image_size.x, map_image_size.y) + map_tile_state = TASK_STATE.DONE + map_mode = mode + var tile: = mercator.create_tile(lnglat[0], lnglat[1], map_zoom) + map_tile_stack.clear() + map_tile_stack.append(tile) + prev_tiles_dic.clear() func mark_image_center(image: Image, color: Color = Color.RED): - var c = image.get_size() / 2 - map_image.set_pixel(c.x - 1, c.y - 1, color) - map_image.set_pixel(c.x - 1, c.y, color) - map_image.set_pixel(c.x, c.y - 1, color) - map_image.set_pixel(c.x, c.y, color) + var c = image.get_size() / 2 + map_image.set_pixel(c.x - 1, c.y - 1, color) + map_image.set_pixel(c.x - 1, c.y, color) + map_image.set_pixel(c.x, c.y - 1, color) + map_image.set_pixel(c.x, c.y, color) func _on_zoom_changed(zoom: int): - if map_tile_stack.size() != 0: - return - map_zoom = zoom - var tile: = mercator.create_tile(lnglat[0], lnglat[1], zoom) - map_tile_stack.clear() - map_tile_stack.append(tile) - prev_tiles_dic.clear() + if map_tile_stack.size() != 0: + return + map_zoom = zoom + var tile: = mercator.create_tile(lnglat[0], lnglat[1], zoom) + map_tile_stack.clear() + map_tile_stack.append(tile) + prev_tiles_dic.clear() func img_tile_to_map_image(image: Image, dst_pos: Vector2i): - image.adjust_bcs(map_bcs.x, map_bcs.y, map_bcs.z) - map_image.blit_rect(image, map_tile, dst_pos) + image.adjust_bcs(map_bcs.x, map_bcs.y, map_bcs.z) + map_image.blit_rect(image, map_tile, dst_pos) func _process(_delta: float): - if (map_tile_state == TASK_STATE.DONE) and map_tile_stack.size(): - var tile: mercator.Tile = map_tile_stack[-1] - var tile_addr: = map_tile_format % [map_server_addr, tile.z, tile.x , tile.y] - var rc = map_request.request(tile_addr) - if rc == OK: - map_tile_state = TASK_STATE.WAIT - else: - log.error('%s: Невозможно сформировать запрос HTTP' % self) - map_tile_state = TASK_STATE.ERROR - elif map_tile_state == TASK_STATE.CHECK: - var root_tile: = mercator.Tile.new(root_rect.size.x, root_rect.size.y, map_zoom) - var neighbors_tiles = mercator.get_perimetr_tiles(root_tile, (map_image.get_size().x / map_tile.size.x) / 2) - var neighbors_tiles_dic = {} - for tile in neighbors_tiles: - neighbors_tiles_dic[[tile.x, tile.y]] = false - if neighbors_tiles_dic != prev_tiles_dic: - for tile in neighbors_tiles: - tile.is_root = false - map_tile_stack.push_front(tile) - prev_tiles_dic[[tile.x, tile.y]] = false - else: - if map_tile_stack.size() == 0: - signaller.emit_signal('zoom_complete', map_zoom) - map_tile_state = TASK_STATE.DONE + if (map_tile_state == TASK_STATE.DONE) and map_tile_stack.size(): + var tile: mercator.Tile = map_tile_stack[-1] + var tile_addr: = map_tile_format % [map_server_addr, tile.z, tile.x , tile.y] + var rc = map_request.request(tile_addr) + if rc == OK: + map_tile_state = TASK_STATE.WAIT + else: + log.error('%s: Невозможно сформировать запрос HTTP' % self) + map_tile_state = TASK_STATE.ERROR + elif map_tile_state == TASK_STATE.CHECK: + var root_tile: = mercator.Tile.new(root_rect.size.x, root_rect.size.y, map_zoom) + var neighbors_tiles = mercator.get_perimetr_tiles(root_tile, (map_image.get_size().x / map_tile.size.x) / 2) + var neighbors_tiles_dic = {} + for tile in neighbors_tiles: + neighbors_tiles_dic[[tile.x, tile.y]] = false + if neighbors_tiles_dic != prev_tiles_dic: + for tile in neighbors_tiles: + tile.is_root = false + map_tile_stack.push_front(tile) + prev_tiles_dic[[tile.x, tile.y]] = false + else: + if map_tile_stack.size() == 0: + signaller.emit_signal('zoom_complete', map_zoom) + map_tile_state = TASK_STATE.DONE func _map_request_completed(result, response_code, headers, data): - if result != HTTPRequest.RESULT_SUCCESS: - log.error('%s: Запрос не обработан. result: \"%s\", response_code: \"%s\", headers: \"%s\"' % [self, result, response_code, headers]) - map_tile_state = TASK_STATE.ERROR - return + if result != HTTPRequest.RESULT_SUCCESS: + log.error('%s: Запрос не обработан. result: \"%s\", response_code: \"%s\", headers: \"%s\"' % [self, result, response_code, headers]) + map_tile_state = TASK_STATE.ERROR + return - var img_tile = Image.new() - var error = img_tile.load_png_from_buffer(data) - if error != OK: - log.error('%s: Полученые данные невозможно использовать для формироания изображения. result: \"%s\", response_code: \"%s\", headers: \"%s\"' % [self, result, response_code, headers]) - map_tile_state = TASK_STATE.ERROR - return + var img_tile = Image.new() + var error = img_tile.load_png_from_buffer(data) + if error != OK: + log.error('%s: Полученые данные невозможно использовать для формироания изображения. result: \"%s\", response_code: \"%s\", headers: \"%s\"' % [self, result, response_code, headers]) + map_tile_state = TASK_STATE.ERROR + return - var tile = map_tile_stack.pop_back() - map_tile_state = TASK_STATE.CHECK + var tile = map_tile_stack.pop_back() + map_tile_state = TASK_STATE.CHECK - if tile.is_root: - # Отображение корневой плитки - map_image.fill(Color(0, 0, 0, 0)) - var bounds: = mercator.bounds(tile) - var lng_c = (bounds.east + bounds.west) / 2.0 - var lat_c = (bounds.north + bounds.south) / 2.0 - var sx: float = float(map_tile.size.x) / (bounds.east - bounds.west) * (lng_c - tile.lng) + map_tile.size.x / 2.0 # Cмещение в пискселях центра плитки от заданной точки по горизонтали. - var sy: float = float(map_tile.size.y) / (bounds.north - bounds.south) * (lat_c - tile.lat) - map_tile.size.y / 2.0 # Cмещение в пискселях центра плитки от заданной точки по вертикали. - var dst_pos: Vector2i = Vector2i(int(sx), int(-sy)) + map_tile.size * map_mode - img_tile_to_map_image(img_tile, dst_pos) - root_rect = Rect2i(dst_pos.x, dst_pos.y, tile.x, tile.y) - else: - # Отображение соседних плиток - var delta: = Vector2i(tile.x - root_rect.size.x, tile.y - root_rect.size.y) - var dst_pos: Vector2i = root_rect.position + delta * map_tile.size - img_tile_to_map_image(img_tile, dst_pos) - mark_image_center(map_image) - texture = ImageTexture.create_from_image(map_image) - + if tile.is_root: + # Отображение корневой плитки + map_image.fill(Color(0, 0, 0, 0)) + var bounds: = mercator.bounds(tile) + var lng_c = (bounds.east + bounds.west) / 2.0 + var lat_c = (bounds.north + bounds.south) / 2.0 + var sx: float = float(map_tile.size.x) / (bounds.east - bounds.west) * (lng_c - tile.lng) + map_tile.size.x / 2.0 # Cмещение в пискселях центра плитки от заданной точки по горизонтали. + var sy: float = float(map_tile.size.y) / (bounds.north - bounds.south) * (lat_c - tile.lat) - map_tile.size.y / 2.0 # Cмещение в пискселях центра плитки от заданной точки по вертикали. + var dst_pos: Vector2i = Vector2i(int(sx), int(-sy)) + map_tile.size * map_mode + img_tile_to_map_image(img_tile, dst_pos) + root_rect = Rect2i(dst_pos.x, dst_pos.y, tile.x, tile.y) + else: + # Отображение соседних плиток + var delta: = Vector2i(tile.x - root_rect.size.x, tile.y - root_rect.size.y) + var dst_pos: Vector2i = root_rect.position + delta * map_tile.size + img_tile_to_map_image(img_tile, dst_pos) + mark_image_center(map_image) + texture = ImageTexture.create_from_image(map_image) + diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index c7f05b0..0928f0f 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -1,18 +1,82 @@ class_name setting extends Panel +var TableHeader = preload('res://table/header.tscn') +var TableLabel = preload('res://table/lable.tscn') +var TableTaggle = preload('res://table/taggle.tscn') +var TableEdit = preload('res://table/editl.tscn') +var TableEmpti = preload('res://table/empti.tscn') + ## Вызывается, когда узел впервые попадает в дерево сцены. func _ready() -> void: - $lbl_commit.text = 'Текущая версия ПО УАРЭП: \"%s\"' % commit.VCS_HEAD - if not OS.get_cmdline_args().has('++ограниченный'): - return - $Label2.text = 'Текущий режим доступа: ограниченный' - for node in $GridContainer.get_children().filter(func(b): return b is Button): - node.disabled = true - - + setting_tab() + dop_set_tab() + set_tab() + $lbl_commit.text = ' \"%s\"' % commit.VCS_HEAD + if not OS.get_cmdline_args().has('++ограниченный'): + return + $Label2.text = 'Текущий режим доступа: ограниченный' + for node in $GridContainer.get_children().filter(func(b): return b is Button): + node.disabled = true + + func _on_external_cu_btn_pressed() -> void: - var state = $GridContainer2/external_cu_btn.button_pressed - ProjectSettings.set_setting('application/config/external_cu', state) - if state: - signaller.emit_signal('interfer_off_all') + var state = $GridContainer2/external_cu_btn.button_pressed + ProjectSettings.set_setting('application/config/external_cu', state) + if state: + signaller.emit_signal('interfer_off_all') + + +func setting_tab(): + var yams: Array = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER ] + $table.set_header([TableHeader, TableHeader]) + $table.set_header_text(['Элемент', ' Показывать ']) + + for i in range(15): + $table.add_row([TableLabel, TableTaggle]) + + $table.set_row_text(0,([' Кнопка «ПД-М4» '])) + $table.set_row_text(1,([' Кнопка «ПД-М2» '])) + $table.set_row_text(2,([' Кнопка «ОЗП-1» '])) + $table.set_row_text(3,([' Кнопка «МЧМ-1» '])) + $table.set_row_text(4,([' Кнопка «ОРН-И1» '])) + $table.set_row_text(5,([' Кнопка «ОРН-М2» '])) + $table.set_row_text(6,([' Кнопка «ЛЧМ-1» '])) + $table.set_row_text(7,([' Кнопка «ПД-М4С» '])) + $table.set_row_text(8,([' Кнопка «ПД-ЧМ» '])) + $table.set_row_text(9,([' Кнопка «СВ-И1» '])) + $table.set_row_text(10,([' Кнопка «К1» '])) + $table.set_row_text(11,([' Кнопка «СВ-М2» '])) + $table.set_row_text(12,([' Кнопка «ОРН» '])) + $table.set_row_text(13,([' Кнопка «JTIDS» '])) + $table.set_row_text(14,([' Кнопка «КУПД» '])) + + $table.set_columns_min_size([150, 100]) + $table.set_columns_alignments(yams) + + +func dop_set_tab(): + var yams: Array = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER ] + $table2.add_row([TableLabel, TableEmpti]) + $table2.add_row([TableLabel, TableEmpti]) + $table2.add_row([TableLabel, TableTaggle]) + $table2.add_row([TableLabel, TableTaggle]) + + $table2.set_row_text(0, (['Текущая версия ПО УАРЭП:'])) + $table2.set_row_text(1, (['Адрес сервера карт:'])) + $table2.set_row_text(2, (['Внешнее целеуказание.'])) + $table2.set_row_text(3, (['Кнопка «Подавление».\nОтключить отображение этой кнопки,\nчто бы тип помех применялся сразу.'])) + + + $table2.set_columns_min_size([180, 50]) + $table2.set_columns_alignments(yams) + +func set_tab(): + $table3.add_row([TableLabel, TableEmpti]) + $table3.add_row([TableLabel, TableEmpti]) + + $table3.set_row_text(0, ([' Текущий режим доступа: полный '])) + $table3.set_row_text(1, ([' Управление элементами в режиме с ограниченным доступом '])) + + $table3.set_columns_min_size([250, 5]) + diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index a5f0eec..bd25653 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=3 format=3 uid="uid://bnptm4rlp60dq"] +[gd_scene load_steps=4 format=3 uid="uid://bnptm4rlp60dq"] [ext_resource type="Script" path="res://scenes/настройки/настройки.gd" id="1_2l3rd"] +[ext_resource type="Script" path="res://table/table.gd" id="2_ts42i"] [sub_resource type="GDScript" id="GDScript_anjmx"] script/source = "extends LineEdit @@ -16,295 +17,47 @@ func _on_text_changed(new_text: String) -> void: [node name="Настройки" type="Panel"] script = ExtResource("1_2l3rd") -[node name="GridContainer" type="GridContainer" parent="."] -layout_mode = 0 -offset_left = 44.0 -offset_top = 87.0 -offset_right = 336.0 -offset_bottom = 193.0 +[node name="table" type="GridContainer" parent="."] +layout_mode = 2 +offset_left = 32.0 +offset_top = 96.0 +offset_right = 241.0 +offset_bottom = 535.0 columns = 2 - -[node name="Label" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Элемент" -vertical_alignment = 1 - -[node name="Label2" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Показывать" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="Label4" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «ПД-M4»" -vertical_alignment = 1 - -[node name="CheckButton" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label5" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «ПД-M2»" -vertical_alignment = 1 - -[node name="CheckButton3" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label6" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «ОЗП-1»" -vertical_alignment = 1 - -[node name="CheckButton5" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label7" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «МЧМ-1»" -vertical_alignment = 1 - -[node name="CheckButton6" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label8" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «СРН-И1»" -vertical_alignment = 1 - -[node name="CheckButton7" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label9" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «СРН-М2»" -vertical_alignment = 1 - -[node name="CheckButton8" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label10" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «ЛЧМ-1»" -vertical_alignment = 1 - -[node name="CheckButton9" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label11" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «ПД-М4С»" -vertical_alignment = 1 - -[node name="CheckButton10" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label12" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «ПД-ЧМ»" -vertical_alignment = 1 - -[node name="CheckButton11" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label13" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «СВ-И1»" -vertical_alignment = 1 - -[node name="CheckButton12" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label14" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «К1»" -vertical_alignment = 1 - -[node name="CheckButton13" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label15" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «СВ-М2»" -vertical_alignment = 1 - -[node name="CheckButton14" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label16" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «СРН»" -vertical_alignment = 1 - -[node name="CheckButton15" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label17" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «JTIDS»" -vertical_alignment = 1 - -[node name="CheckButton16" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label18" type="Label" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «КУПД»" -vertical_alignment = 1 - -[node name="CheckButton17" type="CheckButton" parent="GridContainer"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - -[node name="Label1" type="Label" parent="."] -layout_mode = 0 -offset_left = 16.0 -offset_top = 60.0 -offset_right = 434.0 -offset_bottom = 82.0 -text = "Управление элементами в режиме с ограниченным доступом" - -[node name="Label2" type="Label" parent="."] -layout_mode = 0 -offset_left = 16.0 -offset_top = 20.0 -offset_right = 476.0 -offset_bottom = 50.0 -text = "Текущий режим доступа: полный" -vertical_alignment = 1 +script = ExtResource("2_ts42i") [node name="edt_mapaddr" type="LineEdit" parent="."] -layout_mode = 0 -offset_left = 660.0 -offset_top = 80.0 -offset_right = 1032.0 -offset_bottom = 110.0 +layout_mode = 2 +offset_left = 560.0 +offset_top = 144.0 +offset_right = 896.0 +offset_bottom = 171.0 +theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) script = SubResource("GDScript_anjmx") -[node name="Label" type="Label" parent="edt_mapaddr"] -layout_mode = 0 -offset_left = -180.0 -offset_right = -20.0 -offset_bottom = 30.0 -text = "Адрес сервера карт:" -vertical_alignment = 1 - -[node name="GridContainer2" type="GridContainer" parent="."] -layout_mode = 0 -offset_left = 478.0 -offset_top = 154.0 -offset_right = 784.0 -offset_bottom = 260.0 -columns = 2 - -[node name="external_cu_lbl" type="Label" parent="GridContainer2"] -layout_mode = 2 -text = "Внешнее целеуказание." -vertical_alignment = 1 - -[node name="external_cu_btn" type="CheckButton" parent="GridContainer2"] -layout_mode = 2 - -[node name="Label19" type="Label" parent="GridContainer2"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Кнопка «Подавление». -Отключить отображение этой кнопки, -что бы тип помех применялся сразу." - -[node name="CheckButton18" type="CheckButton" parent="GridContainer2"] -layout_mode = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -button_pressed = true - [node name="lbl_commit" type="Label" parent="."] layout_mode = 0 -offset_left = 480.0 -offset_top = 20.0 -offset_right = 1040.0 -offset_bottom = 50.0 -text = "Текущая версия ПО УАРЭП:" +offset_left = 560.0 +offset_top = 112.0 +offset_right = 1120.0 +offset_bottom = 142.0 +theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) vertical_alignment = 1 +[node name="table2" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 296.0 +offset_top = 120.0 +offset_right = 880.0 +offset_bottom = 408.0 +script = ExtResource("2_ts42i") + +[node name="table3" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 24.0 +offset_top = 24.0 +offset_right = 440.0 +offset_bottom = 80.0 +script = ExtResource("2_ts42i") + [connection signal="text_changed" from="edt_mapaddr" to="edt_mapaddr" method="_on_text_changed"] -[connection signal="pressed" from="GridContainer2/external_cu_btn" to="." method="_on_external_cu_btn_pressed"] diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index 6b948e9..f05680d 100644 --- a/scenes/эмс/эмс.gd +++ b/scenes/эмс/эмс.gd @@ -24,253 +24,253 @@ var posy: int = 70 ## Позиция элементов по y. func _ready() -> void: - call_deferred('init_boards') + call_deferred('init_boards') ## Инициализация основных элементов экрана ЭМС. func init_boards(): - # Выставление позиций элементов ЭМС на экране - $scrollin.set_position(Vector2(posx,posy)) - $scrollout.set_position(Vector2(posx+650,posy)) - $scrl_in_set.set_position(Vector2(posx,posy + 700)) - $scrl_out_set.set_position(Vector2(posx+650,posy + 700)) - $lbl_online.set_position(Vector2(posx,posy-60)) - $btn_flash_read.set_position(Vector2(posx,posy + 900)) - $btn_flash_write.set_position(Vector2(posx,posy+ 935)) - $btn_connect.set_position(Vector2(posx+590,posy-25)) - $btn_disconnect.set_position(Vector2(posx+587,posy + 675)) + # Выставление позиций элементов ЭМС на экране + $scrollin.set_position(Vector2(posx,posy)) + $scrollout.set_position(Vector2(posx+650,posy)) + $scrl_in_set.set_position(Vector2(posx,posy + 700)) + $scrl_out_set.set_position(Vector2(posx+650,posy + 700)) + $lbl_online.set_position(Vector2(posx,posy-60)) + $btn_flash_read.set_position(Vector2(posx,posy + 900)) + $btn_flash_write.set_position(Vector2(posx,posy+ 935)) + $btn_connect.set_position(Vector2(posx+590,posy-25)) + $btn_disconnect.set_position(Vector2(posx+587,posy + 675)) - g_boards['КЭМС'] = yemsboards.EmsBoard.new('КЭМС', 0x130, yemsconsts.INPUT_ROWS, yemsconsts.OUTPUT_ROWS) - g_boards['П5-28'] = yemsboards.EmsBoard.new('П5-28', 0x140, yemsconsts.INPUT_ROWS1, yemsconsts.OUTPUT_ROWS1) - init_tbl_in() - $scrollin/tbl_in.pin_header($scrollin, self) - init_tbl_out() - $scrollout/tbl_out.pin_header($scrollout, self) - $scrl_in_set/tbl_in_set.pin_header($scrl_in_set, self) - $scrl_out_set/tbl_out_set.pin_header($scrl_out_set, self) - init_tbl_files() - $scrl_files/tbl_files.pin_header($scrl_files, self) - $btn_connect.connect('pressed', Callable(self, 'on_btn_connect')) - $btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect')) - $btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read)) - $btn_flash_write.button_connect('pressed', Callable(self, 'on_btn_flash_write').bind($btn_flash_write)) + g_boards['КЭМС'] = yemsboards.EmsBoard.new('КЭМС', 0x130, yemsconsts.INPUT_ROWS, yemsconsts.OUTPUT_ROWS) + g_boards['П5-28'] = yemsboards.EmsBoard.new('П5-28', 0x140, yemsconsts.INPUT_ROWS1, yemsconsts.OUTPUT_ROWS1) + init_tbl_in() + $scrollin/tbl_in.pin_header($scrollin, self) + init_tbl_out() + $scrollout/tbl_out.pin_header($scrollout, self) + $scrl_in_set/tbl_in_set.pin_header($scrl_in_set, self) + $scrl_out_set/tbl_out_set.pin_header($scrl_out_set, self) + init_tbl_files() + $scrl_files/tbl_files.pin_header($scrl_files, self) + $btn_connect.connect('pressed', Callable(self, 'on_btn_connect')) + $btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect')) + $btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read)) + $btn_flash_write.button_connect('pressed', Callable(self, 'on_btn_flash_write').bind($btn_flash_write)) ## Обработчик нажатия кнопки disconnect. func on_btn_disconnect(): - var selected_rows_in: Array = [] - var selected_rows_out: Array = [] - $scrl_in_set/tbl_in_set.get_selected_rows(selected_rows_in) - $scrl_out_set/tbl_out_set.get_selected_rows(selected_rows_out) - if len(selected_rows_in): - on_disconnect($scrl_in_set/tbl_in_set, selected_rows_in, 'вход') - elif len(selected_rows_out): - on_disconnect($scrl_out_set/tbl_out_set, selected_rows_out, 'выход') + var selected_rows_in: Array = [] + var selected_rows_out: Array = [] + $scrl_in_set/tbl_in_set.get_selected_rows(selected_rows_in) + $scrl_out_set/tbl_out_set.get_selected_rows(selected_rows_out) + if len(selected_rows_in): + on_disconnect($scrl_in_set/tbl_in_set, selected_rows_in, 'вход') + elif len(selected_rows_out): + on_disconnect($scrl_out_set/tbl_out_set, selected_rows_out, 'выход') ## Разрывает связь входа и выхода, [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]) - var con_dev = user_data[0] - var connector: String = con_dev.connector - dev.connect_devs.erase(con_dev.connector) - con_dev.connect_devs.erase(dev.connector) - if type_dev == 'вход': - set_in_dev(dev) - set_out_dev(con_dev) - elif type_dev == 'выход': - set_in_dev(con_dev) - set_out_dev(dev) + var dev = tbl.get_node_user_data(0, 0) + var user_data: Array = tbl.get_node_user_data(0, selected_rows[0]) + var con_dev = user_data[0] + var connector: String = con_dev.connector + dev.connect_devs.erase(con_dev.connector) + con_dev.connect_devs.erase(dev.connector) + if type_dev == 'вход': + set_in_dev(dev) + set_out_dev(con_dev) + elif type_dev == 'выход': + set_in_dev(con_dev) + set_out_dev(dev) ## Обработчик нажатия кнопки "Прочитать". func on_btn_flash_read(btn): - await get_tree().create_timer(0.1).timeout - btn.pressed = false + 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 + 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]) + $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] - var header_text: Array = ['Входы', 'Соединитель', 'мкс', 'мкс', 'Состояние'] - var row_type: Array = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState] - var yams_alligment_in: Array = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] - var column_size: Array = [250, 100, 70, 70, 50] - $scrollin/tbl_in.set_header(header_type) - $scrollin/tbl_in.set_header_text(header_text) - for board in g_boards: - for item in g_boards[board].in_tbl: - $scrollin/tbl_in.add_row(row_type) - var row_index : int = $scrollin/tbl_in.get_rows_count() - 1 - var params : Array = item[1] - var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, row_index) - in_dev.board = board - for i in range(len(row_type)): - if i < len(params): - var node = $scrollin/tbl_in.get_node2(i, row_index) - node.text = params[i] - node.editable = false - $scrollin/tbl_in.set_node_user_data(i, row_index, [in_dev, board]) - $scrollin/tbl_in.set_columns_alignments(yams_alligment_in) - $scrollin/tbl_in.set_columns_min_size(column_size) - $scrollin/tbl_in.connect('row_pressed', Callable(self, 'on_row_pressed_in')) - $scrollin/tbl_in.connect('selected_changed', Callable(self, 'on_selected_changed_in')) + # Инициализация основной таблицы входов, в ней отображается информация о параметрах и состоянии + var header_type: Array = [TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader] + var header_text: Array = ['Входы', 'Соединитель', 'мкс', 'мкс', 'Состояние'] + var row_type: Array = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState] + var yams_alligment_in: Array = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] + var column_size: Array = [250, 100, 70, 70, 50] + $scrollin/tbl_in.set_header(header_type) + $scrollin/tbl_in.set_header_text(header_text) + for board in g_boards: + for item in g_boards[board].in_tbl: + $scrollin/tbl_in.add_row(row_type) + var row_index : int = $scrollin/tbl_in.get_rows_count() - 1 + var params : Array = item[1] + var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, row_index) + in_dev.board = board + for i in range(len(row_type)): + if i < len(params): + var node = $scrollin/tbl_in.get_node2(i, row_index) + node.text = params[i] + node.editable = false + $scrollin/tbl_in.set_node_user_data(i, row_index, [in_dev, board]) + $scrollin/tbl_in.set_columns_alignments(yams_alligment_in) + $scrollin/tbl_in.set_columns_min_size(column_size) + $scrollin/tbl_in.connect('row_pressed', Callable(self, 'on_row_pressed_in')) + $scrollin/tbl_in.connect('selected_changed', Callable(self, 'on_selected_changed_in')) - # Инициализация таблицы изменения параметров входа и списка выходов связанных с ним - header_text[0] = 'Вход' - $scrl_in_set/tbl_in_set.set_header(header_type) - $scrl_in_set/tbl_in_set.set_header_text(header_text) - $scrl_in_set/tbl_in_set.set_columns_alignments(yams_alligment_in) - $scrl_in_set/tbl_in_set.set_columns_min_size(column_size) - $scrl_in_set/tbl_in_set.connect('row_pressed', Callable(self, 'on_row_pressed_si')) - $scrl_in_set/tbl_in_set.connect('selected_changed', Callable(self, 'on_selected_changed_si')) + # Инициализация таблицы изменения параметров входа и списка выходов связанных с ним + header_text[0] = 'Вход' + $scrl_in_set/tbl_in_set.set_header(header_type) + $scrl_in_set/tbl_in_set.set_header_text(header_text) + $scrl_in_set/tbl_in_set.set_columns_alignments(yams_alligment_in) + $scrl_in_set/tbl_in_set.set_columns_min_size(column_size) + $scrl_in_set/tbl_in_set.connect('row_pressed', Callable(self, 'on_row_pressed_si')) + $scrl_in_set/tbl_in_set.connect('selected_changed', Callable(self, 'on_selected_changed_si')) ## Обработчик редактирования Entry в таблице параметров входов/выходов. func on_edit_entry(text : String, entry): - print_debug(text, 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) - var user_data = $scrollin/tbl_in.get_node_user_data(0, i_row) - var dev = user_data[0] - set_in_dev(dev) + var selecter_rows: Array = [] + $scrollin/tbl_in.get_selected_rows(selecter_rows) + var user_data = $scrollin/tbl_in.get_node_user_data(0, i_row) + var dev = user_data[0] + 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) + 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]) + 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 - var out_user_data = $scrl_in_set/tbl_in_set.get_node_user_data(0, i_row) - var dev = out_user_data[0] - var connector = dev.connector - for i in range($scrollout/tbl_out.get_rows_count()): - var node = $scrollout/tbl_out.get_node2(1, i) - if connector == node.text: - on_row_pressed_out(i) + if i_row < 2: + return + var out_user_data = $scrl_in_set/tbl_in_set.get_node_user_data(0, i_row) + var dev = out_user_data[0] + var connector = dev.connector + for i in range($scrollout/tbl_out.get_rows_count()): + var node = $scrollout/tbl_out.get_node2(1, i) + if connector == node.text: + on_row_pressed_out(i) ## Обработчик нажатия на таблицу соединений входа и изменения параметров. func on_row_pressed_si(i_row: int): - if i_row < 2: - return - on_row_pressed(i_row, $scrl_in_set/tbl_in_set) - on_selected_changed_si(i_row) + if i_row < 2: + return + on_row_pressed(i_row, $scrl_in_set/tbl_in_set) + on_selected_changed_si(i_row) ## Инициализация таблиц выходов. func init_tbl_out(): - # Инициализация основной таблицы выходов, в ней отображается информация о параметрах и состоянии - var header_text = ['Выходы', 'Соединитель', 'мкс', 'мкс', 'Состояние', 'Режим'] - var yams_alligment_out: Array = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] - $scrollout/tbl_out.set_header([TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader, TableHeader]) - $scrollout/tbl_out.set_header_text(header_text) - for board in g_boards: - for item in g_boards[board].out_tbl: - $scrollout/tbl_out.add_row([CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState, CellLineEdit]) - var row_index : int = $scrollout/tbl_out.get_rows_count() - 1 - var params : Array = item[1] - var out_dev = yemsdevs.OutDev.new(item[0], params, row_index) - out_dev.board = board - for i in range(len(header_text)): - var cell = $scrollout/tbl_out.get_node2(i, row_index) - if i < len(params): - cell.text = params[i] - cell.editable = false - $scrollout/tbl_out.set_node_user_data(i, row_index, [out_dev, board]) - if i in COLUMN_OPTS_BTN: - cell.text = out_dev.mode - $scrollout/tbl_out.set_columns_min_size([250, 100, 70, 70, 70, 100]) - $scrollout/tbl_out.set_columns_alignments(yams_alligment_out) - $scrollout/tbl_out.connect('row_pressed', Callable(self, 'on_row_pressed_out')) - $scrollout/tbl_out.connect('selected_changed', Callable(self, 'on_selected_changed_out')) + # Инициализация основной таблицы выходов, в ней отображается информация о параметрах и состоянии + var header_text = ['Выходы', 'Соединитель', 'мкс', 'мкс', 'Состояние', 'Режим'] + var yams_alligment_out: Array = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] + $scrollout/tbl_out.set_header([TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader, TableHeader]) + $scrollout/tbl_out.set_header_text(header_text) + for board in g_boards: + for item in g_boards[board].out_tbl: + $scrollout/tbl_out.add_row([CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState, CellLineEdit]) + var row_index : int = $scrollout/tbl_out.get_rows_count() - 1 + var params : Array = item[1] + var out_dev = yemsdevs.OutDev.new(item[0], params, row_index) + out_dev.board = board + for i in range(len(header_text)): + var cell = $scrollout/tbl_out.get_node2(i, row_index) + if i < len(params): + cell.text = params[i] + cell.editable = false + $scrollout/tbl_out.set_node_user_data(i, row_index, [out_dev, board]) + if i in COLUMN_OPTS_BTN: + cell.text = out_dev.mode + $scrollout/tbl_out.set_columns_min_size([250, 100, 70, 70, 70, 100]) + $scrollout/tbl_out.set_columns_alignments(yams_alligment_out) + $scrollout/tbl_out.connect('row_pressed', Callable(self, 'on_row_pressed_out')) + $scrollout/tbl_out.connect('selected_changed', Callable(self, 'on_selected_changed_out')) - # Инициализация таблицы изменения параметров выхода и списка входов связанных с ним - header_text[0] = 'Выход' - $scrl_out_set/tbl_out_set.set_header([TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader, TableHeader]) - $scrl_out_set/tbl_out_set.set_header_text(header_text) - $scrl_out_set/tbl_out_set.set_columns_min_size([250, 100, 70, 70, 70, 100]) - $scrl_out_set/tbl_out_set.connect('row_pressed', Callable(self, 'on_row_pressed_so')) - $scrl_out_set/tbl_out_set.connect('selected_changed', Callable(self, 'on_selected_changed_so')) + # Инициализация таблицы изменения параметров выхода и списка входов связанных с ним + header_text[0] = 'Выход' + $scrl_out_set/tbl_out_set.set_header([TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader, TableHeader]) + $scrl_out_set/tbl_out_set.set_header_text(header_text) + $scrl_out_set/tbl_out_set.set_columns_min_size([250, 100, 70, 70, 70, 100]) + $scrl_out_set/tbl_out_set.connect('row_pressed', Callable(self, 'on_row_pressed_so')) + $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 - var in_user_data = $scrl_out_set/tbl_out_set.get_node_user_data(0, i_row) - var dev = in_user_data[0] - var connector = dev.connector - for i in range($scrollin/tbl_in.get_rows_count()): - var node = $scrollin/tbl_in.get_node2(1, i) - if connector == node.text: - on_row_pressed_in(i) + if i_row < 2: + return + var in_user_data = $scrl_out_set/tbl_out_set.get_node_user_data(0, i_row) + var dev = in_user_data[0] + var connector = dev.connector + for i in range($scrollin/tbl_in.get_rows_count()): + var node = $scrollin/tbl_in.get_node2(1, i) + if connector == node.text: + on_row_pressed_in(i) ## Обработчик нажатия на таблицу соединений выхода и изменения параметров. func on_row_pressed_so(i_row: int): - if i_row < 2: - return - on_row_pressed(i_row, $scrl_out_set/tbl_out_set) - on_selected_changed_so(i_row) + if i_row < 2: + return + on_row_pressed(i_row, $scrl_out_set/tbl_out_set) + 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) - var user_data = $scrollout/tbl_out.get_node_user_data(0, i_row) - var dev = user_data[0] - set_out_dev(dev) + var selecter_rows: Array = [] + $scrollout/tbl_out.get_selected_rows(selecter_rows) + var user_data = $scrollout/tbl_out.get_node_user_data(0, i_row) + var dev = user_data[0] + 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) + 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]) - var mode = $scrl_out_set/tbl_out_set.get_node2(5, 0) - for opt in OUT_MODE: - mode.add_item(opt) - var mode_index: int = OUT_MODE.find(dev.mode) - if mode_index != -1: - mode.select(mode_index) + 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]) + var mode = $scrl_out_set/tbl_out_set.get_node2(5, 0) + for opt in OUT_MODE: + mode.add_item(opt) + var mode_index: int = OUT_MODE.find(dev.mode) + if mode_index != -1: + mode.select(mode_index) ## Выбор входного или выходного устройства.[br] @@ -280,53 +280,53 @@ func set_out_dev(dev): ## [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) - tbl.set_columns_min_size(row_size) - var le_name: LineEdit = tbl.get_node2(0, 0) - le_name.editable = false - le_name.text = dev.dev_name - var connector: LineEdit = tbl.get_node2(1, 0) - connector.editable = false - connector.text = dev.connector - var delay: LineEdit = tbl.get_node2(2, 0) - delay.text = '%4.2f'%dev.delay - var offset: LineEdit = tbl.get_node2(3, 0) - offset.text = '%4.2f'%dev.offset - var state = tbl.get_node2(4, 0) - state.set_frame(dev.state) - tbl.add_row(row_type_conn) - var lbl: LineEdit = tbl.get_node2(0, 1) - lbl.text = lbl_text - for i in len(row_type_conn): - var le: LineEdit = tbl.get_node2(i, 1) - tbl.set_node_user_data(i, 0, dev) - le.editable = false + tbl.clear_rows() + tbl.add_row(row_type) + tbl.set_columns_min_size(row_size) + var le_name: LineEdit = tbl.get_node2(0, 0) + le_name.editable = false + le_name.text = dev.dev_name + var connector: LineEdit = tbl.get_node2(1, 0) + connector.editable = false + connector.text = dev.connector + var delay: LineEdit = tbl.get_node2(2, 0) + delay.text = '%4.2f'%dev.delay + var offset: LineEdit = tbl.get_node2(3, 0) + offset.text = '%4.2f'%dev.offset + var state = tbl.get_node2(4, 0) + state.set_frame(dev.state) + tbl.add_row(row_type_conn) + var lbl: LineEdit = tbl.get_node2(0, 1) + lbl.text = lbl_text + for i in len(row_type_conn): + var le: LineEdit = tbl.get_node2(i, 1) + tbl.set_node_user_data(i, 0, dev) + le.editable = false - for i in dev.connect_devs: - var dev_con = dev.connect_devs[i][0] - tbl.add_row(row_type_conn) - var node_index: Array = [0, tbl.get_rows_count() -1] - var le_name_out: LineEdit = tbl.get_node2(node_index[0], node_index[1]) - disable_edit(tbl, len(row_type_conn), node_index[1]) - le_name_out.text = dev_con.dev_name - tbl.set_node_user_data(node_index[0], node_index[1], dev.connect_devs[i]) - tbl.connect_columns(self, 'text_submitted', 'on_edit_entry', TABLE_ENTRY_COLUMNS, []) + for i in dev.connect_devs: + var dev_con = dev.connect_devs[i][0] + tbl.add_row(row_type_conn) + var node_index: Array = [0, tbl.get_rows_count() -1] + var le_name_out: LineEdit = tbl.get_node2(node_index[0], node_index[1]) + disable_edit(tbl, len(row_type_conn), node_index[1]) + le_name_out.text = dev_con.dev_name + tbl.set_node_user_data(node_index[0], node_index[1], dev.connect_devs[i]) + tbl.connect_columns(self, 'text_submitted', 'on_edit_entry', TABLE_ENTRY_COLUMNS, []) ## Обработчик нажатия кнопки connect. func on_btn_connect(): - var in_row_index: Array = [] - var out_row_index: Array = [] - $scrollin/tbl_in.get_selected_rows(in_row_index) - $scrollout/tbl_out.get_selected_rows(out_row_index) - if len(in_row_index) and len(out_row_index): - var in_user_data = $scrollin/tbl_in.get_node_user_data(0, in_row_index[0]) - var out_user_data = $scrollout/tbl_out.get_node_user_data(0, out_row_index[0]) - var in_dev = in_user_data[0] - var out_dev = out_user_data[0] - add_connection_dev($scrl_out_set/tbl_out_set, in_dev, out_dev, OUT_SET_ROW, in_user_data) - add_connection_dev($scrl_in_set/tbl_in_set, out_dev, in_dev, IN_SET_ROW, out_user_data) + var in_row_index: Array = [] + var out_row_index: Array = [] + $scrollin/tbl_in.get_selected_rows(in_row_index) + $scrollout/tbl_out.get_selected_rows(out_row_index) + if len(in_row_index) and len(out_row_index): + var in_user_data = $scrollin/tbl_in.get_node_user_data(0, in_row_index[0]) + var out_user_data = $scrollout/tbl_out.get_node_user_data(0, out_row_index[0]) + var in_dev = in_user_data[0] + var out_dev = out_user_data[0] + add_connection_dev($scrl_out_set/tbl_out_set, in_dev, out_dev, OUT_SET_ROW, in_user_data) + add_connection_dev($scrl_in_set/tbl_in_set, out_dev, in_dev, IN_SET_ROW, out_user_data) ## Образовывает связь между выбранным входом и выходом.[br] @@ -336,14 +336,14 @@ func on_btn_connect(): ## [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) - var node_index: Array = [0, tbl.get_rows_count() -1] - var le_name: LineEdit = tbl.get_node2(node_index[0], node_index[1]) - le_name.text = dev1.connector - disable_edit(tbl, len(set_row), node_index[1]) - tbl.set_node_user_data(node_index[0], node_index[1], user_data) - dev2.connect_devs[dev1.connector] = user_data + if not dev1.connector in dev2.connect_devs: + tbl.add_row(set_row) + var node_index: Array = [0, tbl.get_rows_count() -1] + var le_name: LineEdit = tbl.get_node2(node_index[0], node_index[1]) + le_name.text = dev1.connector + disable_edit(tbl, len(set_row), node_index[1]) + tbl.set_node_user_data(node_index[0], node_index[1], user_data) + dev2.connect_devs[dev1.connector] = user_data ## Отключает возможность редактирования LineEdit в таблице.[br] @@ -351,14 +351,14 @@ func add_connection_dev(tbl, dev1, dev2, set_row, user_data): ## [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 + 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) - tbl.set_row_selected(i_row, not is_row_selected) + tbl.clear_rows_selected() + var is_row_selected = tbl.is_row_selected(i_row) + tbl.set_row_selected(i_row, not is_row_selected) diff --git a/scripts/mercator.gd b/scripts/mercator.gd index 9a496d6..5511486 100644 --- a/scripts/mercator.gd +++ b/scripts/mercator.gd @@ -17,92 +17,92 @@ const MAX_SOUTH = -85.051129 ## 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 x: int + var y: int + var z: int + var lng: float ## Координаты, которые плитка должна покрывать, долгота, градусы. + var lat: float ## Широта, градусы. + var is_root: bool ## Признак, что плитка корневая (покрывает координаты). - func as_array(): return [self.x, self.y, self.z] + func as_array(): return [self.x, self.y, self.z] - func _to_string() -> String: return '[%d, %d, %d]' % [self.x, self.y, self.z] + func _to_string() -> String: return '[%d, %d, %d]' % [self.x, self.y, self.z] - func _init(x0: int = 0, y0: int = 0, z0: int = 0, is_root0: bool = true): - x = x0 - y = y0 - z = z0 - is_root = is_root0 + func _init(x0: int = 0, y0: int = 0, z0: int = 0, is_root0: bool = true): + x = x0 + y = y0 + z = z0 + is_root = is_root0 - func is_valid() -> bool: - if (z >= 0) and (z < MAX_ZOOM): - var mz: int = 2 ** z - return (x >= 0) and (x < mz) \ - and (y >= 0) and (y < mz) - return false + func is_valid() -> bool: + if (z >= 0) and (z < MAX_ZOOM): + var mz: int = 2 ** z + return (x >= 0) and (x < mz) \ + and (y >= 0) and (y < mz) + return false - func _bound_index(index: int) -> int: - var mi: int = 2 ** z - if index < 0: - index *= -1 - index %= mi - index = mi - index - else: - index %= mi - return index + func _bound_index(index: int) -> int: + var mi: int = 2 ** z + if index < 0: + index *= -1 + index %= mi + index = mi - index + else: + index %= mi + return index - func fix_xy(): - x = _bound_index(x) - y = _bound_index(y) + func fix_xy(): + x = _bound_index(x) + y = _bound_index(y) ## Пара долготы и широты. class LngLat: - var lng: float = 0.0 ## Долгота в десятичных градусах восточной долготы. - var lat: float = 0.0 ## Широта в десятичных градусах северной широты. + var lng: float = 0.0 ## Долгота в десятичных градусах восточной долготы. + var lat: float = 0.0 ## Широта в десятичных градусах северной широты. - ## Возвращает в виде массива. - func as_array() -> Array: return [self.lng, self.lat] + ## Возвращает в виде массива. + func as_array() -> Array: return [self.lng, self.lat] - func _to_string() -> String: return '[%f, %f, %f]' % [self.x, self.y, self.z] + func _to_string() -> String: return '[%f, %f, %f]' % [self.x, self.y, self.z] - func _init(lng0, lat0): - self.lng = lng0 - self.lat = lat0 + func _init(lng0, lat0): + self.lng = lng0 + self.lat = lat0 ## Географические границы. Хранит значения границ в десятичных градусах. class LngLatBbox: - var west: float ## Запад - var south: float ## Юг - var east: float ## Восток - var north: float ## Север + var west: float ## Запад + var south: float ## Юг + var east: float ## Восток + var north: float ## Север - ## Возвращает в виде массива. - func as_array() -> Array: return [self.west, self.south, self.east, self.north] + ## Возвращает в виде массива. + func as_array() -> Array: return [self.west, self.south, self.east, self.north] - func _to_string() -> String: return '[%f, %f, %f, %f]' % [self.west, self.south, self.east, self.north] + func _to_string() -> String: return '[%f, %f, %f, %f]' % [self.west, self.south, self.east, self.north] - func _init(w: float = 0.0, s: float = 0.0, e: float = 0.0, n: float = 0.0): - self.west = w - self.south = s - self.east = e - self.north = n + func _init(w: float = 0.0, s: float = 0.0, e: float = 0.0, n: float = 0.0): + self.west = w + self.south = s + self.east = e + self.north = n ## Граничная область веб-меркатора. Хранит значения границ в метрах. class Bbox: - var left: float - var bottom: float - var right: float - var top: float - func as_array() -> Array: return [self.left, self.bottom, self.right, self.top] - func _init(l: float = 0.0, b: float = 0.0, r: float = 0.0, t: float = 0.0): - self.left = l - self.bottom = b - self.right = r - self.top = t + var left: float + var bottom: float + var right: float + var top: float + func as_array() -> Array: return [self.left, self.bottom, self.right, self.top] + func _init(l: float = 0.0, b: float = 0.0, r: float = 0.0, t: float = 0.0): + self.left = l + self.bottom = b + self.right = r + self.top = t func degrees(v: float) -> float: return (v * 180.0) / PI @@ -121,47 +121,47 @@ func asinh(val: float): return log(val + sqrt(val * val + 1.0)) ## Преобразует [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) - var lonrad: float = radians(lng) - var coslat: float = cos(latrad) - var sinlat: float = sin(latrad) - var coslon: float = cos(lonrad) - var sinlon: float = sin(lonrad) - var term1: float = (RE * coslat) / tools.hypot(RE * coslat, RP * sinlat) - var term2: float = alt * coslat + term1; - var x: float = coslon * term2 - var y: float = sinlon * term2 - var z: float = alt * sinlat + (RP * sinlat) / tools.hypot(RE * coslat, RP * sinlat) - return [x, y, z] + alt += (RE + RP) / 2.0 + var latrad: float = radians(lat) + var lonrad: float = radians(lng) + var coslat: float = cos(latrad) + var sinlat: float = sin(latrad) + var coslon: float = cos(lonrad) + var sinlon: float = sin(lonrad) + var term1: float = (RE * coslat) / tools.hypot(RE * coslat, RP * sinlat) + var term2: float = alt * coslat + term1; + var x: float = coslon * term2 + var y: float = sinlon * term2 + var z: float = alt * sinlat + (RP * sinlat) / tools.hypot(RE * coslat, RP * sinlat) + return [x, y, z] func find_up_left(tiles: Array): - var x = 0 - var y = 0 - for tile in tiles: - if x < tile.x: x = tile.x - if y < tile.y: y = tile.y - for tile in tiles: - if tile.x == x and tile.y == y: - return tile - return null + var x = 0 + var y = 0 + for tile in tiles: + if x < tile.x: x = tile.x + if y < tile.y: y = tile.y + for tile in tiles: + if tile.x == x and tile.y == y: + return tile + return null ## [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) - var ytile: = int((1.0 - asinh(tan(radians(lat))) / PI) / 2.0 * n) - return [xtile, ytile] + var n: = float(1 << zoom) + var xtile: = int((lng + 180.0) / 360.0 * n) + var ytile: = int((1.0 - asinh(tan(radians(lat))) / PI) / 2.0 * n) + return [xtile, ytile] ## Номера плитки для [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 - var lat: = atan(sinh(PI * (1.0 - 2.0 * float(y) / n))) - return [lng, degrees(lat)] + var n: = float(1 << zoom) + var lng: = float(x) / n * 360.0 - 180.0 + var lat: = atan(sinh(PI * (1.0 - 2.0 * float(y) / n))) + return [lng, degrees(lat)] ## Расстояние по горизонтали в метрах, представленное одним пикселем. @@ -169,14 +169,14 @@ func num2deg(x: int, y: int, zoom: int): ## [param zoom] - Уровень детализации.[br] ## [param size] - Размер плитки в пикселях.[br] func dist_per_pixel(lat: float, zoom: int, size: int = 256) -> float: - return (CE / float(size)) * cos(radians(lat)) / float(2 ** zoom) + return (CE / float(size)) * cos(radians(lat)) / float(2 ** zoom) ## Расстояние по горизонтали в метрах, представленное одной плиткой. ## [param lat] - Широта, градусы.[br] ## [param zoom] - Уровень детализации.[br] func dist_per_tile(lat: float, zoom: int) -> float: - return CE * cos(radians(lat)) / float(2 ** zoom) + return CE * cos(radians(lat)) / float(2 ** zoom) ## Возвращает плитки и занимаемый ими размер области в пикселях: @@ -188,21 +188,21 @@ func dist_per_tile(lat: float, zoom: int) -> float: ## [param size] - Размер плитки в пикселях.[br] ## [param zoom] - Детализация.[br] func get_tiles(west: float, south: float, east: float, north: float, zoom: int, size: int) -> Array: - var tiles: = create_tiles(west, south, east, north, zoom) + var tiles: = create_tiles(west, south, east, north, zoom) - var mm = [] - for t in tiles: mm.append(t.x) - var min_x = mm.min() - var max_x = mm.max() + var mm = [] + for t in tiles: mm.append(t.x) + var min_x = mm.min() + var max_x = mm.max() - mm.clear() - for t in tiles: mm.append(t.y) - var min_y = mm.min() - var max_y = mm.max() + mm.clear() + for t in tiles: mm.append(t.y) + var min_y = mm.min() + var max_y = mm.max() - var w = size * (max_x - min_x + 1) - var h = size * (max_y - min_y + 1) - return [w, h, min_x, min_y, tiles, max_x - min_x + 1] + var w = size * (max_x - min_x + 1) + var h = size * (max_y - min_y + 1) + return [w, h, min_x, min_y, tiles, max_x - min_x + 1] ## Возвращает размер области в метрах.[br] @@ -211,9 +211,9 @@ func get_tiles(west: float, south: float, east: float, north: float, zoom: int, ## [param south] - Южная граница области.[br] ## [param north] - Северная граница области.[br] func get_size_from_degrees(west: float, south: float, east: float, north: float) -> Array[float]: - var xy0: = xy(west, north, true) - var xy1: = xy(east, south, true) - return [xy0[0] - xy1[0], xy0[1] - xy1[1]] + var xy0: = xy(west, north, true) + var xy1: = xy(east, south, true) + return [xy0[0] - xy1[0], xy0[1] - xy1[1]] ## Возвращает границы области в градусах.[br] @@ -221,27 +221,27 @@ func get_size_from_degrees(west: float, south: float, east: float, north: float) ## [param lng] - Долгота центра области в градусах (-180...180).[br] ## [param lat] - Широта центра области в градусах (-90...90).[br] func get_degrees_bounds(m: float, lng: float, lat: float) -> Array[float]: - m /= 2.0 - var x_y = xy(lng, lat, true) - return [x_y[0] - m, x_y[1] - m, x_y[0] + m, x_y[1] + m] + m /= 2.0 + var x_y = xy(lng, lat, true) + 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) - var mmw = mm.min(); mm.clear() + var mm = [] + for t in tiles: mm.append(bounds(t).west) + var mmw = mm.min(); mm.clear() - for t in tiles: mm.append(bounds(t).south) - var mms = mm.min(); mm.clear() + for t in tiles: mm.append(bounds(t).south) + var mms = mm.min(); mm.clear() - for t in tiles: mm.append(bounds(t).east) - var mme = mm.max(); mm.clear() + for t in tiles: mm.append(bounds(t).east) + var mme = mm.max(); mm.clear() - for t in tiles: mm.append(bounds(t).north) - var mmn = mm.max(); mm.clear() + for t in tiles: mm.append(bounds(t).north) + var mmn = mm.max(); mm.clear() - return [mmw, mms, mme, mmn] + return [mmw, mms, mme, mmn] ## Возвращает левую верхнюю долготу и широту плитки.[br] @@ -253,11 +253,11 @@ func get_tiles_bounds(tiles: Array[Tile]) -> Array: ## LngLat(lng=0.0, lat=0.0) ## [/codeblock] func ul(tile: Tile, zoom: int) -> LngLat: - var Z2 = pow(2, zoom) - var lon_deg = tile.x / Z2 * 360.0 - 180.0 - var lat_rad = atan(sinh(PI * (1 - 2 * tile.y / Z2))) - var lat_deg = degrees(lat_rad) - return LngLat.new(lon_deg, lat_deg) + var Z2 = pow(2, zoom) + var lon_deg = tile.x / Z2 * 360.0 - 180.0 + var lat_rad = atan(sinh(PI * (1 - 2 * tile.y / Z2))) + var lat_deg = degrees(lat_rad) + return LngLat.new(lon_deg, lat_deg) ## Возвращает левую верхнюю долготу и широту плитки.[br] @@ -269,32 +269,32 @@ func ul(tile: Tile, zoom: int) -> LngLat: ## LngLat(lng=0.0, lat=0.0) ## [/codeblock] func ul2(tile: Tile) -> Array[float]: - var z2 = pow(2, tile.z) - var lon_deg = tile.x / z2 * 360.0 - 180.0 - var lat_rad = atan(sinh(PI * (1 - 2 * tile.y / z2))) - var lat_deg = degrees(lat_rad) - return [lon_deg, lat_deg] + var z2 = pow(2, tile.z) + var lon_deg = tile.x / z2 * 360.0 - 180.0 + var lat_rad = atan(sinh(PI * (1 - 2 * tile.y / z2))) + var lat_deg = degrees(lat_rad) + return [lon_deg, lat_deg] ## Возвращает граничную область плитки.[br] ## [param tile] - Плитка.[br] func bounds(tile: Tile) -> LngLatBbox: - var z2: = pow(2, tile.z) - var ul_lon_deg = float(tile.x) / z2 * 360.0 - 180.0 - var lr_lon_deg = (float(tile.x) + 1.0) / z2 * 360.0 - 180.0 - var ul_lat_rad = atan(sinh(PI * (1.0 - 2.0 * float(tile.y) / z2))) - var ul_lat_deg = degrees(ul_lat_rad) - var lr_lat_rad = atan(sinh(PI * (1.0 - 2.0 * (float(tile.y) + 1.0) / z2))) - var lr_lat_deg = degrees(lr_lat_rad) - return LngLatBbox.new(ul_lon_deg, lr_lat_deg, lr_lon_deg, ul_lat_deg) + var z2: = pow(2, tile.z) + var ul_lon_deg = float(tile.x) / z2 * 360.0 - 180.0 + var lr_lon_deg = (float(tile.x) + 1.0) / z2 * 360.0 - 180.0 + var ul_lat_rad = atan(sinh(PI * (1.0 - 2.0 * float(tile.y) / z2))) + var ul_lat_deg = degrees(ul_lat_rad) + var lr_lat_rad = atan(sinh(PI * (1.0 - 2.0 * (float(tile.y) + 1.0) / z2))) + var lr_lat_deg = degrees(lr_lat_rad) + return LngLatBbox.new(ul_lon_deg, lr_lat_deg, lr_lon_deg, ul_lat_deg) func truncate_lnglat(lng: float, lat: float) -> Array: - if lng > 180.0: lng = 180.0 - elif lng < -180.0: lng = -180.0 - if lat > 90.0: lat = 90.0 - elif lat < -90.0: lat = -90.0 - return [lng, lat] + if lng > 180.0: lng = 180.0 + elif lng < -180.0: lng = -180.0 + if lat > 90.0: lat = 90.0 + elif lat < -90.0: lat = -90.0 + return [lng, lat] ## Преобразование долготы и широты в веб-меркатор x, y в метрах.[br] @@ -303,23 +303,23 @@ func truncate_lnglat(lng: float, lat: float) -> Array: ## [param truncate] - Нужно ли усекать входные данные до пределов веб-меркатора.[br] ## ([param lat] >= 90) [b]inf[/b] на северном и [b]-inf[/b] на южном полюсе ([param lat] <= -90). func xy(lng: float, lat: float, truncate: bool = false) -> Array[float]: - var ll = truncate_lnglat(lng, lat) if truncate else [lng, lat] - var x: float = RE * radians(lng) - var y: float = 0.0 - if ll[1] <= -90.0: y = float('-inf') - elif ll[1] >= 90.0: y = float('inf') - else: y = RE * log(tan((PI * 0.25) + (0.5 * radians(lat)))) - return [x, y] + var ll = truncate_lnglat(lng, lat) if truncate else [lng, lat] + var x: float = RE * radians(lng) + var y: float = 0.0 + if ll[1] <= -90.0: y = float('-inf') + elif ll[1] >= 90.0: y = float('inf') + else: y = RE * log(tan((PI * 0.25) + (0.5 * radians(lat)))) + return [x, y] ## Преобразование координат веб-меркатора x, y в долготу и широту.[br] ## [param x], [param y] - Координаты веб-меркатора в метрах.[br] ## [param truncate] - Нужно ли усекать или обрезать входные данные до границ веб-меркатора. func lnglat(x: float, y: float, truncate: bool = false) -> LngLat: - var lng: = x * R2D / RE - var lat: = ((PI * 0.5) - 2.0 * atan(exp(-y / RE))) * R2D - var ll: = truncate_lnglat(lng, lat) if truncate else [lng, lat] - return LngLat.new(ll[0], ll[1]) + var lng: = x * R2D / RE + var lat: = ((PI * 0.5) - 2.0 * atan(exp(-y / RE))) * R2D + var ll: = truncate_lnglat(lng, lat) if truncate else [lng, lat] + return LngLat.new(ll[0], ll[1]) ## Соседи плитки. [method neighbors] возвращает до восьми.[br] @@ -332,65 +332,65 @@ func lnglat(x: float, y: float, truncate: bool = false) -> LngLat: ## [Tile(x=485, y=331, z=10), Tile(x=485, y=332, z=10), Tile(x=485, y=333, z=10), Tile(x=486, y=331, z=10), Tile(x=486, y=333, z=10), Tile(x=487, y=331, z=10), Tile(x=487, y=332, z=10), Tile(x=487, y=333, z=10)] ## [/codeblock] func neighbors(tile: Tile) -> Array: - var tiles: = [] - for i in [-1, 0, 1]: - for j in [-1, 0, 1]: - if i == 0 and j == 0: - continue - var t = Tile.new(tile.x + i, tile.y + j, tile.z) - t.fix_xy() - tiles.append(t) - return tiles + var tiles: = [] + for i in [-1, 0, 1]: + for j in [-1, 0, 1]: + if i == 0 and j == 0: + continue + var t = Tile.new(tile.x + i, tile.y + j, tile.z) + t.fix_xy() + tiles.append(t) + return tiles ## Возвращает все плитки в радиусе [param r] вокруг заданной плитки [param tile]. func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array: - var xys = {} - var mi: int = 2 ** tile.z - for r in mr: - for a in range(0, 360, 180 / mi): - var ra = radians(a) - var ix = roundi(r * cos(ra)) + tile.x - var iy = roundi(r * sin(ra)) + tile.y - var t = Tile.new(ix, iy, tile.z) - t.fix_xy() - xys[[t.x, t.y]] = false - var tiles = [] - for txy in xys.keys(): - tiles.append(Tile.new(txy[0], txy[1], tile.z)) - return tiles + var xys = {} + var mi: int = 2 ** tile.z + for r in mr: + for a in range(0, 360, 180 / mi): + var ra = radians(a) + var ix = roundi(r * cos(ra)) + tile.x + var iy = roundi(r * sin(ra)) + tile.y + var t = Tile.new(ix, iy, tile.z) + t.fix_xy() + xys[[t.x, t.y]] = false + var tiles = [] + for txy in xys.keys(): + tiles.append(Tile.new(txy[0], txy[1], tile.z)) + return tiles ## Возвращает все плитки по периметру заданной плитки. func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array: - var tiles = [] - for i in range(-mr, mr + 1): - for j in range(-mr, mr + 1): - if i == 0 and j == 0: continue - var t = Tile.new(i + tile.x, j + tile.y, tile.z) - t.fix_xy() - tiles.append(t) - return tiles + var tiles = [] + for i in range(-mr, mr + 1): + for j in range(-mr, mr + 1): + if i == 0 and j == 0: continue + var t = Tile.new(i + tile.x, j + tile.y, tile.z) + t.fix_xy() + tiles.append(t) + return tiles ## Получение меркаторской граничной рамки веб-плитки.[br] ## [param tile] - Плитка.[br] ## [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 - var right = left + tile_size - var top = CE / 2 - tile.y * tile_size - var bottom = top - tile_size - return Bbox.new(left, bottom, right, top) + var tile_size = CE / pow(2, zoom) + var left = tile.x * tile_size - CE / 2 + var right = left + tile_size + var top = CE / 2 - tile.y * tile_size + var bottom = top - tile_size + return Bbox.new(left, bottom, right, top) func _xy(lng: float, lat: float, truncate=false) -> Array: - var ll: = truncate_lnglat(lng, lat) if truncate else [lng, lat] - var x: float = ll[0] / 360.0 + 0.5 - var sinlat: = sin(radians(ll[1])) - var y: = 0.5 - 0.25 * log((1.0 + sinlat) / (1.0 - sinlat)) / PI - return [x, y] + var ll: = truncate_lnglat(lng, lat) if truncate else [lng, lat] + var x: float = ll[0] / 360.0 + 0.5 + var sinlat: = sin(radians(ll[1])) + var y: = 0.5 - 0.25 * log((1.0 + sinlat) / (1.0 - sinlat)) / PI + return [x, y] ## Получение плитки, содержащей долготу и широту. @@ -398,64 +398,64 @@ func _xy(lng: float, lat: float, truncate=false) -> Array: ## [param zoom] - Уровень масштабирования веб-меркатора.[br] ## [param truncate] - Нужно ли усекать вводимые данные до границ веб-меркатора.[br] func create_tile(lng: float, lat: float, zoom: int, truncate: bool=false) -> Tile: - var xy0: = _xy(lng, lat, truncate) - var z2 = pow(2, zoom) + var xy0: = _xy(lng, lat, truncate) + var z2 = pow(2, zoom) - # Чтобы устранить потерю точности при переходе от одной плитки к другой - # и lng/lat, точки в пределах EPSILON от правой стороны плитки - # считаются в следующей за ней плитке. - var tile: = Tile.new() - if xy0[0] <= 0: tile.x = 0 - elif xy0[0] >= 1: tile.x = int(z2 - 1) - else: tile.x = int(floor((xy0[0] + EPSILON) * z2)) + # Чтобы устранить потерю точности при переходе от одной плитки к другой + # и lng/lat, точки в пределах EPSILON от правой стороны плитки + # считаются в следующей за ней плитке. + var tile: = Tile.new() + if xy0[0] <= 0: tile.x = 0 + elif xy0[0] >= 1: tile.x = int(z2 - 1) + else: tile.x = int(floor((xy0[0] + EPSILON) * z2)) - if xy0[1] <= 0: tile.y = 0 - elif xy0[1] >= 1: tile.y = int(z2 - 1) - else: tile.y = int(floor((xy0[1] + EPSILON) * z2)) - tile.z = zoom - tile.lng = lng - tile.lat = lat - return tile + if xy0[1] <= 0: tile.y = 0 + elif xy0[1] >= 1: tile.y = int(z2 - 1) + else: tile.y = int(floor((xy0[1] + EPSILON) * z2)) + tile.z = zoom + tile.lng = lng + tile.lat = lat + return tile ## Получение четверного ключа плитки.[br] ## [param tile] - Плитка. func quadkey(tile: Tile, zoom: int) -> String: - var rs: = '' - for z in range(zoom, 0, -1): - var digit = 0 - var mask = 1 << (z - 1) - if tile.x & mask: - digit += 1 - if tile.y & mask: - digit += 2 - rs += str(digit) - return rs + var rs: = '' + for z in range(zoom, 0, -1): + var digit = 0 + var mask = 1 << (z - 1) + if tile.x & mask: + digit += 1 + if tile.y & mask: + digit += 2 + rs += str(digit) + return rs ## Получение плитки, соответствующей четверному ключу.[br] ## [param qk] - Строка четверного ключа. func quadkey_to_tile(qk: Array) -> Tile: - var tile: = Tile.new() - if len(qk) == 0: return tile - var i = 0 - qk.reverse() - for digit in qk: - var mask = 1 << i - i += 1 - if digit == '1': - tile.x |= mask - elif digit == '2': - tile.y |= mask - elif digit == '3': - tile.x |= mask - tile.y |= mask - elif digit == '0': - continue - else: - push_error('Не ожидаемый четырёхзначный знак: \"%s\"' % digit) - tile.z = i - return tile + var tile: = Tile.new() + if len(qk) == 0: return tile + var i = 0 + qk.reverse() + for digit in qk: + var mask = 1 << i + i += 1 + if digit == '1': + tile.x |= mask + elif digit == '2': + tile.y |= mask + elif digit == '3': + tile.x |= mask + tile.y |= mask + elif digit == '0': + continue + else: + push_error('Не ожидаемый четырёхзначный знак: \"%s\"' % digit) + tile.z = i + return tile ## Получение плиток, перекрываемых географической рамкой.[br] @@ -465,27 +465,27 @@ func quadkey_to_tile(qk: Array) -> Tile: ## [i]В параметрах south и east используется небольшой эпсилон, чтобы ## функция выдавала ровно одну плитку при задании границ этой же плитки.[/i] func create_tiles(west: float, south: float, east: float, north: float, zooms) -> Array[Tile]: - var bboxes = [[west, south, east, north]] if west <= east else [[-180.0, south, east, north], [west, south, 180.0, north]] - var tiles = [] - if not is_instance_of(zooms, TYPE_ARRAY): - zooms = [zooms] - for box in bboxes: - var w = box[0] - var s = box[1] - var e = box[2] - var n = box[3] - # Зажим граничных значений. - w = max(-180.0, w) - s = max(MAX_SOUTH, s) - e = min(180.0, e) - n = min(85.051129, n) - for z in zooms: - var ul_tile = create_tile(w, n, z) - var lr_tile = create_tile(e - LL_EPSILON, s + LL_EPSILON, z) - for i in range(ul_tile.x, lr_tile.x + 1): - for j in range(ul_tile.y, lr_tile.y + 1): - tiles.append(Tile.new(i, j, z)) - return tiles + var bboxes = [[west, south, east, north]] if west <= east else [[-180.0, south, east, north], [west, south, 180.0, north]] + var tiles = [] + if not is_instance_of(zooms, TYPE_ARRAY): + zooms = [zooms] + for box in bboxes: + var w = box[0] + var s = box[1] + var e = box[2] + var n = box[3] + # Зажим граничных значений. + w = max(-180.0, w) + s = max(MAX_SOUTH, s) + e = min(180.0, e) + n = min(85.051129, n) + for z in zooms: + var ul_tile = create_tile(w, n, z) + var lr_tile = create_tile(e - LL_EPSILON, s + LL_EPSILON, z) + for i in range(ul_tile.x, lr_tile.x + 1): + for j in range(ul_tile.y, lr_tile.y + 1): + tiles.append(Tile.new(i, j, z)) + return tiles ## Получение родителя плитки. Родительская плитка - это плитка на один уровень масштабирования ниже, которая @@ -500,28 +500,28 @@ func create_tiles(west: float, south: float, east: float, north: float, zooms) - ## Tile(x=0, y=0, z=0) ## [/codeblock] func parent(tile: Tile, zoom=null) -> Tile: - if tile.z == 0: return null + if tile.z == 0: return null - assert((zoom != null) and (tile.z > zoom or zoom == int(zoom)), 'Масштаб (zoom) должен быть целым числом и меньше масштаба входной плитки (tile).') - assert(tile.x == int(tile.x) and tile.y == int(tile.y) and tile.z == int(tile.z), 'Родитель нецелочисленной плитки (tile) является неуточнённым') + assert((zoom != null) and (tile.z > zoom or zoom == int(zoom)), 'Масштаб (zoom) должен быть целым числом и меньше масштаба входной плитки (tile).') + assert(tile.x == int(tile.x) and tile.y == int(tile.y) and tile.z == int(tile.z), 'Родитель нецелочисленной плитки (tile) является неуточнённым') - var target_zoom = tile.z - 1 if zoom == null else zoom + var target_zoom = tile.z - 1 if zoom == null else zoom - # Алгоритм, в значительной степени вдохновленный https://github.com/mapbox/tilebelt - var return_tile = Tile.new(tile.x, tile.y, tile.z) - while return_tile.z > target_zoom: - tile.x = return_tile.x - tile.y = return_tile.y - tile.z = return_tile.z - if tile.x % 2 == 0 and tile.y % 2 == 0: - return_tile = Tile.new(tile.x / 2, tile.y / 2, tile.z - 1) - elif tile.x % 2 == 0: - return_tile = Tile.new(tile.x / 2, (tile.y - 1) / 2, tile.z - 1) - elif not tile.x % 2 == 0 and tile.y % 2 == 0: - return_tile = Tile.new((tile.x - 1) / 2, tile.y / 2, tile.z - 1) - else: - return_tile = Tile.new((tile.x - 1) / 2, (tile.y - 1) / 2, tile.z - 1) - return return_tile + # Алгоритм, в значительной степени вдохновленный https://github.com/mapbox/tilebelt + var return_tile = Tile.new(tile.x, tile.y, tile.z) + while return_tile.z > target_zoom: + tile.x = return_tile.x + tile.y = return_tile.y + tile.z = return_tile.z + if tile.x % 2 == 0 and tile.y % 2 == 0: + return_tile = Tile.new(tile.x / 2, tile.y / 2, tile.z - 1) + elif tile.x % 2 == 0: + return_tile = Tile.new(tile.x / 2, (tile.y - 1) / 2, tile.z - 1) + elif not tile.x % 2 == 0 and tile.y % 2 == 0: + return_tile = Tile.new((tile.x - 1) / 2, tile.y / 2, tile.z - 1) + else: + return_tile = Tile.new((tile.x - 1) / 2, (tile.y - 1) / 2, tile.z - 1) + return return_tile ## Получение дочерних элементов плитки. Дочерние элементы упорядочены: @@ -538,16 +538,16 @@ func parent(tile: Tile, zoom=null) -> Tile: ## [Tile(x=0, y=0, z=2), Tile(x=0, y=1, z=2), Tile(x=0, y=2, z=2), Tile(x=0, y=3, z=2), ...] ## [/codeblock] func children(tile: Tile, zoom: int) -> Array: - var target_zoom = zoom if zoom != null else tile.z + 1 - var tiles: Array[Tile] = [tile] - while tiles[0].z >= target_zoom: - tile = tiles.pop_at(0) - tiles += [ - Tile.new(tile.x * 2, tile.y * 2, tile.z + 1), - Tile.new(tile.x * 2 + 1, tile.y * 2, tile.z + 1), - Tile.new(tile.x * 2 + 1, tile.y * 2 + 1, tile.z + 1), - Tile.new(tile.x * 2, tile.y * 2 + 1, tile.z + 1) ] - return tiles + var target_zoom = zoom if zoom != null else tile.z + 1 + var tiles: Array[Tile] = [tile] + while tiles[0].z >= target_zoom: + tile = tiles.pop_at(0) + tiles += [ + Tile.new(tile.x * 2, tile.y * 2, tile.z + 1), + Tile.new(tile.x * 2 + 1, tile.y * 2, tile.z + 1), + Tile.new(tile.x * 2 + 1, tile.y * 2 + 1, tile.z + 1), + Tile.new(tile.x * 2, tile.y * 2 + 1, tile.z + 1) ] + return tiles ## Проверяется, есть ли в [param merge_set] 4 плитки, которые могут быть объединены. @@ -555,52 +555,52 @@ func children(tile: Tile, zoom: int) -> Array: ## число, указывающее, были ли они объединены. При многократном применяя ## [method merge], можно упростить набор плиток. func merge(merge_set) -> Array: - var upwards_merge: = {} - for tile in merge_set.keys(): - var tile_parent = parent(tile) - if not upwards_merge.has(tile_parent): - upwards_merge[tile_parent] = {} - upwards_merge[tile_parent].update({tile: false}) - var current_tileset: = [] - var changed: = false - for supertile in upwards_merge.keys(): - var tile_children = upwards_merge[supertile] - if len(tile_children) == 4: - current_tileset += [supertile] - changed = true - else: - current_tileset += [tile_children] - return [current_tileset, changed] + var upwards_merge: = {} + for tile in merge_set.keys(): + var tile_parent = parent(tile) + if not upwards_merge.has(tile_parent): + upwards_merge[tile_parent] = {} + upwards_merge[tile_parent].update({tile: false}) + var current_tileset: = [] + var changed: = false + for supertile in upwards_merge.keys(): + var tile_children = upwards_merge[supertile] + if len(tile_children) == 4: + current_tileset += [supertile] + changed = true + else: + current_tileset += [tile_children] + return [current_tileset, changed] ## Максимально уменьшает размер набора плиток путем слияния листьев с родителями. ## [param tiles] - Последовательность плиток для слияния. func simplify(tiles: Array) -> Array: - # Проверьте, существует ли уже плитка и ее родитель. - # Убедитесь, что плитки отсортированы по масштабу, поэтому родительские - # плитки встречаются первыми. Если да, отбросьте дочернюю плитку - # (она покрыта родительской). - var root_set = {} - tiles.sort_custom(func(a, b): return a[2] < b[2]) - for tile in tiles: - var is_new_tile: bool = true - var supertiles = [] - for i in tile.z: - supertiles.append(parent(tile, i)) - for supertile in supertiles: - if supertile in root_set: - is_new_tile = false - continue - if is_new_tile: - root_set.update({tile: false}) + # Проверьте, существует ли уже плитка и ее родитель. + # Убедитесь, что плитки отсортированы по масштабу, поэтому родительские + # плитки встречаются первыми. Если да, отбросьте дочернюю плитку + # (она покрыта родительской). + var root_set = {} + tiles.sort_custom(func(a, b): return a[2] < b[2]) + for tile in tiles: + var is_new_tile: bool = true + var supertiles = [] + for i in tile.z: + supertiles.append(parent(tile, i)) + for supertile in supertiles: + if supertile in root_set: + is_new_tile = false + continue + if is_new_tile: + root_set.update({tile: false}) - # Повторять слияние до тех пор, пока дальнейшее упрощение перестанет быть невозможным. - var is_merging: bool = true - while is_merging: - var root_set_is_merging = merge(root_set) - root_set = root_set_is_merging[0] - is_merging = root_set_is_merging[1] - return root_set + # Повторять слияние до тех пор, пока дальнейшее упрощение перестанет быть невозможным. + var is_merging: bool = true + while is_merging: + var root_set_is_merging = merge(root_set) + root_set = root_set_is_merging[0] + is_merging = root_set_is_merging[1] + return root_set ## Получение наименьшей плитки, содержащей географическую границу. @@ -610,40 +610,40 @@ func simplify(tiles: Array) -> Array: ## севера в десятичных градусах. func bounding_tile(bbox: Bbox, truncate: bool = false) -> Tile: - if truncate: - var w_s = truncate_lnglat(bbox.left, bbox.bottom) - bbox.left = w_s[0] - bbox.bottom = w_s[1] - var e_n = truncate_lnglat(bbox.right, bbox.north) - bbox.right = e_n[0] - bbox.top = e_n[1] + if truncate: + var w_s = truncate_lnglat(bbox.left, bbox.bottom) + bbox.left = w_s[0] + bbox.bottom = w_s[1] + var e_n = truncate_lnglat(bbox.right, bbox.north) + bbox.right = e_n[0] + bbox.top = e_n[1] - bbox.right -= LL_EPSILON - bbox.bottom += LL_EPSILON + bbox.right -= LL_EPSILON + bbox.bottom += LL_EPSILON - var tmin = create_tile(bbox.left, bbox.top, 32) - var tmax = create_tile(bbox.right, bbox.bottom, 32) - assert(tmin.is_valid()) - assert(tmax.is_valid()) + var tmin = create_tile(bbox.left, bbox.top, 32) + var tmax = create_tile(bbox.right, bbox.bottom, 32) + assert(tmin.is_valid()) + assert(tmax.is_valid()) - var cell = [tmin.x, tmin.y, tmax.x, tmax.y] - var z = _get_bbox_zoom(cell) + var cell = [tmin.x, tmin.y, tmax.x, tmax.y] + var z = _get_bbox_zoom(cell) - if z == 0: - return Tile.new() + if z == 0: + return Tile.new() - var x = rshift(cell[0], 32 - z) - var y = rshift(cell[1], 32 - z) + var x = rshift(cell[0], 32 - z) + var y = rshift(cell[1], 32 - z) - return Tile.new(x, y, z) + return Tile.new(x, y, z) func _get_bbox_zoom(bbox: Array): - for z in MAX_ZOOM: - var mask: int = 1 << (32 - (z + 1)) - if (bbox[0] & mask) != (bbox[2] & mask) or (bbox[1] & mask) != (bbox[3] & mask): - return z - return MAX_ZOOM + for z in MAX_ZOOM: + var mask: int = 1 << (32 - (z + 1)) + if (bbox[0] & mask) != (bbox[2] & mask) or (bbox[1] & mask) != (bbox[3] & mask): + return z + return MAX_ZOOM ## Получение GeoJSON-функции, соответствующей плитке.[br] @@ -654,95 +654,95 @@ func _get_bbox_zoom(bbox: Array): ## [param buffer] - Необязательное буферное расстояние для полигона GeoJSON.[br] ## [param precision] - Координаты GeoJSON будут усечены до данного количества знаков после запятой.[br] func feature(tile: Tile, fid:String = 'null', props=null, projected='geographic', buffer=null) -> Dictionary: - var west_south_east_north = bounds(tile).as_array() - var west = west_south_east_north[0] - var south = west_south_east_north[1] - var east = west_south_east_north[2] - var north = west_south_east_north[3] - if projected == 'mercator': - var west_south = xy(west, south, false) - west = west_south[0] - south = west_south[1] - var east_north = xy(east, north, false) - east = east_north[0] - north = east_north[1] + var west_south_east_north = bounds(tile).as_array() + var west = west_south_east_north[0] + var south = west_south_east_north[1] + var east = west_south_east_north[2] + var north = west_south_east_north[3] + if projected == 'mercator': + var west_south = xy(west, south, false) + west = west_south[0] + south = west_south[1] + var east_north = xy(east, north, false) + east = east_north[0] + north = east_north[1] - if buffer: - west -= buffer - south -= buffer - east += buffer - north += buffer + if buffer: + west -= buffer + south -= buffer + east += buffer + north += buffer - west = round(west) - south = round(south) - east = round(east) - north = round(north) + west = round(west) + south = round(south) + east = round(east) + north = round(north) - var bbox: = [min(west, east), min(south, north), max(west, east), max(south, north)] - var geom: = {'type': 'Polygon', 'coordinates': [[[west, south], [west, north], [east, north], [east, south], [west, south]]] } - var xyz: = str(tile) - var feat: = { - 'type': 'Feature', - 'bbox': bbox, - 'id': xyz, - 'geometry': geom, - 'properties': {'title': 'XYZ tile %s' % xyz} } + var bbox: = [min(west, east), min(south, north), max(west, east), max(south, north)] + var geom: = {'type': 'Polygon', 'coordinates': [[[west, south], [west, north], [east, north], [east, south], [west, south]]] } + var xyz: = str(tile) + var feat: = { + 'type': 'Feature', + 'bbox': bbox, + 'id': xyz, + 'geometry': geom, + 'properties': {'title': 'XYZ tile %s' % xyz} } - if props: - feat['properties'].update(props) + if props: + feat['properties'].update(props) - if fid != 'null': - feat['id'] = fid + if fid != 'null': + feat['id'] = fid - return feat + return feat func isinstance(obj, types: Array) -> bool: - for type in types: - if is_instance_of(obj, type): - return true - return false + for type in types: + if is_instance_of(obj, type): + return true + return false ## Все кортежи координат из геометрии, объекта или коллекции.[br] ## [param lng] - Долгота.[br] ## [param lat] - широта.[br] func _coords(obj) -> Array: - var coordinates = [] - if is_instance_of(obj, TYPE_ARRAY): - coordinates = obj - elif 'features' in obj: - for feat in obj['features']: - coordinates = feat['geometry']['coordinates'] - elif 'geometry' in obj: - coordinates = obj['geometry']['coordinates'] - else: - coordinates = obj.get('coordinates', obj) + var coordinates = [] + if is_instance_of(obj, TYPE_ARRAY): + coordinates = obj + elif 'features' in obj: + for feat in obj['features']: + coordinates = feat['geometry']['coordinates'] + elif 'geometry' in obj: + coordinates = obj['geometry']['coordinates'] + else: + coordinates = obj.get('coordinates', obj) - var v: = [] - for e in coordinates: - if isinstance(e, [TYPE_FLOAT, TYPE_INT]): - v.append(coordinates) - break - else: - for f in _coords(e): - v.append([f[0], f[1]]) - return v + var v: = [] + for e in coordinates: + if isinstance(e, [TYPE_FLOAT, TYPE_INT]): + v.append(coordinates) + break + else: + for f in _coords(e): + v.append([f[0], f[1]]) + return v func _func1(bbox: Array, coords: Array) -> Array[float]: - var w = bbox[0] - var s = bbox[1] - var e = bbox[2] - var n = bbox[3] - var lng = coords[0] - var lat = coords[1] - return [min(w, lng), min(s, lat), max(e, lng), max(n, lat)] + var w = bbox[0] + var s = bbox[1] + var e = bbox[2] + var n = bbox[3] + var lng = coords[0] + var lat = coords[1] + return [min(w, lng), min(s, lat), max(e, lng), max(n, lat)] ## Возвращает граничную область объекта GeoJSON.[br] ## [param obj] - Отображение, геометрия GeoJSON, объект или коллекция объектов.[br] func geojson_bounds(obj) -> LngLatBbox: - var coords: Array = _coords(obj) - var wsen = coords.reduce(_func1, [180.0, 90.0, -180.0, -90.0]) - return LngLatBbox.new(wsen[0], wsen[1], wsen[2], wsen[3]) + var coords: Array = _coords(obj) + var wsen = coords.reduce(_func1, [180.0, 90.0, -180.0, -90.0]) + return LngLatBbox.new(wsen[0], wsen[1], wsen[2], wsen[3]) diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 3dcf65a..dbf955d 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -5,27 +5,27 @@ const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb, 'udp const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} class Socket extends PacketPeerUDP: - func send_to(addr, data): - self.set_dest_address(addr[0], addr[1]) - self.put_packet(data) + func send_to(addr, data): + self.set_dest_address(addr[0], addr[1]) + self.put_packet(data) class SocketTCP extends TCPServer: - 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 ## Размер ожидаемых данных. + 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 ## Размер ожидаемых данных. - func send_to(data): - var peer = peerstream.get_stream_peer() - peer.put_data(data) + func send_to(data): + var peer = peerstream.get_stream_peer() + peer.put_data(data) var poll_sockets: Array[Socket] @@ -38,129 +38,129 @@ var logger_page: Node func create_socket(nm) -> Socket: - var addr = repsettings.UnitProfiles[nm][1] - var port = repsettings.UnitProfiles[nm][2] - var broad = repsettings.UnitProfiles[nm][3] - var bind = repsettings.UnitProfiles[nm][4] - var sock: = Socket.new() - sock.set_broadcast_enabled(broad) - var rc = Error.OK if not bind else sock.bind(port, addr) - var errlevel = log.INFO if rc == Error.OK else log.ERROR - log.message(errlevel, '%s: сокет:%s:%d привязанный:%s %s' % [nm, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) - return sock + var addr = repsettings.UnitProfiles[nm][1] + var port = repsettings.UnitProfiles[nm][2] + var broad = repsettings.UnitProfiles[nm][3] + var bind = repsettings.UnitProfiles[nm][4] + var sock: = Socket.new() + sock.set_broadcast_enabled(broad) + var rc = Error.OK if not bind else sock.bind(port, addr) + var errlevel = log.INFO if rc == Error.OK else log.ERROR + log.message(errlevel, '%s: сокет:%s:%d привязанный:%s %s' % [nm, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) + return sock func create_tcpsocket(nm) -> SocketTCP: - var addr = repsettings.UnitProfiles[nm][1] - var port = repsettings.UnitProfiles[nm][2] - var sock = SocketTCP.new() - sock.unit_key = repsettings.get_unit_key(nm) - sock.listen(port, addr) - log.message(log.INFO, '%s: сокет:%s:%d привязанный:' % [nm, addr, port]) - return sock + var addr = repsettings.UnitProfiles[nm][1] + var port = repsettings.UnitProfiles[nm][2] + var sock = SocketTCP.new() + sock.unit_key = repsettings.get_unit_key(nm) + sock.listen(port, addr) + log.message(log.INFO, '%s: сокет:%s:%d привязанный:' % [nm, addr, port]) + return sock func _ready() -> void: - log.info('Модуль работы с сетью готов') - poll_sockets.append(create_socket('уарэп-яу07-частный')) - poll_sockets.append(create_socket('уарэп-яу07-общий')) - poll_sockets.append(create_socket('уарэп-капсрпб-пол')) - sock_unicast = poll_sockets[0] - sock_capsrpb = poll_sockets[2] + log.info('Модуль работы с сетью готов') + poll_sockets.append(create_socket('уарэп-яу07-частный')) + poll_sockets.append(create_socket('уарэп-яу07-общий')) + poll_sockets.append(create_socket('уарэп-капсрпб-пол')) + sock_unicast = poll_sockets[0] + sock_capsrpb = poll_sockets[2] - for unit_name in repsettings.UnitProfiles: - var setting = repsettings.UnitProfiles[unit_name] - var proto = setting[0] - if proto in PROTOCOL_TYPES: - var unit = PROTOCOL_TYPES[proto].new(unit_name) - var unit_key = repsettings.get_unit_key(unit_name) - units[unit_key] = unit - if logger_page: - unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) - unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) + for unit_name in repsettings.UnitProfiles: + var setting_ = repsettings.UnitProfiles[unit_name] + var proto = setting_[0] + if proto in PROTOCOL_TYPES: + var unit = PROTOCOL_TYPES[proto].new(unit_name) + var unit_key = repsettings.get_unit_key(unit_name) + units[unit_key] = unit + if logger_page: + unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) + unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) - if proto in TCP_PROTO: - var unit = TCP_PROTO[proto].new(unit_name) - var unit_key = repsettings.get_unit_key(unit_name) - units_tcp[unit_key] = unit - if logger_page: - unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) - unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) + if proto in TCP_PROTO: + var unit = TCP_PROTO[proto].new(unit_name) + var unit_key = repsettings.get_unit_key(unit_name) + units_tcp[unit_key] = unit + if logger_page: + unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) + unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) - tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]]) + tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]]) - for key in units: log.info('%s %s:%d' % [units[key].name, key[0], key[1]]) - for key in units_tcp: log.info('%s %s:%d' % [units_tcp[key].name, key[0], key[1]]) + for key in units: log.info('%s %s:%d' % [units[key].name, key[0], key[1]]) + for key in units_tcp: log.info('%s %s:%d' % [units_tcp[key].name, key[0], key[1]]) func poll_receive(sock: Socket, tick: int) -> bool: - while sock.get_available_packet_count() > 0: - var data: = sock.get_packet() - var addr: = sock.get_packet_ip() - var port: = sock.get_packet_port() - var addr_port: = [addr, port] - if addr_port in units: units[addr_port].parse(data, tick) - return false + while sock.get_available_packet_count() > 0: + var data: = sock.get_packet() + var addr: = sock.get_packet_ip() + var port: = sock.get_packet_port() + var addr_port: = [addr, port] + if addr_port in units: units[addr_port].parse(data, tick) + return false func poll_receive_tcp(sock: SocketTCP, tick: int) -> bool: - if sock.is_connection_available(): # check if someone's trying to connect - var client = sock.take_connection() # accept connection - sock.peerstream.set_stream_peer(client) # bind peerstream to new client - print_debug('client_is_connected') - var peer = sock.peerstream.get_stream_peer() - if peer: - var peer_len_data = peer.get_available_bytes() - if peer_len_data > 0: - get_client_data(sock, peer_len_data, peer, tick) - if sock.unit_key in units_tcp and sock.rx_all: units_tcp[sock.unit_key].parse(sock.rx_data, tick) - return false + if sock.is_connection_available(): # check if someone's trying to connect + var client = sock.take_connection() # accept connection + sock.peerstream.set_stream_peer(client) # bind peerstream to new client + print_debug('client_is_connected') + var peer = sock.peerstream.get_stream_peer() + if peer: + var peer_len_data = peer.get_available_bytes() + if peer_len_data > 0: + get_client_data(sock, peer_len_data, peer, tick) + if sock.unit_key in units_tcp and sock.rx_all: units_tcp[sock.unit_key].parse(sock.rx_data, tick) + return false func get_client_data(sock: SocketTCP, peer_len_data, peer, tick): - if tick - sock.rx_tick > sock.RX_TIMEOUT: - sock.rx_all = true - sock.rx_tick = tick - if sock.rx_all: - if peer_len_data >= sock.head_len: - sock.rx_all = false - sock.rx_len = sock.head_len - var head = peer.get_data(sock.head_len) - sock.data_len = head[1].decode_u32(sock.len_place) - var len_data_in_buf = peer.get_available_bytes() - if len_data_in_buf > 0: - sock.rx_data = head[1] - var len_rx = len_data_in_buf - if len_data_in_buf >= sock.data_len: - len_rx = sock.data_len - get_tcp_data(sock, peer, len_rx) - else: - var len_rx = (sock.head_len + sock.data_len) - sock.rx_len - if peer_len_data < len_rx: - len_rx = peer_len_data - get_tcp_data(sock, peer, len_rx) + if tick - sock.rx_tick > sock.RX_TIMEOUT: + sock.rx_all = true + sock.rx_tick = tick + if sock.rx_all: + if peer_len_data >= sock.head_len: + sock.rx_all = false + sock.rx_len = sock.head_len + var head = peer.get_data(sock.head_len) + sock.data_len = head[1].decode_u32(sock.len_place) + var len_data_in_buf = peer.get_available_bytes() + if len_data_in_buf > 0: + sock.rx_data = head[1] + var len_rx = len_data_in_buf + if len_data_in_buf >= sock.data_len: + len_rx = sock.data_len + get_tcp_data(sock, peer, len_rx) + else: + var len_rx = (sock.head_len + sock.data_len) - sock.rx_len + if peer_len_data < len_rx: + len_rx = peer_len_data + get_tcp_data(sock, peer, len_rx) func get_tcp_data(sock: SocketTCP, peer, len_rx): - var temp_data = peer.get_data(len_rx)[1] - sock.rx_data.append_array(temp_data) - sock.rx_len += len_rx - if sock.rx_len >= sock.head_len + sock.data_len: - sock.rx_all = true + var temp_data = peer.get_data(len_rx)[1] + sock.rx_data.append_array(temp_data) + sock.rx_len += len_rx + if sock.rx_len >= sock.head_len + sock.data_len: + sock.rx_all = true func _process(_delta: float) -> void: - var tick = Time.get_ticks_msec() - for addr in units: - var unit = units[addr] - match unit.process(tick): - Error.OK: sock_unicast.send_to(addr, unit.tx_data) - Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]]) - for sock_unit in tcp_sockets: - var sock = sock_unit[0] - var unit = sock_unit[1] - match unit.process(tick): - Error.OK: sock.send_to(unit.tx_data) - Error.FAILED: emit_signal('socket_error', 'ошибка: %s' %unit) - poll_receive_tcp(sock, tick) - poll_sockets.any(func(sock): poll_receive(sock, tick)) + var tick = Time.get_ticks_msec() + for addr in units: + var unit = units[addr] + match unit.process(tick): + Error.OK: sock_unicast.send_to(addr, unit.tx_data) + Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]]) + for sock_unit in tcp_sockets: + var sock = sock_unit[0] + var unit = sock_unit[1] + match unit.process(tick): + Error.OK: sock.send_to(unit.tx_data) + Error.FAILED: emit_signal('socket_error', 'ошибка: %s' %unit) + poll_receive_tcp(sock, tick) + poll_sockets.any(func(sock): poll_receive(sock, tick)) diff --git a/scripts/tcp5p28.gd b/scripts/tcp5p28.gd index 47bafdf..63fca15 100644 --- a/scripts/tcp5p28.gd +++ b/scripts/tcp5p28.gd @@ -9,185 +9,185 @@ const BUFFER_SIZE = 2048 ## Размер приёмного буфера д ## Тип модуляции для запаковки в пакет для 5П-28. const MOD_TYPES: Array = ['', - 'am', - 'ook', - 'ask', - 'fm', - 'qpsk', - 'oqpsk', - 'pi4qpsk', - 'qam16', - 'qam32', - 'qam64', - 'qam128', - 'qam256', - 'qam512', - 'cpfsk', - 'psk', - 'ofdm',] + 'am', + 'ook', + 'ask', + 'fm', + 'qpsk', + 'oqpsk', + 'pi4qpsk', + 'qam16', + 'qam32', + 'qam64', + 'qam128', + 'qam256', + 'qam512', + 'cpfsk', + 'psk', + 'ofdm',] const CU_STATE: Dictionary = { - 0:2, # Подготовка к выполнению - 1:1, # Выполняется - 2:9, # Ошибка в команде - 3:7, # Занят выполнением другого ЦУ - 4:9, # Неисправность - } + 0:2, # Подготовка к выполнению + 1:1, # Выполняется + 2:9, # Ошибка в команде + 3:7, # Занят выполнением другого ЦУ + 4:9, # Неисправность + } class TCP5P28: - const PACK_TYPE_CMD: int = 1 - const PACK_TYPE_RES: int = 2 - const CMD_TYPE_STATE: int = 1 - const CMD_TYPE_TH: int = 2 - const CMD_TYPE_IN: int = 3 + const PACK_TYPE_CMD: int = 1 + const PACK_TYPE_RES: int = 2 + const CMD_TYPE_STATE: int = 1 + 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 + func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]]) + func _init(nm): self.name = nm - func parse(data: PackedByteArray, now_tick: int): - rx_tick = now_tick - if not online: - online = true - emit_signal('line_changed', self) - var pack_type = data.decode_u8(2) - if pack_type == PACK_TYPE_CMD: - var cmd_type = data.decode_u8(8) - if cmd_type == CMD_TYPE_TH: - emit_signal('get_threats') - if cmd_type == CMD_TYPE_STATE: - emit_signal('get_interfers') - var external_cu = ProjectSettings.get_setting('application/config/external_cu', false) - if cmd_type == CMD_TYPE_IN and external_cu: - set_interfer(data) + func parse(data: PackedByteArray, now_tick: int): + rx_tick = now_tick + if not online: + online = true + emit_signal('line_changed', self) + var pack_type = data.decode_u8(2) + if pack_type == PACK_TYPE_CMD: + var cmd_type = data.decode_u8(8) + if cmd_type == CMD_TYPE_TH: + emit_signal('get_threats') + if cmd_type == CMD_TYPE_STATE: + emit_signal('get_interfers') + var external_cu = ProjectSettings.get_setting('application/config/external_cu', false) + if cmd_type == CMD_TYPE_IN and external_cu: + set_interfer(data) - func process(now_tick: int): - if online and ((now_tick - rx_tick) > ONLINE_TIMEOUT): - online = false - emit_signal('line_changed', self) - if len(tx_stack): - tx_data = tx_stack[0] - tx_stack.remove_at(0) - return Error.OK - else: - return Error.ERR_UNAVAILABLE + func process(now_tick: int): + if online and ((now_tick - rx_tick) > ONLINE_TIMEOUT): + online = false + emit_signal('line_changed', self) + if len(tx_stack): + tx_data = tx_stack[0] + tx_stack.remove_at(0) + return Error.OK + else: + return Error.ERR_UNAVAILABLE - func pack_threats(ths): - var data = PackedByteArray() - var data_len = 4 + len(ths) * 80 # длинна блока данных в байтах - var tick = Time.get_ticks_msec() - data.resize(4) - data.encode_u16(0, 0) # Код ошибки - data.encode_u16(2, len(ths)) # Количество целей - for th in ths.values(): - data.append_array(get_threats_data(th, int(tick))) - var data_to_send: PackedByteArray = create_header(data_len) - data_to_send.append_array(data) - tx_stack.append(data_to_send) + func pack_threats(ths): + var data = PackedByteArray() + var data_len = 4 + len(ths) * 80 # длинна блока данных в байтах + var tick = Time.get_ticks_msec() + data.resize(4) + data.encode_u16(0, 0) # Код ошибки + data.encode_u16(2, len(ths)) # Количество целей + for th in ths.values(): + data.append_array(get_threats_data(th, int(tick))) + var data_to_send: PackedByteArray = create_header(data_len) + data_to_send.append_array(data) + tx_stack.append(data_to_send) - func pack_interfers(interfers, ecms): - var data = PackedByteArray() - var data_len = 12 # длинна блока данных в байтах - data.resize(data_len) - data.encode_u16(0, 0) # Код ошибки - data.encode_u16(2, len(interfers)) # Количество целей - data.encode_u32(4, 0) # Состояние УА-РЕП - data.encode_u32(8, 0) # Состояние линий связи - for id in interfers.values(): - var cu_data: PackedByteArray = [] - cu_data.resize(4) - var cu = ecms[id] - cu_data.encode_u16(0, cu.ispp) - var state: int - if CU_STATE.has(cu.svk): - state = CU_STATE[cu.svk] - else: - state = 9 - cu_data.encode_u8(2, state) # Состояние выполнения команды - cu_data.encode_u8(3, 0xFF) # Эффективность работы помехи - data.append_array(cu_data) - var data_to_send: PackedByteArray = create_header(data_len + 4 * len(interfers)) - data_to_send.append_array(data) - tx_stack.append(data_to_send) + func pack_interfers(interfers, ecms): + var data = PackedByteArray() + var data_len = 12 # длинна блока данных в байтах + data.resize(data_len) + data.encode_u16(0, 0) # Код ошибки + data.encode_u16(2, len(interfers)) # Количество целей + data.encode_u32(4, 0) # Состояние УА-РЕП + data.encode_u32(8, 0) # Состояние линий связи + for id in interfers.values(): + var cu_data: PackedByteArray = [] + cu_data.resize(4) + var cu = ecms[id] + cu_data.encode_u16(0, cu.ispp) + var state: int + if CU_STATE.has(cu.svk): + state = CU_STATE[cu.svk] + else: + state = 9 + cu_data.encode_u8(2, state) # Состояние выполнения команды + cu_data.encode_u8(3, 0xFF) # Эффективность работы помехи + data.append_array(cu_data) + var data_to_send: PackedByteArray = create_header(data_len + 4 * len(interfers)) + data_to_send.append_array(data) + tx_stack.append(data_to_send) - func create_header(data_len): - var head_data = PackedByteArray() - head_data.resize(8) # Размер заголовка - head_data.encode_u16(0, 0) # Код ошибки - head_data.encode_u8(2, 2) # Тип пакета, ответ на запрос - head_data.encode_u8(3, 5) # Версия протокола, всегда 5 - head_data.encode_u32(4, data_len) # Длинна пакета данных - return head_data + func create_header(data_len): + var head_data = PackedByteArray() + head_data.resize(8) # Размер заголовка + head_data.encode_u16(0, 0) # Код ошибки + head_data.encode_u8(2, 2) # Тип пакета, ответ на запрос + head_data.encode_u8(3, 5) # Версия протокола, всегда 5 + head_data.encode_u32(4, data_len) # Длинна пакета данных + return head_data - func get_threats_data(th, tick): - var th_data = PackedByteArray() - th_data.resize(80) # Количество байт в массиве - th_data.encode_u64(0, tick) - var flags: int = 0 # с 0 по 7 бит рекомендованная помеха - flags |= 0 << 8 # Флаг рекомендуемой помехи - flags |= int(th.fflags['aoa']) << 9 # Флаг доставерности пеленга - flags |= int(th.fflags['alt']) << 10 # Флаг доставерности высоты - flags |= int(th.fflags['power']) << 11 # Флаг доставерности мощности - flags |= int(th.fflags['baud']) << 12 # Флаг доставерности ск. мод. - flags |= int(th.fflags['slon']) << 13 # Флаг доставерности долготы ст. позиции - flags |= int(th.fflags['slat']) << 14 # Флаг доставерности широты ст. позиции - flags |= int(th.fflags['lon']) << 15 # Флаг доставерности долготы - flags |= int(th.fflags['lat']) << 16 # Флаг доставерности широты - flags |= int(0) << 30 # Флаг признак назначения помехи на цель - flags |= int(0) << 31 # Флаг признак назначения опасной цель - th_data.encode_u32(8, flags) # Флаги - th_data.encode_u16(12, th.id) # Идентификатор объекта - th_data.encode_u16(14, int(round(th.aoa/0.1))) # Пеленг объекта - th_data.encode_u16(16, int(th.alt)) # Высота объекта - th_data.encode_u16(18, int(th.freq)) # Частота объекта - th_data.encode_u16(20, int(th.width)) # Ширина частотной полосы объекта - th_data.encode_u8(22, int(th.power)) # Мощность излучения объекта - var mod = MOD_TYPES.find(th.tmod) - if mod == -1: mod = 0 - th_data.encode_u8(23, int(mod)) # Тип модуляции - th_data.encode_u32(24, int(th.baud)) # Скорость модуляции, бод - to_cp866(th.proto, th_data) - var c1 = pow(2, 30) / 180.0 - th_data.encode_s32(64, int(th.slon * c1)) - th_data.encode_s32(68, int(th.slat * c1)) - th_data.encode_s32(72, int(th.lon * c1)) - th_data.encode_s32(76, int(th.lat * c1)) - return th_data + func get_threats_data(th, tick): + var th_data = PackedByteArray() + th_data.resize(80) # Количество байт в массиве + th_data.encode_u64(0, tick) + var flags: int = 0 # с 0 по 7 бит рекомендованная помеха + flags |= 0 << 8 # Флаг рекомендуемой помехи + flags |= int(th.fflags['aoa']) << 9 # Флаг доставерности пеленга + flags |= int(th.fflags['alt']) << 10 # Флаг доставерности высоты + flags |= int(th.fflags['power']) << 11 # Флаг доставерности мощности + flags |= int(th.fflags['baud']) << 12 # Флаг доставерности ск. мод. + flags |= int(th.fflags['slon']) << 13 # Флаг доставерности долготы ст. позиции + flags |= int(th.fflags['slat']) << 14 # Флаг доставерности широты ст. позиции + flags |= int(th.fflags['lon']) << 15 # Флаг доставерности долготы + flags |= int(th.fflags['lat']) << 16 # Флаг доставерности широты + flags |= int(0) << 30 # Флаг признак назначения помехи на цель + flags |= int(0) << 31 # Флаг признак назначения опасной цель + th_data.encode_u32(8, flags) # Флаги + th_data.encode_u16(12, th.id) # Идентификатор объекта + th_data.encode_u16(14, int(round(th.aoa/0.1))) # Пеленг объекта + th_data.encode_u16(16, int(th.alt)) # Высота объекта + th_data.encode_u16(18, int(th.freq)) # Частота объекта + th_data.encode_u16(20, int(th.width)) # Ширина частотной полосы объекта + th_data.encode_u8(22, int(th.power)) # Мощность излучения объекта + var mod = MOD_TYPES.find(th.tmod) + if mod == -1: mod = 0 + th_data.encode_u8(23, int(mod)) # Тип модуляции + th_data.encode_u32(24, int(th.baud)) # Скорость модуляции, бод + to_cp866(th.proto, th_data) + var c1 = pow(2, 30) / 180.0 + th_data.encode_s32(64, int(th.slon * c1)) + th_data.encode_s32(68, int(th.slat * c1)) + th_data.encode_s32(72, int(th.lon * c1)) + th_data.encode_s32(76, int(th.lat * c1)) + return th_data - func to_cp866(proto: String, th_data): - var cp866_proto: PackedByteArray = proto.to_ascii_buffer() - cp866_proto.resize(36) - for i in len(cp866_proto): - th_data[28 + i] = cp866_proto[i] + func to_cp866(proto: String, th_data): + var cp866_proto: PackedByteArray = proto.to_ascii_buffer() + cp866_proto.resize(36) + for i in len(cp866_proto): + th_data[28 + i] = cp866_proto[i] - func set_interfer(data): - var mode = data.decode_u8(9) - var id = data.decode_u16(10) - var aoa = float(data.decode_u16(12)) / 10 - var ela = float(data.decode_u16(14)) / 10 - var freq = data.decode_u16(16) - var width = data.decode_u16(18) - var interfer_params: Array = [mode, id, aoa, ela, freq, width] - signaller.emit_signal('interfer_rcv', interfer_params) + func set_interfer(data): + var mode = data.decode_u8(9) + var id = data.decode_u16(10) + var aoa = float(data.decode_u16(12)) / 10 + var ela = float(data.decode_u16(14)) / 10 + var freq = data.decode_u16(16) + var width = data.decode_u16(18) + var interfer_params: Array = [mode, id, aoa, ela, freq, width] + signaller.emit_signal('interfer_rcv', interfer_params) - func on_interfer_accept(err: bool): - var data_tx = PackedByteArray() - var data_len = 2 # длинна блока данных в байтах - data_tx.resize(data_len) - data_tx.encode_u16(0, err) # Код ошибки - var data_to_send: PackedByteArray = create_header(data_len) - data_to_send.append_array(data_tx) - tx_stack.append(data_to_send) + func on_interfer_accept(err: bool): + var data_tx = PackedByteArray() + var data_len = 2 # длинна блока данных в байтах + data_tx.resize(data_len) + data_tx.encode_u16(0, err) # Код ошибки + var data_to_send: PackedByteArray = create_header(data_len) + data_to_send.append_array(data_tx) + tx_stack.append(data_to_send) diff --git a/table/table.gd b/table/table.gd index cd1dd1f..9d9363d 100644 --- a/table/table.gd +++ b/table/table.gd @@ -57,94 +57,94 @@ func defaultselector_color_proc(_i_row: int): return selector_color ## [param scrl] - Прокрутка родитель таблицы.[br] ## [param prnt] - Родитель прокрутки.[br] func pin_header(scrl: ScrollContainer, prnt: Control): - scrl.remove_child(header) - prnt.add_child(header) - var v_separation = get_theme_constant('v_separation') - header.position = scrl.position - Vector2(0, header.size.y + v_separation) - scroll = scrl - scroll_adj = scrl.position + scrl.remove_child(header) + prnt.add_child(header) + var v_separation = get_theme_constant('v_separation') + header.position = scrl.position - Vector2(0, header.size.y + v_separation) + scroll = scrl + scroll_adj = scrl.position ## Перемещает указатель на одну строку вверх func selector_up(): - var i_rows: = [] - get_selected_rows(i_rows) - for i in i_rows: - set_row_selected(i, false) - var rows_count: = get_rows_count() - if not (i_rows.size() and (rows_count > 1)): - return - var i_row = i_rows[0] - i_row -= 1 - if i_row < 0: - i_row = rows_count - 1 - set_row_selected(i_row, true) - var node = get_node2(0, i_row) - if scroll is ScrollContainer: - scroll.ensure_control_visible(node) - emit_signal('selected_changed', i_row) + var i_rows: = [] + get_selected_rows(i_rows) + for i in i_rows: + set_row_selected(i, false) + var rows_count: = get_rows_count() + if not (i_rows.size() and (rows_count > 1)): + return + var i_row = i_rows[0] + i_row -= 1 + if i_row < 0: + i_row = rows_count - 1 + set_row_selected(i_row, true) + var node = get_node2(0, i_row) + if scroll is ScrollContainer: + scroll.ensure_control_visible(node) + emit_signal('selected_changed', i_row) ## Перемещает указатель на одну строку вниз func selector_down(): - var i_rows: = [] - get_selected_rows(i_rows) - for i in i_rows: - set_row_selected(i, false) - var rows_count: = get_rows_count() - if not (i_rows.size() and (rows_count > 1)): - return - var i_row = i_rows[0] - i_row += 1 - i_row %= rows_count - set_row_selected(i_row, true) - var node = get_node2(0, i_row) - if scroll is ScrollContainer: - scroll.ensure_control_visible(node) - emit_signal('selected_changed', i_row) + var i_rows: = [] + get_selected_rows(i_rows) + for i in i_rows: + set_row_selected(i, false) + var rows_count: = get_rows_count() + if not (i_rows.size() and (rows_count > 1)): + return + var i_row = i_rows[0] + i_row += 1 + i_row %= rows_count + set_row_selected(i_row, true) + var node = get_node2(0, i_row) + if scroll is ScrollContainer: + scroll.ensure_control_visible(node) + emit_signal('selected_changed', i_row) ## Делает ряд [param i_row] видимым. func ensure_row_visible(i_row: int): - assert(scroll is ScrollContainer, 'Таблица должна быть дочерней к ScrollContainer') - var key: = get_node_key(NODE_KEY_FORMAT, 0, i_row) - var node = nodes[key] - scroll.ensure_control_visible(node) + assert(scroll is ScrollContainer, 'Таблица должна быть дочерней к ScrollContainer') + var key: = get_node_key(NODE_KEY_FORMAT, 0, i_row) + var node = nodes[key] + scroll.ensure_control_visible(node) ## Устанавливает выравнивание из массива [param alignments] для всех колонок. func set_columns_alignments(alignments: Array): - assert(columns == alignments.size()) - var rows_count: = get_rows_count() - for i_row in rows_count: - for i_col in alignments.size(): - set_node_alligment(i_col, i_row, alignments[i_col]) + assert(columns == alignments.size()) + var rows_count: = get_rows_count() + for i_row in rows_count: + for i_col in alignments.size(): + set_node_alligment(i_col, i_row, alignments[i_col]) ## func load_selector_scene(file_name: String): - selector_type_file = file_name - ScnSelector = load(file_name) + selector_type_file = file_name + ScnSelector = load(file_name) ## func load_node_scene(file_name: String): - node_type_file = file_name - ScnNode = load(file_name) + node_type_file = file_name + ScnNode = load(file_name) ## func _ready(): - ScnSelector = load(selector_type_file) - ScnNode = load(node_type_file) - assert(ScnSelector is PackedScene) - assert(ScnNode is PackedScene) + ScnSelector = load(selector_type_file) + ScnNode = load(node_type_file) + assert(ScnSelector is PackedScene) + assert(ScnNode is PackedScene) ## Выравнивает по нижнему левому углу. Используется для выравнивания по заголовку. func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)): - position.x = hdr.position.x + gap.x - position.y = hdr.position.y + hdr.size.y + gap.y + position.x = hdr.position.x + gap.x + position.y = hdr.position.y + hdr.size.y + gap.y ## Устанавливает пользовательские данные для ячейки.[br] @@ -153,9 +153,9 @@ func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)): ## [param pname] - Имя пользовательских данных.[br] ## [param val] - Значение пользовательских данных.[br] func set_node_meta(i_col: int, i_row: int, pname: String, val) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.set_meta(pname, val) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.set_meta(pname, val) ## Возвращает пользовательские данные для ячейки.[br] @@ -163,10 +163,10 @@ func set_node_meta(i_col: int, i_row: int, pname: String, val) -> void: ## [param i_row] - Индекс ряда.[br] ## [param pname] - Имя пользовательских данных.[br] func get_node_meta(i_col: int, i_row: int, pname: String): - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - assert_meta(i_col, i_row, pname, node) - return node.get_meta(pname) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + assert_meta(i_col, i_row, pname, node) + return node.get_meta(pname) ## Устанавливает свойство ячейки.[br] @@ -176,9 +176,9 @@ func get_node_meta(i_col: int, i_row: int, pname: String): ## [param val] - Значение свойства.[br] ## [i]Свойство[/i] [param pname] [i]ячейки должно существовать.[/i] func set_node_property(i_col: int, i_row: int, pname: String, val) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.set(pname, val) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.set(pname, val) ## Возвращает значение поля ячейки.[br] @@ -186,9 +186,9 @@ func set_node_property(i_col: int, i_row: int, pname: String, val) -> void: ## [param i_col] - Индекс колонки.[br] ## [param i_row] - Индекс ряда. func get_node_property(i_col: int, i_row: int, pname: String): - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - return node.get(pname) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + return node.get(pname) ## Возвращает ключ для существующей ячейки. Если ячейки с заданными индексами нет, @@ -196,313 +196,313 @@ func get_node_property(i_col: int, i_row: int, pname: String): ## [param i_col] - Индекс колонки.[br] ## [param i_row] - Индекс ряда func get_node_key(format: String, i_col: int, i_row: int) -> String: - var key: String = format % [i_row, i_col] - assert(nodes.has(key), 'ошибка: нет такой ячейки - колонка:%d ряд:%d' % [i_col, i_row]) - return key + var key: String = format % [i_row, i_col] + assert(nodes.has(key), 'ошибка: нет такой ячейки - колонка:%d ряд:%d' % [i_col, i_row]) + return key ## Возвращает массив с индексом ячейки:[br] ## [b][0][/b] - индекс колонки,[br] ## [b][1][/b] - индекс строки. func get_key_indexes(key: String) -> Array: - var tokens: = key.split('_') - assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key) - return [int(tokens[2]), int(tokens[1])] + var tokens: = key.split('_') + assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key) + return [int(tokens[2]), int(tokens[1])] ## func set_columns_min_size(sizes: Array) -> void: - assert((columns == 1) or (columns == sizes.size())) - columns = sizes.size() - var rows_count: = get_rows_count() - columns_min_size.clear() - for sz in sizes: - columns_min_size.append(sz) - for i_row in rows_count: - set_nodes_min_size(i_row, sizes, NODE_KEY_FORMAT) - if nodes.has(HEAD_KEY_FORMAT % [0, 0]): - set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) + assert((columns == 1) or (columns == sizes.size())) + columns = sizes.size() + var rows_count: = get_rows_count() + columns_min_size.clear() + for sz in sizes: + columns_min_size.append(sz) + for i_row in rows_count: + set_nodes_min_size(i_row, sizes, NODE_KEY_FORMAT) + if nodes.has(HEAD_KEY_FORMAT % [0, 0]): + set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) ## func set_columns_aligment(alignments: Array) -> void: - var rows_count: = get_rows_count() - for i_row in rows_count: - for i_col in alignments.size(): - set_node_alligment(i_col, i_row, alignments[i_col]) + var rows_count: = get_rows_count() + for i_row in rows_count: + for i_col in alignments.size(): + set_node_alligment(i_col, i_row, alignments[i_col]) ## func _input(event) -> void: - if not is_visible_in_tree(): return - if event is InputEventKey: - if event.pressed and in_focus: - if event.keycode == selector_key_up: - selector_up() - elif event.keycode == selector_key_down: - selector_down() - elif event is InputEventMouseButton: - if not event.pressed: - return - if check_event_pos(event.position, scroll): - if not in_focus: - in_focus = true - emit_signal('focus_entered') - elif not check_event_pos(event.position, scroll): - if in_focus: - in_focus = false - emit_signal('focus_exited') + if not is_visible_in_tree(): return + if event is InputEventKey: + if event.pressed and in_focus: + if event.keycode == selector_key_up: + selector_up() + elif event.keycode == selector_key_down: + selector_down() + elif event is InputEventMouseButton: + if not event.pressed: + return + if check_event_pos(event.position, scroll): + if not in_focus: + in_focus = true + emit_signal('focus_entered') + elif not check_event_pos(event.position, scroll): + if in_focus: + in_focus = false + emit_signal('focus_exited') ## func _init() -> void: - selector_color_proc = Callable(self, 'defaultselector_color_proc') - assert(selector_color_proc.is_valid()) - selector_size_proc = Callable(self, 'default_selector_size_proc') - assert(selector_size_proc.is_valid()) - scroll = self + selector_color_proc = Callable(self, 'defaultselector_color_proc') + assert(selector_color_proc.is_valid()) + selector_size_proc = Callable(self, 'default_selector_size_proc') + assert(selector_size_proc.is_valid()) + scroll = self ## func check_event_pos(event_pos: Vector2, obj: Control): - return \ - (event_pos.x > obj.position.x) \ - and (event_pos.x < (obj.position.x + obj.size.x)) \ - and (event_pos.y > obj.position.y) \ - and (event_pos.y < (obj.position.y + obj.size.y)) + return \ + (event_pos.x > obj.position.x) \ + and (event_pos.x < (obj.position.x + obj.size.x)) \ + and (event_pos.y > obj.position.y) \ + and (event_pos.y < (obj.position.y + obj.size.y)) ## func setselector_color_proc(instance: Object, function: String) -> void: - selector_color_proc = Callable(instance, function) - assert(selector_color_proc.is_valid()) + selector_color_proc = Callable(instance, function) + assert(selector_color_proc.is_valid()) ## func set_selector_size_proc(instance: Object, function: String) -> void: - selector_size_proc = Callable(instance, function) - assert(selector_size_proc.is_valid()) + selector_size_proc = Callable(instance, function) + assert(selector_size_proc.is_valid()) ## [param i_row] - Индекс ряда func default_selector_size_proc(i_row: int, rect: Array) -> void: - get_row_rect(i_row, rect) - rect[0] += position.x - node_gap.x / 2.0 - rect[1] += position.y - node_gap.y / 2.0 - rect[2] += node_gap.x - rect[3] += node_gap.y + get_row_rect(i_row, rect) + rect[0] += position.x - node_gap.x / 2.0 + rect[1] += position.y - node_gap.y / 2.0 + rect[2] += node_gap.x + rect[3] += node_gap.y ## func clear_rows_selected(): - var rows_count: = get_rows_count() - for i_row in rows_count: - set_row_selected(i_row, false) + var rows_count: = get_rows_count() + for i_row in rows_count: + set_row_selected(i_row, false) ## [param i_row] - Индекс ряда. func set_row_selected(i_row: int, selected: bool = true) -> void: - call_deferred('_set_row_selected', i_row, selected) + call_deferred('_set_row_selected', i_row, selected) ## [param i_row] - Индекс ряда. func _set_row_selected(i_row: int, selected: bool = true) -> void: - var selector_key: = SELECTOR_KEY_FORMAT % [i_row, 0] - var node_key: = NODE_KEY_FORMAT % [i_row, 0] - if not nodes.has(node_key): - push_error('ошибка: нет такого ряда: %d' % i_row) - return - if nodes.has(selector_key) and (not selected): - var node = nodes[node_key] - var selector = nodes[selector_key] - node.remove_child(selector) - selector.queue_free() - nodes.erase(selector_key) - elif (not nodes.has(selector_key)) and selected: - var selector = ScnSelector.instantiate() - var rect: = [0, 0, 0, 0] - selector_size_proc.call(i_row, rect) - selector.size.x = rect[2] - selector.size.y = rect[3] - selector.modulate = selector_color_proc.call(i_row) - selector.z_index = z_index + 1 - nodes[selector_key] = selector - var node = nodes[node_key] - node.add_child(selector) + var selector_key: = SELECTOR_KEY_FORMAT % [i_row, 0] + var node_key: = NODE_KEY_FORMAT % [i_row, 0] + if not nodes.has(node_key): + push_error('ошибка: нет такого ряда: %d' % i_row) + return + if nodes.has(selector_key) and (not selected): + var node = nodes[node_key] + var selector = nodes[selector_key] + node.remove_child(selector) + selector.queue_free() + nodes.erase(selector_key) + elif (not nodes.has(selector_key)) and selected: + var selector = ScnSelector.instantiate() + var rect: = [0, 0, 0, 0] + selector_size_proc.call(i_row, rect) + selector.size.x = rect[2] + selector.size.y = rect[3] + selector.modulate = selector_color_proc.call(i_row) + selector.z_index = z_index + 1 + nodes[selector_key] = selector + var node = nodes[node_key] + node.add_child(selector) ## [param i_row] - Индекс ряда. func is_row_selected(i_row: int) -> bool: - var key: = SELECTOR_KEY_FORMAT % [i_row, 0] - return nodes.has(key) + var key: = SELECTOR_KEY_FORMAT % [i_row, 0] + return nodes.has(key) ## [param i_row] - Индексы рядов. func get_selected_rows(i_rows: Array) -> void: - for key in nodes.keys(): - if SLCT_PREFIX in key: - var indexes = get_key_indexes(key) - i_rows.append(indexes[1]) + for key in nodes.keys(): + if SLCT_PREFIX in key: + var indexes = get_key_indexes(key) + i_rows.append(indexes[1]) ## Возвращает количество рядов func get_rows_count() -> int: - var nodes_count: int = 0 - for key in nodes: - nodes_count += int(NODE_PREFIX in key) - return nodes_count / columns + var nodes_count: int = 0 + for key in nodes: + nodes_count += int(NODE_PREFIX in key) + return nodes_count / columns ## [param i_col] - Индекс колонки. [param i_row] - Индекс ряда. func get_node2(i_col: int, i_row: int) -> Node: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - return nodes[key] + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + return nodes[key] ## Добавляет ряд. [param row_types] - Массив типов ячеек ряда func add_row(row_types: Array) -> void: - assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) - if columns == 1: - set_columns(row_types.size()) - else: - assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) - var i_row: int = get_rows_count() - assert(i_row < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) - var allow_set_size = columns_min_size.size() >= row_types.size() - for i_col in columns: - var node_type = row_types[i_col] - var node = node_type.instantiate() - assert(node.name == node.name, 'ошибка: экземпляр не имеет поля \"name\"') - var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] - node.name = node_key - add_child(node) - if allow_set_size: - node.custom_minimum_size.x = columns_min_size[i_col] - node.set_deferred('size.x', columns_min_size[i_col]) - nodes[node_key] = node - var conn = Callable(self, '_on_focus_entered').bind(node) - node.connect('focus_entered', conn) - set_node_meta(i_col, i_row, 'callable_focus_entered', conn) + assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(row_types.size()) + else: + assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) + var i_row: int = get_rows_count() + assert(i_row < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) + var allow_set_size = columns_min_size.size() >= row_types.size() + for i_col in columns: + var node_type = row_types[i_col] + var node = node_type.instantiate() + assert(node.name == node.name, 'ошибка: экземпляр не имеет поля \"name\"') + var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] + node.name = node_key + add_child(node) + if allow_set_size: + node.custom_minimum_size.x = columns_min_size[i_col] + node.set_deferred('size.x', columns_min_size[i_col]) + nodes[node_key] = node + var conn = Callable(self, '_on_focus_entered').bind(node) + node.connect('focus_entered', conn) + set_node_meta(i_col, i_row, 'callable_focus_entered', conn) ## func _on_focus_entered(node): - var indexes = get_key_indexes(node.name) - emit_signal('row_pressed', indexes[1]) + var indexes = get_key_indexes(node.name) + emit_signal('row_pressed', indexes[1]) ## func set_header(header_types: Array): - assert(header_types.size() < MAX_INDEX, 'ошибка: количество колонок в заголовке: %d больше допустимого: %d' % [header_types.size(), MAX_INDEX + 1]) - if columns == 1: - set_columns(header_types.size()) - else: - assert(columns == header_types.size(), 'ошибка: количество колонок в заголовке %d, но ранее установлено: %d' % [header_types.size(), columns]) - var do_adj: = false - if not header: - header = GridContainer.new() - var parent = scroll.get_parent() - parent.add_child(header) - header.position = position - header.columns = header_types.size() - do_adj = true - else: - var childrens = header.get_children() - for node in childrens: - childrens.erase(node.name) - childrens.remove_child(node) - node.queue_free() - for i_col in columns: - var node = header_types[i_col].instantiate() - var key: String = HEAD_KEY_FORMAT % [0, i_col] - node.name = key - nodes[key] = node - header.add_child(node) - if do_adj: - var rect = [0, 0, 0, 0] - get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) - position.y += rect[3] + assert(header_types.size() < MAX_INDEX, 'ошибка: количество колонок в заголовке: %d больше допустимого: %d' % [header_types.size(), MAX_INDEX + 1]) + if columns == 1: + set_columns(header_types.size()) + else: + assert(columns == header_types.size(), 'ошибка: количество колонок в заголовке %d, но ранее установлено: %d' % [header_types.size(), columns]) + var do_adj: = false + if not header: + header = GridContainer.new() + var parent = scroll.get_parent() + parent.add_child(header) + header.position = position + header.columns = header_types.size() + do_adj = true + else: + var childrens = header.get_children() + for node in childrens: + childrens.erase(node.name) + childrens.remove_child(node) + node.queue_free() + for i_col in columns: + var node = header_types[i_col].instantiate() + var key: String = HEAD_KEY_FORMAT % [0, i_col] + node.name = key + nodes[key] = node + header.add_child(node) + if do_adj: + var rect = [0, 0, 0, 0] + get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) + position.y += rect[3] ## func set_header_text(headers: Array): - assert(columns == headers.size()) - set_row_text(0, headers, 0, HEAD_KEY_FORMAT) + assert(columns == headers.size()) + set_row_text(0, headers, 0, HEAD_KEY_FORMAT) ## [param i_row] - индекс ряда. func remove_row(i_row: int): - var sel_key: String = SELECTOR_KEY_FORMAT % [i_row, 0] + var sel_key: String = SELECTOR_KEY_FORMAT % [i_row, 0] - if nodes.has(sel_key): - var selector = nodes[sel_key] - var prnt = selector.get_parent() - prnt.remove_child(selector) - selector.queue_free() - nodes.erase(sel_key) + if nodes.has(sel_key): + var selector = nodes[sel_key] + var prnt = selector.get_parent() + prnt.remove_child(selector) + selector.queue_free() + nodes.erase(sel_key) - for i_col in columns: + for i_col in columns: - var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] - var node = nodes[node_key] + var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] - var conn = get_node_meta(i_col, i_row, 'callable_focus_entered') - node.disconnect('focus_entered', conn) + var conn = get_node_meta(i_col, i_row, 'callable_focus_entered') + node.disconnect('focus_entered', conn) - if node.has_meta(META_CALLABLE): - conn = node.get_meta(META_CALLABLE) - var event_name = node.get_meta(META_EVENT_NAME) - node.disconnect(event_name, conn) + if node.has_meta(META_CALLABLE): + conn = node.get_meta(META_CALLABLE) + var event_name = node.get_meta(META_EVENT_NAME) + node.disconnect(event_name, conn) - remove_child(node) - nodes.erase(node_key) - node.queue_free() - rehash() + remove_child(node) + nodes.erase(node_key) + node.queue_free() + rehash() ## func next_index(indexes: Array) -> void: - indexes[0].x += 1 - if indexes[0].x == columns: - indexes[0].x = 0 - indexes[0].y += 1 + indexes[0].x += 1 + if indexes[0].x == columns: + indexes[0].x = 0 + indexes[0].y += 1 ## func swap_nodes(nodes_copy, node_key_format, i0, i1) -> void: - var key0 = node_key_format % [i0.y, i0.x] - var key1 = node_key_format % [i1.y, i1.x] - nodes_copy[key1] = nodes[key0] - nodes_copy[key1].name = key1 + var key0 = node_key_format % [i0.y, i0.x] + var key1 = node_key_format % [i1.y, i1.x] + nodes_copy[key1] = nodes[key0] + nodes_copy[key1].name = key1 ## Переназначает ключи в соответствии с размерами таблицы. func rehash(): - var i_node: = [Vector2i()] - var i_hdr: = [Vector2i()] - var i_slct: = [Vector2i()] - var nodes_copy = {} - for key in nodes: - var iv = get_key_indexes(key) - var i0 = Vector2(iv[0], iv[1]) - if HEAD_PREFIX in key: - swap_nodes(nodes_copy, HEAD_KEY_FORMAT, i0, i_hdr[0]) - next_index(i_hdr) - elif NODE_PREFIX in key: - swap_nodes(nodes_copy, NODE_KEY_FORMAT, i0, i_node[0]) - next_index(i_node) - elif SLCT_PREFIX in key: - swap_nodes(nodes_copy, SELECTOR_KEY_FORMAT, i0, i_slct[0]) - next_index(i_slct) - nodes.clear() - nodes.merge(nodes_copy) + var i_node: = [Vector2i()] + var i_hdr: = [Vector2i()] + var i_slct: = [Vector2i()] + var nodes_copy = {} + for key in nodes: + var iv = get_key_indexes(key) + var i0 = Vector2(iv[0], iv[1]) + if HEAD_PREFIX in key: + swap_nodes(nodes_copy, HEAD_KEY_FORMAT, i0, i_hdr[0]) + next_index(i_hdr) + elif NODE_PREFIX in key: + swap_nodes(nodes_copy, NODE_KEY_FORMAT, i0, i_node[0]) + next_index(i_node) + elif SLCT_PREFIX in key: + swap_nodes(nodes_copy, SELECTOR_KEY_FORMAT, i0, i_slct[0]) + next_index(i_slct) + nodes.clear() + nodes.merge(nodes_copy) ## Удаляет все строки таблицы func clear_rows() -> void: - var rows_count: int = get_rows_count() - for i_row in range(rows_count - 1, -1, -1): - remove_row(i_row) + var rows_count: int = get_rows_count() + for i_row in range(rows_count - 1, -1, -1): + remove_row(i_row) ## Настраевает обратные вызовы для колонок.[br] @@ -512,57 +512,57 @@ func clear_rows() -> void: ## [param clmns] - Индексы колонок[br] ## [param user_data] - Аргументы функции получателя события[br] func connect_columns(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array = []) -> void: - var rows_count = get_rows_count() - for i_row in rows_count: - for i_col in clmns: - assert(i_col >= 0 and i_col < columns, 'ошибка: нет такой колонки: %d' % i_col) - var node = get_node2(i_col, i_row) - if node.has_meta(META_CALLABLE): - var conn_prev = node.get_meta(META_CALLABLE) - node.disconnect(event_name, conn_prev) - var conn = Callable(dest_node, callback).bind([node] + user_data) - var rc = node.connect(event_name, conn) - if rc == Error.OK: - node.set_meta(META_CALLABLE, conn) - node.set_meta(META_EVENT_NAME, event_name) - else: - var es = error_string(rc) - push_error('ошибка: событие \"%s\" не может быть подключено к %s: %s' % [event_name, node, es]) + var rows_count = get_rows_count() + for i_row in rows_count: + for i_col in clmns: + assert(i_col >= 0 and i_col < columns, 'ошибка: нет такой колонки: %d' % i_col) + var node = get_node2(i_col, i_row) + if node.has_meta(META_CALLABLE): + var conn_prev = node.get_meta(META_CALLABLE) + node.disconnect(event_name, conn_prev) + var conn = Callable(dest_node, callback).bind([node] + user_data) + var rc = node.connect(event_name, conn) + if rc == Error.OK: + node.set_meta(META_CALLABLE, conn) + node.set_meta(META_EVENT_NAME, event_name) + else: + var es = error_string(rc) + push_error('ошибка: событие \"%s\" не может быть подключено к %s: %s' % [event_name, node, es]) ## func set_rows_text(rows: Array) -> void: - for i_row in rows.size(): - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.text = rows[i_row][i_col] + for i_row in rows.size(): + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.text = rows[i_row][i_col] ## [param i_row] - Индекс ряда. func set_nodes_min_size(i_row: int, sizes: Array, key_format: String = NODE_KEY_FORMAT) -> void: - columns_min_size.clear() - for sz in sizes: - columns_min_size.append(sz) - for i_col in columns: - var key: = get_node_key(key_format, i_col, i_row) - var node = nodes[key] - node.custom_minimum_size.x = sizes[i_col] - node.set_deferred('size.x', sizes[i_col]) + columns_min_size.clear() + for sz in sizes: + columns_min_size.append(sz) + for i_col in columns: + var key: = get_node_key(key_format, i_col, i_row) + var node = nodes[key] + node.custom_minimum_size.x = sizes[i_col] + node.set_deferred('size.x', sizes[i_col]) ## [param i_col] - Индекс колонки.[br][param i_row] - Индекс ряда. func set_node_text(i_col: int, i_row: int, val: String) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].text = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].text = val ## func set_rows_state(rows: Array) -> void: - for i_row in rows.size(): - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].button_pressed = rows[i_row][i_col] + for i_row in rows.size(): + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].button_pressed = rows[i_row][i_col] ## Устанавливает состояние ячейки. @@ -571,59 +571,59 @@ func set_rows_state(rows: Array) -> void: ## [param val] - Новое состояние.[br] ## [i]Ячейка должна иметь свойство[/i] [param button_pressed] func set_node_state(i_col: int, i_row: int, val: bool) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].button_pressed = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].button_pressed = val ## [param i_col] - Индекс колонки.[br] ## [param i_row] - Индекс ряда. func set_node_frame(i_col: int, i_row: int, node_name: String, val: int) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - var sprite = node.get_node(node_name) - sprite.frame = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + var sprite = node.get_node(node_name) + sprite.frame = val ## Разрешает редактирование ячейки. Ячейка должна иметь свойство [param editable].[br] ## [param i_col] - Индекс колонки.[br] ## [param i_row] - Индекс ряда. func set_node_editable(i_col: int, i_row: int, val: bool) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].editable = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].editable = val ## Разрешает редактирование ряда. Ячейки ряда должны иметь свойство [param editable].[br] ## [param i_row] - Индекс ряда. func set_row_editable(i_row: int, val: bool) -> void: - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].editable = val + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].editable = val ## [param i_col] - Индекс колонки.[br] ## [param i_row] - Индекс ряда. func set_node_alligment(i_col: int, i_row: int, val: int) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - if 'horizontal_alignment' in nodes[key]: - nodes[key].horizontal_alignment = val - elif 'alignment' in nodes[key]: - nodes[key].alignment = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + if 'horizontal_alignment' in nodes[key]: + nodes[key].horizontal_alignment = val + elif 'alignment' in nodes[key]: + nodes[key].alignment = val ## [param i_row] - Индекс ряда. func set_row_alligments(i_row: int, aligns: Array) -> void: - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].align = aligns[i_col] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].align = aligns[i_col] ## [param i_row] - Индекс ряда. func get_row_text(i_row: int) -> Array: - var row: = [] - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - row.append(nodes[key].text) - return row + var row: = [] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + row.append(nodes[key].text) + return row ## Устанавливает текст ячеек ряда.[br] @@ -632,51 +632,51 @@ func get_row_text(i_row: int) -> Array: ## [param i_begin] - Начальный индекс колонки начиная с которого установить новые значения.[br] ## [i]Ячейки ряда должны иметь свойство[/i] [param text] func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void: - assert((i_begin >= 0) and (i_begin < columns)) - assert((columns - i_begin) >= row.size()) - for i_col in row.size(): - var key: = get_node_key(key_format, i_col + i_begin, i_row) - nodes[key].text = row[i_col] + assert((i_begin >= 0) and (i_begin < columns)) + assert((columns - i_begin) >= row.size()) + for i_col in row.size(): + var key: = get_node_key(key_format, i_col + i_begin, i_row) + nodes[key].text = row[i_col] ## Возвращает все строки таблицы в двумерном массиве func get_rows_text() -> Array: - var rows_count: = get_rows_count() - var rows: = [] - for i_row in rows_count: - var row = get_row_text(i_row) - rows.append(row) - return rows + var rows_count: = get_rows_count() + var rows: = [] + for i_row in rows_count: + var row = get_row_text(i_row) + rows.append(row) + return rows ## Возвращает массив ячеек из ряда [param i_row] func get_row(i_row: int) -> Array: - var row: = [] - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - row.append(nodes[key]) - return row + var row: = [] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + row.append(nodes[key]) + return row ## Возвращает прямоугольник [param rect] занимаемый ячейкой в ряду [param i_row] и колонке [param i_col]. ## [param key_format] - Формат ключа ячейки func get_node_rect(i_col: int, i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: - assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') - var key: = get_node_key(key_format, i_col, i_row) - var cell = nodes[key] - rect[0] = cell.position.x - rect[1] = cell.position.y - rect[2] = cell.size.x - rect[3] = cell.size.y + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var key: = get_node_key(key_format, i_col, i_row) + var cell = nodes[key] + rect[0] = cell.position.x + rect[1] = cell.position.y + rect[2] = cell.size.x + rect[3] = cell.size.y ## Возвращает прямоугольник [param rect] занимаемый рядом [param i_row].[br] ## [param key_format] - Формат ключа ячейки func get_row_rect(i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: - assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') - var cell0 = nodes[get_node_key(key_format, 0, i_row)] - var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] - rect[0] = cell0.position.x + scroll_adj.x - rect[1] = cell0.position.y + scroll_adj.y - rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x - rect[3] = cell0.size.y + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var cell0 = nodes[get_node_key(key_format, 0, i_row)] + var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] + rect[0] = cell0.position.x + scroll_adj.x + rect[1] = cell0.position.y + scroll_adj.y + rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x + rect[3] = cell0.size.y From 271b2411cb65cb2fc89183251c9214a2b537bebf Mon Sep 17 00:00:00 2001 From: lepshiy Date: Mon, 30 Sep 2024 11:27:27 +0300 Subject: [PATCH 02/26] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D1=8B=20=D0=B2=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/Control.gd | 12 ++++ scenes/tilemap/navig.tscn | 3 + scenes/настройки/GridContainer.gd | 1 + scenes/настройки/нас1E59.tmp | 102 ++++++++++++++++++++++++++++++ scenes/работа/CharacterBody2D.gd | 28 ++++++++ table/editl.tscn | 5 ++ table/empti.tscn | 5 ++ table/lable.tscn | 16 +++++ table/taggle.tscn | 13 ++++ 9 files changed, 185 insertions(+) create mode 100644 scenes/tilemap/Control.gd create mode 100644 scenes/tilemap/navig.tscn create mode 100644 scenes/настройки/GridContainer.gd create mode 100644 scenes/настройки/нас1E59.tmp create mode 100644 scenes/работа/CharacterBody2D.gd create mode 100644 table/editl.tscn create mode 100644 table/empti.tscn create mode 100644 table/lable.tscn create mode 100644 table/taggle.tscn diff --git a/scenes/tilemap/Control.gd b/scenes/tilemap/Control.gd new file mode 100644 index 0000000..4b5c358 --- /dev/null +++ b/scenes/tilemap/Control.gd @@ -0,0 +1,12 @@ +extends Control + +var scene_list=[] + +func node_list(node): + scene_list.append(node) + +func _enter_tree(): + get_tree().node_added.connect(self.node_list) +func _ready(): + get_tree().node_added.disconnect(self.node_list) #should be first string in _ready() + print(scene_list) diff --git a/scenes/tilemap/navig.tscn b/scenes/tilemap/navig.tscn new file mode 100644 index 0000000..a2178f3 --- /dev/null +++ b/scenes/tilemap/navig.tscn @@ -0,0 +1,3 @@ +[gd_scene format=3 uid="uid://e3sw6q228iai"] + +[node name="Navig" type="Node2D"] diff --git a/scenes/настройки/GridContainer.gd b/scenes/настройки/GridContainer.gd new file mode 100644 index 0000000..41bed78 --- /dev/null +++ b/scenes/настройки/GridContainer.gd @@ -0,0 +1 @@ +extends "res://table/table.gd" diff --git a/scenes/настройки/нас1E59.tmp b/scenes/настройки/нас1E59.tmp new file mode 100644 index 0000000..4dd57e8 --- /dev/null +++ b/scenes/настройки/нас1E59.tmp @@ -0,0 +1,102 @@ +[gd_scene load_steps=4 format=3 uid="uid://bnptm4rlp60dq"] + +[ext_resource type="Script" path="res://scenes/настройки/настройки.gd" id="1_2l3rd"] +[ext_resource type="Script" path="res://table/table.gd" id="2_ts42i"] + +[sub_resource type="GDScript" id="GDScript_anjmx"] +script/source = "extends LineEdit + +func _ready() -> void: text = ProjectSettings.get('application/config/map_server_addr') + + +func _on_text_changed(new_text: String) -> void: + ProjectSettings.set('application/config/map_server_addr', new_text) + ProjectSettings.save_custom('override.cfg') +" + +[node name="Настройки" type="Panel"] +script = ExtResource("1_2l3rd") + +[node name="table" type="GridContainer" parent="."] +layout_mode = 2 +offset_left = 32.0 +offset_top = 96.0 +offset_right = 241.0 +offset_bottom = 535.0 +columns = 2 +script = ExtResource("2_ts42i") + +[node name="Label1" type="Label" parent="."] +layout_mode = 0 +offset_left = 16.0 +offset_top = 60.0 +offset_right = 434.0 +offset_bottom = 82.0 +text = "Управление элементами в режиме с ограниченным доступом" + +[node name="Label2" type="Label" parent="."] +layout_mode = 0 +offset_left = 16.0 +offset_top = 20.0 +offset_right = 476.0 +offset_bottom = 50.0 +text = "Текущий режим доступа: полный" +vertical_alignment = 1 + +[node name="edt_mapaddr" type="LineEdit" parent="."] +layout_mode = 0 +offset_left = 660.0 +offset_top = 80.0 +offset_right = 1032.0 +offset_bottom = 110.0 +script = SubResource("GDScript_anjmx") + +[node name="Label" type="Label" parent="edt_mapaddr"] +layout_mode = 0 +offset_left = -180.0 +offset_right = -20.0 +offset_bottom = 30.0 +text = "Адрес сервера карт:" +vertical_alignment = 1 + +[node name="GridContainer2" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 478.0 +offset_top = 154.0 +offset_right = 784.0 +offset_bottom = 260.0 +columns = 2 + +[node name="external_cu_lbl" type="Label" parent="GridContainer2"] +layout_mode = 2 +text = "Внешнее целеуказание." +vertical_alignment = 1 + +[node name="external_cu_btn" type="CheckButton" parent="GridContainer2"] +layout_mode = 2 + +[node name="Label19" type="Label" parent="GridContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Кнопка «Подавление». +Отключить отображение этой кнопки, +что бы тип помех применялся сразу." + +[node name="CheckButton18" type="CheckButton" parent="GridContainer2"] +layout_mode = 2 +size_flags_horizontal = 6 +size_flags_vertical = 6 +button_pressed = true + +[node name="lbl_commit" type="Label" parent="."] +layout_mode = 0 +offset_left = 480.0 +offset_top = 20.0 +offset_right = 1040.0 +offset_bottom = 50.0 +text = "Текущая версия ПО УАРЭП:" +vertical_alignment = 1 + +[connection signal="text_changed" from="edt_mapaddr" to="edt_mapaddr" method="_on_text_changed"] +[connection signal="pressed" from="GridContainer2/external_cu_btn" to="." method="_on_external_cu_btn_pressed"] diff --git a/scenes/работа/CharacterBody2D.gd b/scenes/работа/CharacterBody2D.gd new file mode 100644 index 0000000..087beec --- /dev/null +++ b/scenes/работа/CharacterBody2D.gd @@ -0,0 +1,28 @@ +class_name characterBody extends CharacterBody2D + + +const SPEED = 300.0 +const JUMP_VELOCITY = -400.0 + +## Получить гравитацию из настроек проекта для синхронизации с узлами RigidBody. +var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") + + +func _physics_process(delta): + # Add the gravity. + if not is_on_floor(): + velocity.y += gravity * delta + + # Handle jump. + if Input.is_action_just_pressed("ui_accept") and is_on_floor(): + velocity.y = JUMP_VELOCITY + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var direction = Input.get_axis("ui_left", "ui_right") + if direction: + velocity.x = direction * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + + move_and_slide() diff --git a/table/editl.tscn b/table/editl.tscn new file mode 100644 index 0000000..3a9aa78 --- /dev/null +++ b/table/editl.tscn @@ -0,0 +1,5 @@ +[gd_scene format=3 uid="uid://bvbvtgwps54yr"] + +[node name="Editl" type="LineEdit"] +caret_blink = true +caret_blink_interval = 0.5 diff --git a/table/empti.tscn b/table/empti.tscn new file mode 100644 index 0000000..25fa862 --- /dev/null +++ b/table/empti.tscn @@ -0,0 +1,5 @@ +[gd_scene format=3 uid="uid://bwesvho0mk6qk"] + +[node name="Empti" type="Label"] +offset_right = 48.0 +offset_bottom = 19.0 diff --git a/table/lable.tscn b/table/lable.tscn new file mode 100644 index 0000000..ad4e6fb --- /dev/null +++ b/table/lable.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=2 format=3 uid="uid://dwphmxstaxn4v"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yign5"] +bg_color = Color(0.117647, 0.117647, 0.117647, 0.85098) +border_width_bottom = 2 +border_color = Color(0.0562916, 0.0562916, 0.0562916, 1) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 5 + +[node name="Lable" type="Label"] +offset_right = 104.0 +offset_bottom = 24.0 +theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_yign5") diff --git a/table/taggle.tscn b/table/taggle.tscn new file mode 100644 index 0000000..823de94 --- /dev/null +++ b/table/taggle.tscn @@ -0,0 +1,13 @@ +[gd_scene format=3 uid="uid://dm7hh7ibuin78"] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 96.0 +offset_bottom = 24.0 + +[node name="CheckButton" type="CheckButton" parent="."] +layout_mode = 0 +offset_left = 30.0 +offset_right = 74.0 +offset_bottom = 24.0 From 443df3a04dec4ddc22e00e7045c8957e09675353 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Mon, 14 Oct 2024 09:43:38 +0300 Subject: [PATCH 03/26] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D0=B8=20=D1=81=20=D1=86?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D1=8E=20(=D0=BD=D0=B0=20=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=83=D1=89=D0=B8=D0=B9=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/работа/работа.gd | 30 +++++++++++++++++++++++------- scripts/interfer.gd | 27 ++++++++++++++++++++++++++- scripts/signaller.gd | 5 +++++ scripts/threats.gd | 8 +++++++- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index d439ea0..84bc34f 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -159,6 +159,7 @@ 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')) + signaller.connect('fs_update_color', Callable(self, 'on_fs_update_color')) func get_all_nodes(root): @@ -186,15 +187,15 @@ func on_threat_update(th): var bip = get_node('%d' % th.id) bip.update() map_threat_to_bip(th, bip) - + ## Обработчик выбора помехи для цели. func on_interfer_new(ecm): if interfer.thrs.has(ecm.ispp): - if interfer.thrs.has(ecm.ispp): - var th_id = interfer.thrs[ecm.ispp] - var bip = get_node('%d' % th_id) - if ecm.krp != interfer.INTERFER_OFF: + var th_id = interfer.thrs[ecm.ispp] + var bip = get_node('%d' % th_id) + if bip!= null: + if ecm.krp!= interfer.INTERFER_OFF: bip.set_track_visible(true) if ecm.svk == 1: bip.set_ecm_visible(true) @@ -202,6 +203,10 @@ func on_interfer_new(ecm): else: bip.set_ecm_visible(false) bip.set_track_visible(false) + else: + interfer.thrs.erase(ecm.ispp) + set_fs_color(ecm) + update_fs_colors() set_fs_color(ecm) @@ -213,6 +218,13 @@ func on_interfer_off_all(): bip.set_track_visible(false) fs_active.clear() update_fs_colors() + + +func on_interfer_off(ecm_id): + fs_active.erase(ecm_id) + fs_selected.erase(ecm_id) + fs_active.clear() + update_fs_colors() ## Обработчик сигнала обнаружения цели. @@ -229,7 +241,6 @@ func on_threat_lost(th) -> void: remove_child(bip) bip.free() - ## обработчик нажатия на цель на экране. func on_bip_pressed(th_id, _ecm_btns): if btn_select == BtnSel.THREAT: @@ -419,7 +430,6 @@ func update_fs_colors(): fs_colors[key] = color_select $canvas.set_band_colors(fs_colors) - func unsel_fs_all(need_btns_off: bool): fs_selected.clear() update_fs_colors() @@ -474,3 +484,9 @@ func set_btns_disabled(value: bool, btn): btn.set_disabled(true) else: btn.set_disabled(value) + +func on_fs_update_color(ecms): + fs_active.clear() + for ecm in ecms.values(): + set_fs_color(ecm) + update_fs_colors() diff --git a/scripts/interfer.gd b/scripts/interfer.gd index f04dd08..6ea7c45 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -112,7 +112,10 @@ func _ready(): signaller.connect('interfer_rcv', Callable(self, 'on_interfer_rcv').bind(unit_5p28, ecms)) signaller.connect('interfer_new', Callable(self, 'send_ecm').bind(unit)) signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit, ecms)) - + signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update').bind(ecms, unit)) + signaller.connect('interfer_off', Callable(self, 'on_interfer_off')) + threats.connect('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit)) + ## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку. func on_timer_check_state(unit, ecms, resend_timeout): @@ -124,6 +127,18 @@ func on_timer_check_state(unit, ecms, resend_timeout): ecm.tick_tx = tick +func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit): + for thr in threats.values(): + var th_id = thr.id + for ecm_i in thrs.keys(): + if thrs[ecm_i] == th_id: + var ecm = ecms[ecm_i] + ecm.params['freq'] = thr.freq + ecm.kni = thr.aoa + send_ecm(ecm, unit) + signaller.emit_signal('fs_update_color', ecms) + + ## Производит приём состояния помех. [param unit] -> [param ecms]. func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): if not unit.json_dic.has('ts'): return @@ -247,6 +262,16 @@ func on_interfer_off_all(unit, ecms): push_id(ecm.ispp) send_ecm(ecm, unit) signaller.emit_signal('interfer_off',ecm, ecms, thrs) + +func on_threats_lost(th, ecms, unit): + for key in interfer.thrs: + if interfer.thrs[key] == th.id: + var ecm_id = key + var ecm = ecms[ecm_id] + ecm.krp = INTERFER_OFF + push_id(ecm.ispp) + send_ecm(ecm, unit) + signaller.emit_signal('interfer_off',ecm, ecms, thrs) func pop_id(): diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 068b44f..60088c6 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -127,3 +127,8 @@ signal map_coords_changed(lan: float, lat: float) ## Вызывается при изменении размера изображения для отображения карты.[br] ## [param mode] - Вновь установленный режим. signal map_mode_changed(mode: int) + +## Вызывается при обновлении позиции(угла) цели.[br] +signal th_aoa_update(threats: Dictionary) + +signal fs_update_color(ecms:Dictionary) diff --git a/scripts/threats.gd b/scripts/threats.gd index 2c47cd5..7e801d4 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -51,11 +51,15 @@ func _ready() -> void: var unit_5p28_key = repsettings.get_unit_key('уарэп-5п28') var unit_5p28 = repnetwork.units_tcp[unit_5p28_key] var timer_check_lost: = Timer.new() + var timer_aoa_update: = Timer.new() add_child(timer_check_lost) + add_child(timer_aoa_update) unit.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(threats)) unit_5p28.connect('get_threats', Callable(self, 'on_get_threats').bind(unit_5p28, threats)) timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(repsettings.ThreatParams.time_lost, threats)) timer_check_lost.start(repsettings.ThreatParams.time_lost / 1000.0) + timer_aoa_update.connect('timeout', Callable(self, 'on_timer_aoa_update').bind(threats)) + timer_aoa_update.start(0.25) signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(threats)) signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(threats)) signaller.connect('rto_threat_unsel_all', Callable(self, 'on_rto_threat_unsel_all').bind(threats)) @@ -72,12 +76,14 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary): call_deferred('emit_signal', 'threat_lost', th) if sz != threats.size(): call_deferred('emit_signal', 'threats_resized', threats) + +func on_timer_aoa_update(threats:Dictionary): + signaller.emit_signal('th_aoa_update', threats) ## отправляет словарь целей в юнит, для запаковки и отправки в 5П28. func on_get_threats(unit, threats): unit.pack_threats(threats) - ## Снимает выделение с цели, если нажать по отметке цели. func on_rto_threat_unsel(th_id, threats): threats[th_id].selected = false From d521415d163a705de4a064fb4c3367278cee749b Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 14 Oct 2024 13:51:02 +0300 Subject: [PATCH 04/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modbus/client-serial-modbus.py | 6 ++---- modbus/server-serial-modbus.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/modbus/client-serial-modbus.py b/modbus/client-serial-modbus.py index e55c0a7..f084d04 100644 --- a/modbus/client-serial-modbus.py +++ b/modbus/client-serial-modbus.py @@ -21,8 +21,7 @@ EXCEPT_MSGS = { 'write': 'ошибка: запись в регистры не выполнена', 'read_holding': 'ошибка: чтение регистров хранения не выполнено', 'read_input': 'ошибка: чтение регистров входов не выполнено', - '': 'ошибка: получена неверная команда' -} + '': 'ошибка: получена неверная команда'} def main(): @@ -57,7 +56,6 @@ def run_sync_client(udp_addr, udp_port_rx, udp_port_tx, serial_port, serial_baud udp_data = udp_data.decode('utf-8') message = json_decoder.decode(udp_data) # type: dict - if 'code' not in message: message['code'] = '' @@ -82,7 +80,7 @@ def run_sync_client(udp_addr, udp_port_rx, udp_port_tx, serial_port, serial_baud rc = rq.isError() if not rc: tx_data = json_encoder.encode({'code': 'response', 'data': rq.registers}) - sock.sendto(bytes(tx_data), (udp_addr, udp_port_tx)) + sock.sendto(bytes(tx_data, 'utf-8'), (udp_addr, udp_port_tx)) elif message['code'] == '': rc = False diff --git a/modbus/server-serial-modbus.py b/modbus/server-serial-modbus.py index a7fbc52..1eb34be 100644 --- a/modbus/server-serial-modbus.py +++ b/modbus/server-serial-modbus.py @@ -60,7 +60,7 @@ def main(): print_opts_error(opts_unk) store = CallbackModbusSlaveContext() context = ModbusServerContext(slaves=store, single=True) - log.info("серевер-заглушка Modbus serial работает: %s:%d" % (opts.serial_port, opts.serial_baud)) + log.info("сервер-заглушка Modbus serial работает: %s:%d" % (opts.serial_port, opts.serial_baud)) StartSerialServer(context=context, framer=ModbusRtuFramer, port=opts.serial_port, timeout=opts.timeout, baudrate=opts.serial_baud) From e7d7f779b59206d5bdb0f4d7f464d553d02a5619 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 15 Oct 2024 08:14:37 +0300 Subject: [PATCH 05/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.tscn | 86 +++++++++++-------- scenes/pribor-prd-n/pribor-prd-n.tscn | 2 +- scenes/pribor-prd-v/pribor-prd-v.tscn | 2 +- scenes/контроль/кассета-у-5-к.tscn | 74 ++++++++++++++++ .../{кассета-у-5.tscn => кассета-у-5-нв.tscn} | 12 +-- scripts/repnetwork.gd | 4 +- scripts/repsettings.gd | 2 +- 7 files changed, 137 insertions(+), 45 deletions(-) create mode 100644 scenes/контроль/кассета-у-5-к.tscn rename scenes/контроль/{кассета-у-5.tscn => кассета-у-5-нв.tscn} (95%) diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index e1dda62..c5f1f93 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -3,7 +3,7 @@ [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="1_8dmgr"] [ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_ufjwe"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_14h25"] -[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5.tscn" id="3_7orfk"] +[ext_resource type="PackedScene" uid="uid://cm5jd4gjrrpba" path="res://scenes/контроль/кассета-у-5-к.tscn" id="2_tb85r"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="6_fmhtx"] [ext_resource type="PackedScene" uid="uid://dbxdb7lo7kofv" path="res://scenes/контроль/кассета-п-1.tscn" id="7_cjjs2"] [ext_resource type="PackedScene" uid="uid://bmagw8nd0ulhj" path="res://scenes/pribor-prd-k/kasseta-fs-kd.tscn" id="7_ia27q"] @@ -18,6 +18,13 @@ offset_right = 15.0 offset_bottom = 30.0 script = ExtResource("1_ufjwe") +[node name="kasseta_u5" parent="." instance=ExtResource("2_tb85r")] +layout_mode = 0 +offset_left = 175.0 +offset_top = 242.0 +offset_right = 485.0 +offset_bottom = 432.0 + [node name="lbl_header" type="Label" parent="."] layout_mode = 0 offset_left = 20.0 @@ -32,36 +39,36 @@ vertical_alignment = 1 [node name="maa2000_A22" parent="." instance=ExtResource("1_8dmgr")] layout_mode = 0 offset_left = 485.0 -offset_top = 877.0 +offset_top = 907.0 offset_right = 645.0 -offset_bottom = 942.0 +offset_bottom = 949.0 fname = "MAA2000" rname = "A22" [node name="dou2_A7" parent="." instance=ExtResource("1_8dmgr")] layout_mode = 0 -offset_left = 485.0 -offset_top = 812.0 -offset_right = 645.0 -offset_bottom = 877.0 +offset_left = 8.0 +offset_top = 862.0 +offset_right = 175.0 +offset_bottom = 907.0 fname = "ДОУ-6" rname = "A7" [node name="maa2000_A23" parent="." instance=ExtResource("1_8dmgr")] layout_mode = 0 -offset_left = 15.0 -offset_top = 877.0 +offset_left = 8.0 +offset_top = 907.0 offset_right = 175.0 -offset_bottom = 942.0 +offset_bottom = 949.0 fname = "MAA2000" rname = "A23" [node name="dou2_A8" parent="." instance=ExtResource("1_8dmgr")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 812.0 offset_right = 175.0 -offset_bottom = 877.0 +offset_bottom = 860.0 fname = "ДОУ-7" rname = "A8" @@ -70,7 +77,7 @@ layout_mode = 0 offset_left = 175.0 offset_top = 812.0 offset_right = 485.0 -offset_bottom = 942.0 +offset_bottom = 949.0 texture = ExtResource("2_14h25") patch_margin_left = 16 patch_margin_top = 16 @@ -203,9 +210,28 @@ name_min_size1 = Vector2i(35, 20) fname = "УМ1535Б" rname = "A15" +[node name="utm80_A9" parent="." instance=ExtResource("6_fmhtx")] +layout_mode = 0 +offset_left = 485.0 +offset_top = 812.0 +offset_right = 645.0 +offset_bottom = 907.0 +value0 = 28.0 +value1 = 57.0 +max_value0 = 99.0 +max_value1 = 99.0 +step0 = 1.0 +step1 = 1.0 +value_name0 = "°C" +value_name1 = "P, %" +name_min_size0 = Vector2i(35, 20) +name_min_size1 = Vector2i(35, 20) +fname = "УТМ80" +rname = "A9" + [node name="um1535_A16" parent="." instance=ExtResource("6_fmhtx")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 242.0 offset_right = 175.0 offset_bottom = 337.0 @@ -219,14 +245,14 @@ value_name0 = "°C" value_name1 = "P, %" name_min_size0 = Vector2i(35, 20) name_min_size1 = Vector2i(35, 20) -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A16" [node name="um1535_A17" parent="." instance=ExtResource("6_fmhtx")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 337.0 -offset_right = 175.0 +offset_right = 173.0 offset_bottom = 432.0 value0 = 28.0 value1 = 57.0 @@ -238,12 +264,12 @@ value_name0 = "°C" value_name1 = "P, %" name_min_size0 = Vector2i(35, 20) name_min_size1 = Vector2i(35, 20) -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A17" [node name="um1535_A18" parent="." instance=ExtResource("6_fmhtx")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 432.0 offset_right = 175.0 offset_bottom = 527.0 @@ -257,12 +283,12 @@ value_name0 = "°C" value_name1 = "P, %" name_min_size0 = Vector2i(35, 20) name_min_size1 = Vector2i(35, 20) -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A18" [node name="um1535_A19" parent="." instance=ExtResource("6_fmhtx")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 527.0 offset_right = 175.0 offset_bottom = 622.0 @@ -276,12 +302,12 @@ value_name0 = "°C" value_name1 = "P, %" name_min_size0 = Vector2i(35, 20) name_min_size1 = Vector2i(35, 20) -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A19" [node name="um1535_A20" parent="." instance=ExtResource("6_fmhtx")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 622.0 offset_right = 175.0 offset_bottom = 717.0 @@ -295,12 +321,12 @@ value_name0 = "°C" value_name1 = "P, %" name_min_size0 = Vector2i(35, 20) name_min_size1 = Vector2i(35, 20) -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A20" [node name="um1535_A21" parent="." instance=ExtResource("6_fmhtx")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 717.0 offset_right = 175.0 offset_bottom = 812.0 @@ -314,17 +340,9 @@ value_name0 = "°C" value_name1 = "P, %" name_min_size0 = Vector2i(35, 20) name_min_size1 = Vector2i(35, 20) -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A21" -[node name="kasseta_u5" parent="." instance=ExtResource("3_7orfk")] -layout_mode = 0 -offset_left = 175.0 -offset_top = 242.0 -offset_right = 485.0 -offset_bottom = 432.0 -fname = "Кассета У5" - [node name="kasseta_fs_kd" parent="." instance=ExtResource("7_ia27q")] layout_mode = 0 offset_left = 175.0 diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index 1a1c81c..e8e9d7e 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_mcea3"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_lpj3d"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_i1no5"] -[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5.tscn" id="5_ej152"] +[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="5_ej152"] [ext_resource type="PackedScene" uid="uid://cd5sue1e8iyrv" path="res://scenes/pribor-prd-n/kasseta-fs-nd.tscn" id="6_1p3pi"] [ext_resource type="PackedScene" uid="uid://dbxdb7lo7kofv" path="res://scenes/контроль/кассета-п-1.tscn" id="7_klldp"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="8_u7eqo"] diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index c1b9fe1..359d924 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_dl7rt"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_xpo4b"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="3_wyy1b"] -[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5.tscn" id="4_gl2bl"] +[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="4_gl2bl"] [ext_resource type="PackedScene" uid="uid://cd5sue1e8iyrv" path="res://scenes/pribor-prd-n/kasseta-fs-nd.tscn" id="5_nhd2k"] [ext_resource type="PackedScene" uid="uid://dbxdb7lo7kofv" path="res://scenes/контроль/кассета-п-1.tscn" id="6_d3awr"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="7_e22c6"] diff --git a/scenes/контроль/кассета-у-5-к.tscn b/scenes/контроль/кассета-у-5-к.tscn new file mode 100644 index 0000000..b32a91c --- /dev/null +++ b/scenes/контроль/кассета-у-5-к.tscn @@ -0,0 +1,74 @@ +[gd_scene load_steps=4 format=3 uid="uid://cm5jd4gjrrpba"] + +[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="1_bdojw"] +[ext_resource type="Script" path="res://scenes/контроль/кассета.gd" id="2_csgh4"] +[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_wtlpi"] + +[node name="kasseta_u5" type="NinePatchRect"] +offset_right = 310.0 +offset_bottom = 190.0 +texture = ExtResource("1_bdojw") +patch_margin_left = 16 +patch_margin_top = 16 +patch_margin_right = 16 +patch_margin_bottom = 16 +script = ExtResource("2_csgh4") + +[node name="lbl_fname" type="Label" parent="."] +self_modulate = Color(1, 1, 1, 0.62) +layout_mode = 0 +offset_left = 5.0 +offset_top = 7.0 +offset_right = 305.0 +offset_bottom = 35.0 +text = "Кассета" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ref_A31" parent="." instance=ExtResource("3_wtlpi")] +offset_left = 5.0 +offset_top = 32.0 +offset_right = 55.0 +offset_bottom = 182.0 +fname = "ИП5-25" +rname = "A31" + +[node name="ref_A37" parent="." instance=ExtResource("3_wtlpi")] +offset_left = 55.0 +offset_top = 32.0 +offset_right = 105.0 +offset_bottom = 182.0 +fname = "ЯУ-07Б" +rname = "A37" + +[node name="ref_A33" parent="." instance=ExtResource("3_wtlpi")] +offset_left = 105.0 +offset_top = 32.0 +offset_right = 155.0 +offset_bottom = 182.0 +fname = "ЭМС-Г" +rname = "A33" + +[node name="ref_A34" parent="." instance=ExtResource("3_wtlpi")] +offset_left = 155.0 +offset_top = 32.0 +offset_right = 205.0 +offset_bottom = 182.0 +fname = "УГ" +rname = "A34" + +[node name="ref_A35" parent="." instance=ExtResource("3_wtlpi")] +offset_left = 205.0 +offset_top = 32.0 +offset_right = 255.0 +offset_bottom = 182.0 +fname = "УКП" +rname = "A35" + +[node name="ref_A36" parent="." instance=ExtResource("3_wtlpi")] +offset_left = 254.0 +offset_top = 32.0 +offset_right = 304.0 +offset_bottom = 182.0 +fname = "УКП" +rname = "A36" diff --git a/scenes/контроль/кассета-у-5.tscn b/scenes/контроль/кассета-у-5-нв.tscn similarity index 95% rename from scenes/контроль/кассета-у-5.tscn rename to scenes/контроль/кассета-у-5-нв.tscn index 61cab59..99f0631 100644 --- a/scenes/контроль/кассета-у-5.tscn +++ b/scenes/контроль/кассета-у-5-нв.tscn @@ -31,7 +31,7 @@ offset_top = 32.0 offset_right = 55.0 offset_bottom = 182.0 fname = "ИП5-25" -rname = "A31" +rname = "A24" [node name="ref_A37" parent="." instance=ExtResource("3_picsk")] offset_left = 55.0 @@ -39,7 +39,7 @@ offset_top = 32.0 offset_right = 105.0 offset_bottom = 182.0 fname = "ЯУ-07Б" -rname = "A37" +rname = "A30" [node name="ref_A33" parent="." instance=ExtResource("3_picsk")] offset_left = 105.0 @@ -47,7 +47,7 @@ offset_top = 32.0 offset_right = 155.0 offset_bottom = 182.0 fname = "ЭМС-Г" -rname = "A33" +rname = "A26" [node name="ref_A34" parent="." instance=ExtResource("3_picsk")] offset_left = 155.0 @@ -55,7 +55,7 @@ offset_top = 32.0 offset_right = 205.0 offset_bottom = 182.0 fname = "УГ" -rname = "A34" +rname = "A27" [node name="ref_A35" parent="." instance=ExtResource("3_picsk")] offset_left = 205.0 @@ -63,7 +63,7 @@ offset_top = 32.0 offset_right = 255.0 offset_bottom = 182.0 fname = "УКП" -rname = "A35" +rname = "A29" [node name="ref_A36" parent="." instance=ExtResource("3_picsk")] offset_left = 254.0 @@ -71,4 +71,4 @@ offset_top = 32.0 offset_right = 304.0 offset_bottom = 182.0 fname = "УКП" -rname = "A36" +rname = "A28" diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 14408ad..2103139 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -84,7 +84,7 @@ func _ready() -> void: dst_ports[unit_key] = settings[2][1] else: dst_ports[unit_key] = settings[2][0] - + if proto in TCP_PROTO: var unit = TCP_PROTO[proto].new(unit_name) var unit_key = repsettings.get_unit_key(unit_name) @@ -94,7 +94,7 @@ func _ready() -> void: unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]]) - + for key in units: log.info('%s %s:%d' % [units[key].name, key[0], key[1]]) for key in units_tcp: log.info('%s %s:%d' % [units_tcp[key].name, key[0], key[1]]) for key in dst_ports: diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index dced683..1ab9381 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -26,7 +26,7 @@ class_name rep_settings extends Node # Название | Протокол | Адрес | Порт получения | Порт отправки | Комментарий 'уарэп-щ3': ['udp-json-mbcs', '127.0.0.1', [48000, 44100], false, true, 'IP-адрес и порты через которые производят обмен сообщения с драйвером клиента Modbus Serial'], - + # Название | Протокол | Имя порта | Скорость, бод | Чётность | Комментарий 'уарэп-спт25-1': ['uart', '/dev/tty2', 115200, false, 'Адрес прибора СПТ-25 (G1)'], 'уарэп-спт25-2': ['uart', '/dev/tty3', 115200, false, 'Адрес прибора СПТ-25 (G2)'], From e2f0bb4a88e85827e54b03c08a592a6e419efc2d Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 15 Oct 2024 08:49:41 +0300 Subject: [PATCH 06/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modbus/client-serial-modbus.py | 1 + scenes/pribor-prd-k/pribor-prd-k.tscn | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modbus/client-serial-modbus.py b/modbus/client-serial-modbus.py index 458bd7d..73d6375 100644 --- a/modbus/client-serial-modbus.py +++ b/modbus/client-serial-modbus.py @@ -34,6 +34,7 @@ def on_timer(*args): sock.sendto(bytes(tx_data, 'utf-8'), (udp_addr, udp_port_tx)) Timer(1, on_timer, args).start() + def main(): parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--modbus-unit', default=1, type=int, help='Номер устройства Modbus') diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index c5f1f93..f82df2d 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -49,7 +49,7 @@ rname = "A22" layout_mode = 0 offset_left = 8.0 offset_top = 862.0 -offset_right = 175.0 +offset_right = 168.0 offset_bottom = 907.0 fname = "ДОУ-6" rname = "A7" @@ -58,7 +58,7 @@ rname = "A7" layout_mode = 0 offset_left = 8.0 offset_top = 907.0 -offset_right = 175.0 +offset_right = 168.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A23" @@ -67,7 +67,7 @@ rname = "A23" layout_mode = 0 offset_left = 8.0 offset_top = 812.0 -offset_right = 175.0 +offset_right = 168.0 offset_bottom = 860.0 fname = "ДОУ-7" rname = "A8" From ebc4698d0aa6e7533816c5e18fe46dd8461c91dd Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 18 Oct 2024 16:38:09 +0300 Subject: [PATCH 07/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-hook.sh | 4 ++-- scenes/pribor-rtr/pribor-rtr.gd | 2 +- scripts/repnetwork.gd | 9 ++++----- scripts/repsettings.gd | 14 +++++++------- scripts/signaller.gd | 22 +++++++++++----------- 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/git-hook.sh b/git-hook.sh index 3b9bab2..eb08990 100644 --- a/git-hook.sh +++ b/git-hook.sh @@ -7,13 +7,13 @@ # для GoDot Engine. # # Инструкция по применению -# +# # 1. В папке ./git/hooks создать файлы: # - post-checkout # - post-commit # - post-merge # 2. В каждый файл записать строку: -# ./git-hook.sh +# ./git-hook.sh # 3. Теперь модуль scripts/commit.gd будет содержать данные # о текущей версии, после выполнения следующих операций СКВ: # - переключение ветки; diff --git a/scenes/pribor-rtr/pribor-rtr.gd b/scenes/pribor-rtr/pribor-rtr.gd index e7b10fc..c0f1875 100644 --- a/scenes/pribor-rtr/pribor-rtr.gd +++ b/scenes/pribor-rtr/pribor-rtr.gd @@ -102,7 +102,7 @@ func map_value_to_item(data, item, value_name: StringName): ## 1. Поле [b]'ErCode'[/b] содержит [b]0[/b] - если нет ошибки, и другое значение - если есть ошибка.[br] ## 2. Для каждого проверяемого параметра устройства есть своё поле [b]'ErCode'[/b].[br] ## 3. Есть только один индикатор исправности при отображении состояния устройства.[br] -## 4. [i]Нет результата порверки[/i] - поле [param state] принимает значение [b]0[/b], [i]всё +## 4. [i]Нет результата проверки[/i] - поле [param state] принимает значение [b]0[/b], [i]всё ## исправно[/i] - [b]1[/b], [i]хотябы один[/i] параметр с ошибкой - [b]2[/b].[br] func map_error_codes_to_item(data, item, value_name: StringName): var metas = item.get_meta(value_name, '') diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index bbf065f..21d3458 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -96,10 +96,10 @@ func _ready() -> void: tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]]) - for key in units: log.info('%s %s:%d' % [units[key].name, key[0], key[1]]) + for key in units: log.info('%s %s:%d' % [units[key].name, key[0], key[1]]) for key in units_tcp: log.info('%s %s:%d' % [units_tcp[key].name, key[0], key[1]]) - for key in dst_ports: - unit_keys[dst_ports[key]] = key + for key in dst_ports: unit_keys[dst_ports[key]] = key + func poll_receive(sock: Socket, tick: int) -> bool: while sock.get_available_packet_count() > 0: @@ -119,7 +119,6 @@ func poll_receive_tcp(sock: SocketTCP, tick: int) -> bool: if sock.is_connection_available(): # check if someone's trying to connect var client = sock.take_connection() # accept connection sock.peerstream.set_stream_peer(client) # bind peerstream to new client - print_debug('client_is_connected') var peer = sock.peerstream.get_stream_peer() if peer: var peer_len_data = peer.get_available_bytes() @@ -173,6 +172,6 @@ func _process(_delta: float) -> void: var unit = sock_unit[1] match unit.process(tick): Error.OK: sock.send_to(unit.tx_data) - Error.FAILED: emit_signal('socket_error', 'ошибка: %s' %unit) + Error.FAILED: emit_signal('socket_error', 'ошибка: %s' % unit) poll_receive_tcp(sock, tick) poll_sockets.any(func(sock): poll_receive(sock, tick)) diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 1ab9381..d5d0f41 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -21,15 +21,15 @@ class_name rep_settings extends Node 'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', [50049], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], 'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', [50051], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - # Название | Протокол | Адрес | Порт получения | Комментарий - 'уарэп-5п28': ['5p28', '127.0.0.1', [50000], 'IP-адрес комплекса 5П-28'], + # Название: [ Протокол, Адрес, Порт получения, Комментарий ] + 'уарэп-5п28': [ '5p28', '127.0.0.1', [50000], 'IP-адрес комплекса 5П-28'], - # Название | Протокол | Адрес | Порт получения | Порт отправки | Комментарий - 'уарэп-щ3': ['udp-json-mbcs', '127.0.0.1', [48000, 44100], false, true, 'IP-адрес и порты через которые производят обмен сообщения с драйвером клиента Modbus Serial'], + # Название: [ Протокол, Адрес, [ Порт получения, Порт отправки], ??, ??, Комментарий + 'уарэп-щ3': ['udp-json-mbcs', '127.0.0.1', [48000, 44100], false, true, 'IP-адрес и порты через которые производят обмен сообщения с драйвером клиента Modbus Serial'], - # Название | Протокол | Имя порта | Скорость, бод | Чётность | Комментарий - 'уарэп-спт25-1': ['uart', '/dev/tty2', 115200, false, 'Адрес прибора СПТ-25 (G1)'], - 'уарэп-спт25-2': ['uart', '/dev/tty3', 115200, false, 'Адрес прибора СПТ-25 (G2)'], + # Название: [ Протокол, Имя порта, Скорость, Чётность, ??, Комментарий + 'уарэп-спт25-1': ['uart', '/home/sasha/dev/tty0', [115200, false, false], 'Адрес прибора СПТ-25 (G1)'], + 'уарэп-спт25-2': ['uart', '/home/sasha/dev/tty4', [115200, false, false], 'Адрес прибора СПТ-25 (G2)'], } ## Параметры цели. diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 068b44f..c459e2a 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -1,6 +1,6 @@ class_name Signaller extends Node -## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют. +## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют ## два и более узла, из разных файлов. Должен быть помещён в автозагрузку. func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl) @@ -60,48 +60,48 @@ signal full_screen(id: int) ## Вызывается, когда пользователь выбирает цель.[br] ## [param th_id] - Отметка цели на экране. -signal rto_threat_sel (th_id: int) +signal rto_threat_sel(th_id: int) ## Вызывается, когда пользователь нажимает на значёк цели.[br] ## [param th_id] - Отметка цели на экране. -signal bip_pressed (th_id: int) +signal bip_pressed(th_id: int) ## Вызывается, когда пользователь снимает выделение с цели.[br] ## [param th_id] - Отметка цели на экране. -signal rto_threat_unsel (th_id: int) +signal rto_threat_unsel(th_id: int) ## Вызывается, когда пользователь снимает выделение со всех целей. -signal rto_threat_unsel_all () +signal rto_threat_unsel_all() ## Вызывается, когда пользователь выбирает помеху.[br] ## [param btn] - Нажатая кнопка помехи. -signal interfer_init (btn: PanelContainer, fs_arr: Array) +signal interfer_init(btn: PanelContainer, fs_arr: Array) ## Вызывается, когда выбраны цели для постановки помех.[br] ## [param btn] - Нажатая кнопка помехи.[br] ## [param sel_threats] - Cписок целей. -signal interfer_create (btn: PanelContainer, sel_threats: Array, fs_arr: Array) +signal interfer_create(btn: PanelContainer, sel_threats: Array, fs_arr: Array) ## Вызывается, когда создалась новая помеха.[br] ## [param ecm] - Новая помеха.[br] -signal interfer_new (ecm: interfer.Interfer) +signal interfer_new(ecm: interfer.Interfer) ## Вызывается, когда отключается действующая помеха.[br] ## [param ecm] - Новая помеха.[br] ## [param ecms] - словарь помех.[br] ## [param thrs] - словарь id помех и связанных с ними целей.[br] -signal interfer_off (ecm: interfer.Interfer, ecms: Dictionary, thrs: Dictionary) +signal interfer_off(ecm: interfer.Interfer, ecms: Dictionary, thrs: Dictionary) ## Вызывается при нажатии отключить все помехи. -signal interfer_off_all () +signal interfer_off_all() ## Вызывается при получении внешнего целеуказания. @@ -111,7 +111,7 @@ signal interfer_rcv(interfer_params: Array) ## Вызывается, когда отключается действующая помеха.[br] ## [param ecm] - Выбранная помеха. -signal interfer_selected (ecm: interfer.Interfer) +signal interfer_selected(ecm: interfer.Interfer) ## Вызывается, когда отключается выбираем помеху по сектору в таблице.[br] From 89788b4c06f8e13766cef44e520f5d02564996d8 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 18 Oct 2024 16:38:38 +0300 Subject: [PATCH 08/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=A2=D0=B0=D0=B1=D1=83=D0=BB=D1=8F=D1=86?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/file-table.gd | 54 +++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/scripts/file-table.gd b/scripts/file-table.gd index 5b73492..d2012c5 100644 --- a/scripts/file-table.gd +++ b/scripts/file-table.gd @@ -9,30 +9,30 @@ var FILES_ROWS_ALIGNMENT = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNM func fill_files_table(tbl: table, folder: String, rows_types: Array): - var dir: = DirAccess.open(folder) - if dir == null: - return - var files: = [] - var exclude_names: = ['.', '..'] - dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547 - while true: - var file: = dir.get_next() - if file == '': - break - if file in exclude_names: - continue - var file_name = folder + '/' + file - var fd = FileAccess.open(file_name, FileAccess.READ) - if not fd: - continue - var glob_path = ProjectSettings.globalize_path(file_name) - var sz = fd.get_length() - var ut = fd.get_modified_time(file_name) - fd.close() - var mt = Time.get_datetime_dict_from_unix_time(ut) - var file_row = [file, '%d' % sz, '%d-%02d-%02d %02d:%02d' % [mt.year, mt.month, mt.day, mt.hour, mt.minute]] - tbl.add_row(rows_types) - var i_row = tbl.get_rows_count() - 1 - tbl.set_row_text(i_row, file_row) - tbl.set_node_meta(0, i_row, 'file_path', glob_path) - dir.list_dir_end() + var dir: = DirAccess.open(folder) + if dir == null: + return + var files: = [] + var exclude_names: = ['.', '..'] + dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547 + while true: + var file: = dir.get_next() + if file == '': + break + if file in exclude_names: + continue + var file_name = folder + '/' + file + var fd = FileAccess.open(file_name, FileAccess.READ) + if not fd: + continue + var glob_path = ProjectSettings.globalize_path(file_name) + var sz = fd.get_length() + var ut = fd.get_modified_time(file_name) + fd.close() + var mt = Time.get_datetime_dict_from_unix_time(ut) + var file_row = [file, '%d' % sz, '%d-%02d-%02d %02d:%02d' % [mt.year, mt.month, mt.day, mt.hour, mt.minute]] + tbl.add_row(rows_types) + var i_row = tbl.get_rows_count() - 1 + tbl.set_row_text(i_row, file_row) + tbl.set_node_meta(0, i_row, 'file_path', glob_path) + dir.list_dir_end() From 103522cc1e6e8f4bef20ef81f3f22c2769a375d8 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 18 Oct 2024 16:39:20 +0300 Subject: [PATCH 09/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=A1=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/build.sh b/build.sh index c6f5925..d4c46ff 100644 --- a/build.sh +++ b/build.sh @@ -1,9 +1,10 @@ #!/usr/bin/env bash # -# Описание -# -# Этот скрипт создаёт исполняемый файл (загружаемый модуль) из файла проекта Godot +# ** Описание ** # +# - Этот скрипт создаёт исполняемый файл (загружаемый модуль) из файла проекта Godot. +# - Путь к шаблонам экспорта прописан в файле "export_presets.cfg". +# Параметр "--export-release" должен иметь имя указанное в поле "name" # Имя выходного исполняемого файла (загружаемый модуль) TARGET_BIN="uarep-ctl.linux.x86_64" @@ -12,13 +13,9 @@ TARGET_BIN="uarep-ctl.linux.x86_64" TARGET_PATH="./bin" # Путь к исполняемому файлу редактора Godot -EDITOR="/opt/godot/Godot_v4.2.2-stable_linux.x86_64" - -# Если используется своя сборка движка, то соответствующий файл -# (исполняемый модуль движка, шаблон экспорта) нужно заменить -# в этой папке: "~/.local/share/godot/export_templates/4.2.2.stable/" +EDITOR="/opt/godot/godot.linuxbsd.editor.x86_64.llvm" # Путь к файлу проекта Godot PROJECT_PATH="$(pwd)" -${EDITOR} --path "${PROJECT_PATH}" --export-release "Linux-X11" "${TARGET_PATH}/${TARGET_BIN}" +${EDITOR} --headless --path "${PROJECT_PATH}" --export-release "Linux-X11" "${TARGET_PATH}/${TARGET_BIN}" From c215be76ab802f9c1acc61cc049fd62870f6bf98 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 18 Oct 2024 16:40:48 +0300 Subject: [PATCH 10/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=A1=D0=9F=D0=A2-25.=20=D0=9F=D1=80=D0=B8?= =?UTF-8?q?=D1=91=D0=BC=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scripts/repnetwork.gd | 40 ++++++++++++++++++++++++++++++++++++++++ scripts/signaller.gd | 3 +++ scripts/spt25.gd | 18 ++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 scripts/spt25.gd diff --git a/project.godot b/project.godot index fa8a97d..33b7b08 100644 --- a/project.godot +++ b/project.godot @@ -62,6 +62,7 @@ mercator="*res://scripts/mercator.gd" modbus="*res://scripts/modbus.gd" tcp5p28="*res://scripts/tcp5p28.gd" sch3="*res://scripts/sch3.gd" +spt25="*res://scripts/spt25.gd" [debug] diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 21d3458..f615501 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -3,6 +3,12 @@ class_name rep_network extends Node const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'json-capsrpb': capsrpb.CapsRpb, 'udp-json-mbcs': modbus.ModbusClient} const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} +const SERIAL_PROTO: = {'uart': spt25.SPT25 } + + +class Serial extends SerialPort: + pass + class Socket extends PacketPeerUDP: func send_to(addr, data): @@ -32,6 +38,8 @@ var poll_sockets: Array[Socket] var tcp_sockets: Array var units: Dictionary var units_tcp: Dictionary +var units_serial: Dictionary +var serials: Dictionary var dst_ports: Dictionary var unit_keys: Dictionary var sock_unicast: Socket @@ -62,6 +70,19 @@ func create_tcpsocket(nm) -> SocketTCP: return sock +func create_serial(nm) -> SerialPort: + var port = repsettings.UnitProfiles[nm][1] + var baud = repsettings.UnitProfiles[nm][2][0] + var sp: = SerialPort.new() + sp.baudrate = baud + var rc = sp.open(port) + if rc != Error.OK: + log.message(log.ERROR, 'Невозможно открыть порт \"%s\" для \"%s\"' % [port, nm]) + return null + log.message(log.INFO, 'Последовательный порт \"%s\"@%d открыт для \"%s\"' % [port, baud, nm]) + return sp + + func _ready() -> void: log.info('Модуль работы с сетью готов') poll_sockets.append(create_socket('уарэп-яу07-частный')) @@ -94,6 +115,19 @@ func _ready() -> void: unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) + if proto in SERIAL_PROTO: + var unit = SERIAL_PROTO[proto].new(unit_name) + var unit_key = repsettings.get_unit_key(unit_name) + if logger_page: + unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) + unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) + var serial = create_serial(unit_name) + if serial: + units_serial[unit_key] = unit + serials[unit_key] = serial + serial.data_received.connect(unit.parse) + serial.start_monitoring(20000) + tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]]) for key in units: log.info('%s %s:%d' % [units[key].name, key[0], key[1]]) @@ -167,6 +201,12 @@ func _process(_delta: float) -> void: match unit.process(tick): Error.OK: sock_unicast.send_to([addr[0], dst_ports[addr]], unit.tx_data) Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]]) + for key in units_serial: + var unit = units_serial[key] + var serial = serials[key] + match unit.process(tick): + Error.OK: serial.write_str(unit.tx_data) + Error.FAILED: emit_signal('socket_error', 'ошибка: \"%s\"' % unit.name) for sock_unit in tcp_sockets: var sock = sock_unit[0] var unit = sock_unit[1] diff --git a/scripts/signaller.gd b/scripts/signaller.gd index c459e2a..b8b8a8d 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -5,6 +5,9 @@ class_name Signaller extends Node func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl) +## Вызывается при +signal serial_error() + ## Вызывается при переходе в режим [b]Работа[/b]. signal режим_работа() diff --git a/scripts/spt25.gd b/scripts/spt25.gd new file mode 100644 index 0000000..aecf700 --- /dev/null +++ b/scripts/spt25.gd @@ -0,0 +1,18 @@ +extends Node + +class SPT25: + signal line_changed(unit: SPT25) ## Вызывается когда меняется состояние связи + signal command_done(unit: SPT25) ## Вызывается после выполнения команды. + signal command_fail(unit: SPT25) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. + signal parse_failed(unit: SPT25) ## Вызывается при обнаружении ошибки во входных данных + var online: bool + var name: String + func process(delta: float): pass + func _init(nm) -> void: self.name = nm + func _to_string() -> String: return String('СПТ-25: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) + + func parse(rx_data: PackedByteArray): + print_debug(rx_data) + if not self.online: + self.online = true + emit_signal('line_changed', self) From 4a215d0611b4eb02f610045bc97433f482f03272 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 22 Oct 2024 14:17:02 +0300 Subject: [PATCH 11/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=A1=D0=9F=D0=A2-25=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20"=D0=9A=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BE=D0=BB=D1=8C"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/block-input.tscn | 179 +++++++++++++++++++++++++++ scenes/pribor-uyep/block-output.tscn | 162 ++++++++++++++++++++++++ scenes/pribor-uyep/pribor-uyep.gd | 1 + scenes/pribor-uyep/pribor-uyep.tscn | 117 +++++++++++------ scenes/контроль/прибор.gd | 4 - scenes/контроль/элемент-пустой.tscn | 134 ++++++++++++++++++++ scenes/контроль/элемент-я.tscn | 145 ++++++++++++++++++++++ scripts/repsettings.gd | 6 +- scripts/signaller.gd | 13 +- scripts/spt25.gd | 9 +- 10 files changed, 721 insertions(+), 49 deletions(-) create mode 100644 scenes/pribor-uyep/block-input.tscn create mode 100644 scenes/pribor-uyep/block-output.tscn create mode 100644 scenes/pribor-uyep/pribor-uyep.gd create mode 100644 scenes/контроль/элемент-пустой.tscn create mode 100644 scenes/контроль/элемент-я.tscn diff --git a/scenes/pribor-uyep/block-input.tscn b/scenes/pribor-uyep/block-input.tscn new file mode 100644 index 0000000..429c081 --- /dev/null +++ b/scenes/pribor-uyep/block-input.tscn @@ -0,0 +1,179 @@ +[gd_scene load_steps=13 format=3 uid="uid://ku8rdjoyscai"] + +[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="1_hot1o"] +[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="2_0xfrj"] +[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="3_vs130"] +[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_lvhef"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3nd2u"] + +[sub_resource type="GDScript" id="GDScript_oj3k3"] +script/source = "@tool + +extends PanelContainer + +@export var textures: Array + +signal pressed(control: PanelContainer) + +@export var fname: String: + set(v): + fname = v + $margin/vbox/title/fname.text = v + + +@export var state0: int: + set(v): + state0 = tools.clip_value(v, 0, textures.size() - 1) + $margin/vbox/table/state0.texture = textures[v] + + +@export var state1: int: + set(v): + state1 = tools.clip_value(v, 0, textures.size() - 1) + $margin/vbox/table/state1.texture = textures[v] + + +@export var state2: int: + set(v): + state2 = tools.clip_value(v, 0, textures.size() - 1) + $margin/vbox/table/state2.texture = textures[v] + + +func _on_button_pressed(): + emit_signal('pressed', self) +" + +[sub_resource type="GDScript" id="GDScript_45hqb"] +script/source = "@tool + +extends MarginContainer + + +func _enter_tree() -> void: + margins = [8, 8, 8, 8] + + +@export var margins: Array: + set(vals): + add_theme_constant_override('margin_top', vals[0]) + add_theme_constant_override('margin_left', vals[1]) + add_theme_constant_override('margin_bottom', vals[2]) + add_theme_constant_override('margin_right', vals[3]) + get: + var vals = [0, 0, 0, 0] + vals[0] = get_theme_constant('margin_top') + vals[1] = get_theme_constant('margin_left') + vals[2] = get_theme_constant('margin_bottom') + vals[3] = get_theme_constant('margin_right') + return vals + + +" + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ox0yw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xxyaa"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cd4fw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_emtms"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_evx06"] + +[node name="block_input" type="PanelContainer"] +editor_description = "Элемент замены из ЗИП" +offset_right = 200.0 +offset_bottom = 120.0 +theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") +script = SubResource("GDScript_oj3k3") +textures = [ExtResource("1_hot1o"), ExtResource("2_0xfrj"), ExtResource("3_vs130")] + +[node name="rect" type="NinePatchRect" parent="."] +layout_mode = 2 +texture = ExtResource("4_lvhef") +draw_center = false +region_rect = Rect2(0, 0, 63, 63) +patch_margin_left = 17 +patch_margin_top = 17 +patch_margin_right = 17 +patch_margin_bottom = 15 + +[node name="margin" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 8 +theme_override_constants/margin_top = 8 +theme_override_constants/margin_right = 8 +theme_override_constants/margin_bottom = 8 +script = SubResource("GDScript_45hqb") +margins = [8, 8, 8, 8] + +[node name="vbox" type="VBoxContainer" parent="margin"] +layout_mode = 2 +alignment = -1 + +[node name="title" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 + +[node name="fname" type="Label" parent="margin/vbox/title"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 6 +theme_override_font_sizes/font_size = 17 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="table" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 +columns = 2 + +[node name="state0" type="TextureRect" parent="margin/vbox/table"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +texture = ExtResource("1_hot1o") +expand_mode = 1 + +[node name="name0" type="Label" parent="margin/vbox/table"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Входное напряжение" + +[node name="state1" type="TextureRect" parent="margin/vbox/table"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +texture = ExtResource("1_hot1o") +expand_mode = 1 + +[node name="name1" type="Label" parent="margin/vbox/table"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Блок инвертора" + +[node name="state2" type="TextureRect" parent="margin/vbox/table"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +texture = ExtResource("1_hot1o") +expand_mode = 1 + +[node name="name2" type="Label" parent="margin/vbox/table"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Температура" + +[node name="button" type="Button" parent="."] +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_ox0yw") +theme_override_styles/hover = SubResource("StyleBoxEmpty_xxyaa") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_cd4fw") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_emtms") +theme_override_styles/focus = SubResource("StyleBoxEmpty_evx06") + +[connection signal="pressed" from="button" to="." method="_on_button_pressed"] diff --git a/scenes/pribor-uyep/block-output.tscn b/scenes/pribor-uyep/block-output.tscn new file mode 100644 index 0000000..b7cd077 --- /dev/null +++ b/scenes/pribor-uyep/block-output.tscn @@ -0,0 +1,162 @@ +[gd_scene load_steps=13 format=3 uid="uid://bsixhjfesq6r4"] + +[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="1_20kkm"] +[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="2_t54t5"] +[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="3_et31i"] +[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_u5qvj"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3nd2u"] + +[sub_resource type="GDScript" id="GDScript_oj3k3"] +script/source = "@tool + +extends PanelContainer + +@export var textures: Array + +signal pressed(control: PanelContainer) + +@export var fname: String: + set(v): + fname = v + $margin/vbox/title/fname.text = v + + +@export var rname: String: + set(v): + rname = v + $margin/vbox/title/rname.text = v + + +@export var state: int: + set(v): + state = tools.clip_value(v, 0, textures.size() - 1) + $margin/vbox/grid/state.texture = textures[v] + + +@export var alignment: int: + set(v): + $margin/vbox.alignment = v + + +func _on_button_pressed(): + emit_signal('pressed', self) +" + +[sub_resource type="GDScript" id="GDScript_45hqb"] +script/source = "@tool + +extends MarginContainer + + +func _enter_tree() -> void: + margins = [8, 8, 8, 8] + + +@export var margins: Array: + set(vals): + add_theme_constant_override('margin_top', vals[0]) + add_theme_constant_override('margin_left', vals[1]) + add_theme_constant_override('margin_bottom', vals[2]) + add_theme_constant_override('margin_right', vals[3]) + get: + var vals = [0, 0, 0, 0] + vals[0] = get_theme_constant('margin_top') + vals[1] = get_theme_constant('margin_left') + vals[2] = get_theme_constant('margin_bottom') + vals[3] = get_theme_constant('margin_right') + return vals + + +" + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ox0yw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xxyaa"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cd4fw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_emtms"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_evx06"] + +[node name="block_output" type="PanelContainer"] +editor_description = "Элемент замены из ЗИП" +offset_right = 210.0 +offset_bottom = 70.0 +theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") +script = SubResource("GDScript_oj3k3") +textures = [ExtResource("1_20kkm"), ExtResource("2_t54t5"), ExtResource("3_et31i")] + +[node name="rect" type="NinePatchRect" parent="."] +layout_mode = 2 +texture = ExtResource("4_u5qvj") +draw_center = false +region_rect = Rect2(0, 0, 63, 63) +patch_margin_left = 17 +patch_margin_top = 17 +patch_margin_right = 17 +patch_margin_bottom = 15 + +[node name="margin" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 8 +theme_override_constants/margin_top = 8 +theme_override_constants/margin_right = 8 +theme_override_constants/margin_bottom = 8 +script = SubResource("GDScript_45hqb") +margins = [8, 8, 8, 8] + +[node name="vbox" type="VBoxContainer" parent="margin"] +layout_mode = 2 + +[node name="title" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 + +[node name="fname" type="Label" parent="margin/vbox/title"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 6 +theme_override_font_sizes/font_size = 17 +text = "Выход" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="table" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 +columns = 2 + +[node name="state0" type="TextureRect" parent="margin/vbox/table"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +texture = ExtResource("1_20kkm") +expand_mode = 1 + +[node name="name0" type="Label" parent="margin/vbox/table"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Напряжение" + +[node name="state1" type="TextureRect" parent="margin/vbox/table"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +texture = ExtResource("1_20kkm") +expand_mode = 1 + +[node name="name1" type="Label" parent="margin/vbox/table"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Нагрузка" + +[node name="button" type="Button" parent="."] +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_ox0yw") +theme_override_styles/hover = SubResource("StyleBoxEmpty_xxyaa") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_cd4fw") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_emtms") +theme_override_styles/focus = SubResource("StyleBoxEmpty_evx06") + +[connection signal="pressed" from="button" to="." method="_on_button_pressed"] diff --git a/scenes/pribor-uyep/pribor-uyep.gd b/scenes/pribor-uyep/pribor-uyep.gd new file mode 100644 index 0000000..809e0cd --- /dev/null +++ b/scenes/pribor-uyep/pribor-uyep.gd @@ -0,0 +1 @@ +extends "res://scenes/контроль/прибор.gd" diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index 18c747b..823959f 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -1,13 +1,16 @@ -[gd_scene load_steps=4 format=3 uid="uid://bs7h65e7bodp3"] +[gd_scene load_steps=6 format=3 uid="uid://bs7h65e7bodp3"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="1_6olof"] -[ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_b7gyx"] -[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="2_cf6tc"] +[ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_46rp6"] +[ext_resource type="PackedScene" uid="uid://ku8rdjoyscai" path="res://scenes/pribor-uyep/block-input.tscn" id="4_mrvir"] +[ext_resource type="PackedScene" uid="uid://bsixhjfesq6r4" path="res://scenes/pribor-uyep/block-output.tscn" id="5_x74mk"] +[ext_resource type="PackedScene" uid="uid://btpc78gucr57f" path="res://scenes/контроль/элемент-я.tscn" id="6_60xs3"] [node name="pribor_uyep" type="Control"] layout_mode = 3 anchors_preset = 0 -script = ExtResource("1_b7gyx") +script = ExtResource("1_46rp6") +unit_name = "уарэп-спт25-1" [node name="ref_G1" type="NinePatchRect" parent="."] layout_mode = 0 @@ -20,52 +23,90 @@ patch_margin_left = 16 patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 - -[node name="ref_A1" parent="." instance=ExtResource("2_cf6tc")] -offset_left = 175.0 -offset_top = 529.0 -offset_right = 335.0 -offset_bottom = 984.0 -self_size = Vector2i(160, 455) -fname = "МАА150-1С27" -rname = "A1" - -[node name="ref_A2" parent="." instance=ExtResource("2_cf6tc")] -offset_left = 496.0 -offset_top = 531.0 -offset_right = 636.0 -offset_bottom = 988.0 -self_size = Vector2i(140, 457) -fname = "МАА150-1С27" -rname = "A2" - -[node name="ref_A3" parent="." instance=ExtResource("2_cf6tc")] -offset_left = 377.0 -offset_top = 531.0 -offset_right = 467.0 -offset_bottom = 985.0 -self_size = Vector2i(90, 454) -fname = "МАА150-1С27" -rname = "A2" +metadata/_edit_lock_ = true [node name="lbl_header" type="Label" parent="."] layout_mode = 0 -offset_left = 10.0 +offset_left = 100.0 offset_top = 156.0 -offset_right = 865.0 +offset_right = 750.0 offset_bottom = 182.0 theme_override_font_sizes/font_size = 22 -text = "Контроль исправности прибора Щ3" +text = "Контроль исправности прибора УЭП" horizontal_alignment = 1 vertical_alignment = 1 [node name="Label" type="Label" parent="."] self_modulate = Color(0.835294, 0.141176, 0.286275, 1) layout_mode = 0 -offset_left = 244.0 -offset_top = 1039.0 -offset_right = 619.0 -offset_bottom = 1058.0 +offset_left = 245.0 +offset_top = 1065.0 +offset_right = 620.0 +offset_bottom = 1084.0 text = "** Позиционные обозначения требуют уточнения **" horizontal_alignment = 1 vertical_alignment = 1 + +[node name="spt25_A1" parent="." instance=ExtResource("6_60xs3")] +layout_mode = 0 +offset_left = 135.0 +offset_top = 485.0 +offset_right = 375.0 +offset_bottom = 870.0 +fname = "СПТ-25-230-400" +rname = "A1" + +[node name="block_input1" parent="spt25_A1" instance=ExtResource("4_mrvir")] +layout_mode = 0 +offset_left = 15.0 +offset_top = 35.0 +offset_right = 225.0 +offset_bottom = 155.0 +fname = "Сеть 1" + +[node name="block_input2" parent="spt25_A1" instance=ExtResource("4_mrvir")] +layout_mode = 0 +offset_left = 15.0 +offset_top = 155.0 +offset_right = 225.0 +offset_bottom = 275.0 +fname = "Сеть 2" + +[node name="block_output" parent="spt25_A1" instance=ExtResource("5_x74mk")] +layout_mode = 0 +offset_left = 15.0 +offset_top = 275.0 +offset_right = 225.0 +offset_bottom = 367.0 + +[node name="spt25_A2" parent="." instance=ExtResource("6_60xs3")] +layout_mode = 0 +offset_left = 435.0 +offset_top = 485.0 +offset_right = 675.0 +offset_bottom = 875.0 +fname = "СПТ-25-230-400" +rname = "A2" + +[node name="block_input1" parent="spt25_A2" instance=ExtResource("4_mrvir")] +layout_mode = 0 +offset_left = 15.0 +offset_top = 35.0 +offset_right = 225.0 +offset_bottom = 155.0 +fname = "Сеть 1" + +[node name="block_input2" parent="spt25_A2" instance=ExtResource("4_mrvir")] +layout_mode = 0 +offset_left = 15.0 +offset_top = 155.0 +offset_right = 225.0 +offset_bottom = 275.0 +fname = "Сеть 2" + +[node name="block_output" parent="spt25_A2" instance=ExtResource("5_x74mk")] +layout_mode = 0 +offset_left = 15.0 +offset_top = 275.0 +offset_right = 225.0 +offset_bottom = 367.0 diff --git a/scenes/контроль/прибор.gd b/scenes/контроль/прибор.gd index 0909975..79bdc9b 100644 --- a/scenes/контроль/прибор.gd +++ b/scenes/контроль/прибор.gd @@ -21,7 +21,3 @@ extends Control func set_header_text(header_text: String): $lbl_header.text = header_text - - -@export var nodes_mask: String = '' - diff --git a/scenes/контроль/элемент-пустой.tscn b/scenes/контроль/элемент-пустой.tscn new file mode 100644 index 0000000..7254f96 --- /dev/null +++ b/scenes/контроль/элемент-пустой.tscn @@ -0,0 +1,134 @@ +[gd_scene load_steps=13 format=3 uid="uid://3nw70a3320yc"] + +[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="1_ihl8b"] +[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="2_cji5r"] +[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="3_ecwtv"] +[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_o6o0s"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3nd2u"] + +[sub_resource type="GDScript" id="GDScript_oj3k3"] +script/source = "@tool + +extends PanelContainer + +@export var textures: Array + +signal pressed(control: PanelContainer) + +@export var fname: String: + set(v): + fname = v + $margin/vbox/grid/fname.text = v + + +@export var rname: String: + set(v): + rname = v + $margin/vbox/grid/rname.text = v + + +@export var state: int: + set(v): + state = tools.clip_value(v, 0, textures.size() - 1) + $margin/vbox/grid/state.texture = textures[v] + + +@export var alignment: int: + set(v): + $margin/vbox.alignment = v + + +func _on_button_pressed(): + emit_signal('pressed', self) +" + +[sub_resource type="GDScript" id="GDScript_45hqb"] +script/source = "@tool + +extends MarginContainer + + +func _enter_tree() -> void: + margins = [8, 8, 8, 8] + + +@export var margins: Array: + set(vals): + add_theme_constant_override('margin_top', vals[0]) + add_theme_constant_override('margin_left', vals[1]) + add_theme_constant_override('margin_bottom', vals[2]) + add_theme_constant_override('margin_right', vals[3]) + get: + var vals = [0, 0, 0, 0] + vals[0] = get_theme_constant('margin_top') + vals[1] = get_theme_constant('margin_left') + vals[2] = get_theme_constant('margin_bottom') + vals[3] = get_theme_constant('margin_right') + return vals + + +" + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ox0yw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xxyaa"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cd4fw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_emtms"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_evx06"] + +[node name="yelement_empty" type="PanelContainer"] +editor_description = "Элемент замены из ЗИП" +offset_right = 150.0 +offset_bottom = 50.0 +theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") +script = SubResource("GDScript_oj3k3") +textures = [ExtResource("1_ihl8b"), ExtResource("2_cji5r"), ExtResource("3_ecwtv")] + +[node name="rect" type="NinePatchRect" parent="."] +layout_mode = 2 +texture = ExtResource("4_o6o0s") +draw_center = false +region_rect = Rect2(0, 0, 63, 63) +patch_margin_left = 17 +patch_margin_top = 17 +patch_margin_right = 17 +patch_margin_bottom = 15 + +[node name="margin" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 8 +theme_override_constants/margin_top = 8 +theme_override_constants/margin_right = 8 +theme_override_constants/margin_bottom = 8 +script = SubResource("GDScript_45hqb") +margins = [8, 8, 8, 8] + +[node name="vbox" type="VBoxContainer" parent="margin"] +layout_mode = 2 + +[node name="grid" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 + +[node name="fname" type="Label" parent="margin/vbox/grid"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 6 +theme_override_font_sizes/font_size = 17 +text = "Заголовок" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="button" type="Button" parent="."] +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_ox0yw") +theme_override_styles/hover = SubResource("StyleBoxEmpty_xxyaa") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_cd4fw") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_emtms") +theme_override_styles/focus = SubResource("StyleBoxEmpty_evx06") + +[connection signal="pressed" from="button" to="." method="_on_button_pressed"] diff --git a/scenes/контроль/элемент-я.tscn b/scenes/контроль/элемент-я.tscn new file mode 100644 index 0000000..ddb9e9a --- /dev/null +++ b/scenes/контроль/элемент-я.tscn @@ -0,0 +1,145 @@ +[gd_scene load_steps=9 format=3 uid="uid://btpc78gucr57f"] + +[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_or1kj"] + +[sub_resource type="GDScript" id="GDScript_oj3k3"] +script/source = "@tool + +extends Control + +signal pressed(control: PanelContainer) + + +func _on_button_pressed(): + emit_signal('pressed', self) + + +@export var fname: String: + set(v): + fname = v + $margin/vbox/grid/fname.text = v + + +@export var rname: String: + set(v): + rname = v + $margin/vbox/grid/rname.text = v + + +@export var alignment: int: + set(v): + $margin/vbox.alignment = v + + +@export var unit_name: String = '' + + +func _enter_tree() -> void: _on_resized() + +func _on_resized() -> void: + $rect.size = size + $margin.size = size +" + +[sub_resource type="GDScript" id="GDScript_45hqb"] +script/source = "@tool + +extends MarginContainer + + +func _enter_tree() -> void: + margins = [8, 8, 8, 8] + + +@export var margins: Array: + set(vals): + add_theme_constant_override('margin_top', vals[0]) + add_theme_constant_override('margin_left', vals[1]) + add_theme_constant_override('margin_bottom', vals[2]) + add_theme_constant_override('margin_right', vals[3]) + get: + var vals = [0, 0, 0, 0] + vals[0] = get_theme_constant('margin_top') + vals[1] = get_theme_constant('margin_left') + vals[2] = get_theme_constant('margin_bottom') + vals[3] = get_theme_constant('margin_right') + return vals + + +" + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ox0yw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xxyaa"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cd4fw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_emtms"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_evx06"] + +[node name="yelement_ya" type="Control"] +editor_description = "Элемент замены из ЗИП" +layout_mode = 3 +anchors_preset = 0 +script = SubResource("GDScript_oj3k3") + +[node name="rect" type="NinePatchRect" parent="."] +layout_mode = 2 +offset_right = 34.0 +offset_bottom = 32.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource("4_or1kj") +draw_center = false +region_rect = Rect2(0, 0, 63, 63) +patch_margin_left = 17 +patch_margin_top = 17 +patch_margin_right = 17 +patch_margin_bottom = 15 + +[node name="margin" type="MarginContainer" parent="."] +layout_mode = 2 +offset_right = 22.0 +offset_bottom = 42.0 +theme_override_constants/margin_left = 8 +theme_override_constants/margin_top = 8 +theme_override_constants/margin_right = 8 +theme_override_constants/margin_bottom = 8 +script = SubResource("GDScript_45hqb") +margins = [8, 8, 8, 8] + +[node name="vbox" type="VBoxContainer" parent="margin"] +layout_mode = 2 + +[node name="grid" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 +columns = 2 + +[node name="fname" type="Label" parent="margin/vbox/grid"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 6 +theme_override_font_sizes/font_size = 17 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="rname" type="Label" parent="margin/vbox/grid"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 6 +theme_override_font_sizes/font_size = 22 +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="button" type="Button" parent="."] +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_ox0yw") +theme_override_styles/hover = SubResource("StyleBoxEmpty_xxyaa") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_cd4fw") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_emtms") +theme_override_styles/focus = SubResource("StyleBoxEmpty_evx06") + +[connection signal="resized" from="." to="." method="_on_resized"] +[connection signal="pressed" from="button" to="." method="_on_button_pressed"] diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index d5d0f41..26b4a9a 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -27,9 +27,9 @@ class_name rep_settings extends Node # Название: [ Протокол, Адрес, [ Порт получения, Порт отправки], ??, ??, Комментарий 'уарэп-щ3': ['udp-json-mbcs', '127.0.0.1', [48000, 44100], false, true, 'IP-адрес и порты через которые производят обмен сообщения с драйвером клиента Modbus Serial'], - # Название: [ Протокол, Имя порта, Скорость, Чётность, ??, Комментарий - 'уарэп-спт25-1': ['uart', '/home/sasha/dev/tty0', [115200, false, false], 'Адрес прибора СПТ-25 (G1)'], - 'уарэп-спт25-2': ['uart', '/home/sasha/dev/tty4', [115200, false, false], 'Адрес прибора СПТ-25 (G2)'], + # Название: [ Протокол, Имя порта, Скорость, Чётность, ??, Комментарий + 'уарэп-спт25-1': ['uart', '/home/sasha/dev/tty0', [19200, false, false], 'Адрес прибора СПТ-25 (G1)'], + 'уарэп-спт25-2': ['uart', '/home/sasha/dev/tty4', [19200, false, false], 'Адрес прибора СПТ-25 (G2)'], } ## Параметры цели. diff --git a/scripts/signaller.gd b/scripts/signaller.gd index b8b8a8d..714238c 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -3,11 +3,22 @@ class_name Signaller extends Node ## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют ## два и более узла, из разных файлов. Должен быть помещён в автозагрузку. +## Подключает обработчик к событию по его определению func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl) -## Вызывается при + +## Вызывает сигнал по его определению +func emmit(sgnl: Signal): emit_signal(sgnl.get_name()) + + +## Вызывается при обнаружение ошибки последовательного порта signal serial_error() + +## Вызывается при приёме данных от устройства +signal data_received(data: PackedByteArray, unit_name: String) + + ## Вызывается при переходе в режим [b]Работа[/b]. signal режим_работа() diff --git a/scripts/spt25.gd b/scripts/spt25.gd index aecf700..2e9fee4 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -1,18 +1,21 @@ extends Node class SPT25: - signal line_changed(unit: SPT25) ## Вызывается когда меняется состояние связи + signal line_changed(unit: SPT25) ## Вызывается при изменение состояния связи signal command_done(unit: SPT25) ## Вызывается после выполнения команды. signal command_fail(unit: SPT25) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. signal parse_failed(unit: SPT25) ## Вызывается при обнаружении ошибки во входных данных var online: bool var name: String - func process(delta: float): pass func _init(nm) -> void: self.name = nm func _to_string() -> String: return String('СПТ-25: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) func parse(rx_data: PackedByteArray): - print_debug(rx_data) if not self.online: self.online = true emit_signal('line_changed', self) + + + func process(delta: float): + pass + From d2a6138580c7c06e6964a52cf87b9cd6d5245e36 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Wed, 23 Oct 2024 15:55:00 +0300 Subject: [PATCH 12/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=A1=D0=9F=D0=A2-25=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20"=D0=9A=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BE=D0=BB=D1=8C"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/block-output.tscn | 32 ++++++++++++++-- scenes/pribor-uyep/pribor-uyep.tscn | 22 +++++++---- scenes/pribor-uyep/spt25_view.gd | 37 +++++++++++++++++++ scenes/контроль/элемент-я.gd | 37 +++++++++++++++++++ scenes/контроль/элемент-я.tscn | 55 ++++++---------------------- scripts/repnetwork.gd | 5 ++- scripts/signaller.gd | 4 -- scripts/spt25.gd | 4 +- 8 files changed, 134 insertions(+), 62 deletions(-) create mode 100644 scenes/pribor-uyep/spt25_view.gd create mode 100644 scenes/контроль/элемент-я.gd diff --git a/scenes/pribor-uyep/block-output.tscn b/scenes/pribor-uyep/block-output.tscn index b7cd077..3248d18 100644 --- a/scenes/pribor-uyep/block-output.tscn +++ b/scenes/pribor-uyep/block-output.tscn @@ -16,6 +16,7 @@ extends PanelContainer signal pressed(control: PanelContainer) + @export var fname: String: set(v): fname = v @@ -28,10 +29,22 @@ signal pressed(control: PanelContainer) $margin/vbox/title/rname.text = v -@export var state: int: +@export var state0: int: set(v): - state = tools.clip_value(v, 0, textures.size() - 1) - $margin/vbox/grid/state.texture = textures[v] + state0 = tools.clip_value(v, 0, textures.size() - 1) + $margin/vbox/table/state0.texture = textures[v] + + +@export var state1: int: + set(v): + state1 = tools.clip_value(v, 0, textures.size() - 1) + $margin/vbox/table/state1.texture = textures[v] + + +@export var state2: int: + set(v): + state1 = tools.clip_value(v, 0, textures.size() - 1) + $margin/vbox/table/state2.texture = textures[v] @export var alignment: int: @@ -87,6 +100,7 @@ offset_bottom = 70.0 theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") script = SubResource("GDScript_oj3k3") textures = [ExtResource("1_20kkm"), ExtResource("2_t54t5"), ExtResource("3_et31i")] +state2 = null [node name="rect" type="NinePatchRect" parent="."] layout_mode = 2 @@ -151,6 +165,18 @@ layout_mode = 2 theme_override_font_sizes/font_size = 17 text = "Нагрузка" +[node name="state2" type="TextureRect" parent="margin/vbox/table"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +texture = ExtResource("1_20kkm") +expand_mode = 1 + +[node name="name2" type="Label" parent="margin/vbox/table"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Температура" + [node name="button" type="Button" parent="."] layout_mode = 2 theme_override_styles/normal = SubResource("StyleBoxEmpty_ox0yw") diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index 823959f..e22929e 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=6 format=3 uid="uid://bs7h65e7bodp3"] +[gd_scene load_steps=7 format=3 uid="uid://bs7h65e7bodp3"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="1_6olof"] [ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_46rp6"] [ext_resource type="PackedScene" uid="uid://ku8rdjoyscai" path="res://scenes/pribor-uyep/block-input.tscn" id="4_mrvir"] +[ext_resource type="Script" path="res://scenes/pribor-uyep/spt25_view.gd" id="4_v0lil"] [ext_resource type="PackedScene" uid="uid://bsixhjfesq6r4" path="res://scenes/pribor-uyep/block-output.tscn" id="5_x74mk"] [ext_resource type="PackedScene" uid="uid://btpc78gucr57f" path="res://scenes/контроль/элемент-я.tscn" id="6_60xs3"] @@ -10,7 +11,6 @@ layout_mode = 3 anchors_preset = 0 script = ExtResource("1_46rp6") -unit_name = "уарэп-спт25-1" [node name="ref_G1" type="NinePatchRect" parent="."] layout_mode = 0 @@ -39,10 +39,10 @@ vertical_alignment = 1 [node name="Label" type="Label" parent="."] self_modulate = Color(0.835294, 0.141176, 0.286275, 1) layout_mode = 0 -offset_left = 245.0 -offset_top = 1065.0 -offset_right = 620.0 -offset_bottom = 1084.0 +offset_left = 225.0 +offset_top = 990.0 +offset_right = 600.0 +offset_bottom = 1009.0 text = "** Позиционные обозначения требуют уточнения **" horizontal_alignment = 1 vertical_alignment = 1 @@ -52,9 +52,11 @@ layout_mode = 0 offset_left = 135.0 offset_top = 485.0 offset_right = 375.0 -offset_bottom = 870.0 +offset_bottom = 895.0 +script = ExtResource("4_v0lil") fname = "СПТ-25-230-400" rname = "A1" +unit_name = "уарэп-спт25-1" [node name="block_input1" parent="spt25_A1" instance=ExtResource("4_mrvir")] layout_mode = 0 @@ -78,15 +80,18 @@ offset_left = 15.0 offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 +state2 = null [node name="spt25_A2" parent="." instance=ExtResource("6_60xs3")] layout_mode = 0 offset_left = 435.0 offset_top = 485.0 offset_right = 675.0 -offset_bottom = 875.0 +offset_bottom = 895.0 +script = ExtResource("4_v0lil") fname = "СПТ-25-230-400" rname = "A2" +unit_name = "уарэп-спт25-2" [node name="block_input1" parent="spt25_A2" instance=ExtResource("4_mrvir")] layout_mode = 0 @@ -110,3 +115,4 @@ offset_left = 15.0 offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 +state2 = null diff --git a/scenes/pribor-uyep/spt25_view.gd b/scenes/pribor-uyep/spt25_view.gd new file mode 100644 index 0000000..e332583 --- /dev/null +++ b/scenes/pribor-uyep/spt25_view.gd @@ -0,0 +1,37 @@ +@tool + +extends "res://scenes/контроль/элемент-я.gd" + +enum STATE_VAL +{ + NONE = 0, + GOOD = 1, + ERROR = 2 +} + + +func _ready() -> void: + var unit_key = repsettings.get_unit_key(unit_name) + var unit = repnetwork.units[unit_key] + unit.connect('data_received', on_data_received.bind(unit)) + + +func on_data_received(data, unit): + # Неисправность, напряжение на выходе меньше номинального + $block_output.state0 = STATE_VAL.GOOD if (data[4] & (1 << 0)) == 0 else STATE_VAL.ERROR + # Перегрузка и короткое замыкание по выходу + $block_output.state1 = STATE_VAL.GOOD if ((data[5] & (1 << 0)) == 0) or ((data[5] & (1 << 1)) == 0) else STATE_VAL.ERROR + # Критическая температура + $block_output.state2 = STATE_VAL.GOOD if ((data[5] & (1 << 5)) == 0) else STATE_VAL.ERROR + # Сеть 1. Вход + $block_input1.state0 = STATE_VAL.GOOD if ((data[4] & (1 << 1)) == 0) or ((data[4] & (1 << 3)) == 0) else STATE_VAL.ERROR + # Сеть 2. Вход + $block_input2.state0 = STATE_VAL.GOOD if ((data[4] & (1 << 2)) == 0) or ((data[4] & (1 << 4)) == 0) else STATE_VAL.ERROR + # Неисправность блока инвертора 1 канала + $block_input1.state1 = STATE_VAL.GOOD if (data[6] & (1 << 2)) == 0 else STATE_VAL.ERROR + # Неисправность блока инвертора 2 канала + $block_input2.state1 = STATE_VAL.GOOD if (data[6] & (1 << 3)) == 0 else STATE_VAL.ERROR + # Перегрев 1 канала + $block_input1.state2 = STATE_VAL.GOOD if (data[5] & (1 << 3)) == 0 else STATE_VAL.ERROR + # Перегрев 2 канала + $block_input1.state2 = STATE_VAL.GOOD if (data[5] & (1 << 4)) == 0 else STATE_VAL.ERROR diff --git a/scenes/контроль/элемент-я.gd b/scenes/контроль/элемент-я.gd new file mode 100644 index 0000000..759ec17 --- /dev/null +++ b/scenes/контроль/элемент-я.gd @@ -0,0 +1,37 @@ +@tool + +extends Control + +signal pressed(control: PanelContainer) + + +func _on_button_pressed(): + emit_signal('pressed', self) + + +@export var fname: String: + set(v): + fname = v + $margin/vbox/grid/fname.text = v + + +@export var rname: String: + set(v): + rname = v + $margin/vbox/grid/rname.text = v + + +@export var alignment: int: + set(v): + $margin/vbox.alignment = v + + +@export var unit_name: String = '' + + +func _enter_tree() -> void: _on_resized() + +func _on_resized() -> void: + $rect.size = size + $margin.size = size + $button.size = size diff --git a/scenes/контроль/элемент-я.tscn b/scenes/контроль/элемент-я.tscn index ddb9e9a..3ec2da4 100644 --- a/scenes/контроль/элемент-я.tscn +++ b/scenes/контроль/элемент-я.tscn @@ -1,46 +1,8 @@ [gd_scene load_steps=9 format=3 uid="uid://btpc78gucr57f"] +[ext_resource type="Script" path="res://scenes/контроль/элемент-я.gd" id="1_fwxi0"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_or1kj"] -[sub_resource type="GDScript" id="GDScript_oj3k3"] -script/source = "@tool - -extends Control - -signal pressed(control: PanelContainer) - - -func _on_button_pressed(): - emit_signal('pressed', self) - - -@export var fname: String: - set(v): - fname = v - $margin/vbox/grid/fname.text = v - - -@export var rname: String: - set(v): - rname = v - $margin/vbox/grid/rname.text = v - - -@export var alignment: int: - set(v): - $margin/vbox.alignment = v - - -@export var unit_name: String = '' - - -func _enter_tree() -> void: _on_resized() - -func _on_resized() -> void: - $rect.size = size - $margin.size = size -" - [sub_resource type="GDScript" id="GDScript_45hqb"] script/source = "@tool @@ -80,14 +42,17 @@ func _enter_tree() -> void: [node name="yelement_ya" type="Control"] editor_description = "Элемент замены из ЗИП" +custom_minimum_size = Vector2(32, 32) layout_mode = 3 anchors_preset = 0 -script = SubResource("GDScript_oj3k3") +offset_right = 180.0 +offset_bottom = 155.0 +script = ExtResource("1_fwxi0") [node name="rect" type="NinePatchRect" parent="."] layout_mode = 2 -offset_right = 34.0 -offset_bottom = 32.0 +offset_right = 180.0 +offset_bottom = 155.0 size_flags_horizontal = 3 size_flags_vertical = 3 texture = ExtResource("4_or1kj") @@ -100,8 +65,8 @@ patch_margin_bottom = 15 [node name="margin" type="MarginContainer" parent="."] layout_mode = 2 -offset_right = 22.0 -offset_bottom = 42.0 +offset_right = 180.0 +offset_bottom = 155.0 theme_override_constants/margin_left = 8 theme_override_constants/margin_top = 8 theme_override_constants/margin_right = 8 @@ -135,6 +100,8 @@ vertical_alignment = 1 [node name="button" type="Button" parent="."] layout_mode = 2 +offset_right = 180.0 +offset_bottom = 155.0 theme_override_styles/normal = SubResource("StyleBoxEmpty_ox0yw") theme_override_styles/hover = SubResource("StyleBoxEmpty_xxyaa") theme_override_styles/pressed = SubResource("StyleBoxEmpty_cd4fw") diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index f615501..1ffaf91 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -122,9 +122,10 @@ func _ready() -> void: unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) var serial = create_serial(unit_name) + units_serial[unit_key] = unit + units[unit_key] = unit + serials[unit_key] = serial if serial: - units_serial[unit_key] = unit - serials[unit_key] = serial serial.data_received.connect(unit.parse) serial.start_monitoring(20000) diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 714238c..e640896 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -15,10 +15,6 @@ func emmit(sgnl: Signal): emit_signal(sgnl.get_name()) signal serial_error() -## Вызывается при приёме данных от устройства -signal data_received(data: PackedByteArray, unit_name: String) - - ## Вызывается при переходе в режим [b]Работа[/b]. signal режим_работа() diff --git a/scripts/spt25.gd b/scripts/spt25.gd index 2e9fee4..5ef00ae 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -5,6 +5,8 @@ class SPT25: signal command_done(unit: SPT25) ## Вызывается после выполнения команды. signal command_fail(unit: SPT25) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. signal parse_failed(unit: SPT25) ## Вызывается при обнаружении ошибки во входных данных + signal data_received(unit: SPT25) ## Вызывается по приёму данных + var online: bool var name: String func _init(nm) -> void: self.name = nm @@ -14,8 +16,8 @@ class SPT25: if not self.online: self.online = true emit_signal('line_changed', self) + emit_signal('data_received', rx_data) func process(delta: float): pass - From 3eb981526d6617413e0fc41ff7fb2978cd376ce6 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 24 Oct 2024 08:57:32 +0300 Subject: [PATCH 13/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 4 ++-- scenes/pribor-uyep/block-output.tscn | 1 - scenes/pribor-uyep/pribor-uyep.tscn | 4 ++-- scripts/{repnetwork.gd => network.gd} | 0 scripts/{repsettings.gd => settings.gd} | 0 5 files changed, 4 insertions(+), 5 deletions(-) rename scripts/{repnetwork.gd => network.gd} (100%) rename scripts/{repsettings.gd => settings.gd} (100%) diff --git a/project.godot b/project.godot index 33b7b08..d42a388 100644 --- a/project.godot +++ b/project.godot @@ -47,8 +47,8 @@ commit="*res://scripts/commit.gd" log="*res://addons/godot-logger/scripts/logger.gd" tools="*res://scripts/tools.gd" signaller="*res://scripts/signaller.gd" -repsettings="*res://scripts/repsettings.gd" -repnetwork="*res://scripts/repnetwork.gd" +repsettings="*res://scripts/settings.gd" +repnetwork="*res://scripts/network.gd" yau07="*res://scripts/yau07.gd" capsrpb="*res://scripts/capsrpb.gd" table="*res://table/table.gd" diff --git a/scenes/pribor-uyep/block-output.tscn b/scenes/pribor-uyep/block-output.tscn index 3248d18..2757414 100644 --- a/scenes/pribor-uyep/block-output.tscn +++ b/scenes/pribor-uyep/block-output.tscn @@ -100,7 +100,6 @@ offset_bottom = 70.0 theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") script = SubResource("GDScript_oj3k3") textures = [ExtResource("1_20kkm"), ExtResource("2_t54t5"), ExtResource("3_et31i")] -state2 = null [node name="rect" type="NinePatchRect" parent="."] layout_mode = 2 diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index e22929e..769ff93 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -80,7 +80,7 @@ offset_left = 15.0 offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 -state2 = null +state2 = 0 [node name="spt25_A2" parent="." instance=ExtResource("6_60xs3")] layout_mode = 0 @@ -115,4 +115,4 @@ offset_left = 15.0 offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 -state2 = null +state2 = 0 diff --git a/scripts/repnetwork.gd b/scripts/network.gd similarity index 100% rename from scripts/repnetwork.gd rename to scripts/network.gd diff --git a/scripts/repsettings.gd b/scripts/settings.gd similarity index 100% rename from scripts/repsettings.gd rename to scripts/settings.gd From a90d694928b55f6cae51dac4ed6af97955ee118f Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 24 Oct 2024 11:04:02 +0300 Subject: [PATCH 14/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=91=D0=B0=D0=B7=D0=BE=D0=B2=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20=D0=B4=D0=BB=D1=8F=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scripts/spt25.gd | 14 +++++--------- scripts/tcp5p28.gd | 19 +++++-------------- scripts/unit.gd | 18 ++++++++++++++++++ scripts/yau07.gd | 19 +++++-------------- 5 files changed, 34 insertions(+), 37 deletions(-) create mode 100644 scripts/unit.gd diff --git a/project.godot b/project.godot index d42a388..1abc629 100644 --- a/project.godot +++ b/project.godot @@ -45,6 +45,7 @@ config/unit_rr_request_period=1.0 commit="*res://scripts/commit.gd" log="*res://addons/godot-logger/scripts/logger.gd" +unit="*res://scripts/unit.gd" tools="*res://scripts/tools.gd" signaller="*res://scripts/signaller.gd" repsettings="*res://scripts/settings.gd" diff --git a/scripts/spt25.gd b/scripts/spt25.gd index 5ef00ae..6616f05 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -1,14 +1,10 @@ -extends Node +class_name spt25_unit extends Node -class SPT25: - signal line_changed(unit: SPT25) ## Вызывается при изменение состояния связи - signal command_done(unit: SPT25) ## Вызывается после выполнения команды. - signal command_fail(unit: SPT25) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. - signal parse_failed(unit: SPT25) ## Вызывается при обнаружении ошибки во входных данных - signal data_received(unit: SPT25) ## Вызывается по приёму данных - var online: bool - var name: String +class SPT25 extends unit.Unit: + + var tx_tick: int = 0 + func _init(nm) -> void: self.name = nm func _to_string() -> String: return String('СПТ-25: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) diff --git a/scripts/tcp5p28.gd b/scripts/tcp5p28.gd index 63fca15..9da29d3 100644 --- a/scripts/tcp5p28.gd +++ b/scripts/tcp5p28.gd @@ -34,28 +34,20 @@ const CU_STATE: Dictionary = { 4:9, # Неисправность } -class TCP5P28: +class TCP5P28 extends unit.Unit: const PACK_TYPE_CMD: int = 1 const PACK_TYPE_RES: int = 2 const CMD_TYPE_STATE: int = 1 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) ## Запрос состояния выполнения целеуказания. - 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 func parse(data: PackedByteArray, now_tick: int): rx_tick = now_tick @@ -87,12 +79,12 @@ class TCP5P28: func pack_threats(ths): var data = PackedByteArray() var data_len = 4 + len(ths) * 80 # длинна блока данных в байтах - var tick = Time.get_ticks_msec() + var tick0 = Time.get_ticks_msec() data.resize(4) data.encode_u16(0, 0) # Код ошибки data.encode_u16(2, len(ths)) # Количество целей for th in ths.values(): - data.append_array(get_threats_data(th, int(tick))) + data.append_array(get_threats_data(th, int(tick0))) var data_to_send: PackedByteArray = create_header(data_len) data_to_send.append_array(data) tx_stack.append(data_to_send) @@ -131,10 +123,10 @@ class TCP5P28: head_data.encode_u32(4, data_len) # Длинна пакета данных return head_data - func get_threats_data(th, tick): + func get_threats_data(th, tick0): var th_data = PackedByteArray() th_data.resize(80) # Количество байт в массиве - th_data.encode_u64(0, tick) + th_data.encode_u64(0, tick0) var flags: int = 0 # с 0 по 7 бит рекомендованная помеха flags |= 0 << 8 # Флаг рекомендуемой помехи flags |= int(th.fflags['aoa']) << 9 # Флаг доставерности пеленга @@ -190,4 +182,3 @@ class TCP5P28: var data_to_send: PackedByteArray = create_header(data_len) data_to_send.append_array(data_tx) tx_stack.append(data_to_send) - diff --git a/scripts/unit.gd b/scripts/unit.gd new file mode 100644 index 0000000..3e46652 --- /dev/null +++ b/scripts/unit.gd @@ -0,0 +1,18 @@ +class_name base_unit extends Node + +## Базовый класс для управления подключаемыми устройствами + +class Unit: + signal line_changed(unit) ## Вызывается при изменение состояния связи + signal command_done(unit) ## Вызывается после выполнения команды. + signal command_fail(unit) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. + signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных + signal data_received(unit) ## Вызывается по приёму данных + + var tick = 0.0 ## Текущее тик-время в мс. + var tx_data: = PackedByteArray() ## Буфер отправленный. + var tx_len = 0 ## Длина последнего отправленного пакета. + var online: bool + var name: String + func _init(nm) -> void: self.name = nm + func _to_string() -> String: return String('устройство: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) diff --git a/scripts/yau07.gd b/scripts/yau07.gd index b4b6e2f..470fbfe 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -9,13 +9,13 @@ const BUFFER_SIZE = 2048 ## Размер буфера для приёма д ## Ячейка ЯУ-07. -class YaU07: +class YaU07 extends unit.Unit: ## Коды выполняемых команд. enum CmdCode { - READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07. - WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07. - WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07. + READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07. + WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07. + WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07. READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07. } @@ -28,27 +28,18 @@ class YaU07: FAIL ## Команда не выполнена. } - 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 ## Состояние связи с ячейкой. + func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) From 482e9d062b69f8963b8ce233603e0f759d63d326 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 24 Oct 2024 14:50:49 +0300 Subject: [PATCH 15/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index 1ffaf91..6abcee2 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -20,7 +20,7 @@ class SocketTCP extends TCPServer: const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета. var peerstream: = PacketPeerStream.new() var unit_key: Array ## Ключ юнита. - var head_len: int = 8 ## Длинна заголовка команды. + var head_len: int = 8 ## Длина заголовка команды. var len_place: int = 4 ## Номер начального байта с длинной блока данных. var type_len: int = 4 ## Количество байт в размере длинны. var rx_tick: int ## Время приёма последнего пакета. @@ -37,6 +37,7 @@ class SocketTCP extends TCPServer: var poll_sockets: Array[Socket] var tcp_sockets: Array var units: Dictionary +var units_udp: Dictionary var units_tcp: Dictionary var units_serial: Dictionary var serials: Dictionary @@ -78,7 +79,6 @@ func create_serial(nm) -> SerialPort: var rc = sp.open(port) if rc != Error.OK: log.message(log.ERROR, 'Невозможно открыть порт \"%s\" для \"%s\"' % [port, nm]) - return null log.message(log.INFO, 'Последовательный порт \"%s\"@%d открыт для \"%s\"' % [port, baud, nm]) return sp @@ -99,6 +99,7 @@ func _ready() -> void: var unit = PROTOCOL_TYPES[proto].new(unit_name) var unit_key = repsettings.get_unit_key(unit_name) units[unit_key] = unit + units_udp[unit_key] = unit if logger_page: unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) @@ -125,7 +126,7 @@ func _ready() -> void: units_serial[unit_key] = unit units[unit_key] = unit serials[unit_key] = serial - if serial: + if serial.is_open(): serial.data_received.connect(unit.parse) serial.start_monitoring(20000) @@ -197,7 +198,7 @@ func get_tcp_data(sock: SocketTCP, peer, len_rx): func _process(_delta: float) -> void: var tick = Time.get_ticks_msec() - for addr in units: + for addr in units_udp: var unit = units[addr] match unit.process(tick): Error.OK: sock_unicast.send_to([addr[0], dst_ports[addr]], unit.tx_data) @@ -206,7 +207,7 @@ func _process(_delta: float) -> void: var unit = units_serial[key] var serial = serials[key] match unit.process(tick): - Error.OK: serial.write_str(unit.tx_data) + Error.OK: serial.write_raw(unit.tx_data) Error.FAILED: emit_signal('socket_error', 'ошибка: \"%s\"' % unit.name) for sock_unit in tcp_sockets: var sock = sock_unit[0] From 4d36f646427d6c145f583c6ece306906a1749885 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 24 Oct 2024 14:52:36 +0300 Subject: [PATCH 16/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=A4=D0=BE=D1=80=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=A1=D0=9F=D0=A2-25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/pribor-uyep.tscn | 2 -- scripts/spt25.gd | 21 +++++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index 769ff93..ffa096e 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -80,7 +80,6 @@ offset_left = 15.0 offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 -state2 = 0 [node name="spt25_A2" parent="." instance=ExtResource("6_60xs3")] layout_mode = 0 @@ -115,4 +114,3 @@ offset_left = 15.0 offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 -state2 = 0 diff --git a/scripts/spt25.gd b/scripts/spt25.gd index 6616f05..b515288 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -4,16 +4,29 @@ class_name spt25_unit extends Node class SPT25 extends unit.Unit: var tx_tick: int = 0 - - func _init(nm) -> void: self.name = nm + var req_period = 3000 func _to_string() -> String: return String('СПТ-25: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) + func _init(nm) -> void: + self.name = nm + tx_data.resize(8) + tx_data[0] = 0x7e # Флаги синхронизации пакета + tx_data[1] = 0 # Адрес абонента, которому предназначен пакет + tx_data[2] = 4 # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя + tx_data[3] = 0 # Данные + tx_data[4] = 0 # Данные + tx_data[5] = 0 # Данные + tx_data[6] = 0 # Контрольная сумма + tx_data[7] = 0x7e # Флаги синхронизации пакета + func parse(rx_data: PackedByteArray): if not self.online: self.online = true emit_signal('line_changed', self) emit_signal('data_received', rx_data) - func process(delta: float): - pass + tick += delta + if (tick - tx_tick) > req_period: + return Error.OK + return Error.ERR_BUSY From 4932f241d6bab51cfb5840c4f3cc8fd5f7747f4e Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 24 Oct 2024 16:34:40 +0300 Subject: [PATCH 17/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9E=D1=82=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=B2=D0=BE=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index 6abcee2..90bad02 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -7,7 +7,14 @@ const SERIAL_PROTO: = {'uart': spt25.SPT25 } class Serial extends SerialPort: - pass + func send_to(data: PackedByteArray): + write_raw(data) + func try_open(parsing_proc: Callable): + if not is_open(): + open(port) + if is_open(): + data_received.connect(parsing_proc) + start_monitoring(timeout) class Socket extends PacketPeerUDP: @@ -71,11 +78,12 @@ func create_tcpsocket(nm) -> SocketTCP: return sock -func create_serial(nm) -> SerialPort: +func create_serial(nm) -> Serial: var port = repsettings.UnitProfiles[nm][1] var baud = repsettings.UnitProfiles[nm][2][0] - var sp: = SerialPort.new() + var sp: = Serial.new() sp.baudrate = baud + sp.timeout = 20000 var rc = sp.open(port) if rc != Error.OK: log.message(log.ERROR, 'Невозможно открыть порт \"%s\" для \"%s\"' % [port, nm]) @@ -126,9 +134,7 @@ func _ready() -> void: units_serial[unit_key] = unit units[unit_key] = unit serials[unit_key] = serial - if serial.is_open(): - serial.data_received.connect(unit.parse) - serial.start_monitoring(20000) + tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]]) @@ -207,7 +213,7 @@ func _process(_delta: float) -> void: var unit = units_serial[key] var serial = serials[key] match unit.process(tick): - Error.OK: serial.write_raw(unit.tx_data) + Error.OK: serial.send_to(unit.tx_data) Error.FAILED: emit_signal('socket_error', 'ошибка: \"%s\"' % unit.name) for sock_unit in tcp_sockets: var sock = sock_unit[0] From 659a62bcffb6e9b44f1a286e1b9a2ff55362ca72 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 25 Oct 2024 14:28:17 +0300 Subject: [PATCH 18/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9D=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82.=20=D0=9E=D1=82=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=B2?= =?UTF-8?q?=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/pribor-uyep.tscn | 8 ++++---- scenes/pribor-uyep/spt25_view.gd | 2 ++ scenes/контроль/элемент-я.gd | 3 --- scripts/network.gd | 5 +++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index ffa096e..e6c36c5 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -39,9 +39,9 @@ vertical_alignment = 1 [node name="Label" type="Label" parent="."] self_modulate = Color(0.835294, 0.141176, 0.286275, 1) layout_mode = 0 -offset_left = 225.0 +offset_left = 135.0 offset_top = 990.0 -offset_right = 600.0 +offset_right = 665.0 offset_bottom = 1009.0 text = "** Позиционные обозначения требуют уточнения **" horizontal_alignment = 1 @@ -54,9 +54,9 @@ offset_top = 485.0 offset_right = 375.0 offset_bottom = 895.0 script = ExtResource("4_v0lil") +unit_name = "уарэп-спт25-1" fname = "СПТ-25-230-400" rname = "A1" -unit_name = "уарэп-спт25-1" [node name="block_input1" parent="spt25_A1" instance=ExtResource("4_mrvir")] layout_mode = 0 @@ -88,9 +88,9 @@ offset_top = 485.0 offset_right = 675.0 offset_bottom = 895.0 script = ExtResource("4_v0lil") +unit_name = "уарэп-спт25-2" fname = "СПТ-25-230-400" rname = "A2" -unit_name = "уарэп-спт25-2" [node name="block_input1" parent="spt25_A2" instance=ExtResource("4_mrvir")] layout_mode = 0 diff --git a/scenes/pribor-uyep/spt25_view.gd b/scenes/pribor-uyep/spt25_view.gd index e332583..e64ea12 100644 --- a/scenes/pribor-uyep/spt25_view.gd +++ b/scenes/pribor-uyep/spt25_view.gd @@ -2,6 +2,8 @@ extends "res://scenes/контроль/элемент-я.gd" +@export var unit_name: String = '' + enum STATE_VAL { NONE = 0, diff --git a/scenes/контроль/элемент-я.gd b/scenes/контроль/элемент-я.gd index 759ec17..6062db6 100644 --- a/scenes/контроль/элемент-я.gd +++ b/scenes/контроль/элемент-я.gd @@ -26,9 +26,6 @@ func _on_button_pressed(): $margin/vbox.alignment = v -@export var unit_name: String = '' - - func _enter_tree() -> void: _on_resized() func _on_resized() -> void: diff --git a/scripts/network.gd b/scripts/network.gd index 90bad02..cdcacc8 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -87,7 +87,8 @@ func create_serial(nm) -> Serial: var rc = sp.open(port) if rc != Error.OK: log.message(log.ERROR, 'Невозможно открыть порт \"%s\" для \"%s\"' % [port, nm]) - log.message(log.INFO, 'Последовательный порт \"%s\"@%d открыт для \"%s\"' % [port, baud, nm]) + else: + log.message(log.INFO, 'Последовательный порт \"%s\"@%d открыт для \"%s\"' % [port, baud, nm]) return sp @@ -134,7 +135,7 @@ func _ready() -> void: units_serial[unit_key] = unit units[unit_key] = unit serials[unit_key] = serial - + serial.try_open(unit.parse) tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]]) From a865db4886d6df34272cd654a0911ca808285872 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Fri, 25 Oct 2024 15:12:42 +0300 Subject: [PATCH 19/26] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BD=D0=B0=D0=B4?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B5=D0=B9=20=D0=B2=20"=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D1=8C"=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=86=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=BC=20=D0=B4=D0=B8?= =?UTF-8?q?=D0=B0=D0=BF=D0=B0=D0=B7=D0=BE=D0=BD=D0=B0=D0=BC=20(370-6000)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-ecm-list/frm-ecm-list.tscn | 13 ++- scenes/grid-buttons-ecm/grid-buttons-ecm.tscn | 12 +-- scenes/pribor-prd-k/kasseta-fs-kd.tscn | 2 +- scenes/pribor-prd-k/pribor-prd-k.tscn | 53 ++++++++- scenes/pribor-prd-n/kasseta-fs-nd.tscn | 2 +- scenes/pribor-prd-n/pribor-prd-n.tscn | 101 +++++++++++++++++- scenes/pribor-prd-v/pribor-prd-v.tscn | 52 ++++++++- scenes/контроль/кассета-п-1.tscn | 44 ++++---- scenes/контроль/кассета-у-5-к.tscn | 4 +- scenes/работа/работа.gd | 49 ++++++--- scenes/работа/работа.tscn | 4 +- scenes/эмс/кнопка-эмс.gd | 32 +++--- scripts/tools.gd | 3 +- scripts/yems-boards.gd | 22 ++-- 14 files changed, 292 insertions(+), 101 deletions(-) diff --git a/scenes/frame-ecm-list/frm-ecm-list.tscn b/scenes/frame-ecm-list/frm-ecm-list.tscn index fceb9ed..3b8c4c1 100644 --- a/scenes/frame-ecm-list/frm-ecm-list.tscn +++ b/scenes/frame-ecm-list/frm-ecm-list.tscn @@ -48,7 +48,7 @@ offset_left = 8.0 offset_top = 245.0 offset_right = 472.0 offset_bottom = 281.0 -columns = 4 +columns = 5 [node name="btn_srn" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] layout_mode = 2 @@ -77,10 +77,19 @@ strips_rotation = 15.0 text = "КУПД" metadata/rfi_name = "ozp1" +[node name="btn_panika" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД" +strips_rotation = 15.0 +text = "Паника" +metadata/rfi_name = "ozp1" + [node name="btn_cancel" parent="grd_forced" groups=["прин-секторы-срн"] instance=ExtResource("4_7ys3c")] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 strips_rotation = 15.0 -text = "Отключить все" +text = "Очистить" metadata/rfi_name = "" diff --git a/scenes/grid-buttons-ecm/grid-buttons-ecm.tscn b/scenes/grid-buttons-ecm/grid-buttons-ecm.tscn index 880bd60..56a026e 100644 --- a/scenes/grid-buttons-ecm/grid-buttons-ecm.tscn +++ b/scenes/grid-buttons-ecm/grid-buttons-ecm.tscn @@ -5,7 +5,7 @@ [node name="grd_btns" type="GridContainer"] offset_right = 1096.0 offset_bottom = 54.0 -columns = 16 +columns = 15 [node name="btn_off" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] layout_mode = 2 @@ -17,16 +17,6 @@ disabled = true toggle_mode = true metadata/rfi_name = "off" -[node name="btn_auto_rfi" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -strips_rotation = 30.0 -text = "Запрет" -disabled = true -toggle_mode = true -metadata/rfi_name = "auto" - [node name="btn_p12" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] layout_mode = 2 size_flags_horizontal = 3 diff --git a/scenes/pribor-prd-k/kasseta-fs-kd.tscn b/scenes/pribor-prd-k/kasseta-fs-kd.tscn index fb896b8..adeda22 100644 --- a/scenes/pribor-prd-k/kasseta-fs-kd.tscn +++ b/scenes/pribor-prd-k/kasseta-fs-kd.tscn @@ -56,7 +56,7 @@ offset_top = 33.0 offset_right = 205.0 offset_bottom = 183.0 fname = "Блок ФС-6" -rname = "A4" +rname = "A5" [node name="ref_A5" parent="." instance=ExtResource("3_kqnvt")] offset_left = 205.0 diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index f82df2d..9c9cb6b 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -1,13 +1,14 @@ -[gd_scene load_steps=9 format=3 uid="uid://m5s87q7m66lj"] +[gd_scene load_steps=10 format=3 uid="uid://m5s87q7m66lj"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="1_8dmgr"] [ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_ufjwe"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_14h25"] [ext_resource type="PackedScene" uid="uid://cm5jd4gjrrpba" path="res://scenes/контроль/кассета-у-5-к.tscn" id="2_tb85r"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="6_fmhtx"] -[ext_resource type="PackedScene" uid="uid://dbxdb7lo7kofv" path="res://scenes/контроль/кассета-п-1.tscn" id="7_cjjs2"] [ext_resource type="PackedScene" uid="uid://bmagw8nd0ulhj" path="res://scenes/pribor-prd-k/kasseta-fs-kd.tscn" id="7_ia27q"] +[ext_resource type="Script" path="res://scenes/контроль/кассета.gd" id="7_xpa2n"] [ext_resource type="PackedScene" uid="uid://dq31j24gv5vi4" path="res://scenes/контроль/кассета-п-2.tscn" id="8_6fdp7"] +[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="8_la5yt"] [node name="pribor_prd_k" type="Control"] layout_mode = 3 @@ -24,6 +25,7 @@ offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 +fname = "Кассета У5" [node name="lbl_header" type="Label" parent="."] layout_mode = 0 @@ -43,7 +45,7 @@ offset_top = 907.0 offset_right = 645.0 offset_bottom = 949.0 fname = "MAA2000" -rname = "A22" +rname = "A27" [node name="dou2_A7" parent="." instance=ExtResource("1_8dmgr")] layout_mode = 0 @@ -61,7 +63,7 @@ offset_top = 907.0 offset_right = 168.0 offset_bottom = 949.0 fname = "MAA2000" -rname = "A23" +rname = "A28" [node name="dou2_A8" parent="." instance=ExtResource("1_8dmgr")] layout_mode = 0 @@ -351,14 +353,55 @@ offset_right = 485.0 offset_bottom = 622.0 fname = "Кассета ФС-КД" -[node name="kasseta_p_1" parent="." instance=ExtResource("7_cjjs2")] +[node name="kasseta_p_1" type="NinePatchRect" parent="."] layout_mode = 0 offset_left = 175.0 offset_top = 622.0 offset_right = 340.0 offset_bottom = 812.0 +texture = ExtResource("2_14h25") +patch_margin_left = 16 +patch_margin_top = 16 +patch_margin_right = 16 +patch_margin_bottom = 16 +script = ExtResource("7_xpa2n") fname = "Кассета П-1" +[node name="ref_A26" parent="kasseta_p_1" instance=ExtResource("8_la5yt")] +offset_left = 9.0 +offset_top = 33.0 +offset_right = 59.0 +offset_bottom = 183.0 +fname = "ИП12-50" +rname = "A26" + +[node name="ref_A23" parent="kasseta_p_1" instance=ExtResource("8_la5yt")] +offset_left = 59.0 +offset_top = 33.0 +offset_right = 109.0 +offset_bottom = 183.0 +fname = "ИП9-50" +rname = "A24" + +[node name="ref_A24" parent="kasseta_p_1" instance=ExtResource("8_la5yt")] +offset_left = 109.0 +offset_top = 33.0 +offset_right = 159.0 +offset_bottom = 183.0 +fname = "ИП9-50" +rname = "A23" + +[node name="lbl_fname" type="Label" parent="kasseta_p_1"] +self_modulate = Color(1, 1, 1, 0.62) +layout_mode = 0 +offset_left = 7.0 +offset_top = 8.0 +offset_right = 159.0 +offset_bottom = 33.0 +text = "Кассета П-1" +horizontal_alignment = 1 +vertical_alignment = 1 + [node name="kasseta_p_2" parent="." instance=ExtResource("8_6fdp7")] layout_mode = 0 offset_left = 365.0 diff --git a/scenes/pribor-prd-n/kasseta-fs-nd.tscn b/scenes/pribor-prd-n/kasseta-fs-nd.tscn index a6d27dc..6227ee9 100644 --- a/scenes/pribor-prd-n/kasseta-fs-nd.tscn +++ b/scenes/pribor-prd-n/kasseta-fs-nd.tscn @@ -39,7 +39,7 @@ offset_left = 105.0 offset_top = 32.0 offset_right = 155.0 offset_bottom = 182.0 -fname = "Блок ФС-2" +fname = "Блок ФС-3" rname = "A3" [node name="ref_A4" parent="." instance=ExtResource("2_mkgdh")] diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index e8e9d7e..c649aff 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -4,8 +4,8 @@ [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_lpj3d"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_i1no5"] [ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="5_ej152"] -[ext_resource type="PackedScene" uid="uid://cd5sue1e8iyrv" path="res://scenes/pribor-prd-n/kasseta-fs-nd.tscn" id="6_1p3pi"] -[ext_resource type="PackedScene" uid="uid://dbxdb7lo7kofv" path="res://scenes/контроль/кассета-п-1.tscn" id="7_klldp"] +[ext_resource type="Script" path="res://scenes/контроль/кассета.gd" id="6_b1cob"] +[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="7_dqc3e"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="8_u7eqo"] [node name="pribor_prd_n" type="Control"] @@ -96,22 +96,113 @@ offset_right = 485.0 offset_bottom = 432.0 fname = "Кассета У5" -[node name="kasseta_FS_ND" parent="." instance=ExtResource("6_1p3pi")] +[node name="kasseta_FS_ND" type="NinePatchRect" parent="."] layout_mode = 0 offset_left = 175.0 offset_top = 432.0 offset_right = 485.0 offset_bottom = 622.0 +texture = ExtResource("4_i1no5") +patch_margin_left = 16 +patch_margin_top = 16 +patch_margin_right = 16 +patch_margin_bottom = 16 +script = ExtResource("6_b1cob") fname = "Кассета ФС-НД" +metadata/Fname = "" -[node name="kasseta_P_1" parent="." instance=ExtResource("7_klldp")] +[node name="lbl_fname" type="Label" parent="kasseta_FS_ND"] +self_modulate = Color(1, 1, 1, 0.62) +layout_mode = 0 +offset_left = 5.0 +offset_top = 7.0 +offset_right = 303.0 +offset_bottom = 33.0 +text = "Кассета ФС-НД" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ref_A2" parent="kasseta_FS_ND" instance=ExtResource("7_dqc3e")] +offset_left = 55.0 +offset_top = 32.0 +offset_right = 105.0 +offset_bottom = 182.0 +fname = "Модуль ФС" +rname = "A1" + +[node name="ref_A3" parent="kasseta_FS_ND" instance=ExtResource("7_dqc3e")] +offset_left = 105.0 +offset_top = 32.0 +offset_right = 155.0 +offset_bottom = 182.0 +fname = "Блок ФС-2" +rname = "A3" + +[node name="ref_A4" parent="kasseta_FS_ND" instance=ExtResource("7_dqc3e")] +offset_left = 155.0 +offset_top = 32.0 +offset_right = 205.0 +offset_bottom = 182.0 +fname = "Модуль ФС" +rname = "A2" + +[node name="ref_A6" parent="kasseta_FS_ND" instance=ExtResource("7_dqc3e")] +offset_left = 205.0 +offset_top = 32.0 +offset_right = 255.0 +offset_bottom = 182.0 +fname = "Блок ФС-3" +rname = "A4" + +[node name="kasseta_P_1" type="NinePatchRect" parent="."] layout_mode = 0 offset_left = 175.0 offset_top = 622.0 offset_right = 485.0 offset_bottom = 812.0 +texture = ExtResource("4_i1no5") +patch_margin_left = 16 +patch_margin_top = 16 +patch_margin_right = 16 +patch_margin_bottom = 16 +script = ExtResource("6_b1cob") fname = "Кассета П-1" +[node name="ref_A26" parent="kasseta_P_1" instance=ExtResource("7_dqc3e")] +offset_left = 9.0 +offset_top = 33.0 +offset_right = 59.0 +offset_bottom = 183.0 +fname = "ИП9-50" +rname = "A19" + +[node name="ref_A23" parent="kasseta_P_1" instance=ExtResource("7_dqc3e")] +offset_left = 59.0 +offset_top = 33.0 +offset_right = 109.0 +offset_bottom = 183.0 +fname = "ИП9-50" +rname = "A20" + +[node name="ref_A24" parent="kasseta_P_1" instance=ExtResource("7_dqc3e")] +offset_left = 109.0 +offset_top = 33.0 +offset_right = 159.0 +offset_bottom = 183.0 +fname = "ИП12-50" +rname = "A21" + +[node name="lbl_fname" type="Label" parent="kasseta_P_1"] +self_modulate = Color(1, 1, 1, 0.62) +layout_mode = 0 +offset_left = 7.0 +offset_top = 8.0 +offset_right = 159.0 +offset_bottom = 33.0 +text = "Кассета П-1" +horizontal_alignment = 1 +vertical_alignment = 1 + [node name="um1535_A7" parent="." instance=ExtResource("8_u7eqo")] layout_mode = 0 offset_left = 485.0 @@ -212,7 +303,7 @@ value_name1 = "P, %" name_min_size0 = Vector2i(35, 20) name_min_size1 = Vector2i(35, 20) fname = "УМ1535А" -rname = "A11" +rname = "A12" [node name="um1535_A13" parent="." instance=ExtResource("8_u7eqo")] layout_mode = 0 diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 359d924..900676d 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -1,11 +1,12 @@ -[gd_scene load_steps=8 format=3 uid="uid://cvskpe1ti3p45"] +[gd_scene load_steps=9 format=3 uid="uid://cvskpe1ti3p45"] [ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_dl7rt"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_xpo4b"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="3_wyy1b"] [ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="4_gl2bl"] [ext_resource type="PackedScene" uid="uid://cd5sue1e8iyrv" path="res://scenes/pribor-prd-n/kasseta-fs-nd.tscn" id="5_nhd2k"] -[ext_resource type="PackedScene" uid="uid://dbxdb7lo7kofv" path="res://scenes/контроль/кассета-п-1.tscn" id="6_d3awr"] +[ext_resource type="Script" path="res://scenes/контроль/кассета.gd" id="6_os4mt"] +[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="7_38u2b"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="7_e22c6"] [node name="pribor_prd_n" type="Control"] @@ -104,13 +105,54 @@ offset_right = 485.0 offset_bottom = 622.0 fname = "Кассета ФС-ВД" -[node name="kasseta_P_1" parent="." instance=ExtResource("6_d3awr")] +[node name="kasseta_P_1" type="NinePatchRect" parent="."] layout_mode = 0 offset_left = 175.0 offset_top = 622.0 offset_right = 485.0 offset_bottom = 812.0 -fname = "Кассета П-1" +texture = ExtResource("3_wyy1b") +patch_margin_left = 16 +patch_margin_top = 16 +patch_margin_right = 16 +patch_margin_bottom = 16 +script = ExtResource("6_os4mt") +fname = "Кассета П-1В" + +[node name="ref_A26" parent="kasseta_P_1" instance=ExtResource("7_38u2b")] +offset_left = 9.0 +offset_top = 33.0 +offset_right = 59.0 +offset_bottom = 183.0 +fname = "ИП9-50" +rname = "A19" + +[node name="ref_A23" parent="kasseta_P_1" instance=ExtResource("7_38u2b")] +offset_left = 59.0 +offset_top = 33.0 +offset_right = 109.0 +offset_bottom = 183.0 +fname = "ИП9-50" +rname = "A20" + +[node name="ref_A24" parent="kasseta_P_1" instance=ExtResource("7_38u2b")] +offset_left = 109.0 +offset_top = 33.0 +offset_right = 159.0 +offset_bottom = 183.0 +fname = "ИП12-50" +rname = "A21" + +[node name="lbl_fname" type="Label" parent="kasseta_P_1"] +self_modulate = Color(1, 1, 1, 0.62) +layout_mode = 0 +offset_left = 7.0 +offset_top = 8.0 +offset_right = 159.0 +offset_bottom = 33.0 +text = "Кассета П-1В" +horizontal_alignment = 1 +vertical_alignment = 1 [node name="um1535_A7" parent="." instance=ExtResource("7_e22c6")] layout_mode = 0 @@ -224,7 +266,7 @@ value_name1 = "P, %" name_min_size0 = Vector2i(35, 20) name_min_size1 = Vector2i(35, 20) fname = "УМ1535А" -rname = "A11" +rname = "A12" [node name="um1535_A13" parent="." instance=ExtResource("7_e22c6")] layout_mode = 0 diff --git a/scenes/контроль/кассета-п-1.tscn b/scenes/контроль/кассета-п-1.tscn index 3a1ad51..4a1a6cd 100644 --- a/scenes/контроль/кассета-п-1.tscn +++ b/scenes/контроль/кассета-п-1.tscn @@ -5,7 +5,7 @@ [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_gg14a"] [node name="kasseta_p_1" type="NinePatchRect"] -offset_right = 165.0 +offset_right = 173.0 offset_bottom = 190.0 texture = ExtResource("1_sbi2k") patch_margin_left = 16 @@ -15,36 +15,36 @@ patch_margin_bottom = 16 script = ExtResource("2_7ydqi") [node name="ref_A26" parent="." instance=ExtResource("3_gg14a")] -offset_left = 7.0 -offset_top = 30.0 -offset_right = 57.0 -offset_bottom = 180.0 +offset_left = 9.0 +offset_top = 33.0 +offset_right = 59.0 +offset_bottom = 183.0 fname = "ИП12-50" -rname = "A26" +rname = "A19" [node name="ref_A23" parent="." instance=ExtResource("3_gg14a")] -offset_left = 57.0 -offset_top = 30.0 -offset_right = 107.0 -offset_bottom = 180.0 -fname = "ИП9-50" -rname = "A23" - -[node name="ref_A24" parent="." instance=ExtResource("3_gg14a")] -offset_left = 107.0 -offset_top = 30.0 -offset_right = 157.0 -offset_bottom = 180.0 +offset_left = 59.0 +offset_top = 33.0 +offset_right = 109.0 +offset_bottom = 183.0 fname = "ИП9-50" rname = "A24" +[node name="ref_A24" parent="." instance=ExtResource("3_gg14a")] +offset_left = 109.0 +offset_top = 33.0 +offset_right = 159.0 +offset_bottom = 183.0 +fname = "ИП9-50" +rname = "A23" + [node name="lbl_fname" type="Label" parent="."] self_modulate = Color(1, 1, 1, 0.62) layout_mode = 0 -offset_left = 5.0 -offset_top = 5.0 -offset_right = 157.0 -offset_bottom = 30.0 +offset_left = 7.0 +offset_top = 8.0 +offset_right = 159.0 +offset_bottom = 33.0 text = "Кассета" horizontal_alignment = 1 vertical_alignment = 1 diff --git a/scenes/контроль/кассета-у-5-к.tscn b/scenes/контроль/кассета-у-5-к.tscn index b32a91c..31b4a3b 100644 --- a/scenes/контроль/кассета-у-5-к.tscn +++ b/scenes/контроль/кассета-у-5-к.tscn @@ -63,7 +63,7 @@ offset_top = 32.0 offset_right = 255.0 offset_bottom = 182.0 fname = "УКП" -rname = "A35" +rname = "A36" [node name="ref_A36" parent="." instance=ExtResource("3_wtlpi")] offset_left = 254.0 @@ -71,4 +71,4 @@ offset_top = 32.0 offset_right = 304.0 offset_bottom = 182.0 fname = "УКП" -rname = "A36" +rname = "A35" diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 84bc34f..3d60105 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -66,13 +66,13 @@ const fs_sectors: Dictionary = { 1: [270.0, 360.0] } const fs_freq: Dictionary = { - 0: [400.0, 1200.0], - 1: [1200.0, 2000.0], - 2: [2000.0, 2800.0], - 3: [2800.0, 3600.0], - 4: [3600.0, 4400.0], - 5: [4400.0, 5200.0], - 6: [5200.0, 6000.0] } + 0: [370.0, 800.0, 200.0, 250.0], + 1: [800.0, 1065.0, 250.0, 300.0], + 2: [1065.0, 1180.0, 300.0, 350.0], + 3: [1180.0, 1450.0, 350.0, 400.0], + 4: [1450.0, 2000.0, 400.0, 450.0], + 5: [2000.0, 3500.0, 450.0, 500.0], + 6: [3500.0, 6000.0, 500.0, 550.0] } ## Размеры карты для разных режимов РТО и РЛС соответственно @@ -82,7 +82,6 @@ const map_sizes = [ var fs_band = fs_band_rto ## Текущий режим блоков ФС по частоте var fs_selected: Dictionary ## Словарь выбранных секторов var fs_active: Dictionary ## Словарь секторов назначенных на подавление - ## Состояние перетаскивания. enum DragFSM { DRAG, ## В процессе. @@ -168,18 +167,32 @@ func get_all_nodes(root): for child in root.get_children(): nodes.append_array(get_all_nodes(child)) return nodes - + ## Производит отображение цели на диаграмму. func map_threat_to_bip(th: threats.Threat, bip: Control): - bip.position = tools.pos_calc( - th.freq, - th.aoa, - radius_center, - radius_internal, - radius_outter, - freq_low, - freq_high) - bip.size / 2 + var freq = th.freq + var sector_key = null + var sector_width = 50.0 + for key in fs_freq: + var freq_range = fs_freq[key] + var num_values = (freq_range[1]- freq_range[0]) / sector_width + if freq_range[0] <= freq and freq <= freq_range[1]: + sector_key = key + break + if sector_key!= null: + radius_internal = fs_freq[sector_key][2] + radius_outter = fs_freq[sector_key][3] + freq_low = fs_freq[sector_key][0] + freq_high = fs_freq[sector_key][1] + bip.position = tools.pos_calc( + th.freq, + th.aoa, + radius_center, + radius_internal, + radius_outter, + freq_low, + freq_high) - bip.size / 2 ## Обработчик сигнала обновления цели. @@ -241,6 +254,7 @@ func on_threat_lost(th) -> void: remove_child(bip) bip.free() + ## обработчик нажатия на цель на экране. func on_bip_pressed(th_id, _ecm_btns): if btn_select == BtnSel.THREAT: @@ -430,6 +444,7 @@ func update_fs_colors(): fs_colors[key] = color_select $canvas.set_band_colors(fs_colors) + func unsel_fs_all(need_btns_off: bool): fs_selected.clear() update_fs_colors() diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 357d0d0..c775be4 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -21,10 +21,10 @@ col_red = Color(1, 0.568627, 0.431373, 0.239216) drag_scale_band = 0.05 drag_scale_width = 0.5 freq_high = 6000.0 -freq_low = 400.0 +freq_low = 370.0 radius_center = Vector2(560, 560) radius_internal = 200.0 -radius_outter = 350.0 +radius_outter = 200.0 strob_max_band = 15.538 strob_max_width = 90.0 strob_min_band = 0.1 diff --git a/scenes/эмс/кнопка-эмс.gd b/scenes/эмс/кнопка-эмс.gd index e8aa9c4..37bcaf7 100644 --- a/scenes/эмс/кнопка-эмс.gd +++ b/scenes/эмс/кнопка-эмс.gd @@ -4,28 +4,28 @@ extends PanelContainer @export var texture_state0: Texture2D = preload('res://data/кнопка-эмс-1.png'): - set(val): $state.set_texture(val) + set(val): $state.set_texture(val) @export var texture_state1: Texture2D = preload('res://data/кнопка-эмс-0.png'): - set(val): $state.set_texture(val) + set(val): $state.set_texture(val) @export var text: String = '': - set(val): $button.set_text(val) - get: return $button.get_text() + set(val): $button.set_text(val) + get: return $button.get_text() @export var pressed: bool = false: - set(val): $button.set_pressed(val) - get: return $button.is_pressed() + set(val): $button.set_pressed(val) + get: return $button.is_pressed() @export var toggle_mode: bool = false: - set(val): - if is_inside_tree(): - $button.set_toggle_mode(val) - get: return $button.is_toggle_mode() + set(val): + if is_inside_tree(): + $button.set_toggle_mode(val) + get: return $button.is_toggle_mode() func set_text (val: String): $button.set_text(val) @@ -33,8 +33,8 @@ func set_pressed (val: bool): $button.set_pressed(val) func set_toggle_mode (val: bool): - if is_inside_tree(): - $button.set_toggle_mode(val) + if is_inside_tree(): + $button.set_toggle_mode(val) func get_text(): return $button.get_text() @@ -43,13 +43,13 @@ func is_toggle_mode(): return $button.is_toggle_mode() func _on_button_toggled(val: bool): - if val: $state.set_texture(texture_state1) - else: $state.set_texture(texture_state0) + if val: $state.set_texture(texture_state1) + else: $state.set_texture(texture_state0) func button_connect(button_signal: String, proc: Callable): - $button.connect(button_signal, proc) + $button.connect(button_signal, proc) func _on_button_mouse_entered(): - emit_signal("mouse_entered") + emit_signal("mouse_entered") diff --git a/scripts/tools.gd b/scripts/tools.gd index d19a303..beeee06 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -72,8 +72,9 @@ func get_string_slice(s_in: String, s_out: Array, i0: int, i1: int): ## Производит преобразование из декартовой в полярную систему координат. func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float): - var r = ((freq - f0) / (f1 - f0)) * r1 + r0 + var r = remap(freq, f0, f1, r0, r1) var aoa_rad = radians(aoa) - PI / 2.0 + return Vector2(cos(aoa_rad), sin(aoa_rad)) * r + pos0 diff --git a/scripts/yems-boards.gd b/scripts/yems-boards.gd index 8e14f3d..1c5edb1 100644 --- a/scripts/yems-boards.gd +++ b/scripts/yems-boards.gd @@ -1,15 +1,15 @@ 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_tbl: Array - var out_tbl: Array + var id_board: String + var in_devs: Dictionary ## Словарь с входными устройствами. + var out_devs: Dictionary ## Словарь с выходными устройствами. + var base_addr_isa: int ## Базовый адрес ячейки isa. + var in_tbl: Array + var out_tbl: Array - func _init(id, base_addr, in_table, out_table): - id_board = id - in_tbl = in_table - out_tbl = out_table - base_addr_isa = base_addr + func _init(id, base_addr, in_table, out_table): + id_board = id + in_tbl = in_table + out_tbl = out_table + base_addr_isa = base_addr From 677e564b6751bd09b184747b6943b68469106597 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 28 Oct 2024 08:36:34 +0300 Subject: [PATCH 20/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5:=20"Invalid=20call.=20Nonexisten?= =?UTF-8?q?t=20function"=20=D0=B2=20=D1=82=D0=BE=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D1=8F=20=D0=BA=D0=B0=D0=BA=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D1=83=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/godot-logger/scripts/logger.gd | 1 + scripts/repnetwork.gd | 1 + scripts/repsettings.gd | 1 + 3 files changed, 3 insertions(+) diff --git a/addons/godot-logger/scripts/logger.gd b/addons/godot-logger/scripts/logger.gd index 8110466..57684f0 100644 --- a/addons/godot-logger/scripts/logger.gd +++ b/addons/godot-logger/scripts/logger.gd @@ -1,3 +1,4 @@ +@tool # Copyright (c) 2020-2023 Mansur Isaev and contributors - MIT License # See `LICENSE.md` included in the source distribution for details. diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 1ffaf91..480db35 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -1,3 +1,4 @@ +@tool class_name rep_network extends Node diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 26b4a9a..5e9ac36 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -1,3 +1,4 @@ +@tool class_name rep_settings extends Node ## Параметры. From efd717d0fedb5e4abd1b2f03004cecfb9d217d7d Mon Sep 17 00:00:00 2001 From: lepshiy Date: Mon, 28 Oct 2024 10:02:15 +0300 Subject: [PATCH 21/26] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=20=D0=B2=20"=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.tscn | 24 ++++++++--------- scenes/pribor-prd-n/pribor-prd-n.tscn | 38 +++++++++++++-------------- scenes/pribor-prd-v/pribor-prd-v.tscn | 38 +++++++++++++-------------- scenes/контроль/кассета.gd | 3 ++- 4 files changed, 52 insertions(+), 51 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index 9c9cb6b..00c58b4 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -30,7 +30,7 @@ fname = "Кассета У5" [node name="lbl_header" type="Label" parent="."] layout_mode = 0 offset_left = 20.0 -offset_top = 210.0 +offset_top = 214.0 offset_right = 640.0 offset_bottom = 240.0 theme_override_font_sizes/font_size = 22 @@ -42,7 +42,7 @@ vertical_alignment = 1 layout_mode = 0 offset_left = 485.0 offset_top = 907.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A27" @@ -51,7 +51,7 @@ rname = "A27" layout_mode = 0 offset_left = 8.0 offset_top = 862.0 -offset_right = 168.0 +offset_right = 175.0 offset_bottom = 907.0 fname = "ДОУ-6" rname = "A7" @@ -60,7 +60,7 @@ rname = "A7" layout_mode = 0 offset_left = 8.0 offset_top = 907.0 -offset_right = 168.0 +offset_right = 175.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A28" @@ -69,7 +69,7 @@ rname = "A28" layout_mode = 0 offset_left = 8.0 offset_top = 812.0 -offset_right = 168.0 +offset_right = 175.0 offset_bottom = 860.0 fname = "ДОУ-7" rname = "A8" @@ -102,7 +102,7 @@ vertical_alignment = 1 layout_mode = 0 offset_left = 485.0 offset_top = 242.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 337.0 value0 = 28.0 value1 = 70.0 @@ -121,7 +121,7 @@ rname = "A10" layout_mode = 0 offset_left = 485.0 offset_top = 337.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 432.0 value0 = 28.0 value1 = 57.0 @@ -140,7 +140,7 @@ rname = "A11" layout_mode = 0 offset_left = 485.0 offset_top = 432.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 527.0 value0 = 28.0 value1 = 57.0 @@ -159,7 +159,7 @@ rname = "A12" layout_mode = 0 offset_left = 485.0 offset_top = 527.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 622.0 value0 = 28.0 value1 = 57.0 @@ -178,7 +178,7 @@ rname = "A13" layout_mode = 0 offset_left = 485.0 offset_top = 622.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 717.0 value0 = 28.0 value1 = 57.0 @@ -197,7 +197,7 @@ rname = "A14" layout_mode = 0 offset_left = 485.0 offset_top = 717.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 812.0 value0 = 28.0 value1 = 57.0 @@ -216,7 +216,7 @@ rname = "A15" layout_mode = 0 offset_left = 485.0 offset_top = 812.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 907.0 value0 = 28.0 value1 = 57.0 diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index c649aff..f9d1bcd 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -21,8 +21,8 @@ script = ExtResource("1_mcea3") layout_mode = 2 offset_left = 485.0 offset_top = 877.0 -offset_right = 645.0 -offset_bottom = 942.0 +offset_right = 652.0 +offset_bottom = 949.0 fname = "MAA2000" rname = "A22" @@ -30,23 +30,23 @@ rname = "A22" layout_mode = 2 offset_left = 485.0 offset_top = 812.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 877.0 fname = "ДОУ-2" rname = "A5" [node name="maa2000_A23" parent="." instance=ExtResource("2_lpj3d")] layout_mode = 2 -offset_left = 15.0 +offset_left = 8.0 offset_top = 877.0 offset_right = 175.0 -offset_bottom = 942.0 +offset_bottom = 949.0 fname = "MAA2000" rname = "A23" [node name="dou2_A6" parent="." instance=ExtResource("2_lpj3d")] layout_mode = 2 -offset_left = 15.0 +offset_left = 8.0 offset_top = 812.0 offset_right = 175.0 offset_bottom = 877.0 @@ -58,7 +58,7 @@ layout_mode = 0 offset_left = 175.0 offset_top = 812.0 offset_right = 485.0 -offset_bottom = 942.0 +offset_bottom = 949.0 texture = ExtResource("4_i1no5") patch_margin_left = 16 patch_margin_top = 16 @@ -207,7 +207,7 @@ vertical_alignment = 1 layout_mode = 0 offset_left = 485.0 offset_top = 242.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 337.0 value0 = 27.0 value1 = 56.0 @@ -224,7 +224,7 @@ rname = "A7" layout_mode = 0 offset_left = 485.0 offset_top = 337.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 432.0 value0 = 27.0 value1 = 56.0 @@ -241,7 +241,7 @@ rname = "A8" layout_mode = 0 offset_left = 485.0 offset_top = 432.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 527.0 value0 = 27.0 value1 = 56.0 @@ -258,7 +258,7 @@ rname = "A9" layout_mode = 0 offset_left = 485.0 offset_top = 527.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 622.0 value0 = 27.0 value1 = 56.0 @@ -275,7 +275,7 @@ rname = "A10" layout_mode = 0 offset_left = 485.0 offset_top = 622.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 717.0 value0 = 27.0 value1 = 56.0 @@ -292,7 +292,7 @@ rname = "A11" layout_mode = 0 offset_left = 485.0 offset_top = 717.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 812.0 value0 = 27.0 value1 = 56.0 @@ -307,7 +307,7 @@ rname = "A12" [node name="um1535_A13" parent="." instance=ExtResource("8_u7eqo")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 242.0 offset_right = 175.0 offset_bottom = 337.0 @@ -326,7 +326,7 @@ rname = "A13" [node name="um1535_A14" parent="." instance=ExtResource("8_u7eqo")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 337.0 offset_right = 175.0 offset_bottom = 432.0 @@ -343,7 +343,7 @@ rname = "A14" [node name="um1535_A15" parent="." instance=ExtResource("8_u7eqo")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 432.0 offset_right = 175.0 offset_bottom = 527.0 @@ -360,7 +360,7 @@ rname = "A15" [node name="um1535_A16" parent="." instance=ExtResource("8_u7eqo")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 527.0 offset_right = 175.0 offset_bottom = 622.0 @@ -377,7 +377,7 @@ rname = "A16" [node name="um1535_A17" parent="." instance=ExtResource("8_u7eqo")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 622.0 offset_right = 175.0 offset_bottom = 717.0 @@ -394,7 +394,7 @@ rname = "A17" [node name="um1535_A18" parent="." instance=ExtResource("8_u7eqo")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 717.0 offset_right = 175.0 offset_bottom = 812.0 diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 900676d..75b2c6a 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -22,8 +22,8 @@ script = ExtResource("1_dl7rt") layout_mode = 2 offset_left = 485.0 offset_top = 877.0 -offset_right = 645.0 -offset_bottom = 942.0 +offset_right = 652.0 +offset_bottom = 949.0 fname = "MAA2000" rname = "A22" @@ -31,23 +31,23 @@ rname = "A22" layout_mode = 2 offset_left = 485.0 offset_top = 812.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 877.0 fname = "ДОУ-4" rname = "A5" [node name="maa2000_A23" parent="." instance=ExtResource("2_xpo4b")] layout_mode = 2 -offset_left = 15.0 +offset_left = 8.0 offset_top = 877.0 offset_right = 175.0 -offset_bottom = 942.0 +offset_bottom = 949.0 fname = "MAA2000" rname = "A23" [node name="dou5_A6" parent="." instance=ExtResource("2_xpo4b")] layout_mode = 2 -offset_left = 15.0 +offset_left = 8.0 offset_top = 812.0 offset_right = 175.0 offset_bottom = 877.0 @@ -59,7 +59,7 @@ layout_mode = 0 offset_left = 175.0 offset_top = 812.0 offset_right = 485.0 -offset_bottom = 942.0 +offset_bottom = 949.0 texture = ExtResource("3_wyy1b") patch_margin_left = 16 patch_margin_top = 16 @@ -158,7 +158,7 @@ vertical_alignment = 1 layout_mode = 0 offset_left = 485.0 offset_top = 242.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 337.0 value0 = 91.0 value1 = 22.0 @@ -177,7 +177,7 @@ rname = "A7" layout_mode = 0 offset_left = 485.0 offset_top = 337.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 432.0 value0 = 91.0 value1 = 22.0 @@ -196,7 +196,7 @@ rname = "A8" layout_mode = 0 offset_left = 485.0 offset_top = 432.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 527.0 value0 = 91.0 value1 = 22.0 @@ -215,7 +215,7 @@ rname = "A9" layout_mode = 0 offset_left = 485.0 offset_top = 527.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 622.0 value0 = 91.0 value1 = 22.0 @@ -234,7 +234,7 @@ rname = "A10" layout_mode = 0 offset_left = 485.0 offset_top = 622.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 717.0 value0 = 91.0 value1 = 22.0 @@ -253,7 +253,7 @@ rname = "A11" layout_mode = 0 offset_left = 485.0 offset_top = 717.0 -offset_right = 645.0 +offset_right = 652.0 offset_bottom = 812.0 value0 = 91.0 value1 = 22.0 @@ -270,7 +270,7 @@ rname = "A12" [node name="um1535_A13" parent="." instance=ExtResource("7_e22c6")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 242.0 offset_right = 175.0 offset_bottom = 337.0 @@ -289,7 +289,7 @@ rname = "A13" [node name="um1535_A14" parent="." instance=ExtResource("7_e22c6")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 337.0 offset_right = 175.0 offset_bottom = 432.0 @@ -308,7 +308,7 @@ rname = "A14" [node name="um1535_A15" parent="." instance=ExtResource("7_e22c6")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 432.0 offset_right = 175.0 offset_bottom = 527.0 @@ -327,7 +327,7 @@ rname = "A15" [node name="um1535_A16" parent="." instance=ExtResource("7_e22c6")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 527.0 offset_right = 175.0 offset_bottom = 622.0 @@ -346,7 +346,7 @@ rname = "A16" [node name="um1535_A17" parent="." instance=ExtResource("7_e22c6")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 622.0 offset_right = 175.0 offset_bottom = 717.0 @@ -365,7 +365,7 @@ rname = "A17" [node name="um1535_A18" parent="." instance=ExtResource("7_e22c6")] layout_mode = 0 -offset_left = 15.0 +offset_left = 8.0 offset_top = 717.0 offset_right = 175.0 offset_bottom = 812.0 diff --git a/scenes/контроль/кассета.gd b/scenes/контроль/кассета.gd index fb83827..a91fc7a 100644 --- a/scenes/контроль/кассета.gd +++ b/scenes/контроль/кассета.gd @@ -9,7 +9,8 @@ extends NinePatchRect @export var fname: String: set(v): fname = v - $lbl_fname.text = v + if is_inside_tree(): + $lbl_fname.text = v @export var rname: String: From 3760245abe9e80c2b61045307ff08c6029b91784 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 28 Oct 2024 11:08:14 +0300 Subject: [PATCH 22/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20Godot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/block-output.tscn | 1 - scenes/pribor-uyep/pribor-uyep.tscn | 2 -- 2 files changed, 3 deletions(-) diff --git a/scenes/pribor-uyep/block-output.tscn b/scenes/pribor-uyep/block-output.tscn index 3248d18..2757414 100644 --- a/scenes/pribor-uyep/block-output.tscn +++ b/scenes/pribor-uyep/block-output.tscn @@ -100,7 +100,6 @@ offset_bottom = 70.0 theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") script = SubResource("GDScript_oj3k3") textures = [ExtResource("1_20kkm"), ExtResource("2_t54t5"), ExtResource("3_et31i")] -state2 = null [node name="rect" type="NinePatchRect" parent="."] layout_mode = 2 diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index e22929e..ffa096e 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -80,7 +80,6 @@ offset_left = 15.0 offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 -state2 = null [node name="spt25_A2" parent="." instance=ExtResource("6_60xs3")] layout_mode = 0 @@ -115,4 +114,3 @@ offset_left = 15.0 offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 -state2 = null From 02799526715c8a152c4b3245f0842fca806f0a64 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 28 Oct 2024 11:11:38 +0300 Subject: [PATCH 23/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=20=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D1=8E=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=D1=82=20=D0=A1?= =?UTF-8?q?=D0=9F=D0=A2-25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/spt25_view.gd | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scenes/pribor-uyep/spt25_view.gd b/scenes/pribor-uyep/spt25_view.gd index e332583..7c8211c 100644 --- a/scenes/pribor-uyep/spt25_view.gd +++ b/scenes/pribor-uyep/spt25_view.gd @@ -10,12 +10,18 @@ enum STATE_VAL } -func _ready() -> void: +func _enter_tree() -> void: var unit_key = repsettings.get_unit_key(unit_name) var unit = repnetwork.units[unit_key] unit.connect('data_received', on_data_received.bind(unit)) +func _exit_tree() -> void: + var unit_key = repsettings.get_unit_key(unit_name) + var unit = repnetwork.units[unit_key] + unit.disconnect('data_received', on_data_received) + + func on_data_received(data, unit): # Неисправность, напряжение на выходе меньше номинального $block_output.state0 = STATE_VAL.GOOD if (data[4] & (1 << 0)) == 0 else STATE_VAL.ERROR From c0bab42b326e5a776f1b300b4589eb6d579cc5e1 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 28 Oct 2024 11:12:38 +0300 Subject: [PATCH 24/26] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=92=D0=BE=D0=B7=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=BE=D0=B1=D1=80=D0=B0=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BA=20=D0=BD=D1=83=D0=BB=D0=B5=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/кассета.gd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scenes/контроль/кассета.gd b/scenes/контроль/кассета.gd index fb83827..a91fc7a 100644 --- a/scenes/контроль/кассета.gd +++ b/scenes/контроль/кассета.gd @@ -9,7 +9,8 @@ extends NinePatchRect @export var fname: String: set(v): fname = v - $lbl_fname.text = v + if is_inside_tree(): + $lbl_fname.text = v @export var rname: String: From 3ea07e56238895afe23e0799b871c8e711a5c033 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 28 Oct 2024 11:13:08 +0300 Subject: [PATCH 25/26] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=A7=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D1=82=20=D0=BF=D1=80=D0=BE=D0=B1=D0=B5?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/работа/работа.gd | 14 +++++++------- scripts/interfer.gd | 8 ++++---- scripts/threats.gd | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 3d60105..c734647 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -72,7 +72,7 @@ const fs_freq: Dictionary = { 3: [1180.0, 1450.0, 350.0, 400.0], 4: [1450.0, 2000.0, 400.0, 450.0], 5: [2000.0, 3500.0, 450.0, 500.0], - 6: [3500.0, 6000.0, 500.0, 550.0] } + 6: [3500.0, 6000.0, 500.0, 550.0] } ## Размеры карты для разных режимов РТО и РЛС соответственно @@ -167,7 +167,7 @@ func get_all_nodes(root): for child in root.get_children(): nodes.append_array(get_all_nodes(child)) return nodes - + ## Производит отображение цели на диаграмму. func map_threat_to_bip(th: threats.Threat, bip: Control): @@ -185,7 +185,7 @@ func map_threat_to_bip(th: threats.Threat, bip: Control): radius_outter = fs_freq[sector_key][3] freq_low = fs_freq[sector_key][0] freq_high = fs_freq[sector_key][1] - bip.position = tools.pos_calc( + bip.position = tools.pos_calc( th.freq, th.aoa, radius_center, @@ -200,7 +200,7 @@ func on_threat_update(th): var bip = get_node('%d' % th.id) bip.update() map_threat_to_bip(th, bip) - + ## Обработчик выбора помехи для цели. func on_interfer_new(ecm): @@ -231,8 +231,8 @@ func on_interfer_off_all(): bip.set_track_visible(false) fs_active.clear() update_fs_colors() - - + + func on_interfer_off(ecm_id): fs_active.erase(ecm_id) fs_selected.erase(ecm_id) @@ -499,7 +499,7 @@ func set_btns_disabled(value: bool, btn): btn.set_disabled(true) else: btn.set_disabled(value) - + func on_fs_update_color(ecms): fs_active.clear() for ecm in ecms.values(): diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 672e2c5..834d47c 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -115,7 +115,7 @@ func _ready(): signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update').bind(ecms, unit)) signaller.connect('interfer_off', Callable(self, 'on_interfer_off')) threats.connect('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit)) - + ## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку. func on_timer_check_state(unit, ecms, resend_timeout): @@ -137,8 +137,8 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit): ecm.kni = thr.aoa send_ecm(ecm, unit) signaller.emit_signal('fs_update_color', ecms) - - + + ## Производит приём состояния помех. [param unit] -> [param ecms]. func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): if not unit.json_dic.has('ts'): return @@ -262,7 +262,7 @@ func on_interfer_off_all(unit, ecms): push_id(ecm.ispp) send_ecm(ecm, unit) signaller.emit_signal('interfer_off',ecm, ecms, thrs) - + func on_threats_lost(th, ecms, unit): for key in interfer.thrs: if interfer.thrs[key] == th.id: diff --git a/scripts/threats.gd b/scripts/threats.gd index d991962..6ee893f 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -76,7 +76,7 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary): call_deferred('emit_signal', 'threat_lost', th) if sz != threats.size(): call_deferred('emit_signal', 'threats_resized', threats) - + func on_timer_aoa_update(threats:Dictionary): signaller.emit_signal('th_aoa_update', threats) From 2632ab14becfef2ab25c7b327fa222d1660c7289 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 28 Oct 2024 11:23:45 +0300 Subject: [PATCH 26/26] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 4 ++-- scripts/{repnetwork.gd => network.gd} | 0 scripts/{repsettings.gd => settings.gd} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename scripts/{repnetwork.gd => network.gd} (100%) rename scripts/{repsettings.gd => settings.gd} (100%) diff --git a/project.godot b/project.godot index 33b7b08..d42a388 100644 --- a/project.godot +++ b/project.godot @@ -47,8 +47,8 @@ commit="*res://scripts/commit.gd" log="*res://addons/godot-logger/scripts/logger.gd" tools="*res://scripts/tools.gd" signaller="*res://scripts/signaller.gd" -repsettings="*res://scripts/repsettings.gd" -repnetwork="*res://scripts/repnetwork.gd" +repsettings="*res://scripts/settings.gd" +repnetwork="*res://scripts/network.gd" yau07="*res://scripts/yau07.gd" capsrpb="*res://scripts/capsrpb.gd" table="*res://table/table.gd" diff --git a/scripts/repnetwork.gd b/scripts/network.gd similarity index 100% rename from scripts/repnetwork.gd rename to scripts/network.gd diff --git a/scripts/repsettings.gd b/scripts/settings.gd similarity index 100% rename from scripts/repsettings.gd rename to scripts/settings.gd