Files
uarep-ctl/scenes/pribor-rtr/pribor-rtr.gd
2024-08-21 10:24:23 +03:00

134 lines
5.9 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class_name pribor_rtr extends "res://scenes/контроль/прибор.gd"
static var json_parser: 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_parser.parse(json_str)
if rc != Error.OK:
var err = json_parser.get_error_message()
push_error('ошибка: разбор json прерван - \"%s\" (%s)' % [err, headers])
return
var pp = ['DeviceDescription', 'DeviceName']
var ret_val = [null, false]
var pp_copy = pp.duplicate(true)
tools.get_value_by_path(json_parser.data, pp, ret_val)
if not ret_val[1]:
push_error('ошибка: путь %s не найден (%s)' % [pp_copy, headers])
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_parser.data, child, 'value0')
map_value_to_item(json_parser.data, child, 'value1')
map_value_to_item(json_parser.data, child, 'value2')
map_error_codes_to_item(json_parser.data, child, 'state')
for child in bort_rtr.get_node('antenna1/grid').get_children():
map_value_to_item(json_parser.data, child, 'value0')
map_value_to_item(json_parser.data, child, 'value1')
map_error_codes_to_item(json_parser.data, child, 'state')
for child in bort_rtr.get_node('antenna2/grid').get_children():
map_value_to_item(json_parser.data, child, 'value0')
map_value_to_item(json_parser.data, child, 'value1')
map_error_codes_to_item(json_parser.data, child, 'state')
for child in bort_rtr.get_children():
map_value_to_item(json_parser.data, child, 'value0')
map_value_to_item(json_parser.data, child, 'value1')
map_error_codes_to_item(json_parser.data, child, 'state')
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]
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 не найден' % [paths_copy, item.name, value_name])
## 1. Поле [b]'ErCode'[/b] содержит [b]0[/b] - если нет ошибки, и другое значение - если есть ошибка.[br]
## 2. Для каждого проверяемого параметра устройства есть своё поле [b]'ErCode'[/b].[br]
## 3. Есть только один индикатор исправности при отображении состояния устройства.[br]
## 4. [i]Нет результата порверки[/i] - поле [param state] принимает значение [b]0[/b], [i]всё
## исправно[/i] - [b]1[/b], [i]хотябы один[/i] параметр с ошибкой - [b]2[/b].[br]
func map_error_codes_to_item(data, item, value_name: StringName):
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]
var paths_copy = paths.duplicate(true)
tools.get_value_by_path(data, paths, ret_val)
if ret_val[1]:
values.append(int(ret_val[0]))
else:
push_error('ошибка: путь %s для $%s.%s не найден' % [paths_copy, item.name, value_name])
var test_res = 1 if values.count(int(0)) == values.size() else 2
item.set(value_name, test_res)
## Вызывается при клике мыши на элементе контроля.
## [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])