Рефактор. Имена общих сигналов в управляемой форме

This commit is contained in:
sasha80
2024-05-28 16:39:55 +03:00
parent d4fa7ba44b
commit 93f25b4e18
4 changed files with 128 additions and 7 deletions

View File

@@ -0,0 +1,76 @@
extends "res://scenes/контроль/прибор.gd"
static var json_parser: JSON = JSON.new()
func get_string_slice(s_in: String, s_out: Array, i0: int, i1: int):
for i in range(i0, i1):
if s_in[i] != '\'':
s_out[0] += s_in[i]
func get_paths(meta: String, paths: Array):
paths.clear()
var i_chs = []
for sep in ['[', ']', '.']:
var i = 0
while i != -1:
i = meta.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(meta, 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):
var rs = $request_rtr.get_result_string(result)
if result != 0:
log.error('ошибка при приёме: \"%s\"' % rs)
return
var json_str: String = body.get_string_from_utf8()
if not json_str:
return
var rc = json_parser.parse(json_str)
if rc != Error.OK:
var err = json_parser.get_error_message()
log.error('ошибка при разборе: \"%s\"' % err)
return
var paths: = Array()
var ret_val: = [null]
var meta: = String()
for child in $konverter/grid.get_children():
meta = child.get_meta('path_value0')
get_paths(meta, paths)
get_value_by_path(json_parser.data, paths, ret_val)
child.value0 = ret_val[0]
meta = child.get_meta('path_value1')
get_paths(meta, paths)
get_value_by_path(json_parser.data, paths, ret_val)
child.value1 = ret_val[0]
meta = child.get_meta('path_value2')
get_paths(meta, paths)
get_value_by_path(json_parser.data, paths, ret_val)
child.value2 = ret_val[0]
func get_value_by_path(obj, indexes: Array, ret_val: Array):
var index = indexes.pop_at(0)
if indexes.size():
get_value_by_path(obj[index], indexes, ret_val)
else:
ret_val[0] = obj[index]

View File

@@ -0,0 +1,43 @@
extends HTTPRequest
const RESULT_STRINGS = {
RESULT_SUCCESS: 'Request successful',
RESULT_CHUNKED_BODY_SIZE_MISMATCH: 'CHUNKED_BODY_SIZE_MISMATCH',
RESULT_CANT_CONNECT: 'Request failed while connecting',
RESULT_CANT_RESOLVE: 'Request failed while resolving',
RESULT_CONNECTION_ERROR: 'Request failed due to connection (read/write) error',
RESULT_TLS_HANDSHAKE_ERROR: 'Request failed on TLS handshake',
RESULT_NO_RESPONSE: 'Request does not have a response (yet)',
RESULT_BODY_SIZE_LIMIT_EXCEEDED: 'Request exceeded its maximum size limit, see body_size_limit',
RESULT_BODY_DECOMPRESS_FAILED: 'BODY_DECOMPRESS_FAILED',
RESULT_REQUEST_FAILED: 'Request failed (currently unused)',
RESULT_DOWNLOAD_FILE_CANT_OPEN: 'HTTPRequest couldn\'t open the download file',
RESULT_DOWNLOAD_FILE_WRITE_ERROR: 'HTTPRequest couldn\'t write to the download file',
RESULT_REDIRECT_LIMIT_REACHED: 'Request reached its maximum redirect limit, see max_redirects',
RESULT_TIMEOUT: 'TIMEOUT' }
var i_bort: int = 0
var addr_left: String
var addr_right: String
var request_period: float = 1.0
func get_result_string(result: Result):
return RESULT_STRINGS[result] if RESULT_STRINGS.has(result) else '<неизвестный код результата HTTPRequest - %d>' % result
func _ready():
addr_left = ProjectSettings.get_setting('application/config/unit_rr_left_bort')
addr_right = ProjectSettings.get_setting('application/config/unit_rr_right_bort')
request_period = ProjectSettings.get_setting('application/config/unit_rr_request_period')
func _on_request_timer():
var addr = [addr_left, addr_right][i_bort]
var rc = request(addr)
if rc != Error.OK:
var s: String = '%s: %s' % [error_string(rc), addr]
i_bort = (i_bort + 1) % 2

View File

@@ -27,13 +27,13 @@ func _ready() -> void:
log.info('Текущая версия ПО УАРЭП: %s' % commit.VCS_HEAD)
threats.connect('threat_new', Callable(self, 'on_threats_changed').bind('Цель обнаружена'))
threats.connect('threat_lost', Callable(self, 'on_threats_changed').bind('Цель потеряна'))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new').bind('Создан сеанс помехи'))
signaller.connect('interfer_off', Callable(self, 'on_interfer_off').bind('Сеанс помехи отключен'))
signaller.connect('режим_работа', Callable(log, 'info').bind('Программа в режиме \"Работа\"'))
signaller.connect('режимастройки', Callable(log, 'info').bind('Программа в режиме \"Настройки\"'))
signaller.connect('режим_эмс', Callable(log, 'info').bind('Программа в режиме \"ЭМС\"'))
signaller.connect('режимурнал', Callable(log, 'info').bind('Программа в режиме \"Журнал\"'))
signaller.connect('режимонтроль', Callable(log, 'info').bind('Программа в режиме \"Контроль\"'))
signaller.conn(signaller.interfer_new, Callable(self, 'on_interfer_new').bind('Создан сеанс помехи'))
signaller.conn(signaller.interfer_off, Callable(self, 'on_interfer_off').bind('Сеанс помехи отключен'))
signaller.conn(signaller.режим_работа, Callable(log, 'info').bind('Программа в режиме \"Работа\"'))
signaller.conn(signaller.режимастройки, Callable(log, 'info').bind('Программа в режиме \"Настройки\"'))
signaller.conn(signaller.режим_эмс, Callable(log, 'info').bind('Программа в режиме \"ЭМС\"'))
signaller.conn(signaller.режимурнал, Callable(log, 'info').bind('Программа в режиме \"Журнал\"'))
signaller.conn(signaller.режимонтроль, Callable(log, 'info').bind('Программа в режиме \"Контроль\"'))
func _on_clear_button_down() -> void:

View File

@@ -3,6 +3,8 @@ class_name Signaller extends Node
## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют
## два и более узла, из разных файлов. Должен быть помещён в автозагрузку.
func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl)
## Вызывается при переходе в режим [b]Работа[/b]
signal режим_работа()