diff --git a/tools/openiris_setup.py b/tools/openiris_setup.py index 62b5c90..186fd69 100644 --- a/tools/openiris_setup.py +++ b/tools/openiris_setup.py @@ -680,9 +680,9 @@ def configure_wifi(device: OpenIrisDevice, args = None): if device.set_wifi(selected_network.ssid, password): print("āœ… WiFi configured successfully!") print("šŸ’” Next steps:") - print(" 4. Check WiFi status") - print(" 5. Connect to WiFi (if needed)") - print(" 6. Start streaming when connected") + print(" • Open WiFi menu to connect to WiFi (if needed)") + print(" • Open WiFi menu to check WiFi status") + print(" • Start streaming from the main menu when connected") break else: print("āŒ Invalid network number") @@ -757,12 +757,127 @@ def check_wifi_status(device: OpenIrisDevice, args = None): def attempt_wifi_connection(device: OpenIrisDevice, args = None): device.connect_wifi() - print("šŸ•°ļø Wait a few seconds then check status (option 4)") + print("šŸ•°ļø Wait a few seconds then check status in the WiFi menu") def start_streaming(device: OpenIrisDevice, args = None): device.start_streaming() - print("šŸš€ Streaming started! Use option 8 to monitor logs.") + print("šŸš€ Streaming started! Use 'Monitor logs' from the main menu.") + + +# ----- WiFi submenu ----- +def wifi_auto_setup(device: OpenIrisDevice, args=None): + print("\nāš™ļø Automatic WiFi setup starting...") + scan_timeout = getattr(args, "scan_timeout", 30) if args else 30 + + # 1) Scan + if not device.scan_networks(timeout=scan_timeout): + print("āŒ Auto-setup aborted: no networks found or scan failed") + return + + # 2) Show networks (sorted strongest-first already) + display_networks(device) + + # 3) Select a network (default strongest) + choice = input("Select network number [default: 1] or 'back': ").strip() + if choice.lower() == "back": + return + try: + idx = int(choice) - 1 if choice else 0 + except ValueError: + idx = 0 + + sorted_networks = sorted(device.networks, key=lambda x: x.rssi, reverse=True) + if not (0 <= idx < len(sorted_networks)): + print("āš ļø Invalid selection, using strongest network") + idx = 0 + + selected = sorted_networks[idx] + print(f"\nšŸ” Selected: {selected.ssid if selected.ssid else ''}") + if selected.auth_mode == 0: + password = "" + print("šŸ”“ Open network - no password required") + else: + password = input("Enter WiFi password: ") + + # 4) Configure WiFi + if not device.set_wifi(selected.ssid, password): + print("āŒ Auto-setup aborted: failed to configure WiFi") + return + + # 5) Connect + if not device.connect_wifi(): + print("āŒ Auto-setup aborted: failed to start WiFi connection") + return + + # 6) Wait for IP / connected status + print("ā³ Connecting to WiFi, waiting for IP...") + start = time.time() + timeout_s = 30 + ip = None + last_status = None + while time.time() - start < timeout_s: + status = device.get_wifi_status() + last_status = status + ip = (status or {}).get("ip_address") + if ip and ip not in ("0.0.0.0", "", None): + break + time.sleep(0.5) + + if ip and ip not in ("0.0.0.0", "", None): + print(f"āœ… Connected! IP Address: {ip}") + else: + print("āš ļø Connection not confirmed within timeout") + if last_status: + print(f" Status: {last_status.get('status', 'unknown')} | IP: {last_status.get('ip_address', '-')}") + + +def wifi_menu(device: OpenIrisDevice, args=None): + while True: + print("\nšŸ“¶ WiFi Settings:") + print(f"{str(1):>2} āš™ļø Automatic WiFi setup") + print(f"{str(2):>2} ļæ½ Manual WiFi actions") + print("back šŸ”™ Back") + + choice = input("\nSelect option (1-2 or 'back'): ").strip() + if choice.lower() == "back": + break + + if choice == "1": + wifi_auto_setup(device, args) + elif choice == "2": + wifi_manual_menu(device, args) + else: + print("āŒ Invalid option") + + +def wifi_manual_menu(device: OpenIrisDevice, args=None): + while True: + print("\nšŸ“ WiFi Manual Actions:") + print(f"{str(1):>2} ļæ½ Scan for WiFi networks") + print(f"{str(2):>2} ļæ½ Show available networks") + print(f"{str(3):>2} šŸ” Configure WiFi") + print(f"{str(4):>2} ļæ½ Connect to WiFi") + print(f"{str(5):>2} šŸ›°ļø Check WiFi status") + print("back šŸ”™ Back") + + choice = input("\nSelect option (1-5 or 'back'): ").strip() + if choice.lower() == "back": + break + + sub_map = { + "1": scan_networks, + "2": display_networks, + "3": configure_wifi, + "4": attempt_wifi_connection, + "5": check_wifi_status, + } + + handler = sub_map.get(choice) + if not handler: + print("āŒ Invalid option") + continue + handler(device, args) def switch_device_mode(device: OpenIrisDevice, args = None): @@ -821,20 +936,95 @@ def get_serial(device: OpenIrisDevice, args=None): print(f"šŸ”— MAC: {mac}") +# ----- Aggregated GET: settings summary ----- +def _probe_serial(device: OpenIrisDevice) -> Dict: + info = device.get_serial_info() + if info is None: + return {"serial": None, "mac": None} + serial, mac = info + return {"serial": serial, "mac": mac} + + +def _probe_led_pwm(device: OpenIrisDevice) -> Dict: + duty = device.get_led_duty_cycle() + return {"led_external_pwm_duty_cycle": duty} + + +def _probe_mode(device: OpenIrisDevice) -> Dict: + mode = device.get_device_mode() + return {"mode": mode} + + +def _probe_wifi_status(device: OpenIrisDevice) -> Dict: + # Returns dict as provided by device; pass through + status = device.get_wifi_status() or {} + return {"wifi_status": status} + + +def get_settings(device: OpenIrisDevice, args=None): + print("\n🧩 Collecting device settings...\n") + + probes = [ + ("Identity", _probe_serial), + ("LED", _probe_led_pwm), + ("Mode", _probe_mode), + ("WiFi", _probe_wifi_status), + ] + + summary: Dict[str, Dict] = {} + + for label, probe in probes: + try: + data = probe(device) + summary[label] = data + except Exception as e: + summary[label] = {"error": str(e)} + + # Pretty print summary + # Identity + ident = summary.get("Identity", {}) + serial = ident.get("serial") + mac = ident.get("mac") + # print(f"šŸ”‘ Serial: {serial}") # Serial display intentionally disabled; MAC is sufficient + if mac: + print(f"šŸ”— MAC: {mac}") + if not serial and not mac: + print("šŸ”‘ Serial/MAC: unavailable") + + # LED + led = summary.get("LED", {}) + duty = led.get("led_external_pwm_duty_cycle") + if duty is not None: + print(f"šŸ’” LED PWM Duty: {duty}%") + else: + print("šŸ’” LED PWM Duty: unknown") + + # Mode + mode = summary.get("Mode", {}).get("mode") + print(f"šŸŽšļø Mode: {mode if mode else 'unknown'}") + + # WiFi + wifi = summary.get("WiFi", {}).get("wifi_status", {}) + if wifi: + status = wifi.get("status", "unknown") + ip = wifi.get("ip_address") or "-" + configured = wifi.get("networks_configured", 0) + print(f"šŸ“¶ WiFi: {status} | IP: {ip} | Networks configured: {configured}") + else: + print("šŸ“¶ WiFi: status unavailable") + + print("") + + COMMANDS_MAP = { - "1": scan_networks, - "2": display_networks, - "3": configure_wifi, - "4": configure_mdns, - "5": configure_mdns, - "6": check_wifi_status, - "7": attempt_wifi_connection, - "8": start_streaming, - "9": switch_device_mode, - "10": set_led_duty_cycle, - "11": get_led_duty_cycle, - "12": monitor_logs, - "13": get_serial, + "1": wifi_menu, + "2": configure_mdns, + "3": configure_mdns, + "4": start_streaming, + "5": switch_device_mode, + "6": set_led_duty_cycle, + "7": monitor_logs, + "8": get_settings, } @@ -923,21 +1113,16 @@ def main(): # Main interaction loop while True: print("\nšŸ”§ Setup Options:") - print("1. šŸ” Scan for WiFi networks") - print("2. šŸ“” Show available networks") - print("3. šŸ” Configure WiFi") - print("4. 🌐 Configure MDNS") - print("5. šŸ’» Configure UVC Name") - print("6. šŸ“¶ Check WiFi status") - print("7. šŸ”— Connect to WiFi") - print("8. šŸš€ Start streaming mode") - print("9. šŸ”„ Switch device mode (WiFi/UVC/Auto)") - print("10. šŸ’” Update PWM Duty Cycle") - print("11. šŸ’” Get PWM Duty Cycle") - print("12. šŸ“– Monitor logs") - print("13. šŸ”‘ Show Serial/MAC") - print("exit. 🚪 Exit") - choice = input("\nSelect option (1-13): ").strip() + print(f"{str(1):>2} ļæ½ WiFi settings") + print(f"{str(2):>2} 🌐 Configure MDNS") + print(f"{str(3):>2} šŸ’» Configure UVC Name") + print(f"{str(4):>2} šŸš€ Start streaming mode") + print(f"{str(5):>2} šŸ”„ Switch device mode (WiFi/UVC/Auto)") + print(f"{str(6):>2} šŸ’” Update PWM Duty Cycle") + print(f"{str(7):>2} šŸ“– Monitor logs") + print(f"{str(8):>2} 🧩 Get settings summary") + print("exit 🚪 Exit") + choice = input("\nSelect option (1-8): ").strip() if choice == "exit": break