diff --git a/project.godot b/project.godot index 5442dac..31c3bfb 100644 --- a/project.godot +++ b/project.godot @@ -122,7 +122,6 @@ folder_colors={ "res://scenes/pribor-prd-k/": "purple", "res://scenes/pribor-prd-n/": "purple", "res://scenes/pribor-prd-v/": "purple", -"res://scenes/pribor-rtr/": "purple", "res://scenes/pribor-uf/": "purple", "res://scenes/pribor-uyep/": "purple", "res://scenes/tabs-switch/": "blue", diff --git a/scenes/pribor-afsp/bort-afsp.tscn b/scenes/pribor-afsp/bort-afsp.tscn index 501c6ef..7150a58 100644 --- a/scenes/pribor-afsp/bort-afsp.tscn +++ b/scenes/pribor-afsp/bort-afsp.tscn @@ -13,12 +13,13 @@ signal pressed(control: PanelContainer) func _on_item_pressed(control): emit_signal('pressed', control) " -[node name="bort_rtr" type="Control"] +[node name="bort_afsp" type="Control"] layout_mode = 3 anchors_preset = 0 offset_right = 580.0 offset_bottom = 1185.0 script = SubResource("GDScript_y4aoq") +metadata/DeviceName = &"" [node name="konverter" type="NinePatchRect" parent="."] layout_mode = 0 diff --git a/scenes/pribor-afsp/pribor-afsp-1.tscn b/scenes/pribor-afsp/pribor-afsp-1.tscn index b9e3da6..907863f 100644 --- a/scenes/pribor-afsp/pribor-afsp-1.tscn +++ b/scenes/pribor-afsp/pribor-afsp-1.tscn @@ -19,6 +19,7 @@ offset_right = 70.0 offset_bottom = 30.0 scale = Vector2(1, 0.9) script = ExtResource("1_151rh") +metadata/DeviceName = &"Устройство РР левого борта" [node name="request" type="HTTPRequest" parent="."] script = ExtResource("2_4vyhj") diff --git a/scenes/pribor-afsp/pribor-afsp-2.tscn b/scenes/pribor-afsp/pribor-afsp-2.tscn index a13639b..6e0c434 100644 --- a/scenes/pribor-afsp/pribor-afsp-2.tscn +++ b/scenes/pribor-afsp/pribor-afsp-2.tscn @@ -19,6 +19,7 @@ offset_right = 81.0 offset_bottom = 108.0 scale = Vector2(1, 0.9) script = ExtResource("1_tfses") +metadata/DeviceName = &"Устройство РР правого борта" [node name="request" type="HTTPRequest" parent="."] script = ExtResource("2_miwrd") diff --git a/scenes/pribor-afsp/pribor-afsp.gd b/scenes/pribor-afsp/pribor-afsp.gd index 5ad7a28..ca717ba 100644 --- a/scenes/pribor-afsp/pribor-afsp.gd +++ b/scenes/pribor-afsp/pribor-afsp.gd @@ -1,6 +1,6 @@ class_name pribor_afsp extends 'res://scenes/контроль/прибор.gd' -@export var prefix_path: String = '' +@export var prefix_path: String = 'DeviceDescripton[DeviceName]' static var json_conv: JSON = JSON.new() @@ -49,10 +49,8 @@ func _on_request_rtr_request_completed(result, _response_code, headers, body: Pa push_error('разбор json прерван - \"%s\" (%s)' % [err, headers]) return - - var pp = ['DeviceDescripton', 'DeviceName'] - var ppp = [] - map_solid_to_array(prefix_path, ppp) + var pp = [] + map_solid_to_array(prefix_path, pp) var ret_val = [null, false, 0] var pp_copy = pp.duplicate(true) tools.get_value_by_path(json_conv.data, pp, ret_val) @@ -60,27 +58,26 @@ func _on_request_rtr_request_completed(result, _response_code, headers, body: Pa push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]]) return - var bort_rtr_name_left: StringName = $left.get_meta('DeviceName', '') - var bort_rtr_name_right: StringName = $right.get_meta('DeviceName', '') - var bb = {bort_rtr_name_left: $left, bort_rtr_name_right: $right} - if not bb.has(ret_val[0]): + var this_afsp_name: StringName = $bort.get_meta('DeviceName', '') + var received_afsp_name: StringName = ret_val[0] + + if this_afsp_name != received_afsp_name: return - var bort_rtr = bb[ret_val[0]] - for child in bort_rtr.get_node('konverter/grid').get_children(): + for child in $bort.get_node('konverter/grid').get_children(): map_value_to_item(json_conv.data, child, 'value0') map_value_to_item(json_conv.data, child, 'value1') map_value_to_item(json_conv.data, child, 'value2') map_error_codes_to_item(json_conv.data, child, 'state', 0) - for child in bort_rtr.get_node('antenna1/grid').get_children(): + for child in $bort.get_node('antenna1/grid').get_children(): map_value_to_item(json_conv.data, child, 'value0') map_value_to_item(json_conv.data, child, 'value1') map_error_codes_to_item(json_conv.data, child, 'state', 0) - for child in bort_rtr.get_node('antenna2/grid').get_children(): + for child in $bort.get_node('antenna2/grid').get_children(): map_value_to_item(json_conv.data, child, 'value0') map_value_to_item(json_conv.data, child, 'value1') map_error_codes_to_item(json_conv.data, child, 'state', 0) - for child in bort_rtr.get_children(): + for child in $bort.get_children(): map_value_to_item(json_conv.data, child, 'value0') map_value_to_item(json_conv.data, child, 'value1') map_error_codes_to_item(json_conv.data, child, 'state', 0) @@ -100,7 +97,7 @@ func map_value_to_item(data, item, value_name: StringName): if ret_val[1]: item.set(value_name, ret_val[0]) else: - push_error('не найденпуть %s (%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text]) + push_error('не найден путь %s (%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text]) func map_error_codes_to_item(data, item, value_name: StringName, value_init: int): diff --git a/scenes/pribor-rtr/pribor-rtr.gd b/scenes/pribor-afsp/pribor-rtr.gd similarity index 100% rename from scenes/pribor-rtr/pribor-rtr.gd rename to scenes/pribor-afsp/pribor-rtr.gd diff --git a/scenes/pribor-rtr/pribor-rtr.gd.uid b/scenes/pribor-afsp/pribor-rtr.gd.uid similarity index 100% rename from scenes/pribor-rtr/pribor-rtr.gd.uid rename to scenes/pribor-afsp/pribor-rtr.gd.uid diff --git a/scenes/pribor-rtr/pribor-rtr.tscn b/scenes/pribor-afsp/pribor-rtr.tscn similarity index 84% rename from scenes/pribor-rtr/pribor-rtr.tscn rename to scenes/pribor-afsp/pribor-rtr.tscn index a90bee3..345ec83 100644 --- a/scenes/pribor-rtr/pribor-rtr.tscn +++ b/scenes/pribor-afsp/pribor-rtr.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqea"] -[ext_resource type="Script" uid="uid://d0jwv5opi3mrk" path="res://scenes/pribor-rtr/pribor-rtr.gd" id="1_sqyma"] -[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="2_yb5ym"] -[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="3_xqaxm"] +[ext_resource type="Script" uid="uid://d0jwv5opi3mrk" path="res://scenes/pribor-afsp/pribor-rtr.gd" id="1_soedq"] +[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_pspup"] +[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_gh777"] [node name="pribor_rtr" type="Control"] layout_mode = 3 @@ -11,9 +11,9 @@ offset_left = 115.0 offset_top = 150.0 offset_right = 115.0 offset_bottom = 150.0 -script = ExtResource("1_sqyma") +script = ExtResource("1_soedq") -[node name="yach_svyzi" parent="." instance=ExtResource("3_xqaxm")] +[node name="yach_svyzi" parent="." instance=ExtResource("2_pspup")] layout_mode = 2 offset_left = 40.0 offset_top = 535.0 @@ -24,7 +24,7 @@ size_flags_vertical = 7 fname = "Модуль электропитания" rname = "G1" -[node name="blok_bpo_a1" parent="." instance=ExtResource("3_xqaxm")] +[node name="blok_bpo_a1" parent="." instance=ExtResource("2_pspup")] layout_mode = 0 offset_left = 40.0 offset_top = 135.0 @@ -42,55 +42,55 @@ offset_right = 498.0 offset_bottom = 320.0 columns = 4 -[node name="a1_kanal1" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal1" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 1" -[node name="a1_kanal2" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal2" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 2" -[node name="a1_kanal3" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal3" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 3" -[node name="a1_kanal4" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal4" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 4" -[node name="a1_kanal5" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal5" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 5" -[node name="a1_kanal6" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal6" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 6" -[node name="a1_kanal7" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal7" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 7" -[node name="a1_kanal8" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal8" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 8" -[node name="yas_bpo_a1" parent="." instance=ExtResource("2_yb5ym")] +[node name="yas_bpo_a1" parent="." instance=ExtResource("3_gh777")] offset_left = 500.0 offset_top = 175.0 offset_right = 550.0 @@ -99,7 +99,7 @@ show_rname = false self_size = Vector2i(50, 145) fname = "Яч. связи" -[node name="blok_bpo_a2" parent="." instance=ExtResource("3_xqaxm")] +[node name="blok_bpo_a2" parent="." instance=ExtResource("2_pspup")] layout_mode = 0 offset_left = 40.0 offset_top = 335.0 @@ -117,55 +117,55 @@ offset_right = 498.0 offset_bottom = 520.0 columns = 4 -[node name="a1_kanal1" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal1" parent="grid_bpo_a2" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 1" -[node name="a1_kanal2" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal2" parent="grid_bpo_a2" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 2" -[node name="a1_kanal3" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal3" parent="grid_bpo_a2" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 3" -[node name="a1_kanal4" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal4" parent="grid_bpo_a2" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 4" -[node name="a1_kanal5" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal5" parent="grid_bpo_a2" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 5" -[node name="a1_kanal6" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal6" parent="grid_bpo_a2" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 6" -[node name="a1_kanal7" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal7" parent="grid_bpo_a2" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 7" -[node name="a1_kanal8" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")] +[node name="a1_kanal8" parent="grid_bpo_a2" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 8" -[node name="yas_bpo_a2" parent="." instance=ExtResource("2_yb5ym")] +[node name="yas_bpo_a2" parent="." instance=ExtResource("3_gh777")] offset_left = 500.0 offset_top = 375.0 offset_right = 550.0 diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 83fa64c..3346f3a 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -1,5 +1,3 @@ -@tool - class_name sch3_view extends 'res://scenes/контроль/элемент-я.gd' @@ -43,6 +41,17 @@ func on_line_changed_sch3(unit_sch3): $margin/vbox/grid/state.texture = textures[STATE_VAL.NONE] +func on_settings_changed(): + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + if not external_ctl: + return + var items = get_tree().get_nodes_in_group('bits_items_switch') + for item in items: + item.disabled = external_ctl + items = get_tree().get_nodes_in_group('bits_items_good') + for item in items: + item.texture = textures[STATE_VAL.NONE] + ## Вызывается при изменении состояния выключателя[br] ## [param val] - Состояние выключателя[br] ## [param meta] - Адреса регистров и индексы битов назначенных выключателю[br] @@ -62,11 +71,6 @@ func _enter_tree() -> void: if Engine.is_editor_hint(): return var unit_key = settings.get_unit_key(unit_name) var unit_sch3 = network.units[unit_key] - var items = get_tree().get_nodes_in_group('bits_items_switch') - for item in items: - var meta = item.get_meta('bits') - item.connect('toggled', on_toggled_switch.bind(meta, unit_sch3)) - item.disabled = true unit_sch3.base_holding_address = base_holding_address unit_sch3.regs_holding_count = regs_holding_count unit_sch3.base_input_address = base_input_address @@ -79,6 +83,17 @@ func _enter_tree() -> void: unit_sch3.connect('line_changed', on_line_changed_sch3) +func _ready() -> void: + var unit_key = settings.get_unit_key(unit_name) + var a = network.units + var unit_sch3 = network.units[unit_key] + var items = get_tree().get_nodes_in_group('bits_items_switch') + for item in items: + var meta = item.get_meta('bits') + item.connect('toggled', on_toggled_switch.bind(meta, unit_sch3)) + item.disabled = true + + func _exit_tree() -> void: if Engine.is_editor_hint(): return var unit_key = settings.get_unit_key(unit_name) diff --git a/scenes/pribor-uyep/sch3.tscn b/scenes/pribor-uyep/sch3.tscn index ae16b53..f74e094 100644 --- a/scenes/pribor-uyep/sch3.tscn +++ b/scenes/pribor-uyep/sch3.tscn @@ -136,7 +136,7 @@ theme_override_font_sizes/font_size = 17 text = "УФ" vertical_alignment = 1 -[node name="switch0" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]] +[node name="switch0" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] editor_description = "Питание УФ" material = SubResource("ShaderMaterial_c1mqk") layout_mode = 2 @@ -165,7 +165,7 @@ theme_override_font_sizes/font_size = 17 text = "РТР" vertical_alignment = 1 -[node name="switch1" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]] +[node name="switch1" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] editor_description = "РТР" material = SubResource("ShaderMaterial_c1mqk") layout_mode = 2 @@ -193,7 +193,7 @@ theme_override_font_sizes/font_size = 17 text = "ПРД-Н.1" vertical_alignment = 1 -[node name="switch2" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]] +[node name="switch2" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] editor_description = "ПРД-Н.1" material = SubResource("ShaderMaterial_c1mqk") layout_mode = 2 @@ -222,7 +222,7 @@ theme_override_font_sizes/font_size = 17 text = "ПРД-Н.2" vertical_alignment = 1 -[node name="switch3" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]] +[node name="switch3" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] editor_description = "Питание ПРД-Н.2" material = SubResource("ShaderMaterial_c1mqk") layout_mode = 2 diff --git a/scenes/pribor-uyep/spt25-view.gd b/scenes/pribor-uyep/spt25-view.gd index 797b1cb..f537b1c 100644 --- a/scenes/pribor-uyep/spt25-view.gd +++ b/scenes/pribor-uyep/spt25-view.gd @@ -3,20 +3,30 @@ extends "res://scenes/контроль/элемент-я.gd" -func on_line_changed(unit): - if not unit.online: - state = STATE_VAL.NONE - $block_output.state0 = STATE_VAL.NONE - $block_output.state1 = STATE_VAL.NONE - $block_output.state2 = STATE_VAL.NONE - $block_input1.state = STATE_VAL.NONE - $block_input1.state0 = STATE_VAL.NONE - $block_input1.state1 = STATE_VAL.NONE - $block_input1.state2 = STATE_VAL.NONE - $block_input2.state = STATE_VAL.NONE - $block_input2.state0 = STATE_VAL.NONE - $block_input2.state1 = STATE_VAL.NONE - $block_input2.state2 = STATE_VAL.NONE +func on_line_changed(unit0): + if not unit0.online: + disable_all() + + +func on_settings_changed(): + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + if external_ctl: + disable_all() + + +func disable_all(): + state = STATE_VAL.NONE + $block_output.state0 = STATE_VAL.NONE + $block_output.state1 = STATE_VAL.NONE + $block_output.state2 = STATE_VAL.NONE + $block_input1.state = STATE_VAL.NONE + $block_input1.state0 = STATE_VAL.NONE + $block_input1.state1 = STATE_VAL.NONE + $block_input1.state2 = STATE_VAL.NONE + $block_input2.state = STATE_VAL.NONE + $block_input2.state0 = STATE_VAL.NONE + $block_input2.state1 = STATE_VAL.NONE + $block_input2.state2 = STATE_VAL.NONE func on_data_received(data: PackedByteArray): diff --git a/scenes/tabs-switch/tab-switch.gd b/scenes/tabs-switch/tab-switch.gd index 094ca3e..66f1476 100644 --- a/scenes/tabs-switch/tab-switch.gd +++ b/scenes/tabs-switch/tab-switch.gd @@ -25,5 +25,5 @@ func _on_tab_changed(tab) -> void: func on_setting_changed(): - var ext_cu = ProjectSettings.get_setting('application/config/external_cu', false) + var ext_cu = ProjectSettings.get_setting('application/config/Внешнее управление', false) get_parent().get_node('remote_control').visible = ext_cu diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 1d8b756..5884b2f 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -121,6 +121,11 @@ func _ready() -> void: var key = settings.get_unit_key('навигация') var unit_nav = network.units[key] unit_nav.connect('data_received', on_data_received) + ProjectSettings.connect('settings_changed', _settings_changed) + + +func _settings_changed(): + base_url = ProjectSettings.get_setting('application/config/Шаблон адреса сервера карт', base_url) func on_data_received(coords: Dictionary) -> void: diff --git a/scenes/контроль/контроль.gd b/scenes/контроль/контроль.gd index f864be2..92e1752 100644 --- a/scenes/контроль/контроль.gd +++ b/scenes/контроль/контроль.gd @@ -18,7 +18,7 @@ const PRIBORS_RES = \ 'pribor_prd_v_2': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 2'], 'pribor_prd_v_3': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 3'], 'pribor_prd_v_4': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 4'], - 'pribor_rtr': ['res://scenes/pribor-rtr/pribor-rtr.tscn', 'Контроль исправности прибора РТР'], + 'pribor_rtr': ['res://scenes/pribor-afsp/pribor-rtr.tscn', 'Контроль исправности прибора РТР'], 'pribor_afsp_1': ['res://scenes/pribor-afsp/pribor-afsp-1.tscn', 'Контроль исправности прибора АФСП 1'], 'pribor_afsp_2': ['res://scenes/pribor-afsp/pribor-afsp-2.tscn', 'Контроль исправности прибора АФСП 2'], 'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'], diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index e09195c..6f262cd 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -24,10 +24,10 @@ const SETTING_TABLE = [ ['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], ['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], ['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Внешнее целеуказание', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'], ['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Виртуальная клавиатура', TableEdit, TableToggle, 'Разрешить отображение экранной клавиатуры'], - ['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'], + ['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \"ЭМС-2\"'], ['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'], ['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'], ['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'], @@ -50,13 +50,14 @@ const SETTING_TABLE = [ ['уарэп-щ3', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором Щ3'], ['уарэп-спт25-1', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 1'], ['уарэп-спт25-2', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 2'], - ['Шаблон адреса сервера карт', TableEdit, TableEdit, 'URL-адрес сервера карт, содержащий поля \"{x}\", \"{y}\", \"{z}\" для подстановки индекса плитки'] ] + ['Шаблон адреса сервера карт', TableEdit, TableEdit, 'URL-адрес сервера карт, должен содержать поля \"{x}\", \"{y}\", \"{z}\" для подстановки индекса плитки'] ] const EXTERNAL_CU = 16 ## Внешнее целееуказание const SUPPRESS = 17 ## Строка - Подавление const KEYBOARD = 18 ## Строка - Виртуальная клавиатура const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2 const COMMIT = 20 ## Строка - Версия УАРЭП +var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки func on_checkbutton_pressed(i_row: int): on_row_pressed(i_row) @@ -73,7 +74,7 @@ func _ready() -> void: func on_external_cu_btn_pressed(btn) -> void: var state = btn.button_pressed - ProjectSettings.set_setting('application/config/external_cu', state) + ProjectSettings.set_setting('application/config/Внешнее управление', state) if state: signaller.emit_signal('interfer_off_all') @@ -154,13 +155,15 @@ func setting_tab(): var settings_data = {} load_settings(settings_data) parse_cmd_line_args(settings_data) - + for key in settings_data: + ProjectSettings.set_setting('application/config/%s' % key, settings_data[key]) for i in SETTING_TABLE.size(): var tbl_row = SETTING_TABLE[i] var param_name = tbl_row[0] var node_label = tbl_row[1] var node_value = tbl_row[2] var tootip_text = tbl_row[3] + name_to_line_index[param_name] = i $scroll_set/table.add_row([node_label, node_value]) var label_instance = $scroll_set/table.get_node2(0, i) label_instance.text = param_name @@ -206,11 +209,8 @@ func button_settings(): var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0] extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) on_external_cu_btn_pressed(extern_cu_node) - $scroll_set/table.set_row_text(SUPPRESS,(['Кнопка «Подавление»'])) - $scroll_set/table.set_row_text(KEYBOARD,(['Виртуальная клавиатура'])) var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0] vk_node.connect('pressed', on_vk_pressed.bind(vk_node)) - $scroll_set/table.set_row_text(HIDE_EMS2,(['Скрыть вкладку ЭМС 2'])) var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0] ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node)) ems2_hide_node.set_pressed(true) @@ -249,6 +249,8 @@ func _on_btn_save_settings_pressed(): else: var row = $scroll_set/table.get_row(i) json_data[parameter] = row[1].text + for key in json_data: + ProjectSettings.set_setting('application/config/%s' % key, json_data[key]) var settings_file = settings.get_settings_file_path() var file = FileAccess.open(settings_file, FileAccess.WRITE) var abs_path = ProjectSettings.globalize_path(settings_file) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index c0e23f1..1c0d2ba 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -478,8 +478,8 @@ func on_fs_selected(ecm): func set_btns_disabled(value: bool, btn): - var external_cu = ProjectSettings.get_setting('application/config/external_cu', false) - if external_cu: + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + if external_ctl: btn.set_pressed(false) btn.set_disabled(true) else: diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 3bd6031..b7bb848 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -89,18 +89,18 @@ signal interfer_resized(ecms: Dictionary) ## Вызывается пр ## Отправляет словарь помех в юнит, для запаковки и отправки в 5П28. -func on_get_interfers(unit, ecms): unit.pack_interfers(cu, ecms) +func on_get_interfers(unit, ecms) -> void: unit.pack_interfers(cu, ecms) ## Автмат выключен -func on_manual_control(): auto_enabled = false +func on_manual_control() -> void: auto_enabled = false ## Автмат отключен -func on_full_auto(): auto_enabled = true +func on_full_auto() -> void: auto_enabled = true -func _ready(): +func _ready() -> void: var ecms: Dictionary = {} ## Словарь помех. for i in ID_INTERFERS_LEN: # Заполняет массив ID целей id_array.append(i + 1) @@ -129,7 +129,7 @@ func _ready(): ## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку. -func on_timer_check_state(unit, ecms, resend_timeout): +func on_timer_check_state(unit, ecms, resend_timeout) -> void: var tick = Time.get_ticks_msec() for ecm in ecms.values(): if (tick - ecm.tick_tx) >= resend_timeout: @@ -137,7 +137,7 @@ func on_timer_check_state(unit, ecms, resend_timeout): ecm.tick_tx = tick -func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit): +func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit) -> void: for thr in threats.values(): var th_id = thr.id for ecm_i in thrs.keys(): @@ -160,13 +160,13 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit): ## Производит приём состояния помех. [param unit] -> [param ecms]. -func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): - if not unit.json_dic.has('ts'): return - if not (unit.json_dic['ts'] is float): return - if unit.json_dic['ts'] != 5: return - if not unit.json_dic.has('msvk'): return - if not (unit.json_dic['msvk'] is Array): return - var msvk = unit.json_dic['msvk'] +func on_data_capsrpb_received(unit0: capsrpb.CapsRpb, ecms: Dictionary) -> void: + if not unit0.json_dic.has('ts'): return + if not (unit0.json_dic['ts'] is float): return + if unit0.json_dic['ts'] != 5: return + if not unit0.json_dic.has('msvk'): return + if not (unit0.json_dic['msvk'] is Array): return + var msvk = unit0.json_dic['msvk'] var sz: = ecms.size() for dic_msvk in msvk: if not (dic_msvk is Dictionary): continue @@ -180,13 +180,13 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): var ecm = Interfer.new() ecm.set_from_dic(dic_msvk) ecm.krp = INTERFER_OFF - send_ecm(ecm, unit) + send_ecm(ecm, unit0) if sz != ecms.size(): call_deferred('emit_signal', 'interfer_resized', ecms) ## Вызыватся, когда пользователь выбрал помеху и выбраны цели. -func on_interfer_create(interfer_name, sel_threats, fs_arr, u, ecms): +func on_interfer_create(interfer_name, sel_threats, fs_arr, u, ecms) -> void: for item in sel_threats: var param: Dictionary = {} var kni: float = item.aoa @@ -212,7 +212,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, u, ecms): interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1]) -func on_interfer_rcv(interfer_params: Array, unit, ecms): +func on_interfer_rcv(interfer_params: Array, unit0, ecms) -> void: var err: bool = false var mode = interfer_params[0] var id = interfer_params[1] @@ -238,11 +238,11 @@ func on_interfer_rcv(interfer_params: Array, unit, ecms): if interfer_name == '': err = true if not err: - interfer_create(unit, interfer_name, ecms, param, aoa, id, cu, SOURCE_INTERFER[2]) - unit.on_interfer_accept(err) + interfer_create(unit0, interfer_name, ecms, param, aoa, id, cu, SOURCE_INTERFER[2]) + unit0.on_interfer_accept(err) -func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interfer): +func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interfer) -> void: var ispp: int = 0 if interfer_name == 'k1': param['dur'] = 1.0 # Необходимо добавить параметры управления @@ -285,26 +285,26 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf send_ecm(ecm, u) -func send_ecm(ecm, unit): +func send_ecm(ecm, unit0) -> void: msg_num += 1 var json_data = ecm.get_msg6_data(msg_num) - unit.tx_stack.append(json_data) + unit0.tx_stack.append(json_data) -func on_interfer_off_all(unit, ecms): - for ecm in ecms.values(): - ecm.krp = INTERFER_OFF - send_ecm(ecm, unit) - signaller.emit_signal('interfer_off',ecm, ecms, thrs) +func on_interfer_off_all(unit0, ecms: Dictionary) -> void: + for ecm in ecms.values(): + ecm.krp = INTERFER_OFF + send_ecm(ecm, unit0) + signaller.emit_signal('interfer_off', ecm, ecms, thrs) -func on_threats_lost(th, ecms, unit): +func on_threats_lost(th, ecms, unit0) -> void: for key in interfer.thrs: if interfer.thrs[key] == th.id: var ecm_id = key var ecm = ecms[ecm_id] ecm.krp = INTERFER_OFF - send_ecm(ecm, unit) + send_ecm(ecm, unit0) signaller.emit_signal('interfer_off', ecm, ecms, thrs) @@ -316,12 +316,12 @@ func pop_id() -> int: return id -func push_id(id: int): +func push_id(id: int) -> void: id_array.append(id) id_array.sort() -func on_emit_changed(state, ecms): +func on_emit_changed(state, ecms) -> void: emit_enable = state for ecm in ecms.values(): ecm.modulation = state diff --git a/scripts/network.gd b/scripts/network.gd index 9f3f606..a69b6f7 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -23,6 +23,16 @@ class Serial extends SerialPort: start_monitoring(timeout) return rc + func try_close(): + if not is_open(): + return Error.FAILED + stop_monitoring() + close() + var connections = data_received.get_connections() + for conn in connections: + data_received.disconnect(conn.callable) + return Error.OK + class Socket extends PacketPeerUDP: func send_to(addr, data): @@ -137,6 +147,9 @@ func _ready() -> void: send_sockets['уарэп-яу07-3н'] = sock_unicast send_sockets['уарэп-яу07-3к'] = sock_unicast + var bind_serials: = [] + var bind_modbuses: = [] + for unit_name in settings.UnitProfiles: var st = settings.UnitProfiles[unit_name] var proto = st[0] @@ -166,6 +179,7 @@ func _ready() -> void: var unit_key = settings.get_unit_key(unit_name) units_modbus[unit_key] = unit_modbus units[unit_key] = unit_modbus + bind_modbuses.append([unit_modbus, unit_name]) if proto in SERIAL_PROTO: var unit_serial = SERIAL_PROTO[proto].new(unit_name) @@ -174,11 +188,8 @@ func _ready() -> void: units_serial[unit_key] = unit_serial units[unit_key] = unit_serial serials[unit_key] = serial - var rc = serial.try_open(on_serial_data.bind(unit_serial)) - if rc != Error.OK: - log.message(log.ERROR, 'невозможно открыть %s для \"%s\"' % [serial, unit_name]) - else: - log.message(log.INFO, '%s для \"%s\"' % [serial, unit_name]) + + ProjectSettings.connect('settings_changed', Callable(self, '_on_settings_changed_serial').bind(bind_serials)) tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[settings.get_unit_key('уарэп-5п28')]]) for key in dst_ports: @@ -190,6 +201,28 @@ func _ready() -> void: u.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(key)) +func _on_settings_changed_modbus(bind_modbuses: Array): + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + for bm in bind_modbuses: + var unit_modbus = bm[0] + var unit_name = bm[1] + + +func _on_settings_changed_serial(bind_serials: Array): + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + for bs in bind_serials: + var serial = bs[0] + var unit_serial = bs[1] + var unit_name = bs[2] + serial.try_close() + if not external_ctl: + var rc = serial.try_open(on_serial_data.bind(unit_serial)) + if rc != Error.OK: + log.message(log.ERROR, 'невозможно открыть %s для \"%s\"' % [serial, unit_name]) + else: + log.message(log.INFO, '%s для \"%s\"' % [serial, unit_name]) + + func poll_receive_udp(sock: Socket) -> bool: while sock.get_available_packet_count() > 0: var data: = sock.get_packet() @@ -215,9 +248,9 @@ func poll_receive_udp(sock: Socket) -> bool: func poll_receive_tcp(sock: SocketTCP) -> 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 + if sock.is_connection_available(): # Проверить, если кто то пытается подключиться + var client: = sock.take_connection() # Принять соединение + sock.peerstream.set_stream_peer(client) # Привязать поток к новому клиенту log.info('подключен: %s:%d к порту: %d' % [ client.get_connected_host(), client.get_connected_port(), client.get_local_port() ] ) var peer = sock.peerstream.get_stream_peer() if peer: diff --git a/scripts/sch3.gd b/scripts/sch3.gd index 9b92a7c..abedfbf 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -9,7 +9,9 @@ class Sch3 extends unit.Unit: READ_INPUT, READ_HOLDING, WRITE, - CONNECT } + CONNECT, + IDLE, + DISCONNECT } var step_fsm: Sch3Fsm = Sch3Fsm.CONNECT var base_input_address: int = 0 @@ -24,21 +26,22 @@ class Sch3 extends unit.Unit: var mbc: = ModbusClientRtu.new() var tick_fsm_delta: = reconnect_period - - func try_connect() -> bool: - var port = settings.UnitProfiles[name][1] - var params = settings.UnitProfiles[name][2] + func try_disconnect(): mbc.thread_stop() mbc.queue_clear() mbc.flush() mbc.close() + + func try_connect() -> bool: + var port = settings.UnitProfiles[name][1] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра) + var params = settings.UnitProfiles[name][2] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра) var rc = mbc.open(port, params[0], params[1], params[2], params[3], params[4]) - if rc != Error.OK: + if rc != Error.OK: # TODO: убрать это отсюда (неуместный вывод сообщения) if not reconnect_failed: push_error('%s: невозможно открыть \"%s\" %s' % [name, port, params]) reconnect_failed = true return false - if reconnect_failed: + if reconnect_failed: # TODO: убрать это отсюда (неуместный вывод сообщения) push_warning('%s: открыто после сбоя \"%s\" %s' % [name, port, params]) reconnect_failed = false mbc.set_response_timeout(params[5]) @@ -74,10 +77,17 @@ class Sch3 extends unit.Unit: tx_tick = tick step_fsm = Sch3Fsm.WRITE elif step_fsm == Sch3Fsm.CONNECT: + try_disconnect() try_connect() mbc.request_read_input(base_input_address, regs_input_count) cmd_state = CmdState.WAIT tx_tick = tick + elif step_fsm == Sch3Fsm.DISCONNECT: + try_disconnect() + step_fsm = Sch3Fsm.IDLE + elif step_fsm == Sch3Fsm.IDLE: + pass + signal write (addr: int, data: Array) ## Вызывается при получении сообщения подтверждения записи signal read (addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов. @@ -90,7 +100,14 @@ class Sch3 extends unit.Unit: mbc.connect('read', on_read) mbc.connect('read_input', on_read_input) mbc.connect('write', on_write) + ProjectSettings.connect('settings_changed', _on_settings_changed) + func _on_settings_changed(): + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + if external_ctl and (step_fsm not in [Sch3Fsm.DISCONNECT, Sch3Fsm.IDLE]): + step_fsm = Sch3Fsm.DISCONNECT + elif (not external_ctl) and (step_fsm in [Sch3Fsm.DISCONNECT, Sch3Fsm.IDLE]): + step_fsm = Sch3Fsm.CONNECT func parse(return_code: Error, base_addr: int, data: Array, code: String): if return_code == Error.OK: @@ -124,8 +141,9 @@ class Sch3 extends unit.Unit: cmd_state = CmdState.FAIL emit_signal('command_fail', self) emit_signal('line_changed', self) - step_fsm = Sch3Fsm.CONNECT - tick_fsm_delta = reconnect_period + if step_fsm != Sch3Fsm.IDLE: + step_fsm = Sch3Fsm.CONNECT + tick_fsm_delta = reconnect_period if (tick - tick_fsm) > tick_fsm_delta: tick_fsm = tick _on_timeout(tick) diff --git a/scripts/tcp5p28.gd b/scripts/tcp5p28.gd index 02a2396..49dde77 100644 --- a/scripts/tcp5p28.gd +++ b/scripts/tcp5p28.gd @@ -65,7 +65,7 @@ class TCP5P28 extends unit.Unit: var ext_cu: bool = false func _init(nm) -> void: super._init(nm) - ext_cu = ProjectSettings.get_setting('application/config/external_cu', false) + ext_cu = ProjectSettings.get_setting('application/config/Внешнее управление', false) ProjectSettings.connect('settings_changed', on_setting_changed) init_state() @@ -214,4 +214,4 @@ class TCP5P28 extends unit.Unit: tx_stack.append(data_to_send) func on_setting_changed(): - ext_cu = ProjectSettings.get_setting('application/config/external_cu', false) + ext_cu = ProjectSettings.get_setting('application/config/Внешнее управление', false)