Files
imitator-case-y5/main.gd

205 lines
8.9 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Control
const BUFFER_SIZE = 32
var dictionary_yau07: Dictionary
var udp_broadcast: UDPBroadcast
var dictionary_sockets_bit: Dictionary ## Байт 8 для отправки о состоянии ячеек
func _ready() -> void:
var device_yau07: Array = get_tree().get_nodes_in_group('device-addr')
for device in device_yau07:
device.connect('toggled', on_modify_device.bind(device.get_meta('device')))
var sockets: Array = get_tree().get_nodes_in_group('socket')
for soc in sockets:
soc.connect('toggled', _on_modify_sockets.bind(soc.get_meta('bit'), soc.get_meta('device'))) ## Мета bit от 0 до 3, мета ПРД
var power_ukp_arr_node: Array = get_tree().get_nodes_in_group('power_ukp')
for socket_power in power_ukp_arr_node:
socket_power.connect('text_submitted', _on_ukp_submitted.bind(socket_power.get_meta('device')))
var temperature_ukp_arr_node: Array = get_tree().get_nodes_in_group('temperature_ukp')
for socket_temp in temperature_ukp_arr_node:
socket_temp.connect('text_submitted', _on_ukp_submitted.bind(socket_temp.get_meta('device')))
var dkm_arr_node: Array = get_tree().get_nodes_in_group('dkm')
for dkm in dkm_arr_node:
dkm.connect('toggled', _on_modify_dkm.bind(dkm.get_meta('bit'), dkm.get_meta('device')))
func _exit_tree():
for device in dictionary_yau07:
if dictionary_yau07[device]:
dictionary_yau07[device].close_udp_unit()
func on_modify_device(toggled: bool, name_device: String) -> void:
if toggled:
udp_broadcast = UDPBroadcast.new(name_device)
udp_broadcast.add_timers_to_scene(self) # Исправлено имя метода
udp_broadcast.start_broadcast()
dictionary_yau07[name_device] = udp_broadcast
print("Устройство %s активировано" % name_device)
else:
if dictionary_yau07.has(name_device) and dictionary_yau07[name_device]:
dictionary_yau07[name_device].close_udp_unit()
dictionary_yau07.erase(name_device)
print("Устройство %s деактивировано" % name_device)
## Функция для установки статусов ячеек на связи (УГ, ЭМС-Г, УКП)
func _on_modify_sockets(toggled: bool, bit: int, device: String)->void:
if dictionary_yau07.has(device):
var udp_unit = dictionary_yau07[device]
var current_status = udp_unit.get_sockets_status() # Используем геттер
var new_status = _set_bit(current_status, bit, toggled)
udp_unit.set_sockets_status(new_status) # Используем сеттер
print("Статус сокетов устройства %s обновлен: 0x%04X" % [device, new_status])
## Функция для установки статусов ДКМ в ПРД
func _on_modify_dkm(toggled: bool, bit: int, device: String)->void:
if dictionary_yau07.has(device):
var udp_unit = dictionary_yau07[device]
var current_status = udp_unit.get_dkm_status() # Используем геттер
var new_status = _set_bit(current_status, bit, toggled)
udp_unit.set_dkm_status(new_status) # Используем сеттер
print("Статус DKM устройства %s обновлен: 0x%04X" % [device, new_status])
## Функция для установки значений в ячейках УКП
func _on_ukp_submitted(_new_text: String, device: String) -> void:
if not dictionary_yau07.has(device):
return
var prep_temperature_ukp1_array: Array = _on_text_temperature_changed(device, 1)
var prep_temperature_ukp2_array: Array = _on_text_temperature_changed(device, 2)
var prep_power_ukp1_array: Array = _on_text_power_changed(device, 1)
var prep_power_ukp2_array: Array = _on_text_power_changed(device, 2)
var combine_data_ukp1: Array = _combine_arrays(prep_temperature_ukp1_array, prep_power_ukp1_array)
var combine_data_ukp2: Array = _combine_arrays(prep_temperature_ukp2_array, prep_power_ukp2_array)
_form_buffers(device, combine_data_ukp1, 1, dictionary_yau07)
_form_buffers(device, combine_data_ukp2, 2, dictionary_yau07)
func _on_text_temperature_changed(device: String, number_device: int) -> Array:
return _process_ukp_data(device, number_device, "temperature_ukp", _convert_temperature)
func _on_text_power_changed(device: String, number_device: int) -> Array:
return _process_ukp_data(device, number_device, "power_ukp", _convert_power)
func _process_ukp_data(device: String, number_device: int, group_name: String, converter: Callable) -> Array:
var prd_module_arr = get_tree().get_nodes_in_group('prd')
var current_change: Array = _get_ukp_nodes_for_device(device, prd_module_arr, group_name)
var result_arr: Array = [0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff]
var config: Dictionary = _get_ukp_config(device, number_device)
for i in range(config.start_index, config.end_index):
if i < current_change.size() and not current_change[i].text.is_empty():
var value = _safe_convert_to_int(current_change[i].text)
var offset: int = config.offset if i == config.end_index-1 else 0
var result_index = i - config.start_index + offset
if result_index < result_arr.size():
result_arr[result_index] = converter.call(value)
return result_arr
static func _get_ukp_nodes_for_device(device: String, prd_module_arr: Array, group_name: String) -> Array:
for prd in prd_module_arr:
if device == prd.get_meta('yau07'):
var nodes = []
for node in prd.get_tree().get_nodes_in_group(group_name):
if prd.is_ancestor_of(node):
nodes.append(node)
return nodes
return []
static func _get_ukp_config(device: String, number_device: int) -> Dictionary:
var is_k_device = device in ['ПРД-К1', 'ПРД-К2', 'ПРД-К3', 'ПРД-К4']
if number_device == 1:
return {
"start_index": 0,
"end_index": 7 if is_k_device else 6,
"offset": 1 if is_k_device else 0
}
else:
return {
"start_index": 7 if is_k_device else 6,
"end_index": 13 if is_k_device else 12,
"offset": 0
}
static func _convert_temperature(value: int) -> int:
const CONST_MIN_TEMP: int = -25
const MAXIMUM_CODE_ADC: int = 3796
const MINIMUM_CODE_AD: int = 2660
const TEMP: float = 115.0 / (MAXIMUM_CODE_ADC - MINIMUM_CODE_AD)
var result: float = MAXIMUM_CODE_ADC - (value - CONST_MIN_TEMP - 3) / TEMP
return int(result)
static func _convert_power(value: int) -> int:
return value
static func _safe_convert_to_int(text: String) -> int:
text = text.strip_edges().to_lower()
if text.is_valid_int():
return int(text)
elif text.is_valid_float():
return roundi(float(text))
elif text.begins_with("0x") and text.substr(2).is_valid_hex_number():
return text.hex_to_int()
else:
return 0
static func _combine_arrays(power_arr: Array, temp_arr: Array)-> Array:
return temp_arr + power_arr
static func _form_buffers(device: String, ukp_data: Array, number_device: int, dic_yau07: Dictionary):
var buffer: PackedByteArray = PackedByteArray()
buffer.resize(BUFFER_SIZE)
for i in ukp_data.size():
buffer.encode_u16(2 * i, ukp_data[i])
if dic_yau07.has(device):
var udp_unit = dic_yau07[device]
if number_device == 1:
udp_unit.ukp0_data = buffer
print("Данные UKP0 устройства %s обновлены" % device)
elif number_device == 2:
udp_unit.ukp1_data = buffer
print("Данные UKP1 устройства %s обновлены" % device)
static func _set_bit(bits: int, index: int, val: bool) -> int:
return bits | (1 << index) if val else bits & ~(1 << index)
## Новый метод для работы с ISA портами (если потребуется)
func read_isa_ports(device: String, port_addresses: Array) -> Dictionary:
"""Чтение ISA портов указанного устройства"""
if dictionary_yau07.has(device):
return dictionary_yau07[device].read_isa_ports(port_addresses)
else:
push_error("Устройство %s не найдено" % device)
return {}
## Новый метод для записи ISA портов (если потребуется)
func write_isa_port(device: String, port_address: int, value: int) -> bool:
"""Запись значения в ISA порт указанного устройства"""
if dictionary_yau07.has(device):
return dictionary_yau07[device].set_isa_port(port_address, value)
else:
push_error("Устройство %s не найдено" % device)
return false