diff --git a/src/gui/main_window.py b/src/gui/main_window.py index dd38e16..a7bc515 100644 --- a/src/gui/main_window.py +++ b/src/gui/main_window.py @@ -1146,6 +1146,7 @@ class MainWindow(ctk.CTk): boot_delay = self._config.boot_wait_delay uart_alive = (self._uart_monitor is not None and self._uart_monitor.is_running()) + discovered_ip: str = "" if uart_alive: self._log_message(f" ⏳ Waiting for UART boot signal (max {boot_delay}s)...") elapsed = 0.0 @@ -1156,6 +1157,7 @@ class MainWindow(ctk.CTk): f" ✓ Boot detected after {elapsed:.1f}s" f" (IP={info.ip_address}, Ver={info.version})" ) + discovered_ip = info.ip_address break time.sleep(0.5) elapsed += 0.5 @@ -1165,6 +1167,23 @@ class MainWindow(ctk.CTk): self._log_message(f" ⏳ UART unavailable — sleeping {boot_delay}s for boot...") time.sleep(boot_delay) + # Discover actual IP after reboot (may have changed via DHCP) + if not discovered_ip: + self._log_message(" Scanning for Zynq IP (192.168.100.11–30)...") + discovered_ip = self._discover_zynq_ip() + if discovered_ip: + self._log_message(f" ✓ Found Zynq at {discovered_ip}") + else: + self._log_message(" ⚠ Zynq not found on any scanned IP") + + if discovered_ip and discovered_ip != self._config.zynq_ip: + self._log_message( + f" IP changed: {self._config.zynq_ip} → {discovered_ip}" + ) + self._config.zynq_ip = discovered_ip + if self._ip_string_var: + self._ip_string_var.set(discovered_ip) + # 4e: Verify boot self._log_message("Step 4e: Verifying boot...") if hasattr(self, '_tftp_sub_step_frame'): @@ -1655,6 +1674,27 @@ class MainWindow(ctk.CTk): threading.Thread(target=_thread, daemon=True).start() + def _discover_zynq_ip(self) -> str: + """Scan IP range to find the Zynq after reboot. + + Sends UDP ver() to each candidate IP (port = last_octet - 3) + and returns the first IP that responds. + + Returns: + Discovered IP address, or empty string if not found. + """ + subnet = "192.168.100" + for last in range(11, 31): + ip = f"{subnet}.{last}" + try: + from reboot_manager import _send_udp_command + ok, _resp = _send_udp_command(ip, b"ver()", timeout=0.5) + if ok: + return ip + except Exception: + continue + return "" + # ── Vitis Check ──────────────────────────────────────────── def _check_vitis(self) -> None: