// Core models with clean typing export interface JointState { name: string; value: number; // Normalized value (-100 to +100 for regular joints, 0-100 for grippers) limits?: { lower: number; upper: number }; // URDF limits in radians servoId?: number; // For hardware mapping } export interface JointCalibration { isCalibrated: boolean; minServoValue?: number; maxServoValue?: number; } export interface RobotCommand { joints: { name: string; value: number }[]; timestamp?: number; } export interface ConnectionStatus { isConnected: boolean; error?: string; lastConnected?: Date; } export interface Position3D { x: number; y: number; z: number; } // Driver configurations export interface USBDriverConfig { type: 'usb'; baudRate?: number; } export interface RemoteDriverConfig { type: 'remote'; url: string; robotId: string; workspaceId?: string; // Optional workspace ID for remote connections } // Driver base interface export interface Driver { readonly id: string; readonly name: string; readonly status: ConnectionStatus; connect(): Promise; disconnect(): Promise; onStatusChange(callback: (status: ConnectionStatus) => void): () => void; } // Consumer interface (receives commands) - Robot can only have ONE export interface Consumer extends Driver { onCommand(callback: (command: RobotCommand) => void): () => void; startListening?(): Promise; stopListening?(): Promise; } // Producer interface (sends commands) - Robot can have MULTIPLE export interface Producer extends Driver { sendCommand(command: RobotCommand): Promise; } // Calibration state for UI components export interface CalibrationState { isCalibrating: boolean; progress: number; }