class_name StatusManager extends RefCounted var _device func _init(device): _device = device Callable(_emit_initial_ports).call_deferred() func _emit_initial_ports() -> void: """Вывод начального состояния через существующий сигнал UDPBroadcast""" # Просто устанавливаем текущие значения (это вызовет update_isa_ports) var current_106 = _device.get_isa_port(0x106) var current_108 = _device.get_isa_port(0x108) # Триггерим обновление через установку тех же значений _device.set_isa_port(0x106, current_106) _device.set_isa_port(0x108, current_108) # Универсальные методы для работы с битовыми полями func set_status_field(port: int, value: int, bit_mask: int, shift: int = 0) -> void: var current_value = _device.get_isa_port(port) var masked_value = (value & bit_mask) << shift var clear_mask = ~(bit_mask << shift) & 0xFF var new_value = (current_value & clear_mask) | masked_value _device.set_isa_port(port, new_value) func get_status_field(port: int, bit_mask: int, shift: int = 0) -> int: return (_device.get_isa_port(port) >> shift) & bit_mask # Специфичные методы для каждого статуса func set_dou2_status(status: int) -> void: set_status_field(0x106, status, 0b111, 0) func get_dou2_status() -> int: return get_status_field(0x106, 0b111, 0) func set_att2_status(status: int) -> void: set_status_field(0x106, status, 0b111, 3) func get_att2_status() -> int: return get_status_field(0x106, 0b111, 3) func set_dou3_status(status: int) -> void: set_status_field(0x108, status, 0b111, 0) func get_dou3_status() -> int: return get_status_field(0x108, 0b111, 0) func set_att3_status(status: int) -> void: set_status_field(0x108, status, 0b111, 3) func get_att3_status() -> int: return get_status_field(0x108, 0b111, 3)