Доработка. Режим "Контроль". Отображение состояния БПО.
This commit is contained in:
@@ -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")]
|
||||
|
||||
40
scenes/pribor-afsp/node_maper.gd
Normal file
40
scenes/pribor-afsp/node_maper.gd
Normal file
@@ -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)
|
||||
1
scenes/pribor-afsp/node_maper.gd.uid
Normal file
1
scenes/pribor-afsp/node_maper.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bcjneo1tbiygo
|
||||
@@ -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"]
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
## Вызывается при клике мыши на элементе контроля.
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
@tool
|
||||
|
||||
extends "res://scenes/контроль/элемент-я.gd"
|
||||
extends 'res://scenes/контроль/элемент-я.gd'
|
||||
|
||||
|
||||
func on_line_changed(unit0):
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user