Merge branch 'lepshiy-master'

# Conflicts:
#	scenes/frame-ecm-list/frm-ecm-list.gd
#	scripts/signaller.gd
This commit is contained in:
sasha80
2025-02-03 11:44:38 +03:00
32 changed files with 779 additions and 600 deletions

View File

@@ -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"

View File

@@ -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):

View File

@@ -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)
## Перестраивает индекс таблицы. Вызывать при удалении строки

View File

@@ -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="."]

View File

@@ -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="."]

View File

@@ -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")]

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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
# "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..."

View File

@@ -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)

View File

@@ -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:

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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"]

View File

@@ -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 = ['Ограниченный режим',
'Управление элементами в ограниченном режиме',
'Кнопка «ПД-М', 'Кнопка «ПД-М',
'Кнопка «ОЗП-1»',
'Кнопка «МЧМ-1»',
'Кнопка «ОРН-И1»',
'Кнопка «ОРН-М',
'Кнопка «ЛЧМ-1»',
'Кнопка «ПД-М4С»',
'Кнопка «ПД-ЧМ»',
'Кнопка «СВ-И1»',
'Кнопка «К',
'Кнопка «СВ-М',
'Кнопка «ОРН»',
'Кнопка «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,([' Кнопка «ПД-М']))
$table.set_row_text(1,([' Кнопка «ПД-М']))
$table.set_row_text(2,([' Кнопка «ОЗП-1» ']))
$table.set_row_text(3,([' Кнопка «МЧМ-1» ']))
$table.set_row_text(4,([' Кнопка «ОРН-И1» ']))
$table.set_row_text(5,([' Кнопка «ОРН-М']))
$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,([' Кнопка «К']))
$table.set_row_text(11,([' Кнопка «СВ-М']))
$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])

View File

@@ -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"]

View File

@@ -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)

View File

@@ -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)

15
scripts/astra_kb.gd Normal file
View File

@@ -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', [])

View File

@@ -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)

View File

@@ -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]

View File

@@ -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)

View File

@@ -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('Модуль настроек готов')
## Возвращает ключ устройства.

View File

@@ -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)

View File

@@ -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 - код команды.

View File

@@ -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)

View File

@@ -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']],

79
scripts/yems-g.gd Normal file
View File

@@ -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)

View File

@@ -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