From 3648e740a01b6f5bfe9d520fc82090e29d80d4a1 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Fri, 21 Nov 2025 00:49:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B0=20re?= =?UTF-8?q?ad=5Fisa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.gd | 5 +++++ udp_broadcast.gd | 55 +++++++++++++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/main.gd b/main.gd index 1592b71..9d47c5c 100644 --- a/main.gd +++ b/main.gd @@ -128,6 +128,11 @@ func _ready() -> void: _apply_default_data() +func _process(_delta: float) -> void: + for device in dictionary_yau07: + dictionary_yau07[device]._on_poll_timeout() + + func _exit_tree(): for device in dictionary_yau07: if dictionary_yau07[device]: diff --git a/udp_broadcast.gd b/udp_broadcast.gd index 24d9043..ac96470 100644 --- a/udp_broadcast.gd +++ b/udp_broadcast.gd @@ -39,16 +39,13 @@ const BROADCAST_ADDR: Array = [50000, "10.1.1.255"] # Приватные свойства var _socket: SocketUDP var _self_name: String +var _isa_ports: Dictionary = {} +var _written_isa_ports: Array = [] var _timer: Timer -var _poll_timer: Timer var _sockets_status_bit: int = 0 var _dkm_status_bit: int = 0 var _dry_contact_status_bit: int = 0xFF -var _dou_and_att_2_status_bit: Dictionary = {0x106: 0} -var _dou_and_att_3_status_bit: Dictionary = {0x108: 0} -var _isa_ports: Dictionary = {} var _cmd_number_count: int = 0 -var _written_isa_ports: Array = [] var _last_received_command: int = -1 @@ -75,6 +72,7 @@ func _init(name: String): _initialize_socket() _initialize_ukp_data() _initialize_timers() + _initialize_isa_ports() if not _bind_to_device_address(name): push_error("Не удалось инициализировать устройство: %s" % name) @@ -89,13 +87,13 @@ func _initialize_timers() -> void: """Инициализация таймеров""" # Таймер для широковещательной рассылки (3 раза в секунду) _timer = Timer.new() - _timer.wait_time = 1.0 / 3.0 + _timer.wait_time = 1.0 / 5.0 _timer.timeout.connect(_on_broadcast_timeout) # Таймер для частого опроса сокета (100 раз в секунду) - _poll_timer = Timer.new() - _poll_timer.wait_time = 0.01 - _poll_timer.timeout.connect(_on_poll_timeout) + #_poll_timer = Timer.new() + #_poll_timer.wait_time = 0.05 + #_poll_timer.timeout.connect(_on_poll_timeout) func _initialize_ukp_data() -> void: @@ -109,6 +107,14 @@ func _initialize_ukp_data() -> void: ukp1_data.fill(0) +func _initialize_isa_ports() -> void: + """Инициализация ISA портов начальными значениями""" + # Инициализируем порты, которые могут запрашиваться + set_isa_port(0x0106, 0) # DOU2 статус + set_isa_port(0x0108, 0) # DOU3 статус + set_isa_port(0x010A, 0) # ATT + + func _bind_to_device_address(device_name: String) -> bool: """Привязка к адресу устройства по его имени""" if not ADDRESS_LIST.has(device_name): @@ -144,23 +150,23 @@ func add_timers_to_scene(parent: Node) -> void: elif _timer.get_parent() != parent: push_warning("Таймер broadcast уже добавлен в другую сцену") - if not _poll_timer.get_parent(): - parent.add_child(_poll_timer) - elif _poll_timer.get_parent() != parent: - push_warning("Таймер poll уже добавлен в другую сцену") + #if not _poll_timer.get_parent(): + #parent.add_child(_poll_timer) + #elif _poll_timer.get_parent() != parent: + #push_warning("Таймер poll уже добавлен в другую сцену") func start_broadcast() -> void: """Запуск широковещательной рассылки и опроса сокета""" _timer.start() - _poll_timer.start() + #_poll_timer.start() print("Широковещательная рассылка запущена") func stop_broadcast() -> void: """Остановка широковещательной рассылки""" _timer.stop() - _poll_timer.stop() + #_poll_timer.stop() print("Широковещательная рассылка остановлена") @@ -196,23 +202,23 @@ func get_dkm_status() -> int: func set_dou2_status(status: int) -> void: """Установка статуса DOU""" var masked_status = status & 0b111 # Маска для первых 3 битов - _dou_and_att_2_status_bit[0x106] = masked_status + set_isa_port(0x106, masked_status) func get_dou2_status() -> int: """Получение статуса DOU""" - return _dou_and_att_2_status_bit[0x106] & 0b111 + return get_isa_port(0x106) & 0b111 func set_dou3_status(status: int) -> void: """Установка статуса DOU""" var masked_status = status & 0b111 # Маска для первых 3 битов - _dou_and_att_3_status_bit[0x108] = masked_status + set_isa_port(0x108, masked_status) func get_dou3_status() -> int: """Получение статуса DOU""" - return _dou_and_att_3_status_bit[0x108] & 0b111 + return get_isa_port(0x108) & 0b111 func set_ip_status(status: int)->void: @@ -420,9 +426,9 @@ func _handle_received_data(data: PackedByteArray, address: String, port: int) -> return var command_type = _get_command_type(data) + _cmd_number_count = data.decode_u16(2) if command_type == -1: # Проверяем на -1 вместо null return - _cmd_number_count = (_cmd_number_count + 1) & 0xFFFF _handle_isa_command(command_type, data, address, port) @@ -467,6 +473,12 @@ func _handle_read_isa_command(data: PackedByteArray, address: String, port: int) var port_data = _get_isa_ports_data(ports) print('Принята команда на чтение ISA портов от %s:%d: %s' % [address, port, port_data]) + _written_isa_ports = [] + for i in range(ports.size()): + _written_isa_ports.append([ports[i], port_data[i]]) + + # Отправляем ответ с данными запрошенных портов + _send_immediate_response(address, port) func _handle_write_isa_command(data: PackedByteArray, address: String, port: int) -> void: @@ -500,7 +512,6 @@ func _handle_write_isa_command(data: PackedByteArray, address: String, port: int _written_isa_ports.append([port_addr, value]) # Добавляем новый порт added_ports += 1 - # Выводим суммарное сообщение вместо спама для каждого порта if added_ports > 0 or updated_ports > 0: print("Обработана команда записи от %s:%d - добавлено: %d, обновлено: %d портов" % [address, port, added_ports, updated_ports]) @@ -524,7 +535,7 @@ func _parse_command_ports(data: PackedByteArray) -> Array: for i in range(ports_count): var port_address = data.decode_u16(8 + i * 2) ports.append(port_address) - print("Порт %d: 0x%04X" % [i, port_address]) + print("Порт %d: 0x%03X" % [i, port_address]) return ports