Spaces:
Running
Running
| <script lang="ts"> | |
| import { T } from "@threlte/core"; | |
| import { robotManager } from "../RobotManager.svelte.js"; | |
| import { settings } from "$lib/runes/settings.svelte"; | |
| import RobotItem from "./RobotItem.svelte"; | |
| import type { Robot } from "../Robot.svelte.js"; | |
| let selectedRobot = $state<Robot | null>(null); | |
| let showConnectionModal = $state(false); | |
| let modalType = $state<"consumer" | "producer" | "manual">("consumer"); | |
| function handleRobotClick(robot: Robot, type: "consumer" | "producer" | "manual") { | |
| selectedRobot = robot; | |
| modalType = type; | |
| showConnectionModal = true; | |
| } | |
| // Access reactive robots | |
| const robots = $derived(robotManager.robots); | |
| </script> | |
| <T.Group> | |
| {#each robots as robot (robot.id)} | |
| <RobotItem {robot} onInteract={handleRobotClick} /> | |
| {/each} | |
| </T.Group> | |
| <!-- Connection modal will be added here --> | |
| {#if showConnectionModal && selectedRobot} | |
| <div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"> | |
| <div class="m-4 w-full max-w-md space-y-4 rounded-lg bg-slate-800 p-6"> | |
| <div class="flex items-center justify-between"> | |
| <h2 class="text-lg font-semibold text-white"> | |
| {modalType === "consumer" | |
| ? "Consumer Driver" | |
| : modalType === "producer" | |
| ? "Producer Drivers" | |
| : "Manual Control"} | |
| </h2> | |
| <button | |
| onclick={() => (showConnectionModal = false)} | |
| class="text-gray-400 hover:text-white" | |
| > | |
| ✕ | |
| </button> | |
| </div> | |
| <div class="space-y-3"> | |
| {#if modalType === "consumer"} | |
| <button | |
| onclick={async () => { | |
| await selectedRobot?.setConsumer({ type: "usb", baudRate: 1000000 }); | |
| showConnectionModal = false; | |
| }} | |
| class="w-full rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700" | |
| > | |
| Connect USB Consumer | |
| </button> | |
| <button | |
| onclick={async () => { | |
| await selectedRobot?.setConsumer({ | |
| type: "remote", | |
| url: settings.transportServerUrl | |
| .replace("http://", "ws://") | |
| .replace("https://", "wss://"), | |
| robotId: selectedRobot.id | |
| }); | |
| showConnectionModal = false; | |
| }} | |
| class="w-full rounded-md bg-purple-600 px-4 py-2 text-white hover:bg-purple-700" | |
| > | |
| Connect Transport Consumer | |
| </button> | |
| {:else if modalType === "producer"} | |
| <button | |
| onclick={async () => { | |
| await selectedRobot?.addProducer({ type: "usb", baudRate: 1000000 }); | |
| showConnectionModal = false; | |
| }} | |
| class="w-full rounded-md bg-green-600 px-4 py-2 text-white hover:bg-green-700" | |
| > | |
| Connect USB Producer | |
| </button> | |
| <button | |
| onclick={async () => { | |
| await selectedRobot?.addProducer({ | |
| type: "remote", | |
| url: settings.transportServerUrl | |
| .replace("http://", "ws://") | |
| .replace("https://", "wss://"), | |
| robotId: selectedRobot.id | |
| }); | |
| showConnectionModal = false; | |
| }} | |
| class="w-full rounded-md bg-orange-600 px-4 py-2 text-white hover:bg-orange-700" | |
| > | |
| Connect Transport Producer | |
| </button> | |
| {:else} | |
| <p class="text-gray-300">Manual control interface would go here</p> | |
| {/if} | |
| </div> | |
| <div class="text-center text-xs text-slate-500"> | |
| {#if modalType !== "manual"} | |
| Note: USB connections will prompt for calibration if needed | |
| {/if} | |
| </div> | |
| </div> | |
| </div> | |
| {/if} | |