@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,54 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_comment": "Voltra BLE Protocol - Authentication, Initialization, and Telemetry",
|
|
3
|
-
"_version": "1.1.0",
|
|
4
|
-
"ble": {
|
|
5
|
-
"service_uuid": "E4DADA34-0867-8783-9F70-2CA29216C7E4",
|
|
6
|
-
"notify_char_uuid": "55CA1E52-7354-25DE-6AFC-B7DF1E8816AC",
|
|
7
|
-
"write_char_uuid": "A010891D-F50F-44F0-901F-9A2421A9E050",
|
|
8
|
-
"device_name_prefix": "VTR-"
|
|
9
|
-
},
|
|
10
|
-
"auth": {
|
|
11
|
-
"_comment": "41-byte device IDs with proprietary checksums",
|
|
12
|
-
"iphone": "552904c90110000020004f6950686f6e6500000000000000000000000000000084ab1a5f29200172d8",
|
|
13
|
-
"ipad": "552904c90110000020004f69506164000000000000000000000000000000000084ab1a5f292001ea4f"
|
|
14
|
-
},
|
|
15
|
-
"init": {
|
|
16
|
-
"_comment": "Minimal 2-command init sequence (reduced from 22+ in Beyond+ app)",
|
|
17
|
-
"commands": [
|
|
18
|
-
"550f0801aad200002000ff00aa04194000",
|
|
19
|
-
"551f044eaa100000200027811065f8c6b9179047b797d3351c04bffb925cd64100"
|
|
20
|
-
]
|
|
21
|
-
},
|
|
22
|
-
"workout": {
|
|
23
|
-
"_comment": "Workout control commands",
|
|
24
|
-
"prepare": "551204c7aa1014002000110100b04f01db10",
|
|
25
|
-
"setup": "55130403aa10150020000f02006a50823e8f2f",
|
|
26
|
-
"go": "55130403aa1016002000110100893e05008173",
|
|
27
|
-
"stop": "55130403aa101b002000110100893e040037dd"
|
|
28
|
-
},
|
|
29
|
-
"telemetry": {
|
|
30
|
-
"_comment": "Telemetry parsing configuration - message types, byte offsets, movement phases",
|
|
31
|
-
"message_types": {
|
|
32
|
-
"_comment": "First 4 bytes of notifications identify message type",
|
|
33
|
-
"stream": "553a0470",
|
|
34
|
-
"rep_summary": "554a04c6",
|
|
35
|
-
"set_summary": "554f0439",
|
|
36
|
-
"status_update": "553404ac"
|
|
37
|
-
},
|
|
38
|
-
"offsets": {
|
|
39
|
-
"_comment": "Byte offsets for parsing telemetry stream messages",
|
|
40
|
-
"sequence": 6,
|
|
41
|
-
"phase": 13,
|
|
42
|
-
"position": 24,
|
|
43
|
-
"force": 26,
|
|
44
|
-
"velocity": 28
|
|
45
|
-
},
|
|
46
|
-
"phases": {
|
|
47
|
-
"_comment": "Movement phase values (byte at offset 13)",
|
|
48
|
-
"idle": 0,
|
|
49
|
-
"concentric": 1,
|
|
50
|
-
"hold": 2,
|
|
51
|
-
"eccentric": 3
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_comment": "Weight commands (863e register) - 5 to 200 lbs in 5 lb increments",
|
|
3
|
-
"format": {
|
|
4
|
-
"description": "21-byte command structure",
|
|
5
|
-
"length": 21,
|
|
6
|
-
"structure": [
|
|
7
|
-
{ "name": "prefix", "bytes": "0-5", "value": "55130403aa10", "constant": true },
|
|
8
|
-
{ "name": "sequence", "bytes": "6-7", "value": "varies", "encoding": "uint16_le" },
|
|
9
|
-
{ "name": "mode", "bytes": "8-12", "value": "2000110100", "constant": true },
|
|
10
|
-
{ "name": "register", "bytes": "13-14", "value": "863e", "constant": true },
|
|
11
|
-
{ "name": "value", "bytes": "15-16", "value": "weight_in_lbs", "encoding": "uint16_le" },
|
|
12
|
-
{ "name": "checksum", "bytes": "17-19", "value": "varies", "encoding": "3_bytes_hex" },
|
|
13
|
-
{ "name": "padding", "bytes": "20", "value": "00", "constant": true }
|
|
14
|
-
],
|
|
15
|
-
"prefix": "55130403aa10",
|
|
16
|
-
"mode": "2000110100",
|
|
17
|
-
"register": "863e",
|
|
18
|
-
"padding": "00"
|
|
19
|
-
},
|
|
20
|
-
"values": {
|
|
21
|
-
"5": { "seq": "1500", "checksum": "cb3f37", "_full": "55130403aa1015002000110100863e0500cb3f3700" },
|
|
22
|
-
"10": { "seq": "1400", "checksum": "92e941", "_full": "55130403aa1014002000110100863e0a0092e94100" },
|
|
23
|
-
"15": { "seq": "1500", "checksum": "bbc234", "_full": "55130403aa1015002000110100863e0f00bbc23400" },
|
|
24
|
-
"20": { "seq": "1600", "checksum": "314d40", "_full": "55130403aa1016002000110100863e1400314d4000" },
|
|
25
|
-
"25": { "seq": "1700", "checksum": "d8a836", "_full": "55130403aa1017002000110100863e1900d8a83600" },
|
|
26
|
-
"30": { "seq": "1800", "checksum": "9cf934", "_full": "55130403aa1018002000110100863e1e009cf93400" },
|
|
27
|
-
"35": { "seq": "1900", "checksum": "d7aa37", "_full": "55130403aa1019002000110100863e2300d7aa3700" },
|
|
28
|
-
"40": { "seq": "1a00", "checksum": "ccb037", "_full": "55130403aa101a002000110100863e2800ccb03700" },
|
|
29
|
-
"45": { "seq": "1b00", "checksum": "e59b40", "_full": "55130403aa101b002000110100863e2d00e59b4000" },
|
|
30
|
-
"50": { "seq": "1c00", "checksum": "5a2d37", "_full": "55130403aa101c002000110100863e32005a2d3700" },
|
|
31
|
-
"55": { "seq": "1700", "checksum": "fb1112", "_full": "55130403aa1017002000110100863e3700fb111200" },
|
|
32
|
-
"60": { "seq": "1800", "checksum": "1fe937", "_full": "55130403aa1018002000110100863e3c001fe93700" },
|
|
33
|
-
"65": { "seq": "1900", "checksum": "32fc40", "_full": "55130403aa1019002000110100863e410032fc4000" },
|
|
34
|
-
"70": { "seq": "1a00", "checksum": "894f37", "_full": "55130403aa101a002000110100863e4600894f3700" },
|
|
35
|
-
"75": { "seq": "1b00", "checksum": "60aa12", "_full": "55130403aa101b002000110100863e4b0060aa1200" },
|
|
36
|
-
"80": { "seq": "1c00", "checksum": "bf7b43", "_full": "55130403aa101c002000110100863e5000bf7b4300" },
|
|
37
|
-
"85": { "seq": "1d00", "checksum": "965037", "_full": "55130403aa101d002000110100863e550096503700" },
|
|
38
|
-
"90": { "seq": "1e00", "checksum": "ed2d37", "_full": "55130403aa101e002000110100863e5a00ed2d3700" },
|
|
39
|
-
"95": { "seq": "1f00", "checksum": "c40634", "_full": "55130403aa101f002000110100863e5f00c4063400" },
|
|
40
|
-
"100": { "seq": "2000", "checksum": "4ddb12", "_full": "55130403aa1020002000110100863e64004ddb1200" },
|
|
41
|
-
"105": { "seq": "2100", "checksum": "a43e37", "_full": "55130403aa1021002000110100863e6900a43e3700" },
|
|
42
|
-
"110": { "seq": "3000", "checksum": "785740", "_full": "55130403aa1030002000110100863e6e0078574000" },
|
|
43
|
-
"115": { "seq": "3100", "checksum": "00272d", "_full": "55130403aa1031002000110100863e730000272d00" },
|
|
44
|
-
"120": { "seq": "3200", "checksum": "1b3d40", "_full": "55130403aa1032002000110100863e78001b3d4000" },
|
|
45
|
-
"125": { "seq": "3900", "checksum": "ba013f", "_full": "55130403aa1039002000110100863e7d00ba013f00" },
|
|
46
|
-
"130": { "seq": "3a00", "checksum": "c90037", "_full": "55130403aa103a002000110100863e8200c9003700" },
|
|
47
|
-
"135": { "seq": "3b00", "checksum": "e02b34", "_full": "55130403aa103b002000110100863e8700e02b3400" },
|
|
48
|
-
"140": { "seq": "3c00", "checksum": "ae6f12", "_full": "55130403aa103c002000110100863e8c00ae6f1200" },
|
|
49
|
-
"145": { "seq": "3d00", "checksum": "d61f37", "_full": "55130403aa103d002000110100863e9100d61f3700" },
|
|
50
|
-
"150": { "seq": "3e00", "checksum": "6dac2d", "_full": "55130403aa103e002000110100863e96006dac2d00" },
|
|
51
|
-
"155": { "seq": "3f00", "checksum": "844937", "_full": "55130403aa103f002000110100863e9b0084493700" },
|
|
52
|
-
"160": { "seq": "4000", "checksum": "085941", "_full": "55130403aa1040002000110100863ea00008594100" },
|
|
53
|
-
"165": { "seq": "4100", "checksum": "217237", "_full": "55130403aa1041002000110100863ea50021723700" },
|
|
54
|
-
"170": { "seq": "4200", "checksum": "5a0f43", "_full": "55130403aa1042002000110100863eaa005a0f4300" },
|
|
55
|
-
"175": { "seq": "4300", "checksum": "732434", "_full": "55130403aa1043002000110100863eaf0073243400" },
|
|
56
|
-
"180": { "seq": "4400", "checksum": "acf537", "_full": "55130403aa1044002000110100863eb400acf53700" },
|
|
57
|
-
"185": { "seq": "4500", "checksum": "451037", "_full": "55130403aa1045002000110100863eb90045103700" },
|
|
58
|
-
"190": { "seq": "4600", "checksum": "fea312", "_full": "55130403aa1046002000110100863ebe00fea31200" },
|
|
59
|
-
"195": { "seq": "4700", "checksum": "d3b637", "_full": "55130403aa1047002000110100863ec300d3b63700" },
|
|
60
|
-
"200": { "seq": "4800", "checksum": "374e41", "_full": "55130403aa1048002000110100863ec800374e4100" }
|
|
61
|
-
}
|
|
62
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voltra Protocol Constants
|
|
3
|
-
*
|
|
4
|
-
* BLE configuration, authentication, and command constants for
|
|
5
|
-
* Beyond Power Voltra resistance training devices.
|
|
6
|
-
*/
|
|
7
|
-
import { hexToBytes } from '../../shared/utils';
|
|
8
|
-
import protocolData from './data/protocol.json';
|
|
9
|
-
// =============================================================================
|
|
10
|
-
// BLE Configuration
|
|
11
|
-
// =============================================================================
|
|
12
|
-
export const BLE = {
|
|
13
|
-
/** Main service UUID for Voltra devices */
|
|
14
|
-
SERVICE_UUID: protocolData.ble.service_uuid,
|
|
15
|
-
/** Characteristic for receiving notifications */
|
|
16
|
-
NOTIFY_CHAR_UUID: protocolData.ble.notify_char_uuid,
|
|
17
|
-
/** Characteristic for writing commands */
|
|
18
|
-
WRITE_CHAR_UUID: protocolData.ble.write_char_uuid,
|
|
19
|
-
/** Device name prefix for scanning (e.g., "VTR-") */
|
|
20
|
-
DEVICE_NAME_PREFIX: protocolData.ble.device_name_prefix,
|
|
21
|
-
};
|
|
22
|
-
// =============================================================================
|
|
23
|
-
// Timing Configuration
|
|
24
|
-
// =============================================================================
|
|
25
|
-
export const Timing = {
|
|
26
|
-
/** Delay between init commands (ms) */
|
|
27
|
-
INIT_COMMAND_DELAY_MS: 20,
|
|
28
|
-
/** Delay between dual commands like chains/eccentric (ms) */
|
|
29
|
-
DUAL_COMMAND_DELAY_MS: 500,
|
|
30
|
-
/** Timeout for authentication response (ms) */
|
|
31
|
-
AUTH_TIMEOUT_MS: 3000,
|
|
32
|
-
/** Minimum responses expected during auth */
|
|
33
|
-
MIN_AUTH_RESPONSES: 2,
|
|
34
|
-
/** Minimum responses expected after commands */
|
|
35
|
-
MIN_COMMAND_RESPONSES: 4,
|
|
36
|
-
};
|
|
37
|
-
// =============================================================================
|
|
38
|
-
// Authentication
|
|
39
|
-
// =============================================================================
|
|
40
|
-
/**
|
|
41
|
-
* Device authentication identifiers.
|
|
42
|
-
*
|
|
43
|
-
* 41-byte device IDs that identify the connecting app.
|
|
44
|
-
* Both iPhone and iPad IDs work - the Voltra doesn't care which.
|
|
45
|
-
*/
|
|
46
|
-
export const Auth = {
|
|
47
|
-
/** iPhone identity from Beyond+ app */
|
|
48
|
-
DEVICE_ID: hexToBytes(protocolData.auth.iphone),
|
|
49
|
-
/** iPad identity (alternative) */
|
|
50
|
-
DEVICE_ID_IPAD: hexToBytes(protocolData.auth.ipad),
|
|
51
|
-
};
|
|
52
|
-
// =============================================================================
|
|
53
|
-
// Initialization
|
|
54
|
-
// =============================================================================
|
|
55
|
-
/**
|
|
56
|
-
* Minimal 2-command init sequence (reduced from 22+ in Beyond+ app).
|
|
57
|
-
*/
|
|
58
|
-
export const Init = {
|
|
59
|
-
SEQUENCE: protocolData.init.commands.map(hexToBytes),
|
|
60
|
-
};
|
|
61
|
-
// =============================================================================
|
|
62
|
-
// Workout Commands
|
|
63
|
-
// =============================================================================
|
|
64
|
-
/**
|
|
65
|
-
* Workout control commands.
|
|
66
|
-
*
|
|
67
|
-
* To start: set weight -> PREPARE -> SETUP -> GO
|
|
68
|
-
* To stop: STOP
|
|
69
|
-
*/
|
|
70
|
-
export const Workout = {
|
|
71
|
-
/** Prepare for workout (b04f=01) */
|
|
72
|
-
PREPARE: hexToBytes(protocolData.workout.prepare),
|
|
73
|
-
/** Setup workout mode (823e setup) */
|
|
74
|
-
SETUP: hexToBytes(protocolData.workout.setup),
|
|
75
|
-
/** Start resistance (893e=05) */
|
|
76
|
-
GO: hexToBytes(protocolData.workout.go),
|
|
77
|
-
/** Stop resistance (893e=04) */
|
|
78
|
-
STOP: hexToBytes(protocolData.workout.stop),
|
|
79
|
-
};
|
|
80
|
-
// =============================================================================
|
|
81
|
-
// Telemetry Message Types (loaded from protocol.json)
|
|
82
|
-
// =============================================================================
|
|
83
|
-
/**
|
|
84
|
-
* Message type identifiers (first 4 bytes of notifications).
|
|
85
|
-
* Values loaded from protocol.json for single source of truth.
|
|
86
|
-
*/
|
|
87
|
-
export const MessageTypes = {
|
|
88
|
-
/** Real-time telemetry stream (~11 Hz) */
|
|
89
|
-
TELEMETRY_STREAM: hexToBytes(protocolData.telemetry.message_types.stream),
|
|
90
|
-
/** Rep completion summary */
|
|
91
|
-
REP_SUMMARY: hexToBytes(protocolData.telemetry.message_types.rep_summary),
|
|
92
|
-
/** Set completion summary */
|
|
93
|
-
SET_SUMMARY: hexToBytes(protocolData.telemetry.message_types.set_summary),
|
|
94
|
-
/** Status update */
|
|
95
|
-
STATUS_UPDATE: hexToBytes(protocolData.telemetry.message_types.status_update),
|
|
96
|
-
};
|
|
97
|
-
/**
|
|
98
|
-
* Byte offsets for parsing telemetry stream messages.
|
|
99
|
-
* Values loaded from protocol.json for single source of truth.
|
|
100
|
-
*/
|
|
101
|
-
export const TelemetryOffsets = {
|
|
102
|
-
SEQUENCE: protocolData.telemetry.offsets.sequence, // 2 bytes, little-endian
|
|
103
|
-
PHASE: protocolData.telemetry.offsets.phase, // 1 byte
|
|
104
|
-
POSITION: protocolData.telemetry.offsets.position, // 2 bytes, little-endian unsigned
|
|
105
|
-
FORCE: protocolData.telemetry.offsets.force, // 2 bytes, little-endian signed
|
|
106
|
-
VELOCITY: protocolData.telemetry.offsets.velocity, // 2 bytes, little-endian unsigned
|
|
107
|
-
};
|
|
108
|
-
/**
|
|
109
|
-
* Movement phase during workout.
|
|
110
|
-
* Values match protocol.json telemetry.phases.
|
|
111
|
-
*/
|
|
112
|
-
export var MovementPhase;
|
|
113
|
-
(function (MovementPhase) {
|
|
114
|
-
MovementPhase[MovementPhase["IDLE"] = 0] = "IDLE";
|
|
115
|
-
MovementPhase[MovementPhase["CONCENTRIC"] = 1] = "CONCENTRIC";
|
|
116
|
-
MovementPhase[MovementPhase["HOLD"] = 2] = "HOLD";
|
|
117
|
-
MovementPhase[MovementPhase["ECCENTRIC"] = 3] = "ECCENTRIC";
|
|
118
|
-
MovementPhase[MovementPhase["UNKNOWN"] = -1] = "UNKNOWN";
|
|
119
|
-
})(MovementPhase || (MovementPhase = {}));
|
|
120
|
-
/**
|
|
121
|
-
* Human-readable phase names.
|
|
122
|
-
*/
|
|
123
|
-
export const PhaseNames = {
|
|
124
|
-
[MovementPhase.IDLE]: 'Idle',
|
|
125
|
-
[MovementPhase.CONCENTRIC]: 'Pulling',
|
|
126
|
-
[MovementPhase.HOLD]: 'Hold',
|
|
127
|
-
[MovementPhase.ECCENTRIC]: 'Lowering',
|
|
128
|
-
[MovementPhase.UNKNOWN]: 'Unknown',
|
|
129
|
-
};
|
|
130
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/voltra/protocol/constants.ts"],"names":[],"mappings":"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"}
|