Spaces:
Running
Running
File size: 3,392 Bytes
7a0c9ff |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
/**
* Unified storage for robot device data and calibration
* Manages device persistence using localStorage with serial numbers as keys
*/
import type { WebCalibrationResults } from "@lerobot/web";
export interface DeviceInfo {
serialNumber: string;
robotType: string;
robotId: string;
usbMetadata?: {
vendorId?: number;
productId?: number;
serialNumber?: string;
manufacturer?: string;
product?: string;
};
}
export interface CalibrationMetadata {
timestamp: string;
readCount: number;
}
export interface UnifiedRobotData {
device_info: DeviceInfo;
calibration?: WebCalibrationResults & {
device_type?: string;
device_id?: string;
calibrated_at?: string;
platform?: string;
api?: string;
};
calibration_metadata?: CalibrationMetadata;
}
export function getUnifiedRobotData(
serialNumber: string
): UnifiedRobotData | null {
try {
const key = `lerobotjs-${serialNumber}`;
const data = localStorage.getItem(key);
if (!data) return null;
const parsed = JSON.parse(data);
return parsed as UnifiedRobotData;
} catch (error) {
console.warn(`Failed to load robot data for ${serialNumber}:`, error);
return null;
}
}
export function saveUnifiedRobotData(
serialNumber: string,
data: UnifiedRobotData
): void {
try {
const key = `lerobotjs-${serialNumber}`;
localStorage.setItem(key, JSON.stringify(data));
} catch (error) {
console.warn(`Failed to save robot data for ${serialNumber}:`, error);
}
}
export function saveCalibrationData(
serialNumber: string,
calibrationData: WebCalibrationResults,
metadata: CalibrationMetadata
): void {
try {
const existingData = getUnifiedRobotData(serialNumber);
if (!existingData) {
console.warn(
`No device info found for ${serialNumber}, cannot save calibration`
);
return;
}
const updatedData: UnifiedRobotData = {
...existingData,
calibration: calibrationData,
calibration_metadata: metadata,
};
saveUnifiedRobotData(serialNumber, updatedData);
} catch (error) {
console.warn(`Failed to save calibration data for ${serialNumber}:`, error);
}
}
export function saveDeviceInfo(
serialNumber: string,
deviceInfo: DeviceInfo
): void {
try {
const existingData = getUnifiedRobotData(serialNumber);
const updatedData: UnifiedRobotData = {
...existingData,
device_info: deviceInfo,
};
saveUnifiedRobotData(serialNumber, updatedData);
} catch (error) {
console.warn(`Failed to save device info for ${serialNumber}:`, error);
}
}
export function getAllSavedRobots(): DeviceInfo[] {
try {
const robots: DeviceInfo[] = [];
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key?.startsWith("lerobotjs-")) {
const data = getUnifiedRobotData(key.replace("lerobotjs-", ""));
if (data?.device_info) {
robots.push(data.device_info);
}
}
}
return robots;
} catch (error) {
console.warn("Failed to load saved robots:", error);
return [];
}
}
export function removeRobotData(serialNumber: string): void {
try {
const key = `lerobotjs-${serialNumber}`;
localStorage.removeItem(key);
} catch (error) {
console.warn(`Failed to remove robot data for ${serialNumber}:`, error);
}
}
|