@voltras/node-sdk 0.1.1 → 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/bluetooth/index.js.map +1 -1
- package/dist/cjs/errors.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/sdk/voltra-manager.js +13 -2
- package/dist/cjs/sdk/voltra-manager.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/bluetooth/index.js +1 -1
- package/dist/esm/bluetooth/index.js.map +1 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.js +4 -7
- 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/sdk/voltra-manager.js +13 -2
- package/dist/esm/sdk/voltra-manager.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/bluetooth/index.d.ts +1 -1
- package/dist/types/bluetooth/index.d.ts.map +1 -1
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -4
- 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/sdk/voltra-manager.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 +9 -8
- 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
|
@@ -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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol Enums
|
|
3
|
+
*
|
|
4
|
+
* Movement phases, training modes, and parameter IDs with
|
|
5
|
+
* their human-readable name maps.
|
|
6
|
+
*/
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Movement Phases
|
|
9
|
+
// =============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Movement phase during workout.
|
|
12
|
+
* Values match protocol.json telemetry.phases.
|
|
13
|
+
*/
|
|
14
|
+
export var MovementPhase;
|
|
15
|
+
(function (MovementPhase) {
|
|
16
|
+
MovementPhase[MovementPhase["IDLE"] = 0] = "IDLE";
|
|
17
|
+
MovementPhase[MovementPhase["CONCENTRIC"] = 1] = "CONCENTRIC";
|
|
18
|
+
MovementPhase[MovementPhase["HOLD"] = 2] = "HOLD";
|
|
19
|
+
MovementPhase[MovementPhase["ECCENTRIC"] = 3] = "ECCENTRIC";
|
|
20
|
+
MovementPhase[MovementPhase["UNKNOWN"] = -1] = "UNKNOWN";
|
|
21
|
+
})(MovementPhase || (MovementPhase = {}));
|
|
22
|
+
/**
|
|
23
|
+
* Human-readable phase names.
|
|
24
|
+
*/
|
|
25
|
+
export const PhaseNames = {
|
|
26
|
+
[MovementPhase.IDLE]: 'Idle',
|
|
27
|
+
[MovementPhase.CONCENTRIC]: 'Pulling',
|
|
28
|
+
[MovementPhase.HOLD]: 'Hold',
|
|
29
|
+
[MovementPhase.ECCENTRIC]: 'Lowering',
|
|
30
|
+
[MovementPhase.UNKNOWN]: 'Unknown',
|
|
31
|
+
};
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// Parameter IDs
|
|
34
|
+
// =============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* Parameter IDs for device commands.
|
|
37
|
+
* These identify which parameter is being set in 19-byte commands.
|
|
38
|
+
*/
|
|
39
|
+
export var ParameterId;
|
|
40
|
+
(function (ParameterId) {
|
|
41
|
+
/** Base weight setting */
|
|
42
|
+
ParameterId[ParameterId["BASE_WEIGHT"] = 34366] = "BASE_WEIGHT";
|
|
43
|
+
/** Chains resistance */
|
|
44
|
+
ParameterId[ParameterId["CHAINS"] = 34622] = "CHAINS";
|
|
45
|
+
/** Eccentric adjustment */
|
|
46
|
+
ParameterId[ParameterId["ECCENTRIC"] = 34878] = "ECCENTRIC";
|
|
47
|
+
/** Training mode */
|
|
48
|
+
ParameterId[ParameterId["TRAINING_MODE"] = 45135] = "TRAINING_MODE";
|
|
49
|
+
/** Inverse chains resistance */
|
|
50
|
+
ParameterId[ParameterId["INVERSE_CHAINS"] = 45139] = "INVERSE_CHAINS";
|
|
51
|
+
})(ParameterId || (ParameterId = {}));
|
|
52
|
+
/**
|
|
53
|
+
* Human-readable parameter names.
|
|
54
|
+
*/
|
|
55
|
+
export const ParameterNames = {
|
|
56
|
+
[ParameterId.BASE_WEIGHT]: 'Base Weight',
|
|
57
|
+
[ParameterId.CHAINS]: 'Chains',
|
|
58
|
+
[ParameterId.ECCENTRIC]: 'Eccentric',
|
|
59
|
+
[ParameterId.TRAINING_MODE]: 'Training Mode',
|
|
60
|
+
[ParameterId.INVERSE_CHAINS]: 'Inverse Chains',
|
|
61
|
+
};
|
|
62
|
+
// =============================================================================
|
|
63
|
+
// Training Modes
|
|
64
|
+
// =============================================================================
|
|
65
|
+
/**
|
|
66
|
+
* Training mode values for ParameterId.TRAINING_MODE.
|
|
67
|
+
* Values are 2-byte little-endian uint16.
|
|
68
|
+
*/
|
|
69
|
+
export var TrainingMode;
|
|
70
|
+
(function (TrainingMode) {
|
|
71
|
+
/** Idle (0x0000) */
|
|
72
|
+
TrainingMode[TrainingMode["Idle"] = 0] = "Idle";
|
|
73
|
+
/** Weight Training (0x0001) */
|
|
74
|
+
TrainingMode[TrainingMode["WeightTraining"] = 1] = "WeightTraining";
|
|
75
|
+
/** Resistance Band (0x0002) */
|
|
76
|
+
TrainingMode[TrainingMode["ResistanceBand"] = 2] = "ResistanceBand";
|
|
77
|
+
/** Rowing (0x0003) */
|
|
78
|
+
TrainingMode[TrainingMode["Rowing"] = 3] = "Rowing";
|
|
79
|
+
/** Damper (0x0004) */
|
|
80
|
+
TrainingMode[TrainingMode["Damper"] = 4] = "Damper";
|
|
81
|
+
/** Custom Curves (0x0006) */
|
|
82
|
+
TrainingMode[TrainingMode["CustomCurves"] = 6] = "CustomCurves";
|
|
83
|
+
/** Isokinetic (0x0007) */
|
|
84
|
+
TrainingMode[TrainingMode["Isokinetic"] = 7] = "Isokinetic";
|
|
85
|
+
/** Isometric (0x0008) */
|
|
86
|
+
TrainingMode[TrainingMode["Isometric"] = 8] = "Isometric";
|
|
87
|
+
})(TrainingMode || (TrainingMode = {}));
|
|
88
|
+
/**
|
|
89
|
+
* Human-readable training mode names.
|
|
90
|
+
*/
|
|
91
|
+
export const TrainingModeNames = {
|
|
92
|
+
[TrainingMode.Idle]: 'Idle',
|
|
93
|
+
[TrainingMode.WeightTraining]: 'Weight Training',
|
|
94
|
+
[TrainingMode.ResistanceBand]: 'Resistance Band',
|
|
95
|
+
[TrainingMode.Rowing]: 'Rowing',
|
|
96
|
+
[TrainingMode.Damper]: 'Damper',
|
|
97
|
+
[TrainingMode.CustomCurves]: 'Custom Curves',
|
|
98
|
+
[TrainingMode.Isokinetic]: 'Isokinetic',
|
|
99
|
+
[TrainingMode.Isometric]: 'Isometric',
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Valid training mode values (for validation).
|
|
103
|
+
*/
|
|
104
|
+
export const VALID_TRAINING_MODES = [
|
|
105
|
+
TrainingMode.Idle,
|
|
106
|
+
TrainingMode.WeightTraining,
|
|
107
|
+
TrainingMode.ResistanceBand,
|
|
108
|
+
TrainingMode.Rowing,
|
|
109
|
+
TrainingMode.Damper,
|
|
110
|
+
TrainingMode.CustomCurves,
|
|
111
|
+
TrainingMode.Isokinetic,
|
|
112
|
+
TrainingMode.Isometric,
|
|
113
|
+
];
|
|
114
|
+
//# sourceMappingURL=enums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../../../../../src/voltra/protocol/constants/enums.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,iDAAQ,CAAA;IACR,6DAAc,CAAA;IACd,iDAAQ,CAAA;IACR,2DAAa,CAAA;IACb,wDAAY,CAAA;AACd,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAkC;IACvD,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM;IAC5B,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,SAAS;IACrC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM;IAC5B,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,UAAU;IACrC,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,SAAS;CACnC,CAAC;AAEF,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAN,IAAY,WAWX;AAXD,WAAY,WAAW;IACrB,0BAA0B;IAC1B,+DAAoB,CAAA;IACpB,wBAAwB;IACxB,qDAAe,CAAA;IACf,2BAA2B;IAC3B,2DAAkB,CAAA;IAClB,oBAAoB;IACpB,mEAAsB,CAAA;IACtB,gCAAgC;IAChC,qEAAuB,CAAA;AACzB,CAAC,EAXW,WAAW,KAAX,WAAW,QAWtB;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgC;IACzD,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,aAAa;IACxC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC9B,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,WAAW;IACpC,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,eAAe;IAC5C,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,gBAAgB;CAC/C,CAAC;AAEF,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAN,IAAY,YAiBX;AAjBD,WAAY,YAAY;IACtB,oBAAoB;IACpB,+CAAa,CAAA;IACb,+BAA+B;IAC/B,mEAAuB,CAAA;IACvB,+BAA+B;IAC/B,mEAAuB,CAAA;IACvB,sBAAsB;IACtB,mDAAe,CAAA;IACf,sBAAsB;IACtB,mDAAe,CAAA;IACf,6BAA6B;IAC7B,+DAAqB,CAAA;IACrB,0BAA0B;IAC1B,2DAAmB,CAAA;IACnB,yBAAyB;IACzB,yDAAkB,CAAA;AACpB,CAAC,EAjBW,YAAY,KAAZ,YAAY,QAiBvB;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAiC;IAC7D,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM;IAC3B,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,iBAAiB;IAChD,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,iBAAiB;IAChD,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC/B,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC/B,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,eAAe;IAC5C,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,YAAY;IACvC,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,WAAW;CACtC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA4B;IAC3D,YAAY,CAAC,IAAI;IACjB,YAAY,CAAC,cAAc;IAC3B,YAAY,CAAC,cAAc;IAC3B,YAAY,CAAC,MAAM;IACnB,YAAY,CAAC,MAAM;IACnB,YAAY,CAAC,YAAY;IACzB,YAAY,CAAC,UAAU;IACvB,YAAY,CAAC,SAAS;CACd,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol Constants
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all protocol constants from focused modules.
|
|
5
|
+
* Import from this barrel to keep existing import paths working.
|
|
6
|
+
*/
|
|
7
|
+
export { BLE } from './ble-config';
|
|
8
|
+
export { Timing } from './timing';
|
|
9
|
+
export { Auth, Init, Workout } from './connection-commands';
|
|
10
|
+
export { MessageTypes, TelemetryOffsets, NotificationConfigs, ParamIdHex, TrainingModeValues, } from './message-types';
|
|
11
|
+
export { MovementPhase, PhaseNames, ParameterId, ParameterNames, TrainingMode, TrainingModeNames, VALID_TRAINING_MODES, } from './enums';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/voltra/protocol/constants/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,UAAU,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,SAAS,CAAC"}
|