136 lines
5.4 KiB
GDScript
136 lines
5.4 KiB
GDScript
class_name pribor_rtr extends 'res://scenes/контроль/прибор.gd'
|
||
|
||
@export var prefix_path: String = ''
|
||
|
||
static var json_conv: JSON = JSON.new()
|
||
|
||
## Преобразует путь в виде целой строки в массив отдельных элементов пути.[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):
|
||
if result != 0:
|
||
var rs = $request_rtr.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 = ['DeviceDescripton', 'DeviceName']
|
||
var ppp = []
|
||
map_solid_to_array(prefix_path, ppp)
|
||
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
|
||
|
||
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]):
|
||
return
|
||
|
||
var bort_rtr = bb[ret_val[0]]
|
||
for child in bort_rtr.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():
|
||
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():
|
||
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():
|
||
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)
|
||
|
||
|
||
## Вызывается при клике мыши на элементе контроля.
|
||
## [param block_a] - Кликнутый элемент контроля.
|
||
func _on_item_pressed(block_a: Control):
|
||
var metas = block_a.get_meta_list()
|
||
print_debug(block_a)
|
||
for n in metas:
|
||
var v = block_a.get_meta(n)
|
||
print_debug('%s:%s' % [n, v])
|