Files
Check_plats/Main.gd

230 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 Node2D
var TableNode = preload("res://table/node.tscn")
## Класс для отправки данных в сокет
class Socket extends PacketPeerUDP:
func send_to(addr: String, port: int, data: PackedByteArray):
self.set_dest_address(addr, port)
self.put_packet(data)
var node_select: Node
var timer = Timer.new()
var soc_unicast: Socket
var soc_brodcast: Socket
var unit = yau07.YaU07.new('ЯУ07')
var state: int = 0 # Флаг для машины состояния
var flag_online: bool = false # Флаг для подключения
var flag_interval: bool = false # Флаг для включения непрерывной передачи с интервалом
var flag_wr_on_timer = false # Флаг для записи непрерывной
var flag_continuous = true # Флаг для режима ожидания машины состояния
var ports_wr: Dictionary # Словарь с портами для записи
var port_select: int = Constants.BASE_ADDR # Выбранный порд для чтения/записи
var port: int
var address: String
var dt: float # Дельта
var ROWS_REGS_DATA: Array = [
[TableNode, TableNode, TableNode, TableNode, TableNode],
[TableNode, TableNode, TableNode, TableNode, TableNode],
[TableNode, TableNode, TableNode, TableNode, TableNode]]
func _ready():
self.add_child(timer)
timer.connect('timeout', Callable(self, 'on_timer'))
# Таблица 1
node_select = $scroll1/table1
draw_tabl(node_select, ROWS_REGS_DATA, ROWS_REGS_DATA.size())
node_select.set_columns_min_size([250, 160, 150, 190, 150])
node_select.set_node_text(0, 0, ' НЕТ СВЯЗИ С ЯУ-07')
node_select.set_node_text(1, 0, ' IP-АДРЕС')
node_select.set_node_text(2, 0, Constants.DEFAULT_ADDRESS)
node_select.set_node_text(3, 0, ' IP-ПОРТ')
node_select.set_node_text(4, 0, Constants.DEFAULT_PORT)
node_select.set_node_text(0, 1, ' ПОРТ ЯЧЕЙКИ (hex)')
node_select.set_node_text(1, 2, ' ИНТЕРВАЛ')
# Поле для ввода (запись IP-адреса)
var edit_ip = node_select.get_node2(2, 0)
edit_ip.editable = true
edit_ip.placeholder_text = 'Ввод значения'
var edit_port = node_select.get_node2(4, 0)
edit_port.editable = true
edit_port.placeholder_text = 'Ввод значения'
# Поле для ввода (запись в порт)
var edit_node = node_select.get_node2(2, 1)
edit_node.editable = true
edit_node.placeholder_text = 'Ввод значения'
edit_node.connect('text_submitted', Callable(self, '_on_written_text_submitted'))
# Кнопка для включения
$Turn_on.connect('toggled', Callable(self, '_on_button_pressed'))
$read_ISA.disabled = true
# Поле для ввода (базовый порт)
var edit_addr = node_select.get_node2(0, 2)
edit_addr.editable = true
edit_addr.placeholder_text = ' 0x%x' % port_select
edit_addr.connect('text_submitted', Callable(self, '_on_written_addres'))
# Поле для ввода (интервал непрерывной записи)
var edit_interval = node_select.get_node2(2, 2)
edit_interval.editable = true
edit_interval.placeholder_text = 'Ввод значения'
edit_interval.connect('text_submitted', Callable(self, '_on_written_interval'))
# Привязка для принятия широковещательного канала
soc_brodcast = Socket.new()
var rc = soc_brodcast.bind(Constants.BROADCAST_PORT, '*')
if rc != OK:
print('Ошибка: Неудачная привязка широковещательного адреса')
soc_unicast = Socket.new()
rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS)
if rc != OK:
print('Ошибка: неудачная привязка адреса: ', address)
#ports_wr[port_select] = unit.isa_ports[0]
unit.connect('line_changed', Callable(self, 'on_line_changed'))
unit.connect('command_fail', Callable(self, 'on_command_fail'))
unit.connect('command_done', Callable(self, 'on_command_done'))
## Рисует таблицу
func draw_tabl(tbl, row: Array, count_row: int):
for i_row in count_row:
tbl.add_row(row[i_row])
func poll_receive(sock: Socket) -> bool: ## Приёмник
while sock.get_available_packet_count() > 0:
var rx_data = sock.get_packet()
var addr_receive = sock.get_packet_ip()
var port_receive = sock.get_packet_port()
if (address == addr_receive) and (port == port_receive):
unit.parse(rx_data)
return false
func _process(delta) -> void:
if flag_interval == false:
poll_receive(soc_brodcast)
if flag_online:
poll_receive(soc_unicast)
state_machine()
match unit.process(delta):
Error.OK: soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len))
Error.FAILED: print('Ошибка отправки данных')
dt = delta
func on_timer() -> void:
if flag_interval == true:
if flag_online:
flag_continuous = true
poll_receive(soc_brodcast)
state_machine()
var rc = unit.process(dt)
if rc == Error.OK:
soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len))
func on_line_changed(_unit) -> void:
print_debug()
if unit.online:
var line_yau07_control = node_select.get_node2(0, 0)
line_yau07_control.text = ' ЯУ-07Б НА СВЯЗИ'
line_yau07_control.modulate = Color(0, 1, 0, 1)
else:
var line_yau07_control = node_select.get_node2(0, 0)
line_yau07_control.text = ' НЕТ СВЯЗИ С ЯУ-07'
line_yau07_control.modulate = Color(1, 0, 0, 1)
var light_interval = node_select.get_node2(1, 2)
light_interval.modulate = Color(0.5, 0.5, 0.5, 1)
flag_online = false
flag_interval = false
## Ессли отсутствует подключение к ячейке ЯУ-07
func on_command_fail(_unit) -> void:
$Turn_on.button_pressed = false
## Индикация чтения портов
func on_command_done(_unit) -> void:
var isa: Array = []
ports_wr[port_select] = unit.isa_ports[port_select]
if (unit.isa_ports[port_select] == ports_wr[port_select]) and flag_online:
for i in unit.isa_ports:
isa.append('%x: %x' % [i, unit.isa_ports[i]])
$ISA.text = 'ISA: ' + str(isa)
$ISA.modulate = Color(1, 1, 1, 1)
else:
$ISA.modulate = Color(1, 0, 0, 1)
func state_machine() -> void:
var fl_done = (unit.cmd_state == unit.CmdState.DONE) or (unit.cmd_state == unit.CmdState.FAIL)
if state == 0 and fl_done:
node_select.set_node_text(3, 1, ' ПРОЧИТАНО ИЗ %x' % port_select)
node_select.set_node_text(1, 1, ' ЗАПИСАТЬ В %x' % port_select)
var nubre_from_port = '%x' % unit.isa_ports[port_select] if unit.isa_ports.has(port_select) else 'ffff'
node_select.set_node_text(4, 1, nubre_from_port)
$read_ISA.disabled = false
state = 2 if flag_continuous else 0
elif state == 1 and fl_done: ## Чтение из ИСА
unit.send_isa(unit.CmdCode.READ_ISA, [port_select])
flag_continuous = false
state = 2 if flag_wr_on_timer else 0
elif state == 2 and fl_done: ## Запись в ИСА
unit.send_isa(unit.CmdCode.WRITE_ISA, [port_select, ports_wr[port_select]])
flag_wr_on_timer = false
state = 1
## Выставить адресс для записи
func _on_written_addres(write_addres) -> void:
port_select = write_addres.hex_to_int()
if ports_wr.has(port_select) != true:
ports_wr[port_select] = 0
node_select.set_node_text(0, 2, '%x' % port_select)
## Запись числа порт
func _on_written_text_submitted(write_addres_data) -> void:
var is_hex = true
for chr in write_addres_data:
if chr.to_upper() < '0' or chr.to_upper() > 'F':
is_hex = false
break
ports_wr[port_select] = write_addres_data.hex_to_int() if is_hex else 0xffff
flag_continuous = true
flag_wr_on_timer = true # Запись
func _on_written_interval(write_interval) -> void:
timer.start(float(write_interval))
flag_interval = true
var light_interval = node_select.get_node2(1, 2)
light_interval.modulate = Color(0, 1, 0, 1)
## Подключение
func _on_button_pressed(turn_on) -> void:
if turn_on:
address = node_select.get_node2(2,0).text
port = int(node_select.get_node2(4,0).text)
flag_continuous = false # Чтение
flag_online = true
else:
flag_online = false
flag_interval = false
func _on_button_read() -> void:
state = 1