Merge remote-tracking branch 'sasha/master'

This commit is contained in:
MaD_CaT
2025-05-29 10:29:57 +03:00
20 changed files with 211 additions and 129 deletions

View File

@@ -122,7 +122,6 @@ folder_colors={
"res://scenes/pribor-prd-k/": "purple",
"res://scenes/pribor-prd-n/": "purple",
"res://scenes/pribor-prd-v/": "purple",
"res://scenes/pribor-rtr/": "purple",
"res://scenes/pribor-uf/": "purple",
"res://scenes/pribor-uyep/": "purple",
"res://scenes/tabs-switch/": "blue",

View File

@@ -13,12 +13,13 @@ signal pressed(control: PanelContainer)
func _on_item_pressed(control): emit_signal('pressed', control)
"
[node name="bort_rtr" type="Control"]
[node name="bort_afsp" type="Control"]
layout_mode = 3
anchors_preset = 0
offset_right = 580.0
offset_bottom = 1185.0
script = SubResource("GDScript_y4aoq")
metadata/DeviceName = &""
[node name="konverter" type="NinePatchRect" parent="."]
layout_mode = 0

View File

@@ -19,6 +19,7 @@ offset_right = 70.0
offset_bottom = 30.0
scale = Vector2(1, 0.9)
script = ExtResource("1_151rh")
metadata/DeviceName = &"Устройство РР левого борта"
[node name="request" type="HTTPRequest" parent="."]
script = ExtResource("2_4vyhj")

View File

@@ -19,6 +19,7 @@ offset_right = 81.0
offset_bottom = 108.0
scale = Vector2(1, 0.9)
script = ExtResource("1_tfses")
metadata/DeviceName = &"Устройство РР правого борта"
[node name="request" type="HTTPRequest" parent="."]
script = ExtResource("2_miwrd")

View File

@@ -1,6 +1,6 @@
class_name pribor_afsp extends 'res://scenes/контроль/прибор.gd'
@export var prefix_path: String = ''
@export var prefix_path: String = 'DeviceDescripton[DeviceName]'
static var json_conv: JSON = JSON.new()
@@ -49,10 +49,8 @@ func _on_request_rtr_request_completed(result, _response_code, headers, body: Pa
push_error('разбор json прерван - \"%s\" (%s)' % [err, headers])
return
var pp = ['DeviceDescripton', 'DeviceName']
var ppp = []
map_solid_to_array(prefix_path, ppp)
var pp = []
map_solid_to_array(prefix_path, pp)
var ret_val = [null, false, 0]
var pp_copy = pp.duplicate(true)
tools.get_value_by_path(json_conv.data, pp, ret_val)
@@ -60,27 +58,26 @@ func _on_request_rtr_request_completed(result, _response_code, headers, body: Pa
push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]])
return
var bort_rtr_name_left: StringName = $left.get_meta('DeviceName', '')
var bort_rtr_name_right: StringName = $right.get_meta('DeviceName', '')
var bb = {bort_rtr_name_left: $left, bort_rtr_name_right: $right}
if not bb.has(ret_val[0]):
var this_afsp_name: StringName = $bort.get_meta('DeviceName', '')
var received_afsp_name: StringName = ret_val[0]
if this_afsp_name != received_afsp_name:
return
var bort_rtr = bb[ret_val[0]]
for child in bort_rtr.get_node('konverter/grid').get_children():
for child in $bort.get_node('konverter/grid').get_children():
map_value_to_item(json_conv.data, child, 'value0')
map_value_to_item(json_conv.data, child, 'value1')
map_value_to_item(json_conv.data, child, 'value2')
map_error_codes_to_item(json_conv.data, child, 'state', 0)
for child in bort_rtr.get_node('antenna1/grid').get_children():
for child in $bort.get_node('antenna1/grid').get_children():
map_value_to_item(json_conv.data, child, 'value0')
map_value_to_item(json_conv.data, child, 'value1')
map_error_codes_to_item(json_conv.data, child, 'state', 0)
for child in bort_rtr.get_node('antenna2/grid').get_children():
for child in $bort.get_node('antenna2/grid').get_children():
map_value_to_item(json_conv.data, child, 'value0')
map_value_to_item(json_conv.data, child, 'value1')
map_error_codes_to_item(json_conv.data, child, 'state', 0)
for child in bort_rtr.get_children():
for child in $bort.get_children():
map_value_to_item(json_conv.data, child, 'value0')
map_value_to_item(json_conv.data, child, 'value1')
map_error_codes_to_item(json_conv.data, child, 'state', 0)
@@ -100,7 +97,7 @@ func map_value_to_item(data, item, value_name: StringName):
if ret_val[1]:
item.set(value_name, ret_val[0])
else:
push_error('не найденпуть %s (%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text])
push_error('не найден путь %s (%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text])
func map_error_codes_to_item(data, item, value_name: StringName, value_init: int):

View File

@@ -1,8 +1,8 @@
[gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqea"]
[ext_resource type="Script" uid="uid://d0jwv5opi3mrk" path="res://scenes/pribor-rtr/pribor-rtr.gd" id="1_sqyma"]
[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="2_yb5ym"]
[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="3_xqaxm"]
[ext_resource type="Script" uid="uid://d0jwv5opi3mrk" path="res://scenes/pribor-afsp/pribor-rtr.gd" id="1_soedq"]
[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_pspup"]
[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_gh777"]
[node name="pribor_rtr" type="Control"]
layout_mode = 3
@@ -11,9 +11,9 @@ offset_left = 115.0
offset_top = 150.0
offset_right = 115.0
offset_bottom = 150.0
script = ExtResource("1_sqyma")
script = ExtResource("1_soedq")
[node name="yach_svyzi" parent="." instance=ExtResource("3_xqaxm")]
[node name="yach_svyzi" parent="." instance=ExtResource("2_pspup")]
layout_mode = 2
offset_left = 40.0
offset_top = 535.0
@@ -24,7 +24,7 @@ size_flags_vertical = 7
fname = "Модуль электропитания"
rname = "G1"
[node name="blok_bpo_a1" parent="." instance=ExtResource("3_xqaxm")]
[node name="blok_bpo_a1" parent="." instance=ExtResource("2_pspup")]
layout_mode = 0
offset_left = 40.0
offset_top = 135.0
@@ -42,55 +42,55 @@ offset_right = 498.0
offset_bottom = 320.0
columns = 4
[node name="a1_kanal1" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal1" parent="grid_bpo_a1" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 1"
[node name="a1_kanal2" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal2" parent="grid_bpo_a1" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 2"
[node name="a1_kanal3" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal3" parent="grid_bpo_a1" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 3"
[node name="a1_kanal4" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal4" parent="grid_bpo_a1" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 4"
[node name="a1_kanal5" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal5" parent="grid_bpo_a1" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 5"
[node name="a1_kanal6" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal6" parent="grid_bpo_a1" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 6"
[node name="a1_kanal7" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal7" parent="grid_bpo_a1" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 7"
[node name="a1_kanal8" parent="grid_bpo_a1" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal8" parent="grid_bpo_a1" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 8"
[node name="yas_bpo_a1" parent="." instance=ExtResource("2_yb5ym")]
[node name="yas_bpo_a1" parent="." instance=ExtResource("3_gh777")]
offset_left = 500.0
offset_top = 175.0
offset_right = 550.0
@@ -99,7 +99,7 @@ show_rname = false
self_size = Vector2i(50, 145)
fname = "Яч. связи"
[node name="blok_bpo_a2" parent="." instance=ExtResource("3_xqaxm")]
[node name="blok_bpo_a2" parent="." instance=ExtResource("2_pspup")]
layout_mode = 0
offset_left = 40.0
offset_top = 335.0
@@ -117,55 +117,55 @@ offset_right = 498.0
offset_bottom = 520.0
columns = 4
[node name="a1_kanal1" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal1" parent="grid_bpo_a2" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 1"
[node name="a1_kanal2" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal2" parent="grid_bpo_a2" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 2"
[node name="a1_kanal3" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal3" parent="grid_bpo_a2" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 3"
[node name="a1_kanal4" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal4" parent="grid_bpo_a2" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 4"
[node name="a1_kanal5" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal5" parent="grid_bpo_a2" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 5"
[node name="a1_kanal6" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal6" parent="grid_bpo_a2" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 6"
[node name="a1_kanal7" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal7" parent="grid_bpo_a2" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 7"
[node name="a1_kanal8" parent="grid_bpo_a2" instance=ExtResource("3_xqaxm")]
[node name="a1_kanal8" parent="grid_bpo_a2" instance=ExtResource("2_pspup")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 8"
[node name="yas_bpo_a2" parent="." instance=ExtResource("2_yb5ym")]
[node name="yas_bpo_a2" parent="." instance=ExtResource("3_gh777")]
offset_left = 500.0
offset_top = 375.0
offset_right = 550.0

View File

@@ -1,5 +1,3 @@
@tool
class_name sch3_view
extends 'res://scenes/контроль/элемент-я.gd'
@@ -43,6 +41,17 @@ func on_line_changed_sch3(unit_sch3):
$margin/vbox/grid/state.texture = textures[STATE_VAL.NONE]
func on_settings_changed():
var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
if not external_ctl:
return
var items = get_tree().get_nodes_in_group('bits_items_switch')
for item in items:
item.disabled = external_ctl
items = get_tree().get_nodes_in_group('bits_items_good')
for item in items:
item.texture = textures[STATE_VAL.NONE]
## Вызывается при изменении состояния выключателя[br]
## [param val] - Состояние выключателя[br]
## [param meta] - Адреса регистров и индексы битов назначенных выключателю[br]
@@ -62,11 +71,6 @@ func _enter_tree() -> void:
if Engine.is_editor_hint(): return
var unit_key = settings.get_unit_key(unit_name)
var unit_sch3 = network.units[unit_key]
var items = get_tree().get_nodes_in_group('bits_items_switch')
for item in items:
var meta = item.get_meta('bits')
item.connect('toggled', on_toggled_switch.bind(meta, unit_sch3))
item.disabled = true
unit_sch3.base_holding_address = base_holding_address
unit_sch3.regs_holding_count = regs_holding_count
unit_sch3.base_input_address = base_input_address
@@ -79,6 +83,17 @@ func _enter_tree() -> void:
unit_sch3.connect('line_changed', on_line_changed_sch3)
func _ready() -> void:
var unit_key = settings.get_unit_key(unit_name)
var a = network.units
var unit_sch3 = network.units[unit_key]
var items = get_tree().get_nodes_in_group('bits_items_switch')
for item in items:
var meta = item.get_meta('bits')
item.connect('toggled', on_toggled_switch.bind(meta, unit_sch3))
item.disabled = true
func _exit_tree() -> void:
if Engine.is_editor_hint(): return
var unit_key = settings.get_unit_key(unit_name)

View File

@@ -136,7 +136,7 @@ theme_override_font_sizes/font_size = 17
text = "УФ"
vertical_alignment = 1
[node name="switch0" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]]
[node name="switch0" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]]
editor_description = "Питание УФ"
material = SubResource("ShaderMaterial_c1mqk")
layout_mode = 2
@@ -165,7 +165,7 @@ theme_override_font_sizes/font_size = 17
text = "РТР"
vertical_alignment = 1
[node name="switch1" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]]
[node name="switch1" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]]
editor_description = "РТР"
material = SubResource("ShaderMaterial_c1mqk")
layout_mode = 2
@@ -193,7 +193,7 @@ theme_override_font_sizes/font_size = 17
text = "ПРД-Н.1"
vertical_alignment = 1
[node name="switch2" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]]
[node name="switch2" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]]
editor_description = "ПРД-Н.1"
material = SubResource("ShaderMaterial_c1mqk")
layout_mode = 2
@@ -222,7 +222,7 @@ theme_override_font_sizes/font_size = 17
text = "ПРД-Н.2"
vertical_alignment = 1
[node name="switch3" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]]
[node name="switch3" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]]
editor_description = "Питание ПРД-Н.2"
material = SubResource("ShaderMaterial_c1mqk")
layout_mode = 2

View File

@@ -3,20 +3,30 @@
extends "res://scenes/контроль/элемент-я.gd"
func on_line_changed(unit):
if not unit.online:
state = STATE_VAL.NONE
$block_output.state0 = STATE_VAL.NONE
$block_output.state1 = STATE_VAL.NONE
$block_output.state2 = STATE_VAL.NONE
$block_input1.state = STATE_VAL.NONE
$block_input1.state0 = STATE_VAL.NONE
$block_input1.state1 = STATE_VAL.NONE
$block_input1.state2 = STATE_VAL.NONE
$block_input2.state = STATE_VAL.NONE
$block_input2.state0 = STATE_VAL.NONE
$block_input2.state1 = STATE_VAL.NONE
$block_input2.state2 = STATE_VAL.NONE
func on_line_changed(unit0):
if not unit0.online:
disable_all()
func on_settings_changed():
var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
if external_ctl:
disable_all()
func disable_all():
state = STATE_VAL.NONE
$block_output.state0 = STATE_VAL.NONE
$block_output.state1 = STATE_VAL.NONE
$block_output.state2 = STATE_VAL.NONE
$block_input1.state = STATE_VAL.NONE
$block_input1.state0 = STATE_VAL.NONE
$block_input1.state1 = STATE_VAL.NONE
$block_input1.state2 = STATE_VAL.NONE
$block_input2.state = STATE_VAL.NONE
$block_input2.state0 = STATE_VAL.NONE
$block_input2.state1 = STATE_VAL.NONE
$block_input2.state2 = STATE_VAL.NONE
func on_data_received(data: PackedByteArray):

View File

@@ -25,5 +25,5 @@ func _on_tab_changed(tab) -> void:
func on_setting_changed():
var ext_cu = ProjectSettings.get_setting('application/config/external_cu', false)
var ext_cu = ProjectSettings.get_setting('application/config/Внешнее управление', false)
get_parent().get_node('remote_control').visible = ext_cu

View File

@@ -121,6 +121,11 @@ func _ready() -> void:
var key = settings.get_unit_key('навигация')
var unit_nav = network.units[key]
unit_nav.connect('data_received', on_data_received)
ProjectSettings.connect('settings_changed', _settings_changed)
func _settings_changed():
base_url = ProjectSettings.get_setting('application/config/Шаблон адреса сервера карт', base_url)
func on_data_received(coords: Dictionary) -> void:

View File

@@ -18,7 +18,7 @@ const PRIBORS_RES = \
'pribor_prd_v_2': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 2'],
'pribor_prd_v_3': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 3'],
'pribor_prd_v_4': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 4'],
'pribor_rtr': ['res://scenes/pribor-rtr/pribor-rtr.tscn', 'Контроль исправности прибора РТР'],
'pribor_rtr': ['res://scenes/pribor-afsp/pribor-rtr.tscn', 'Контроль исправности прибора РТР'],
'pribor_afsp_1': ['res://scenes/pribor-afsp/pribor-afsp-1.tscn', 'Контроль исправности прибора АФСП 1'],
'pribor_afsp_2': ['res://scenes/pribor-afsp/pribor-afsp-2.tscn', 'Контроль исправности прибора АФСП 2'],
'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'],

View File

@@ -24,10 +24,10 @@ const SETTING_TABLE = [
['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Внешнее целеуказание', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'],
['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Виртуальная клавиатура', TableEdit, TableToggle, 'Разрешить отображение экранной клавиатуры'],
['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'],
['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \"ЭМС-2\"'],
['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'],
['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'],
['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'],
@@ -50,13 +50,14 @@ const SETTING_TABLE = [
['уарэп-щ3', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором Щ3'],
['уарэп-спт25-1', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 1'],
['уарэп-спт25-2', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 2'],
['Шаблон адреса сервера карт', TableEdit, TableEdit, 'URL-адрес сервера карт, содержащий поля \"{x}\", \"{y}\", \"{z}\" для подстановки индекса плитки'] ]
['Шаблон адреса сервера карт', TableEdit, TableEdit, 'URL-адрес сервера карт, должен содержать поля \"{x}\", \"{y}\", \"{z}\" для подстановки индекса плитки'] ]
const EXTERNAL_CU = 16 ## Внешнее целееуказание
const SUPPRESS = 17 ## Строка - Подавление
const KEYBOARD = 18 ## Строка - Виртуальная клавиатура
const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2
const COMMIT = 20 ## Строка - Версия УАРЭП
var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки
func on_checkbutton_pressed(i_row: int): on_row_pressed(i_row)
@@ -73,7 +74,7 @@ func _ready() -> void:
func on_external_cu_btn_pressed(btn) -> void:
var state = btn.button_pressed
ProjectSettings.set_setting('application/config/external_cu', state)
ProjectSettings.set_setting('application/config/Внешнее управление', state)
if state:
signaller.emit_signal('interfer_off_all')
@@ -154,13 +155,15 @@ func setting_tab():
var settings_data = {}
load_settings(settings_data)
parse_cmd_line_args(settings_data)
for key in settings_data:
ProjectSettings.set_setting('application/config/%s' % key, settings_data[key])
for i in SETTING_TABLE.size():
var tbl_row = SETTING_TABLE[i]
var param_name = tbl_row[0]
var node_label = tbl_row[1]
var node_value = tbl_row[2]
var tootip_text = tbl_row[3]
name_to_line_index[param_name] = i
$scroll_set/table.add_row([node_label, node_value])
var label_instance = $scroll_set/table.get_node2(0, i)
label_instance.text = param_name
@@ -206,11 +209,8 @@ func button_settings():
var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0]
extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node))
on_external_cu_btn_pressed(extern_cu_node)
$scroll_set/table.set_row_text(SUPPRESS,(['Кнопка «Подавление»']))
$scroll_set/table.set_row_text(KEYBOARD,(['Виртуальная клавиатура']))
var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0]
vk_node.connect('pressed', on_vk_pressed.bind(vk_node))
$scroll_set/table.set_row_text(HIDE_EMS2,(['Скрыть вкладку ЭМС 2']))
var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0]
ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node))
ems2_hide_node.set_pressed(true)
@@ -249,6 +249,8 @@ func _on_btn_save_settings_pressed():
else:
var row = $scroll_set/table.get_row(i)
json_data[parameter] = row[1].text
for key in json_data:
ProjectSettings.set_setting('application/config/%s' % key, json_data[key])
var settings_file = settings.get_settings_file_path()
var file = FileAccess.open(settings_file, FileAccess.WRITE)
var abs_path = ProjectSettings.globalize_path(settings_file)

View File

@@ -478,8 +478,8 @@ func on_fs_selected(ecm):
func set_btns_disabled(value: bool, btn):
var external_cu = ProjectSettings.get_setting('application/config/external_cu', false)
if external_cu:
var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
if external_ctl:
btn.set_pressed(false)
btn.set_disabled(true)
else:

View File

@@ -89,18 +89,18 @@ signal interfer_resized(ecms: Dictionary) ## Вызывается пр
## Отправляет словарь помех в юнит, для запаковки и отправки в 5П28.
func on_get_interfers(unit, ecms): unit.pack_interfers(cu, ecms)
func on_get_interfers(unit, ecms) -> void: unit.pack_interfers(cu, ecms)
## Автмат выключен
func on_manual_control(): auto_enabled = false
func on_manual_control() -> void: auto_enabled = false
## Автмат отключен
func on_full_auto(): auto_enabled = true
func on_full_auto() -> void: auto_enabled = true
func _ready():
func _ready() -> void:
var ecms: Dictionary = {} ## Словарь помех.
for i in ID_INTERFERS_LEN: # Заполняет массив ID целей
id_array.append(i + 1)
@@ -129,7 +129,7 @@ func _ready():
## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку.
func on_timer_check_state(unit, ecms, resend_timeout):
func on_timer_check_state(unit, ecms, resend_timeout) -> void:
var tick = Time.get_ticks_msec()
for ecm in ecms.values():
if (tick - ecm.tick_tx) >= resend_timeout:
@@ -137,7 +137,7 @@ func on_timer_check_state(unit, ecms, resend_timeout):
ecm.tick_tx = tick
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit):
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit) -> void:
for thr in threats.values():
var th_id = thr.id
for ecm_i in thrs.keys():
@@ -160,13 +160,13 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit):
## Производит приём состояния помех. [param unit] -> [param ecms].
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
if not unit.json_dic.has('ts'): return
if not (unit.json_dic['ts'] is float): return
if unit.json_dic['ts'] != 5: return
if not unit.json_dic.has('msvk'): return
if not (unit.json_dic['msvk'] is Array): return
var msvk = unit.json_dic['msvk']
func on_data_capsrpb_received(unit0: capsrpb.CapsRpb, ecms: Dictionary) -> void:
if not unit0.json_dic.has('ts'): return
if not (unit0.json_dic['ts'] is float): return
if unit0.json_dic['ts'] != 5: return
if not unit0.json_dic.has('msvk'): return
if not (unit0.json_dic['msvk'] is Array): return
var msvk = unit0.json_dic['msvk']
var sz: = ecms.size()
for dic_msvk in msvk:
if not (dic_msvk is Dictionary): continue
@@ -180,13 +180,13 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
var ecm = Interfer.new()
ecm.set_from_dic(dic_msvk)
ecm.krp = INTERFER_OFF
send_ecm(ecm, unit)
send_ecm(ecm, unit0)
if sz != ecms.size():
call_deferred('emit_signal', 'interfer_resized', ecms)
## Вызыватся, когда пользователь выбрал помеху и выбраны цели.
func on_interfer_create(interfer_name, sel_threats, fs_arr, u, ecms):
func on_interfer_create(interfer_name, sel_threats, fs_arr, u, ecms) -> void:
for item in sel_threats:
var param: Dictionary = {}
var kni: float = item.aoa
@@ -212,7 +212,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, u, ecms):
interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1])
func on_interfer_rcv(interfer_params: Array, unit, ecms):
func on_interfer_rcv(interfer_params: Array, unit0, ecms) -> void:
var err: bool = false
var mode = interfer_params[0]
var id = interfer_params[1]
@@ -238,11 +238,11 @@ func on_interfer_rcv(interfer_params: Array, unit, ecms):
if interfer_name == '':
err = true
if not err:
interfer_create(unit, interfer_name, ecms, param, aoa, id, cu, SOURCE_INTERFER[2])
unit.on_interfer_accept(err)
interfer_create(unit0, interfer_name, ecms, param, aoa, id, cu, SOURCE_INTERFER[2])
unit0.on_interfer_accept(err)
func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interfer):
func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interfer) -> void:
var ispp: int = 0
if interfer_name == 'k1':
param['dur'] = 1.0 # Необходимо добавить параметры управления
@@ -285,26 +285,26 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
send_ecm(ecm, u)
func send_ecm(ecm, unit):
func send_ecm(ecm, unit0) -> void:
msg_num += 1
var json_data = ecm.get_msg6_data(msg_num)
unit.tx_stack.append(json_data)
unit0.tx_stack.append(json_data)
func on_interfer_off_all(unit, ecms):
for ecm in ecms.values():
ecm.krp = INTERFER_OFF
send_ecm(ecm, unit)
signaller.emit_signal('interfer_off',ecm, ecms, thrs)
func on_interfer_off_all(unit0, ecms: Dictionary) -> void:
for ecm in ecms.values():
ecm.krp = INTERFER_OFF
send_ecm(ecm, unit0)
signaller.emit_signal('interfer_off', ecm, ecms, thrs)
func on_threats_lost(th, ecms, unit):
func on_threats_lost(th, ecms, unit0) -> void:
for key in interfer.thrs:
if interfer.thrs[key] == th.id:
var ecm_id = key
var ecm = ecms[ecm_id]
ecm.krp = INTERFER_OFF
send_ecm(ecm, unit)
send_ecm(ecm, unit0)
signaller.emit_signal('interfer_off', ecm, ecms, thrs)
@@ -316,12 +316,12 @@ func pop_id() -> int:
return id
func push_id(id: int):
func push_id(id: int) -> void:
id_array.append(id)
id_array.sort()
func on_emit_changed(state, ecms):
func on_emit_changed(state, ecms) -> void:
emit_enable = state
for ecm in ecms.values():
ecm.modulation = state

View File

@@ -23,6 +23,16 @@ class Serial extends SerialPort:
start_monitoring(timeout)
return rc
func try_close():
if not is_open():
return Error.FAILED
stop_monitoring()
close()
var connections = data_received.get_connections()
for conn in connections:
data_received.disconnect(conn.callable)
return Error.OK
class Socket extends PacketPeerUDP:
func send_to(addr, data):
@@ -137,6 +147,9 @@ func _ready() -> void:
send_sockets['уарэп-яу07-3н'] = sock_unicast
send_sockets['уарэп-яу07-3к'] = sock_unicast
var bind_serials: = []
var bind_modbuses: = []
for unit_name in settings.UnitProfiles:
var st = settings.UnitProfiles[unit_name]
var proto = st[0]
@@ -166,6 +179,7 @@ func _ready() -> void:
var unit_key = settings.get_unit_key(unit_name)
units_modbus[unit_key] = unit_modbus
units[unit_key] = unit_modbus
bind_modbuses.append([unit_modbus, unit_name])
if proto in SERIAL_PROTO:
var unit_serial = SERIAL_PROTO[proto].new(unit_name)
@@ -174,11 +188,8 @@ func _ready() -> void:
units_serial[unit_key] = unit_serial
units[unit_key] = unit_serial
serials[unit_key] = serial
var rc = serial.try_open(on_serial_data.bind(unit_serial))
if rc != Error.OK:
log.message(log.ERROR, 'невозможно открыть %s для \"%s\"' % [serial, unit_name])
else:
log.message(log.INFO, '%s для \"%s\"' % [serial, unit_name])
ProjectSettings.connect('settings_changed', Callable(self, '_on_settings_changed_serial').bind(bind_serials))
tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[settings.get_unit_key('уарэп-5п28')]])
for key in dst_ports:
@@ -190,6 +201,28 @@ func _ready() -> void:
u.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(key))
func _on_settings_changed_modbus(bind_modbuses: Array):
var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
for bm in bind_modbuses:
var unit_modbus = bm[0]
var unit_name = bm[1]
func _on_settings_changed_serial(bind_serials: Array):
var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
for bs in bind_serials:
var serial = bs[0]
var unit_serial = bs[1]
var unit_name = bs[2]
serial.try_close()
if not external_ctl:
var rc = serial.try_open(on_serial_data.bind(unit_serial))
if rc != Error.OK:
log.message(log.ERROR, 'невозможно открыть %s для \"%s\"' % [serial, unit_name])
else:
log.message(log.INFO, '%s для \"%s\"' % [serial, unit_name])
func poll_receive_udp(sock: Socket) -> bool:
while sock.get_available_packet_count() > 0:
var data: = sock.get_packet()
@@ -215,9 +248,9 @@ func poll_receive_udp(sock: Socket) -> bool:
func poll_receive_tcp(sock: SocketTCP) -> bool:
if sock.is_connection_available(): # check if someone's trying to connect
var client: = sock.take_connection() # accept connection
sock.peerstream.set_stream_peer(client) # bind peerstream to new client
if sock.is_connection_available(): # Проверить, если кто то пытается подключиться
var client: = sock.take_connection() # Принять соединение
sock.peerstream.set_stream_peer(client) # Привязать поток к новому клиенту
log.info('подключен: %s:%d к порту: %d' % [ client.get_connected_host(), client.get_connected_port(), client.get_local_port() ] )
var peer = sock.peerstream.get_stream_peer()
if peer:

