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