diff --git a/scenes/scripts/yau07.gd b/scenes/scripts/yau07.gd index f0dc79a3..9a43cc56 100644 --- a/scenes/scripts/yau07.gd +++ b/scenes/scripts/yau07.gd @@ -2,10 +2,10 @@ extends Node ## Протокол ячейки ЯУ-07 -const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды const RETRY_COUNT = 5 ## Количество повторных отправок +const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм ## Ячейка ЯУ-07 @@ -13,41 +13,42 @@ class YaU07: ## Коды выполняемых команд enum CmdCode { + READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07 + WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07 + WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07 READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07 - READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07 - WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07 - WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07 } ## Состояние автомата выполнения команды enum CmdState { - DONE, ## Команда выполнена - FAIL, ## Команда не выполнена - SEND, ## Буфер готов для отправки UNCK, ## Номер команды не ининциирован - WAIT ## Ожидание выполнения + SEND, ## Буфер готов для отправки + WAIT, ## Ожидание выполнения + DONE, ## Команда выполнена + FAIL ## Команда не выполнена } + signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой signal command_done(unit: YaU07) ## Вызывается после выполнения команды signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена - signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой - signal parse_failed(unit: YaU07) ## Вызывается если возникла ошибка при разборе пакета + signal parse_failed(unit: YaU07) - var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07 - var cmd_num_rx: = 0 ## Номер команды принятый - var cmd_num_tx: = 0 ## Номер команды переданный - var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07 - var cmd_retry: = 0 ## Счётчик оставшихся попыток выполнить команду - var cmd_state: = CmdState.UNCK ## Состояние выполнения команды - var cmd_tick_rx: = 0 ## Время последнего приёма команды - var cmd_tick_tx: = 0 ## Время последней отправки команды - var isa_block: = {} ## Результат выполнения команды "читать массив из порта" - var isa_ports: = {} ## Результат выполнения команды "читать порт" - var name: = String() ## Имя - var online: = false ## Состояние связи с ячейкой - var status: = PackedByteArray() ## Поле "состояние прибора" - var tx_data: = PackedByteArray() ## Буфер отправленный - var tx_len: = 0 ## Длина последнего отправленного пакета + var name: = String() + 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_tick_rx = 0.0 ## Время последнего приёма команды + var status: = PackedByteArray() ## Поле "состояние прибора" + var tx_data: = PackedByteArray() ## Буфер отправленный + var tx_len = 0 ## Длина последнего отправленного пакета + var isa_ports = {} ## Результат выполнения команды "читать порт" + var isa_block = {} ## Результат выполнения команды "читать массив из порта" + var online = false ## Состояние связи с ячейкой func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) @@ -56,9 +57,11 @@ class YaU07: self.name = nm tx_data.resize(BUFFER_SIZE) tx_data.fill(0) + tick = 0.0 - func process(tick: float): + func process(delta: float): + tick += delta if online and ((tick - cmd_tick_rx) > ONLINE_TIMEOUT): online = false emit_signal('line_changed', self) @@ -94,7 +97,6 @@ class YaU07: var ports_count = ports_data.size() tx_len = ports_count * 2 + 8 - tx_data.encode_u16(0, cmd_retry) # Исправление для сетевого стека "nm-callback" процессоров STM tx_data.encode_u16(2, cmd_num_tx) if cmd_code == CmdCode.WRITE_ISA: @@ -131,18 +133,15 @@ class YaU07: tx_data.encode_u16(9, int(port[0])) cmd_state = CmdState.SEND return true - - - ## Возвращает код команды ЯУ-07. - ## [param rx_data] - Принятые данные.[br] - ## Возвращает [b]null[/b] - Если код команды не найден.[br] - ## Возвращает [b]0...255[/b] - Код команды.[br] + ## Возвращает код команды ЯУ-07 + ## rx_data - Принятые данные + ## Возвращает - Код команды не найден, 0...255 - код команды func get_cmd_code(rx_data: PackedByteArray): var rx_data_len = rx_data.size() if rx_data_len < 7: return null - var status_len = rx_data.decode_u16(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 # Положение в приёмном буфере "кода команды" @@ -187,10 +186,10 @@ class YaU07: ## Заполняет состояние прибора данными прочитанными из портов ЯУ-07 ## для команд "читать порты" или "записать порты"[br] - ## [param rx_data] - Принятые данные.[br] - ## Возвращает [b]true[/b] - Данные обработаны успешно.[br] - ## Возвращает [b]false[/b] - Данные не обработаны из за ошибки.[br] - func parse(rx_data: PackedByteArray, tick: int) -> bool: + ## [param rx_data] - Принятые данные[br] + ## Возвращает [b]true[/b] - Данные обработаны успешно[br] + ## Возвращает [b]false[/b] - Данные не обработаны из за ошибки[br] + func parse(rx_data: PackedByteArray) -> bool: cmd_tick_rx = tick @@ -199,7 +198,7 @@ class YaU07: emit_signal('line_changed', self) var rx_data_len = rx_data.size() - if rx_data_len < 11: + if rx_data_len < 10: return false cmd_num_rx = rx_data.decode_u16(2)