Доработка для разовой команды чтения
This commit is contained in:
136
Main.gd
136
Main.gd
@@ -10,21 +10,19 @@ class Socket extends PacketPeerUDP:
|
||||
|
||||
var node_select: Node
|
||||
var timer = Timer.new()
|
||||
var soc_unicast: Socket = Socket.new()
|
||||
var soc_brodcast: Socket = Socket.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 = true
|
||||
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 dt: float # Дельта
|
||||
var address: String
|
||||
var rx_data: PackedByteArray # Буфер принятый
|
||||
var addr_receive: String # Адрес обращения к ПРД
|
||||
var port_receive: int # Порт обращения к ПРД
|
||||
var dt: float # Дельта
|
||||
var ROWS_REGS_DATA: Array = [
|
||||
[TableNode, TableNode, TableNode, TableNode, TableNode],
|
||||
[TableNode, TableNode, TableNode, TableNode, TableNode],
|
||||
@@ -40,9 +38,9 @@ func _ready():
|
||||
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, '10.1.1.70')
|
||||
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, '50070')
|
||||
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, ' ИНТЕРВАЛ')
|
||||
|
||||
@@ -62,6 +60,7 @@ func _ready():
|
||||
|
||||
# Кнопка для включения
|
||||
$Turn_on.connect('toggled', Callable(self, '_on_button_pressed'))
|
||||
$read_ISA.disabled = true
|
||||
|
||||
# Поле для ввода (базовый порт)
|
||||
var edit_addr = node_select.get_node2(0, 2)
|
||||
@@ -76,11 +75,17 @@ func _ready():
|
||||
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('Ошибка: Неудачная привязка широковещательного адреса')
|
||||
|
||||
ports_wr[port_select] = 0
|
||||
|
||||
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'))
|
||||
@@ -92,32 +97,34 @@ func draw_tabl(tbl, row: Array, count_row: int):
|
||||
tbl.add_row(row[i_row])
|
||||
|
||||
|
||||
func poll_receive(sock: Socket, _unit, addr: String, _port: int) -> bool: ## Приёмник
|
||||
func poll_receive(sock: Socket) -> 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):
|
||||
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_online:
|
||||
if flag_interval == false:
|
||||
poll_receive(soc_brodcast, unit, address, port)
|
||||
if flag_interval == false:
|
||||
poll_receive(soc_brodcast)
|
||||
if flag_online:
|
||||
poll_receive(soc_unicast)
|
||||
state_machine()
|
||||
|
||||
var rc = unit.process(delta)
|
||||
if rc == Error.OK:
|
||||
soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len))
|
||||
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_online:
|
||||
if flag_interval == true:
|
||||
poll_receive(soc_brodcast, unit, address, port)
|
||||
if flag_interval == true:
|
||||
if flag_online:
|
||||
flag_continuous = true
|
||||
poll_receive(soc_brodcast)
|
||||
state_machine()
|
||||
|
||||
var rc = unit.process(dt)
|
||||
@@ -127,41 +134,54 @@ func on_timer() -> void:
|
||||
|
||||
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:
|
||||
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()
|
||||
$Turn_on.button_pressed = false
|
||||
|
||||
|
||||
## Индикация чтения портов
|
||||
func on_command_done(_unit) -> void:
|
||||
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)
|
||||
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
|
||||
if state == 1 and fl_done: ## Чтение из ИСА
|
||||
unit.send_isa(unit.CmdCode.READ_ISA, [port_select])
|
||||
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)
|
||||
state = 2 if flag_wr_on_timer else 1
|
||||
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]])
|
||||
|
||||
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)
|
||||
flag_wr_on_timer = false
|
||||
state = 1
|
||||
|
||||
|
||||
@@ -181,7 +201,8 @@ func _on_written_text_submitted(write_addres_data) -> void:
|
||||
is_hex = false
|
||||
break
|
||||
ports_wr[port_select] = write_addres_data.hex_to_int() if is_hex else 0xffff
|
||||
state = 2 # Запись
|
||||
flag_continuous = true
|
||||
flag_wr_on_timer = true # Запись
|
||||
|
||||
|
||||
func _on_written_interval(write_interval) -> void:
|
||||
@@ -196,20 +217,13 @@ 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)
|
||||
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
|
||||
flag_continuous = false # Чтение
|
||||
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
|
||||
|
||||
|
||||
func _on_button_read() -> void:
|
||||
state = 1
|
||||
|
||||
|
||||
@@ -42,9 +42,21 @@ toggle_mode = true
|
||||
text = "Подключить"
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
[node name="read_ISA" type="Button" parent="."]
|
||||
offset_left = 963.0
|
||||
offset_top = 100.0
|
||||
offset_right = 1088.0
|
||||
offset_bottom = 124.0
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_so1no")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_jbuuq")
|
||||
text = "ПРОЧИТАТЬ"
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
[node name="ISA" type="Label" parent="."]
|
||||
offset_left = 46.0
|
||||
offset_top = 179.0
|
||||
offset_right = 999.0
|
||||
offset_bottom = 202.0
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
[connection signal="pressed" from="read_ISA" to="." method="_on_button_read"]
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
extends Node
|
||||
|
||||
const UNICAST_PORT: int = 50080
|
||||
const UNICAST_PORT: int = 50003
|
||||
const UNICAST_ADDRESS: String = '10.1.1.3'
|
||||
const BROADCAST_PORT: int = 50000
|
||||
const DEFAULT_ADDRESS: String = '10.1.1.52'
|
||||
const DEFAULT_PORT: String = '50052'
|
||||
const BASE_ADDR: int = 0x100
|
||||
|
||||
10
yau07.gd
10
yau07.gd
@@ -19,6 +19,7 @@ class YaU07:
|
||||
WRITE_FLASH = 50, ## Код команды "записать данные в FLASH" ячейки ЯУ-07
|
||||
READ_FLASH = 51, ## Код команды "прочитать данные из FLASH" ячейки ЯУ-07
|
||||
LOAD_FLASH = 52, ## Код команды "записать данные из FLASH в КЭМС" ячейки ЯУ-07
|
||||
WRITE_FLASH_B = 55, ## Код команды "записать данные в FLASH" ячейки ЯУ-07Б
|
||||
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07
|
||||
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07
|
||||
}
|
||||
@@ -95,7 +96,8 @@ class YaU07:
|
||||
or (cmd_state == CmdState.UNCK):
|
||||
return false
|
||||
if not ((cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \
|
||||
or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH)):
|
||||
or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH) or \
|
||||
(cmd_code == CmdCode.WRITE_FLASH_B)):
|
||||
return false
|
||||
cmd_num_tx = (cmd_num_rx + 1) % 0xffff
|
||||
tx_data.encode_u16(0, cmd_retry)
|
||||
@@ -110,6 +112,12 @@ class YaU07:
|
||||
tx_len = 11 + len(fl_data) * 2
|
||||
for i in range(len(fl_data)):
|
||||
tx_data.encode_u16(12 + i * 2, fl_data[i])
|
||||
elif cmd_code == CmdCode.WRITE_FLASH_B:
|
||||
tx_data.encode_u16(7, 0)
|
||||
tx_data.encode_u16(9, len(fl_data))
|
||||
tx_len = 11 + len(fl_data)
|
||||
for i in range(len(fl_data)):
|
||||
tx_data.encode_u8(11 + i, fl_data[i])
|
||||
elif cmd_code == CmdCode.READ_FLASH:
|
||||
tx_len = 11
|
||||
tx_data.encode_u16(7, 0)
|
||||
|
||||
Reference in New Issue
Block a user