diff --git a/scenes/pribor-rtr/pribor-rtr.gd b/scenes/pribor-rtr/pribor-rtr.gd new file mode 100644 index 00000000..a95a3d9e --- /dev/null +++ b/scenes/pribor-rtr/pribor-rtr.gd @@ -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] diff --git a/scenes/pribor-rtr/request-rtr.gd b/scenes/pribor-rtr/request-rtr.gd new file mode 100644 index 00000000..3b9254b7 --- /dev/null +++ b/scenes/pribor-rtr/request-rtr.gd @@ -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 diff --git a/scenes/журнал/журнал.gd b/scenes/журнал/журнал.gd index 340888f3..ad400e81 100644 --- a/scenes/журнал/журнал.gd +++ b/scenes/журнал/журнал.gd @@ -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: diff --git a/scripts/signaller.gd b/scripts/signaller.gd index f0ef23f9..4e14e72e 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -3,6 +3,8 @@ class_name Signaller extends Node ## Обмен сигналами между узлами. Здесь объявлены сигналы, которые используют ## два и более узла, из разных файлов. Должен быть помещён в автозагрузку. +func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl) + ## Вызывается при переходе в режим [b]Работа[/b] signal режим_работа()