From 9b0aab78a007195b0521aff97dfabcec8e237dc0 Mon Sep 17 00:00:00 2001 From: danil_tim Date: Thu, 5 Dec 2024 11:14:09 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=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 --- 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 2/3] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=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 6808306527c809ae78ff464219306f461a32ca91 Mon Sep 17 00:00:00 2001 From: danil_tim Date: Fri, 13 Dec 2024 13:57:27 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=B1=D0=BE=D0=BB=D0=B0=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=B5=20=D0=A3=D0=A4=20=D0=B8=20?= =?UTF-8?q?=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'],