diff --git a/scenes/pribor-afsp/bort-afsp.tscn b/scenes/pribor-afsp/bort-afsp.tscn index 14ab91bc..8d55d617 100644 --- a/scenes/pribor-afsp/bort-afsp.tscn +++ b/scenes/pribor-afsp/bort-afsp.tscn @@ -800,7 +800,6 @@ offset_right = 580.0 offset_bottom = 115.0 tooltip_text = "Плата АЦП ADCS500" fname = "АЦП" -state = 1 metadata/state = ["SelfTest[4].SystemList[0].DevList[1]['TestPassed']"] [node name="dsp" parent="." instance=ExtResource("4_mtf2n")] @@ -810,7 +809,6 @@ offset_right = 580.0 offset_bottom = 60.0 tooltip_text = "Плата цифровой обработки сигналов BPL" fname = "Сигн. проц." -state = 1 metadata/state = ["SelfTest[4].SystemList[0].DevList[0]['TestPassed']"] [node name="gen" parent="." instance=ExtResource("2_dmhrm")] diff --git a/scenes/pribor-afsp/node_maper.gd b/scenes/pribor-afsp/node_maper.gd new file mode 100644 index 00000000..b42f1890 --- /dev/null +++ b/scenes/pribor-afsp/node_maper.gd @@ -0,0 +1,40 @@ +extends Node + + +static func map_value_to_item(data, item, value_name: StringName): + var meta = item.get_meta(value_name, '') + if meta == '': + return + if not (meta is String): + return + var paths: = Array() + tools.map_solid_to_array(meta, paths) + var ret_val: = [null, false, 0] + var paths_copy = paths.duplicate(true) + tools.get_value_by_path(data, paths, ret_val) + 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]) + + +static func map_error_codes_to_item(data, item, value_name: StringName, value_init: int): + var metas = item.get_meta(value_name, '') + if not (metas is Array): + return + var paths: = Array() + var values: = Array() + for meta in metas: + tools.map_solid_to_array(meta, paths) + var ret_val: = [null, false, 0] + var paths_copy = paths.duplicate(true) + tools.get_value_by_path(data, paths, ret_val) + if ret_val[1]: + values.append(ret_val[0]) + else: + push_error('не найден путь %s(%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text]) + if values.size() == metas.size(): + var test_res = 1 if values.count(true) == values.size() else 2 + item.set(value_name, test_res) + else: + item.set(value_name, value_init) diff --git a/scenes/pribor-afsp/node_maper.gd.uid b/scenes/pribor-afsp/node_maper.gd.uid new file mode 100644 index 00000000..973fc938 --- /dev/null +++ b/scenes/pribor-afsp/node_maper.gd.uid @@ -0,0 +1 @@ +uid://bcjneo1tbiygo diff --git a/scenes/pribor-afsp/pribor-afsp-1.tscn b/scenes/pribor-afsp/pribor-afsp-1.tscn index 907863f7..8577aa7d 100644 --- a/scenes/pribor-afsp/pribor-afsp-1.tscn +++ b/scenes/pribor-afsp/pribor-afsp-1.tscn @@ -36,6 +36,6 @@ offset_bottom = 1216.78 metadata/DeviceName = &"Устройство РР левого борта" [connection signal="child_entered_tree" from="request" to="request" method="_on_child_entered_tree"] -[connection signal="request_completed" from="request" to="." method="_on_request_rtr_request_completed"] +[connection signal="request_completed" from="request" to="." method="_on_request_completed"] [connection signal="timeout" from="request/timer" to="request" method="_on_request_timer"] [connection signal="pressed" from="bort" to="." method="_on_item_pressed"] diff --git a/scenes/pribor-afsp/pribor-afsp.gd b/scenes/pribor-afsp/pribor-afsp.gd index ca717ba8..ed443ade 100644 --- a/scenes/pribor-afsp/pribor-afsp.gd +++ b/scenes/pribor-afsp/pribor-afsp.gd @@ -3,36 +3,9 @@ class_name pribor_afsp extends 'res://scenes/контроль/прибор.gd' @export var prefix_path: String = 'DeviceDescripton[DeviceName]' static var json_conv: JSON = JSON.new() +static var node_maper = load('res://scenes/pribor-afsp/node_maper.gd') -## Преобразует путь в виде целой строки в массив отдельных элементов пути.[br] -## [param solid] - Входная строка содержащая путь, которая имеет следующий примерный вид:[br] -## [code]SelfTest[1].DevList[2]['CurrentValue'][/code][br] -## [param paths] - Массив содержащий отдельные элементы пути.[br] -## [param tokens] - Разделители используемые во входной строке для разделения элементов пути.[br] -func map_solid_to_array(solid: String, paths: Array, tokens: Array = ['[', ']', '.']) -> void: - paths.clear() - var i_chs = [] - for sep in tokens: - var i = 0 - while i != -1: - i = solid.find(sep, i + 1) - i_chs.append(i) - i_chs.pop_back() - i_chs.sort() - - var i0 = 0 - for i1 in i_chs: - var ss: = [String()] - tools.get_string_slice(solid, ss, i0, i1) - if ss[0].is_valid_int(): - paths.append(ss[0].to_int()) - else: - if ss[0]: - paths.append(ss[0]) - i0 = i1 + 1 - - -func _on_request_rtr_request_completed(result, _response_code, headers, body: PackedByteArray): +func _on_request_completed(result, _response_code, headers, body: PackedByteArray): if result != 0: var rs = $request.get_result_string(result) log.error('\"%s\"' % rs) @@ -50,7 +23,7 @@ func _on_request_rtr_request_completed(result, _response_code, headers, body: Pa return var pp = [] - map_solid_to_array(prefix_path, pp) + tools.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) @@ -65,61 +38,22 @@ func _on_request_rtr_request_completed(result, _response_code, headers, body: Pa return 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) + node_maper.map_value_to_item(json_conv.data, child, 'value0') + node_maper.map_value_to_item(json_conv.data, child, 'value1') + node_maper.map_value_to_item(json_conv.data, child, 'value2') + node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0) 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) + node_maper.map_value_to_item(json_conv.data, child, 'value0') + node_maper.map_value_to_item(json_conv.data, child, 'value1') + node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0) 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) + node_maper.map_value_to_item(json_conv.data, child, 'value0') + node_maper.map_value_to_item(json_conv.data, child, 'value1') + node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0) 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) - - -func map_value_to_item(data, item, value_name: StringName): - var meta = item.get_meta(value_name, '') - if meta == '': - return - if not (meta is String): - return - var paths: = Array() - map_solid_to_array(meta, paths) - var ret_val: = [null, false, 0] - var paths_copy = paths.duplicate(true) - tools.get_value_by_path(data, paths, ret_val) - 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]) - - -func map_error_codes_to_item(data, item, value_name: StringName, value_init: int): - var metas = item.get_meta(value_name, '') - if not (metas is Array): - return - var paths: = Array() - var values: = Array() - for meta in metas: - map_solid_to_array(meta, paths) - var ret_val: = [null, false, 0] - var paths_copy = paths.duplicate(true) - tools.get_value_by_path(data, paths, ret_val) - if ret_val[1]: - values.append(ret_val[0]) - else: - push_error('не найден путь %s(%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text]) - if values.size() == metas.size(): - var test_res = 1 if values.count(true) == values.size() else 2 - item.set(value_name, test_res) - else: - item.set(value_name, value_init) + node_maper.map_value_to_item(json_conv.data, child, 'value0') + node_maper.map_value_to_item(json_conv.data, child, 'value1') + node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0) ## Вызывается при клике мыши на элементе контроля. diff --git a/scenes/pribor-afsp/pribor-rtr.gd b/scenes/pribor-afsp/pribor-rtr.gd index 12f04cd9..63aec35f 100644 --- a/scenes/pribor-afsp/pribor-rtr.gd +++ b/scenes/pribor-afsp/pribor-rtr.gd @@ -1,3 +1,47 @@ class_name pribor_rtr extends 'res://scenes/контроль/прибор.gd' -@export var prefix_path: String = '' +@export var prefix_path: String = 'DeviceDescripton[DeviceName]' + +static var json_conv: JSON = JSON.new() +static var node_maper = load('res://scenes/pribor-afsp/node_maper.gd') + + +const bort_to_node_name = { + 'Устройство РР левого борта': 'grid_bpo_a1', + 'Устройство РР правого борта': 'grid_bpo_a2'} + + +func _on_request_completed(result, _response_code, headers, body: PackedByteArray): + if result != 0: + var rs = $request.get_result_string(result) + log.error('\"%s\"' % rs) + return + + var json_str: String = body.get_string_from_utf8() + if not json_str: + push_error('не удаётся получить строку из utf8-данных (%s)' % headers) + return + + var rc = json_conv.parse(json_str) + if rc != Error.OK: + var err = json_conv.get_error_message() + push_error('разбор json прерван - \"%s\" (%s)' % [err, headers]) + return + + var pp = [] + tools.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) + if not ret_val[1]: + push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]]) + return + + if not bort_to_node_name.has(ret_val[0]): + return + + var node_name = bort_to_node_name[ret_val[0]] + var bort_node = get_node(node_name) + + for item in bort_node.get_children(): + node_maper.map_value_to_item(json_conv.data, item, 'state') diff --git a/scenes/pribor-afsp/pribor-rtr.tscn b/scenes/pribor-afsp/pribor-rtr.tscn index 031e1b99..df3e7803 100644 --- a/scenes/pribor-afsp/pribor-rtr.tscn +++ b/scenes/pribor-afsp/pribor-rtr.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqea"] +[gd_scene load_steps=5 format=3 uid="uid://5uv1idl3lqea"] [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"] +[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/pribor-afsp/request.gd" id="4_pspup"] [node name="pribor_rtr" type="Control"] layout_mode = 3 @@ -47,48 +48,56 @@ layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 1" +metadata/state = "SelfTest[0].SystemList[0].DevList[0]['TestPassed']" [node name="kanal2" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 2" +metadata/state = "SelfTest[0].SystemList[0].DevList[1]['TestPassed']" [node name="kanal3" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 3" +metadata/state = "SelfTest[0].SystemList[0].DevList[2]['TestPassed']" [node name="kanal4" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 4" +metadata/state = "SelfTest[0].SystemList[0].DevList[3]['TestPassed']" [node name="kanal5" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 5" +metadata/state = "SelfTest[0].SystemList[0].DevList[4]['TestPassed']" [node name="kanal6" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 6" +metadata/state = "SelfTest[0].SystemList[0].DevList[5]['TestPassed']" [node name="kanal7" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 7" +metadata/state = "SelfTest[0].SystemList[0].DevList[6]['TestPassed']" [node name="kanal8" parent="grid_bpo_a1" instance=ExtResource("2_pspup")] layout_mode = 2 size_flags_horizontal = 7 size_flags_vertical = 7 fname = "Канал 8" +metadata/state = "SelfTest[0].SystemList[0].DevList[7]['TestPassed']" [node name="yas_bpo_a1" parent="." instance=ExtResource("3_gh777")] offset_left = 500.0 @@ -173,3 +182,13 @@ offset_bottom = 520.0 show_rname = false self_size = Vector2i(50, 145) fname = "Яч. связи" + +[node name="request" type="HTTPRequest" parent="."] +script = ExtResource("4_pspup") + +[node name="timer" type="Timer" parent="request"] +wait_time = 4.168 +autostart = true + +[connection signal="request_completed" from="request" to="." method="_on_request_completed"] +[connection signal="timeout" from="request/timer" to="request" method="_on_request_timer"] diff --git a/scenes/pribor-uyep/spt25-view.gd b/scenes/pribor-uyep/spt25-view.gd index f537b1c1..30066a90 100644 --- a/scenes/pribor-uyep/spt25-view.gd +++ b/scenes/pribor-uyep/spt25-view.gd @@ -1,6 +1,6 @@ @tool -extends "res://scenes/контроль/элемент-я.gd" +extends 'res://scenes/контроль/элемент-я.gd' func on_line_changed(unit0): diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 1b179b14..442c2dcd 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -288,6 +288,6 @@ texture_pressed = ExtResource("13_ggrwd") [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] diff --git a/scripts/tools.gd b/scripts/tools.gd index dca07aa5..ec7d5533 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -35,6 +35,34 @@ func allways(val: bool, msg: String = '<не указано>'): get_tree().quit(Error.FAILED) +## Преобразует путь в виде целой строки в массив отдельных элементов пути.[br] +## [param solid] - Входная строка содержащая путь, которая имеет следующий примерный вид:[br] +## [code]SelfTest[1].DevList[2]['CurrentValue'][/code][br] +## [param paths] - Массив содержащий отдельные элементы пути.[br] +## [param tokens] - Разделители используемые во входной строке для разделения элементов пути.[br] +func map_solid_to_array(solid: String, paths: Array, tokens: Array = ['[', ']', '.']) -> void: + paths.clear() + var i_chs = [] + for sep in tokens: + var i = 0 + while i != -1: + i = solid.find(sep, i + 1) + i_chs.append(i) + i_chs.pop_back() + i_chs.sort() + + var i0 = 0 + for i1 in i_chs: + var ss: = [String()] + get_string_slice(solid, ss, i0, i1) + if ss[0].is_valid_int(): + paths.append(ss[0].to_int()) + else: + if ss[0]: + paths.append(ss[0]) + i0 = i1 + 1 + + func check_index(obj, index) -> bool: if obj is Dictionary: if obj.has(index):