Дорабтока атт и статус менеджера

This commit is contained in:
TotMaxim
2025-11-21 13:02:32 +03:00
parent 3648e740a0
commit 39bef3a351
5 changed files with 137 additions and 80 deletions

55
StatusManager.gd Normal file
View File

@@ -0,0 +1,55 @@
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)