@voltras/node-sdk 0.1.2 → 0.2.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/README.md +122 -31
- package/dist/cjs/bluetooth/adapters/native.js +36 -34
- package/dist/cjs/bluetooth/adapters/native.js.map +1 -1
- package/dist/cjs/bluetooth/adapters/node.js +9 -7
- package/dist/cjs/bluetooth/adapters/node.js.map +1 -1
- package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js +6 -4
- package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js.map +1 -1
- package/dist/cjs/bluetooth/adapters/web.js +7 -5
- package/dist/cjs/bluetooth/adapters/web.js.map +1 -1
- package/dist/cjs/bluetooth/controllers/scanner-controller.js +0 -2
- package/dist/cjs/bluetooth/controllers/scanner-controller.js.map +1 -1
- package/dist/cjs/index.js +19 -10
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/hooks.js +2 -6
- package/dist/cjs/react/hooks.js.map +1 -1
- package/dist/cjs/sdk/notification-dispatcher.js +47 -0
- package/dist/cjs/sdk/notification-dispatcher.js.map +1 -0
- package/dist/cjs/sdk/reconnect-handler.js +61 -0
- package/dist/cjs/sdk/reconnect-handler.js.map +1 -0
- package/dist/cjs/sdk/voltra-client.js +206 -72
- package/dist/cjs/sdk/voltra-client.js.map +1 -1
- package/dist/cjs/shared/index.js +5 -1
- package/dist/cjs/shared/index.js.map +1 -1
- package/dist/cjs/shared/logger.js +54 -0
- package/dist/cjs/shared/logger.js.map +1 -0
- package/dist/cjs/voltra/index.js +15 -12
- package/dist/cjs/voltra/index.js.map +1 -1
- package/dist/cjs/voltra/models/device.js +13 -0
- package/dist/cjs/voltra/models/device.js.map +1 -1
- package/dist/cjs/voltra/protocol/commands.js +127 -210
- package/dist/cjs/voltra/protocol/commands.js.map +1 -1
- package/dist/cjs/voltra/protocol/constants/ble-config.js +24 -0
- package/dist/cjs/voltra/protocol/constants/ble-config.js.map +1 -0
- package/dist/cjs/voltra/protocol/constants/connection-commands.js +55 -0
- package/dist/cjs/voltra/protocol/constants/connection-commands.js.map +1 -0
- package/dist/cjs/voltra/protocol/constants/enums.js +117 -0
- package/dist/cjs/voltra/protocol/constants/enums.js.map +1 -0
- package/dist/cjs/voltra/protocol/constants/index.js +32 -0
- package/dist/cjs/voltra/protocol/constants/index.js.map +1 -0
- package/dist/cjs/voltra/protocol/constants/message-types.js +70 -0
- package/dist/cjs/voltra/protocol/constants/message-types.js.map +1 -0
- package/dist/cjs/voltra/protocol/constants/timing.js +21 -0
- package/dist/cjs/voltra/protocol/constants/timing.js.map +1 -0
- package/dist/cjs/voltra/protocol/data/protocol-data.generated.js +7 -0
- package/dist/cjs/voltra/protocol/data/protocol-data.generated.js.map +1 -0
- package/dist/cjs/voltra/protocol/telemetry-decoder.js +122 -6
- package/dist/cjs/voltra/protocol/telemetry-decoder.js.map +1 -1
- package/dist/cjs/voltra/protocol/types.js +9 -0
- package/dist/cjs/voltra/protocol/types.js.map +1 -0
- package/dist/esm/bluetooth/adapters/native.js +36 -34
- package/dist/esm/bluetooth/adapters/native.js.map +1 -1
- package/dist/esm/bluetooth/adapters/node.js +9 -7
- package/dist/esm/bluetooth/adapters/node.js.map +1 -1
- package/dist/esm/bluetooth/adapters/web-bluetooth-base.js +6 -4
- package/dist/esm/bluetooth/adapters/web-bluetooth-base.js.map +1 -1
- package/dist/esm/bluetooth/adapters/web.js +7 -5
- package/dist/esm/bluetooth/adapters/web.js.map +1 -1
- package/dist/esm/bluetooth/controllers/scanner-controller.js +0 -2
- package/dist/esm/bluetooth/controllers/scanner-controller.js.map +1 -1
- package/dist/esm/index.js +3 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/hooks.js +1 -5
- package/dist/esm/react/hooks.js.map +1 -1
- package/dist/esm/sdk/notification-dispatcher.js +44 -0
- package/dist/esm/sdk/notification-dispatcher.js.map +1 -0
- package/dist/esm/sdk/reconnect-handler.js +57 -0
- package/dist/esm/sdk/reconnect-handler.js.map +1 -0
- package/dist/esm/sdk/voltra-client.js +204 -70
- package/dist/esm/sdk/voltra-client.js.map +1 -1
- package/dist/esm/shared/index.js +1 -0
- package/dist/esm/shared/index.js.map +1 -1
- package/dist/esm/shared/logger.js +49 -0
- package/dist/esm/shared/logger.js.map +1 -0
- package/dist/esm/voltra/index.js +3 -8
- package/dist/esm/voltra/index.js.map +1 -1
- package/dist/esm/voltra/models/device.js +13 -0
- package/dist/esm/voltra/models/device.js.map +1 -1
- package/dist/esm/voltra/protocol/commands.js +117 -209
- package/dist/esm/voltra/protocol/commands.js.map +1 -1
- package/dist/esm/voltra/protocol/constants/ble-config.js +18 -0
- package/dist/esm/voltra/protocol/constants/ble-config.js.map +1 -0
- package/dist/esm/voltra/protocol/constants/connection-commands.js +49 -0
- package/dist/esm/voltra/protocol/constants/connection-commands.js.map +1 -0
- package/dist/esm/voltra/protocol/constants/enums.js +114 -0
- package/dist/esm/voltra/protocol/constants/enums.js.map +1 -0
- package/dist/esm/voltra/protocol/constants/index.js +12 -0
- package/dist/esm/voltra/protocol/constants/index.js.map +1 -0
- package/dist/esm/voltra/protocol/constants/message-types.js +64 -0
- package/dist/esm/voltra/protocol/constants/message-types.js.map +1 -0
- package/dist/esm/voltra/protocol/constants/timing.js +18 -0
- package/dist/esm/voltra/protocol/constants/timing.js.map +1 -0
- package/dist/esm/voltra/protocol/data/protocol-data.generated.js +5 -0
- package/dist/esm/voltra/protocol/data/protocol-data.generated.js.map +1 -0
- package/dist/esm/voltra/protocol/telemetry-decoder.js +124 -8
- package/dist/esm/voltra/protocol/telemetry-decoder.js.map +1 -1
- package/dist/esm/voltra/protocol/types.js +8 -0
- package/dist/esm/voltra/protocol/types.js.map +1 -0
- package/dist/types/bluetooth/adapters/native.d.ts.map +1 -1
- package/dist/types/bluetooth/adapters/node.d.ts.map +1 -1
- package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts.map +1 -1
- package/dist/types/bluetooth/adapters/web.d.ts.map +1 -1
- package/dist/types/bluetooth/controllers/scanner-controller.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/react/hooks.d.ts.map +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/index.d.ts.map +1 -1
- package/dist/types/sdk/notification-dispatcher.d.ts +29 -0
- package/dist/types/sdk/notification-dispatcher.d.ts.map +1 -0
- package/dist/types/sdk/reconnect-handler.d.ts +55 -0
- package/dist/types/sdk/reconnect-handler.d.ts.map +1 -0
- package/dist/types/sdk/types.d.ts +35 -0
- package/dist/types/sdk/types.d.ts.map +1 -1
- package/dist/types/sdk/voltra-client.d.ts +77 -2
- package/dist/types/sdk/voltra-client.d.ts.map +1 -1
- package/dist/types/shared/index.d.ts +1 -0
- package/dist/types/shared/index.d.ts.map +1 -1
- package/dist/types/shared/logger.d.ts +39 -0
- package/dist/types/shared/logger.d.ts.map +1 -0
- package/dist/types/voltra/index.d.ts +3 -3
- package/dist/types/voltra/index.d.ts.map +1 -1
- package/dist/types/voltra/models/device.d.ts +11 -1
- package/dist/types/voltra/models/device.d.ts.map +1 -1
- package/dist/types/voltra/protocol/commands.d.ts +47 -87
- package/dist/types/voltra/protocol/commands.d.ts.map +1 -1
- package/dist/types/voltra/protocol/constants/ble-config.d.ts +16 -0
- package/dist/types/voltra/protocol/constants/ble-config.d.ts.map +1 -0
- package/dist/types/voltra/protocol/constants/connection-commands.d.ts +37 -0
- package/dist/types/voltra/protocol/constants/connection-commands.d.ts.map +1 -0
- package/dist/types/voltra/protocol/constants/enums.d.ts +72 -0
- package/dist/types/voltra/protocol/constants/enums.d.ts.map +1 -0
- package/dist/types/voltra/protocol/constants/index.d.ts +12 -0
- package/dist/types/voltra/protocol/constants/index.d.ts.map +1 -0
- package/dist/types/voltra/protocol/constants/message-types.d.ts +52 -0
- package/dist/types/voltra/protocol/constants/message-types.d.ts.map +1 -0
- package/dist/types/voltra/protocol/constants/timing.d.ts +18 -0
- package/dist/types/voltra/protocol/constants/timing.d.ts.map +1 -0
- package/dist/types/voltra/protocol/data/protocol-data.generated.d.ts +3 -0
- package/dist/types/voltra/protocol/data/protocol-data.generated.d.ts.map +1 -0
- package/dist/types/voltra/protocol/telemetry-decoder.d.ts +15 -2
- package/dist/types/voltra/protocol/telemetry-decoder.d.ts.map +1 -1
- package/dist/types/voltra/protocol/types.d.ts +247 -0
- package/dist/types/voltra/protocol/types.d.ts.map +1 -0
- package/package.json +8 -7
- package/dist/cjs/voltra/protocol/constants.js +0 -136
- package/dist/cjs/voltra/protocol/constants.js.map +0 -1
- package/dist/cjs/voltra/protocol/data/chains.json +0 -830
- package/dist/cjs/voltra/protocol/data/eccentric.json +0 -1598
- package/dist/cjs/voltra/protocol/data/protocol.json +0 -54
- package/dist/cjs/voltra/protocol/data/weights.json +0 -62
- package/dist/esm/voltra/protocol/constants.js +0 -130
- package/dist/esm/voltra/protocol/constants.js.map +0 -1
- package/dist/esm/voltra/protocol/data/chains.json +0 -830
- package/dist/esm/voltra/protocol/data/eccentric.json +0 -1598
- package/dist/esm/voltra/protocol/data/protocol.json +0 -54
- package/dist/esm/voltra/protocol/data/weights.json +0 -62
- package/dist/types/voltra/protocol/constants.d.ts +0 -103
- package/dist/types/voltra/protocol/constants.d.ts.map +0 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK Logger
|
|
3
|
+
*
|
|
4
|
+
* Scoped, opt-in debug logging for SDK internals.
|
|
5
|
+
* Silent by default — consumers enable via `setDebugEnabled(true)`.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const log = createLogger('NativeBLE');
|
|
9
|
+
* log.debug('Starting scan...'); // [NativeBLE] Starting scan...
|
|
10
|
+
* log.warn('MTU request failed'); // [NativeBLE] MTU request failed
|
|
11
|
+
* log.error('Connect error:', error); // [NativeBLE] Connect error: ...
|
|
12
|
+
*/
|
|
13
|
+
let debugEnabled = false;
|
|
14
|
+
/**
|
|
15
|
+
* Enable or disable SDK debug logging.
|
|
16
|
+
* When disabled (default), only warnings and errors are emitted.
|
|
17
|
+
*/
|
|
18
|
+
export function setDebugEnabled(enabled) {
|
|
19
|
+
debugEnabled = enabled;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if debug logging is enabled.
|
|
23
|
+
*/
|
|
24
|
+
export function isDebugEnabled() {
|
|
25
|
+
return debugEnabled;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a scoped logger for a module.
|
|
29
|
+
*
|
|
30
|
+
* @param tag Module name shown in brackets, e.g. 'NativeBLE'
|
|
31
|
+
*/
|
|
32
|
+
export function createLogger(tag) {
|
|
33
|
+
const prefix = `[${tag}]`;
|
|
34
|
+
return {
|
|
35
|
+
debug: (...args) => {
|
|
36
|
+
if (debugEnabled) {
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.log(prefix, ...args);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
warn: (...args) => {
|
|
42
|
+
console.warn(prefix, ...args);
|
|
43
|
+
},
|
|
44
|
+
error: (...args) => {
|
|
45
|
+
console.error(prefix, ...args);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/shared/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,YAAY,GAAG,OAAO,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAcD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC;IAE1B,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,IAAI,YAAY,EAAE,CAAC;gBACjB,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/esm/voltra/index.js
CHANGED
|
@@ -3,11 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Voltra device management, telemetry processing, and workout control.
|
|
5
5
|
*/
|
|
6
|
-
// =============================================================================
|
|
7
|
-
// Models
|
|
8
|
-
// =============================================================================
|
|
9
|
-
// Device model
|
|
10
|
-
export { VoltraDevice, DEFAULT_SETTINGS, } from './models/device';
|
|
11
6
|
// Connection model
|
|
12
7
|
export { isValidVoltraTransition, VoltraConnectionStateModel, } from './models/connection';
|
|
13
8
|
// Device filter
|
|
@@ -17,10 +12,10 @@ export { createFrame, isActivePhase, isConcentricPhase, isEccentricPhase, } from
|
|
|
17
12
|
// =============================================================================
|
|
18
13
|
// Protocol
|
|
19
14
|
// =============================================================================
|
|
20
|
-
// Command
|
|
21
|
-
export {
|
|
15
|
+
// Command lookup functions
|
|
16
|
+
export { getWeightCommand, getChainsCommand, getEccentricCommand, getModeCommand, getAvailableWeights, getAvailableChains, getAvailableEccentric, getAvailableModes, } from './protocol/commands';
|
|
22
17
|
// Protocol constants
|
|
23
|
-
export { MessageTypes, TelemetryOffsets, Timing, Auth, Init, Workout, BLE, MovementPhase, PhaseNames, } from './protocol/constants';
|
|
18
|
+
export { MessageTypes, TelemetryOffsets, Timing, Auth, Init, Workout, BLE, MovementPhase, PhaseNames, ParameterId, ParameterNames, TrainingMode, TrainingModeNames, VALID_TRAINING_MODES, } from './protocol/constants';
|
|
24
19
|
// Telemetry decoder (low-level)
|
|
25
20
|
export { decodeNotification, decodeTelemetryFrame, encodeTelemetryFrame, identifyMessageType, } from './protocol/telemetry-decoder';
|
|
26
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/voltra/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/voltra/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,mBAAmB;AACnB,OAAO,EAEL,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAE7B,gBAAgB;AAChB,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAEnG,mBAAmB;AACnB,OAAO,EAEL,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAEhF,2BAA2B;AAC3B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B,qBAAqB;AACrB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,GAAG,EACH,aAAa,EACb,UAAU,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GAGpB,MAAM,8BAA8B,CAAC"}
|
|
@@ -3,13 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Represents a Voltra device with its identity, settings, and connection state.
|
|
5
5
|
*/
|
|
6
|
+
import { TrainingMode } from '../protocol/constants';
|
|
6
7
|
/**
|
|
7
8
|
* Default settings for a new device.
|
|
8
9
|
*/
|
|
9
10
|
export const DEFAULT_SETTINGS = {
|
|
10
11
|
weight: 0,
|
|
11
12
|
chains: 0,
|
|
13
|
+
inverseChains: 0,
|
|
12
14
|
eccentric: 0,
|
|
15
|
+
mode: TrainingMode.Idle,
|
|
16
|
+
battery: null,
|
|
13
17
|
};
|
|
14
18
|
/**
|
|
15
19
|
* Voltra device model.
|
|
@@ -49,6 +53,15 @@ export class VoltraDevice {
|
|
|
49
53
|
get eccentric() {
|
|
50
54
|
return this._settings.eccentric;
|
|
51
55
|
}
|
|
56
|
+
get inverseChains() {
|
|
57
|
+
return this._settings.inverseChains;
|
|
58
|
+
}
|
|
59
|
+
get mode() {
|
|
60
|
+
return this._settings.mode;
|
|
61
|
+
}
|
|
62
|
+
get battery() {
|
|
63
|
+
return this._settings.battery;
|
|
64
|
+
}
|
|
52
65
|
get connectionState() {
|
|
53
66
|
return this._connectionState;
|
|
54
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../src/voltra/models/device.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../src/voltra/models/device.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,224 +1,132 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Voltra Protocol
|
|
2
|
+
* Voltra Protocol Commands
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Simple key-value mapping from operations to commands.
|
|
5
|
+
* Commands are loaded from the consolidated protocol.json.
|
|
6
|
+
* All commands are pre-computed lookup values.
|
|
5
7
|
*/
|
|
6
8
|
import { hexToBytes } from '../../shared/utils';
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const weights = weightsData;
|
|
12
|
-
const chains = chainsData;
|
|
13
|
-
const eccentric = eccentricData;
|
|
9
|
+
import { TrainingMode, VALID_TRAINING_MODES } from './constants';
|
|
10
|
+
import protocolData from './data/protocol-data.generated';
|
|
11
|
+
// Type the imported data
|
|
12
|
+
const protocol = protocolData;
|
|
14
13
|
// =============================================================================
|
|
15
|
-
//
|
|
14
|
+
// Command Maps (initialized from protocol.json)
|
|
16
15
|
// =============================================================================
|
|
16
|
+
/** Weight commands map (5-200 lbs) */
|
|
17
|
+
const weightCommands = {};
|
|
18
|
+
/** Chains commands map (0-100 lbs) */
|
|
19
|
+
const chainsCommands = {};
|
|
20
|
+
/** Eccentric commands map (-195 to +195) */
|
|
21
|
+
const eccentricCommands = {};
|
|
22
|
+
/** Inverse chains commands map (0-100 lbs) */
|
|
23
|
+
const inverseChainsCommands = {};
|
|
24
|
+
// Initialize from consolidated protocol.json
|
|
25
|
+
for (const [lbs, hex] of Object.entries(protocol.commands.weights)) {
|
|
26
|
+
weightCommands[Number(lbs)] = hexToBytes(hex);
|
|
27
|
+
}
|
|
28
|
+
for (const [lbs, hex] of Object.entries(protocol.commands.chains)) {
|
|
29
|
+
chainsCommands[Number(lbs)] = hexToBytes(hex);
|
|
30
|
+
}
|
|
31
|
+
for (const [value, hex] of Object.entries(protocol.commands.eccentric)) {
|
|
32
|
+
eccentricCommands[Number(value)] = hexToBytes(hex);
|
|
33
|
+
}
|
|
34
|
+
for (const [lbs, hex] of Object.entries(protocol.commands.inverseChains)) {
|
|
35
|
+
inverseChainsCommands[Number(lbs)] = hexToBytes(hex);
|
|
36
|
+
}
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// Lookup Functions
|
|
39
|
+
// =============================================================================
|
|
40
|
+
/**
|
|
41
|
+
* Get weight command for specified pounds.
|
|
42
|
+
* @param lbs Weight in pounds (5-200)
|
|
43
|
+
* @returns Command bytes, or null if not available
|
|
44
|
+
*/
|
|
45
|
+
export function getWeightCommand(lbs) {
|
|
46
|
+
return weightCommands[lbs] || null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get chains command for specified pounds.
|
|
50
|
+
* @param lbs Chains weight in pounds (0-100)
|
|
51
|
+
* @returns Command bytes, or null if not available
|
|
52
|
+
*/
|
|
53
|
+
export function getChainsCommand(lbs) {
|
|
54
|
+
return chainsCommands[lbs] || null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get eccentric command for specified value.
|
|
58
|
+
* @param value Eccentric adjustment (-195 to +195)
|
|
59
|
+
* @returns Command bytes, or null if not available
|
|
60
|
+
*/
|
|
61
|
+
export function getEccentricCommand(value) {
|
|
62
|
+
return eccentricCommands[value] || null;
|
|
63
|
+
}
|
|
17
64
|
/**
|
|
18
|
-
*
|
|
65
|
+
* Get available weight values.
|
|
19
66
|
*/
|
|
20
|
-
export
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
getAvailable() {
|
|
26
|
-
return Object.keys(weights.values)
|
|
27
|
-
.map(Number)
|
|
28
|
-
.sort((a, b) => a - b);
|
|
29
|
-
},
|
|
30
|
-
/** Check if a weight value is valid */
|
|
31
|
-
isValid(pounds) {
|
|
32
|
-
return pounds >= this.MIN && pounds <= this.MAX && pounds % this.INCREMENT === 0;
|
|
33
|
-
},
|
|
34
|
-
/**
|
|
35
|
-
* Get the command to set a specific weight.
|
|
36
|
-
* @param pounds Weight in pounds (5-200 in increments of 5)
|
|
37
|
-
* @returns 21-byte command, or null if weight not available
|
|
38
|
-
*/
|
|
39
|
-
get(pounds) {
|
|
40
|
-
const key = String(pounds);
|
|
41
|
-
const values = weights.values;
|
|
42
|
-
const format = weights.format;
|
|
43
|
-
if (!(key in values)) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
const data = values[key];
|
|
47
|
-
return this._build(pounds, data.seq, data.checksum, format);
|
|
48
|
-
},
|
|
49
|
-
_build(pounds, seq, checksum, format) {
|
|
50
|
-
const cmd = new Uint8Array(21);
|
|
51
|
-
let offset = 0;
|
|
52
|
-
// Prefix
|
|
53
|
-
const prefix = hexToBytes(format.prefix);
|
|
54
|
-
cmd.set(prefix, offset);
|
|
55
|
-
offset += prefix.length;
|
|
56
|
-
// Sequence
|
|
57
|
-
const seqBytes = hexToBytes(seq);
|
|
58
|
-
cmd.set(seqBytes, offset);
|
|
59
|
-
offset += seqBytes.length;
|
|
60
|
-
// Mode
|
|
61
|
-
const mode = hexToBytes(format.mode);
|
|
62
|
-
cmd.set(mode, offset);
|
|
63
|
-
offset += mode.length;
|
|
64
|
-
// Register
|
|
65
|
-
const register = hexToBytes(format.register);
|
|
66
|
-
cmd.set(register, offset);
|
|
67
|
-
offset += register.length;
|
|
68
|
-
// Value (little-endian uint16)
|
|
69
|
-
cmd[offset] = pounds & 0xff;
|
|
70
|
-
cmd[offset + 1] = (pounds >> 8) & 0xff;
|
|
71
|
-
offset += 2;
|
|
72
|
-
// Checksum
|
|
73
|
-
const checksumBytes = hexToBytes(checksum);
|
|
74
|
-
cmd.set(checksumBytes, offset);
|
|
75
|
-
offset += checksumBytes.length;
|
|
76
|
-
// Padding
|
|
77
|
-
const padding = hexToBytes(format.padding);
|
|
78
|
-
cmd.set(padding, offset);
|
|
79
|
-
return cmd;
|
|
80
|
-
},
|
|
81
|
-
};
|
|
67
|
+
export function getAvailableWeights() {
|
|
68
|
+
return Object.keys(weightCommands)
|
|
69
|
+
.map(Number)
|
|
70
|
+
.sort((a, b) => a - b);
|
|
71
|
+
}
|
|
82
72
|
/**
|
|
83
|
-
*
|
|
84
|
-
* Requires dual commands: send step1, wait 500ms, send step2.
|
|
73
|
+
* Get available chains values.
|
|
85
74
|
*/
|
|
86
|
-
export
|
|
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
|
-
_build(pounds, step, seq, checksum, format) {
|
|
118
|
-
const fmt = format[`step${step}`];
|
|
119
|
-
const cmd = new Uint8Array(21);
|
|
120
|
-
let offset = 0;
|
|
121
|
-
// Prefix
|
|
122
|
-
const prefix = hexToBytes(fmt.prefix);
|
|
123
|
-
cmd.set(prefix, offset);
|
|
124
|
-
offset += prefix.length;
|
|
125
|
-
// Sequence
|
|
126
|
-
const seqBytes = hexToBytes(seq);
|
|
127
|
-
cmd.set(seqBytes, offset);
|
|
128
|
-
offset += seqBytes.length;
|
|
129
|
-
// Mode
|
|
130
|
-
const mode = hexToBytes(fmt.mode);
|
|
131
|
-
cmd.set(mode, offset);
|
|
132
|
-
offset += mode.length;
|
|
133
|
-
// Register
|
|
134
|
-
const register = hexToBytes(fmt.register);
|
|
135
|
-
cmd.set(register, offset);
|
|
136
|
-
offset += register.length;
|
|
137
|
-
// Value (little-endian uint16)
|
|
138
|
-
cmd[offset] = pounds & 0xff;
|
|
139
|
-
cmd[offset + 1] = (pounds >> 8) & 0xff;
|
|
140
|
-
offset += 2;
|
|
141
|
-
// Checksum
|
|
142
|
-
const checksumBytes = hexToBytes(checksum);
|
|
143
|
-
cmd.set(checksumBytes, offset);
|
|
144
|
-
offset += checksumBytes.length;
|
|
145
|
-
// Padding
|
|
146
|
-
const padding = hexToBytes(fmt.padding);
|
|
147
|
-
cmd.set(padding, offset);
|
|
148
|
-
return cmd;
|
|
149
|
-
},
|
|
150
|
-
};
|
|
75
|
+
export function getAvailableChains() {
|
|
76
|
+
return Object.keys(chainsCommands)
|
|
77
|
+
.map(Number)
|
|
78
|
+
.sort((a, b) => a - b);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get available eccentric values.
|
|
82
|
+
*/
|
|
83
|
+
export function getAvailableEccentric() {
|
|
84
|
+
return Object.keys(eccentricCommands)
|
|
85
|
+
.map(Number)
|
|
86
|
+
.sort((a, b) => a - b);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get inverse chains command for specified pounds.
|
|
90
|
+
* @param lbs Inverse chains weight in pounds (0-100)
|
|
91
|
+
* @returns Command bytes, or null if not available
|
|
92
|
+
*/
|
|
93
|
+
export function getInverseChainsCommand(lbs) {
|
|
94
|
+
return inverseChainsCommands[lbs] || null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get available inverse chains values.
|
|
98
|
+
*/
|
|
99
|
+
export function getAvailableInverseChains() {
|
|
100
|
+
return Object.keys(inverseChainsCommands)
|
|
101
|
+
.map(Number)
|
|
102
|
+
.sort((a, b) => a - b);
|
|
103
|
+
}
|
|
151
104
|
// =============================================================================
|
|
152
|
-
//
|
|
105
|
+
// Mode Setting Commands
|
|
153
106
|
// =============================================================================
|
|
107
|
+
/** Mode commands map (TrainingMode -> Uint8Array) */
|
|
108
|
+
const modeCommands = new Map([
|
|
109
|
+
[TrainingMode.Idle, hexToBytes(protocol.commands.modes.idle)],
|
|
110
|
+
[TrainingMode.WeightTraining, hexToBytes(protocol.commands.modes.weightTraining)],
|
|
111
|
+
[TrainingMode.ResistanceBand, hexToBytes(protocol.commands.modes.resistanceBand)],
|
|
112
|
+
[TrainingMode.Rowing, hexToBytes(protocol.commands.modes.rowing)],
|
|
113
|
+
[TrainingMode.Damper, hexToBytes(protocol.commands.modes.damper)],
|
|
114
|
+
[TrainingMode.CustomCurves, hexToBytes(protocol.commands.modes.customCurves)],
|
|
115
|
+
[TrainingMode.Isokinetic, hexToBytes(protocol.commands.modes.isokinetic)],
|
|
116
|
+
[TrainingMode.Isometric, hexToBytes(protocol.commands.modes.isometric)],
|
|
117
|
+
]);
|
|
118
|
+
/**
|
|
119
|
+
* Get mode command for specified training mode.
|
|
120
|
+
* @param mode Training mode to set
|
|
121
|
+
* @returns Command bytes, or null if invalid mode
|
|
122
|
+
*/
|
|
123
|
+
export function getModeCommand(mode) {
|
|
124
|
+
return modeCommands.get(mode) || null;
|
|
125
|
+
}
|
|
154
126
|
/**
|
|
155
|
-
*
|
|
156
|
-
* Requires dual commands: send step1, wait 500ms, send step2.
|
|
127
|
+
* Get available training modes.
|
|
157
128
|
*/
|
|
158
|
-
export
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
/** Get available eccentric values */
|
|
162
|
-
getAvailable() {
|
|
163
|
-
return Object.keys(eccentric.step1.checksums)
|
|
164
|
-
.map(Number)
|
|
165
|
-
.sort((a, b) => a - b);
|
|
166
|
-
},
|
|
167
|
-
/** Check if an eccentric value is valid */
|
|
168
|
-
isValid(value) {
|
|
169
|
-
return value >= this.MIN && value <= this.MAX;
|
|
170
|
-
},
|
|
171
|
-
/**
|
|
172
|
-
* Get dual commands to set eccentric load.
|
|
173
|
-
* @param value Eccentric adjustment (-195 to +195)
|
|
174
|
-
* @returns Tuple of (step1, step2) commands, or null if not available
|
|
175
|
-
*/
|
|
176
|
-
get(value) {
|
|
177
|
-
const key = String(value);
|
|
178
|
-
if (!(key in eccentric.step1.checksums)) {
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
return {
|
|
182
|
-
step1: this._build(value, 1),
|
|
183
|
-
step2: this._build(value, 2),
|
|
184
|
-
};
|
|
185
|
-
},
|
|
186
|
-
_build(value, step) {
|
|
187
|
-
const stepKey = `step${step}`;
|
|
188
|
-
const fmt = eccentric.format[stepKey];
|
|
189
|
-
const seq = eccentric[stepKey].sequences[String(value)];
|
|
190
|
-
const checksum = eccentric[stepKey].checksums[String(value)];
|
|
191
|
-
const cmd = new Uint8Array(21);
|
|
192
|
-
let offset = 0;
|
|
193
|
-
// Prefix
|
|
194
|
-
const prefix = hexToBytes(fmt.prefix);
|
|
195
|
-
cmd.set(prefix, offset);
|
|
196
|
-
offset += prefix.length;
|
|
197
|
-
// Sequence
|
|
198
|
-
const seqBytes = hexToBytes(seq);
|
|
199
|
-
cmd.set(seqBytes, offset);
|
|
200
|
-
offset += seqBytes.length;
|
|
201
|
-
// Mode
|
|
202
|
-
const mode = hexToBytes(fmt.mode);
|
|
203
|
-
cmd.set(mode, offset);
|
|
204
|
-
offset += mode.length;
|
|
205
|
-
// Register
|
|
206
|
-
const register = hexToBytes(fmt.register);
|
|
207
|
-
cmd.set(register, offset);
|
|
208
|
-
offset += register.length;
|
|
209
|
-
// Value (little-endian int16, signed)
|
|
210
|
-
const signedValue = value < 0 ? 0x10000 + value : value;
|
|
211
|
-
cmd[offset] = signedValue & 0xff;
|
|
212
|
-
cmd[offset + 1] = (signedValue >> 8) & 0xff;
|
|
213
|
-
offset += 2;
|
|
214
|
-
// Checksum
|
|
215
|
-
const checksumBytes = hexToBytes(checksum);
|
|
216
|
-
cmd.set(checksumBytes, offset);
|
|
217
|
-
offset += checksumBytes.length;
|
|
218
|
-
// Padding
|
|
219
|
-
const padding = hexToBytes(fmt.padding);
|
|
220
|
-
cmd.set(padding, offset);
|
|
221
|
-
return cmd;
|
|
222
|
-
},
|
|
223
|
-
};
|
|
129
|
+
export function getAvailableModes() {
|
|
130
|
+
return [...VALID_TRAINING_MODES];
|
|
131
|
+
}
|
|
224
132
|
//# sourceMappingURL=commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../src/voltra/protocol/commands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../src/voltra/protocol/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BLE Configuration
|
|
3
|
+
*
|
|
4
|
+
* Service UUIDs, characteristic UUIDs, and device naming for Voltra devices.
|
|
5
|
+
*/
|
|
6
|
+
import protocolData from '../data/protocol-data.generated';
|
|
7
|
+
const protocol = protocolData;
|
|
8
|
+
export const BLE = {
|
|
9
|
+
/** Main service UUID for Voltra devices */
|
|
10
|
+
SERVICE_UUID: protocol.ble.serviceUuid,
|
|
11
|
+
/** Characteristic for receiving notifications */
|
|
12
|
+
NOTIFY_CHAR_UUID: protocol.ble.notifyCharUuid,
|
|
13
|
+
/** Characteristic for writing commands */
|
|
14
|
+
WRITE_CHAR_UUID: protocol.ble.writeCharUuid,
|
|
15
|
+
/** Device name prefix for scanning (e.g., "VTR-") */
|
|
16
|
+
DEVICE_NAME_PREFIX: protocol.ble.deviceNamePrefix,
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=ble-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ble-config.js","sourceRoot":"","sources":["../../../../../src/voltra/protocol/constants/ble-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAG3D,MAAM,QAAQ,GAAG,YAA4B,CAAC;AAE9C,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,2CAA2C;IAC3C,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,WAAW;IACtC,iDAAiD;IACjD,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,cAAc;IAC7C,0CAA0C;IAC1C,eAAe,EAAE,QAAQ,CAAC,GAAG,CAAC,aAAa;IAC3C,qDAAqD;IACrD,kBAAkB,EAAE,QAAQ,CAAC,GAAG,CAAC,gBAAgB;CACzC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection Commands
|
|
3
|
+
*
|
|
4
|
+
* Authentication, initialization, and workout control commands.
|
|
5
|
+
*/
|
|
6
|
+
import { hexToBytes } from '../../../shared/utils';
|
|
7
|
+
import protocolData from '../data/protocol-data.generated';
|
|
8
|
+
const protocol = protocolData;
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// Authentication
|
|
11
|
+
// =============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Device authentication identifiers.
|
|
14
|
+
*/
|
|
15
|
+
export const Auth = {
|
|
16
|
+
/** Primary device identity */
|
|
17
|
+
DEVICE_ID: hexToBytes(protocol.commands.auth.iphone),
|
|
18
|
+
/** Alternative device identity */
|
|
19
|
+
DEVICE_ID_IPAD: hexToBytes(protocol.commands.auth.ipad),
|
|
20
|
+
};
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Initialization
|
|
23
|
+
// =============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Device initialization sequence.
|
|
26
|
+
*/
|
|
27
|
+
export const Init = {
|
|
28
|
+
SEQUENCE: protocol.commands.init.map(hexToBytes),
|
|
29
|
+
};
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Workout Commands
|
|
32
|
+
// =============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* Workout control commands.
|
|
35
|
+
*
|
|
36
|
+
* To start: set weight -> PREPARE -> SETUP -> GO
|
|
37
|
+
* To stop: STOP
|
|
38
|
+
*/
|
|
39
|
+
export const Workout = {
|
|
40
|
+
/** Prepare device for workout */
|
|
41
|
+
PREPARE: hexToBytes(protocol.commands.workout.prepare),
|
|
42
|
+
/** Configure workout mode */
|
|
43
|
+
SETUP: hexToBytes(protocol.commands.workout.setup),
|
|
44
|
+
/** Start resistance/tracking */
|
|
45
|
+
GO: hexToBytes(protocol.commands.workout.go),
|
|
46
|
+
/** Stop resistance/tracking */
|
|
47
|
+
STOP: hexToBytes(protocol.commands.workout.stop),
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=connection-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-commands.js","sourceRoot":"","sources":["../../../../../src/voltra/protocol/constants/connection-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAG3D,MAAM,QAAQ,GAAG,YAA4B,CAAC;AAE9C,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,8BAA8B;IAC9B,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACpD,kCAAkC;IAClC,cAAc,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;CAC/C,CAAC;AAEX,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;CACxC,CAAC;AAEX,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,iCAAiC;IACjC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;IACtD,6BAA6B;IAC7B,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;IAClD,gCAAgC;IAChC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,+BAA+B;IAC/B,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;CACxC,CAAC"}
|