View File

@@ -9,7 +9,9 @@ class Sch3 extends unit.Unit:
READ_INPUT,
READ_HOLDING,
WRITE,
CONNECT }
CONNECT,
IDLE,
DISCONNECT }
var step_fsm: Sch3Fsm = Sch3Fsm.CONNECT
var base_input_address: int = 0
@@ -24,21 +26,22 @@ class Sch3 extends unit.Unit:
var mbc: = ModbusClientRtu.new()
var tick_fsm_delta: = reconnect_period
func try_connect() -> bool:
var port = settings.UnitProfiles[name][1]
var params = settings.UnitProfiles[name][2]
func try_disconnect():
mbc.thread_stop()
mbc.queue_clear()
mbc.flush()
mbc.close()
func try_connect() -> bool:
var port = settings.UnitProfiles[name][1] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра)
var params = settings.UnitProfiles[name][2] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра)
var rc = mbc.open(port, params[0], params[1], params[2], params[3], params[4])
if rc != Error.OK:
if rc != Error.OK: # TODO: убрать это отсюда (неуместный вывод сообщения)
if not reconnect_failed:
push_error('%s: невозможно открыть \"%s\" %s' % [name, port, params])
reconnect_failed = true
return false
if reconnect_failed:
if reconnect_failed: # TODO: убрать это отсюда (неуместный вывод сообщения)
push_warning('%s: открыто после сбоя \"%s\" %s' % [name, port, params])
reconnect_failed = false
mbc.set_response_timeout(params[5])
@@ -74,10 +77,17 @@ class Sch3 extends unit.Unit:
tx_tick = tick
step_fsm = Sch3Fsm.WRITE
elif step_fsm == Sch3Fsm.CONNECT:
try_disconnect()
try_connect()
mbc.request_read_input(base_input_address, regs_input_count)
cmd_state = CmdState.WAIT
tx_tick = tick
elif step_fsm == Sch3Fsm.DISCONNECT:
try_disconnect()
step_fsm = Sch3Fsm.IDLE
elif step_fsm == Sch3Fsm.IDLE:
pass
signal write (addr: int, data: Array) ## Вызывается при получении сообщения подтверждения записи
signal read (addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов.
@@ -90,7 +100,14 @@ class Sch3 extends unit.Unit:
mbc.connect('read', on_read)
mbc.connect('read_input', on_read_input)
mbc.connect('write', on_write)
ProjectSettings.connect('settings_changed', _on_settings_changed)
func _on_settings_changed():
var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
if external_ctl and (step_fsm not in [Sch3Fsm.DISCONNECT, Sch3Fsm.IDLE]):
step_fsm = Sch3Fsm.DISCONNECT
elif (not external_ctl) and (step_fsm in [Sch3Fsm.DISCONNECT, Sch3Fsm.IDLE]):
step_fsm = Sch3Fsm.CONNECT
func parse(return_code: Error, base_addr: int, data: Array, code: String):
if return_code == Error.OK:
@@ -124,8 +141,9 @@ class Sch3 extends unit.Unit:
cmd_state = CmdState.FAIL
emit_signal('command_fail', self)
emit_signal('line_changed', self)
step_fsm = Sch3Fsm.CONNECT
tick_fsm_delta = reconnect_period
if step_fsm != Sch3Fsm.IDLE:
step_fsm = Sch3Fsm.CONNECT
tick_fsm_delta = reconnect_period
if (tick - tick_fsm) > tick_fsm_delta:
tick_fsm = tick
_on_timeout(tick)

View File

@@ -65,7 +65,7 @@ class TCP5P28 extends unit.Unit:
var ext_cu: bool = false
func _init(nm) -> void:
super._init(nm)
ext_cu = ProjectSettings.get_setting('application/config/external_cu', false)
ext_cu = ProjectSettings.get_setting('application/config/Внешнее управление', false)
ProjectSettings.connect('settings_changed', on_setting_changed)
init_state()
@@ -214,4 +214,4 @@ class TCP5P28 extends unit.Unit:
tx_stack.append(data_to_send)
func on_setting_changed():
ext_cu = ProjectSettings.get_setting('application/config/external_cu', false)
ext_cu = ProjectSettings.get_setting('application/config/Внешнее управление', false)