385 lines
15 KiB
GDScript
385 lines
15 KiB
GDScript
extends Node2D
|
||
|
||
signal read_ems_g_start()
|
||
signal read_ems_g_finish()
|
||
|
||
var flag_mode = Constants.ADDRESSES[0][3]
|
||
var broadcast_packet: PackedByteArray
|
||
var node_select1: Node
|
||
var node_select2: Node
|
||
var flag_yau_control: bool
|
||
var CONTROL_TABLE: Array
|
||
var isa_from_yau07b: Dictionary = {}
|
||
var JSOON = JSON.new()
|
||
var status_pribor = null
|
||
var save_path = "D://PRD-TU-MP550//save//"
|
||
|
||
var need_port: Array = [
|
||
0x122,
|
||
0x124,
|
||
0x126,
|
||
0x128,
|
||
0x12A
|
||
]
|
||
|
||
|
||
func _ready() -> void:
|
||
# Считывание аргументов с консоли (путь сохранения)
|
||
var args = OS.get_cmdline_user_args()
|
||
for i in range(args.size()):
|
||
if args[i] == "testsave-path" and i + 1 < args.size():
|
||
save_path = args[i + 1]
|
||
break
|
||
print("путь сохранения: ", save_path)
|
||
|
||
# Таблица УКП_1
|
||
node_select1 = $TabContainer/PRD/body_grid/litera_2_4_6/table_ukp_1
|
||
draw_tabl(node_select1, Constants.ROWS_REGS_DATA, Constants.ROWS_REGS_DATA.size())
|
||
node_select1.set_columns_min_size([120, 120])
|
||
node_select1.set_node_text(0, 0, 'Мощность')
|
||
node_select1.set_node_text(1, 0, 'Температура')
|
||
|
||
# Таблица УКП_2
|
||
node_select2 = $TabContainer/PRD/body_grid/litera_3_5_7/table_ukp_2
|
||
draw_tabl(node_select2, Constants.ROWS_UKP2_DATA, Constants.ROWS_UKP2_DATA.size())
|
||
node_select2.set_columns_min_size([120, 120])
|
||
node_select2.set_node_text(0, 0, 'Мощность')
|
||
node_select2.set_node_text(1, 0, 'Температура')
|
||
|
||
# Выбор прибора для подключения
|
||
var node_select_device = $TabContainer/PRD/select_dev
|
||
draw_tabl(node_select_device, Constants.SELECT_DEVICE, Constants.SELECT_DEVICE.size())
|
||
var get_select_device = node_select_device.get_node2(1, 0)
|
||
get_select_device.connect('item_selected', Callable(self, 'on_device_selected'))
|
||
|
||
# Заполнение адресов
|
||
for i_addr in Constants.ADDRESSES.size():
|
||
get_select_device.add_item(Constants.ADDRESSES[i_addr][0])
|
||
get_select_device.set_item_metadata(i_addr, Constants.ADDRESSES[i_addr].slice(1, 7))
|
||
get_select_device.connect('item_selected', Callable(self, 'on_btn_select'))
|
||
node_select_device.get_node2(0, 0).text = 'ПРИБОР'
|
||
node_select_device.set_columns_min_size([100, 100])
|
||
|
||
if Constants.ADDRESSES.size() > 0:
|
||
get_select_device.select(0)
|
||
status_pribor = get_select_device.get_item_text(0).strip_edges().substr(4)
|
||
|
||
## Заполненение списка направления луча
|
||
for key in Constants.RAY_DICT:
|
||
$TabContainer/PRD/body_grid/litera_2_4_6/yau_07b/Ray_set_1.add_item(key)
|
||
$TabContainer/PRD/body_grid/litera_3_5_7/yau_07b/Ray_set_2.add_item(key)
|
||
|
||
## Заполненение списка аттенюатора
|
||
for key in Constants.ATT_DICT:
|
||
$TabContainer/PRD/body_grid/litera_2_4_6/yau_07b/att_set_1.add_item(key)
|
||
$TabContainer/PRD/body_grid/litera_3_5_7/yau_07b/att_set_2.add_item(key)
|
||
|
||
draw_control_panel_prd(Constants.ADDRESSES[0][3])
|
||
|
||
Network.connect('yau_status_line', Callable(self, '_on_yau_status'))
|
||
Network.connect('yau_receive', Callable(self, '_on_data_received'))
|
||
Network.connect('yau_read_isa', Callable(self, '_on_read_isa'))
|
||
|
||
|
||
func on_device_selected(selected_index: int) -> void:
|
||
var get_select_device = $TabContainer/PRD/select_dev.get_node2(1, 0)
|
||
status_pribor = get_select_device.get_item_text(selected_index).strip_edges().substr(4)
|
||
|
||
|
||
func draw_control_panel_prd(mode) -> void:
|
||
for node_path in Constants.NODE_MAP:
|
||
var index = Constants.NODE_MAP[node_path]
|
||
var node = get_node(node_path)
|
||
if node:
|
||
var value = node.get("text")
|
||
if value != null:
|
||
node.text = Constants.SIGNS_PRD[mode][index]
|
||
else:
|
||
node.fname = Constants.SIGNS_PRD[mode][index]
|
||
|
||
|
||
## From Network status about yau-07
|
||
func _on_yau_status(yau_status: bool) -> void:
|
||
flag_yau_control = yau_status
|
||
|
||
|
||
func _on_read_isa(unit_isa_ports: Dictionary) -> void:
|
||
isa_from_yau07b = unit_isa_ports
|
||
var isa_data: Dictionary = {}
|
||
for key in unit_isa_ports.keys():
|
||
isa_data[key] = unit_isa_ports[key]
|
||
|
||
if isa_data.has(Constants.BASE_PORTS.EMS_G+2):
|
||
var tmp = isa_data[Constants.BASE_PORTS.EMS_G+2]
|
||
isa_data.erase(Constants.BASE_PORTS.EMS_G+2)
|
||
|
||
var found = false
|
||
for i in range(Constants.EMS_G_PORT_DATA_HOLDER.size()):
|
||
if Constants.EMS_G_PORT_DATA_HOLDER[i][0] == tmp:
|
||
Constants.EMS_G_PORT_DATA_HOLDER[i][1] = isa_data
|
||
found = true
|
||
break
|
||
if not found:
|
||
Constants.EMS_G_PORT_DATA_HOLDER.append([tmp, isa_data])
|
||
if len(Constants.EMS_G_PORT_DATA_HOLDER) == 32:
|
||
emit_signal('read_ems_g_finish')
|
||
$ISA.text = 'ISA: ' + str(len(Constants.EMS_G_PORT_DATA_HOLDER))
|
||
if isa_data.has(Constants.BASE_PORTS.UG+6):
|
||
$TabContainer/PRD/body_grid/litera_2_4_6/PSK/ray_1.material.set('shader_parameter/turn', 0.735 + 0.025 * (isa_data[0x106] & 0x7))
|
||
if isa_data.has(Constants.BASE_PORTS.UG+8):
|
||
$TabContainer/PRD/body_grid/litera_3_5_7/PSK2/ray_2.material.set('shader_parameter/turn', 0.735 + 0.025 * (isa_data[0x108] & 0x7))
|
||
|
||
|
||
## Рисует таблицу
|
||
func draw_tabl(tbl: Node, row: Array, count_row: int):
|
||
for i_row in count_row:
|
||
tbl.add_row(row[i_row])
|
||
|
||
|
||
func _process(_delta: float) -> void:
|
||
pass
|
||
|
||
|
||
func _on_data_received(data_from_yau_07):
|
||
if not flag_yau_control:
|
||
return
|
||
|
||
|
||
## УГ
|
||
var _DKM: int = data_from_yau_07.decode_u16(Constants.DataIndices.DKM) # ДКМ от УГ
|
||
#node_select1.set_node_text(2, 0, '%d' % dry_contact)
|
||
#node_select1.set_node_text(3, 0, '%d' % DKM)
|
||
|
||
|
||
## УКП
|
||
for i in range(8): ## Мощность от УКП_1
|
||
var power_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * i)
|
||
node_select1.set_node_text(0, i+1, '%d' % power_ukp_1)
|
||
|
||
for i in range(8): ## Температура от УКП_1
|
||
var temperature_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * i)
|
||
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * Constants.TEMP
|
||
node_select1.set_node_text(1, i+1, '%d' % TMP)
|
||
|
||
for i_pow in range(8): ## Мощность от УКП_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)
|
||
node_select2.set_node_text(0, i_pow+1, '%d' % power_ukp_2)
|
||
|
||
for row in range(8): ## Температура от УКП_2
|
||
if len(data_from_yau_07) > Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * row:
|
||
var temperature_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * row)
|
||
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * Constants.TEMP
|
||
node_select2.set_node_text(1, row+1, '%d' % TMP)
|
||
|
||
|
||
func set_frame(node: Node, val: int): node.set_frame(val)
|
||
|
||
|
||
func _on_prd_select() -> void:
|
||
set_tab_and_buttons(0, 'select_prd')
|
||
|
||
|
||
func _on_control_button() -> void:
|
||
set_tab_and_buttons(1, 'select_control')
|
||
|
||
|
||
func _on_emsg_select() -> void:
|
||
emit_signal('read_ems_g_start')
|
||
set_tab_and_buttons(2, 'select_ems_g')
|
||
|
||
|
||
func _on_mfs_select() -> void:
|
||
set_tab_and_buttons(3, 'select_fs')
|
||
|
||
|
||
func _on_save_config():
|
||
var file_dialog = FileDialog.new()
|
||
file_dialog.title = "Сохранить файл как"
|
||
file_dialog.set_size(Vector2(600, 400))
|
||
file_dialog.mode = FileDialog.FILE_MODE_SAVE_FILE
|
||
file_dialog.current_dir = save_path
|
||
file_dialog.set_current_file("ЭМС-Г" + "-" + status_pribor)
|
||
file_dialog.connect("file_selected", Callable(self, "_save_selected_file"))
|
||
add_child(file_dialog)
|
||
file_dialog.popup_centered()
|
||
|
||
|
||
func _save_selected_file(file_path: String):
|
||
var data = Constants.EMS_G_PORT_DATA_HOLDER
|
||
var param_ems_g: Dictionary = {}
|
||
var other_data: Dictionary = {}
|
||
# Формируем словари
|
||
for item in data:
|
||
var regist: Dictionary = {}
|
||
regist[0x122] = item[0]
|
||
for key in item[1]:
|
||
if key in need_port:
|
||
regist[key] = item[1][key]
|
||
else:
|
||
other_data[key] = item[1]
|
||
param_ems_g[item[0]] = regist
|
||
var item_id = item[0]
|
||
# Переменные для сохранения
|
||
var ems_g_file = file_path
|
||
var ems_g_path = save_path + ems_g_file
|
||
var other_name = "others" + "-" + status_pribor
|
||
var other_path = save_path + other_name
|
||
var other_names = other_name
|
||
var other_counter = 1
|
||
var dir = DirAccess.open(file_path.get_base_dir())
|
||
# Сохранение данных ЭМС-Г
|
||
var file = FileAccess.open(ems_g_file, FileAccess.WRITE)
|
||
if file != null:
|
||
file.store_string(JSON.stringify(param_ems_g))
|
||
file.close()
|
||
# Сохранение данных других
|
||
var save_other = $save_other.is_pressed()
|
||
if save_other:
|
||
while dir.file_exists(other_names):
|
||
other_names = other_name + "_" + str(other_counter)
|
||
other_path = save_path + other_names
|
||
other_counter += 1
|
||
var other_file = FileAccess.open(other_path, FileAccess.WRITE)
|
||
if other_file != null:
|
||
other_file.store_string(JSON.stringify(other_data))
|
||
other_file.close()
|
||
|
||
|
||
func _on_file_selected(file_path: String):
|
||
var file = FileAccess.open(file_path, FileAccess.READ)
|
||
# Проверка на открытие/чтение файла
|
||
if file != OK:
|
||
return
|
||
var file_content = file.get_as_text()
|
||
file.close()
|
||
var json = JSON.new()
|
||
var data = json.parse(file_content)
|
||
# Проверка на разбор содержимого файла
|
||
if data.error != OK:
|
||
return
|
||
Constants.EMS_G_PORT_DATA_HOLDER = data.result
|
||
|
||
|
||
func _on_load_config():
|
||
var file_dialog = FileDialog.new()
|
||
file_dialog.set_title("Выберите файл")
|
||
file_dialog.set_size(Vector2(600, 400))
|
||
file_dialog.current_dir = save_path
|
||
file_dialog.access = FileDialog.ACCESS_FILESYSTEM
|
||
add_child(file_dialog)
|
||
file_dialog.popup_centered()
|
||
|
||
|
||
func set_tab_and_buttons(tab_index: int, button_name: String) -> void:
|
||
$TabContainer.current_tab = tab_index
|
||
var side_panel = $Background/side_panel
|
||
|
||
for button in side_panel.get_children():
|
||
if button is Button:
|
||
button.button_pressed = (button.name == button_name)
|
||
|
||
|
||
func on_btn_select(intem_from_sector: int) -> void:
|
||
var node_select_device = $TabContainer/PRD/select_dev
|
||
var get_select_device = node_select_device.get_node2(1, 0)
|
||
var meta = get_select_device.get_item_metadata(intem_from_sector)
|
||
Network.on_command_change_device(meta)
|
||
flag_mode = meta[2]
|
||
draw_control_panel_prd(flag_mode)
|
||
status_pribor = get_select_device.get_item_text(intem_from_sector).strip_edges().substr(4)
|
||
|
||
func fill_item(node: Node, i_column: int, i_row: int, arr: Dictionary, select: int = 0) -> void:
|
||
var optionbutton = node.get_node2(i_column, i_row) as OptionButton
|
||
for key in arr.keys():
|
||
var item_text = key + " - " + str(arr[key])
|
||
optionbutton.add_item(item_text)
|
||
if select < arr.size():
|
||
optionbutton.select(select)
|
||
|
||
|
||
func _on_zapret1(toggled_on: bool) -> void:
|
||
var meta = $TabContainer/PRD/body_grid/litera_2_4_6/yau_07b/Zapret.get_meta('dev_num')
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta)
|
||
var zapret_mode = 0x4000 if toggled_on else 0x0
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, zapret_mode)
|
||
|
||
|
||
func _on_zapret2(toggled_on: bool) -> void:
|
||
var meta = $TabContainer/PRD/body_grid/litera_3_5_7/yau_07b/Zapret2.get_meta('dev_num')
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta)
|
||
var zapret_mode = 0x4000 if toggled_on else 0x0
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, zapret_mode)
|
||
|
||
|
||
func _on_modul_um_1(toggled_on: bool):
|
||
var meta = $TabContainer/PRD/body_grid/litera_2_4_6/yau_07b/Modul_um_1.get_meta('dev_num')
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta)
|
||
var modul_um = 0x2000 if toggled_on else 0x0
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, modul_um)
|
||
|
||
|
||
func _on_modul_um_2(toggled_on: bool):
|
||
var meta = $TabContainer/PRD/body_grid/litera_3_5_7/yau_07b/Modul_um_2.get_meta('dev_num')
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta)
|
||
var modul_um = 0x2000 if toggled_on else 0x0
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, modul_um)
|
||
|
||
|
||
func _on_fgos_2(toggled_on: bool):
|
||
var meta = $TabContainer/PRD/body_grid/litera_3_5_7/yau_07b/fgos_2.get_meta('dev_num')
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta)
|
||
var modul_um = 0x2000 if toggled_on else 0x0
|
||
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, modul_um)
|
||
|
||
|
||
#func _on_fgos_2(toggled_on: bool):
|
||
#var meta = $TabContainer/PRD/Grid/Modul_um_2.get_meta('dev_num')
|
||
#Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta)
|
||
#var modul_um = 0x2000 if toggled_on else 0x0
|
||
#Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, modul_um)
|
||
|
||
|
||
## Регулировка положением луча 1
|
||
func _on_btn_ray_1(item_from_ray_1: int) -> void:
|
||
if isa_from_yau07b.has(Constants.BASE_PORTS.UG+6):
|
||
Network.write_port_isa(Constants.BASE_PORTS.UG+6, set_bits(isa_from_yau07b[Constants.BASE_PORTS.UG+6], item_from_ray_1, 7))
|
||
Network.read_port_isa([Constants.BASE_PORTS.UG+6])
|
||
else:
|
||
print_debug('В ISA отсутствует данные в \"%x\" порту' % (Constants.BASE_PORTS.UG+0x6))
|
||
|
||
|
||
## Регулировка положением луча 2
|
||
func _on_btn_ray_2(item_from_ray_2: int) -> void:
|
||
if isa_from_yau07b.has(Constants.BASE_PORTS.UG+8):
|
||
Network.write_port_isa(Constants.BASE_PORTS.UG+8, set_bits(isa_from_yau07b[Constants.BASE_PORTS.UG+8], item_from_ray_2, 7))
|
||
Network.read_port_isa([Constants.BASE_PORTS.UG+8])
|
||
else:
|
||
print_debug('В ISA отсутствует данные в \"%x\" порту' % (Constants.BASE_PORTS.UG+0x8))
|
||
|
||
|
||
func _on_attenuator_1(item_from_att_1: int) -> void:
|
||
if isa_from_yau07b.has(Constants.BASE_PORTS.UG+6):
|
||
Network.write_port_isa(Constants.BASE_PORTS.UG+6, set_bits(isa_from_yau07b[Constants.BASE_PORTS.UG+6], item_from_att_1 << 3, 0x38))
|
||
Network.read_port_isa([Constants.BASE_PORTS.UG+6])
|
||
else:
|
||
print_debug('В ISA отсутствует данные в \"%x\" порту' % (Constants.BASE_PORTS.UG+0x6))
|
||
|
||
func _on_attenuator_2(item_from_att_1: int) -> void:
|
||
if isa_from_yau07b.has(Constants.BASE_PORTS.UG+8):
|
||
Network.write_port_isa(Constants.BASE_PORTS.UG+8, set_bits(isa_from_yau07b[Constants.BASE_PORTS.UG+8], item_from_att_1 << 3, 0x38))
|
||
Network.read_port_isa([Constants.BASE_PORTS.UG+8])
|
||
else:
|
||
print_debug('В ISA отсутствует данные в \"%x\" порту' % (Constants.BASE_PORTS.UG+0x8))
|
||
|
||
func _on_read_isa_pressed() -> void:
|
||
Network.read_port_isa([Constants.BASE_PORTS.EMS_G+2, Constants.BASE_PORTS.EMS_G+4, Constants.BASE_PORTS.EMS_G+8])
|
||
|
||
|
||
## Устанавливает биты в соответствии с маской
|
||
## [param v] - Прежние значения бит
|
||
## [param a] - Новые значения бит
|
||
## [param m] - Маска изменяемых бит
|
||
func set_bits(v, a, m):
|
||
return (~m) & v | a & m
|