Отладка read_isa
This commit is contained in:
5
main.gd
5
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]:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user