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 bg-black/50 flex items-center justify-center z-50"> | |
<div class="bg-slate-800 rounded-lg p-6 max-w-md w-full m-4 space-y-4"> | |
<div class="flex justify-between items-center"> | |
<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 px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-md" | |
> | |
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 px-4 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-md" | |
> | |
Connect Transport Consumer | |
</button> | |
{:else if modalType === 'producer'} | |
<button | |
onclick={async () => { | |
await selectedRobot?.addProducer({ type: 'usb', baudRate: 1000000 }); | |
showConnectionModal = false; | |
}} | |
class="w-full px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-md" | |
> | |
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 px-4 py-2 bg-orange-600 hover:bg-orange-700 text-white rounded-md" | |
> | |
Connect Transport Producer | |
</button> | |
{:else} | |
<p class="text-gray-300">Manual control interface would go here</p> | |
{/if} | |
</div> | |
<div class="text-xs text-slate-500 text-center"> | |
{#if modalType !== 'manual'} | |
Note: USB connections will prompt for calibration if needed | |
{/if} | |
</div> | |
</div> | |
</div> | |
{/if} |