177 lines
8.5 KiB
GDScript
177 lines
8.5 KiB
GDScript
extends Panel
|
||
const yau_devices: Array[Dictionary] = [
|
||
{'name': 'ПРД-Н1', 'addr': '10.1.1.11', 'port': 50011},
|
||
{'name': 'ПРД-Н2', 'addr': '10.1.1.21', 'port': 50021},
|
||
{'name': 'ПРД-Н3', 'addr': '10.1.1.31', 'port': 50031},
|
||
{'name': 'ПРД-Н4', 'addr': '10.1.1.41', 'port': 50041},
|
||
{'name': 'ПРД-В1', 'addr': '10.1.1.12', 'port': 50012},
|
||
{'name': 'ПРД-В2', 'addr': '10.1.1.22', 'port': 50022},
|
||
{'name': 'ПРД-В3', 'addr': '10.1.1.32', 'port': 50032},
|
||
{'name': 'ПРД-В4', 'addr': '10.1.1.42', 'port': 50042},
|
||
{'name': 'ПРД-К1', 'addr': '10.1.1.13', 'port': 50013},
|
||
{'name': 'ПРД-К2', 'addr': '10.1.1.23', 'port': 50023},
|
||
{'name': 'ПРД-К3', 'addr': '10.1.1.33', 'port': 50033},
|
||
{'name': 'ПРД-К4', 'addr': '10.1.1.43', 'port': 50043}
|
||
]
|
||
|
||
func _ready() -> void:
|
||
for device in yau_devices:
|
||
$select_device.add_item(device['name'])
|
||
|
||
## Включаем обработку событий мыши
|
||
$select_device.mouse_filter = Control.MOUSE_FILTER_PASS
|
||
$select_device.gui_input.connect(_on_select_device_gui_input)
|
||
Network.connect('yau_receive', Callable(self, '_on_parse_packet_yau_07'))
|
||
Network.connect('yau_status_line', Callable(self, '_on_yau_status'))
|
||
|
||
|
||
func _on_select_device_item_selected(index: int) -> void:
|
||
if index == 0:
|
||
# Обработка выбора "NONE"
|
||
$addr.text = "Устройство не выбрано (NONE)"
|
||
Network.send_array = []
|
||
Network.ip_address_yau = ''
|
||
Network.ip_port_yau = 0
|
||
elif index > 0 and index - 1 < yau_devices.size():
|
||
var device: Dictionary = yau_devices[index - 1]
|
||
var changed_addr_yau: String = device['addr']
|
||
var changed_port_yau: int = device['port']
|
||
$addr.text = "Адрес: %s" % changed_addr_yau
|
||
Network.send_array = []
|
||
Network.ip_address_yau = changed_addr_yau
|
||
Network.ip_port_yau = changed_port_yau
|
||
else:
|
||
print("Неверный индекс: ", index)
|
||
|
||
|
||
func _on_select_device_gui_input(event: InputEvent) -> void:
|
||
if event is InputEventMouseButton:
|
||
var mouse_event: InputEventMouseButton = event
|
||
if mouse_event.pressed:
|
||
if mouse_event.button_index == MOUSE_BUTTON_WHEEL_UP:
|
||
# Прокрутка вверх
|
||
var current_index = $select_device.selected
|
||
if current_index > 0:
|
||
$select_device.select(current_index - 1)
|
||
$select_device.item_selected.emit(current_index - 1)
|
||
elif mouse_event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
|
||
# Прокрутка вниз
|
||
var current_index = $select_device.selected
|
||
if current_index < $select_device.item_count - 1:
|
||
$select_device.select(current_index + 1)
|
||
$select_device.item_selected.emit(current_index + 1)
|
||
|
||
|
||
func _on_parse_packet_yau_07(packet_form_yau_07: PackedByteArray) -> void:
|
||
#print_debug('in _on_parse_packet_yau_07')
|
||
socket_status_ems_g(packet_form_yau_07)
|
||
parser_power_um(packet_form_yau_07)
|
||
parser_temperature_um(packet_form_yau_07)
|
||
dkm(packet_form_yau_07)
|
||
|
||
|
||
var receive_yau_counter: Array = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||
|
||
func _on_yau_status(addr: String):
|
||
var count_packets_await: int = 20
|
||
var status_yau_list = $status_yau_list.get_children()
|
||
var status_label = $status_yau
|
||
if addr.is_empty():
|
||
# Сброс состояния, если адрес пуст (нет связи)
|
||
for label in status_yau_list:
|
||
label.text = ''
|
||
status_label.modulate = Color.CRIMSON
|
||
status_label.text = 'ЯУ-07Б: нет связи'
|
||
return
|
||
status_label.text = '' # Убираем статус, если есть сигнал от ЯУ-07Б
|
||
|
||
# Обновляем счетчики
|
||
for i in Constants.ADDRESSES.size():
|
||
var address_match = (Constants.ADDRESSES[i][1] == addr)
|
||
receive_yau_counter[i] = 0 if address_match else (receive_yau_counter[i] + 1) & 0xFFF
|
||
# Обновляем статусы элементов
|
||
for i in status_yau_list.size():
|
||
var label = status_yau_list[i]
|
||
var address_info = Constants.ADDRESSES[i]
|
||
|
||
label.text = address_info[0]
|
||
label.modulate = Color.AQUAMARINE if receive_yau_counter[i] < count_packets_await else Color.DARK_GRAY # Если счетчик >= count_packets_await, помечаем серым, иначе — аквамарином
|
||
|
||
|
||
|
||
## Отображение статуса входа/выхода от ЭМС-Г
|
||
func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void:
|
||
var count_sockets: int = 16
|
||
var in_blank: int = packet_form_yau_07.decode_u16(Constants.DataIndices.IN_BLANK_PRD)
|
||
var in_impulse: int = packet_form_yau_07.decode_u16(Constants.DataIndices.IN_IMPULS_PRD)
|
||
var out_blank: int = packet_form_yau_07.decode_u16(Constants.DataIndices.OUT_BLANK_PRD)
|
||
var out_impulse: int = packet_form_yau_07.decode_u16(Constants.DataIndices.OUT_IMPULS_PRD)
|
||
process_sockets_input(in_blank, in_impulse, count_sockets)
|
||
process_sockets_output(out_blank, out_impulse, count_sockets)
|
||
|
||
|
||
func process_sockets_input(in_blank: int, in_impulse: int, count: int):
|
||
var group_socket_status: Array = get_tree().get_nodes_in_group("input_socket_status")
|
||
|
||
for i in count:
|
||
var frame_type = Constants.Frame.WORK
|
||
if (in_blank & (1 << i)) != 0:
|
||
frame_type = Constants.Frame.CONSTANT
|
||
elif (in_impulse & (1 << i)) != 0:
|
||
frame_type = Constants.Frame.VARIABLE
|
||
set_frame(group_socket_status[i], frame_type)
|
||
|
||
|
||
func process_sockets_output(out_blank: int, out_impulse: int, count: int):
|
||
for i in count:
|
||
var group_socket_status: Array = get_tree().get_nodes_in_group("output_socket_status")
|
||
var frame_type = Constants.Frame.WORK
|
||
if (out_blank & (1 << i)) != 0:
|
||
frame_type = Constants.Frame.CONSTANT
|
||
elif (out_impulse & (1 << i)) != 0:
|
||
frame_type = Constants.Frame.VARIABLE
|
||
set_frame(group_socket_status[i], frame_type)
|
||
|
||
|
||
func set_frame(node: Node, val: int): node.set_frame(val)
|
||
|
||
|
||
## Значения температуры и мощнсти от УКП
|
||
func parser_power_um(data_from_yau_07: PackedByteArray) -> void:
|
||
var array_power_1 = get_tree().get_nodes_in_group("power")
|
||
for i_pow in range(6): ## Мощность от УКП_1
|
||
var power_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * i_pow)
|
||
array_power_1[i_pow].text = '%d' % power_ukp_1
|
||
|
||
var array_power_2 = get_tree().get_nodes_in_group("power")
|
||
for i_pow in range(6): ## Мощность от УКП_2
|
||
if len(data_from_yau_07) > Constants.DataIndices.POWER_UKP_2 + 2 * i_pow:
|
||
var power_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_2 + 2 * i_pow)
|
||
array_power_2[i_pow+6].text = '%d' % power_ukp_2
|
||
|
||
#if len(data_from_yau_07) > Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * 7:
|
||
#var power_ukp_3 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * 7)
|
||
#var temperature_ukp_3 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * 7)
|
||
#var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_3) * Constants.TEMP + 3
|
||
#node_select3.set_node_text(0, 1, '%d' % power_ukp_3)
|
||
#node_select3.set_node_text(1,1, '%d °С' % TMP)
|
||
|
||
|
||
func parser_temperature_um(data_from_yau_07: PackedByteArray) -> void:
|
||
var array_temperature = get_tree().get_nodes_in_group("temperature")
|
||
for i_tmp in range(6): ## Температура от УКП_1
|
||
var temperature_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * i_tmp)
|
||
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * Constants.TEMP + 3
|
||
array_temperature[i_tmp].text = '%d °С' % TMP
|
||
|
||
for i_tmp in range(6): ## Температура от УКП_2
|
||
if len(data_from_yau_07) > Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * i_tmp:
|
||
var temperature_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * i_tmp)
|
||
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * Constants.TEMP + 3
|
||
array_temperature[i_tmp+6].text = '%d °С' % TMP
|
||
|
||
|
||
func dkm(data_from_yau_07: PackedByteArray)-> void:
|
||
var local_dkm = data_from_yau_07.decode_u8(Constants.DataIndices.DKM)
|
||
$DKM_grid/DKM.text = 'DKM: ' + str(local_dkm)
|