"use client" import { useState, useMemo } from "react" import { Download } from "lucide-react" import { Button } from "@/components/ui/button" import { Card } from "@/components/ui/card" import { lerobot } from "@/lib/mock-api" import { useLocalStorage } from "@/hooks/use-local-storage" import { MotorCalibrationVisual } from "@/components/motor-calibration-visual" import type { RobotConnection, LiveCalibrationData, WebCalibrationResults } from "@/types/robot" interface CalibrationViewProps { robot: RobotConnection } export function CalibrationView({ robot }: CalibrationViewProps) { const [status, setStatus] = useState("Ready to calibrate.") const [liveData, setLiveData] = useState(null) const [isCalibrating, setIsCalibrating] = useState(false) const [calibrationProcess, setCalibrationProcess] = useState<{ stop: () => void result: Promise } | null>(null) const [calibrationResults, setCalibrationResults] = useLocalStorage( `calibration-${robot.robotId}`, null, ) const handleStart = async () => { setIsCalibrating(true) const process = await lerobot.calibrate(robot, { onLiveUpdate: setLiveData, onProgress: setStatus, }) setCalibrationProcess(process) } const handleFinish = async () => { if (calibrationProcess) { calibrationProcess.stop() const results = await calibrationProcess.result setCalibrationResults(results) setIsCalibrating(false) setCalibrationProcess(null) } } const downloadJson = () => { if (!calibrationResults) return const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(calibrationResults, null, 2)) const downloadAnchorNode = document.createElement("a") downloadAnchorNode.setAttribute("href", dataStr) downloadAnchorNode.setAttribute("download", `${robot.robotId}_calibration.json`) document.body.appendChild(downloadAnchorNode) downloadAnchorNode.click() downloadAnchorNode.remove() } const motorData = useMemo( () => liveData ? Object.entries(liveData) : lerobot.MOCK_MOTOR_NAMES.map((name) => [name, { current: 0, min: 4095, max: 0, range: 0 }]), [liveData], ) return (

motor calibration

move all joints to their limits

{!isCalibrating ? ( ) : ( )}
Motor Name
Visual Range
Current
Min
Max
Range
{motorData.map(([name, data]) => ( ))}
) }