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);
  }
}