First commit

This commit is contained in:
QAMuser
2024-08-23 08:45:15 +03:00
commit 110791a97c
24 changed files with 1556 additions and 0 deletions

216
Main.gd Normal file
View File

@@ -0,0 +1,216 @@
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 = Socket.new()
var soc_brodcast: Socket = Socket.new()
var unit = yau07.YaU07.new('ЯУ07')
var state: int = 0 # Флаг для машины состояния
var flag_online: bool = false # Флаг для подключения
var flag_interval: bool = false # Флаг для включения непрерывной передачи с интервалом
var ports_wr: Dictionary # Словарь с портами для записи
var port_select: int = Constants.BASE_ADDR # Выбранный порд для чтения/записи
var port: int
var dt: float # Дельта
var address: String
var rx_data: PackedByteArray # Буфер принятый
var addr_receive: String # Адрес обращения к ПРД
var port_receive: int # Порт обращения к ПРД
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, 150, 150, 200, 150])
node_select.set_node_text(0, 0, 'НЕТ СВЯЗИ С ЯУ-07')
node_select.set_node_text(1, 0, ' IP-АДРЕС')
node_select.set_node_text(2, 0, '10.1.1.70')
node_select.set_node_text(3, 0, ' IP-ПОРТ')
node_select.set_node_text(4, 0, '50070')
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'))
# Поле для ввода (базовый порт)
var edit_addr = node_select.get_node2(0, 2)
edit_addr.editable = true
edit_addr.placeholder_text = '%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'))
# Привязка для принятия широковещательного канала
var rc = soc_brodcast.bind(Constants.BROADCAST_PORT, '*')
if rc != OK:
print('Ошибка: Неудачная привязка широковещательного адреса')
ports_wr[port_select] = 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, _unit, addr: String, _port: int) -> bool: ## Приёмник
while sock.get_available_packet_count() > 0:
rx_data = sock.get_packet()
addr_receive = sock.get_packet_ip()
port_receive = sock.get_packet_port()
if (addr == addr_receive) and (port == port_receive):
unit.parse(rx_data)
return false
func _process(delta):
if flag_online:
if flag_interval == false:
poll_receive(soc_brodcast, unit, address, port)
var fl_done = unit.cmd_state == unit.CmdState.DONE
if state == 1 and fl_done: ## Чтение из ИСА
unit.send_isa(unit.CmdCode.READ_ISA, [port_select])
node_select.set_node_text(3, 1, 'ПРОЧИТАНО ИЗ %x' % port_select)
state = 2
elif state == 2 and fl_done: ## Запись в ИСА
unit.send_isa(unit.CmdCode.WRITE_ISA, [port_select, ports_wr[port_select]])
if unit.isa_ports.has(port_select):
node_select.set_node_text(4, 1, '%x' % unit.isa_ports[port_select])
var isa: Array
for i in unit.isa_ports:
isa.append('%x: %x' % [i, unit.isa_ports[i]])
node_select.set_node_text(1, 1, 'ЗАПИСАТЬ В %x' % port_select)
$ISA.text = 'ISA: ' + str(isa)
state = 1
var rc = unit.process(delta)
if rc == Error.OK:
soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len))
dt = delta
func on_timer():
if flag_online:
if flag_interval == true:
poll_receive(soc_brodcast, unit, address, port)
var fl_done = unit.cmd_state == unit.CmdState.DONE
if state == 1 and fl_done: ## Чтение из ИСА
unit.send_isa(unit.CmdCode.READ_ISA, [port_select, ports_wr[port_select]])
state = 2
elif state == 2 and fl_done: ## Запись в ИСА
unit.send_isa(unit.CmdCode.WRITE_ISA, [port_select, ports_wr[port_select]])
if unit.isa_ports.has(port_select):
node_select.set_node_text(4, 1, '%x' % unit.isa_ports[port_select])
state = 1
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):
print_debug()
## Ессли отсутствует подключение к ячейке ЯУ-07
func on_command_fail(_unit):
var line_yau07_control = node_select.get_node2(0, 0)
line_yau07_control.text = 'НЕТ СВЯЗИ С ЯУ-07'
line_yau07_control.modulate = Color(1, 0, 0, 1)
flag_online = false
soc_unicast = Socket.new()
## Индикация чтения портов
func on_command_done(_unit):
if flag_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)
## Выставить адресс для записи
func _on_written_addres(write_addres):
port_select = write_addres.hex_to_int()
ports_wr[port_select] = 0
node_select.set_node_text(0, 2, '%x' % port_select)
## Запись числа порт
func _on_written_text_submitted(write_addres_data):
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
state = 2 # Запись
func _on_written_interval(write_interval):
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):
if turn_on:
address = node_select.get_node2(2,0).text
port = int(node_select.get_node2(4,0).text)
var rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS)
if rc != OK:
print('Ошибка: неудачная привязка адреса: ', address)
soc_unicast = Socket.new()
flag_online = false
else:
state = 1 # Чтение
flag_online = true
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)
soc_unicast = Socket.new()
flag_online = false
flag_interval = false