Отладка read_isa
This commit is contained in:
5
main.gd
5
main.gd
@@ -128,6 +128,11 @@ func _ready() -> void:
|
|||||||
_apply_default_data()
|
_apply_default_data()
|
||||||
|
|
||||||
|
|
||||||
|
func _process(_delta: float) -> void:
|
||||||
|
for device in dictionary_yau07:
|
||||||
|
dictionary_yau07[device]._on_poll_timeout()
|
||||||
|
|
||||||
|
|
||||||
func _exit_tree():
|
func _exit_tree():
|
||||||
for device in dictionary_yau07:
|
for device in dictionary_yau07:
|
||||||
if dictionary_yau07[device]:
|
if dictionary_yau07[device]:
|
||||||
|
|||||||
@@ -39,16 +39,13 @@ const BROADCAST_ADDR: Array = [50000, "10.1.1.255"]
|
|||||||
# Приватные свойства
|
# Приватные свойства
|
||||||
var _socket: SocketUDP
|
var _socket: SocketUDP
|
||||||
var _self_name: String
|
var _self_name: String
|
||||||
|
var _isa_ports: Dictionary = {}
|
||||||
|
var _written_isa_ports: Array = []
|
||||||
var _timer: Timer
|
var _timer: Timer
|
||||||
var _poll_timer: Timer
|
|
||||||
var _sockets_status_bit: int = 0
|
var _sockets_status_bit: int = 0
|
||||||
var _dkm_status_bit: int = 0
|
var _dkm_status_bit: int = 0
|
||||||
var _dry_contact_status_bit: int = 0xFF
|
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 _cmd_number_count: int = 0
|
||||||
var _written_isa_ports: Array = []
|
|
||||||
var _last_received_command: int = -1
|
var _last_received_command: int = -1
|
||||||
|
|
||||||
|
|
||||||
@@ -75,6 +72,7 @@ func _init(name: String):
|
|||||||
_initialize_socket()
|
_initialize_socket()
|
||||||
_initialize_ukp_data()
|
_initialize_ukp_data()
|
||||||
_initialize_timers()
|
_initialize_timers()
|
||||||
|
_initialize_isa_ports()
|
||||||
|
|
||||||
if not _bind_to_device_address(name):
|
if not _bind_to_device_address(name):
|
||||||
push_error("Не удалось инициализировать устройство: %s" % name)
|
push_error("Не удалось инициализировать устройство: %s" % name)
|
||||||
@@ -89,13 +87,13 @@ func _initialize_timers() -> void:
|
|||||||
"""Инициализация таймеров"""
|
"""Инициализация таймеров"""
|
||||||
# Таймер для широковещательной рассылки (3 раза в секунду)
|
# Таймер для широковещательной рассылки (3 раза в секунду)
|
||||||
_timer = Timer.new()
|
_timer = Timer.new()
|
||||||
_timer.wait_time = 1.0 / 3.0
|
_timer.wait_time = 1.0 / 5.0
|
||||||
_timer.timeout.connect(_on_broadcast_timeout)
|
_timer.timeout.connect(_on_broadcast_timeout)
|
||||||
|
|
||||||
# Таймер для частого опроса сокета (100 раз в секунду)
|
# Таймер для частого опроса сокета (100 раз в секунду)
|
||||||
_poll_timer = Timer.new()
|
#_poll_timer = Timer.new()
|
||||||
_poll_timer.wait_time = 0.01
|
#_poll_timer.wait_time = 0.05
|
||||||
_poll_timer.timeout.connect(_on_poll_timeout)
|
#_poll_timer.timeout.connect(_on_poll_timeout)
|
||||||
|
|
||||||
|
|
||||||
func _initialize_ukp_data() -> void:
|
func _initialize_ukp_data() -> void:
|
||||||
@@ -109,6 +107,14 @@ func _initialize_ukp_data() -> void:
|
|||||||
ukp1_data.fill(0)
|
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:
|
func _bind_to_device_address(device_name: String) -> bool:
|
||||||
"""Привязка к адресу устройства по его имени"""
|
"""Привязка к адресу устройства по его имени"""
|
||||||
if not ADDRESS_LIST.has(device_name):
|
if not ADDRESS_LIST.has(device_name):
|
||||||
@@ -144,23 +150,23 @@ func add_timers_to_scene(parent: Node) -> void:
|
|||||||
elif _timer.get_parent() != parent:
|
elif _timer.get_parent() != parent:
|
||||||
push_warning("Таймер broadcast уже добавлен в другую сцену")
|
push_warning("Таймер broadcast уже добавлен в другую сцену")
|
||||||
|
|
||||||
if not _poll_timer.get_parent():
|
#if not _poll_timer.get_parent():
|
||||||
parent.add_child(_poll_timer)
|
#parent.add_child(_poll_timer)
|
||||||
elif _poll_timer.get_parent() != parent:
|
#elif _poll_timer.get_parent() != parent:
|
||||||
push_warning("Таймер poll уже добавлен в другую сцену")
|
#push_warning("Таймер poll уже добавлен в другую сцену")
|
||||||
|
|
||||||
|
|
||||||
func start_broadcast() -> void:
|
func start_broadcast() -> void:
|
||||||
"""Запуск широковещательной рассылки и опроса сокета"""
|
"""Запуск широковещательной рассылки и опроса сокета"""
|
||||||
_timer.start()
|
_timer.start()
|
||||||
_poll_timer.start()
|
#_poll_timer.start()
|
||||||
print("Широковещательная рассылка запущена")
|
print("Широковещательная рассылка запущена")
|
||||||
|
|
||||||
|
|
||||||
func stop_broadcast() -> void:
|
func stop_broadcast() -> void:
|
||||||
"""Остановка широковещательной рассылки"""
|
"""Остановка широковещательной рассылки"""
|
||||||
_timer.stop()
|
_timer.stop()
|
||||||
_poll_timer.stop()
|
#_poll_timer.stop()
|
||||||
print("Широковещательная рассылка остановлена")
|
print("Широковещательная рассылка остановлена")
|
||||||
|
|
||||||
|
|
||||||
@@ -196,23 +202,23 @@ func get_dkm_status() -> int:
|
|||||||
func set_dou2_status(status: int) -> void:
|
func set_dou2_status(status: int) -> void:
|
||||||
"""Установка статуса DOU"""
|
"""Установка статуса DOU"""
|
||||||
var masked_status = status & 0b111 # Маска для первых 3 битов
|
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:
|
func get_dou2_status() -> int:
|
||||||
"""Получение статуса DOU"""
|
"""Получение статуса DOU"""
|
||||||
return _dou_and_att_2_status_bit[0x106] & 0b111
|
return get_isa_port(0x106) & 0b111
|
||||||
|
|
||||||
|
|
||||||
func set_dou3_status(status: int) -> void:
|
func set_dou3_status(status: int) -> void:
|
||||||
"""Установка статуса DOU"""
|
"""Установка статуса DOU"""
|
||||||
var masked_status = status & 0b111 # Маска для первых 3 битов
|
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:
|
func get_dou3_status() -> int:
|
||||||
"""Получение статуса DOU"""
|
"""Получение статуса DOU"""
|
||||||
return _dou_and_att_3_status_bit[0x108] & 0b111
|
return get_isa_port(0x108) & 0b111
|
||||||
|
|
||||||
|
|
||||||
func set_ip_status(status: int)->void:
|
func set_ip_status(status: int)->void:
|
||||||
@@ -420,9 +426,9 @@ func _handle_received_data(data: PackedByteArray, address: String, port: int) ->
|
|||||||
return
|
return
|
||||||
|
|
||||||
var command_type = _get_command_type(data)
|
var command_type = _get_command_type(data)
|
||||||
|
_cmd_number_count = data.decode_u16(2)
|
||||||
if command_type == -1: # Проверяем на -1 вместо null
|
if command_type == -1: # Проверяем на -1 вместо null
|
||||||
return
|
return
|
||||||
_cmd_number_count = (_cmd_number_count + 1) & 0xFFFF
|
|
||||||
_handle_isa_command(command_type, data, address, port)
|
_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)
|
var port_data = _get_isa_ports_data(ports)
|
||||||
print('Принята команда на чтение ISA портов от %s:%d: %s' % [address, port, port_data])
|
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:
|
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]) # Добавляем новый порт
|
_written_isa_ports.append([port_addr, value]) # Добавляем новый порт
|
||||||
added_ports += 1
|
added_ports += 1
|
||||||
|
|
||||||
# Выводим суммарное сообщение вместо спама для каждого порта
|
|
||||||
if added_ports > 0 or updated_ports > 0:
|
if added_ports > 0 or updated_ports > 0:
|
||||||
print("Обработана команда записи от %s:%d - добавлено: %d, обновлено: %d портов" % [address, port, added_ports, updated_ports])
|
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):
|
for i in range(ports_count):
|
||||||
var port_address = data.decode_u16(8 + i * 2)
|
var port_address = data.decode_u16(8 + i * 2)
|
||||||
ports.append(port_address)
|
ports.append(port_address)
|
||||||
print("Порт %d: 0x%04X" % [i, port_address])
|
print("Порт %d: 0x%03X" % [i, port_address])
|
||||||
|
|
||||||
return ports
|
return ports
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user