From 7444109bf111cf9f434504fc34425fba6b5fdf07 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 5 Sep 2023 09:36:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/работа.gd | 7 +++---- scripts/interfer.gd | 12 +++++++----- scripts/repnetwork.gd | 4 +++- scripts/yau07.gd | 45 ++++++++++++++++++++++--------------------- 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/scenes/работа.gd b/scenes/работа.gd index b27925e6..77673878 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -181,8 +181,7 @@ func _input(event) -> void: ## Переключает режим окна программы полный - обычный экран func toggle_full_screen(id: int) -> void: var mode = DisplayServer.window_get_mode(id) - if mode == DisplayServer.WINDOW_MODE_FULLSCREEN: - mode = DisplayServer.WINDOW_MODE_WINDOWED - else: - mode = DisplayServer.WINDOW_MODE_FULLSCREEN + mode = DisplayServer.WINDOW_MODE_WINDOWED \ + if mode == DisplayServer.WINDOW_MODE_FULLSCREEN \ + else DisplayServer.WINDOW_MODE_FULLSCREEN DisplayServer.window_set_mode(mode, id) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 8559e3a5..ccede7aa 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -32,7 +32,7 @@ class Interfer: var ss: int = 0 ## Счётчик сообщений var ispp: int = 0 ## Индекс сеанса. var state: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE] - var krp: String = '' ## Тип помехи. Возможные значения в [param ITERFER_MODE] + var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE] var powp: float = 0.0 ## Мощность излучения выраженная в процентах var kni: = 0.0 ## Курсовой угол направления излучения var params: = {} ## Параметры помехи @@ -45,9 +45,12 @@ class Interfer: names.any(func(vn): if dic.has(vn): set(vn, dic[vn]); return false) -signal interfer_preparing(ecm: Interfer) -signal interfer_run(ecm: Interfer) -signal interfer_error(ecm: Interfer, msg: String) +signal interfer_preparing(ecm: Interfer) ## Вызывается при запуске помехи +signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи +signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке +signal interfer_update(ecm: Interfer) ## Вызывается при обновлении помехи +signal interfer_new(ecm: Interfer) ## Вызывается при новой помехе +signal interfer_resized(ecms: Dictionary) ## Вызывается при изменении количества сеансов помех ## Производит приём состояния помех. [param unit] -> [param ecms] @@ -55,7 +58,6 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): if not unit.json_dic.has('ts'): return if not (unit.json_dic['ts'] is int): return if unit.json_dic['ts'] != 5: return - if not unit.json_dic.has('msvk'): return if not (unit.json_dic['msvk'] is Array): return diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 4a2510be..5af32394 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -1,13 +1,15 @@ extends Node +const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb} + + class Socket extends PacketPeerUDP: func send_to(addr, data): self.set_dest_address(addr[0], addr[1]) self.put_packet(data) -const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb} var poll_sockets: Array[Socket] var units: Dictionary var sock_unicast: Socket diff --git a/scripts/yau07.gd b/scripts/yau07.gd index d1ca8483..e71e40a4 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -2,10 +2,10 @@ extends Node ## Протокол ячейки ЯУ-07 -const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, секунды -const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды +const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм, байты +const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, мс +const RESEND_TIMEOUT = 300 ## Задержка для повторной отправки команды, мс const RETRY_COUNT = 5 ## Количество повторных отправок -const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм ## Ячейка ЯУ-07 @@ -19,32 +19,32 @@ class YaU07: ## Состояние автомата выполнения команды enum CmdState { - UNCK, ## Номер команды не ининциирован - SEND, ## Буфер готов для отправки - WAIT, ## Ожидание выполнения DONE, ## Команда выполнена - FAIL ## Команда не выполнена + FAIL, ## Команда не выполнена + SEND, ## Буфер готов для отправки + UNCK, ## Номер команды не ининциирован + WAIT ## Ожидание выполнения } signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой signal command_done(unit: YaU07) ## Вызывается после выполнения команды signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена - var name: = String() + var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07 var cmd_num_rx: = 0 ## Номер команды принятый var cmd_num_tx: = 0 ## Номер команды переданный - var cmd_state = CmdState.UNCK ## Состояние выполнения команды var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07 - var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07 var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду - var tick = 0.0 ## Текущее тик-время в мс - var cmd_tick_tx = 0.0 ## Время последней отправки команды + var cmd_state = CmdState.UNCK ## Состояние выполнения команды var cmd_tick_rx = 0.0 ## Время последнего приёма команды + var cmd_tick_tx = 0.0 ## Время последней отправки команды + var isa_ports = {} ## Результат выполнения команды "читать порт" + var name: = String() ## Имя + var online = false ## Состояние связи с ячейкой var status: = PackedByteArray() ## Поле "состояние прибора" + var tick = 0.0 ## Текущее тик-время в мс var tx_data: = [] ## Буфер отправленный var tx_len = 0 ## Длина последнего отправленного пакета - var isa_ports = {} ## Результат выполнения команды "читать порт" - var online = false ## Состояние связи с ячейкой func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) @@ -56,8 +56,8 @@ class YaU07: tick = 0.0 - func process(delta: float): - tick += delta + func process(t: int): + tick = t if online and ((tick - cmd_tick_rx) > ONLINE_TIMEOUT): online = false emit_signal('line_changed', self) @@ -81,7 +81,7 @@ class YaU07: return rc - func send_isa(cmd_code: int, ports_data: Array) -> bool: + func send_isa(cmd_code: int, ports_data: PackedByteArray) -> bool: if (cmd_state == CmdState.WAIT) \ or (cmd_state == CmdState.SEND) \ or (cmd_state == CmdState.UNCK): @@ -93,7 +93,7 @@ class YaU07: var ports_count = ports_data.size() tx_len = ports_count * 2 + 8 - Tools.set_wordi(tx_data, 2, cmd_num_tx) + tx_data.encode_u16(2, cmd_num_tx) if cmd_code == CmdCode.WRITE_ISA: ports_count /= 2 @@ -109,14 +109,15 @@ class YaU07: ## Возвращает код команды ЯУ-07 - ## rx_data - Принятые данные - ## Возвращает - Код команды не найден, 0...255 - код команды - func get_cmd_code(rx_data): + ## [param rx_data] - Принятые данные[br] + ## Возвращает [b]null[/b] - Если код команды не найден[br] + ## Возвращает [b]0...255[/b] - Код команды + func get_cmd_code(rx_data: PackedByteArray): var rx_data_len = rx_data.size() if rx_data_len < 7: return null - var status_len = Tools.ibytes_to_word(rx_data, 6) # Длина массива байтового "состояние прибора" + var status_len = rx_data.decode_u16(6) # Длина массива байтового "состояние прибора" if rx_data_len <= (status_len + 6): # Нет поля "ответ на команду", разбор пакета завершить return null var cmd_code_pos = status_len + 8 # Положение в приёмном буфере "кода команды"