diff --git a/project.godot b/project.godot index 930f296b..6d8ad5f9 100644 --- a/project.godot +++ b/project.godot @@ -38,6 +38,8 @@ 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/" +config/settings_path="user://settings.json" [autoload] @@ -55,12 +57,14 @@ 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" tcp5p28="*res://scripts/tcp5p28.gd" sch3="*res://scripts/sch3.gd" spt25="*res://scripts/spt25.gd" +astrakb="*res://scripts/astra_kb.gd" [debug] @@ -81,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" diff --git a/scenes/frame-ecm-list/frm-ecm-list.gd b/scenes/frame-ecm-list/frm-ecm-list.gd index 25dbf751..e77ccff9 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], @@ -25,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(b): b.pressed = false) + nodes.any(func(btn_node): btn_node.pressed = false) func on_btn_pressed(btn_this, btn_others): diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index 19b312d2..702e849a 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -126,6 +126,9 @@ 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/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index 00c58b4d..975c71f6 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 f9d1bcd8..b60b3107 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 75b2c6a3..a7998bfd 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="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"] +[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"] @@ -16,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 @@ -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/pribor-prd-v/pribor_prd_v.gd b/scenes/pribor-prd-v/pribor_prd_v.gd new file mode 100644 index 00000000..46cd360f --- /dev/null +++ b/scenes/pribor-prd-v/pribor_prd_v.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_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 diff --git a/scenes/pribor-uf/pribor-uf.tscn b/scenes/pribor-uf/pribor-uf.tscn index b3296bbc..d4765ea7 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,40 +23,24 @@ 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")] -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_A" parent="ref_uf/ref_bu1" instance=ExtResource("3_dp78y")] -offset_left = 59.0 +[node name="ref_A8_BU" parent="ref_uf/ref_bu1" instance=ExtResource("3_dp78y")] +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" - -[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 +52,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 +143,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 +152,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 new file mode 100644 index 00000000..90f50f5d --- /dev/null +++ b/scenes/pribor-uf/pribor_uf.gd @@ -0,0 +1,101 @@ +extends "res://scenes/контроль/прибор.gd" + +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 = '13ba:0018' +var REVFF = '(rev ff)' + + +func _ready() -> void: + var unit_key = settings.get_unit_key('уарэп-эмс') + var unit_uf = network.units[unit_key] + + self.add_child(timer) + timer.connect('timeout', Callable(self, 'on_timer').bind(unit_uf)) + timer.start(1) + + +func on_timer(unit_uf): + Control_VK() # проверка трекбола и pci + 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 + 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) and (status_ip5 == 1) and (status_ip27 == 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/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index fb829cc7..c2484e79 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -34,18 +34,7 @@ offset_top = 275.0 offset_right = 655.0 offset_bottom = 301.0 theme_override_font_sizes/font_size = 22 -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 = "** Позиционные обозначения требуют уточнения **" +text = "Контроль исправности устройства У-ЭП" horizontal_alignment = 1 vertical_alignment = 1 @@ -57,8 +46,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 +80,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 +113,4 @@ offset_right = 633.0 offset_bottom = 1059.0 unit_name = "уарэп-щ3" fname = "Щ3 (контроль и управление питанием)" -rname = "A3" +rname = "A1" diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 0f9a586c..b057192a 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] - Массив значений прочитанных из регистров. @@ -154,6 +169,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/scenes/pribor-uyep/sch3.tscn b/scenes/pribor-uyep/sch3.tscn index 2b296478..f2b3dd03 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/scenes/tabs-switch/tab-switch.gd b/scenes/tabs-switch/tab-switch.gd index 864fecc2..5580d6d8 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/контроль/кассета_у_5.gd b/scenes/контроль/кассета_у_5.gd new file mode 100644 index 00000000..a8a76d86 --- /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 86e29699..50548b3c 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', 'Контроль исправности устройства У-ЭП'], } @@ -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 021ad6bb..d7b96721 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 @@ -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/scenes/контроль/элемент-я.tscn b/scenes/контроль/элемент-я.tscn index 8303e5a6..4ba2c861 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/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index 23858367..969fa173 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -10,9 +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 $Label2.text = 'Текущий режим доступа: ограниченный' @@ -20,64 +17,75 @@ func _ready() -> void: node.disabled = true -func _on_external_cu_btn_pressed() -> void: - var state = $GridContainer2/external_cu_btn.button_pressed - ProjectSettings.set_setting('application/config/external_cu', state) +func on_external_cu_btn_pressed(btn) -> void: + var state = btn.button_pressed 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 ] + var yams: Array = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] $table.set_header([TableHeader, TableHeader]) - $table.set_header_text(['Элемент', ' Показывать ']) + $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(15): - $table.add_row([TableLabel, TableTaggle]) + 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]]) - $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,([' Кнопка «КУПД» '])) + 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.set_columns_min_size([150, 100]) + $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 7cd09264..d1b19ac6 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -1,341 +1,15 @@ -[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="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 -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="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 -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 +offset_bottom = 80.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 -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/scenes/работа/работа.gd b/scenes/работа/работа.gd index 9f259994..58a61abc 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -64,13 +64,14 @@ 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, 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, 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] + } ## Размеры карты для разных режимов РТО и РЛС соответственно const map_sizes = [ @@ -153,7 +154,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')) @@ -171,17 +172,18 @@ func get_all_nodes(root): func map_threat_to_bip(th: threats.Threat, bip: Control): var freq = th.freq var sector_key = null + var sector_width = 50.0 for key in fs_freq: var freq_range = fs_freq[key] + var _num_values = (freq_range[1]- freq_range[0]) / sector_width if freq_range[0] <= freq and freq <= freq_range[1]: sector_key = key break - if sector_key != null: - var fsf = fs_freq[sector_key] - radius_internal = fsf[2] - radius_outter = fsf[3] - freq_low = fsf[0] - freq_high = fsf[1] + if sector_key!= null: + radius_internal = fs_freq[sector_key][2] + radius_outter = fs_freq[sector_key][3] + freq_low = fs_freq[sector_key][0] + freq_high = fs_freq[sector_key][1] bip.position = tools.pos_calc( th.freq, th.aoa, @@ -426,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() @@ -460,7 +465,7 @@ func set_ecm_btns_state(value: bool): 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 @@ -469,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 @@ -487,9 +494,9 @@ 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): @@ -500,16 +507,21 @@ 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(): 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) diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index 97259ada..5878e921 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/astra_kb.gd b/scripts/astra_kb.gd new file mode 100644 index 00000000..e523eabb --- /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/interfer.gd b/scripts/interfer.gd index d7cec24f..b0b10a5c 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -265,7 +265,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() @@ -278,7 +277,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) @@ -289,7 +287,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) diff --git a/scripts/network.gd b/scripts/network.gd index 025199ca..fd7fbdac 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,35 @@ class SocketTCP extends TCPServer: peer.put_data(data) +class Modbus extends ModbusClientRtu: + var unit_name + 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]) + + 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 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 +120,23 @@ func create_serial(nm) -> Serial: return sp +func create_modbus(nm, mbc_unit) -> Modbus: + var port = settings.UnitProfiles[nm][1] + 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[1], params[0], params[2], params[3], params[4]) + mbc.thread_run() + mbc.unit_name = nm + 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] @@ -122,12 +157,26 @@ 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 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) @@ -225,6 +274,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 56dbf8a3..788846ab 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: + if not online and (message['code'] != 'exception'): 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 08525b8f..b53439f2 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -3,30 +3,34 @@ 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.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 прибора УФ'], - 'уарэп-яу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'], + 'уарэп-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, 7, 'N', 8, 1], 'Параметры клиента Modbus Serial'], # Название: [ Протокол, Имя порта, Скорость, Чётность, ??, Комментарий 'уарэп-спт25-1': ['uart', '/home/sasha/dev/tty0', [19200, false, false], 'Адрес прибора СПТ-25 (G1)'], @@ -39,7 +43,24 @@ 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() + settings_program.merge(json_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('Модуль настроек готов') ## Возвращает ключ устройства. diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 8f73b65c..955cb181 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -151,5 +151,13 @@ signal th_aoa_update(threats: Dictionary) ## [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) diff --git a/scripts/yau07.gd b/scripts/yau07.gd index 45b7a31b..a4175ae8 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 958b939e..b72794a2 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 2f2014b2..e37934bb 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']], diff --git a/scripts/yems-g.gd b/scripts/yems-g.gd new file mode 100644 index 00000000..94e9c180 --- /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) diff --git a/table/taggle.tscn b/table/taggle.tscn index 823de949..413d6ee2 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