diff --git a/Main.gd b/Main.gd index 7384579..e422957 100644 --- a/Main.gd +++ b/Main.gd @@ -7,20 +7,22 @@ class Socket extends PacketPeerUDP: 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 = Constants.STATE.WAIT # Флаг для машины состояния var flag_online: bool = false # Флаг для подключения var flag_interval: bool = false # Флаг для включения непрерывной передачи с интервалом -var flag_wr_on_timer = false # Флаг для записи непрерывной -var flag_continuous = true # Флаг для режима ожидания машины состояния +var flag_write_isa: bool = false # Флаг для записи в ИСА +var flag_read_isa: bool = true # Флаг для чтения из ИСА var ports_wr: Dictionary # Словарь с портами для записи var port_select: int = Constants.BASE_ADDR # Выбранный порд для чтения/записи var port: int var address: String var dt: float # Дельта +var timer: Timer = Timer.new() +var timeout: float = yau07.ONLINE_TIMEOUT +var last_update_time: float = 0.0 func _ready(): @@ -30,13 +32,13 @@ func _ready(): node_select = $scroll1/table1 draw_tabl(node_select, Constants.ROWS_REGS_DATA, Constants.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(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(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, ' ИНТЕРВАЛ') + 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) @@ -90,43 +92,56 @@ func draw_tabl(tbl, row: Array, count_row: int): 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 rx_data: - $BROADCAST.text = 'BROADCAST: ' + str(rx_data) - var line_yau07_control = node_select.get_node2(0, 0) - line_yau07_control.text = ' ЯУ-07Б НА СВЯЗИ' - line_yau07_control.modulate = Constants.GREEN - if (address == addr_receive) and (port == port_receive) and flag_online: - unit.parse(rx_data) - var line_board_control = node_select.get_node2(0, 1) - line_board_control.modulate = Constants.GREEN + + if timeout - last_update_time > 0: + 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 rx_data: + $BROADCAST.text = 'BROADCAST: ' + str(rx_data) + $BROADCAST.modulate = Color(1, 1, 1, 1) + var line_yau07_control = node_select.get_node2(0, 0) + line_yau07_control.text = ' ЯУ-07Б НА СВЯЗИ' + line_yau07_control.modulate = Constants.GREEN + last_update_time = 0.0 + + if (address == addr_receive) and (port == port_receive) and flag_online: + unit.parse(rx_data) + var line_board_control = node_select.get_node2(0, 1) + line_board_control.modulate = Constants.GREEN + else: + var line_board_control = node_select.get_node2(0, 1) + line_board_control.modulate = Constants.RED + else: + if sock.get_available_packet_count(): + last_update_time = 0.0 else: - var line_board_control = node_select.get_node2(0, 1) - line_board_control.modulate = Constants.RED + $BROADCAST.modulate = Color(0.5, 0.5, 0.5, 1) + var line_yau07_control = node_select.get_node2(0, 0) + line_yau07_control.text = ' НЕТ СВЯЗИ С ЯУ-07Б' + line_yau07_control.modulate = Constants.RED 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('Ошибка отправки данных') + last_update_time += delta + poll_receive(soc_brodcast) + if flag_online and not flag_interval: + 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) + flag_read_isa = true state_machine() var rc = unit.process(dt) @@ -171,20 +186,25 @@ func on_command_done(_unit) -> void: func state_machine() -> void: var fl_done = (unit.cmd_state == unit.CmdState.DONE) or (unit.cmd_state == unit.CmdState.FAIL) if state == Constants.STATE.WAIT and fl_done: - node_select.set_node_text(3, 1, ' ПРОЧИТАНО ИЗ %x' % port_select) - node_select.set_node_text(1, 1, ' ЗАПИСАТЬ В %x' % port_select) + 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 $write_ISA.disabled = false - state = Constants.STATE.WRITE if flag_continuous else Constants.STATE.WAIT + if flag_read_isa: + state = Constants.STATE.READ + elif flag_write_isa: + state = Constants.STATE.WRITE + else: + state = Constants.STATE.WAIT elif state == Constants.STATE.READ and fl_done: ## Чтение из ИСА unit.send_isa(unit.CmdCode.READ_ISA, [port_select]) - flag_continuous = false - state = Constants.STATE.WRITE if flag_wr_on_timer else Constants.STATE.WAIT + flag_read_isa = false + state = Constants.STATE.WRITE if flag_write_isa else Constants.STATE.WAIT elif state == Constants.STATE.WRITE and fl_done: ## Запись в ИСА unit.send_isa(unit.CmdCode.WRITE_ISA, [port_select, ports_wr[port_select]]) - flag_wr_on_timer = false + flag_write_isa = false state = Constants.STATE.READ @@ -204,8 +224,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 - flag_continuous = true - flag_wr_on_timer = true # Запись + flag_read_isa = true + flag_write_isa = true # Запись func _on_written_interval(write_interval) -> void: @@ -220,7 +240,7 @@ 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_read_isa = false # Чтение flag_online = true save_settings() else: