Files
imitator-case-y5/main.gd
2025-11-14 18:14:36 +03:00

165 lines
6.5 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: Array = get_tree().get_nodes_in_group('power_ukp')
for socket_power in power_ukp:
socket_power.connect('text_submitted', _on_ukp_submitted.bind(socket_power.get_meta('device')))
var temperature_ukp: Array = get_tree().get_nodes_in_group('temperature_ukp')
for socket_temp in temperature_ukp:
socket_temp.connect('text_submitted', _on_ukp_submitted.bind(socket_temp.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_timer_to_scene(self)
udp_broadcast.start_broadcast()
dictionary_yau07[name_device] = udp_broadcast
else:
dictionary_yau07[name_device].close_udp_unit()
func _process(_delta: float) -> void:
for device in dictionary_yau07.keys():
if dictionary_yau07[device]:
dictionary_yau07[device].poll_receive()
## Функция для установки статусов ячеек на связи (УГ, ЭМС-Г, УКП)
func _on_modify_sockets(toggled: bool, bit: int, device: String)->void:
if dictionary_yau07.has(device):
var udp_unit = dictionary_yau07[device]
udp_unit.sockets_status_bit = _set_bit(udp_unit.sockets_status_bit, bit, toggled)
## Функция для установки значений в ячейках УКП
func _on_ukp_submitted(_new_text: String, device: String) -> void:
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
elif number_device == 2:
udp_unit.ukp1_data = buffer
static func _set_bit(bits: int, index: int, val: bool) -> int:
return bits | (1 << index) if val else bits & ~(1 << index)