From 9b0aab78a007195b0521aff97dfabcec8e237dc0 Mon Sep 17 00:00:00 2001 From: danil_tim Date: Thu, 5 Dec 2024 11:14:09 +0300 Subject: [PATCH 01/24] =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uf/pribor_uf.gd | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 scenes/pribor-uf/pribor_uf.gd diff --git a/scenes/pribor-uf/pribor_uf.gd b/scenes/pribor-uf/pribor_uf.gd new file mode 100644 index 0000000..e1d30ef --- /dev/null +++ b/scenes/pribor-uf/pribor_uf.gd @@ -0,0 +1,14 @@ +extends "res://scenes/контроль/прибор.gd" + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + var unit_key = settings.get_unit_key('уарэп-эмс') + var unit_uf = network.units[unit_key] + unit_uf.connect('data_received', on_data_received.bind(unit_uf)) + +func on_data_received(data, unit_uf): + print_debug(data) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass From 34284c098866d852a385a2ad2071970c0de142ed Mon Sep 17 00:00:00 2001 From: danil_tim Date: Wed, 11 Dec 2024 09:03:10 +0300 Subject: [PATCH 02/24] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/DSEG7Classic-Regular.ttf.import | 1 + data/DejaVuSans.ttf.import | 1 + data/DejaVuSansCondensed.ttf.import | 1 + scenes/pribor-uf/pribor-uf.tscn | 107 ++-- scenes/pribor-uf/pribor_uf.gd | 106 ++- scenes/pribor-uyep/sch3-view.gd | 232 +++---- scenes/контроль/кассета.gd | 12 +- scenes/контроль/кнопка-прибора.gd | 8 +- scenes/контроль/контроль.gd | 76 +-- scenes/контроль/элемент-в.tscn | 62 +- scenes/эмс/эмс.gd | 926 +++++++++++++-------------- scripts/network.gd | 9 +- scripts/unit.gd | 42 +- 13 files changed, 838 insertions(+), 745 deletions(-) diff --git a/data/DSEG7Classic-Regular.ttf.import b/data/DSEG7Classic-Regular.ttf.import index 1c1fddb..edd46ee 100644 --- a/data/DSEG7Classic-Regular.ttf.import +++ b/data/DSEG7Classic-Regular.ttf.import @@ -15,6 +15,7 @@ dest_files=["res://.godot/imported/DSEG7Classic-Regular.ttf-32df8fc6f2e5584d5a5b Rendering=null antialiasing=1 generate_mipmaps=false +disable_embedded_bitmaps=true multichannel_signed_distance_field=false msdf_pixel_range=8 msdf_size=48 diff --git a/data/DejaVuSans.ttf.import b/data/DejaVuSans.ttf.import index 3e412bc..de13c3d 100644 --- a/data/DejaVuSans.ttf.import +++ b/data/DejaVuSans.ttf.import @@ -15,6 +15,7 @@ dest_files=["res://.godot/imported/DejaVuSans.ttf-b4085dde282b5d503d6a56e258b526 Rendering=null antialiasing=1 generate_mipmaps=false +disable_embedded_bitmaps=true multichannel_signed_distance_field=false msdf_pixel_range=8 msdf_size=48 diff --git a/data/DejaVuSansCondensed.ttf.import b/data/DejaVuSansCondensed.ttf.import index 42c3c52..2d8fd9e 100644 --- a/data/DejaVuSansCondensed.ttf.import +++ b/data/DejaVuSansCondensed.ttf.import @@ -15,6 +15,7 @@ dest_files=["res://.godot/imported/DejaVuSansCondensed.ttf-7a8251b7291db131ffa4e Rendering=null antialiasing=1 generate_mipmaps=false +disable_embedded_bitmaps=true multichannel_signed_distance_field=false msdf_pixel_range=8 msdf_size=48 diff --git a/scenes/pribor-uf/pribor-uf.tscn b/scenes/pribor-uf/pribor-uf.tscn index b3296bb..f06a78d 100644 --- a/scenes/pribor-uf/pribor-uf.tscn +++ b/scenes/pribor-uf/pribor-uf.tscn @@ -1,20 +1,20 @@ [gd_scene load_steps=4 format=3 uid="uid://dwxn2puh462nl"] -[ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_2qyst"] +[ext_resource type="Script" path="res://scenes/pribor-uf/pribor_uf.gd" id="1_7gtpa"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_ho0da"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_dp78y"] [node name="pribor_uf" type="Control"] layout_mode = 3 anchors_preset = 0 -script = ExtResource("1_2qyst") +script = ExtResource("1_7gtpa") [node name="ref_uf" type="NinePatchRect" parent="."] layout_mode = 0 -offset_left = 98.0 +offset_left = 187.0 offset_top = 247.0 offset_right = 708.0 -offset_bottom = 1121.0 +offset_bottom = 955.0 texture = ExtResource("2_ho0da") patch_margin_left = 16 patch_margin_top = 16 @@ -23,17 +23,17 @@ patch_margin_bottom = 16 [node name="ref_bu1" type="NinePatchRect" parent="ref_uf"] layout_mode = 0 -offset_left = 282.0 -offset_top = 138.0 -offset_right = 591.0 -offset_bottom = 468.0 +offset_left = 199.0 +offset_top = 14.0 +offset_right = 508.0 +offset_bottom = 344.0 texture = ExtResource("2_ho0da") patch_margin_left = 16 patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="ref_A13" parent="ref_uf/ref_bu1" instance=ExtResource("3_dp78y")] +[node name="ref_A13_MKEG" parent="ref_uf/ref_bu1" instance=ExtResource("3_dp78y")] offset_left = 7.0 offset_top = 60.0 offset_right = 59.0 @@ -42,21 +42,14 @@ self_size = Vector2i(52, 262) fname = "MKEG/C" rname = "A13" -[node name="ref_A" parent="ref_uf/ref_bu1" instance=ExtResource("3_dp78y")] +[node name="ref_A8_BU" parent="ref_uf/ref_bu1" instance=ExtResource("3_dp78y")] offset_left = 59.0 offset_top = 60.0 offset_right = 302.0 offset_bottom = 322.0 self_size = Vector2i(243, 262) fname = "ВК-110" - -[node name="А8" type="Label" parent="ref_uf/ref_bu1"] -layout_mode = 0 -offset_left = 21.0 -offset_top = 12.0 -offset_right = 39.0 -offset_bottom = 31.0 -text = "А8" +rname = "A8" [node name="А1" type="Label" parent="ref_uf/ref_bu1"] layout_mode = 0 @@ -68,83 +61,74 @@ text = "БУ-1" [node name="ref_kassetav13" type="NinePatchRect" parent="ref_uf"] layout_mode = 0 -offset_left = 12.0 -offset_top = 513.0 -offset_right = 601.0 -offset_bottom = 852.0 +offset_left = 11.0 +offset_top = 353.0 +offset_right = 509.0 +offset_bottom = 692.0 texture = ExtResource("2_ho0da") patch_margin_left = 16 patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="ref_A18" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] -offset_left = 6.0 +[node name="ref_A9_ESW" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] +offset_left = 62.0 offset_top = 65.0 -offset_right = 165.0 +offset_right = 170.0 offset_bottom = 325.0 -self_size = Vector2i(159, 260) +self_size = Vector2i(108, 260) fname = "ESW-6U16TP" -rname = "A18" +rname = "A9" -[node name="ref_A7" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] -offset_left = 166.0 +[node name="ref_A7_YAU07" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] +offset_left = 438.0 offset_top = 65.0 -offset_right = 218.0 +offset_right = 490.0 offset_bottom = 325.0 self_size = Vector2i(52, 260) fname = "ЯУ-07Б" rname = "A7" -[node name="ref_A2" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] -offset_left = 218.0 +[node name="ref_A4_KEMS" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] +offset_left = 279.0 offset_top = 65.0 -offset_right = 270.0 -offset_bottom = 325.0 -self_size = Vector2i(52, 260) -fname = "КЭМС-Б" -rname = "A2" - -[node name="ref_A4" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] -offset_left = 269.0 -offset_top = 65.0 -offset_right = 321.0 +offset_right = 331.0 offset_bottom = 325.0 self_size = Vector2i(52, 260) fname = "КЭМС-Б1" rname = "A4" -[node name="ref_A5" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] -offset_left = 322.0 +[node name="ref_A5_EMS" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] +offset_left = 225.0 offset_top = 65.0 -offset_right = 374.0 +offset_right = 277.0 offset_bottom = 325.0 self_size = Vector2i(52, 260) fname = "ЭМС-Б" rname = "A5" -[node name="ref_A6" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] -offset_left = 374.0 +[node name="ref_A6_EMS" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] +offset_left = 171.0 offset_top = 65.0 -offset_right = 426.0 +offset_right = 223.0 offset_bottom = 325.0 self_size = Vector2i(52, 260) fname = "ЭМС-Б" rname = "A6" -[node name="ref_A3" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] -offset_left = 427.0 +[node name="ref_A3_IP5B" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] +offset_left = 332.0 offset_top = 65.0 -offset_right = 532.0 +offset_right = 437.0 offset_bottom = 325.0 self_size = Vector2i(105, 260) fname = "ИП-220-5Б" rname = "A3" -[node name="ref_A8" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] -offset_left = 531.0 +[node name="ref_A12_IP27B" parent="ref_uf/ref_kassetav13" instance=ExtResource("3_dp78y")] +offset_left = 9.0 offset_top = 65.0 -offset_right = 582.0 +offset_right = 60.0 offset_bottom = 325.0 self_size = Vector2i(51, 260) fname = "ИП220-27Б" @@ -168,7 +152,7 @@ text = "Кассета В-13" [node name="lbl_header" type="Label" parent="."] layout_mode = 0 -offset_left = 105.0 +offset_left = 199.0 offset_top = 225.0 offset_right = 704.0 offset_bottom = 251.0 @@ -177,3 +161,16 @@ text = "Контроль исправности прибора УФ " horizontal_alignment = 1 vertical_alignment = 1 + +[node name="lbl_header2" type="Label" parent="."] +visible = false +layout_mode = 0 +offset_left = 199.0 +offset_top = 974.0 +offset_right = 704.0 +offset_bottom = 1000.0 +theme_override_font_sizes/font_size = 22 +text = "Прибор не исправен +" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/scenes/pribor-uf/pribor_uf.gd b/scenes/pribor-uf/pribor_uf.gd index e1d30ef..005b2b1 100644 --- a/scenes/pribor-uf/pribor_uf.gd +++ b/scenes/pribor-uf/pribor_uf.gd @@ -1,14 +1,106 @@ extends "res://scenes/контроль/прибор.gd" -# Called when the node enters the scene tree for the first time. +enum STATE_VAL { + NONE = 0, + GOOD = 1, + ERROR = 2 } + +var timer = Timer.new() + +var DEV_LIST = ['00:1f.6', '07:00.0', '08:00.0', '0b:00.0'] +var USB_TRACKERBALL = '046d:c31c' +var REVFF = '(rev ff)' + + func _ready() -> void: var unit_key = settings.get_unit_key('уарэп-эмс') var unit_uf = network.units[unit_key] - unit_uf.connect('data_received', on_data_received.bind(unit_uf)) -func on_data_received(data, unit_uf): - print_debug(data) + var unit_key_5p28 = settings.get_unit_key('уарэп-5п28') + var unit_5p28 = network.units[unit_key_5p28] -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - pass + self.add_child(timer) + timer.connect('timeout', Callable(self, 'on_timer').bind(unit_uf, unit_5p28)) + timer.start(1) + + +func on_timer(unit_uf, unit_5p28): + Control_VK() # проверка трекбола и pci + if unit_5p28.online: # проверка внешнего коммутатора + $ref_uf/ref_bu1/ref_A13_MKEG.state = STATE_VAL.GOOD + else: + $ref_uf/ref_bu1/ref_A13_MKEG.state = STATE_VAL.NONE + + if unit_uf.online: # проверка ЯУ, внутреннего коммутатора и ИП-5Б + $ref_uf/ref_kassetav13/ref_A7_YAU07.state = STATE_VAL.GOOD + $ref_uf/ref_kassetav13/ref_A3_IP5B.state = STATE_VAL.GOOD + $ref_uf/ref_kassetav13/ref_A9_ESW.state = STATE_VAL.GOOD + Control_EMS(unit_uf.status) # проверка ЭМС ячеек + else: + $ref_uf/ref_kassetav13/ref_A7_YAU07.state = STATE_VAL.ERROR + $ref_uf/ref_kassetav13/ref_A4_KEMS.state = STATE_VAL.NONE + $ref_uf/ref_kassetav13/ref_A5_EMS.state = STATE_VAL.NONE + $ref_uf/ref_kassetav13/ref_A6_EMS.state = STATE_VAL.NONE + $ref_uf/ref_kassetav13/ref_A3_IP5B.state = STATE_VAL.NONE + $ref_uf/ref_kassetav13/ref_A9_ESW.state = STATE_VAL.NONE + $ref_uf/ref_kassetav13/ref_A12_IP27B.state = STATE_VAL.NONE + status_uf() # отслеживание состояния прибора + +func Control_VK() -> void: + var out_usb_str = '' + var out_pci_str = '' + var out_usb = [] + var out_pci = [] + + OS.execute('lsusb', [], out_usb) + for element in out_usb: + out_usb_str += element + + OS.execute('lspci', [], out_pci) + for element in out_pci: + out_pci_str += element + + out_usb_str = out_usb_str.split("\n") + out_pci_str = out_pci_str.split("\n") + + var i: int = 0 + + for string in out_usb_str: + if USB_TRACKERBALL in string: + i += 1 + break + for string in out_pci_str: + for item in DEV_LIST: + if item in string: + i += 1 + if REVFF in string: + i -= 1 + break + + if i == (len(DEV_LIST) + 1): + $ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.GOOD + else: + $ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.ERROR + + +func Control_EMS(status:Array) -> void: + $ref_uf/ref_kassetav13/ref_A4_KEMS.state = STATE_VAL.GOOD if ((status[0] >> 0) & 1) and ((status[0] >> 3) & 1) else STATE_VAL.ERROR + $ref_uf/ref_kassetav13/ref_A5_EMS.state = STATE_VAL.GOOD if ((status[0] >> 1) & 1) and ((status[0] >> 4) & 1) else STATE_VAL.ERROR + $ref_uf/ref_kassetav13/ref_A6_EMS.state = STATE_VAL.GOOD if ((status[0] >> 2) & 1) and ((status[0] >> 5) & 1) else STATE_VAL.ERROR + $ref_uf/ref_kassetav13/ref_A12_IP27B.state = STATE_VAL.GOOD if ((status[2] >> 6) & 1) else STATE_VAL.ERROR + + +func status_uf() -> void: + var status_bu:int = $ref_uf/ref_bu1/ref_A8_BU.state + var status_yay:int = $ref_uf/ref_kassetav13/ref_A7_YAU07.state + var status_kems:int = $ref_uf/ref_kassetav13/ref_A4_KEMS.state + var status_ems0:int = $ref_uf/ref_kassetav13/ref_A5_EMS.state + var status_ems1:int = $ref_uf/ref_kassetav13/ref_A6_EMS.state + + if (status_yay == 1) and (status_bu == 1) and (status_kems == 1) and (status_ems0 == 1) and (status_ems1 == 1): + $lbl_header2.text = "Прибор исправен" + $lbl_header2.modulate = Color(0,1,0,1) + else: + $lbl_header2.text = "Прибор не исправен" + $lbl_header2.modulate = Color(1,0,0,1) + $lbl_header2.visible = true diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 9177230..39b371e 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -26,10 +26,10 @@ var timer = Timer.new() class StackItem: - var addr: = 0 - var data = null - func _init(a: int, d): addr = a; data = d - func _to_string() -> String: return '%s: %s' % [addr, data] + var addr: = 0 + var data = null + func _init(a: int, d): addr = a; data = d + func _to_string() -> String: return '%s: %s' % [addr, data] func on_data_received(_data: PackedByteArray): pass @@ -37,147 +37,147 @@ func on_data_received(_data: PackedByteArray): pass ## Обработчик таймера func _on_timeout(unit_sch3) -> void: - if write_stack.size(): - var ad = write_stack.pop_front() - if not unit_sch3.write(ad.addr, ad.data): - write_stack.push_back(ad) - if (read_step == 0) and (input_stack.size() == 0): - var ad = StackItem.new(base_input_address, regs_input_count) - input_stack.push_back(ad) - elif (read_step == 1) and (holding_stack.size() == 0): - var ad = StackItem.new(base_holding_address, regs_holding_count) - holding_stack.push_back(ad) - if input_stack.size(): - var ad = input_stack.pop_front() - if not unit_sch3.read_input(ad.addr, ad.data): - input_stack.push_back(ad) - if holding_stack.size(): - var ad = holding_stack.pop_front() - if not unit_sch3.read_holding(ad.addr, ad.data): - holding_stack.push_back(ad) - read_step += 1 - read_step %= 2 + if write_stack.size(): + var ad = write_stack.pop_front() + if not unit_sch3.write(ad.addr, ad.data): + write_stack.push_back(ad) + if (read_step == 0) and (input_stack.size() == 0): + var ad = StackItem.new(base_input_address, regs_input_count) + input_stack.push_back(ad) + elif (read_step == 1) and (holding_stack.size() == 0): + var ad = StackItem.new(base_holding_address, regs_holding_count) + holding_stack.push_back(ad) + if input_stack.size(): + var ad = input_stack.pop_front() + if not unit_sch3.read_input(ad.addr, ad.data): + input_stack.push_back(ad) + if holding_stack.size(): + var ad = holding_stack.pop_front() + if not unit_sch3.read_holding(ad.addr, ad.data): + holding_stack.push_back(ad) + read_step += 1 + read_step %= 2 ## Вызывается при изменении состояния выключателя[br] ## [param val] - Состояние выключателя[br] ## [param meta] - Адреса регистров и индексы битов назначенных выключателю[br] func on_toggled_switch(val: bool, meta: Array): - var on_addr = meta[0] - var on_bit = meta[1] - var off_addr = meta[2] - var off_bit = meta[3] - if regs_holding.has(on_addr) and regs_holding.has(off_addr): - regs_holding[on_addr] = tools.set_bit(regs_holding[on_addr], on_bit, val) - regs_holding[off_addr] = tools.set_bit(regs_holding[off_addr], off_bit, not val) - push_write_holding() + var on_addr = meta[0] + var on_bit = meta[1] + var off_addr = meta[2] + var off_bit = meta[3] + if regs_holding.has(on_addr) and regs_holding.has(off_addr): + regs_holding[on_addr] = tools.set_bit(regs_holding[on_addr], on_bit, val) + regs_holding[off_addr] = tools.set_bit(regs_holding[off_addr], off_bit, not val) + push_write_holding() ## Заносит в очередь команду чтения регистров хранения func push_write_holding(): - var regs_data: = [] - var keys = regs_holding.keys() - keys.sort() # Ключи в словаре хранятся не упорядочено - for addr in keys: - regs_data.append(regs_holding[addr]) - write_stack.push_back(StackItem.new(keys[0], regs_data)) + var regs_data: = [] + var keys = regs_holding.keys() + keys.sort() # Ключи в словаре хранятся не упорядочено + for addr in keys: + regs_data.append(regs_holding[addr]) + write_stack.push_back(StackItem.new(keys[0], regs_data)) func _ready() -> void: - if Engine.is_editor_hint(): return - var unit_key = settings.get_unit_key(unit_name) - var unit_sch3 = network.units[unit_key] - unit_sch3.mb_addr = modbus_address - 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)) - item.disabled = true - unit_sch3.connect('resp_input', on_resp_input) - unit_sch3.connect('resp_holding', on_resp_holding) - unit_sch3.connect('command_fail', on_command_fail) - timer.connect('timeout', _on_timeout.bind(unit_sch3)) - add_child(timer) - timer.start(request_period) + if Engine.is_editor_hint(): return + var unit_key = settings.get_unit_key(unit_name) + var unit_sch3 = network.units[unit_key] + unit_sch3.mb_addr = modbus_address + 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)) + item.disabled = true + unit_sch3.connect('resp_input', on_resp_input) + unit_sch3.connect('resp_holding', on_resp_holding) + unit_sch3.connect('command_fail', on_command_fail) + timer.connect('timeout', _on_timeout.bind(unit_sch3)) + add_child(timer) + timer.start(request_period) func on_command_fail(unit_sch3): - unit_sch3.cmd_state = unit.Unit.CmdState.DONE - timer.stop() + unit_sch3.cmd_state = unit.Unit.CmdState.DONE + timer.stop() ## Вызывается, когда состояния прибора Щ3 "на связи" изменяется[br] ## [param unit_sch3] - Экземпляр представления прибора Щ3 func on_line_changed(unit_sch3: sch_3.Sch3): - for item in get_tree().get_nodes_in_group('bits_items_good'): - item.texture = textures[STATE_VAL.NONE] - if not unit_sch3.online: - for item in get_tree().get_nodes_in_group('bits_items_switch'): - item.disabled = true - regs_holding.clear() - regs_input.clear() - write_stack.clear() - input_stack.clear() - holding_stack.clear() - switches_sync = false - $margin/vbox/grid1/lbl_freq.text = '<нет данных>' - $margin/vbox/grid1/state_freq.texture = textures[STATE_VAL.NONE] - else: - timer.start(request_period) + for item in get_tree().get_nodes_in_group('bits_items_good'): + item.texture = textures[STATE_VAL.NONE] + if not unit_sch3.online: + for item in get_tree().get_nodes_in_group('bits_items_switch'): + item.disabled = true + regs_holding.clear() + regs_input.clear() + write_stack.clear() + input_stack.clear() + holding_stack.clear() + switches_sync = false + $margin/vbox/grid1/lbl_freq.text = '<нет данных>' + $margin/vbox/grid1/state_freq.texture = textures[STATE_VAL.NONE] + else: + timer.start(request_period) ## Вызывается по сигналу "приняты данные чтения регистров хранения"[br] ## [param base_addr] - Начальный адрес регистров.[br] ## [param data] - Массив значений прочитанных из регистров. func on_resp_holding(base_addr: int, data: Array): - if (base_addr != base_holding_address) or (data.size() < regs_holding_count): - return - for i in data.size(): - regs_holding[base_addr + i] = data[i] - # Разрешить работу выключателей только когда прочитано их реальное состояние - if not switches_sync: - switches_sync = true - for item in get_tree().get_nodes_in_group('bits_items_switch'): - var bits = item.get_meta('bits') - var byte0: int = bits[0] # Адрес регистра - var bit0: int = bits[1] # Индекс бита - var byte1: int = bits[2] # Адрес регистра - var bit1: int = bits[3] # Индекс бита - var val0: bool = regs_holding[byte0] & (1 << bit0) > 0 - item.button_pressed = val0 - item.disabled = false - regs_holding[byte1] = tools.set_bit(regs_holding[byte1], bit1, not val0) - push_write_holding() + if (base_addr != base_holding_address) or (data.size() < regs_holding_count): + return + for i in data.size(): + regs_holding[base_addr + i] = data[i] + # Разрешить работу выключателей только когда прочитано их реальное состояние + if not switches_sync: + switches_sync = true + for item in get_tree().get_nodes_in_group('bits_items_switch'): + var bits = item.get_meta('bits') + var byte0: int = bits[0] # Адрес регистра + var bit0: int = bits[1] # Индекс бита + var byte1: int = bits[2] # Адрес регистра + var bit1: int = bits[3] # Индекс бита + var val0: bool = regs_holding[byte0] & (1 << bit0) > 0 + item.button_pressed = val0 + item.disabled = false + regs_holding[byte1] = tools.set_bit(regs_holding[byte1], bit1, not val0) + push_write_holding() ## Вызывается по сигналу "приняты данные чтения регистров входов".[br] ## [param base_addr] - Начальный адрес регистров.[br] ## [param data] - Массив значений прочитанных из регистров.[br] func on_resp_input(base_addr: int, data: Array): - if (base_addr != base_input_address) or (data.size() < regs_input_count): - return - # "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..." - # "Для контроля подачи электроэнергии на приборы ..." - # Таблицы 3.13 и 3.14. Ecли значения соответствующих битов в этих - # регистрах равны, то "исправно". - var items = get_tree().get_nodes_in_group('bits_items_good') - for i in data.size(): - regs_input[base_addr + i] = data[i] - # Таблица 3.15, Регистр PowerState - $margin/vbox/grid1/lbl_freq.text = '%d' % (regs_input[4] & 0x1ff) - $margin/vbox/grid1/state_freq.texture \ - = textures[STATE_VAL.GOOD] if regs_input[4] & (1 << 15) \ - else textures[STATE_VAL.ERROR] - var cnt_good: int = 0 - for item in items: - var bits: Array = item.get_meta('bits') - var byte0: int = bits[0] # Индекс байта в данных "состояния управляющего элемента" - var bit0: int = bits[1] # Индекс бита в данных "состояния управляющего элемента" - var byte1: int = bits[2] # Индекс байта в данных "подачи электроэнергии на приборы" - var bit1: int = bits[3] # Индекс бита в данных "подачи электроэнергии на приборы" - var v = STATE_VAL.GOOD \ - if (data[byte0] & (1 << bit0)) \ - == (data[byte1] & (1 << bit1)) \ - else STATE_VAL.ERROR - cnt_good += int(v == STATE_VAL.GOOD) - item.texture = textures[v] - state = STATE_VAL.GOOD if cnt_good == items.size() else STATE_VAL.ERROR + if (base_addr != base_input_address) or (data.size() < regs_input_count): + return + # "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..." + # "Для контроля подачи электроэнергии на приборы ..." + # Таблицы 3.13 и 3.14. Ecли значения соответствующих битов в этих + # регистрах равны, то "исправно". + var items = get_tree().get_nodes_in_group('bits_items_good') + for i in data.size(): + regs_input[base_addr + i] = data[i] + # Таблица 3.15, Регистр PowerState + $margin/vbox/grid1/lbl_freq.text = '%d' % (regs_input[4] & 0x1ff) + $margin/vbox/grid1/state_freq.texture \ + = textures[STATE_VAL.GOOD] if regs_input[4] & (1 << 15) \ + else textures[STATE_VAL.ERROR] + var cnt_good: int = 0 + for item in items: + var bits: Array = item.get_meta('bits') + var byte0: int = bits[0] # Индекс байта в данных "состояния управляющего элемента" + var bit0: int = bits[1] # Индекс бита в данных "состояния управляющего элемента" + var byte1: int = bits[2] # Индекс байта в данных "подачи электроэнергии на приборы" + var bit1: int = bits[3] # Индекс бита в данных "подачи электроэнергии на приборы" + var v = STATE_VAL.GOOD \ + if (data[byte0] & (1 << bit0)) \ + == (data[byte1] & (1 << bit1)) \ + else STATE_VAL.ERROR + cnt_good += int(v == STATE_VAL.GOOD) + item.texture = textures[v] + state = STATE_VAL.GOOD if cnt_good == items.size() else STATE_VAL.ERROR diff --git a/scenes/контроль/кассета.gd b/scenes/контроль/кассета.gd index a91fc7a..26eed3d 100644 --- a/scenes/контроль/кассета.gd +++ b/scenes/контроль/кассета.gd @@ -7,12 +7,12 @@ extends NinePatchRect """ @export var fname: String: - set(v): - fname = v - if is_inside_tree(): - $lbl_fname.text = v + set(v): + fname = v + if is_inside_tree(): + $lbl_fname.text = v @export var rname: String: - set(v): - rname = v + set(v): + rname = v diff --git a/scenes/контроль/кнопка-прибора.gd b/scenes/контроль/кнопка-прибора.gd index 4575a6c..e0f2369 100644 --- a/scenes/контроль/кнопка-прибора.gd +++ b/scenes/контроль/кнопка-прибора.gd @@ -7,7 +7,7 @@ extends Node func _on_toggled(toggled_on): $frame.visible = toggled_on @export var state: int: - set(v): - v = 0 if v < 0 else v % state_colors.size() - state = v - $label.self_modulate = state_colors[v] + set(v): + v = 0 if v < 0 else v % state_colors.size() + state = v + $label.self_modulate = state_colors[v] diff --git a/scenes/контроль/контроль.gd b/scenes/контроль/контроль.gd index 562cb76..295867b 100644 --- a/scenes/контроль/контроль.gd +++ b/scenes/контроль/контроль.gd @@ -6,50 +6,50 @@ extends Panel const PRIBORS_RES = \ { - 'pribor_afsp_l': ['res://scenes/pribor-afsp/pribor-afsp.tscn', 'Контроль исправности прибора АФСП левый'], - 'pribor_afsp_r': ['res://scenes/pribor-afsp/pribor-afsp.tscn', 'Контроль исправности прибора АФСП правый'], - 'pribor_prd_k_1': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 1'], - 'pribor_prd_k_2': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 2'], - 'pribor_prd_k_3': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 3'], - 'pribor_prd_k_4': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 4'], - 'pribor_prd_n_1': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 1'], - 'pribor_prd_n_2': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 2'], - 'pribor_prd_n_3': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 3'], - 'pribor_prd_n_4': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 4'], - 'pribor_prd_v_1': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 1'], - '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_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'], - 'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности прибора УЭП'], - } + 'pribor_afsp_l': ['res://scenes/pribor-afsp/pribor-afsp.tscn', 'Контроль исправности прибора АФСП левый'], + 'pribor_afsp_r': ['res://scenes/pribor-afsp/pribor-afsp.tscn', 'Контроль исправности прибора АФСП правый'], + 'pribor_prd_k_1': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 1'], + 'pribor_prd_k_2': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 2'], + 'pribor_prd_k_3': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 3'], + 'pribor_prd_k_4': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 4'], + 'pribor_prd_n_1': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 1'], + 'pribor_prd_n_2': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 2'], + 'pribor_prd_n_3': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 3'], + 'pribor_prd_n_4': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 4'], + 'pribor_prd_v_1': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 1'], + '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_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'], + 'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности прибора УЭП'], + } func _ready(): - var group = ButtonGroup.new() - for k in PRIBORS_RES: - var pribor_node = get_node(k) - assert(pribor_node) - var pribor_path = PRIBORS_RES[k][0] - var header_text = PRIBORS_RES[k][1] - pribor_node.set_button_group(group) - pribor_node.connect('button_down', Callable(self, 'on_pribor_press').bind(pribor_path, header_text)) - log.info('Модуль контроля работы готов') + var group = ButtonGroup.new() + for k in PRIBORS_RES: + var pribor_node = get_node(k) + assert(pribor_node) + var pribor_path = PRIBORS_RES[k][0] + var header_text = PRIBORS_RES[k][1] + pribor_node.set_button_group(group) + pribor_node.connect('button_down', Callable(self, 'on_pribor_press').bind(pribor_path, header_text)) + log.info('Модуль контроля работы готов') func on_pribor_press(pribor_path, header_text): - clear_obj($mnemo_container) - var pribor_obj = load(pribor_path) - assert(pribor_obj) - var pribor = pribor_obj.instantiate() - assert(pribor) - pribor.set_header_text(header_text) - $mnemo_container.add_child(pribor) + clear_obj($mnemo_container) + var pribor_obj = load(pribor_path) + assert(pribor_obj) + var pribor = pribor_obj.instantiate() + assert(pribor) + pribor.set_header_text(header_text) + $mnemo_container.add_child(pribor) func clear_obj(obj: Object): - var items = obj.get_children() - for item in items: - obj.remove_child(item) - item.queue_free() + var items = obj.get_children() + for item in items: + obj.remove_child(item) + item.queue_free() diff --git a/scenes/контроль/элемент-в.tscn b/scenes/контроль/элемент-в.tscn index 9c8c4ca..5e4e961 100644 --- a/scenes/контроль/элемент-в.tscn +++ b/scenes/контроль/элемент-в.tscn @@ -18,55 +18,55 @@ extends Control @export var self_size: Vector2i = Vector2i(50, 150): - set(v): - self_size = v - size = v - $np_rect.size = v - _resize_children() - get: return size + set(v): + self_size = v + size = v + $np_rect.size = v + _resize_children() + get: return size @export var fname: String: - set(v): - fname = v - $lbl_fname.text = v + set(v): + fname = v + $lbl_fname.text = v @export var rname: String: - set(v): - rname = v - $lbl_rname.text = v + set(v): + rname = v + $lbl_rname.text = v func _resize_children() -> void: - $lbl_rname.size.x = size.x - $lbl_rname.position.y = margins[0] - $lbl_fname.size.y = size.x - $lbl_fname.position.y = size.y / 2 + $lbl_fname.size.x / 2 - $txr_state.position.x = size.x / 2 - ($txr_state.size.x * $txr_state.scale.x) / 2 - $txr_state.position.y = size.y - $txr_state.size.y * $txr_state.scale.x - margins[2] + $lbl_rname.size.x = size.x + $lbl_rname.position.y = margins[0] + $lbl_fname.size.y = size.x + $lbl_fname.position.y = size.y / 2 + $lbl_fname.size.x / 2 + $txr_state.position.x = size.x / 2 - ($txr_state.size.x * $txr_state.scale.x) / 2 + $txr_state.position.y = size.y - $txr_state.size.y * $txr_state.scale.x - margins[2] func _on_nine_patch_rect_resized() -> void: - size = $np_rect.size - self_size = $np_rect.size - _resize_children() + size = $np_rect.size + self_size = $np_rect.size + _resize_children() func _on_resized() -> void: - $np_rect.size = size - self_size = size - _resize_children() + $np_rect.size = size + self_size = size + _resize_children() @export var state: int: - set(v): - v = 0 if v < 0 else v - v %= textures.size() - state = v - $txr_state.texture = textures[v] - get: - return state + set(v): + v = 0 if v < 0 else v + v %= textures.size() + state = v + $txr_state.texture = textures[v] + get: + return state " [node name="yelement_v" type="Control"] diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index 3f5a0c1..6e7999f 100644 --- a/scenes/эмс/эмс.gd +++ b/scenes/эмс/эмс.gd @@ -27,336 +27,336 @@ var posy: int = 70 ## Позиция элементов по y. func _ready() -> void: - call_deferred('init_boards') + call_deferred('init_boards') ## Инициализация основных элементов экрана ЭМС. func init_boards(): - var unit_key = settings.get_unit_key('уарэп-эмс') - var unit_ems = network.units[unit_key] + var unit_key = settings.get_unit_key('уарэп-эмс') + var unit_ems = network.units[unit_key] - # Выставление позиций элементов ЭМС на экране - $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[yemsconsts.KEMS_BOARD_NAME] = yemsboards.EmsBoard.new(0, 0x130, yemsconsts.INPUT_KEMS, yemsconsts.OUTPUT_KEMS, unit_ems) - g_boards[yemsconsts.EMS1_BOARD_NAME] = yemsboards.EmsBoard.new(1, 0x110, yemsconsts.INPUT_EMS1, yemsconsts.OUTPUT_EMS1, unit_ems) - g_boards[yemsconsts.EMS2_BOARD_NAME] = yemsboards.EmsBoard.new(2, 0x120, yemsconsts.INPUT_EMS2, yemsconsts.OUTPUT_EMS2, unit_ems) + g_boards[yemsconsts.KEMS_BOARD_NAME] = yemsboards.EmsBoard.new(0, 0x130, yemsconsts.INPUT_KEMS, yemsconsts.OUTPUT_KEMS, unit_ems) + g_boards[yemsconsts.EMS1_BOARD_NAME] = yemsboards.EmsBoard.new(1, 0x110, yemsconsts.INPUT_EMS1, yemsconsts.OUTPUT_EMS1, unit_ems) + g_boards[yemsconsts.EMS2_BOARD_NAME] = yemsboards.EmsBoard.new(2, 0x120, yemsconsts.INPUT_EMS2, yemsconsts.OUTPUT_EMS2, unit_ems) - active_board = g_boards[yemsconsts.KEMS_BOARD_NAME] + active_board = g_boards[yemsconsts.KEMS_BOARD_NAME] - 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) + 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) - unit_ems.connect('data_received', Callable(self, 'on_data_ems_received')) - unit_ems.connect('command_done', Callable(self, 'on_command_done')) - unit_ems.connect('line_changed', Callable(self, 'on_line_changed')) - for board in g_boards.values(): - board.connect('upd_delay_offset', Callable(self, 'on_upd_delay_offset')) - board.connect('upd_o_state', Callable(self, 'on_upd_o_state')) - $btn_connect.connect('pressed', Callable(self, 'on_btn_connect')) - $btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect').bind(unit_ems)) - $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)) + unit_ems.connect('data_received', Callable(self, 'on_data_ems_received')) + unit_ems.connect('command_done', Callable(self, 'on_command_done')) + unit_ems.connect('line_changed', Callable(self, 'on_line_changed')) + for board in g_boards.values(): + board.connect('upd_delay_offset', Callable(self, 'on_upd_delay_offset')) + board.connect('upd_o_state', Callable(self, 'on_upd_o_state')) + $btn_connect.connect('pressed', Callable(self, 'on_btn_connect')) + $btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect').bind(unit_ems)) + $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(unit_ems): - 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 not active_board.read_done: - return - if len(selected_rows_in): - on_disconnect($scrl_in_set/tbl_in_set, selected_rows_in, unit_ems) - elif len(selected_rows_out): - on_disconnect($scrl_out_set/tbl_out_set, selected_rows_out, unit_ems) + 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 not active_board.read_done: + return + if len(selected_rows_in): + on_disconnect($scrl_in_set/tbl_in_set, selected_rows_in, unit_ems) + elif len(selected_rows_out): + on_disconnect($scrl_out_set/tbl_out_set, selected_rows_out, unit_ems) ## Разрывает связь входа и выхода, [param tbl] - таблица, [param selected_rows] - выбранные строки. ## [param type_dev] - тип, 'вход' или 'выход'. func on_disconnect(tbl, selected_rows, unit_ems): - var o_dev: yemsdevs.OutDev - var i_dev: yemsdevs.InDev - var dev = tbl.get_node_user_data(0, 0) - if dev is yemsdevs.OutDev: - o_dev = dev - i_dev = tbl.get_node_user_data(0, selected_rows[0])[0] - else: - i_dev = dev - o_dev = tbl.get_node_user_data(0, selected_rows[0])[0] - if not unit_ems.online or not g_boards[tbl.get_node_user_data(0, selected_rows[0])[1]].online: - return - i_dev.connect_devs.erase(o_dev.dev_name) - o_dev.connect_devs.erase(i_dev.dev_name) - active_board = g_boards[tbl.get_node_user_data(0, selected_rows[0])[1]] - active_board.set_connection(o_dev.id, i_dev.id, false) - set_in_dev(i_dev) - set_out_dev(o_dev) + var o_dev: yemsdevs.OutDev + var i_dev: yemsdevs.InDev + var dev = tbl.get_node_user_data(0, 0) + if dev is yemsdevs.OutDev: + o_dev = dev + i_dev = tbl.get_node_user_data(0, selected_rows[0])[0] + else: + i_dev = dev + o_dev = tbl.get_node_user_data(0, selected_rows[0])[0] + if not unit_ems.online or not g_boards[tbl.get_node_user_data(0, selected_rows[0])[1]].online: + return + i_dev.connect_devs.erase(o_dev.dev_name) + o_dev.connect_devs.erase(i_dev.dev_name) + active_board = g_boards[tbl.get_node_user_data(0, selected_rows[0])[1]] + active_board.set_connection(o_dev.id, i_dev.id, false) + set_in_dev(i_dev) + set_out_dev(o_dev) ## Обработчик нажатия кнопки "Прочитать". func on_btn_flash_read(btn): - await get_tree().create_timer(0.1).timeout - btn.pressed = false - for board in g_boards.values(): - board.need_flash_rd = true - log.message(log.INFO, 'Произведено чтение настроек ЭМС из flash памяти') + await get_tree().create_timer(0.1).timeout + btn.pressed = false + for board in g_boards.values(): + board.need_flash_rd = true + log.message(log.INFO, 'Произведено чтение настроек ЭМС из flash памяти') ## Обработчик нажатия кнопки "Записать". func on_btn_flash_write(btn): - await get_tree().create_timer(0.1).timeout - btn.pressed = false - for board in g_boards.values(): - board.need_flash_wr = true - log.message(log.INFO, 'Произведена запись настроек ЭМС в flash память') + await get_tree().create_timer(0.1).timeout + btn.pressed = false + for board in g_boards.values(): + board.need_flash_wr = true + log.message(log.INFO, 'Произведена запись настроек ЭМС в flash память') ## Инициализация таблицы с файлами настроек ЭМС. func init_tbl_files(): - check_dir() - $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]) - tools.fill_files_table($scrl_files/tbl_files, yemsconsts.files_folder, FILES_ROWS_TYPES) - $scrl_files/tbl_files.set_columns_alignments(yemsconsts.FILES_ROWS_ALIGNMENT) - $scrl_files/tbl_files.set_columns_min_size(yemsconsts.FILES_COLUMN_WIDTHS) - $scrl_files/tbl_files.connect('row_pressed', Callable(self, 'on_pressed_file')) - for i_row in $scrl_files/tbl_files.get_rows_count(): - disable_edit($scrl_files/tbl_files, len(FILES_ROWS_TYPES), i_row) + check_dir() + $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]) + tools.fill_files_table($scrl_files/tbl_files, yemsconsts.files_folder, FILES_ROWS_TYPES) + $scrl_files/tbl_files.set_columns_alignments(yemsconsts.FILES_ROWS_ALIGNMENT) + $scrl_files/tbl_files.set_columns_min_size(yemsconsts.FILES_COLUMN_WIDTHS) + $scrl_files/tbl_files.connect('row_pressed', Callable(self, 'on_pressed_file')) + for i_row in $scrl_files/tbl_files.get_rows_count(): + disable_edit($scrl_files/tbl_files, len(FILES_ROWS_TYPES), i_row) ## Инициализация таблиц входов. 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, g_boards[board].base_addr_isa) - g_boards[board].in_devs[in_dev.id] = in_dev - in_dev.board = board - for i in len(row_type): - if i < len(params): - var node = $scrollin/tbl_in.get_node2(i, row_index) - if i == 0: - node.text = board + ': ' + params[i] - elif i in TABLE_ENTRY_COLUMNS: - if board == yemsconsts.EMS1_BOARD_NAME or board == yemsconsts.EMS2_BOARD_NAME: - node.text = '' - else: - node.text = '%3.1f' % float(params[i]) - else: - 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, g_boards[board].base_addr_isa) + g_boards[board].in_devs[in_dev.id] = in_dev + in_dev.board = board + for i in len(row_type): + if i < len(params): + var node = $scrollin/tbl_in.get_node2(i, row_index) + if i == 0: + node.text = board + ': ' + params[i] + elif i in TABLE_ENTRY_COLUMNS: + if board == yemsconsts.EMS1_BOARD_NAME or board == yemsconsts.EMS2_BOARD_NAME: + node.text = '' + else: + node.text = '%3.1f' % float(params[i]) + else: + 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, args): - var entry = args[0] - var tbl = args[1] - var dev = args[2] - var indexis = tbl.get_key_indexes(args[0].name) - var col_i = indexis[0] - var read = true - var is_delay = true - var val = float(text) - if text.is_valid_float(): - var max_val = 0 - if col_i == yemsconsts.I_COL_DELAY: - max_val = yemsconsts.MAX_VAL_DELAY - else: - max_val = yemsconsts.MAX_VAL_OFFSET - is_delay = false - if val > max_val: - val = max_val - elif val < 0: - val = 0.0 - entry.set_text(str('%3.1f' % val)) - read = false - else: - if col_i == yemsconsts.I_COL_DELAY: - entry.set_text(str('%3.1f' % dev.delay)) - else: - entry.set_text(str('%3.1f' % dev.offset)) - if active_board.read_done and g_boards[dev.board].online: - active_board = g_boards[dev.board] - active_board.set_delay(dev.id, val, is_delay, read) + var entry = args[0] + var tbl = args[1] + var dev = args[2] + var indexis = tbl.get_key_indexes(args[0].name) + var col_i = indexis[0] + var read = true + var is_delay = true + var val = float(text) + if text.is_valid_float(): + var max_val = 0 + if col_i == yemsconsts.I_COL_DELAY: + max_val = yemsconsts.MAX_VAL_DELAY + else: + max_val = yemsconsts.MAX_VAL_OFFSET + is_delay = false + if val > max_val: + val = max_val + elif val < 0: + val = 0.0 + entry.set_text(str('%3.1f' % val)) + read = false + else: + if col_i == yemsconsts.I_COL_DELAY: + entry.set_text(str('%3.1f' % dev.delay)) + else: + entry.set_text(str('%3.1f' % dev.offset)) + if active_board.read_done and g_boards[dev.board].online: + active_board = g_boards[dev.board] + active_board.set_delay(dev.id, val, is_delay, read) ## Обработчик выбора строки в таблице входов. 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, true) - on_selected_changed_in(i_row) + on_row_pressed(i_row, $scrollin/tbl_in, true) + 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 - var connector = dev.connector - for i in $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 + var connector = dev.connector + for i in $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, true) - on_selected_changed_si(i_row) + if i_row < 2: + return + on_row_pressed(i_row, $scrl_in_set/tbl_in_set, true) + 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, g_boards[board].base_addr_isa) - g_boards[board].out_devs[out_dev.id] = out_dev - out_dev.set_default_mode() - out_dev.board = board - for i in len(header_text): - var cell = $scrollout/tbl_out.get_node2(i, row_index) - if i < len(params): - if i == 0: - cell.text = board + ': ' + params[i] - elif i in TABLE_ENTRY_COLUMNS: - if board == yemsconsts.EMS1_BOARD_NAME or board == yemsconsts.EMS2_BOARD_NAME: - cell.text = '' - else: - cell.text = '%3.1f' % float(params[i]) - else: - 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_MODE[out_dev.mode] - cell.editable = false - $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, g_boards[board].base_addr_isa) + g_boards[board].out_devs[out_dev.id] = out_dev + out_dev.set_default_mode() + out_dev.board = board + for i in len(header_text): + var cell = $scrollout/tbl_out.get_node2(i, row_index) + if i < len(params): + if i == 0: + cell.text = board + ': ' + params[i] + elif i in TABLE_ENTRY_COLUMNS: + if board == yemsconsts.EMS1_BOARD_NAME or board == yemsconsts.EMS2_BOARD_NAME: + cell.text = '' + else: + cell.text = '%3.1f' % float(params[i]) + else: + 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_MODE[out_dev.mode] + cell.editable = false + $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 - var connector = dev.connector - for i in $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 + var connector = dev.connector + for i in $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, true) - on_selected_changed_so(i_row) + if i_row < 2: + return + on_row_pressed(i_row, $scrl_out_set/tbl_out_set, true) + 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, true) - on_selected_changed_out(i_row) + on_row_pressed(i_row, $scrollout/tbl_out, true) + 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) - mode.connect('item_selected', Callable(self, 'on_switch_done').bind(dev)) - mode.select(dev.mode) + 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) + mode.connect('item_selected', Callable(self, 'on_switch_done').bind(dev)) + mode.select(dev.mode) ## Выбор входного или выходного устройства.[br] @@ -366,63 +366,63 @@ 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.board + ': ' + 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 = '%3.1f'%dev.delay - var offset: LineEdit = tbl.get_node2(3, 0) - offset.text = '%3.1f'%dev.offset - if dev.board == yemsconsts.EMS1_BOARD_NAME or dev.board == yemsconsts.EMS2_BOARD_NAME: - delay.text = '' - delay.editable = false - offset.text = '' - offset.editable = false - else: - delay.editable = true - offset.editable = true - 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.board + ': ' + 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 = '%3.1f'%dev.delay + var offset: LineEdit = tbl.get_node2(3, 0) + offset.text = '%3.1f'%dev.offset + if dev.board == yemsconsts.EMS1_BOARD_NAME or dev.board == yemsconsts.EMS2_BOARD_NAME: + delay.text = '' + delay.editable = false + offset.text = '' + offset.editable = false + else: + delay.editable = true + offset.editable = true + 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] - 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, [tbl, dev]) + for i in dev.connect_devs: + var dev_con = dev.connect_devs[i] + 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, [tbl, dev]) ## Обработчик нажатия кнопки 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]) - if in_user_data[1] != out_user_data[1] or not active_board.read_done: - return - 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]) + if in_user_data[1] != out_user_data[1] or not active_board.read_done: + return + 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] @@ -432,17 +432,17 @@ 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.dev_name 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.dev_name - disable_edit(tbl, len(set_row), node_index[1]) - tbl.set_node_user_data(node_index[0], node_index[1], user_data[0]) - dev2.connect_devs[dev1.dev_name] = dev1 - if dev1 is yemsdevs.OutDev: - active_board = g_boards[user_data[1]] - active_board.set_connection(dev1.id, dev2.id, true) + if not dev1.dev_name 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.dev_name + disable_edit(tbl, len(set_row), node_index[1]) + tbl.set_node_user_data(node_index[0], node_index[1], user_data[0]) + dev2.connect_devs[dev1.dev_name] = dev1 + if dev1 is yemsdevs.OutDev: + active_board = g_boards[user_data[1]] + active_board.set_connection(dev1.id, dev2.id, true) ## Отключает возможность редактирования LineEdit в таблице.[br] @@ -450,211 +450,211 @@ 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 num_col: - var node: LineEdit = tbl.get_node2(col, i_row) - node.editable = false + for col in num_col: + var node: LineEdit = tbl.get_node2(col, i_row) + node.editable = false ## Обработчик выбора строки с таблице. func on_row_pressed(i_row: int, tbl, set_selected: bool): - tbl.clear_rows_selected() - var is_row_selected = tbl.is_row_selected(i_row) - if set_selected: - tbl.set_row_selected(i_row, true) - else: - tbl.set_row_selected(i_row, not is_row_selected) + tbl.clear_rows_selected() + var is_row_selected = tbl.is_row_selected(i_row) + if set_selected: + tbl.set_row_selected(i_row, true) + else: + tbl.set_row_selected(i_row, not is_row_selected) ## Обработчик получения пакета от ячейки ЯУ-07Б func on_data_ems_received(unit_ems): - for board in g_boards.values(): - board.set_status(unit_ems.status) - if active_board.state_board == active_board.WAIT and active_board.state_cmd == active_board.WAIT: - if board.online and not board.read_done: - active_board = board - active_board.state_board = active_board.READ - active_board.start_rw_kems(true) - elif board.online and board.read_done and board.need_flash_rd: - active_board = board - active_board.state_board = active_board.READ_FLASH - active_board.read_flash() - elif board.online and board.read_done and board.need_flash_wr: - active_board = board - active_board.state_board = active_board.WRITE_FLASH - active_board.write_flash() - elif board.online and board.read_done and board.need_write: - active_board = board - active_board.state_board = active_board.WRITE - active_board.start_rw_kems(false) - for i_row in $scrollin/tbl_in.get_rows_count(): - var state_pic = ($scrollin/tbl_in.get_node2(4, i_row)) - var dev = $scrollin/tbl_in.get_node_user_data(4, i_row)[0] - state_pic.set_frame(dev.state) - for i_row in $scrollout/tbl_out.get_rows_count(): - var state_pic = ($scrollout/tbl_out.get_node2(4, i_row)) - var dev = $scrollout/tbl_out.get_node_user_data(4, i_row)[0] - state_pic.set_frame(dev.state) - if $scrl_in_set/tbl_in_set.get_rows_count(): - var dev = $scrl_in_set/tbl_in_set.get_node_user_data(0, 0) - var state_pic = $scrl_in_set/tbl_in_set.get_node2(4, 0) - state_pic.set_frame(dev.state) - if $scrl_out_set/tbl_out_set.get_rows_count(): - var dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0) - var state_pic = $scrl_out_set/tbl_out_set.get_node2(4, 0) - state_pic.set_frame(dev.state) + for board in g_boards.values(): + board.set_status(unit_ems.status) + if active_board.state_board == active_board.WAIT and active_board.state_cmd == active_board.WAIT: + if board.online and not board.read_done: + active_board = board + active_board.state_board = active_board.READ + active_board.start_rw_kems(true) + elif board.online and board.read_done and board.need_flash_rd: + active_board = board + active_board.state_board = active_board.READ_FLASH + active_board.read_flash() + elif board.online and board.read_done and board.need_flash_wr: + active_board = board + active_board.state_board = active_board.WRITE_FLASH + active_board.write_flash() + elif board.online and board.read_done and board.need_write: + active_board = board + active_board.state_board = active_board.WRITE + active_board.start_rw_kems(false) + for i_row in $scrollin/tbl_in.get_rows_count(): + var state_pic = ($scrollin/tbl_in.get_node2(4, i_row)) + var dev = $scrollin/tbl_in.get_node_user_data(4, i_row)[0] + state_pic.set_frame(dev.state) + for i_row in $scrollout/tbl_out.get_rows_count(): + var state_pic = ($scrollout/tbl_out.get_node2(4, i_row)) + var dev = $scrollout/tbl_out.get_node_user_data(4, i_row)[0] + state_pic.set_frame(dev.state) + if $scrl_in_set/tbl_in_set.get_rows_count(): + var dev = $scrl_in_set/tbl_in_set.get_node_user_data(0, 0) + var state_pic = $scrl_in_set/tbl_in_set.get_node2(4, 0) + state_pic.set_frame(dev.state) + if $scrl_out_set/tbl_out_set.get_rows_count(): + var dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0) + var state_pic = $scrl_out_set/tbl_out_set.get_node2(4, 0) + state_pic.set_frame(dev.state) ## Обработчик выполнения команды func on_command_done(unit_ems): - active_board.on_command_done(unit_ems) + active_board.on_command_done(unit_ems) ## Вызывается по изменению статуса ячейки ЯУ-07Б func on_line_changed(unit_ems): - if unit_ems.online: - $lbl_online.text = 'Ячейка ЯУ-07 на связи' - $lbl_online.modulate = Color.GREEN - else: - $lbl_online.text = 'Ячейка ЯУ-07 не на связи' - $lbl_online.modulate = Color.RED - for board in g_boards.values(): - board.state_board = board.WAIT - board.read_done = false + if unit_ems.online: + $lbl_online.text = 'Ячейка ЯУ-07 на связи' + $lbl_online.modulate = Color.GREEN + else: + $lbl_online.text = 'Ячейка ЯУ-07 не на связи' + $lbl_online.modulate = Color.RED + for board in g_boards.values(): + board.state_board = board.WAIT + board.read_done = false ## Вызывается по обновлению информации от ячейки времянках входов/выходов func on_upd_delay_offset(_board, dev): - if dev.board == yemsconsts.EMS1_BOARD_NAME or dev.board == yemsconsts.EMS2_BOARD_NAME: - return - var tbl = $scrollin/tbl_in - if dev is yemsdevs.OutDev: - tbl = $scrollout/tbl_out - var le_delay = tbl.get_node2(TABLE_ENTRY_COLUMNS[0], dev.tbl_row_id) - var le_offset = tbl.get_node2(TABLE_ENTRY_COLUMNS[1], dev.tbl_row_id) - le_delay.set_text(str('%3.1f' % dev.delay)) - le_offset.set_text(str('%3.1f' % dev.offset)) - if $scrl_in_set/tbl_in_set.get_rows_count(): - var sel_dev = $scrl_in_set/tbl_in_set.get_node_user_data(0, 0) - var l_delay = $scrl_in_set/tbl_in_set.get_node2(2, 0) - var l_offset = $scrl_in_set/tbl_in_set.get_node2(3, 0) - l_delay.set_text(str('%3.1f' % sel_dev.delay)) - l_offset.set_text(str('%3.1f' % sel_dev.offset)) - if $scrl_out_set/tbl_out_set.get_rows_count(): - var sel_dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0) - var l_delay = $scrl_out_set/tbl_out_set.get_node2(2, 0) - var l_offset = $scrl_out_set/tbl_out_set.get_node2(3, 0) - l_delay.set_text(str('%3.1f' % sel_dev.delay)) - l_offset.set_text(str('%3.1f' % sel_dev.offset)) + if dev.board == yemsconsts.EMS1_BOARD_NAME or dev.board == yemsconsts.EMS2_BOARD_NAME: + return + var tbl = $scrollin/tbl_in + if dev is yemsdevs.OutDev: + tbl = $scrollout/tbl_out + var le_delay = tbl.get_node2(TABLE_ENTRY_COLUMNS[0], dev.tbl_row_id) + var le_offset = tbl.get_node2(TABLE_ENTRY_COLUMNS[1], dev.tbl_row_id) + le_delay.set_text(str('%3.1f' % dev.delay)) + le_offset.set_text(str('%3.1f' % dev.offset)) + if $scrl_in_set/tbl_in_set.get_rows_count(): + var sel_dev = $scrl_in_set/tbl_in_set.get_node_user_data(0, 0) + var l_delay = $scrl_in_set/tbl_in_set.get_node2(2, 0) + var l_offset = $scrl_in_set/tbl_in_set.get_node2(3, 0) + l_delay.set_text(str('%3.1f' % sel_dev.delay)) + l_offset.set_text(str('%3.1f' % sel_dev.offset)) + if $scrl_out_set/tbl_out_set.get_rows_count(): + var sel_dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0) + var l_delay = $scrl_out_set/tbl_out_set.get_node2(2, 0) + var l_offset = $scrl_out_set/tbl_out_set.get_node2(3, 0) + l_delay.set_text(str('%3.1f' % sel_dev.delay)) + l_offset.set_text(str('%3.1f' % sel_dev.offset)) ## Вызывается по обновлению информации о режиме выходов func on_upd_o_state(board, dev): - var le_mode = $scrollout/tbl_out.get_node2(COLUMN_OPTS_BTN[0], dev.tbl_row_id) - le_mode.set_text(OUT_MODE[dev.mode]) - dev.connect_devs.clear() - for in_d in board.in_devs.values(): - if in_d.connect_devs.has(dev.dev_name): - in_d.connect_devs.erase(dev.dev_name) - for in_id in dev.btns_state: - if dev.btns_state[in_id] and board.in_devs.has(in_id): - var in_dev = board.in_devs[in_id] - in_dev.connect_devs[dev.dev_name] = dev - dev.connect_devs[in_dev.dev_name] = in_dev - if $scrl_out_set/tbl_out_set.get_rows_count(): - var sel_dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0) - var mode = $scrl_out_set/tbl_out_set.get_node2(5, 0) - mode.set_text(OUT_MODE[sel_dev.mode]) + var le_mode = $scrollout/tbl_out.get_node2(COLUMN_OPTS_BTN[0], dev.tbl_row_id) + le_mode.set_text(OUT_MODE[dev.mode]) + dev.connect_devs.clear() + for in_d in board.in_devs.values(): + if in_d.connect_devs.has(dev.dev_name): + in_d.connect_devs.erase(dev.dev_name) + for in_id in dev.btns_state: + if dev.btns_state[in_id] and board.in_devs.has(in_id): + var in_dev = board.in_devs[in_id] + in_dev.connect_devs[dev.dev_name] = dev + dev.connect_devs[in_dev.dev_name] = in_dev + if $scrl_out_set/tbl_out_set.get_rows_count(): + var sel_dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0) + var mode = $scrl_out_set/tbl_out_set.get_node2(5, 0) + mode.set_text(OUT_MODE[sel_dev.mode]) ## Вызывается при выборе режима работы выхода func on_switch_done(mode, dev): - var board = g_boards[dev.board] - if active_board.state_board == active_board.WAIT and board.online: - active_board = board - active_board.change_mode(dev.id, mode) + var board = g_boards[dev.board] + if active_board.state_board == active_board.WAIT and board.online: + active_board = board + active_board.change_mode(dev.id, mode) ## Проверяет ниличие директории, если их нет, создаёт func check_dir(): - var dir = DirAccess.open(yemsconsts.files_folder) - if dir: - check_files() - else: - DirAccess.make_dir_absolute(yemsconsts.files_folder) - check_files() + var dir = DirAccess.open(yemsconsts.files_folder) + if dir: + check_files() + else: + DirAccess.make_dir_absolute(yemsconsts.files_folder) + check_files() ## Проверяет наличие файлов, если их нет, создаёт func check_files(): - for file in yemsconsts.FILES_NAME: - var fd = FileAccess.open(yemsconsts.files_folder + file, FileAccess.READ) - if fd: - fd.close() - else: - fd = FileAccess.open(yemsconsts.files_folder + file, FileAccess.WRITE) - fd.close() + for file in yemsconsts.FILES_NAME: + var fd = FileAccess.open(yemsconsts.files_folder + file, FileAccess.READ) + if fd: + fd.close() + else: + fd = FileAccess.open(yemsconsts.files_folder + file, FileAccess.WRITE) + fd.close() ## Обработчик выбора строки с таблице func on_pressed_file(i_row: int): - $scrl_files/tbl_files.clear_rows_selected() - var is_row_selected = $scrl_files/tbl_files.is_row_selected(i_row) - $scrl_files/tbl_files.set_row_selected(i_row, not is_row_selected) + $scrl_files/tbl_files.clear_rows_selected() + var is_row_selected = $scrl_files/tbl_files.is_row_selected(i_row) + $scrl_files/tbl_files.set_row_selected(i_row, not is_row_selected) ## Вызываеттся по нажатию кнопки сохранить настройки в файл func _on_btn_save_pressed() -> void: - var sel_row: Array = [] - $scrl_files/tbl_files.get_selected_rows(sel_row) - if sel_row: - var fl_node = $scrl_files/tbl_files.get_node2(0, sel_row[0]) - var fl_name = fl_node.text - var file = FileAccess.open(yemsconsts.files_folder + fl_name, FileAccess.WRITE) - var json_data: Dictionary = {} - fill_json_data(json_data) - var json = JSON.stringify(json_data) - file.store_string(json) - file.close() - for i_row in $scrl_files/tbl_files.get_rows_count(): - $scrl_files/tbl_files.remove_row(0) - tools.fill_files_table($scrl_files/tbl_files, yemsconsts.files_folder, FILES_ROWS_TYPES) - $scrl_files/tbl_files.set_columns_alignments(yemsconsts.FILES_ROWS_ALIGNMENT) - $scrl_files/tbl_files.set_columns_min_size(yemsconsts.FILES_COLUMN_WIDTHS) - for i_row in $scrl_files/tbl_files.get_rows_count(): - disable_edit($scrl_files/tbl_files, len(FILES_ROWS_TYPES), i_row) - log.message(log.INFO, 'Произведено сохранение настроек ЭМС в файл: %s' %fl_name) + var sel_row: Array = [] + $scrl_files/tbl_files.get_selected_rows(sel_row) + if sel_row: + var fl_node = $scrl_files/tbl_files.get_node2(0, sel_row[0]) + var fl_name = fl_node.text + var file = FileAccess.open(yemsconsts.files_folder + fl_name, FileAccess.WRITE) + var json_data: Dictionary = {} + fill_json_data(json_data) + var json = JSON.stringify(json_data) + file.store_string(json) + file.close() + for i_row in $scrl_files/tbl_files.get_rows_count(): + $scrl_files/tbl_files.remove_row(0) + tools.fill_files_table($scrl_files/tbl_files, yemsconsts.files_folder, FILES_ROWS_TYPES) + $scrl_files/tbl_files.set_columns_alignments(yemsconsts.FILES_ROWS_ALIGNMENT) + $scrl_files/tbl_files.set_columns_min_size(yemsconsts.FILES_COLUMN_WIDTHS) + for i_row in $scrl_files/tbl_files.get_rows_count(): + disable_edit($scrl_files/tbl_files, len(FILES_ROWS_TYPES), i_row) + log.message(log.INFO, 'Произведено сохранение настроек ЭМС в файл: %s' %fl_name) ## Заполняет данными словарь устройств для упаковки в JSON func fill_json_data(json_data: Dictionary): - for board in g_boards.values(): - var devs: Dictionary = {} - json_data[board.id_board] = devs - for in_dev in board.in_devs.values(): - json_data[board.id_board][in_dev.id] = in_dev.ports_data - for out_dev in board.out_devs.values(): - json_data[board.id_board][out_dev.id] = out_dev.ports_data + for board in g_boards.values(): + var devs: Dictionary = {} + json_data[board.id_board] = devs + for in_dev in board.in_devs.values(): + json_data[board.id_board][in_dev.id] = in_dev.ports_data + for out_dev in board.out_devs.values(): + json_data[board.id_board][out_dev.id] = out_dev.ports_data ## Вызываеттся по нажатию кнопки загрузить настройки из файла func _on_btn_load_pressed() -> void: - var sel_row: Array = [] - $scrl_files/tbl_files.get_selected_rows(sel_row) - if sel_row: - var fl_node = $scrl_files/tbl_files.get_node2(0, sel_row[0]) - var fl_name = fl_node.text - var file = FileAccess.open(yemsconsts.files_folder + fl_name, FileAccess.READ) - if file == null: - return - var read = file.get_as_text() - file.close() - var json_conv: = JSON.new() - if Error.OK == json_conv.parse(read): - var json_data = json_conv.get_data() - for board in g_boards.values(): - if not json_data.has(str(board.id_board)): - return - var data = json_data[str(board.id_board)] - board.btn_load(data) - board.need_write = true - log.message(log.INFO, 'Произведено чтение настроек ЭМС из файла: %s' %fl_name) + var sel_row: Array = [] + $scrl_files/tbl_files.get_selected_rows(sel_row) + if sel_row: + var fl_node = $scrl_files/tbl_files.get_node2(0, sel_row[0]) + var fl_name = fl_node.text + var file = FileAccess.open(yemsconsts.files_folder + fl_name, FileAccess.READ) + if file == null: + return + var read = file.get_as_text() + file.close() + var json_conv: = JSON.new() + if Error.OK == json_conv.parse(read): + var json_data = json_conv.get_data() + for board in g_boards.values(): + if not json_data.has(str(board.id_board)): + return + var data = json_data[str(board.id_board)] + board.btn_load(data) + board.need_write = true + log.message(log.INFO, 'Произведено чтение настроек ЭМС из файла: %s' %fl_name) diff --git a/scripts/network.gd b/scripts/network.gd index 025199c..c14c04d 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -122,12 +122,13 @@ func _ready() -> void: dst_ports[unit_key] = st[2][0] if proto in TCP_PROTO: - var unit = TCP_PROTO[proto].new(unit_name) + var unit_tcp = TCP_PROTO[proto].new(unit_name) var unit_key = settings.get_unit_key(unit_name) - units_tcp[unit_key] = unit + units_tcp[unit_key] = unit_tcp + units[unit_key] = unit_tcp 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)) + unit_tcp.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) + unit_tcp.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) if proto in SERIAL_PROTO: var unit_serial = SERIAL_PROTO[proto].new(unit_name) diff --git a/scripts/unit.gd b/scripts/unit.gd index 5209cc9..e920fd6 100644 --- a/scripts/unit.gd +++ b/scripts/unit.gd @@ -3,26 +3,26 @@ class_name base_unit extends Node ## Базовый класс для управления подключаемыми устройствами class Unit extends Object: - ## Состояние автомата выполнения команды. - enum CmdState { - UNCK, ## Номер команды не ининциирован. - SEND, ## Буфер готов для отправки. - WAIT, ## Ожидание выполнения. - DONE, ## Команда выполнена. - FAIL ## Команда не выполнена. - } + ## Состояние автомата выполнения команды. + enum CmdState { + UNCK, ## Номер команды не ининциирован. + SEND, ## Буфер готов для отправки. + WAIT, ## Ожидание выполнения. + DONE, ## Команда выполнена. + FAIL ## Команда не выполнена. + } - signal line_changed(unit) ## Вызывается при изменении состояния связи - signal command_done(unit) ## Вызывается после успешного выполнения команды. - signal command_fail(unit) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. - signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных - signal data_received(data: PackedByteArray) ## Вызывается по приёму данных + signal line_changed(unit) ## Вызывается при изменении состояния связи + signal command_done(unit) ## Вызывается после успешного выполнения команды. + signal command_fail(unit) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. + signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных + signal data_received(data: PackedByteArray) ## Вызывается по приёму данных - var tx_data: = PackedByteArray() ## Буфер для отправки. - var tx_len: int = 0 ## Длина последнего отправленного пакета. - var tx_tick: int = 0 ## Тик-время отправки буфера - var rx_tick: int = 0 ## Тик-время последнего приёма данных - var online: bool = false ## Состояние подключения устройства - var name: String = '<без имени>' ## Уникальное имя устройства - func _init(nm) -> void: self.name = nm - func _to_string() -> String: return String('устройство: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) + var tx_data: = PackedByteArray() ## Буфер для отправки. + var tx_len: int = 0 ## Длина последнего отправленного пакета. + var tx_tick: int = 0 ## Тик-время отправки буфера + var rx_tick: int = 0 ## Тик-время последнего приёма данных + var online: bool = false ## Состояние подключения устройства + var name: String = '<без имени>' ## Уникальное имя устройства + func _init(nm) -> void: self.name = nm + func _to_string() -> String: return String('устройство: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) From 0d135a30d49432560b63b9cc4673eb35e281a692 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 13 Dec 2024 11:50:43 +0300 Subject: [PATCH 03/24] =?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=9F=D1=80=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B1=D0=BE=D1=80=D0=B5=20=D0=BF=D1=80=D0=B8=D0=BD=D1=83?= =?UTF-8?q?=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D1=85.=20=D0=9A=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D0=B8=20=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BA=D0=B8=D1=80=D1=83=D1=8E=D1=82=D1=81=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/работа/работа.gd | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index f64907a..24aa57c 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -153,7 +153,7 @@ func _ready(): signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes)) signaller.connect('interfer_new', Callable(self, 'on_interfer_new')) signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all')) - signaller.connect('interfer_prenuditelno', Callable(self, 'on_interfer_prenuditelno')) + signaller.connect('interfer_prenuditelno', Callable(self, 'on_interfer_prenuditelno').bind(nodes)) signaller.connect('fs_selected', Callable(self, 'on_fs_selected')) signaller.connect('fs_update_color', Callable(self, 'on_fs_update_color')) interfer.connect('interfer_update', Callable(self, 'on_interfer_new')) @@ -504,10 +504,13 @@ func on_fs_update_color(ecms): set_fs_color(ecm) update_fs_colors() -func on_interfer_prenuditelno (prenuditelno_sectors): +func on_interfer_prenuditelno (prenuditelno_sectors, btns): for key in prenuditelno_sectors: var sectors = [] for sector in prenuditelno_sectors[key]: sectors.append(get_fs_param(sector)) signaller.emit_signal('interfer_init', key, sectors) update_fs_colors() + for btn in btns: + btn.set_pressed(false) + set_btns_disabled(true, btn) From 6808306527c809ae78ff464219306f461a32ca91 Mon Sep 17 00:00:00 2001 From: danil_tim Date: Fri, 13 Dec 2024 13:57:27 +0300 Subject: [PATCH 04/24] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81=20=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D0=B1=D0=BE=D0=BB=D0=B0=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=B5=20=D0=A3=D0=A4=20?= =?UTF-8?q?=D0=B8=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81=205=D0=BF-28?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uf/pribor_uf.gd | 11 +++-------- scripts/settings.gd | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/scenes/pribor-uf/pribor_uf.gd b/scenes/pribor-uf/pribor_uf.gd index 005b2b1..a8765bf 100644 --- a/scenes/pribor-uf/pribor_uf.gd +++ b/scenes/pribor-uf/pribor_uf.gd @@ -8,7 +8,7 @@ enum STATE_VAL { var timer = Timer.new() var DEV_LIST = ['00:1f.6', '07:00.0', '08:00.0', '0b:00.0'] -var USB_TRACKERBALL = '046d:c31c' +var USB_TRACKERBALL = '13ba:0018' var REVFF = '(rev ff)' @@ -20,17 +20,12 @@ func _ready() -> void: var unit_5p28 = network.units[unit_key_5p28] self.add_child(timer) - timer.connect('timeout', Callable(self, 'on_timer').bind(unit_uf, unit_5p28)) + timer.connect('timeout', Callable(self, 'on_timer').bind(unit_uf)) timer.start(1) -func on_timer(unit_uf, unit_5p28): +func on_timer(unit_uf): Control_VK() # проверка трекбола и pci - if unit_5p28.online: # проверка внешнего коммутатора - $ref_uf/ref_bu1/ref_A13_MKEG.state = STATE_VAL.GOOD - else: - $ref_uf/ref_bu1/ref_A13_MKEG.state = STATE_VAL.NONE - if unit_uf.online: # проверка ЯУ, внутреннего коммутатора и ИП-5Б $ref_uf/ref_kassetav13/ref_A7_YAU07.state = STATE_VAL.GOOD $ref_uf/ref_kassetav13/ref_A3_IP5B.state = STATE_VAL.GOOD diff --git a/scripts/settings.gd b/scripts/settings.gd index 08525b8..a790255 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -23,7 +23,7 @@ class_name rep_settings extends Node 'уарэп-яу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', '192.168.3.109', [50000], 'IP-адрес комплекса 5П-28'], # Название: [ Протокол, Адрес, [ Порт получения, Порт отправки], ??, ??, Комментарий 'уарэп-щ3': ['udp-json-mbcs', '127.0.0.1', [48000, 44100], false, true, 'IP-адрес и порты через которые производят обмен сообщения с драйвером клиента Modbus Serial'], From 5263412e7e65b7b0639dc93769d50ccfa8fc0eb1 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Fri, 13 Dec 2024 15:11:12 +0300 Subject: [PATCH 05/24] =?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=9D=D0=B0=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D1=85=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D1=8B=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D1=83=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-ecm-list/frm-ecm-list.gd | 7 ++++--- scenes/frame-ecm-list/scroll-ecm-list.gd | 1 + scenes/работа/работа.gd | 26 ++++++++++++++++-------- scripts/interfer.gd | 7 +++---- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/scenes/frame-ecm-list/frm-ecm-list.gd b/scenes/frame-ecm-list/frm-ecm-list.gd index 9b4f806..ee1ba69 100644 --- a/scenes/frame-ecm-list/frm-ecm-list.gd +++ b/scenes/frame-ecm-list/frm-ecm-list.gd @@ -2,12 +2,13 @@ class_name frm_ecm_list extends NinePatchRect const srn_sectors: Dictionary = { - 'srni1': [4, 5, 6, 7, 8, 9, 10, 11] } + 'srni1': [12, 13, 14, 15, 16, 17, 18, 19] } const jtids_sectors: Dictionary = { - 'svi1': [12, 13, 14, 15, 16, 17, 18, 19] } + 'svi1': [4, 5, 6, 7, 8, 9, 10, 11] } -const kupd_sectors: Dictionary = {} +const kupd_sectors: Dictionary = { + 'lchm1': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27] } const panika_sectors: Dictionary = { 'lchm1': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27], diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index 31a203e..0988435 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -126,6 +126,7 @@ func on_interfer_off(ecm, ecms, thrs, table_index): rehash(table_index) ecms.erase(ecm.ispp) thrs.erase(ecm.ispp) + interfer.push_id(ecm.ispp) ## Перестраивает индекс таблицы. Вызывать при удалении строки diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 678f990..16ebd0f 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -64,13 +64,21 @@ const fs_sectors: Dictionary = { 1: [270.0, 360.0] } const fs_freq: Dictionary = { - 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] } + #0: [390.0, 510.0, 200.0, 250.0], + #1: [800.0, 1065.0, 250.0, 300.0], + #2: [1065.0, 1210.0, 300.0, 350.0], + #3: [1150.0, 1280.0, 350.0, 400.0], + #4: [1490.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] + 0: [390.0, 510.0, 200.0, 250.0, 433.0], + 1: [800.0, 1065.0, 250.0, 300.0, 860.0], + 2: [1065.0, 1210.0, 300.0, 350.0, 1137.0], + 3: [1150.0, 1280.0, 350.0, 400.0, 1227.0], + 4: [1490.0, 2000.0, 400.0, 450.0, 1575.0], + 5: [2000.0, 3500.0, 450.0, 500.0, 2450.0], + 6: [3500.0, 6000.0, 500.0, 550.0, 5800.0] + } ## Размеры карты для разных режимов РТО и РЛС соответственно @@ -461,8 +469,9 @@ func set_ecm_btns_state(value: bool): set_btns_disabled(value, btn) + func get_fs_param(index: int) -> Array: - var freq = (fs_freq[index / 4][0] + fs_freq[index / 4][1])/2 + var freq = (fs_freq[index / 4][4]) var sector = (fs_sectors[index % 4][0] + fs_sectors[index % 4][1])/2 - 45.0 if sector < 0: sector += 360.0 @@ -508,6 +517,7 @@ func on_fs_update_color(ecms): set_fs_color(ecm) update_fs_colors() + func on_interfer_prenuditelno (prenuditelno_sectors): for key in prenuditelno_sectors: var sectors = [] diff --git a/scripts/interfer.gd b/scripts/interfer.gd index cb11762..8ac8d4f 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -229,11 +229,12 @@ func on_interfer_rcv(interfer_params: Array, unit, ecms): func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer): + print_debug(ecms) var ispp: int = 0 if interfer_name == 'k1': param['dur'] = 1.0 # Необходимо добавить параметры управления param['period'] = 1.0 # Необходимо добавить параметры управления - var key = dict.find_key(id) + var key = ecms.find_key(id) if source_interfer != SOURCE_INTERFER[2]: if key != null: ispp = key @@ -243,6 +244,7 @@ func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer) ispp = pop_id() if ispp == 0: return else: ispp = id + print_debug(id_array) dict[ispp] = id msg_ss += 1 var ecm: Interfer @@ -262,7 +264,6 @@ func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer) signaller.emit_signal('interfer_new', ecm) if interfer_name == 'off': signaller.emit_signal('interfer_off', ecm, ecms, thrs) - push_id(ecm.ispp) thrs.erase(ispp) ecm.tick_tx = Time.get_ticks_msec() @@ -275,7 +276,6 @@ func send_ecm(ecm, unit): func on_interfer_off_all(unit, ecms): for ecm in ecms.values(): ecm.krp = INTERFER_OFF - push_id(ecm.ispp) send_ecm(ecm, unit) signaller.emit_signal('interfer_off',ecm, ecms, thrs) @@ -285,7 +285,6 @@ func on_threats_lost(th, ecms, unit): 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) From 8c32e3691c0e8f0a3598f0c22bc3828d94d721c5 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 13 Dec 2024 15:50:45 +0300 Subject: [PATCH 06/24] =?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=D1=8B=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=20id=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D0=B8.=20=D0=A7?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20=D1=81=D0=BB=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=80=D0=B5=D0=B9=20=D1=81=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-ecm-list/scroll-ecm-list.gd | 2 ++ scripts/interfer.gd | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index c4f6683..c84dd9a 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -126,6 +126,8 @@ func on_interfer_off(ecm, ecms, thrs, table_index): rehash(table_index) ecms.erase(ecm.ispp) thrs.erase(ecm.ispp) + interfer.cu.erase(ecm.ispp) + interfer.fs.erase(ecm.ispp) interfer.push_id(ecm.ispp) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 8ac8d4f..3149ee2 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -229,12 +229,11 @@ func on_interfer_rcv(interfer_params: Array, unit, ecms): func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer): - print_debug(ecms) var ispp: int = 0 if interfer_name == 'k1': param['dur'] = 1.0 # Необходимо добавить параметры управления param['period'] = 1.0 # Необходимо добавить параметры управления - var key = ecms.find_key(id) + var key = dict.find_key(id) if source_interfer != SOURCE_INTERFER[2]: if key != null: ispp = key @@ -244,7 +243,6 @@ func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer) ispp = pop_id() if ispp == 0: return else: ispp = id - print_debug(id_array) dict[ispp] = id msg_ss += 1 var ecm: Interfer From 2d5598ea1b0ee72b3bd77c3c21df3428f16ce42a Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Mon, 23 Dec 2024 09:18:31 +0300 Subject: [PATCH 07/24] =?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=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=AD=D0=9C=D0=A1-?= =?UTF-8?q?=D0=93.=20=D0=9F=D1=80=D0=B8=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B0=20=D1=81=D0=B2=D1=8F=D0=B7=D1=8C=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B6=D0=B0=D0=B5=D1=82=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=B2=20=D1=8F?= =?UTF-8?q?=D1=87=D0=B5=D0=B9=D0=BA=D0=B8=20=D0=AD=D0=9C=D0=A1-=D0=93.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 2 ++ scenes/frame-ecm-list/frm-ecm-list.gd | 2 +- scenes/работа/работа.gd | 3 ++- scenes/эмс/эмс.gd | 2 +- scripts/settings.gd | 26 +++++++++++++------------- scripts/yau07.gd | 17 +++++++++++++++++ scripts/yems-boards.gd | 27 ++++++++++++++++++++------- scripts/yems-consts.gd | 19 +++++++++++++++++++ 8 files changed, 75 insertions(+), 23 deletions(-) diff --git a/project.godot b/project.godot index 48801b2..1cd41bc 100644 --- a/project.godot +++ b/project.godot @@ -38,6 +38,7 @@ config/unit_rr_left_bort="http://127.0.0.1:8080/reports/left_SelfTestReport.json config/unit_rr_right_bort="http://127.0.0.1:8080/reports/right_SelfTestReport.json" config/unit_rr_request_period=5.0 config/kems_files_path="user://kems/" +config/emsg_files_path="user://emsg/" [autoload] @@ -55,6 +56,7 @@ threats="*res://scripts/threats.gd" yemsdevs="*res://scripts/yems-devs.gd" yemsboards="*res://scripts/yems-boards.gd" yemsconsts="*res://scripts/yems-consts.gd" +yemsg="*res://scripts/yems-g.gd" interfer="*res://scripts/interfer.gd" hotkeys="*res://scripts/hotkeys.gd" mercator="*res://scripts/mercator.gd" diff --git a/scenes/frame-ecm-list/frm-ecm-list.gd b/scenes/frame-ecm-list/frm-ecm-list.gd index ee1ba69..e77ccff 100644 --- a/scenes/frame-ecm-list/frm-ecm-list.gd +++ b/scenes/frame-ecm-list/frm-ecm-list.gd @@ -26,7 +26,7 @@ func on_btn_cancel_pressed(btn, nodes): signaller.emit_signal('interfer_off_all') await get_tree().create_timer(0.1).timeout btn.pressed = false - nodes.any(func(btn): btn.pressed = false) + nodes.any(func(btn_node): btn_node.pressed = false) func on_btn_pressed(btn_this, btn_others): diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 9c417b9..751c430 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -175,7 +175,7 @@ func map_threat_to_bip(th: threats.Threat, bip: Control): 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 + 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 @@ -502,6 +502,7 @@ func set_btns_disabled(value: bool, btn): else: btn.set_disabled(value) + func on_fs_update_color(ecms): fs_active.clear() for ecm in ecms.values(): diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index 97259ad..5878e92 100644 --- a/scenes/эмс/эмс.gd +++ b/scenes/эмс/эмс.gd @@ -133,7 +133,7 @@ func on_btn_flash_write(btn): func init_tbl_files(): check_dir() $scrl_files/tbl_files.set_header([TableHeader, TableHeader, TableHeader]) - $scrl_files/tbl_files.set_header_text(['Имя файла', 'Дата изменения', 'Размер']) + $scrl_files/tbl_files.set_header_text(['Имя файла', 'Размер', 'Дата изменения']) $scrl_files/tbl_files.set_columns_min_size([200, 120, 70]) tools.fill_files_table($scrl_files/tbl_files, yemsconsts.files_folder, FILES_ROWS_TYPES) $scrl_files/tbl_files.set_columns_alignments(yemsconsts.FILES_ROWS_ALIGNMENT) diff --git a/scripts/settings.gd b/scripts/settings.gd index 08525b8..6fbfdb9 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -5,22 +5,22 @@ class_name rep_settings extends Node @export var UnitProfiles: = { \ # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий - 'уарэп-яу07-частный': ['yau07rx', '10.1.1.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], + 'уарэп-яу07-частный': ['yau07rx', '10.1.1.5', [50005], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], 'уарэп-яу07-общий': ['yau07rx', '*', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'], 'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'], 'уарэп-эмс': ['yau07tx', '10.1.1.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'], - 'уарэп-яу07-2в': ['yau07tx', '10.1.1.34', [50034], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-2н': ['yau07tx', '10.1.1.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-2к': ['yau07tx', '10.1.1.35', [50035], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-4в': ['yau07tx', '10.1.1.66', [50066], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-4н': ['yau07tx', '10.1.1.65', [50065], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-4к': ['yau07tx', '10.1.1.67', [50067], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-1в': ['yau07tx', '10.1.1.18', [50018], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-1н': ['yau07tx', '10.1.1.17', [50017], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-1к': ['yau07tx', '10.1.1.19', [50019], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-3в': ['yau07tx', '10.1.1.50', [50050], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', [50049], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', [50051], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-2в': ['yau07tx', '10.1.1.22', [50022], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-2н': ['yau07tx', '10.1.1.21', [50021], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-2к': ['yau07tx', '10.1.1.23', [50023], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-4в': ['yau07tx', '10.1.1.42', [50042], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-4н': ['yau07tx', '10.1.1.41', [50041], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-4к': ['yau07tx', '10.1.1.43', [50043], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-1в': ['yau07tx', '10.1.1.12', [50012], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-1н': ['yau07tx', '10.1.1.11', [50011], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-1к': ['yau07tx', '10.1.1.13', [50013], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-3в': ['yau07tx', '10.1.1.32', [50032], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-3н': ['yau07tx', '10.1.1.31', [50031], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-3к': ['yau07tx', '10.1.1.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], # Название: [ Протокол, Адрес, Порт получения, Комментарий ] 'уарэп-5п28': [ '5p28', '127.0.0.1', [50000], 'IP-адрес комплекса 5П-28'], diff --git a/scripts/yau07.gd b/scripts/yau07.gd index 45b7a31..a4175ae 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -24,6 +24,7 @@ class YaU07 extends unit.Unit: WRITE_FLASH_MP550 = 55, ## Код команды "записать данные из FLASH в КЭМС" ячейки ЯУ-07 WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07 READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07 + LOAD_EMG_DONE = 70, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07 } var cmd_num_rx: = 0 ## Номер команды принятый @@ -171,6 +172,22 @@ class YaU07 extends unit.Unit: cmd_state = CmdState.SEND cmd_code_tx = cmd_code return true + + func send_other(cmd_code: int): + if (cmd_state == CmdState.WAIT) \ + or (cmd_state == CmdState.SEND) \ + or (cmd_state == CmdState.UNCK): + return false + if not (cmd_code == CmdCode.LOAD_EMG_DONE): + return false + cmd_num_tx = (cmd_num_rx + 1) % 0xffff + tx_data.encode_u16(0, cmd_retry) + tx_data.encode_u16(2, cmd_num_tx) + tx_data.encode_u8(6, cmd_code) + tx_len = 7 + cmd_state = CmdState.SEND + cmd_code_tx = cmd_code + ## Возвращает код команды ЯУ-07. ## rx_data - Принятые данные. ## Возвращает - Код команды не найден, 0...255 - код команды. diff --git a/scripts/yems-boards.gd b/scripts/yems-boards.gd index 958b939..b72794a 100644 --- a/scripts/yems-boards.gd +++ b/scripts/yems-boards.gd @@ -2,7 +2,7 @@ class_name yems_boards extends Node class EmsBoard: enum {WAIT, WR_DEV_NUM_W, WRITE, WR_DEV_NUM_R, READ, READ_FLASH, WRITE_FLASH, - WRITE_FLASH_BEGIN, LOAD_KEMS, WRITE_FLASH_END} ## Состояния платы + WRITE_FLASH_BEGIN, LOAD_KEMS, WRITE_FLASH_END, LOAD_FAIL} ## Состояния платы var id_board: int ## id платы var in_devs: Dictionary ## Словарь с входными устройствами. @@ -25,9 +25,11 @@ class EmsBoard: var need_flash_rd: bool = false ## Флаг, что надо прочитать флеш var need_flash_wr: bool = false ## Флаг, что надо записать данные в флеш var need_write: bool = false ## Флаг, что надо записать данные в ячейку ЭМС + var ems_g_fn: String = '' ## Имя файла настроек ЭМС-Г - signal upd_delay_offset(board, cur_dev) ## Согнал о обновлении данных задержек + signal upd_delay_offset(board, cur_dev) ## Сигнал о обновлении данных задержек signal upd_o_state(board, cur_dev) ## Сигнал о обновлении данных режима выходов + signal load_done(board) ## Сигнал о окончании загрузки данных в ячейку func _init(id, base_addr, in_table, out_table, u): id_board = id @@ -41,11 +43,19 @@ class EmsBoard: ## Устанавливает состояние входов и выходов платы func set_status(status): - var offset = yemsconsts.STATUS_OFFSET[id_board] - var bit_online = 0 + id_board - var bit_load = 3 + id_board - online = (status[0] >> bit_online) & 1 - ems_load = (status[0] >> bit_load) & 1 + var offset = 0 + if id_board < 3: + offset = yemsconsts.STATUS_OFFSET[id_board] + var bit_online = 0 + id_board + var bit_load = 3 + id_board + online = (status[0] >> bit_online) & 1 + ems_load = (status[0] >> bit_load) & 1 + else: + online = status[0] & 1 + var bit_load = 4 + ems_load = (status[0] >> bit_load) & 1 + if not online: + need_write = true var in_blank = int(status[1 + offset] | (status[2 + offset] << 8) | (status[3 + offset] << 16) | \ (status[4 + offset] << 24) | (status[5 + offset] << 32)) var in_imp = int(status[7 + offset] | (status[8 + offset] << 8) | (status[9 + offset] << 16) | \ @@ -271,3 +281,6 @@ class EmsBoard: else: continue if ports.has('%d'%(base_addr_isa + 10)): cur_dev.ports_data[base_addr_isa + 10] = int(ports['%d'%(base_addr_isa + 10)]) + + func set_load_done(): + unit_ems.send_other(unit_ems.CmdCode.LOAD_EMG_DONE) diff --git a/scripts/yems-consts.gd b/scripts/yems-consts.gd index 2f2014b..e37934b 100644 --- a/scripts/yems-consts.gd +++ b/scripts/yems-consts.gd @@ -1,12 +1,15 @@ class_name yerms_consts extends Node var files_folder = ProjectSettings.get_setting('application/config/kems_files_path', 'user://kems/') # Папка с файлами вариантами настроек ЭМС +var emsg_files_folder = ProjectSettings.get_setting('application/config/emsg_files_path', 'user://emsg/') # Папка с файлами вариантами настроек ЭМС var FILES_ROWS_ALIGNMENT = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER ] var FILES_COLUMN_WIDTHS = [ 90, 150, 150 ] const NUM_INPUT = 38 ## Количество входных устройств const NUM_OUTPUT = 38 ## Количество выходных устройств +const NUM_INPUT_G = 16 ## Количество входных устройств для ЭМС-Г +const NUM_OUTPUT_G = 16 ## Количество выходных устройств для ЭМС-Г const NUM_BYTE_FROM_FLASH = 760 ## Количество байт для запись в flash const STATUS_OFFSET = { ## Смещение статуса, ключ id платы 0: 0, @@ -32,6 +35,22 @@ const FILES_NAME = ['Вариант 1', 'Вариант 5', ] +## Первый элемент - имя юнита, второй - имя файла настроек +const EMS_G_BOARDS = [ + ['уарэп-яу07-2в','ЭМС-Г-В2'], + ['уарэп-яу07-2н','ЭМС-Г-Н2'], + ['уарэп-яу07-2к','ЭМС-Г-К2'], + ['уарэп-яу07-4в','ЭМС-Г-В4'], + ['уарэп-яу07-4н','ЭМС-Г-Н4'], + ['уарэп-яу07-4к','ЭМС-Г-К4'], + ['уарэп-яу07-1в','ЭМС-Г-В1'], + ['уарэп-яу07-1н','ЭМС-Г-Н1'], + ['уарэп-яу07-1к','ЭМС-Г-К1'], + ['уарэп-яу07-3в','ЭМС-Г-В3'], + ['уарэп-яу07-3н','ЭМС-Г-Н3'], + ['уарэп-яу07-3к','ЭМС-Г-К4'],] + + ## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС. const INPUT_KEMS = [ [1 ,['УИЗП №1', 'Х7', '0.00', '0.00']], From 14b1553bbb16b6398bcad655ebeb3752c52719d7 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Mon, 23 Dec 2024 09:18:36 +0300 Subject: [PATCH 08/24] =?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=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=AD=D0=9C=D0=A1-?= =?UTF-8?q?=D0=93.=20=D0=9F=D1=80=D0=B8=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B0=20=D1=81=D0=B2=D1=8F=D0=B7=D1=8C=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B6=D0=B0=D0=B5=D1=82=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=B2=20=D1=8F?= =?UTF-8?q?=D1=87=D0=B5=D0=B9=D0=BA=D0=B8=20=D0=AD=D0=9C=D0=A1-=D0=93.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/yems-g.gd | 79 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 scripts/yems-g.gd diff --git a/scripts/yems-g.gd b/scripts/yems-g.gd new file mode 100644 index 0000000..d5bced0 --- /dev/null +++ b/scripts/yems-g.gd @@ -0,0 +1,79 @@ +extends Node + +var ems_board: Dictionary = {} + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + check_dir() + var in_tbl: Array = [] + var out_tbl: Array = [] + for j in yemsconsts.NUM_INPUT_G: + in_tbl.append([j+1]) + out_tbl.append([j+yemsconsts.STATUS_OUT_OFFSET]) + for i in len(yemsconsts.EMS_G_BOARDS): + var unit_key = settings.get_unit_key(yemsconsts.EMS_G_BOARDS[i][0]) + var unit_ems = network.units[unit_key] + var ems_g: yemsboards.EmsBoard = yemsboards.EmsBoard.new(i+3, 0x120, in_tbl, out_tbl, unit_ems) + ems_board[i+3] = [ems_g, unit_ems] + ems_g.ems_g_fn = yemsconsts.EMS_G_BOARDS[i][1] + var params = ['','',0.0, 0,0] + for item in ems_g.in_tbl: + var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, 0, 0x120) + ems_g.in_devs[in_dev.id] = in_dev + for item in ems_g.out_tbl: + var out_dev = yemsdevs.OutDev.new(item[0], params, 0, 0x120) + ems_g.out_devs[out_dev.id] = out_dev + ems_g.need_write = true + unit_ems.connect('data_received', Callable(self, 'on_data_ems_received').bind(ems_g)) + unit_ems.connect('command_done', Callable(self, 'on_command_done').bind(ems_g)) + unit_ems.connect('line_changed', Callable(self, 'on_line_changed').bind(ems_g)) + + +func on_line_changed(unit_ems, board): + if not unit_ems.online: + board.ems_load = false + board.state_board = board.WAIT + board.state_cmd = board.WAIT + board.need_write = true + + +func on_data_ems_received(unit_ems, board): + board.set_status(unit_ems.status) + if board.state_board == board.WAIT and board.state_cmd == board.WAIT: + if board.online: + if board.need_write: + start_load(board) + elif not board.ems_load: + board.set_load_done() + else: + board.need_write = true + + +func on_command_done(unit_ems, board): + board.on_command_done(unit_ems) + + +func start_load(board): + var file = FileAccess.open(yemsconsts.emsg_files_folder + board.ems_g_fn, FileAccess.READ) + if file == null: + board.state_board = board.LOAD_FAIL + return + var read = file.get_as_text() + file.close() + var json_conv: = JSON.new() + if Error.OK == json_conv.parse(read): + var json_data = json_conv.get_data() + board.btn_load(json_data) + board.state_board = board.WRITE + board.start_rw_kems(false) + else: + board.state_board = board.LOAD_FAIL + + +## Проверяет ниличие директории, если их нет, создаёт +func check_dir(): + var dir = DirAccess.open(yemsconsts.emsg_files_folder) + if dir: + return + else: + DirAccess.make_dir_absolute(yemsconsts.emsg_files_folder) From cd1c1cda95975f9334f8c0c8cc0e5a5e981c9119 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Mon, 23 Dec 2024 16:20:57 +0300 Subject: [PATCH 09/24] =?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=A7=D0=B8=D1=81=D1=82=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uf/pribor_uf.gd | 3 -- scenes/контроль/кассета.gd | 12 +++--- scenes/контроль/кнопка-прибора.gd | 8 ++-- scenes/контроль/элемент-в.tscn | 62 +++++++++++++++---------------- scripts/unit.gd | 42 ++++++++++----------- 5 files changed, 62 insertions(+), 65 deletions(-) diff --git a/scenes/pribor-uf/pribor_uf.gd b/scenes/pribor-uf/pribor_uf.gd index a8765bf..c210701 100644 --- a/scenes/pribor-uf/pribor_uf.gd +++ b/scenes/pribor-uf/pribor_uf.gd @@ -16,9 +16,6 @@ func _ready() -> void: var unit_key = settings.get_unit_key('уарэп-эмс') var unit_uf = network.units[unit_key] - var unit_key_5p28 = settings.get_unit_key('уарэп-5п28') - var unit_5p28 = network.units[unit_key_5p28] - self.add_child(timer) timer.connect('timeout', Callable(self, 'on_timer').bind(unit_uf)) timer.start(1) diff --git a/scenes/контроль/кассета.gd b/scenes/контроль/кассета.gd index 26eed3d..a91fc7a 100644 --- a/scenes/контроль/кассета.gd +++ b/scenes/контроль/кассета.gd @@ -7,12 +7,12 @@ extends NinePatchRect """ @export var fname: String: - set(v): - fname = v - if is_inside_tree(): - $lbl_fname.text = v + set(v): + fname = v + if is_inside_tree(): + $lbl_fname.text = v @export var rname: String: - set(v): - rname = v + set(v): + rname = v diff --git a/scenes/контроль/кнопка-прибора.gd b/scenes/контроль/кнопка-прибора.gd index e0f2369..4575a6c 100644 --- a/scenes/контроль/кнопка-прибора.gd +++ b/scenes/контроль/кнопка-прибора.gd @@ -7,7 +7,7 @@ extends Node func _on_toggled(toggled_on): $frame.visible = toggled_on @export var state: int: - set(v): - v = 0 if v < 0 else v % state_colors.size() - state = v - $label.self_modulate = state_colors[v] + set(v): + v = 0 if v < 0 else v % state_colors.size() + state = v + $label.self_modulate = state_colors[v] diff --git a/scenes/контроль/элемент-в.tscn b/scenes/контроль/элемент-в.tscn index 5e4e961..9c8c4ca 100644 --- a/scenes/контроль/элемент-в.tscn +++ b/scenes/контроль/элемент-в.tscn @@ -18,55 +18,55 @@ extends Control @export var self_size: Vector2i = Vector2i(50, 150): - set(v): - self_size = v - size = v - $np_rect.size = v - _resize_children() - get: return size + set(v): + self_size = v + size = v + $np_rect.size = v + _resize_children() + get: return size @export var fname: String: - set(v): - fname = v - $lbl_fname.text = v + set(v): + fname = v + $lbl_fname.text = v @export var rname: String: - set(v): - rname = v - $lbl_rname.text = v + set(v): + rname = v + $lbl_rname.text = v func _resize_children() -> void: - $lbl_rname.size.x = size.x - $lbl_rname.position.y = margins[0] - $lbl_fname.size.y = size.x - $lbl_fname.position.y = size.y / 2 + $lbl_fname.size.x / 2 - $txr_state.position.x = size.x / 2 - ($txr_state.size.x * $txr_state.scale.x) / 2 - $txr_state.position.y = size.y - $txr_state.size.y * $txr_state.scale.x - margins[2] + $lbl_rname.size.x = size.x + $lbl_rname.position.y = margins[0] + $lbl_fname.size.y = size.x + $lbl_fname.position.y = size.y / 2 + $lbl_fname.size.x / 2 + $txr_state.position.x = size.x / 2 - ($txr_state.size.x * $txr_state.scale.x) / 2 + $txr_state.position.y = size.y - $txr_state.size.y * $txr_state.scale.x - margins[2] func _on_nine_patch_rect_resized() -> void: - size = $np_rect.size - self_size = $np_rect.size - _resize_children() + size = $np_rect.size + self_size = $np_rect.size + _resize_children() func _on_resized() -> void: - $np_rect.size = size - self_size = size - _resize_children() + $np_rect.size = size + self_size = size + _resize_children() @export var state: int: - set(v): - v = 0 if v < 0 else v - v %= textures.size() - state = v - $txr_state.texture = textures[v] - get: - return state + set(v): + v = 0 if v < 0 else v + v %= textures.size() + state = v + $txr_state.texture = textures[v] + get: + return state " [node name="yelement_v" type="Control"] diff --git a/scripts/unit.gd b/scripts/unit.gd index e920fd6..5209cc9 100644 --- a/scripts/unit.gd +++ b/scripts/unit.gd @@ -3,26 +3,26 @@ class_name base_unit extends Node ## Базовый класс для управления подключаемыми устройствами class Unit extends Object: - ## Состояние автомата выполнения команды. - enum CmdState { - UNCK, ## Номер команды не ининциирован. - SEND, ## Буфер готов для отправки. - WAIT, ## Ожидание выполнения. - DONE, ## Команда выполнена. - FAIL ## Команда не выполнена. - } + ## Состояние автомата выполнения команды. + enum CmdState { + UNCK, ## Номер команды не ининциирован. + SEND, ## Буфер готов для отправки. + WAIT, ## Ожидание выполнения. + DONE, ## Команда выполнена. + FAIL ## Команда не выполнена. + } - signal line_changed(unit) ## Вызывается при изменении состояния связи - signal command_done(unit) ## Вызывается после успешного выполнения команды. - signal command_fail(unit) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. - signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных - signal data_received(data: PackedByteArray) ## Вызывается по приёму данных + signal line_changed(unit) ## Вызывается при изменении состояния связи + signal command_done(unit) ## Вызывается после успешного выполнения команды. + signal command_fail(unit) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. + signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных + signal data_received(data: PackedByteArray) ## Вызывается по приёму данных - var tx_data: = PackedByteArray() ## Буфер для отправки. - var tx_len: int = 0 ## Длина последнего отправленного пакета. - var tx_tick: int = 0 ## Тик-время отправки буфера - var rx_tick: int = 0 ## Тик-время последнего приёма данных - var online: bool = false ## Состояние подключения устройства - var name: String = '<без имени>' ## Уникальное имя устройства - func _init(nm) -> void: self.name = nm - func _to_string() -> String: return String('устройство: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) + var tx_data: = PackedByteArray() ## Буфер для отправки. + var tx_len: int = 0 ## Длина последнего отправленного пакета. + var tx_tick: int = 0 ## Тик-время отправки буфера + var rx_tick: int = 0 ## Тик-время последнего приёма данных + var online: bool = false ## Состояние подключения устройства + var name: String = '<без имени>' ## Уникальное имя устройства + func _init(nm) -> void: self.name = nm + func _to_string() -> String: return String('устройство: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) From fa4463e56f7d6c07f503c95ba38c1479609e0324 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 25 Dec 2024 08:54:28 +0300 Subject: [PATCH 10/24] =?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=9A=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=20=D0=BA=D0=B0=D1=81=D1=81=D0=B5=D1=82=D1=8B=20?= =?UTF-8?q?=D0=A35=20=D0=B8=D0=B7=20=D1=81=D0=BE=D1=81=D1=82=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=D0=B1=D0=BE=D1=80=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=9F=D0=A0=D0=94.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.tscn | 4 ++- scenes/pribor-prd-n/pribor-prd-n.tscn | 4 ++- scenes/pribor-prd-v/pribor-prd-v.tscn | 4 ++- scenes/контроль/кассета_у_5.gd | 44 +++++++++++++++++++++++++++ scenes/контроль/контроль.gd | 8 +++-- scenes/контроль/контроль.tscn | 12 ++++++++ scripts/yems-g.gd | 2 +- 7 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 scenes/контроль/кассета_у_5.gd diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index 00c58b4..975c71f 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=10 format=3 uid="uid://m5s87q7m66lj"] +[gd_scene load_steps=11 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="Script" path="res://scenes/контроль/кассета_у_5.gd" id="3_wip3a"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="6_fmhtx"] [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"] @@ -25,6 +26,7 @@ offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 +script = ExtResource("3_wip3a") fname = "Кассета У5" [node name="lbl_header" type="Label" parent="."] diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index f9d1bcd..b60b310 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=8 format=3 uid="uid://dnuexoef2nnv5"] +[gd_scene load_steps=9 format=3 uid="uid://dnuexoef2nnv5"] [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="Script" path="res://scenes/контроль/кассета_у_5.gd" id="5_hne5j"] [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"] @@ -94,6 +95,7 @@ offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 +script = ExtResource("5_hne5j") fname = "Кассета У5" [node name="kasseta_FS_ND" type="NinePatchRect" parent="."] diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 75b2c6a..1017bd2 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=9 format=3 uid="uid://cvskpe1ti3p45"] +[gd_scene load_steps=10 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="Script" path="res://scenes/контроль/кассета_у_5.gd" id="5_6p5qb"] [ext_resource type="PackedScene" uid="uid://cd5sue1e8iyrv" path="res://scenes/pribor-prd-n/kasseta-fs-nd.tscn" id="5_nhd2k"] [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"] @@ -95,6 +96,7 @@ offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 +script = ExtResource("5_6p5qb") fname = "Кассета У5" [node name="kasseta_FS_VD" parent="." instance=ExtResource("5_nhd2k")] diff --git a/scenes/контроль/кассета_у_5.gd b/scenes/контроль/кассета_у_5.gd new file mode 100644 index 0000000..a8a76d8 --- /dev/null +++ b/scenes/контроль/кассета_у_5.gd @@ -0,0 +1,44 @@ +extends "res://scenes/контроль/кассета.gd" + +enum STATE_VAL { + NONE = 0, + GOOD = 1, + ERROR = 2 } + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + var unit_key = settings.get_unit_key(get_parent().get_meta('unit_name')) + var unit_prd = network.units[unit_key] + unit_prd.connect('data_received', Callable(self, 'on_data_received')) + unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) + set_default_state() + + +func set_default_state(): + $ref_A37.state = STATE_VAL.ERROR + $ref_A31.state = STATE_VAL.NONE + $ref_A33.state = STATE_VAL.NONE + $ref_A34.state = STATE_VAL.NONE + $ref_A35.state = STATE_VAL.NONE + $ref_A36.state = STATE_VAL.NONE + + +func on_line_changed(unit_prd): + if not unit_prd.online: + set_default_state() + + +func on_data_received(unit_prd): + $ref_A37.state = STATE_VAL.GOOD + var ems_online = unit_prd.status[0] & 1 + var bit_load = 4 + var ems_load = (unit_prd.status[0] >> bit_load) & 1 + var ug_online = (unit_prd.status[0] >> 1) & 1 + $ref_A33.state = STATE_VAL.GOOD if ems_online and ems_load else STATE_VAL.ERROR + $ref_A34.state = STATE_VAL.GOOD if ug_online else STATE_VAL.ERROR + $ref_A35.state = STATE_VAL.GOOD if (unit_prd.status[0] >> 2) & 1 else STATE_VAL.ERROR + $ref_A36.state = STATE_VAL.GOOD if (unit_prd.status[0] >> 3) & 1 else STATE_VAL.ERROR + if ug_online: + $ref_A31.state = STATE_VAL.GOOD if (unit_prd.status[27] >> 7) & 1 else STATE_VAL.ERROR + else: + $ref_A31.state = STATE_VAL.NONE diff --git a/scenes/контроль/контроль.gd b/scenes/контроль/контроль.gd index 86e2969..e1255bb 100644 --- a/scenes/контроль/контроль.gd +++ b/scenes/контроль/контроль.gd @@ -34,11 +34,11 @@ func _ready(): var pribor_path = PRIBORS_RES[k][0] var header_text = PRIBORS_RES[k][1] pribor_node.set_button_group(group) - pribor_node.connect('button_down', Callable(self, 'on_pribor_press').bind(pribor_path, header_text)) + pribor_node.connect('button_down', Callable(self, 'on_pribor_press').bind(pribor_path, header_text, pribor_node)) log.info('Модуль контроля работы готов') -func on_pribor_press(pribor_path, header_text): +func on_pribor_press(pribor_path, header_text, pribor_node): clear_obj($mnemo_container) var pribor_obj = load(pribor_path) if not pribor_obj: @@ -49,6 +49,10 @@ func on_pribor_press(pribor_path, header_text): push_error('экземпляр не создан: \"%s\" (%s)' % [pribor_path, header_text]) return pribor.set_header_text(header_text) + var meta_list = pribor_node.get_meta_list() + if meta_list.find('unit_name') > -1: + var unit_name = pribor_node.get_meta('unit_name') + pribor.set_meta('unit_name', unit_name) $mnemo_container.add_child(pribor) diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 021ad6b..a42ffaf 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -246,6 +246,7 @@ texture_normal = ExtResource("6_i1yfn") stretch_mode = 4 script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-2в" [node name="label" type="Label" parent="pribor_prd_v_2"] layout_mode = 0 @@ -286,6 +287,7 @@ texture_normal = ExtResource("6_i1yfn") stretch_mode = 4 script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-2н" [node name="label" type="Label" parent="pribor_prd_n_2"] layout_mode = 0 @@ -328,6 +330,7 @@ texture_normal = ExtResource("6_i1yfn") stretch_mode = 4 script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-2к" [node name="label" type="Label" parent="pribor_prd_k_2"] layout_mode = 0 @@ -369,6 +372,7 @@ stretch_mode = 4 flip_h = true script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-3в" [node name="label" type="Label" parent="pribor_prd_v_3"] layout_mode = 0 @@ -411,6 +415,7 @@ stretch_mode = 4 flip_h = true script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-3н" [node name="label" type="Label" parent="pribor_prd_n_3"] layout_mode = 0 @@ -452,6 +457,7 @@ stretch_mode = 4 flip_h = true script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-3к" [node name="label" type="Label" parent="pribor_prd_k_3"] layout_mode = 0 @@ -494,6 +500,7 @@ stretch_mode = 4 flip_h = true script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-1в" [node name="label" type="Label" parent="pribor_prd_v_1"] layout_mode = 0 @@ -535,6 +542,7 @@ stretch_mode = 4 flip_h = true script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-1н" [node name="label" type="Label" parent="pribor_prd_n_1"] layout_mode = 0 @@ -576,6 +584,7 @@ stretch_mode = 4 flip_h = true script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-1к" [node name="label" type="Label" parent="pribor_prd_k_1"] layout_mode = 0 @@ -616,6 +625,7 @@ texture_normal = ExtResource("6_i1yfn") stretch_mode = 4 script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-4в" [node name="label" type="Label" parent="pribor_prd_v_4"] layout_mode = 0 @@ -657,6 +667,7 @@ texture_normal = ExtResource("6_i1yfn") stretch_mode = 4 script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-4н" [node name="label" type="Label" parent="pribor_prd_n_4"] layout_mode = 0 @@ -697,6 +708,7 @@ texture_normal = ExtResource("6_i1yfn") stretch_mode = 4 script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +metadata/unit_name = "уарэп-яу07-4к" [node name="label" type="Label" parent="pribor_prd_k_4"] layout_mode = 0 diff --git a/scripts/yems-g.gd b/scripts/yems-g.gd index d5bced0..94e9c18 100644 --- a/scripts/yems-g.gd +++ b/scripts/yems-g.gd @@ -30,7 +30,7 @@ func _ready() -> void: func on_line_changed(unit_ems, board): - if not unit_ems.online: + if not unit_ems.online: board.ems_load = false board.state_board = board.WAIT board.state_cmd = board.WAIT From 3666453afc91fa3c474944086bb08ceca2146e86 Mon Sep 17 00:00:00 2001 From: danil_tim Date: Thu, 26 Dec 2024 07:18:27 +0300 Subject: [PATCH 11/24] =?UTF-8?q?=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE=20=D0=A3-=D0=AD=D0=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uf/pribor-uf.tscn | 13 ++----------- scenes/pribor-uyep/pribor-uyep.tscn | 2 +- scenes/контроль/контроль.gd | 2 +- scenes/контроль/контроль.tscn | 2 +- scenes/контроль/элемент-я.tscn | 2 -- scripts/settings.gd | 2 +- 6 files changed, 6 insertions(+), 17 deletions(-) diff --git a/scenes/pribor-uf/pribor-uf.tscn b/scenes/pribor-uf/pribor-uf.tscn index f06a78d..d4765ea 100644 --- a/scenes/pribor-uf/pribor-uf.tscn +++ b/scenes/pribor-uf/pribor-uf.tscn @@ -33,21 +33,12 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="ref_A13_MKEG" parent="ref_uf/ref_bu1" instance=ExtResource("3_dp78y")] -offset_left = 7.0 -offset_top = 60.0 -offset_right = 59.0 -offset_bottom = 322.0 -self_size = Vector2i(52, 262) -fname = "MKEG/C" -rname = "A13" - [node name="ref_A8_BU" parent="ref_uf/ref_bu1" instance=ExtResource("3_dp78y")] -offset_left = 59.0 +offset_left = 8.0 offset_top = 60.0 offset_right = 302.0 offset_bottom = 322.0 -self_size = Vector2i(243, 262) +self_size = Vector2i(294, 262) fname = "ВК-110" rname = "A8" diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index fb829cc..23a76c0 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -34,7 +34,7 @@ offset_top = 275.0 offset_right = 655.0 offset_bottom = 301.0 theme_override_font_sizes/font_size = 22 -text = "Контроль исправности прибора УЭП" +text = "Контроль исправности устройства У-ЭП" horizontal_alignment = 1 vertical_alignment = 1 diff --git a/scenes/контроль/контроль.gd b/scenes/контроль/контроль.gd index 86e2969..dba5d09 100644 --- a/scenes/контроль/контроль.gd +++ b/scenes/контроль/контроль.gd @@ -22,7 +22,7 @@ const PRIBORS_RES = \ 'pribor_prd_v_4': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 4'], 'pribor_rtr': ['res://scenes/pribor-rtr/pribor-rtr.tscn', 'Контроль исправности прибора РТР'], 'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'], - 'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности прибора УЭП'], + 'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности устройства У-ЭП'], } diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 021ad6b..368a7d8 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -212,7 +212,7 @@ offset_left = 29.8566 offset_top = -21.3276 offset_right = 69.8566 offset_bottom = -2.32759 -text = "УЭП" +text = "У-ЭП" horizontal_alignment = 1 vertical_alignment = 1 diff --git a/scenes/контроль/элемент-я.tscn b/scenes/контроль/элемент-я.tscn index 8303e5a..4ba2c86 100644 --- a/scenes/контроль/элемент-я.tscn +++ b/scenes/контроль/элемент-я.tscn @@ -29,8 +29,6 @@ func _enter_tree() -> void: vals[2] = get_theme_constant('margin_bottom') vals[3] = get_theme_constant('margin_right') return vals - - " [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_evx06"] diff --git a/scripts/settings.gd b/scripts/settings.gd index 99f64ba..95f1299 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -5,7 +5,7 @@ class_name rep_settings extends Node @export var UnitProfiles: = { \ # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий - 'уарэп-яу07-частный': ['yau07rx', '10.1.1.5', [50005], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], + 'уарэп-яу07-частный': ['yau07rx', '10.1.1.14', [50014], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], 'уарэп-яу07-общий': ['yau07rx', '*', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'], 'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'], 'уарэп-эмс': ['yau07tx', '10.1.1.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'], From 781bb50d6f0ad6850416651c6babb2cabda6c2a8 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Thu, 26 Dec 2024 10:17:26 +0300 Subject: [PATCH 12/24] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BB=D1=8F=20=D0=BF=D1=80=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=20=D0=9F=D0=A0=D0=94-=D0=92.=20=D0=9F=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0=BE=D0=B5=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BE=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=A9?= =?UTF-8?q?3=20=D0=B8=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-prd-v/pribor-prd-v.tscn | 4 +-- scenes/pribor-prd-v/pribor_prd_v.gd | 49 +++++++++++++++++++++++++++ scenes/pribor-uyep/pribor-uyep.tscn | 10 +++--- 3 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 scenes/pribor-prd-v/pribor_prd_v.gd diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 1017bd2..a7998bf 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=10 format=3 uid="uid://cvskpe1ti3p45"] -[ext_resource type="Script" path="res://scenes/контроль/прибор.gd" id="1_dl7rt"] +[ext_resource type="Script" path="res://scenes/pribor-prd-v/pribor_prd_v.gd" id="1_c20s6"] [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"] @@ -17,7 +17,7 @@ offset_left = 15.0 offset_top = 30.0 offset_right = 15.0 offset_bottom = 30.0 -script = ExtResource("1_dl7rt") +script = ExtResource("1_c20s6") [node name="maa2000_A22" parent="." instance=ExtResource("2_xpo4b")] layout_mode = 2 diff --git a/scenes/pribor-prd-v/pribor_prd_v.gd b/scenes/pribor-prd-v/pribor_prd_v.gd new file mode 100644 index 0000000..2205437 --- /dev/null +++ b/scenes/pribor-prd-v/pribor_prd_v.gd @@ -0,0 +1,49 @@ +extends "res://scenes/контроль/прибор.gd" + +enum STATE_VAL { + NONE = 0, + GOOD = 1, + ERROR = 2 } + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')) + var unit_prd = network.units[unit_key] + unit_prd.connect('data_received', Callable(self, 'on_data_received')) + unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) + set_default_state() + + +func set_default_state(): + $um1535_A7.state = STATE_VAL.NONE + $um1535_A8.state = STATE_VAL.NONE + $um1535_A9.state = STATE_VAL.NONE + $um1535_A10.state = STATE_VAL.NONE + $um1535_A11.state = STATE_VAL.NONE + $um1535_A12.state = STATE_VAL.NONE + $um1535_A13.state = STATE_VAL.NONE + $um1535_A14.state = STATE_VAL.NONE + $um1535_A15.state = STATE_VAL.NONE + $um1535_A16.state = STATE_VAL.NONE + $um1535_A17.state = STATE_VAL.NONE + $um1535_A18.state = STATE_VAL.NONE + + +func on_line_changed(unit_prd): + if not unit_prd.online: + set_default_state() + + +func on_data_received(unit_prd): + var ukp1_online = (unit_prd.status[0] >> 2) & 1 + var ukp2_online = (unit_prd.status[0] >> 3) & 1 + var ug_online = (unit_prd.status[0] >> 1) & 1 + if ug_online: + pass + else: + pass + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index fb829cc..3c1d0fa 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -57,8 +57,8 @@ offset_right = 328.0 offset_bottom = 749.0 script = ExtResource("4_v0lil") unit_name = "уарэп-спт25-1" -fname = "СПТ-25-230-400" -rname = "A1" +fname = "СПТ-25-230-400-3" +rname = "G1" [node name="block_input1" parent="spt25_A1" instance=ExtResource("4_mrvir")] layout_mode = 0 @@ -91,8 +91,8 @@ offset_right = 643.0 offset_bottom = 749.0 script = ExtResource("4_v0lil") unit_name = "уарэп-спт25-2" -fname = "СПТ-25-230-400" -rname = "A2" +fname = "СПТ-25-230-400-3" +rname = "G2" [node name="block_input1" parent="spt25_A2" instance=ExtResource("4_mrvir")] layout_mode = 0 @@ -124,4 +124,4 @@ offset_right = 633.0 offset_bottom = 1059.0 unit_name = "уарэп-щ3" fname = "Щ3 (контроль и управление питанием)" -rname = "A3" +rname = "A1" From d96106a9dec497f6ec597f06efb8ffb6efe3e700 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Thu, 9 Jan 2025 11:33:01 +0300 Subject: [PATCH 13/24] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D0=BA=D0=B0.=20?= =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=5Fprocess=20=D0=B2=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=B5=20pribor=5Fprd=5Fv.gd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-v/pribor_prd_v.gd | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scenes/pribor-prd-v/pribor_prd_v.gd b/scenes/pribor-prd-v/pribor_prd_v.gd index 2205437..46cd360 100644 --- a/scenes/pribor-prd-v/pribor_prd_v.gd +++ b/scenes/pribor-prd-v/pribor_prd_v.gd @@ -42,8 +42,3 @@ func on_data_received(unit_prd): pass else: pass - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - pass From 8d644feb616ce6b0f8180bd69840da2aecd91cd1 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 10 Jan 2025 14:08:20 +0300 Subject: [PATCH 14/24] =?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=A0=D0=B0=D1=81=D0=BF=D0=B0=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=B2=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=82=D0=B5=20json.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scripts/settings.gd | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/project.godot b/project.godot index 1cd41bc..27a8a4e 100644 --- a/project.godot +++ b/project.godot @@ -39,6 +39,7 @@ config/unit_rr_right_bort="http://127.0.0.1:8080/reports/right_SelfTestReport.js config/unit_rr_request_period=5.0 config/kems_files_path="user://kems/" config/emsg_files_path="user://emsg/" +config/settings_path="user://settings.json" [autoload] diff --git a/scripts/settings.gd b/scripts/settings.gd index 95f1299..8932b3d 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -3,6 +3,8 @@ class_name rep_settings extends Node ## Параметры. +var settings_file = ProjectSettings.get_setting('application/config/settings_path', 'user://settings.json') # Путь к файлу с настройками + @export var UnitProfiles: = { \ # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий 'уарэп-яу07-частный': ['yau07rx', '10.1.1.14', [50014], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], @@ -39,7 +41,23 @@ class_name rep_settings extends Node } -func _ready() -> void: log.info('Модуль настроек готов') +func _ready() -> void: + var file = FileAccess.open(settings_file, FileAccess.READ) + if file != null: + var read = file.get_as_text() + file.close() + var json_conv: = JSON.new() + if Error.OK == json_conv.parse(read): + var json_data = json_conv.get_data() + for key in UnitProfiles.keys(): + if json_data.has(key): + UnitProfiles[key][1] = json_data[key][0] + for i in len(json_data[key]) - 1: + if json_data[key][1][i+1].is_valid_int(): + UnitProfiles[key][2][i] = int(json_data[key][i+1]) + else: + UnitProfiles[key][2][i] = json_data[key][i+1] + log.info('Модуль настроек готов') ## Возвращает ключ устройства. From e7d6056799cffe937add3fa36ce7e2ddb1f0d7ab Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 10 Jan 2025 14:17:16 +0300 Subject: [PATCH 15/24] =?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=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=81=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=80=D1=8C=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=B8=D0=B7=20json.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/settings.gd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/settings.gd b/scripts/settings.gd index 8932b3d..35940e3 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -5,6 +5,8 @@ class_name rep_settings extends Node var settings_file = ProjectSettings.get_setting('application/config/settings_path', 'user://settings.json') # Путь к файлу с настройками +var settings_program: Dictionary + @export var UnitProfiles: = { \ # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий 'уарэп-яу07-частный': ['yau07rx', '10.1.1.14', [50014], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], @@ -49,6 +51,7 @@ func _ready() -> void: var json_conv: = JSON.new() if Error.OK == json_conv.parse(read): var json_data = json_conv.get_data() + settings_program.merge(json_data) for key in UnitProfiles.keys(): if json_data.has(key): UnitProfiles[key][1] = json_data[key][0] From 81662ac62a3a81675466d48abe99a17b3d582ad4 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Thu, 16 Jan 2025 11:25:08 +0300 Subject: [PATCH 16/24] =?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=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.gd | 76 +++----- scenes/настройки/настройки.tscn | 306 ++------------------------------ table/taggle.tscn | 16 +- 3 files changed, 49 insertions(+), 349 deletions(-) diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index 2385836..ad3f01a 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -10,8 +10,6 @@ var TableEmpti = preload('res://table/empti.tscn') ## Вызывается, когда узел впервые попадает в дерево сцены. func _ready() -> void: setting_tab() - dop_set_tab() - set_tab() $lbl_commit.text = ' \"%s\"' % commit.VCS_HEAD if not OS.get_cmdline_args().has('++ограниченный'): return @@ -30,54 +28,34 @@ func _on_external_cu_btn_pressed() -> void: 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.set_header_text(['Параметр', ' Значение ']) + for i in range(19): $table.add_row([TableLabel, TableTaggle]) + $table.set_row_text(0,(['Ограниченный режим'])) + $table.set_row_text(1,(['Управление элементами в ограниченном режиме'])) + $table.set_row_text(2,(['Кнопка «ПД-М4»'])) + $table.set_row_text(3,(['Кнопка «ПД-М2»'])) + $table.set_row_text(4,(['Кнопка «ОЗП-1»'])) + $table.set_row_text(5,(['Кнопка «МЧМ-1»'])) + $table.set_row_text(6,(['Кнопка «ОРН-И1»'])) + $table.set_row_text(7,(['Кнопка «ОРН-М2»'])) + $table.set_row_text(8,(['Кнопка «ЛЧМ-1»'])) + $table.set_row_text(9,(['Кнопка «ПД-М4С»'])) + $table.set_row_text(10,(['Кнопка «ПД-ЧМ»'])) + $table.set_row_text(11,(['Кнопка «СВ-И1»'])) + $table.set_row_text(12,(['Кнопка «К1»'])) + $table.set_row_text(13,(['Кнопка «СВ-М2»'])) + $table.set_row_text(14,(['Кнопка «ОРН»'])) + $table.set_row_text(15,(['Кнопка «JTIDS»'])) + $table.set_row_text(16,(['Кнопка «КУПД»'])) + $table.set_row_text(17,(['Внешнее целеуказание'])) + $table.set_row_text(18,(['Кнопка «Подавление»'])) - $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.add_row([TableLabel, TableEmpti]) + $table.add_row([TableLabel, TableEmpti]) - $table.set_columns_min_size([150, 100]) + $table.set_row_text(19, (['Текущая версия ПО УАРЭП'])) + $table.set_row_text(20, (['Адрес сервера карт'])) + + $table.set_columns_min_size([365, 365]) $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([TableEmpti, 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, (['Внешнее целеуказание.'])) - $table2.set_row_text(4, (['Кнопка «Подавление».\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 7cd0926..2f68588 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -17,250 +17,12 @@ func _on_text_changed(new_text: String) -> void: [node name="Настройки" type="Panel"] script = ExtResource("1_2l3rd") -[node name="GridContainer" type="GridContainer" parent="."] -visible = false -layout_mode = 0 -offset_left = 44.0 -offset_top = 87.0 -offset_right = 336.0 -offset_bottom = 193.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="."] -visible = false -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="."] -visible = false -layout_mode = 0 -offset_left = 20.0 -offset_top = 20.0 -offset_right = 445.0 -offset_bottom = 50.0 -text = "Текущий режим доступа: полный" -vertical_alignment = 1 - [node name="edt_mapaddr" type="LineEdit" parent="."] layout_mode = 0 -offset_left = 776.0 -offset_top = 48.0 -offset_right = 1148.0 -offset_bottom = 78.0 +offset_left = 410.0 +offset_top = 557.0 +offset_right = 778.0 +offset_bottom = 584.0 theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) script = SubResource("GDScript_anjmx") @@ -273,69 +35,21 @@ offset_bottom = 30.0 text = "Адрес сервера карт:" vertical_alignment = 1 -[node name="GridContainer2" type="GridContainer" parent="."] -visible = false -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 -disabled = true - [node name="lbl_commit" type="Label" parent="."] layout_mode = 0 -offset_left = 776.0 -offset_top = 24.0 -offset_right = 1144.0 -offset_bottom = 54.0 +offset_left = 410.0 +offset_top = 532.0 +offset_right = 778.0 +offset_bottom = 562.0 theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) vertical_alignment = 1 [node name="table" type="GridContainer" parent="."] layout_mode = 0 offset_left = 40.0 -offset_top = 88.0 +offset_top = 40.0 offset_right = 80.0 -offset_bottom = 128.0 -script = ExtResource("2_6sx73") - -[node name="table2" type="GridContainer" parent="."] -layout_mode = 0 -offset_left = 512.0 -offset_top = 32.0 -offset_right = 552.0 -offset_bottom = 72.0 -script = ExtResource("2_6sx73") - -[node name="table3" type="GridContainer" parent="."] -layout_mode = 0 -offset_left = 40.0 -offset_top = 32.0 -offset_right = 80.0 -offset_bottom = 72.0 +offset_bottom = 80.0 script = ExtResource("2_6sx73") [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/table/taggle.tscn b/table/taggle.tscn index 823de94..413d6ee 100644 --- a/table/taggle.tscn +++ b/table/taggle.tscn @@ -1,4 +1,6 @@ -[gd_scene format=3 uid="uid://dm7hh7ibuin78"] +[gd_scene load_steps=2 format=3 uid="uid://dm7hh7ibuin78"] + +[ext_resource type="PackedScene" uid="uid://dwphmxstaxn4v" path="res://table/lable.tscn" id="1_2wdrh"] [node name="Control" type="Control"] layout_mode = 3 @@ -6,8 +8,14 @@ anchors_preset = 0 offset_right = 96.0 offset_bottom = 24.0 +[node name="Lable" parent="." instance=ExtResource("1_2wdrh")] +layout_mode = 0 +offset_right = 368.0 +offset_bottom = 21.0 + [node name="CheckButton" type="CheckButton" parent="."] layout_mode = 0 -offset_left = 30.0 -offset_right = 74.0 -offset_bottom = 24.0 +offset_left = 161.0 +offset_top = -2.0 +offset_right = 205.0 +offset_bottom = 22.0 From e3b6df621c2bcbbc9f7f32ad862ef9f5ad50482a Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Mon, 20 Jan 2025 11:30:11 +0300 Subject: [PATCH 17/24] =?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=92=D1=81=D1=82=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=BB=D0=B0=20mod?= =?UTF-8?q?bus=20=D0=B4=D0=BB=D1=8F=20=D0=A93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/sch3-view.gd | 2 + scripts/network.gd | 53 +++++++++++- scripts/sch3.gd | 140 ++++++++++++++++++++------------ scripts/settings.gd | 6 +- 4 files changed, 142 insertions(+), 59 deletions(-) diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 0f9a586..b8d5acd 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -154,6 +154,8 @@ func on_resp_holding(base_addr: int, data: Array): ## [param base_addr] - Начальный адрес регистров.[br] ## [param data] - Массив значений прочитанных из регистров.[br] func on_resp_input(base_addr: int, data: Array): + if !is_inside_tree(): + return if (base_addr != base_input_address) or (data.size() < regs_input_count): return # "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..." diff --git a/scripts/network.gd b/scripts/network.gd index c14c04d..2053be9 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -1,9 +1,10 @@ class_name Network extends Node -const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'json-capsrpb': capsrpb.CapsRpb, 'udp-json-mbcs': sch3.Sch3} +const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'json-capsrpb': capsrpb.CapsRpb} const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} -const SERIAL_PROTO: = {'uart': spt25.SPT25 } +const SERIAL_PROTO: = {'uart': spt25.SPT25} +const MODBUS_PROTO: = {'mbcs': sch3.Sch3} var tick: int = 0 @@ -47,13 +48,26 @@ class SocketTCP extends TCPServer: peer.put_data(data) +class Modbus extends ModbusClientRtu: + func send_to(data): + if data['code'] == 'write': + var addr = data['data'].pop_at(0) + request_write(addr, data['data']) + elif data['code'] == 'read_holding': + request_read(data['data'][0], data['data'][1]) + elif data['code'] == 'read_input': + request_read_input(data['data'][0], data['data'][1]) + + 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 +var units_modbus: Dictionary +var serials: Dictionary # Последовательные порты +var mbcs: Dictionary # Клиенты modbus. var dst_ports: Dictionary var unit_keys: Dictionary var sock_unicast: Socket @@ -97,11 +111,23 @@ func create_serial(nm) -> Serial: return sp +func create_modbus(nm, mbc_unit) -> Modbus: + var port = settings.UnitProfiles[nm][1] + var baud = settings.UnitProfiles[nm][2] + var params = settings.UnitProfiles[nm][3] + var mbc: = Modbus.new() + mbc.connect('read', mbc_unit.on_read) + mbc.connect('read_input', mbc_unit.on_read_input) + mbc.connect('write', mbc_unit.on_write) + var _rc = mbc.open(port, params[0], baud[0], params[1], params[2], params[3]) + mbc.thread_run() + return mbc + + func _ready() -> void: poll_sockets.append(create_socket('уарэп-яу07-частный')) poll_sockets.append(create_socket('уарэп-яу07-общий')) poll_sockets.append(create_socket('уарэп-капсрпб')) - poll_sockets.append(create_socket('уарэп-щ3')) sock_unicast = poll_sockets[0] sock_capsrpb = poll_sockets[2] @@ -130,6 +156,19 @@ func _ready() -> void: unit_tcp.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) unit_tcp.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) + + if proto in MODBUS_PROTO: + var unit_modbus = MODBUS_PROTO[proto].new(unit_name) + var unit_key = settings.get_unit_key(unit_name) + if logger_page: + unit_modbus.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) + unit_modbus.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) + var mbc = create_modbus(unit_name, unit_modbus) + units_modbus[unit_key] = unit_modbus + units[unit_key] = unit_modbus + mbcs[unit_key] = mbc + + if proto in SERIAL_PROTO: var unit_serial = SERIAL_PROTO[proto].new(unit_name) var unit_key = settings.get_unit_key(unit_name) @@ -226,6 +265,12 @@ func _process(_delta: float) -> void: match unit_serial.process(tick): Error.OK: serial.send_to(unit_serial.tx_data) Error.FAILED: emit_signal('socket_error', [unit_serial, serial]) + for key in units_modbus: + var unit_modbus = units_modbus[key] + var mbc = mbcs[key] + match unit_modbus.process(tick): + Error.OK: mbc.send_to(unit_modbus.mb_data) + Error.FAILED: emit_signal('socket_error', [unit_modbus, mbc]) for sock_unit in tcp_sockets: var sock = sock_unit[0] var unit_tcp = sock_unit[1] diff --git a/scripts/sch3.gd b/scripts/sch3.gd index 56dbf8a..978edff 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -9,10 +9,11 @@ const REQUEST_PERIOD: int = 1000 ## Переиод запроса, мс ## Представление прибора Щ3 class Sch3 extends unit.Unit: - var mb_addr: = 0 ## Адрес устройства Modbus. - var cmd_state: = CmdState.DONE ## Состояние выполнения текущей команды. - var tick_rx: = 0 ## Время приёма крайнего сообщения. - var tick_tx: = 0 ## Время отправки крайнего сообщения. + var mb_addr: = 0 ## Адрес устройства Modbus. + var cmd_state: = CmdState.DONE ## Состояние выполнения текущей команды. + var tick_rx: = 0 ## Время приёма крайнего сообщения. + var tick_tx: = 0 ## Время отправки крайнего сообщения. + var mb_data: Dictionary = {} ## Буфер для записи в регистры модбас static var json_conv: = JSON.new() signal resp_input(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов. @@ -48,50 +49,43 @@ class Sch3 extends unit.Unit: ## Производит разбор принятых данных. Вызывать при приёме данных на сокете.[br] ## [param data] - Данные принятые на сокете.[br] ## [param tick] - Текущщее время в мс.[br] - func parse(data: PackedByteArray, tick: int) -> bool: + func parse(message: Dictionary, tick: int) -> bool: rx_tick = tick if not online: online = true emit_signal('line_changed', self) - var utf8_data = data.get_string_from_utf8() - if Error.OK == json_conv.parse(utf8_data): - emit_signal('data_received', data) - var message: Dictionary = json_conv.get_data() - if message.has('code') and message.has('data'): - var rc: = true - var message_code = message['code'] - var message_data = message['data'] - match message_code: - 'resp_holding', 'resp_input': - var addr = int(message_data[0]) - var regs = message_data.slice(1) - for i in regs.size(): - regs[i] = int(regs[i]) - emit_signal(message_code, addr, regs) - 'resp_write': - emit_signal(message_code) - 'info': - var msg = message['data'] - emit_signal('info_received', msg) - 'exception': - var msg = message['data'] - cmd_state = CmdState.FAIL - emit_signal('except_received', msg) - rc = false - _: - var msg: String = 'код команды \"%s\" - не распознан' % message_code - cmd_state = CmdState.FAIL - emit_signal('parse_failed', msg) - rc = false - if (cmd_state == CmdState.WAIT) and rc: - cmd_state = CmdState.DONE - emit_signal('command_done') - elif (cmd_state == CmdState.WAIT) and (not rc): + if message.has('code') and message.has('data'): + var rc: = true + var message_code = message['code'] + var message_data = message['data'] + match message_code: + 'resp_holding', 'resp_input': + var addr = int(message_data[0]) + var regs = message_data.slice(1) + for i in regs.size(): + regs[i] = int(regs[i]) + emit_signal(message_code, addr, regs) + 'resp_write': + emit_signal(message_code) + 'info': + var msg = message['data'] + emit_signal('info_received', msg) + 'exception': + var msg = message['data'] cmd_state = CmdState.FAIL - emit_signal('command_fail', self) - else: - var message = json_conv.get_error_message() - emit_signal('parse_failed', message) + emit_signal('except_received', msg) + rc = false + _: + var msg: String = 'код команды \"%s\" - не распознан' % message_code + cmd_state = CmdState.FAIL + emit_signal('parse_failed', msg) + rc = false + if (cmd_state == CmdState.WAIT) and rc: + cmd_state = CmdState.DONE + emit_signal('command_done') + elif (cmd_state == CmdState.WAIT) and (not rc): + cmd_state = CmdState.FAIL + emit_signal('command_fail', self) return true ## Отправляет команду "записать в регистры".[br] @@ -99,9 +93,7 @@ class Sch3 extends unit.Unit: ## [param count] - Данные для записи в регистры от начального адреса.[br] func write(addr: int, data: Array) -> bool: if cmd_state != CmdState.DONE: return false - var json_dict: = {'code': 'write', 'data': [addr] + data, 'unit': mb_addr} - tx_data = JSON.stringify(json_dict).to_utf8_buffer() - tx_len = len(tx_data) + mb_data = {'code': 'write', 'data': [addr] + data, 'unit': mb_addr} cmd_state = CmdState.SEND return true @@ -110,9 +102,7 @@ class Sch3 extends unit.Unit: ## [param count] - Количество регистров от начального адреса.[br] func read_holding(addr: int, count: int = 1) -> bool: if cmd_state != CmdState.DONE: return false - var json_dict: = {'code': 'read_holding', 'data': [addr, count], 'unit': mb_addr} - tx_data = JSON.stringify(json_dict).to_utf8_buffer() - tx_len = len(tx_data) + mb_data = {'code': 'read_holding', 'data': [addr, count], 'unit': mb_addr} cmd_state = CmdState.SEND return true @@ -121,8 +111,54 @@ class Sch3 extends unit.Unit: ## [param count] - Количество регистров от начального адреса.[br] func read_input(addr: int, count: int = 1) -> bool: if cmd_state != CmdState.DONE: return false - var json_dict: = {'code': 'read_input', 'data': [addr, count], 'unit': mb_addr} - tx_data = JSON.stringify(json_dict).to_utf8_buffer() - tx_len = len(tx_data) + mb_data = {'code': 'read_input', 'data': [addr, count], 'unit': mb_addr} cmd_state = CmdState.SEND return true + + + ## Принимает результат команды "читать регистры хранения".[br] + ## [param return_code] - Код выполнения команды.[br] + ## [param base_addr] - Начальный адрес регистров.[br] + ## [param data] - Данные прочитанные из регистров.[br] + ## [param tick] - Время приёма пакета.[br] + func on_read(return_code, base_addr, data): + var tick = Time.get_ticks_msec() + var msg: Dictionary + if return_code == 0: + msg['code'] = 'resp_holding' + msg['data'] = [base_addr] + data + else: + msg['code'] = 'exception' + parse(msg, tick) + + + ## Принимает результат команды "читать регистры входов".[br] + ## [param return_code] - Код выполнения команды.[br] + ## [param base_addr] - Начальный адрес регистров.[br] + ## [param data] - Данные прочитанные из регистров.[br] + ## [param tick] - Время приёма пакета.[br] + func on_read_input(return_code, base_addr, data): + var tick = Time.get_ticks_msec() + var msg: Dictionary + if return_code == 0: + msg['code'] = 'resp_input' + msg['data'] = [base_addr] + data + else: + msg['code'] = 'exception' + parse(msg, tick) + + + ## Принимает результат команды "записать в регистры".[br] + ## [param return_code] - Код выполнения команды.[br] + ## [param base_addr] - Начальный адрес регистров.[br] + ## [param data] - Данные прочитанные из регистров.[br] + ## [param tick] - Время приёма пакета.[br] + func on_write(return_code, _base_addr, data): + var tick = Time.get_ticks_msec() + var msg: Dictionary + msg['data'] = 'resp_write' + if return_code == 0: + msg['code'] = 'resp_write' + else: + msg['code'] = 'exception' + parse(msg, tick) diff --git a/scripts/settings.gd b/scripts/settings.gd index 35940e3..b2ea650 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -9,7 +9,7 @@ var settings_program: Dictionary @export var UnitProfiles: = { \ # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий - 'уарэп-яу07-частный': ['yau07rx', '10.1.1.14', [50014], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], + 'уарэп-яу07-частный': ['yau07rx', '10.1.1.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], 'уарэп-яу07-общий': ['yau07rx', '*', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'], 'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'], 'уарэп-эмс': ['yau07tx', '10.1.1.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'], @@ -29,8 +29,8 @@ var settings_program: Dictionary # Название: [ Протокол, Адрес, Порт получения, Комментарий ] 'уарэп-5п28': [ '5p28', '192.168.3.109', [50000], 'IP-адрес комплекса 5П-28'], - # Название: [ Протокол, Адрес, [ Порт получения, Порт отправки], ??, ??, Комментарий - 'уарэп-щ3': ['udp-json-mbcs', '127.0.0.1', [48000, 44100], false, true, 'IP-адрес и порты через которые производят обмен сообщения с драйвером клиента Modbus Serial'], + # Название: [ Протокол, Адрес, Скорость, ??, ??, Комментарий + 'уарэп-щ3': ['mbcs', '/home/sasha/dev/tty1', [19200], [3, 'N', 8, 1], 'Параметры клиента Modbus Serial'], # Название: [ Протокол, Имя порта, Скорость, Чётность, ??, Комментарий 'уарэп-спт25-1': ['uart', '/home/sasha/dev/tty0', [19200, false, false], 'Адрес прибора СПТ-25 (G1)'], From 8e6bdd9de4f5c7dab0e60b72782ebe0a214b6286 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Thu, 23 Jan 2025 13:47:04 +0300 Subject: [PATCH 18/24] =?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=D0=B8=D0=B5=20=D0=B2=D0=B8=D1=80=D1=82=D1=83=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=BB=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=B0=D1=82=D1=83=D1=80=D1=8B,=20=D1=81=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=20=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=AD=D0=9C=D0=A1=202.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scenes/tabs-switch/tab-switch.gd | 5 +++++ scenes/настройки/настройки.gd | 30 +++++++++++++++++++++++++----- scenes/настройки/настройки.tscn | 8 ++++---- scripts/astra_kb.gd | 15 +++++++++++++++ scripts/settings.gd | 2 +- scripts/signaller.gd | 10 +++++++++- 7 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 scripts/astra_kb.gd diff --git a/project.godot b/project.godot index 27a8a4e..524ef5a 100644 --- a/project.godot +++ b/project.godot @@ -64,6 +64,7 @@ mercator="*res://scripts/mercator.gd" tcp5p28="*res://scripts/tcp5p28.gd" sch3="*res://scripts/sch3.gd" spt25="*res://scripts/spt25.gd" +astrakb="*res://scripts/astra_kb.gd" [debug] diff --git a/scenes/tabs-switch/tab-switch.gd b/scenes/tabs-switch/tab-switch.gd index 864fecc..5580d6d 100644 --- a/scenes/tabs-switch/tab-switch.gd +++ b/scenes/tabs-switch/tab-switch.gd @@ -5,6 +5,11 @@ const TAB_TOSIGNAL_NAME = {0: 'режим_работа', 1: 'режим_конт func _enter_tree() -> void: network.logger_page = $Журнал + signaller.connect('ems2_hide_pressed', on_ems2_hide_pressed) + + +func on_ems2_hide_pressed(state): + set_tab_hidden(4, state) func _on_tab_changed(tab) -> void: diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index ad3f01a..ffe8911 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -18,18 +18,28 @@ func _ready() -> void: node.disabled = true -func _on_external_cu_btn_pressed() -> void: - var state = $GridContainer2/external_cu_btn.button_pressed +func on_external_cu_btn_pressed(btn) -> void: + var state = btn.button_pressed ProjectSettings.set_setting('application/config/external_cu', state) if state: signaller.emit_signal('interfer_off_all') +func on_vk_pressed(btn) -> void: + var state = btn.button_pressed + signaller.emit_signal('kb_pressed', state) + + +func on_ems2_pressed(btn) -> void: + var state = btn.button_pressed + signaller.emit_signal('ems2_hide_pressed', state) + + 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(19): + for i in range(21): $table.add_row([TableLabel, TableTaggle]) $table.set_row_text(0,(['Ограниченный режим'])) $table.set_row_text(1,(['Управление элементами в ограниченном режиме'])) @@ -49,13 +59,23 @@ func setting_tab(): $table.set_row_text(15,(['Кнопка «JTIDS»'])) $table.set_row_text(16,(['Кнопка «КУПД»'])) $table.set_row_text(17,(['Внешнее целеуказание'])) + var extern_cu_node = $table.get_node2(1, 17).get_children()[1] + extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) $table.set_row_text(18,(['Кнопка «Подавление»'])) + $table.set_row_text(19,(['Виртуальная клавиатура'])) + var vk_node = $table.get_node2(1, 19).get_children()[1] + vk_node.connect('pressed', on_vk_pressed.bind(vk_node)) + $table.set_row_text(20,(['Скрыть вкладку ЭМС 2'])) + var ems2_hide_node = $table.get_node2(1, 20).get_children()[1] + ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node)) + ems2_hide_node.set_pressed(true) + on_ems2_pressed(ems2_hide_node) $table.add_row([TableLabel, TableEmpti]) $table.add_row([TableLabel, TableEmpti]) - $table.set_row_text(19, (['Текущая версия ПО УАРЭП'])) - $table.set_row_text(20, (['Адрес сервера карт'])) + $table.set_row_text(21, (['Текущая версия ПО УАРЭП'])) + $table.set_row_text(22, (['Адрес сервера карт'])) $table.set_columns_min_size([365, 365]) $table.set_columns_alignments(yams) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 2f68588..98a1d8b 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -20,9 +20,9 @@ script = ExtResource("1_2l3rd") [node name="edt_mapaddr" type="LineEdit" parent="."] layout_mode = 0 offset_left = 410.0 -offset_top = 557.0 +offset_top = 612.0 offset_right = 778.0 -offset_bottom = 584.0 +offset_bottom = 639.0 theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) script = SubResource("GDScript_anjmx") @@ -38,9 +38,9 @@ vertical_alignment = 1 [node name="lbl_commit" type="Label" parent="."] layout_mode = 0 offset_left = 410.0 -offset_top = 532.0 +offset_top = 582.0 offset_right = 778.0 -offset_bottom = 562.0 +offset_bottom = 607.0 theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) vertical_alignment = 1 diff --git a/scripts/astra_kb.gd b/scripts/astra_kb.gd new file mode 100644 index 0000000..e523eab --- /dev/null +++ b/scripts/astra_kb.gd @@ -0,0 +1,15 @@ +extends Node + +var pid = null + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + signaller.connect('kb_pressed', Callable(self, 'on_kb_pressed')) + + +func on_kb_pressed(state): + if pid: + OS.kill(pid) + pid = null + if state: + pid = OS.create_process('fly-vkbd', []) diff --git a/scripts/settings.gd b/scripts/settings.gd index 35940e3..9b19193 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -9,7 +9,7 @@ var settings_program: Dictionary @export var UnitProfiles: = { \ # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий - 'уарэп-яу07-частный': ['yau07rx', '10.1.1.14', [50014], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], + 'уарэп-яу07-частный': ['yau07rx', '10.1.1.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], 'уарэп-яу07-общий': ['yau07rx', '*', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'], 'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'], 'уарэп-эмс': ['yau07tx', '10.1.1.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'], diff --git a/scripts/signaller.gd b/scripts/signaller.gd index f41b4a4..7cedf7b 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -145,9 +145,17 @@ signal map_mode_changed(mode: int) ## Вызывается при обновлении позиции(угла) цели.[br] signal th_aoa_update(threats: Dictionary) - ## <...>[br] ## [param ecms] - <...> signal fs_update_color(ecms: Dictionary) signal socket_error(error: String) + +## Вызывается при нажатии на кнопку экранной клавиатуры +## [param state] - состояние нажатого переключателя виртуальной клавиатуры астры +signal kb_pressed(state) + + +## Вызывается при нажатии на кнопку экранной клавиатуры +## [param state] - состояние скрытия кнопки ЭМС2 +signal ems2_hide_pressed(state) From c717ace9b5c424941c86eb35a49ef60f0e9a69eb Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 24 Jan 2025 11:17:57 +0300 Subject: [PATCH 19/24] =?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=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B1=D0=B0=D1=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.tscn | 8 ++++---- scripts/network.gd | 5 ++--- scripts/settings.gd | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 98a1d8b..697af11 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -20,9 +20,9 @@ script = ExtResource("1_2l3rd") [node name="edt_mapaddr" type="LineEdit" parent="."] layout_mode = 0 offset_left = 410.0 -offset_top = 612.0 +offset_top = 637.0 offset_right = 778.0 -offset_bottom = 639.0 +offset_bottom = 664.0 theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) script = SubResource("GDScript_anjmx") @@ -38,9 +38,9 @@ vertical_alignment = 1 [node name="lbl_commit" type="Label" parent="."] layout_mode = 0 offset_left = 410.0 -offset_top = 582.0 +offset_top = 607.0 offset_right = 778.0 -offset_bottom = 607.0 +offset_bottom = 632.0 theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) vertical_alignment = 1 diff --git a/scripts/network.gd b/scripts/network.gd index 2053be9..f42c7d1 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -113,13 +113,12 @@ func create_serial(nm) -> Serial: func create_modbus(nm, mbc_unit) -> Modbus: var port = settings.UnitProfiles[nm][1] - var baud = settings.UnitProfiles[nm][2] - var params = settings.UnitProfiles[nm][3] + var params = settings.UnitProfiles[nm][2] var mbc: = Modbus.new() mbc.connect('read', mbc_unit.on_read) mbc.connect('read_input', mbc_unit.on_read_input) mbc.connect('write', mbc_unit.on_write) - var _rc = mbc.open(port, params[0], baud[0], params[1], params[2], params[3]) + var _rc = mbc.open(port, params[1], params[0], params[2], params[3], params[4]) mbc.thread_run() return mbc diff --git a/scripts/settings.gd b/scripts/settings.gd index b2ea650..b53439f 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -30,7 +30,7 @@ var settings_program: Dictionary 'уарэп-5п28': [ '5p28', '192.168.3.109', [50000], 'IP-адрес комплекса 5П-28'], # Название: [ Протокол, Адрес, Скорость, ??, ??, Комментарий - 'уарэп-щ3': ['mbcs', '/home/sasha/dev/tty1', [19200], [3, 'N', 8, 1], 'Параметры клиента Modbus Serial'], + 'уарэп-щ3': ['mbcs', '/home/sasha/dev/tty1', [19200, 7, 'N', 8, 1], 'Параметры клиента Modbus Serial'], # Название: [ Протокол, Имя порта, Скорость, Чётность, ??, Комментарий 'уарэп-спт25-1': ['uart', '/home/sasha/dev/tty0', [19200, false, false], 'Адрес прибора СПТ-25 (G1)'], From f2a86ada3211797520e654ff491951aa77dc99a7 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 29 Jan 2025 08:50:45 +0300 Subject: [PATCH 20/24] =?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=D0=B1=D0=BC=D0=B5=D0=BD=20=D1=81?= =?UTF-8?q?=20=D0=A93,=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B5=D1=80=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F.=20=D0=92=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D0=B5=20=D0=A3=D0=A4=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=D0=B8=20=D0=BF=D0=B8=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F,=20=D0=BA=D0=B0=D0=BA=20=D0=B8=D0=BD=D0=B4=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=BE=D1=80=20=D0=BD=D0=B5=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D0=B1=D0=BE=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scenes/pribor-uf/pribor_uf.gd | 5 ++++- scenes/pribor-uyep/pribor-uyep.tscn | 11 ----------- scenes/pribor-uyep/sch3-view.gd | 15 +++++++++++++++ scenes/pribor-uyep/sch3.tscn | 2 +- scripts/network.gd | 10 ++++++++++ scripts/sch3.gd | 2 +- 7 files changed, 32 insertions(+), 14 deletions(-) diff --git a/project.godot b/project.godot index 524ef5a..a5bc886 100644 --- a/project.godot +++ b/project.godot @@ -85,6 +85,7 @@ gdscript/warnings/integer_division=0 window/size/viewport_width=1600 window/size/viewport_height=1200 +window/size/mode=3 window/subwindows/embed_subwindows=false window/stretch/mode="canvas_items" window/dpi/allow_hidpi=false diff --git a/scenes/pribor-uf/pribor_uf.gd b/scenes/pribor-uf/pribor_uf.gd index c210701..90f50f5 100644 --- a/scenes/pribor-uf/pribor_uf.gd +++ b/scenes/pribor-uf/pribor_uf.gd @@ -88,8 +88,11 @@ func status_uf() -> void: var status_kems:int = $ref_uf/ref_kassetav13/ref_A4_KEMS.state var status_ems0:int = $ref_uf/ref_kassetav13/ref_A5_EMS.state var status_ems1:int = $ref_uf/ref_kassetav13/ref_A6_EMS.state + var status_ip5:int = $ref_uf/ref_kassetav13/ref_A3_IP5B.state + var status_ip27:int = $ref_uf/ref_kassetav13/ref_A12_IP27B.state - if (status_yay == 1) and (status_bu == 1) and (status_kems == 1) and (status_ems0 == 1) and (status_ems1 == 1): + if (status_yay == 1) and (status_bu == 1) and (status_kems == 1) \ + and (status_ems0 == 1) and (status_ems1 == 1) and (status_ip5 == 1) and (status_ip27 == 1): $lbl_header2.text = "Прибор исправен" $lbl_header2.modulate = Color(0,1,0,1) else: diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index 6b923a2..c2484e7 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -38,17 +38,6 @@ 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 = 95.0 -offset_top = 1125.0 -offset_right = 625.0 -offset_bottom = 1144.0 -text = "** Позиционные обозначения требуют уточнения **" -horizontal_alignment = 1 -vertical_alignment = 1 - [node name="spt25_A1" parent="." instance=ExtResource("6_60xs3")] layout_mode = 0 offset_left = 88.0 diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index b8d5acd..b057192 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -14,6 +14,7 @@ extends 'res://scenes/контроль/элемент-я.gd' @export var regs_holding_count: = 4 ## Количество регистров хранения @export var modbus_address: = 3 ## Адрес устройства на шине Modbus @export var request_period: = 1.0 ## Период отправки команд на шину Modbus +@export var reconnect_period: = 5.0 ## Период переподключения var regs_input: = {} ## Регистры входные var regs_holding: = {} ## Регистры хранения @@ -23,6 +24,7 @@ var input_stack: = [] ## Стек команд для чтения регис var read_step: = 0 var switches_sync: = false var timer = Timer.new() +var timer_reconnect = Timer.new() class StackItem: @@ -59,6 +61,14 @@ func _on_timeout(unit_sch3) -> void: read_step %= 2 +func _on_timeout_recconect(unit_sch3): + var unit_key = settings.get_unit_key(unit_sch3.name) + var mbc = network.mbcs[unit_key] + mbc.try_reconnect() + var mb_data = {'code': 'read_holding', 'data': [0, 4], 'unit': 0} + mbc.send_to(mb_data) + + ## Вызывается при изменении состояния выключателя[br] ## [param val] - Состояние выключателя[br] ## [param meta] - Адреса регистров и индексы битов назначенных выключателю[br] @@ -99,11 +109,14 @@ func _ready() -> void: timer.connect('timeout', _on_timeout.bind(unit_sch3)) add_child(timer) timer.start(request_period) + timer_reconnect.connect('timeout', _on_timeout_recconect.bind(unit_sch3)) + add_child(timer_reconnect) func on_command_fail(unit_sch3): unit_sch3.cmd_state = unit.Unit.CmdState.DONE timer.stop() + timer_reconnect.start(reconnect_period) ## Вызывается, когда состояния прибора Щ3 "на связи" изменяется[br] @@ -124,8 +137,10 @@ func on_line_changed(unit_sch3: sch_3.Sch3): $margin/vbox/grid1/state_freq.texture = textures[STATE_VAL.NONE] $margin/vbox/grid/state.texture = textures[STATE_VAL.NONE] else: + timer_reconnect.stop() timer.start(request_period) + ## Вызывается по сигналу "приняты данные чтения регистров хранения"[br] ## [param base_addr] - Начальный адрес регистров.[br] ## [param data] - Массив значений прочитанных из регистров. diff --git a/scenes/pribor-uyep/sch3.tscn b/scenes/pribor-uyep/sch3.tscn index 2b29647..f2b3dd0 100644 --- a/scenes/pribor-uyep/sch3.tscn +++ b/scenes/pribor-uyep/sch3.tscn @@ -721,7 +721,7 @@ size_flags_vertical = 4 tooltip_text = "Индикатор допуска входного напряжения" texture = ExtResource("2_ln52a") expand_mode = 1 -metadata/bits = [0, 0, 2, 0] +metadata/bits = [0, 15, 4, 0] [node name="lbl0" type="Label" parent="margin/vbox/grid1"] self_modulate = Color(1, 1, 1, 0.627451) diff --git a/scripts/network.gd b/scripts/network.gd index f42c7d1..fd7fbda 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -49,6 +49,7 @@ class SocketTCP extends TCPServer: class Modbus extends ModbusClientRtu: + var unit_name func send_to(data): if data['code'] == 'write': var addr = data['data'].pop_at(0) @@ -58,6 +59,14 @@ class Modbus extends ModbusClientRtu: elif data['code'] == 'read_input': request_read_input(data['data'][0], data['data'][1]) + func try_reconnect(): + var port = settings.UnitProfiles[unit_name][1] + var params = settings.UnitProfiles[unit_name][2] + thread_stop() + close() + open(port, params[1], params[0], params[2], params[3], params[4]) + thread_run() + var poll_sockets: Array[Socket] var tcp_sockets: Array @@ -120,6 +129,7 @@ func create_modbus(nm, mbc_unit) -> Modbus: mbc.connect('write', mbc_unit.on_write) var _rc = mbc.open(port, params[1], params[0], params[2], params[3], params[4]) mbc.thread_run() + mbc.unit_name = nm return mbc diff --git a/scripts/sch3.gd b/scripts/sch3.gd index 978edff..788846a 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -51,7 +51,7 @@ class Sch3 extends unit.Unit: ## [param tick] - Текущщее время в мс.[br] func parse(message: Dictionary, tick: int) -> bool: rx_tick = tick - if not online: + if not online and (message['code'] != 'exception'): online = true emit_signal('line_changed', self) if message.has('code') and message.has('data'): From 187f29c1ddc4d0d0d57528e6ee5c0cd35e360de6 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 29 Jan 2025 13:57:07 +0300 Subject: [PATCH 21/24] =?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=D0=BF=D1=8B=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D0=B5=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=D0=BC=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=B4=D0=B8=D0=B0=D0=BF=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/работа/работа.gd | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 751c430..e53c15f 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -428,11 +428,14 @@ func sel_fs_sector(event): func set_fs_color(ecm): - var fs_index = get_fs_index(ecm) + var fs_index_arr: Array = [] + get_fs_index(ecm, fs_index_arr) if ecm.krp != interfer.INTERFER_OFF: - fs_active[fs_index] = null + for item in fs_index_arr: + fs_active[item] = null else: - fs_active.erase(fs_index) + for item in fs_index_arr: + fs_active.erase(item) update_fs_colors() @@ -471,15 +474,17 @@ func get_fs_param(index: int) -> Array: func on_fs_selected(ecm): - var fs_index = get_fs_index(ecm) + var fs_index_arr: Array = [] + get_fs_index(ecm, fs_index_arr) fs_selected.clear() - fs_selected[fs_index] = null + for item in fs_index_arr: + fs_selected[item] = null update_fs_colors() -func get_fs_index(ecm): +func get_fs_index(ecm, fs_index_arr): var sector: int - var band: int + var band: Array var angle: float = ecm.kni + 45.0 if angle > 360.0: angle -= 360.0 @@ -489,9 +494,10 @@ func get_fs_index(ecm): for diap in fs_freq.values(): if ecm.params.has('freq'): if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]: - band = fs_freq.find_key(diap) - var fs_index = band * 4 + sector - return fs_index + band.append(fs_freq.find_key(diap)) + for item in band: + fs_index_arr.append(item * 4 + sector) + func set_btns_disabled(value: bool, btn): From f66e6a7f35145357fc620059526d13a6e6bb4775 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Wed, 29 Jan 2025 14:08:09 +0300 Subject: [PATCH 22/24] =?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=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D1=83.=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA?= =?UTF-8?q?=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.gd | 74 +++++++++++++++++++-------------- scenes/настройки/настройки.tscn | 42 +------------------ 2 files changed, 43 insertions(+), 73 deletions(-) diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index ffe8911..4b9fc53 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -10,7 +10,6 @@ var TableEmpti = preload('res://table/empti.tscn') ## Вызывается, когда узел впервые попадает в дерево сцены. func _ready() -> void: setting_tab() - $lbl_commit.text = ' \"%s\"' % commit.VCS_HEAD if not OS.get_cmdline_args().has('++ограниченный'): return $Label2.text = 'Текущий режим доступа: ограниченный' @@ -20,7 +19,6 @@ func _ready() -> void: func on_external_cu_btn_pressed(btn) -> void: var state = btn.button_pressed - ProjectSettings.set_setting('application/config/external_cu', state) if state: signaller.emit_signal('interfer_off_all') @@ -33,32 +31,50 @@ func on_vk_pressed(btn) -> void: func on_ems2_pressed(btn) -> void: var state = btn.button_pressed signaller.emit_signal('ems2_hide_pressed', state) - + func setting_tab(): - var yams: Array = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER ] + var yams: Array = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] $table.set_header([TableHeader, TableHeader]) - $table.set_header_text(['Параметр', ' Значение ']) - for i in range(21): - $table.add_row([TableLabel, TableTaggle]) - $table.set_row_text(0,(['Ограниченный режим'])) - $table.set_row_text(1,(['Управление элементами в ограниченном режиме'])) - $table.set_row_text(2,(['Кнопка «ПД-М4»'])) - $table.set_row_text(3,(['Кнопка «ПД-М2»'])) - $table.set_row_text(4,(['Кнопка «ОЗП-1»'])) - $table.set_row_text(5,(['Кнопка «МЧМ-1»'])) - $table.set_row_text(6,(['Кнопка «ОРН-И1»'])) - $table.set_row_text(7,(['Кнопка «ОРН-М2»'])) - $table.set_row_text(8,(['Кнопка «ЛЧМ-1»'])) - $table.set_row_text(9,(['Кнопка «ПД-М4С»'])) - $table.set_row_text(10,(['Кнопка «ПД-ЧМ»'])) - $table.set_row_text(11,(['Кнопка «СВ-И1»'])) - $table.set_row_text(12,(['Кнопка «К1»'])) - $table.set_row_text(13,(['Кнопка «СВ-М2»'])) - $table.set_row_text(14,(['Кнопка «ОРН»'])) - $table.set_row_text(15,(['Кнопка «JTIDS»'])) - $table.set_row_text(16,(['Кнопка «КУПД»'])) - $table.set_row_text(17,(['Внешнее целеуказание'])) + $table.set_header_text(['Параметр', 'начение ']) + var row_texts: Array = ['Ограниченный режим', + 'Управление элементами в ограниченном режиме', + 'Кнопка «ПД-М4»', 'Кнопка «ПД-М2»', + 'Кнопка «ОЗП-1»', + 'Кнопка «МЧМ-1»', + 'Кнопка «ОРН-И1»', + 'Кнопка «ОРН-М2»', + 'Кнопка «ЛЧМ-1»', + 'Кнопка «ПД-М4С»', + 'Кнопка «ПД-ЧМ»', + 'Кнопка «СВ-И1»', + 'Кнопка «К1»', + 'Кнопка «СВ-М2»', + 'Кнопка «ОРН»', + 'Кнопка «JTIDS»', + 'Кнопка «КУПД»', + 'Внешнее целеуказание', + 'Кнопка «Подавление»', + 'Виртуальная клавиатура', + 'Скрыть вкладку ЭМС 2', + 'Текущая версия ПО УАРЭП', + 'Адрес сервера карт' ] + + for i in range(len(row_texts)): + if i < 21: + $table.add_row([TableLabel, TableTaggle]) + else: + if i == len(row_texts) - 2: + var commit_version = '%s"' % commit.VCS_HEAD + $table.add_row([TableLabel, TableLabel]) + $table.set_row_text(i, [row_texts[i], commit_version]) + elif i == len(row_texts) - 1: + $table.add_row([TableLabel, TableLabel]) + $table.set_row_text(i, [row_texts[i], ProjectSettings.get('application/config/map_server_addr')]) + else: + $table.add_row([TableLabel, TableEmpti]) + $table.set_row_text(i, [row_texts[i]]) + var extern_cu_node = $table.get_node2(1, 17).get_children()[1] extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) $table.set_row_text(18,(['Кнопка «Подавление»'])) @@ -70,12 +86,6 @@ func setting_tab(): ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node)) ems2_hide_node.set_pressed(true) on_ems2_pressed(ems2_hide_node) - - $table.add_row([TableLabel, TableEmpti]) - $table.add_row([TableLabel, TableEmpti]) - - $table.set_row_text(21, (['Текущая версия ПО УАРЭП'])) - $table.set_row_text(22, (['Адрес сервера карт'])) - + $table.set_columns_min_size([365, 365]) $table.set_columns_alignments(yams) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 697af11..d1b19ac 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -1,49 +1,11 @@ -[gd_scene load_steps=4 format=3 uid="uid://bnptm4rlp60dq"] +[gd_scene load_steps=3 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_6sx73"] -[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="edt_mapaddr" type="LineEdit" parent="."] -layout_mode = 0 -offset_left = 410.0 -offset_top = 637.0 -offset_right = 778.0 -offset_bottom = 664.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"] -visible = false -layout_mode = 0 -offset_left = -180.0 -offset_right = -20.0 -offset_bottom = 30.0 -text = "Адрес сервера карт:" -vertical_alignment = 1 - -[node name="lbl_commit" type="Label" parent="."] -layout_mode = 0 -offset_left = 410.0 -offset_top = 607.0 -offset_right = 778.0 -offset_bottom = 632.0 -theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) -vertical_alignment = 1 - [node name="table" type="GridContainer" parent="."] layout_mode = 0 offset_left = 40.0 @@ -51,5 +13,3 @@ offset_top = 40.0 offset_right = 80.0 offset_bottom = 80.0 script = ExtResource("2_6sx73") - -[connection signal="text_changed" from="edt_mapaddr" to="edt_mapaddr" method="_on_text_changed"] From 5c4b3cb508291e0c6a40ef973a86ee3c3b62bddb Mon Sep 17 00:00:00 2001 From: lepshiy Date: Wed, 29 Jan 2025 14:09:14 +0300 Subject: [PATCH 23/24] =?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=D0=BA=D1=80=D0=B0=D1=88=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=202-=D1=85=20=D1=81=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D1=81=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/работа/работа.gd | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index e53c15f..58a61ab 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -67,7 +67,7 @@ const fs_freq: Dictionary = { 0: [390.0, 510.0, 200.0, 250.0, 433.0], 1: [800.0, 1065.0, 250.0, 300.0, 860.0], 2: [1065.0, 1210.0, 300.0, 350.0, 1137.0], - 3: [1150.0, 1280.0, 350.0, 400.0, 1227.0], + 3: [1150.0, 1490.0, 350.0, 400.0, 1227.0], 4: [1490.0, 2000.0, 400.0, 450.0, 1575.0], 5: [2000.0, 3500.0, 450.0, 500.0, 2450.0], 6: [3500.0, 6000.0, 500.0, 550.0, 5800.0] @@ -499,7 +499,6 @@ func get_fs_index(ecm, fs_index_arr): fs_index_arr.append(item * 4 + sector) - func set_btns_disabled(value: bool, btn): var external_cu = ProjectSettings.get_setting('application/config/external_cu', false) if external_cu: From 9137845ac2ca155d41edb4beca376e1e7aac9e4f Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 3 Feb 2025 09:18:22 +0300 Subject: [PATCH 24/24] =?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/настройки/настройки.gd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index 4b9fc53..969fa17 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -31,7 +31,7 @@ func on_vk_pressed(btn) -> void: func on_ems2_pressed(btn) -> void: var state = btn.button_pressed signaller.emit_signal('ems2_hide_pressed', state) - + func setting_tab(): var yams: Array = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] @@ -74,7 +74,7 @@ func setting_tab(): else: $table.add_row([TableLabel, TableEmpti]) $table.set_row_text(i, [row_texts[i]]) - + var extern_cu_node = $table.get_node2(1, 17).get_children()[1] extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) $table.set_row_text(18,(['Кнопка «Подавление»'])) @@ -86,6 +86,6 @@ func setting_tab(): ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node)) ems2_hide_node.set_pressed(true) on_ems2_pressed(ems2_hide_node) - + $table.set_columns_min_size([365, 365]) $table.set_columns_alignments(yams)