@voltras/node-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/cjs/bluetooth/adapters/base.js +116 -0
- package/dist/cjs/bluetooth/adapters/base.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/index.js +58 -0
- package/dist/cjs/bluetooth/adapters/index.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/native.js +473 -0
- package/dist/cjs/bluetooth/adapters/native.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/node.js +228 -0
- package/dist/cjs/bluetooth/adapters/node.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/types.js +11 -0
- package/dist/cjs/bluetooth/adapters/types.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js +187 -0
- package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/web.js +112 -0
- package/dist/cjs/bluetooth/adapters/web.js.map +1 -0
- package/dist/cjs/bluetooth/controllers/scanner-controller.js +145 -0
- package/dist/cjs/bluetooth/controllers/scanner-controller.js.map +1 -0
- package/dist/cjs/bluetooth/index.js +27 -0
- package/dist/cjs/bluetooth/index.js.map +1 -0
- package/dist/cjs/bluetooth/models/connection.js +68 -0
- package/dist/cjs/bluetooth/models/connection.js.map +1 -0
- package/dist/cjs/bluetooth/models/device.js +26 -0
- package/dist/cjs/bluetooth/models/device.js.map +1 -0
- package/dist/cjs/bluetooth/models/environment.js +106 -0
- package/dist/cjs/bluetooth/models/environment.js.map +1 -0
- package/dist/cjs/errors.js +167 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +116 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/react/hooks.js +262 -0
- package/dist/cjs/react/hooks.js.map +1 -0
- package/dist/cjs/react/index.js +18 -0
- package/dist/cjs/react/index.js.map +1 -0
- package/dist/cjs/sdk/index.js +14 -0
- package/dist/cjs/sdk/index.js.map +1 -0
- package/dist/cjs/sdk/types.js +8 -0
- package/dist/cjs/sdk/types.js.map +1 -0
- package/dist/cjs/sdk/voltra-client.js +632 -0
- package/dist/cjs/sdk/voltra-client.js.map +1 -0
- package/dist/cjs/sdk/voltra-manager.js +419 -0
- package/dist/cjs/sdk/voltra-manager.js.map +1 -0
- package/dist/cjs/shared/index.js +12 -0
- package/dist/cjs/shared/index.js.map +1 -0
- package/dist/cjs/shared/utils.js +51 -0
- package/dist/cjs/shared/utils.js.map +1 -0
- package/dist/cjs/voltra/index.js +56 -0
- package/dist/cjs/voltra/index.js.map +1 -0
- package/dist/cjs/voltra/models/connection.js +68 -0
- package/dist/cjs/voltra/models/connection.js.map +1 -0
- package/dist/cjs/voltra/models/device-filter.js +28 -0
- package/dist/cjs/voltra/models/device-filter.js.map +1 -0
- package/dist/cjs/voltra/models/device.js +152 -0
- package/dist/cjs/voltra/models/device.js.map +1 -0
- package/dist/cjs/voltra/models/telemetry/frame.js +46 -0
- package/dist/cjs/voltra/models/telemetry/frame.js.map +1 -0
- package/dist/cjs/voltra/models/telemetry/index.js +14 -0
- package/dist/cjs/voltra/models/telemetry/index.js.map +1 -0
- package/dist/cjs/voltra/protocol/commands.js +230 -0
- package/dist/cjs/voltra/protocol/commands.js.map +1 -0
- package/dist/cjs/voltra/protocol/constants.js +136 -0
- package/dist/cjs/voltra/protocol/constants.js.map +1 -0
- package/dist/cjs/voltra/protocol/data/chains.json +830 -0
- package/dist/cjs/voltra/protocol/data/eccentric.json +1598 -0
- package/dist/cjs/voltra/protocol/data/protocol.json +54 -0
- package/dist/cjs/voltra/protocol/data/weights.json +62 -0
- package/dist/cjs/voltra/protocol/index.js +25 -0
- package/dist/cjs/voltra/protocol/index.js.map +1 -0
- package/dist/cjs/voltra/protocol/telemetry-decoder.js +146 -0
- package/dist/cjs/voltra/protocol/telemetry-decoder.js.map +1 -0
- package/dist/esm/bluetooth/adapters/base.js +112 -0
- package/dist/esm/bluetooth/adapters/base.js.map +1 -0
- package/dist/esm/bluetooth/adapters/index.js +51 -0
- package/dist/esm/bluetooth/adapters/index.js.map +1 -0
- package/dist/esm/bluetooth/adapters/native.js +469 -0
- package/dist/esm/bluetooth/adapters/native.js.map +1 -0
- package/dist/esm/bluetooth/adapters/node.js +191 -0
- package/dist/esm/bluetooth/adapters/node.js.map +1 -0
- package/dist/esm/bluetooth/adapters/types.js +10 -0
- package/dist/esm/bluetooth/adapters/types.js.map +1 -0
- package/dist/esm/bluetooth/adapters/web-bluetooth-base.js +183 -0
- package/dist/esm/bluetooth/adapters/web-bluetooth-base.js.map +1 -0
- package/dist/esm/bluetooth/adapters/web.js +108 -0
- package/dist/esm/bluetooth/adapters/web.js.map +1 -0
- package/dist/esm/bluetooth/controllers/scanner-controller.js +141 -0
- package/dist/esm/bluetooth/controllers/scanner-controller.js.map +1 -0
- package/dist/esm/bluetooth/index.js +17 -0
- package/dist/esm/bluetooth/index.js.map +1 -0
- package/dist/esm/bluetooth/models/connection.js +63 -0
- package/dist/esm/bluetooth/models/connection.js.map +1 -0
- package/dist/esm/bluetooth/models/device.js +22 -0
- package/dist/esm/bluetooth/models/device.js.map +1 -0
- package/dist/esm/bluetooth/models/environment.js +101 -0
- package/dist/esm/bluetooth/models/environment.js.map +1 -0
- package/dist/esm/errors.js +155 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +72 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/react/hooks.js +257 -0
- package/dist/esm/react/hooks.js.map +1 -0
- package/dist/esm/react/index.js +12 -0
- package/dist/esm/react/index.js.map +1 -0
- package/dist/esm/sdk/index.js +9 -0
- package/dist/esm/sdk/index.js.map +1 -0
- package/dist/esm/sdk/types.js +7 -0
- package/dist/esm/sdk/types.js.map +1 -0
- package/dist/esm/sdk/voltra-client.js +628 -0
- package/dist/esm/sdk/voltra-client.js.map +1 -0
- package/dist/esm/sdk/voltra-manager.js +415 -0
- package/dist/esm/sdk/voltra-manager.js.map +1 -0
- package/dist/esm/shared/index.js +5 -0
- package/dist/esm/shared/index.js.map +1 -0
- package/dist/esm/shared/utils.js +45 -0
- package/dist/esm/shared/utils.js.map +1 -0
- package/dist/esm/voltra/index.js +26 -0
- package/dist/esm/voltra/index.js.map +1 -0
- package/dist/esm/voltra/models/connection.js +63 -0
- package/dist/esm/voltra/models/connection.js.map +1 -0
- package/dist/esm/voltra/models/device-filter.js +23 -0
- package/dist/esm/voltra/models/device-filter.js.map +1 -0
- package/dist/esm/voltra/models/device.js +148 -0
- package/dist/esm/voltra/models/device.js.map +1 -0
- package/dist/esm/voltra/models/telemetry/frame.js +40 -0
- package/dist/esm/voltra/models/telemetry/frame.js.map +1 -0
- package/dist/esm/voltra/models/telemetry/index.js +7 -0
- package/dist/esm/voltra/models/telemetry/index.js.map +1 -0
- package/dist/esm/voltra/protocol/commands.js +224 -0
- package/dist/esm/voltra/protocol/commands.js.map +1 -0
- package/dist/esm/voltra/protocol/constants.js +130 -0
- package/dist/esm/voltra/protocol/constants.js.map +1 -0
- package/dist/esm/voltra/protocol/data/chains.json +830 -0
- package/dist/esm/voltra/protocol/data/eccentric.json +1598 -0
- package/dist/esm/voltra/protocol/data/protocol.json +54 -0
- package/dist/esm/voltra/protocol/data/weights.json +62 -0
- package/dist/esm/voltra/protocol/index.js +9 -0
- package/dist/esm/voltra/protocol/index.js.map +1 -0
- package/dist/esm/voltra/protocol/telemetry-decoder.js +140 -0
- package/dist/esm/voltra/protocol/telemetry-decoder.js.map +1 -0
- package/dist/types/bluetooth/adapters/base.d.ts +85 -0
- package/dist/types/bluetooth/adapters/base.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/index.d.ts +35 -0
- package/dist/types/bluetooth/adapters/index.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/native.d.ts +109 -0
- package/dist/types/bluetooth/adapters/native.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/node.d.ts +91 -0
- package/dist/types/bluetooth/adapters/node.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/types.d.ts +102 -0
- package/dist/types/bluetooth/adapters/types.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts +90 -0
- package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/web.d.ts +57 -0
- package/dist/types/bluetooth/adapters/web.d.ts.map +1 -0
- package/dist/types/bluetooth/controllers/scanner-controller.d.ts +93 -0
- package/dist/types/bluetooth/controllers/scanner-controller.d.ts.map +1 -0
- package/dist/types/bluetooth/index.d.ts +14 -0
- package/dist/types/bluetooth/index.d.ts.map +1 -0
- package/dist/types/bluetooth/models/connection.d.ts +37 -0
- package/dist/types/bluetooth/models/connection.d.ts.map +1 -0
- package/dist/types/bluetooth/models/device.d.ts +25 -0
- package/dist/types/bluetooth/models/device.d.ts.map +1 -0
- package/dist/types/bluetooth/models/environment.d.ts +45 -0
- package/dist/types/bluetooth/models/environment.d.ts.map +1 -0
- package/dist/types/errors.d.ts +113 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/react/hooks.d.ts +130 -0
- package/dist/types/react/hooks.d.ts.map +1 -0
- package/dist/types/react/index.d.ts +12 -0
- package/dist/types/react/index.d.ts.map +1 -0
- package/dist/types/sdk/index.d.ts +11 -0
- package/dist/types/sdk/index.d.ts.map +1 -0
- package/dist/types/sdk/types.d.ts +104 -0
- package/dist/types/sdk/types.d.ts.map +1 -0
- package/dist/types/sdk/voltra-client.d.ts +221 -0
- package/dist/types/sdk/voltra-client.d.ts.map +1 -0
- package/dist/types/sdk/voltra-manager.d.ts +226 -0
- package/dist/types/sdk/voltra-manager.d.ts.map +1 -0
- package/dist/types/shared/index.d.ts +5 -0
- package/dist/types/shared/index.d.ts.map +1 -0
- package/dist/types/shared/utils.d.ts +25 -0
- package/dist/types/shared/utils.d.ts.map +1 -0
- package/dist/types/voltra/index.d.ts +13 -0
- package/dist/types/voltra/index.d.ts.map +1 -0
- package/dist/types/voltra/models/connection.d.ts +37 -0
- package/dist/types/voltra/models/connection.d.ts.map +1 -0
- package/dist/types/voltra/models/device-filter.d.ts +19 -0
- package/dist/types/voltra/models/device-filter.d.ts.map +1 -0
- package/dist/types/voltra/models/device.d.ts +105 -0
- package/dist/types/voltra/models/device.d.ts.map +1 -0
- package/dist/types/voltra/models/telemetry/frame.d.ts +41 -0
- package/dist/types/voltra/models/telemetry/frame.d.ts.map +1 -0
- package/dist/types/voltra/models/telemetry/index.d.ts +8 -0
- package/dist/types/voltra/models/telemetry/index.d.ts.map +1 -0
- package/dist/types/voltra/protocol/commands.d.ts +99 -0
- package/dist/types/voltra/protocol/commands.d.ts.map +1 -0
- package/dist/types/voltra/protocol/constants.d.ts +103 -0
- package/dist/types/voltra/protocol/constants.d.ts.map +1 -0
- package/dist/types/voltra/protocol/index.d.ts +9 -0
- package/dist/types/voltra/protocol/index.d.ts.map +1 -0
- package/dist/types/voltra/protocol/telemetry-decoder.d.ts +45 -0
- package/dist/types/voltra/protocol/telemetry-decoder.d.ts.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VoltraManager
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for the Voltra SDK. Handles device discovery and connection.
|
|
5
|
+
* Returns VoltraClient instances for controlling individual devices.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { VoltraManager } from '@voltras/node-sdk';
|
|
10
|
+
*
|
|
11
|
+
* const manager = new VoltraManager();
|
|
12
|
+
*
|
|
13
|
+
* // Scan for devices
|
|
14
|
+
* const devices = await manager.scan();
|
|
15
|
+
*
|
|
16
|
+
* // Connect to a device (returns a VoltraClient)
|
|
17
|
+
* const client = await manager.connect(devices[0]);
|
|
18
|
+
*
|
|
19
|
+
* // Or connect by name (scans + connects in one step)
|
|
20
|
+
* const client = await manager.connectByName('VTR-123456');
|
|
21
|
+
*
|
|
22
|
+
* // Use the client
|
|
23
|
+
* await client.setWeight(50);
|
|
24
|
+
* client.onFrame((frame) => console.log(frame.position));
|
|
25
|
+
*
|
|
26
|
+
* // Cleanup
|
|
27
|
+
* manager.dispose();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import type { BLEAdapter } from '../bluetooth/adapters/types';
|
|
31
|
+
import type { DiscoveredDevice } from '../bluetooth/models/device';
|
|
32
|
+
import { VoltraClient } from './voltra-client';
|
|
33
|
+
import type { VoltraClientOptions, ScanOptions } from './types';
|
|
34
|
+
/**
|
|
35
|
+
* Supported platforms for BLE.
|
|
36
|
+
*/
|
|
37
|
+
export type Platform = 'web' | 'node' | 'native';
|
|
38
|
+
/**
|
|
39
|
+
* Factory function to create a BLE adapter.
|
|
40
|
+
*/
|
|
41
|
+
export type AdapterFactory = () => BLEAdapter;
|
|
42
|
+
/**
|
|
43
|
+
* Options for creating a VoltraManager.
|
|
44
|
+
*/
|
|
45
|
+
export interface VoltraManagerOptions {
|
|
46
|
+
/**
|
|
47
|
+
* Platform to use. If not specified, auto-detects (web/node).
|
|
48
|
+
* For React Native, use 'native' or import from '@voltras/node-sdk/native'.
|
|
49
|
+
*/
|
|
50
|
+
platform?: Platform;
|
|
51
|
+
/**
|
|
52
|
+
* Custom adapter factory. Overrides platform detection.
|
|
53
|
+
* Use this for advanced scenarios or custom adapters.
|
|
54
|
+
*/
|
|
55
|
+
adapterFactory?: AdapterFactory;
|
|
56
|
+
/**
|
|
57
|
+
* Options to pass to each VoltraClient.
|
|
58
|
+
*/
|
|
59
|
+
clientOptions?: Omit<VoltraClientOptions, 'adapter'>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Options for connectByName.
|
|
63
|
+
*/
|
|
64
|
+
export interface ConnectByNameOptions extends ScanOptions {
|
|
65
|
+
/**
|
|
66
|
+
* Match mode for device name.
|
|
67
|
+
* - 'exact': Name must match exactly
|
|
68
|
+
* - 'contains': Name must contain the string (default)
|
|
69
|
+
* - 'startsWith': Name must start with the string
|
|
70
|
+
*/
|
|
71
|
+
matchMode?: 'exact' | 'contains' | 'startsWith';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Manager event types.
|
|
75
|
+
*/
|
|
76
|
+
export type VoltraManagerEvent = {
|
|
77
|
+
type: 'deviceConnected';
|
|
78
|
+
deviceId: string;
|
|
79
|
+
deviceName: string | null;
|
|
80
|
+
client: VoltraClient;
|
|
81
|
+
} | {
|
|
82
|
+
type: 'deviceDisconnected';
|
|
83
|
+
deviceId: string;
|
|
84
|
+
} | {
|
|
85
|
+
type: 'deviceError';
|
|
86
|
+
deviceId: string;
|
|
87
|
+
error: Error;
|
|
88
|
+
} | {
|
|
89
|
+
type: 'scanStarted';
|
|
90
|
+
} | {
|
|
91
|
+
type: 'scanStopped';
|
|
92
|
+
devices: DiscoveredDevice[];
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Manager event listener.
|
|
96
|
+
*/
|
|
97
|
+
export type VoltraManagerEventListener = (event: VoltraManagerEvent) => void;
|
|
98
|
+
/**
|
|
99
|
+
* Main entry point for the Voltra SDK.
|
|
100
|
+
*/
|
|
101
|
+
export declare class VoltraManager {
|
|
102
|
+
private adapterFactory;
|
|
103
|
+
private readonly clientOptions;
|
|
104
|
+
private readonly platform;
|
|
105
|
+
private clients;
|
|
106
|
+
private clientUnsubscribes;
|
|
107
|
+
private discoveredDevices;
|
|
108
|
+
private _isScanning;
|
|
109
|
+
private scanAdapter;
|
|
110
|
+
private listeners;
|
|
111
|
+
private disposed;
|
|
112
|
+
constructor(options?: VoltraManagerOptions);
|
|
113
|
+
/**
|
|
114
|
+
* Create a manager for web browsers.
|
|
115
|
+
*/
|
|
116
|
+
static forWeb(options?: Omit<VoltraManagerOptions, 'platform'>): VoltraManager;
|
|
117
|
+
/**
|
|
118
|
+
* Create a manager for Node.js.
|
|
119
|
+
*/
|
|
120
|
+
static forNode(options?: Omit<VoltraManagerOptions, 'platform'>): VoltraManager;
|
|
121
|
+
/**
|
|
122
|
+
* Create a manager for React Native.
|
|
123
|
+
* Note: Prefer importing from '@voltras/node-sdk/native' instead.
|
|
124
|
+
*/
|
|
125
|
+
static forNative(options?: Omit<VoltraManagerOptions, 'platform'>): VoltraManager;
|
|
126
|
+
/**
|
|
127
|
+
* Get all connected device IDs.
|
|
128
|
+
*/
|
|
129
|
+
get connectedDeviceIds(): string[];
|
|
130
|
+
/**
|
|
131
|
+
* Get number of connected devices.
|
|
132
|
+
*/
|
|
133
|
+
get connectedCount(): number;
|
|
134
|
+
/**
|
|
135
|
+
* Check if scanning is in progress.
|
|
136
|
+
*/
|
|
137
|
+
get isScanning(): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Get devices discovered in last scan.
|
|
140
|
+
*/
|
|
141
|
+
get devices(): DiscoveredDevice[];
|
|
142
|
+
/**
|
|
143
|
+
* Get a connected device client by ID.
|
|
144
|
+
*/
|
|
145
|
+
getClient(deviceId: string): VoltraClient | undefined;
|
|
146
|
+
/**
|
|
147
|
+
* Get all connected device clients.
|
|
148
|
+
*/
|
|
149
|
+
getAllClients(): VoltraClient[];
|
|
150
|
+
/**
|
|
151
|
+
* Check if a device is connected.
|
|
152
|
+
*/
|
|
153
|
+
isConnected(deviceId: string): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Scan for Voltra devices.
|
|
156
|
+
*
|
|
157
|
+
* @param options Scan options
|
|
158
|
+
* @returns Array of discovered Voltra devices
|
|
159
|
+
*/
|
|
160
|
+
scan(options?: ScanOptions): Promise<DiscoveredDevice[]>;
|
|
161
|
+
/**
|
|
162
|
+
* Connect to a Voltra device.
|
|
163
|
+
*
|
|
164
|
+
* @param device Device to connect to
|
|
165
|
+
* @returns VoltraClient for the connected device
|
|
166
|
+
*/
|
|
167
|
+
connect(device: DiscoveredDevice): Promise<VoltraClient>;
|
|
168
|
+
/**
|
|
169
|
+
* Scan for a device by name and connect to it.
|
|
170
|
+
* This is a convenience method that combines scan() and connect().
|
|
171
|
+
*
|
|
172
|
+
* @param namePattern Name or partial name to search for
|
|
173
|
+
* @param options Connection options
|
|
174
|
+
* @returns VoltraClient for the connected device
|
|
175
|
+
* @throws Error if no matching device is found
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```typescript
|
|
179
|
+
* // Connect to device containing "VTR-123" in its name
|
|
180
|
+
* const client = await manager.connectByName('VTR-123');
|
|
181
|
+
*
|
|
182
|
+
* // Connect to exact name match
|
|
183
|
+
* const client = await manager.connectByName('VTR-123456', { matchMode: 'exact' });
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
connectByName(namePattern: string, options?: ConnectByNameOptions): Promise<VoltraClient>;
|
|
187
|
+
/**
|
|
188
|
+
* Connect to the first available Voltra device.
|
|
189
|
+
* Convenience method for single-device scenarios.
|
|
190
|
+
*
|
|
191
|
+
* @param options Scan options
|
|
192
|
+
* @returns VoltraClient for the connected device
|
|
193
|
+
* @throws Error if no devices are found
|
|
194
|
+
*/
|
|
195
|
+
connectFirst(options?: ScanOptions): Promise<VoltraClient>;
|
|
196
|
+
/**
|
|
197
|
+
* Disconnect a specific device.
|
|
198
|
+
*/
|
|
199
|
+
disconnect(deviceId: string): Promise<void>;
|
|
200
|
+
/**
|
|
201
|
+
* Disconnect all devices.
|
|
202
|
+
*/
|
|
203
|
+
disconnectAll(): Promise<void>;
|
|
204
|
+
/**
|
|
205
|
+
* Subscribe to manager events.
|
|
206
|
+
*/
|
|
207
|
+
subscribe(listener: VoltraManagerEventListener): () => void;
|
|
208
|
+
/**
|
|
209
|
+
* Subscribe to device connected events.
|
|
210
|
+
*/
|
|
211
|
+
onDeviceConnected(callback: (client: VoltraClient, deviceId: string, deviceName: string | null) => void): () => void;
|
|
212
|
+
/**
|
|
213
|
+
* Subscribe to device disconnected events.
|
|
214
|
+
*/
|
|
215
|
+
onDeviceDisconnected(callback: (deviceId: string) => void): () => void;
|
|
216
|
+
/**
|
|
217
|
+
* Dispose of the manager and all connected devices.
|
|
218
|
+
*/
|
|
219
|
+
dispose(): void;
|
|
220
|
+
private detectPlatform;
|
|
221
|
+
private createAdapterFactory;
|
|
222
|
+
private handleClientEvent;
|
|
223
|
+
private emit;
|
|
224
|
+
private ensureNotDisposed;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=voltra-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voltra-manager.d.ts","sourceRoot":"","sources":["../../../src/sdk/voltra-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Utilities
|
|
3
|
+
*
|
|
4
|
+
* Common utilities used across SDK modules.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Delay execution for a specified duration.
|
|
8
|
+
* @param ms Duration in milliseconds
|
|
9
|
+
*/
|
|
10
|
+
export declare function delay(ms: number): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Convert hex string to Uint8Array.
|
|
13
|
+
* @param hex Hex string (e.g., "48656c6c6f")
|
|
14
|
+
*/
|
|
15
|
+
export declare function hexToBytes(hex: string): Uint8Array;
|
|
16
|
+
/**
|
|
17
|
+
* Convert Uint8Array to hex string.
|
|
18
|
+
* @param bytes Byte array
|
|
19
|
+
*/
|
|
20
|
+
export declare function bytesToHex(bytes: Uint8Array): string;
|
|
21
|
+
/**
|
|
22
|
+
* Check if two byte arrays are equal.
|
|
23
|
+
*/
|
|
24
|
+
export declare function bytesEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
25
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/shared/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMlD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAMhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voltra Domain
|
|
3
|
+
*
|
|
4
|
+
* Voltra device management, telemetry processing, and workout control.
|
|
5
|
+
*/
|
|
6
|
+
export { VoltraDevice, DEFAULT_SETTINGS, type VoltraDeviceSettings, type VoltraRecordingState, type VoltraDeviceState, } from './models/device';
|
|
7
|
+
export { type VoltraConnectionState, isValidVoltraTransition, VoltraConnectionStateModel, } from './models/connection';
|
|
8
|
+
export { VOLTRA_DEVICE_PREFIX, isVoltraDevice, filterVoltraDevices } from './models/device-filter';
|
|
9
|
+
export { type TelemetryFrame, createFrame, isActivePhase, isConcentricPhase, isEccentricPhase, } from './models/telemetry';
|
|
10
|
+
export { WeightCommands, ChainsCommands, EccentricCommands, type DualCommand, } from './protocol/commands';
|
|
11
|
+
export { MessageTypes, TelemetryOffsets, Timing, Auth, Init, Workout, BLE, MovementPhase, PhaseNames, } from './protocol/constants';
|
|
12
|
+
export { decodeNotification, decodeTelemetryFrame, encodeTelemetryFrame, identifyMessageType, type DecodeResult, type MessageType, } from './protocol/telemetry-decoder';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/voltra/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,KAAK,qBAAqB,EAC1B,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGnG,OAAO,EACL,KAAK,cAAc,EACnB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,GAAG,EACH,aAAa,EACb,UAAU,GACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voltra Connection Model
|
|
3
|
+
*
|
|
4
|
+
* Voltra-specific connection state that includes the authentication step.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Voltra-specific connection states (includes auth step).
|
|
8
|
+
*/
|
|
9
|
+
export type VoltraConnectionState = 'disconnected' | 'connecting' | 'authenticating' | 'connected';
|
|
10
|
+
/**
|
|
11
|
+
* Check if a Voltra state transition is valid.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidVoltraTransition(from: VoltraConnectionState, to: VoltraConnectionState): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Voltra connection state model with validation.
|
|
16
|
+
*/
|
|
17
|
+
export declare class VoltraConnectionStateModel {
|
|
18
|
+
private _state;
|
|
19
|
+
get state(): VoltraConnectionState;
|
|
20
|
+
get isConnected(): boolean;
|
|
21
|
+
get isConnecting(): boolean;
|
|
22
|
+
get isDisconnected(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Transition to a new state.
|
|
25
|
+
* @throws Error if transition is invalid
|
|
26
|
+
*/
|
|
27
|
+
transitionTo(newState: VoltraConnectionState): void;
|
|
28
|
+
/**
|
|
29
|
+
* Force set state (for reconnection scenarios).
|
|
30
|
+
*/
|
|
31
|
+
forceState(state: VoltraConnectionState): void;
|
|
32
|
+
/**
|
|
33
|
+
* Reset to disconnected state.
|
|
34
|
+
*/
|
|
35
|
+
reset(): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/voltra/models/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,WAAW,CAAC;AAYnG;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,qBAAqB,EAC3B,EAAE,EAAE,qBAAqB,GACxB,OAAO,CAET;AAED;;GAEG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAAyC;IAEvD,IAAI,KAAK,IAAI,qBAAqB,CAEjC;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAOnD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAI9C;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voltra Device Filter
|
|
3
|
+
*
|
|
4
|
+
* Utility functions for filtering Voltra devices from BLE scan results.
|
|
5
|
+
*/
|
|
6
|
+
import { type DiscoveredDevice } from '../../bluetooth/models/device';
|
|
7
|
+
/**
|
|
8
|
+
* Voltra device name prefix.
|
|
9
|
+
*/
|
|
10
|
+
export declare const VOLTRA_DEVICE_PREFIX: string;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a device is a Voltra device.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isVoltraDevice(device: DiscoveredDevice): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Filter Voltra devices from a list.
|
|
17
|
+
*/
|
|
18
|
+
export declare function filterVoltraDevices(devices: DiscoveredDevice[]): DiscoveredDevice[];
|
|
19
|
+
//# sourceMappingURL=device-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-filter.d.ts","sourceRoot":"","sources":["../../../../src/voltra/models/device-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAEhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAEnF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voltra Device Model
|
|
3
|
+
*
|
|
4
|
+
* Represents a Voltra device with its identity, settings, and connection state.
|
|
5
|
+
*/
|
|
6
|
+
import { type VoltraConnectionState } from './connection';
|
|
7
|
+
/**
|
|
8
|
+
* Voltra device settings.
|
|
9
|
+
*/
|
|
10
|
+
export interface VoltraDeviceSettings {
|
|
11
|
+
/** Weight in pounds (5-200 in increments of 5) */
|
|
12
|
+
weight: number;
|
|
13
|
+
/** Chains (reverse resistance) in pounds (0-100) */
|
|
14
|
+
chains: number;
|
|
15
|
+
/** Eccentric load adjustment (-195 to +195) */
|
|
16
|
+
eccentric: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Recording state for a Voltra device.
|
|
20
|
+
*
|
|
21
|
+
* A "recording" is when the device is actively streaming telemetry data,
|
|
22
|
+
* typically during a single set. This is distinct from a "workout" which
|
|
23
|
+
* refers to the full training session containing multiple sets/exercises.
|
|
24
|
+
*/
|
|
25
|
+
export type VoltraRecordingState = 'idle' | 'preparing' | 'ready' | 'active' | 'stopping';
|
|
26
|
+
/**
|
|
27
|
+
* Voltra device state snapshot.
|
|
28
|
+
*/
|
|
29
|
+
export interface VoltraDeviceState {
|
|
30
|
+
deviceId: string;
|
|
31
|
+
deviceName: string | null;
|
|
32
|
+
connectionState: VoltraConnectionState;
|
|
33
|
+
isReconnecting: boolean;
|
|
34
|
+
settings: VoltraDeviceSettings;
|
|
35
|
+
recordingState: VoltraRecordingState;
|
|
36
|
+
recordingStartTime: number | null;
|
|
37
|
+
error: string | null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Default settings for a new device.
|
|
41
|
+
*/
|
|
42
|
+
export declare const DEFAULT_SETTINGS: VoltraDeviceSettings;
|
|
43
|
+
/**
|
|
44
|
+
* Voltra device model.
|
|
45
|
+
*
|
|
46
|
+
* Represents a single Voltra device with its state and settings.
|
|
47
|
+
* This is a pure model with no async operations.
|
|
48
|
+
*/
|
|
49
|
+
export declare class VoltraDevice {
|
|
50
|
+
private _deviceId;
|
|
51
|
+
private _deviceName;
|
|
52
|
+
private _settings;
|
|
53
|
+
private _connectionState;
|
|
54
|
+
private _isReconnecting;
|
|
55
|
+
private _recordingState;
|
|
56
|
+
private _recordingStartTime;
|
|
57
|
+
private _error;
|
|
58
|
+
constructor(deviceId: string, deviceName?: string | null);
|
|
59
|
+
get deviceId(): string;
|
|
60
|
+
get deviceName(): string | null;
|
|
61
|
+
get settings(): VoltraDeviceSettings;
|
|
62
|
+
get weight(): number;
|
|
63
|
+
get chains(): number;
|
|
64
|
+
get eccentric(): number;
|
|
65
|
+
get connectionState(): VoltraConnectionState;
|
|
66
|
+
get isConnected(): boolean;
|
|
67
|
+
get isReconnecting(): boolean;
|
|
68
|
+
get recordingState(): VoltraRecordingState;
|
|
69
|
+
get isRecording(): boolean;
|
|
70
|
+
get recordingStartTime(): number | null;
|
|
71
|
+
get error(): string | null;
|
|
72
|
+
/**
|
|
73
|
+
* Update device settings.
|
|
74
|
+
*/
|
|
75
|
+
updateSettings(settings: Partial<VoltraDeviceSettings>): void;
|
|
76
|
+
/**
|
|
77
|
+
* Set connection state.
|
|
78
|
+
*/
|
|
79
|
+
setConnectionState(state: VoltraConnectionState): void;
|
|
80
|
+
/**
|
|
81
|
+
* Set reconnecting flag.
|
|
82
|
+
*/
|
|
83
|
+
setReconnecting(value: boolean): void;
|
|
84
|
+
/**
|
|
85
|
+
* Set recording state.
|
|
86
|
+
*/
|
|
87
|
+
setRecordingState(state: VoltraRecordingState): void;
|
|
88
|
+
/**
|
|
89
|
+
* Set error message.
|
|
90
|
+
*/
|
|
91
|
+
setError(error: string | null): void;
|
|
92
|
+
/**
|
|
93
|
+
* Clear error.
|
|
94
|
+
*/
|
|
95
|
+
clearError(): void;
|
|
96
|
+
/**
|
|
97
|
+
* Get a snapshot of the device state.
|
|
98
|
+
*/
|
|
99
|
+
toState(): VoltraDeviceState;
|
|
100
|
+
/**
|
|
101
|
+
* Reset device to initial state (keeps identity).
|
|
102
|
+
*/
|
|
103
|
+
reset(): void;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../../src/voltra/models/device.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE1F;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAEhC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,eAAe,EAAE,qBAAqB,CAAC;IACvC,cAAc,EAAE,OAAO,CAAC;IAGxB,QAAQ,EAAE,oBAAoB,CAAC;IAG/B,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGlC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,oBAI9B,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,MAAM,CAAgB;gBAElB,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAexD,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,IAAI,QAAQ,IAAI,oBAAoB,CAEnC;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,eAAe,IAAI,qBAAqB,CAE3C;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,cAAc,IAAI,oBAAoB,CAEzC;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAEtC;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAMD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAI7D;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAItD;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIrC;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IASpD;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIpC;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;OAEG;IACH,OAAO,IAAI,iBAAiB;IAa5B;;OAEG;IACH,KAAK,IAAI,IAAI;CAQd"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Frame Model
|
|
3
|
+
*
|
|
4
|
+
* Represents a single telemetry data point from the Voltra device.
|
|
5
|
+
*/
|
|
6
|
+
import { MovementPhase } from '../../protocol/constants';
|
|
7
|
+
/**
|
|
8
|
+
* Real-time telemetry data from a single BLE notification.
|
|
9
|
+
* Received at ~11 Hz during active workouts.
|
|
10
|
+
*/
|
|
11
|
+
export interface TelemetryFrame {
|
|
12
|
+
/** Incrementing sequence number from device */
|
|
13
|
+
sequence: number;
|
|
14
|
+
/** Current movement phase */
|
|
15
|
+
phase: MovementPhase;
|
|
16
|
+
/** Cable extension (0=rest, ~600=full pull) */
|
|
17
|
+
position: number;
|
|
18
|
+
/** Force reading in lbs (positive=concentric, negative=eccentric) */
|
|
19
|
+
force: number;
|
|
20
|
+
/** Movement velocity */
|
|
21
|
+
velocity: number;
|
|
22
|
+
/** When frame was received (ms since epoch) */
|
|
23
|
+
timestamp: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create a telemetry frame from parsed values.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createFrame(sequence: number, phase: MovementPhase, position: number, force: number, velocity: number): TelemetryFrame;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a frame represents active movement.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isActivePhase(frame: TelemetryFrame): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Check if frame is concentric (pulling) phase.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isConcentricPhase(frame: TelemetryFrame): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Check if frame is eccentric (lowering) phase.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isEccentricPhase(frame: TelemetryFrame): boolean;
|
|
41
|
+
//# sourceMappingURL=frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../../../../src/voltra/models/telemetry/frame.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,cAAc,CAShB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAM5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAEhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAE/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/voltra/models/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voltra Protocol Command Builders
|
|
3
|
+
*
|
|
4
|
+
* Builds commands for setting weight, chains, and eccentric resistance.
|
|
5
|
+
*/
|
|
6
|
+
interface ChainsValue {
|
|
7
|
+
step1_seq: string;
|
|
8
|
+
step1_checksum: string;
|
|
9
|
+
step2_seq: string;
|
|
10
|
+
step2_checksum: string;
|
|
11
|
+
}
|
|
12
|
+
interface ChainsData {
|
|
13
|
+
format: {
|
|
14
|
+
step1: {
|
|
15
|
+
prefix: string;
|
|
16
|
+
mode: string;
|
|
17
|
+
register: string;
|
|
18
|
+
padding: string;
|
|
19
|
+
};
|
|
20
|
+
step2: {
|
|
21
|
+
prefix: string;
|
|
22
|
+
mode: string;
|
|
23
|
+
register: string;
|
|
24
|
+
padding: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
values: Record<string, ChainsValue>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Weight command builder for 5-200 lbs in 5 lb increments.
|
|
31
|
+
*/
|
|
32
|
+
export declare const WeightCommands: {
|
|
33
|
+
MIN: number;
|
|
34
|
+
MAX: number;
|
|
35
|
+
INCREMENT: number;
|
|
36
|
+
/** Get available weight values */
|
|
37
|
+
getAvailable(): number[];
|
|
38
|
+
/** Check if a weight value is valid */
|
|
39
|
+
isValid(pounds: number): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get the command to set a specific weight.
|
|
42
|
+
* @param pounds Weight in pounds (5-200 in increments of 5)
|
|
43
|
+
* @returns 21-byte command, or null if weight not available
|
|
44
|
+
*/
|
|
45
|
+
get(pounds: number): Uint8Array | null;
|
|
46
|
+
_build(pounds: number, seq: string, checksum: string, format: {
|
|
47
|
+
prefix: string;
|
|
48
|
+
mode: string;
|
|
49
|
+
register: string;
|
|
50
|
+
padding: string;
|
|
51
|
+
}): Uint8Array;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Dual command result for chains and eccentric.
|
|
55
|
+
*/
|
|
56
|
+
export interface DualCommand {
|
|
57
|
+
step1: Uint8Array;
|
|
58
|
+
step2: Uint8Array;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Chains (reverse resistance) command builder for 0-100 lbs.
|
|
62
|
+
* Requires dual commands: send step1, wait 500ms, send step2.
|
|
63
|
+
*/
|
|
64
|
+
export declare const ChainsCommands: {
|
|
65
|
+
MIN: number;
|
|
66
|
+
MAX: number;
|
|
67
|
+
/** Get available chains values */
|
|
68
|
+
getAvailable(): number[];
|
|
69
|
+
/** Check if a chains value is valid */
|
|
70
|
+
isValid(pounds: number): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Get dual commands to set chains weight.
|
|
73
|
+
* @param pounds Chains weight (0-100)
|
|
74
|
+
* @returns Tuple of (step1, step2) commands, or null if not available
|
|
75
|
+
*/
|
|
76
|
+
get(pounds: number): DualCommand | null;
|
|
77
|
+
_build(pounds: number, step: 1 | 2, seq: string, checksum: string, format: ChainsData["format"]): Uint8Array;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Eccentric load adjustment command builder for -195 to +195.
|
|
81
|
+
* Requires dual commands: send step1, wait 500ms, send step2.
|
|
82
|
+
*/
|
|
83
|
+
export declare const EccentricCommands: {
|
|
84
|
+
MIN: number;
|
|
85
|
+
MAX: number;
|
|
86
|
+
/** Get available eccentric values */
|
|
87
|
+
getAvailable(): number[];
|
|
88
|
+
/** Check if an eccentric value is valid */
|
|
89
|
+
isValid(value: number): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Get dual commands to set eccentric load.
|
|
92
|
+
* @param value Eccentric adjustment (-195 to +195)
|
|
93
|
+
* @returns Tuple of (step1, step2) commands, or null if not available
|
|
94
|
+
*/
|
|
95
|
+
get(value: number): DualCommand | null;
|
|
96
|
+
_build(value: number, step: 1 | 2): Uint8Array;
|
|
97
|
+
};
|
|
98
|
+
export {};
|
|
99
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../src/voltra/protocol/commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,UAAU;IAClB,MAAM,EAAE;QACN,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3E,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5E,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACrC;AAoBD;;GAEG;AACH,eAAO,MAAM,cAAc;;;;IAKzB,kCAAkC;oBAClB,MAAM,EAAE;IAMxB,uCAAuC;oBACvB,MAAM,GAAG,OAAO;IAIhC;;;;OAIG;gBACS,MAAM,GAAG,UAAU,GAAG,IAAI;mBAc5B,MAAM,OACT,MAAM,YACD,MAAM,UACR;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAC1E,UAAU;CAwCd,CAAC;AAMF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc;;;IAIzB,kCAAkC;oBAClB,MAAM,EAAE;IAMxB,uCAAuC;oBACvB,MAAM,GAAG,OAAO;IAIhC;;;;OAIG;gBACS,MAAM,GAAG,WAAW,GAAG,IAAI;mBAkB7B,MAAM,QACR,CAAC,GAAG,CAAC,OACN,MAAM,YACD,MAAM,UACR,UAAU,CAAC,QAAQ,CAAC,GAC3B,UAAU;CAyCd,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;IAI5B,qCAAqC;oBACrB,MAAM,EAAE;IAMxB,2CAA2C;mBAC5B,MAAM,GAAG,OAAO;IAI/B;;;;OAIG;eACQ,MAAM,GAAG,WAAW,GAAG,IAAI;kBAaxB,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU;CA8C/C,CAAC"}
|