61 lines
2.2 KiB
GDScript
61 lines
2.2 KiB
GDScript
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)
|
||
var current_10A = _device.get_isa_port(0x10A)
|
||
|
||
# Триггерим обновление через установку тех же значений
|
||
_device.set_isa_port(0x106, current_106)
|
||
_device.set_isa_port(0x108, current_108)
|
||
_device.set_isa_port(0x10A, current_10A)
|
||
|
||
# Универсальные методы для работы с битовыми полями
|
||
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_att1_status(status: int) -> void:
|
||
set_status_field(0x10A, status, 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)
|