From cbbb8cf5a73c6963ccf3183c75bb0c351e6314f9 Mon Sep 17 00:00:00 2001 From: Maxim Date: Wed, 2 Oct 2024 14:42:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B?= =?UTF-8?q?=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Main.gd | 136 ++++++++++++++++++++++++++--------------------- Plata-check.tscn | 12 +++++ constants.gd | 4 +- yau07.gd | 10 +++- 4 files changed, 99 insertions(+), 63 deletions(-) diff --git a/Main.gd b/Main.gd index 18b7ef9..9b60615 100644 --- a/Main.gd +++ b/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 + diff --git a/Plata-check.tscn b/Plata-check.tscn index ef41ef4..5f15a75 100644 --- a/Plata-check.tscn +++ b/Plata-check.tscn @@ -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"] diff --git a/constants.gd b/constants.gd index d86a416..c0133ae 100644 --- a/constants.gd +++ b/constants.gd @@ -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 diff --git a/yau07.gd b/yau07.gd index 0c3e4e6..44f0a7b 100644 --- a/yau07.gd +++ b/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)