Merge remote-tracking branch 'origin/master' into master-prd

This commit is contained in:
Maxim
2025-08-15 17:48:22 +03:00
20 changed files with 109 additions and 170 deletions

View File

@@ -55,7 +55,7 @@ const UM_MAX: = 55.0
func _ready() -> void:
if Engine.is_editor_hint():
return
var settings_file = settings.get_settings_file_path()
var settings_file = get_settings_file_path()
var abs_path = ProjectSettings.globalize_path(settings_file)
log.info('Путь к файлу настроек: \"%s\"' % abs_path)
var file = FileAccess.open(settings_file, FileAccess.READ)

View File

@@ -24,7 +24,7 @@ class Unit extends Object:
var tx_tick: int = 0 ## Тик-время отправки буфера
var rx_tick: int = 0 ## Тик-время последнего приёма данных
var online: bool = false ## Состояние подключения устройства
var name: String = '<без имени>' ## Уникальное имя устройства
var name: StringName = '<без имени>' ## Уникальное имя устройства
func _init(nm) -> void: self.name = nm
func _to_string() -> String:
return String('Unit(\"%s\", %s)' % [self.name, 'на связи' if online else 'отключен'])

View File

@@ -2,11 +2,11 @@ class_name yau_07 extends Node
## Протокол ячейки ЯУ-07.
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, милисекунды
const RESEND_TIMEOUT = 300 ## Задержка для повторной отправки команды, милисекунды
const RESEND_TIMEOUT_FLASH = 1500 ## Задержка для повторной отправки команды флеш, милисекунды
const RETRY_COUNT = 5 ## Количество повторных отправок
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
const ONLINE_TIMEOUT: = 5000 ## Время ожидания пакета от ячейки, милисекунды
const RESEND_TIMEOUT: = 300 ## Задержка для повторной отправки команды, милисекунды
const RESEND_TIMEOUT_FLASH: = 1500 ## Задержка для повторной отправки команды флеш, милисекунды
const RETRY_COUNT: = 5 ## Количество повторных отправок
const BUFFER_SIZE: = 2048 ## Размер буфера для приёма датаграмм
## Ячейка ЯУ-07.
@@ -30,10 +30,10 @@ class YaU07 extends unit.Unit:
var cmd_num_rx: = 0 ## Номер команды принятый
var cmd_num_tx: = 0 ## Номер команды переданный
var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07
var cmd_retry: = RETRY_COUNT ## Счётчик оставшихся попыток выполнить команду
var cmd_code_rx = 0 ## Код последней выполненой команды
var cmd_code_tx = 0 ## Код последней отправленной команды
var cmd_code_rx: = 0 ## Код последней выполненой команды
var cmd_code_tx: = 0 ## Код последней отправленной команды
var cmd_tick_tx: = 0 ## Время последней отправки команды
var cmd_tick_rx: = 0 ## Время последнего приёма команды
var status: = PackedByteArray() ## Поле "состояние прибора"
@@ -46,7 +46,7 @@ class YaU07 extends unit.Unit:
func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm):
func _init(nm: StringName):
self.name = nm
tx_data.resize(BUFFER_SIZE)
tx_data.fill(0)
@@ -57,7 +57,7 @@ class YaU07 extends unit.Unit:
online = false
emit_signal('line_changed', self)
var rc = Error.ERR_BUSY
var rc: = Error.ERR_BUSY
if cmd_state == CmdState.SEND:
rc = Error.OK
cmd_tick_tx = tick
@@ -96,16 +96,16 @@ class YaU07 extends unit.Unit:
elif cmd_code == CmdCode.WRITE_FLASH:
tx_data.encode_u8(7, 1)
tx_data.encode_u16(8, 0)
tx_data.encode_u16(10, len(fl_data))
tx_len = 11 + len(fl_data) * 2
for i in len(fl_data):
tx_data.encode_u16(10, fl_data.size())
tx_len = 11 + fl_data.size() * 2
for i in fl_data.size():
tx_data.encode_u16(12 + i * 2, fl_data[i])
elif cmd_code == CmdCode.WRITE_FLASH_MP550:
tx_data.encode_u8(7, id_sector)
tx_data.encode_u16(8, 0)
tx_data.encode_u16(10, len(fl_data) * 2)
tx_len = 12 + len(fl_data) * 2
for i in len(fl_data):
tx_data.encode_u16(10, fl_data.size() * 2)
tx_len = 12 + fl_data.size() * 2
for i in fl_data.size():
tx_data.encode_u16(12 + i * 2, fl_data[i])
elif cmd_code == CmdCode.READ_FLASH:
tx_len = 11
@@ -130,7 +130,7 @@ class YaU07 extends unit.Unit:
cmd_num_tx = (cmd_num_rx + 1) % 0xffff
var ports_count = ports_data.size()
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)
@@ -191,49 +191,49 @@ class YaU07 extends unit.Unit:
## Возвращает - Код команды не найден, 0...255 - код команды.
func get_cmd_code(rx_data: PackedByteArray):
var rx_data_len = rx_data.size()
var rx_data_len: = rx_data.size()
if rx_data_len < 7:
return null
var status_len = rx_data.decode_u16(6) # Длина массива байтового "состояние прибора"
if rx_data_len <= (status_len + 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 # Положение в приёмном буфере "кода команды"
var cmd_code_pos: = status_len + 8 # Положение в приёмном буфере "кода команды"
if rx_data_len <= cmd_code_pos:
return null
return rx_data[cmd_code_pos] # "код команды"
return rx_data[cmd_code_pos] # "код команды"
func parse_isa(rx_data: PackedByteArray, status_len) -> bool:
var ports_count_pos = status_len + 10 # Положение в приёмном буфере количества портов
func parse_isa(rx_data: PackedByteArray, status_len: int) -> bool:
var ports_count_pos: = status_len + 10 # Положение в приёмном буфере количества портов
if rx_data.size() < ports_count_pos:
return false
var ports_count = rx_data[ports_count_pos] # Количество портов
var counted_len = status_len + (ports_count * 4) + 11 # Вычисленная длина пакета
var ports_count: = rx_data[ports_count_pos] # Количество портов
var counted_len: = status_len + (ports_count * 4) + 11 # Вычисленная длина пакета
if rx_data.size() < counted_len:
return false
var addr_pos = status_len + 11 # Смещение положения адреса в приёмном буфере
var data_pos = status_len + 13 # Смещение положения данных в приёмном буфере
var addr_pos: = status_len + 11 # Смещение положения адреса в приёмном буфере
var data_pos: = status_len + 13 # Смещение положения данных в приёмном буфере
var i: = 0
while i < ports_count:
var shift: = i * 4
if rx_data.size() < (data_pos + shift):
return false
var isa_addr = rx_data.decode_u16(addr_pos + shift) # Адрес порта ISA яу-07
var isa_data = rx_data.decode_u16(data_pos + shift) # Данные порта ISA яу-07
var isa_addr: = rx_data.decode_u16(addr_pos + shift) # Адрес порта ISA яу-07
var isa_data: = rx_data.decode_u16(data_pos + shift) # Данные порта ISA яу-07
isa_ports[isa_addr] = isa_data
i += 1
cmd_data = rx_data.slice(addr_pos, (addr_pos + ports_count * 4) - 1)
return i > 0
func parse_block(rx_data: PackedByteArray, status_len) -> bool:
var ports_count_pos = status_len + 7 # Положение в приёмном буфере количества портов
func parse_block(rx_data: PackedByteArray, status_len: int) -> bool:
var ports_count_pos: = status_len + 7 # Положение в приёмном буфере количества портов
if rx_data.size() < ports_count_pos:
return false
if rx_data.size() < (ports_count_pos + 5):
return false
var block_len = rx_data.decode_u16(ports_count_pos + 3)
var block_adr = rx_data.decode_u16(ports_count_pos + 5)
var block_data = []
var block_len: = rx_data.decode_u16(ports_count_pos + 3)
var block_adr: = rx_data.decode_u16(ports_count_pos + 5)
var block_data: = []
if rx_data.size() < (ports_count_pos + 7 + (block_len - 1) * 2):
return false
for i in block_len:
@@ -242,7 +242,7 @@ class YaU07 extends unit.Unit:
isa_block[block_adr] = block_data
return true
func parse_flash(rx_data: PackedByteArray, status_len, cmd_code) -> bool:
func parse_flash(rx_data: PackedByteArray, status_len: int, cmd_code: CmdCode) -> bool:
if cmd_code == CmdCode.READ_FLASH:
if rx_data.size() < (status_len + 14):
return false
@@ -268,7 +268,7 @@ class YaU07 extends unit.Unit:
online = true
emit_signal('line_changed', self)
var rx_data_len = rx_data.size()
var rx_data_len: int = rx_data.size()
if rx_data_len < 10:
return false
@@ -276,14 +276,14 @@ class YaU07 extends unit.Unit:
if cmd_state == CmdState.UNCK:
cmd_state = CmdState.DONE
var status_len = rx_data.decode_u16(6) # Длина массива байтового "состояние прибора"
var status_len: int = rx_data.decode_u16(6) # Длина массива байтового "состояние прибора"
if rx_data_len < (status_len + 6):
return false
var i: = 0
var len_rx_data: = rx_data.size()
status.resize(status_len)
while i < status_len:
var byte_i = i + 8
var byte_i: = i + 8
if byte_i < len_rx_data:
status[i] = rx_data[byte_i] # Массив байтовый "состояние прибора"
i += 1
@@ -292,11 +292,11 @@ class YaU07 extends unit.Unit:
if rx_data_len == (status_len + 6):
return true # Нет поля "ответ на команду", разбор пакета завершить
var cmd_code_pos = status_len + 8 # Положение в приёмном буфере "код команды"
var cmd_code_pos: = status_len + 8 # Положение в приёмном буфере "код команды"
if rx_data_len <= cmd_code_pos:
return false
var cmd_status_pos = status_len + 9 # Положение в приёмном буфере "состояния выполнения команды"
var cmd_status_pos: = status_len + 9 # Положение в приёмном буфере "состояния выполнения команды"
if rx_data_len <= cmd_status_pos:
return false
cmd_result = rx_data[cmd_status_pos]
@@ -304,7 +304,7 @@ class YaU07 extends unit.Unit:
return false
var cmd_code: CmdCode = rx_data[cmd_code_pos] as CmdCode # "код команды"
var rc = true
var rc: = true
if (cmd_code == CmdCode.READ_ISA) or (cmd_code == CmdCode.WRITE_ISA):
rc = parse_isa(rx_data, status_len)