diff --git a/scenes/pribor-afsp/pribor-afsp.gd b/scenes/pribor-afsp/pribor-afsp.gd index aa3441a6..76d0c09f 100644 --- a/scenes/pribor-afsp/pribor-afsp.gd +++ b/scenes/pribor-afsp/pribor-afsp.gd @@ -16,9 +16,9 @@ var ctrl_pos = 0 func _ready() -> void: # Подключаемся к сигналам в зависимости от борта if this_afsp_name == 'Устройство РР левого борта': - scouting.response_received_left.connect(_on_response_received) + scouting.response_received_afsp_left.connect(_on_response_received) else: - scouting.response_received_right.connect(_on_response_received) + scouting.response_received_afsp_right.connect(_on_response_received) # При старте отрисовываем последние данные (если есть) _on_press_device() @@ -124,13 +124,11 @@ func _on_press_device() -> void: var last_response = "" if this_afsp_name == 'Устройство РР левого борта': - has_data = scouting.has_left_success() - if has_data: - last_response = scouting.get_left_response() + has_data = scouting.has_afsp_left_success() + if has_data: last_response = scouting.get_afsp_left_response() else: - has_data = scouting.has_right_success() - if has_data: - last_response = scouting.get_right_response() + has_data = scouting.has_afsp_right_success() + if has_data: last_response = scouting.get_afsp_right_response() # Если есть данные - парсим и отображаем if has_data and not last_response.is_empty(): diff --git a/scenes/pribor-afsp/pribor-bpo.gd b/scenes/pribor-afsp/pribor-bpo.gd index 3976de05..55eae294 100644 --- a/scenes/pribor-afsp/pribor-bpo.gd +++ b/scenes/pribor-afsp/pribor-bpo.gd @@ -4,64 +4,53 @@ class_name pribor_rtr extends 'res://scenes/контроль/прибор.gd' @export var prefix_path: String = '' ## Должно быть в JSON @export var this_bpo1_name: String = '' ## Должно быть в JSON @export var this_bpo2_name: String = '' ## Должно быть в JSON -@export var unit_name1: StringName= '' ## Должно быть в settings.gd -@export var unit_name2: StringName= '' ## Должно быть в settings.gd +@export var unit_name1: StringName = '' ## Должно быть в settings.gd +@export var unit_name2: StringName = '' ## Должно быть в settings.gd @export var settings_path1_to_url: String = '' ## Должно быть в ProjectSettings @export var settings_path2_to_url: String = '' ## Должно быть в ProjectSettings @export var settings_path_to_wait_time: String = '' ## Должно быть в ProjectSettings -signal receive_response_afp_bpo() - static var json_conv: JSON = JSON.new() static var node_maper = load('res://scenes/контроль/node-maper.gd') -static var node_request_1: Node -static var node_request_timer_1: Node -static var node_request_2: Node -static var node_request_timer_2: Node - - var ctrl_pos = 110 var bort_to_node_name = {} var bort_to_unit_name = {} - - func _ready() -> void: - ProjectSettings.connect('settings_changed', on_settings_changed) - node_request_1 = $request1 - node_request_timer_1 = $request1/timer - node_request_2 = $request2 - node_request_timer_2 = $request2/timer + scouting.response_received_bpo_left.connect(_on_response_received_left) + scouting.response_received_bpo_right.connect(_on_response_received_right) + on_settings_changed() find_labels(self) - + + _on_press_device() func on_settings_changed(): bort_to_node_name.merge({this_bpo1_name: 'grid_bpo_a1', this_bpo2_name: 'grid_bpo_a2'}, true) - bort_to_unit_name.merge({this_bpo1_name: unit_name1, this_bpo2_name: unit_name2}) - node_request_1.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path1_to_url) - node_request_timer_1.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time)) - node_request_2.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path2_to_url) - node_request_timer_2.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time)) - assert(node_request_1.request_url != null) - assert(node_request_2.request_url != null) + bort_to_unit_name.merge({this_bpo1_name: unit_name1, this_bpo2_name: unit_name2}, true) - -func _on_request_completed(result, _response_code, headers, body: PackedByteArray): - if result != 0: - var rs = node_request_1.get_result_string(result) - push_error('\"%s\"' % rs) +# Обработка ответа от первого бпо +func _on_response_received_left(response: String, success: bool) -> void: + if not success: + log.error('Ошибка запроса или нет связи (левый): %s' % response) + _reset_grid('grid_bpo_a1') return + _parse_and_update_ui(response) - var json_str: = body.get_string_from_utf8() - if not json_str: - push_error('не удаётся получить строку из utf8-данных (%s)' % headers) +# Обработка ответа от второго бпо +func _on_response_received_right(response: String, success: bool) -> void: + if not success: + log.error('Ошибка запроса или нет связи (правый): %s' % response) + _reset_grid('grid_bpo_a2') return + _parse_and_update_ui(response) +# Оригинальный парсинг из _on_request_completed +func _parse_and_update_ui(json_str: String) -> void: 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]) + push_error('разбор json прерван - %s' % err) return var pp: = [] @@ -69,45 +58,96 @@ func _on_request_completed(result, _response_code, headers, body: PackedByteArra 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]): - push_error('не известное устройство: \"%s\"' % ret_val[0]) + var device_name: String = ret_val[0] + + if not bort_to_node_name.has(device_name): + push_error('не известное устройство: %s' % device_name) return - var node_name = bort_to_node_name[ret_val[0]] + var node_name = bort_to_node_name[device_name] var bort_node = get_node(node_name) - var unit_name = bort_to_unit_name[ret_val[0]] - var unit_instance = network.get_unit_instance(unit_name) - unit_instance.rx_tick = Time.get_ticks_msec() - if not unit_instance.online: - unit_instance.online = true - unit_instance.emit_signal('line_changed', unit_instance) - + # Обновляем UI только для конкретного грида for item in bort_node.get_children(): node_maper.map_value_to_item(json_conv.data, item, 'state') + # Обновляем групповые индикаторы + _update_group_indicators_original() + +# Оригинальное обновление групповых индикаторов +func _update_group_indicators_original() -> void: + # Сначала сбрасываем все + if has_node('yas_bpo_a1'): + $yas_bpo_a1.state = 0 + if has_node('yas_bpo_a2'): + $yas_bpo_a2.state = 0 + if has_node('mod_pit_g1'): + $mod_pit_g1.state = 0 + + # Проверяем обе группы и устанавливаем если есть активные var items = get_tree().get_nodes_in_group('управляется-по-шине-1') for node in items: - if node.state == 1: - $yas_bpo_a1.state = 1 + if node.has_method('get') and node.get('state') == 1: + if has_node('yas_bpo_a1'): + $yas_bpo_a1.state = 1 break + items = get_tree().get_nodes_in_group('управляется-по-шине-2') for node in items: - if node.state == 1: - $yas_bpo_a2.state = 1 + if node.has_method('get') and node.get('state') == 1: + if has_node('yas_bpo_a2'): + $yas_bpo_a2.state = 1 break + items = get_tree().get_nodes_in_group('потребитель-питания') for node in items: - if node.state == 1: - $mod_pit_g1.state = 1 + if node.has_method('get') and node.get('state') == 1: + if has_node('mod_pit_g1'): + $mod_pit_g1.state = 1 break - emit_signal('receive_response_afp_bpo') +# Сброс конкретного грида +func _reset_grid(grid_name: String) -> void: + if has_node(grid_name): + for item in get_node(grid_name).get_children(): + _reset_item_value(item) + _update_group_indicators_original() +# Сброс всех UI элементов в 0 (при отсутствии данных) +func _reset_ui_to_zero() -> void: + _reset_grid('grid_bpo_a1') + _reset_grid('grid_bpo_a2') + +# Сброс конкретного элемента в 0 +func _reset_item_value(item) -> void: + if item.has_method('set'): + item.set('value0', 0) + item.set('value1', 0) + item.set('value2', 0) + item.set('state', 0) + +# Отрисовывание при нажатии на прибор +func _on_press_device() -> void: + # Проверяем левый борт + if scouting.has_bpo_left_success(): + var response = scouting.get_bpo_left_response() + if not response.is_empty(): + _parse_and_update_ui(response) + else: + _reset_grid('grid_bpo_a1') + + # Проверяем правый борт + if scouting.has_bpo_right_success(): + var response = scouting.get_bpo_right_response() + if not response.is_empty(): + _parse_and_update_ui(response) + else: + _reset_grid('grid_bpo_a2') func find_labels(node1: Node): if node1 is Label: @@ -123,3 +163,9 @@ func find_labels(node1: Node): node1.set_meta('tooltip_set', true) for child in node1.get_children(): find_labels(child) + +## Вызывается при клике мыши на элементе. +func _on_item_pressed(block_a: Control): + var metas = block_a.get_meta_list() + for n in metas: + var _v = block_a.get_meta(n) diff --git a/scenes/pribor-afsp/pribor-bpo.tscn b/scenes/pribor-afsp/pribor-bpo.tscn index cae99bd9..cc461a69 100644 --- a/scenes/pribor-afsp/pribor-bpo.tscn +++ b/scenes/pribor-afsp/pribor-bpo.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=5 format=3 uid="uid://5uv1idl3lqea"] +[gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqea"] [ext_resource type="Script" uid="uid://d0jwv5opi3mrk" path="res://scenes/pribor-afsp/pribor-bpo.gd" id="1_bhc4e"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_jp6m0"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_jcpjs"] -[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="4_crej3"] [node name="pribor_bpo" type="Control"] layout_mode = 3 @@ -198,22 +197,3 @@ offset_bottom = 362.0 show_rname = false self_size = Vector2i(50, 145) fname = "Яч. связи" - -[node name="request1" type="HTTPRequest" parent="."] -use_threads = true -script = ExtResource("4_crej3") - -[node name="timer" type="Timer" parent="request1"] -autostart = true - -[node name="request2" type="HTTPRequest" parent="."] -use_threads = true -script = ExtResource("4_crej3") - -[node name="timer" type="Timer" parent="request2"] -autostart = true - -[connection signal="request_completed" from="request1" to="." method="_on_request_completed"] -[connection signal="timeout" from="request1/timer" to="request1" method="_on_request_timer"] -[connection signal="request_completed" from="request2" to="." method="_on_request_completed"] -[connection signal="timeout" from="request2/timer" to="request2" method="_on_request_timer"] diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index a640531d..11944fa8 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -123,10 +123,13 @@ func _ready(): signaller.conn(signaller.режим_настройки, on_mode_changed) signaller.conn(signaller.режим_эмс, on_mode_changed) signaller.connect('debag_control_pressed', Callable(self, 'on_debag_button_pressed')) - scouting.request_sent_left.connect(_on_request_sent_left.bind($pribor_afsp_1)) - scouting.response_received_left.connect(_on_response_received.bind($pribor_afsp_1)) - scouting.request_sent_right.connect(_on_request_sent_left.bind($pribor_afsp_2)) - scouting.response_received_right.connect(_on_response_received.bind($pribor_afsp_2)) + scouting.request_sent_afsp_left.connect(_on_request_sent_left.bind($pribor_afsp_1)) + scouting.response_received_afsp_left.connect(_on_response_received.bind($pribor_afsp_1)) + scouting.request_sent_afsp_right.connect(_on_request_sent_left.bind($pribor_afsp_2)) + scouting.response_received_afsp_right.connect(_on_response_received.bind($pribor_afsp_2)) + scouting.request_sent_bpo_left.connect(_on_request_sent_left.bind($pribor_rtr)) + scouting.response_received_bpo_left.connect(_on_response_received.bind($pribor_rtr)) + @@ -173,7 +176,7 @@ func on_pribor_press(pribor_path, header_text, pribor_node): update_pribor_items_visibility() -# Вызов при отправке запроса на селфтест АФСП +# Вызов при отправке запроса на селфтест АФСП и РТР func _on_request_sent_left(_url: String, node: Node) -> void: node.progress_max_value = 100 node.progress_value = 0 @@ -183,7 +186,7 @@ func _on_request_sent_left(_url: String, node: Node) -> void: func _on_response_received(_response: String, _success: bool, node: Node): node.progress_value = 100 - #node.progress_visible = false + node.progress_visible = false ## Прием сигналов о текущем состояниях приборах diff --git a/scripts/rtr.gd b/scripts/rtr.gd index 51530f94..5f7e18f2 100644 --- a/scripts/rtr.gd +++ b/scripts/rtr.gd @@ -2,22 +2,32 @@ class_name rtr extends Node #region Перечисления -enum State { IDLE, REQUESTING_LEFT, REQUESTING_RIGHT, WAITING_TIMEOUT } +enum State { + IDLE, + REQUESTING_AFSP_LEFT, + REQUESTING_AFSP_RIGHT, + REQUESTING_BPO_LEFT, + REQUESTING_BPO_RIGHT, + WAITING_TIMEOUT +} #endregion #region Сигналы # Сигналы отправки запроса -signal request_sent_left(url: String) # Отправлен запрос к левому борту -signal request_sent_right(url: String) # Отправлен запрос к правому борту +signal request_sent_afsp_left(url: String) +signal request_sent_afsp_right(url: String) +signal request_sent_bpo_left(url: String) +signal request_sent_bpo_right(url: String) # Сигналы получения ответа -signal response_received_left(response: String, success: bool) # Получен ответ от левого борта -signal response_received_right(response: String, success: bool) # Получен ответ от правого борта +signal response_received_afsp_left(response: String, success: bool) +signal response_received_afsp_right(response: String, success: bool) +signal response_received_bpo_left(response: String, success: bool) +signal response_received_bpo_right(response: String, success: bool) #endregion #region Константы -# Словарь с текстовым описанием кодов результатов HTTP запросов const RESULT_STRINGS = { HTTPRequest.Result.RESULT_SUCCESS: 'Запрос успешен', HTTPRequest.Result.RESULT_CHUNKED_BODY_SIZE_MISMATCH: 'Несоответствие размеров частей сообщения', @@ -37,157 +47,188 @@ const RESULT_STRINGS = { #endregion #region Переменные -var http_request: HTTPRequest # HTTP клиент для выполнения запросов -var addresses: Dictionary # Словарь с URL адресами устройств -var current_state: State = State.IDLE # Текущее состояние машины состояний -var current_url: String = '' # Текущий URL для запроса -var timeout_timer: Timer # Таймер ожидания ответа (30 секунд) +var http_request: HTTPRequest +var addresses: Dictionary +var current_state: State = State.IDLE +var current_url: String = '' +var timeout_timer: Timer -# Результаты запросов -var last_response_left: String = '' # Последний успешный ответ левого борта -var last_response_right: String = '' # Последний успешный ответ правого борта -var last_error_left: String = '' # Последняя ошибка левого борта -var last_error_right: String = '' # Последняя ошибка правого борта +# Результаты запросов АФСП +var last_response_afsp_left: String = '' +var last_response_afsp_right: String = '' +var last_error_afsp_left: String = '' +var last_error_afsp_right: String = '' + +# Результаты запросов БПО +var last_response_bpo_left: String = '' +var last_response_bpo_right: String = '' +var last_error_bpo_left: String = '' +var last_error_bpo_right: String = '' # Статус online для каждого борта -var online_left: bool = false -var online_right: bool = false +var online_afsp_left: bool = false +var online_afsp_right: bool = false +var online_bpo_left: bool = false +var online_bpo_right: bool = false # Время последнего успешного ответа -var last_success_time_left: int = 0 -var last_success_time_right: int = 0 +var last_success_time_afsp_left: int = 0 +var last_success_time_afsp_right: int = 0 +var last_success_time_bpo_left: int = 0 +var last_success_time_bpo_right: int = 0 var timeout: float +var current_device_type: String = '' # 'afsp' или 'bpo' #endregion #region Инициализация func _ready() -> void: - # Создаем и настраиваем HTTP клиент http_request = HTTPRequest.new() add_child(http_request) http_request.request_completed.connect(_on_request_completed) - # Создаем и настраиваем таймер для обработки таймаутов timeout_timer = Timer.new() add_child(timeout_timer) timeout_timer.timeout.connect(_on_timeout) timeout_timer.one_shot = true - # Подписываемся на сигнал запуска управления устройством signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device')) #endregion #region Публичные методы -# Возвращает текстовое описание кода результата HTTP запроса func get_result_string(result: int) -> String: return RESULT_STRINGS.get(result, '<неизвестный код результата HTTPRequest - %d>' % result) -# Геттеры для получения результатов запросов -func get_left_response() -> String: - return last_response_left +# Геттеры АФСП +func get_afsp_left_response() -> String: + return last_response_afsp_left -func get_right_response() -> String: - return last_response_right +func get_afsp_right_response() -> String: + return last_response_afsp_right -func get_left_error() -> String: - return last_error_left +func get_afsp_left_error() -> String: + return last_error_afsp_left -func get_right_error() -> String: - return last_error_right +func get_afsp_right_error() -> String: + return last_error_afsp_right -# Проверка успешности запросов -func has_left_success() -> bool: - return not last_response_left.is_empty() +func has_afsp_left_success() -> bool: + return not last_response_afsp_left.is_empty() -func has_right_success() -> bool: - return not last_response_right.is_empty() +func has_afsp_right_success() -> bool: + return not last_response_afsp_right.is_empty() -# Геттеры для статуса online -func is_left_online() -> bool: - return online_left +func is_afsp_left_online() -> bool: + return online_afsp_left -func is_right_online() -> bool: - return online_right +func is_afsp_right_online() -> bool: + return online_afsp_right + +# Геттеры БПО +func get_bpo_left_response() -> String: + return last_response_bpo_left + +func get_bpo_right_response() -> String: + return last_response_bpo_right + +func get_bpo_left_error() -> String: + return last_error_bpo_left + +func get_bpo_right_error() -> String: + return last_error_bpo_right + +func has_bpo_left_success() -> bool: + return not last_response_bpo_left.is_empty() + +func has_bpo_right_success() -> bool: + return not last_response_bpo_right.is_empty() + +func is_bpo_left_online() -> bool: + return online_bpo_left + +func is_bpo_right_online() -> bool: + return online_bpo_right # Обновление статуса online -func _update_online_status(side: String, is_online: bool) -> void: - var unit_instance +func _update_online_status(device: String, side: String, is_online: bool) -> void: + var unit_name = '' + if device == 'afsp': + unit_name = 'уарэп-афсп-' + ('левый' if side == 'left' else 'правый') + else: # bpo + unit_name = 'уарэп-бпо-' + ('1' if side == 'left' else '2') - # Выбираем нужный экземпляр в зависимости от борта - if side == "left": - unit_instance = network.get_unit_instance('уарэп-афсп-левый') - else: # side == "right" - unit_instance = network.get_unit_instance('уарэп-афсп-правый') - - # Обновляем статус если изменился - if unit_instance and unit_instance.online != is_online: - unit_instance.online = is_online - unit_instance.emit_signal('line_changed', unit_instance) + var unit_instance = network.get_unit_instance(unit_name) + if unit_instance: + unit_instance.rx_tick = Time.get_ticks_msec() + if unit_instance.online != is_online: + unit_instance.online = is_online + unit_instance.emit_signal('line_changed', unit_instance) #endregion #region Обработчики сигналов -# Сигнал от signaller - начало управления устройством func _on_start_contol_device() -> void: - # Если уже выполняется запрос - игнорируем if current_state != State.IDLE: return # Сбрасываем предыдущие результаты - last_response_left = '' - last_response_right = '' - last_error_left = '' - last_error_right = '' + last_response_afsp_left = '' + last_response_afsp_right = '' + last_error_afsp_left = '' + last_error_afsp_right = '' + last_response_bpo_left = '' + last_response_bpo_right = '' + last_error_bpo_left = '' + last_error_bpo_right = '' # Загружаем URL адреса из ProjectSettings addresses['Адрес АФСП левого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес АФСП левого борта') addresses['Адрес АФСП правого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес АФСП правого борта') addresses['Адрес БПО левого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес БПО левого борта') addresses['Адрес БПО правого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес БПО правого борта') + timeout = float(ProjectSettings.get_setting('application/config/%s' % 'Период опроса состояния АФСП, секунды')) - # Начинаем с запроса к левому борту - _request_next(State.REQUESTING_LEFT) + + # Начинаем с запроса к АФСП левого борта + _request_next(State.REQUESTING_AFSP_LEFT) -# Сигнал от HTTPRequest - получен ответ на запрос func _on_request_completed(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -> void: - # Если таймаут уже сработал - игнорируем ответ if current_state == State.WAITING_TIMEOUT: return - # Останавливаем таймер ожидания timeout_timer.stop() - var is_left = (current_state == State.REQUESTING_LEFT) var current_time = Time.get_ticks_msec() + var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT) + var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT) + var side_str = 'left' if is_left else 'right' + var device_str = 'afsp' if is_afsp else 'bpo' - # Проверяем успешность ответа if response_code == 200: var response_text = body.get_string_from_utf8() _save_response(response_text) - # Быстрый подсчёт для лога - var json = JSON.new() - if json.parse(response_text) == OK: - var data = json.data - var self_tests = data.get("SelfTest", []) - var total = 0 - var passed = 0 - for test in self_tests: - for system in test.get("SystemList", []): - for dev in system.get("DevList", []): - total += 1 - if dev.get("TestPassed", false): - passed += 1 - print("[rtr] Ответ от %s: %d/%d тестов пройдено" % ["левого" if is_left else "правого", passed, total]) - - # Обновляем статус online - if is_left: - last_success_time_left = current_time - _update_online_status("left", true) - emit_signal('response_received_left', response_text, true) + # Быстрый подсчёт только для АФСП + if is_afsp: + var json = JSON.new() + if json.parse(response_text) == OK: + var data = json.data + var self_tests = data.get('SelfTest', []) + var total = 0 + var passed = 0 + for test in self_tests: + for system in test.get('SystemList', []): + for dev in system.get('DevList', []): + total += 1 + if dev.get('TestPassed', false): + passed += 1 + print('[rtr] Ответ от АФСП %s: %d/%d тестов пройдено' % ['левого' if is_left else 'правого', passed, total]) else: - last_success_time_right = current_time - _update_online_status("right", true) - emit_signal('response_received_right', response_text, true) + print('[rtr] Ответ от БПО %s получен успешно' % ['левого' if is_left else 'правого']) + + # Обновляем статус online и время + _update_success_time(device_str, side_str, current_time) + _update_online_status(device_str, side_str, true) + _emit_response_signal(device_str, side_str, response_text, true) _on_request_finished() else: @@ -195,75 +236,75 @@ func _on_request_completed(result: int, response_code: int, _headers: PackedStri print_debug(error_msg) _save_error(error_msg) - # Обновляем статус online (ошибка) - if is_left: - _update_online_status("left", false) - emit_signal('response_received_left', error_msg, false) - else: - _update_online_status("right", false) - emit_signal('response_received_right', error_msg, false) + _update_online_status(device_str, side_str, false) + _emit_response_signal(device_str, side_str, error_msg, false) _on_request_finished() -# Сигнал от таймера - истекло время ожидания ответа func _on_timeout() -> void: - var was_left = (current_state == State.REQUESTING_LEFT) + var was_state = current_state current_state = State.WAITING_TIMEOUT http_request.cancel_request() + + var is_afsp = (was_state == State.REQUESTING_AFSP_LEFT or was_state == State.REQUESTING_AFSP_RIGHT) + var is_left = (was_state == State.REQUESTING_AFSP_LEFT or was_state == State.REQUESTING_BPO_LEFT) + var side_str = 'left' if is_left else 'right' + var device_str = 'afsp' if is_afsp else 'bpo' + var timeout_msg = 'Таймаут %.1f секунд - %s' % [timeout, get_result_string(HTTPRequest.Result.RESULT_TIMEOUT)] _save_error(timeout_msg) - # Обновляем статус online (таймаут = offline) - if was_left: - _update_online_status("left", false) - emit_signal('response_received_left', timeout_msg, false) - else: - _update_online_status("right", false) - emit_signal('response_received_right', timeout_msg, false) + + _update_online_status(device_str, side_str, false) + _emit_response_signal(device_str, side_str, timeout_msg, false) _on_request_finished() #endregion #region Управление запросами -# Переход к следующему запросу в очереди func _request_next(next_state: State) -> void: current_state = next_state + current_device_type = 'afsp' if (next_state == State.REQUESTING_AFSP_LEFT or next_state == State.REQUESTING_AFSP_RIGHT) else 'bpo' # Определяем URL для текущего состояния match current_state: - State.REQUESTING_LEFT: + State.REQUESTING_AFSP_LEFT: current_url = addresses.get('Адрес АФСП левого борта', '') - State.REQUESTING_RIGHT: + State.REQUESTING_AFSP_RIGHT: current_url = addresses.get('Адрес АФСП правого борта', '') + State.REQUESTING_BPO_LEFT: + current_url = addresses.get('Адрес БПО левого борта', '') + State.REQUESTING_BPO_RIGHT: + current_url = addresses.get('Адрес БПО правого борта', '') State.IDLE: return - # Проверяем, задан ли URL if current_url.is_empty(): print('URL не задан для ', current_state) var error_msg = 'URL не задан' _save_error(error_msg) - var is_left = (current_state == State.REQUESTING_LEFT) + var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT) + var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT) + var side_str = 'left' if is_left else 'right' + var device_str = 'afsp' if is_afsp else 'bpo' - # Испускаем сигнал с ошибкой - if is_left: - _update_online_status("left", false) - emit_signal('response_received_left', error_msg, false) - else: - _update_online_status("right", false) - emit_signal('response_received_right', error_msg, false) + _update_online_status(device_str, side_str, false) + _emit_response_signal(device_str, side_str, error_msg, false) _on_request_finished() return # Испускаем сигнал отправки запроса match current_state: - State.REQUESTING_LEFT: - emit_signal('request_sent_left', current_url) - State.REQUESTING_RIGHT: - emit_signal('request_sent_right', current_url) + State.REQUESTING_AFSP_LEFT: + emit_signal('request_sent_afsp_left', current_url) + State.REQUESTING_AFSP_RIGHT: + emit_signal('request_sent_afsp_right', current_url) + State.REQUESTING_BPO_LEFT: + emit_signal('request_sent_bpo_left', current_url) + State.REQUESTING_BPO_RIGHT: + emit_signal('request_sent_bpo_right', current_url) - # Запускаем таймер и отправляем запрос timeout_timer.start(timeout) var error = http_request.request(current_url) if error != OK: @@ -271,43 +312,72 @@ func _request_next(next_state: State) -> void: var error_msg = 'Ошибка запроса: ' + error_string(error) _save_error(error_msg) - var is_left = (current_state == State.REQUESTING_LEFT) + var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT) + var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT) + var side_str = 'left' if is_left else 'right' + var device_str = 'afsp' if is_afsp else 'bpo' - # Испускаем сигнал с ошибкой - if is_left: - _update_online_status("left", false) - emit_signal('response_received_left', error_msg, false) - else: - _update_online_status("right", false) - emit_signal('response_received_right', error_msg, false) + _update_online_status(device_str, side_str, false) + _emit_response_signal(device_str, side_str, error_msg, false) _on_request_finished() -# Обработка завершения текущего запроса (успех/ошибка/таймаут) func _on_request_finished() -> void: match current_state: - State.REQUESTING_LEFT: - # После левого борта переходим к правому - _request_next(State.REQUESTING_RIGHT) - State.REQUESTING_RIGHT, State.WAITING_TIMEOUT: - # После правого борта или таймаута возвращаемся в IDLE + State.REQUESTING_AFSP_LEFT: + _request_next(State.REQUESTING_AFSP_RIGHT) + State.REQUESTING_AFSP_RIGHT: + _request_next(State.REQUESTING_BPO_LEFT) + State.REQUESTING_BPO_LEFT: + _request_next(State.REQUESTING_BPO_RIGHT) + State.REQUESTING_BPO_RIGHT, State.WAITING_TIMEOUT: current_state = State.IDLE #endregion #region Сохранение результатов -# Сохраняет успешный ответ от устройства func _save_response(response: String) -> void: match current_state: - State.REQUESTING_LEFT: - last_response_left = response - State.REQUESTING_RIGHT: - last_response_right = response + State.REQUESTING_AFSP_LEFT: + last_response_afsp_left = response + State.REQUESTING_AFSP_RIGHT: + last_response_afsp_right = response + State.REQUESTING_BPO_LEFT: + last_response_bpo_left = response + State.REQUESTING_BPO_RIGHT: + last_response_bpo_right = response -# Сохраняет ошибку от устройства func _save_error(error: String) -> void: match current_state: - State.REQUESTING_LEFT: - last_error_left = error - State.REQUESTING_RIGHT: - last_error_right = error + State.REQUESTING_AFSP_LEFT: + last_error_afsp_left = error + State.REQUESTING_AFSP_RIGHT: + last_error_afsp_right = error + State.REQUESTING_BPO_LEFT: + last_error_bpo_left = error + State.REQUESTING_BPO_RIGHT: + last_error_bpo_right = error + +func _update_success_time(device: String, side: String, time: int) -> void: + if device == 'afsp': + if side == 'left': + last_success_time_afsp_left = time + else: + last_success_time_afsp_right = time + else: + if side == 'left': + last_success_time_bpo_left = time + else: + last_success_time_bpo_right = time + +func _emit_response_signal(device: String, side: String, response: String, success: bool) -> void: + if device == 'afsp': + if side == 'left': + emit_signal('response_received_afsp_left', response, success) + else: + emit_signal('response_received_afsp_right', response, success) + else: + if side == 'left': + emit_signal('response_received_bpo_left', response, success) + else: + emit_signal('response_received_bpo_right', response, success) #endregion