brilliantsole 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +21 -0
- package/build/brilliantsole.cjs +5957 -0
- package/build/brilliantsole.cjs.map +1 -0
- package/build/brilliantsole.js +5448 -0
- package/build/brilliantsole.js.map +1 -0
- package/build/brilliantsole.ls.js +4872 -0
- package/build/brilliantsole.ls.js.map +1 -0
- package/build/brilliantsole.min.js +6 -0
- package/build/brilliantsole.min.js.map +1 -0
- package/build/brilliantsole.module.d.ts +908 -0
- package/build/brilliantsole.module.js +5412 -0
- package/build/brilliantsole.module.js.map +1 -0
- package/build/brilliantsole.module.min.d.ts +908 -0
- package/build/brilliantsole.module.min.js +6 -0
- package/build/brilliantsole.module.min.js.map +1 -0
- package/build/brilliantsole.node.module.d.ts +908 -0
- package/build/brilliantsole.node.module.js +5906 -0
- package/build/brilliantsole.node.module.js.map +1 -0
- package/build/dts/BS.d.ts +25 -0
- package/build/dts/Device.d.ts +136 -0
- package/build/dts/DeviceInformationManager.d.ts +56 -0
- package/build/dts/DeviceManager.d.ts +67 -0
- package/build/dts/FileTransferManager.d.ts +84 -0
- package/build/dts/FirmwareManager.d.ts +71 -0
- package/build/dts/InformationManager.d.ts +66 -0
- package/build/dts/TfliteManager.d.ts +92 -0
- package/build/dts/connection/BaseConnectionManager.d.ts +59 -0
- package/build/dts/connection/ClientConnectionManager.d.ts +23 -0
- package/build/dts/connection/WebSocketClientConnectionManager.d.ts +23 -0
- package/build/dts/connection/bluetooth/BluetoothConnectionManager.d.ts +10 -0
- package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +42 -0
- package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +20 -0
- package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +14 -0
- package/build/dts/connection/webSocket/ClientConnectionManager.d.ts +23 -0
- package/build/dts/connection/webSocket/WebSocketClientConnectionManager.d.ts +23 -0
- package/build/dts/devicePair/DevicePair.d.ts +60 -0
- package/build/dts/devicePair/DevicePairPressureSensorDataManager.d.ts +25 -0
- package/build/dts/devicePair/DevicePairSensorDataManager.d.ts +33 -0
- package/build/dts/scanner/BaseScanner.d.ts +66 -0
- package/build/dts/scanner/NobleScanner.d.ts +17 -0
- package/build/dts/scanner/Scanner.d.ts +3 -0
- package/build/dts/sensor/BarometerSensorDataManager.d.ts +16 -0
- package/build/dts/sensor/MotionSensorDataManager.d.ts +69 -0
- package/build/dts/sensor/PressureSensorDataManager.d.ts +36 -0
- package/build/dts/sensor/SensorConfigurationManager.d.ts +44 -0
- package/build/dts/sensor/SensorDataManager.d.ts +40 -0
- package/build/dts/server/BaseClient.d.ts +85 -0
- package/build/dts/server/BaseServer.d.ts +48 -0
- package/build/dts/server/ServerUtils.d.ts +23 -0
- package/build/dts/server/udp/UDPServer.d.ts +11 -0
- package/build/dts/server/udp/UDPUtils.d.ts +9 -0
- package/build/dts/server/websocket/WebSocketClient.d.ts +17 -0
- package/build/dts/server/websocket/WebSocketServer.d.ts +13 -0
- package/build/dts/server/websocket/WebSocketUtils.d.ts +9 -0
- package/build/dts/utils/ArrayBufferUtils.d.ts +7 -0
- package/build/dts/utils/ArrayUtils.d.ts +2 -0
- package/build/dts/utils/CenterOfPressureHelper.d.ts +15 -0
- package/build/dts/utils/Console.d.ts +34 -0
- package/build/dts/utils/EventDispatcher.d.ts +50 -0
- package/build/dts/utils/EventUtils.d.ts +6 -0
- package/build/dts/utils/MathUtils.d.ts +21 -0
- package/build/dts/utils/ParseUtils.d.ts +5 -0
- package/build/dts/utils/RangeHelper.d.ts +8 -0
- package/build/dts/utils/Text.d.ts +6 -0
- package/build/dts/utils/Timer.d.ts +14 -0
- package/build/dts/utils/TypeScriptUtils.d.ts +19 -0
- package/build/dts/utils/cbor.d.ts +6 -0
- package/build/dts/utils/checksum.d.ts +3 -0
- package/build/dts/utils/environment.d.ts +13 -0
- package/build/dts/utils/mcumgr.d.ts +88 -0
- package/build/dts/utils/stringUtils.d.ts +2 -0
- package/build/dts/vibration/VibrationManager.d.ts +45 -0
- package/build/dts/vibration/VibrationWaveformEffects.d.ts +2 -0
- package/build/index.d.ts +908 -0
- package/build/index.node.d.ts +908 -0
- package/examples/3d/index.html +109 -0
- package/examples/3d/scene.html +57 -0
- package/examples/3d/script.js +419 -0
- package/examples/balance/index.html +138 -0
- package/examples/balance/script.js +243 -0
- package/examples/basic/index.html +327 -0
- package/examples/basic/script.js +1093 -0
- package/examples/center-of-pressure/index.html +132 -0
- package/examples/center-of-pressure/script.js +207 -0
- package/examples/device-pair/index.html +72 -0
- package/examples/device-pair/script.js +187 -0
- package/examples/edge-impulse/index.html +94 -0
- package/examples/edge-impulse/script.js +1033 -0
- package/examples/graph/index.html +83 -0
- package/examples/graph/script.js +469 -0
- package/examples/machine-learning/index.html +366 -0
- package/examples/machine-learning/script.js +1774 -0
- package/examples/pressure/index.html +145 -0
- package/examples/pressure/script.js +201 -0
- package/examples/recording/index.html +187 -0
- package/examples/recording/script.js +736 -0
- package/examples/server/index.html +266 -0
- package/examples/server/script.js +925 -0
- package/examples/utils/aframe/fingertip-button-component.js +201 -0
- package/examples/utils/aframe/fingertip-collider-target-component.js +102 -0
- package/examples/utils/aframe/fingertip-colliders-component.js +147 -0
- package/examples/utils/three/three.module.min.js +24846 -0
- package/examples/webxr/index.html +221 -0
- package/examples/webxr/script.js +1127 -0
- package/package.json +83 -0
- package/src/BS.ts +68 -0
- package/src/Device.ts +734 -0
- package/src/DeviceInformationManager.ts +146 -0
- package/src/DeviceManager.ts +354 -0
- package/src/FileTransferManager.ts +452 -0
- package/src/FirmwareManager.ts +357 -0
- package/src/InformationManager.ts +283 -0
- package/src/TfliteManager.ts +450 -0
- package/src/connection/BaseConnectionManager.ts +255 -0
- package/src/connection/ClientConnectionManager.ts +120 -0
- package/src/connection/bluetooth/BluetoothConnectionManager.ts +34 -0
- package/src/connection/bluetooth/NobleConnectionManager.ts +302 -0
- package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +269 -0
- package/src/connection/bluetooth/bluetoothUUIDs.ts +218 -0
- package/src/devicePair/DevicePair.ts +253 -0
- package/src/devicePair/DevicePairPressureSensorDataManager.ts +82 -0
- package/src/devicePair/DevicePairSensorDataManager.ts +90 -0
- package/src/scanner/BaseScanner.ts +189 -0
- package/src/scanner/NobleScanner.ts +195 -0
- package/src/scanner/Scanner.ts +16 -0
- package/src/sensor/BarometerSensorDataManager.ts +41 -0
- package/src/sensor/MotionSensorDataManager.ts +151 -0
- package/src/sensor/PressureSensorDataManager.ts +112 -0
- package/src/sensor/SensorConfigurationManager.ts +177 -0
- package/src/sensor/SensorDataManager.ts +166 -0
- package/src/server/BaseClient.ts +368 -0
- package/src/server/BaseServer.ts +344 -0
- package/src/server/ServerUtils.ts +93 -0
- package/src/server/udp/UDPServer.ts +229 -0
- package/src/server/udp/UDPUtils.ts +20 -0
- package/src/server/websocket/WebSocketClient.ts +179 -0
- package/src/server/websocket/WebSocketServer.ts +184 -0
- package/src/server/websocket/WebSocketUtils.ts +20 -0
- package/src/utils/ArrayBufferUtils.ts +88 -0
- package/src/utils/ArrayUtils.ts +15 -0
- package/src/utils/CenterOfPressureHelper.ts +39 -0
- package/src/utils/Console.ts +156 -0
- package/src/utils/EventDispatcher.ts +153 -0
- package/src/utils/EventUtils.ts +41 -0
- package/src/utils/MathUtils.ts +53 -0
- package/src/utils/ParseUtils.ts +46 -0
- package/src/utils/RangeHelper.ts +38 -0
- package/src/utils/Text.ts +30 -0
- package/src/utils/Timer.ts +72 -0
- package/src/utils/TypeScriptUtils.ts +22 -0
- package/src/utils/cbor.js +429 -0
- package/src/utils/checksum.ts +41 -0
- package/src/utils/environment.ts +46 -0
- package/src/utils/mcumgr.js +444 -0
- package/src/utils/stringUtils.ts +11 -0
- package/src/vibration/VibrationManager.ts +308 -0
- package/src/vibration/VibrationWaveformEffects.ts +128 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The MIT License (MIT)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2014-2016 Patrick Gansterer <paroga@paroga.com>
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
* furnished to do so, subject to the following conditions:
|
|
12
|
+
*
|
|
13
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
* copies or substantial portions of the Software.
|
|
15
|
+
*
|
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
* SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const POW_2_24 = 5.960464477539063e-8;
|
|
26
|
+
const POW_2_32 = 4294967296;
|
|
27
|
+
const POW_2_53 = 9007199254740992;
|
|
28
|
+
|
|
29
|
+
export function encode(value) {
|
|
30
|
+
let data = new ArrayBuffer(256);
|
|
31
|
+
let dataView = new DataView(data);
|
|
32
|
+
let lastLength;
|
|
33
|
+
let offset = 0;
|
|
34
|
+
|
|
35
|
+
function prepareWrite(length) {
|
|
36
|
+
let newByteLength = data.byteLength;
|
|
37
|
+
const requiredLength = offset + length;
|
|
38
|
+
while (newByteLength < requiredLength) {
|
|
39
|
+
newByteLength <<= 1;
|
|
40
|
+
}
|
|
41
|
+
if (newByteLength !== data.byteLength) {
|
|
42
|
+
const oldDataView = dataView;
|
|
43
|
+
data = new ArrayBuffer(newByteLength);
|
|
44
|
+
dataView = new DataView(data);
|
|
45
|
+
const uint32count = (offset + 3) >> 2;
|
|
46
|
+
for (let i = 0; i < uint32count; ++i) {
|
|
47
|
+
dataView.setUint32(i << 2, oldDataView.getUint32(i << 2));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
lastLength = length;
|
|
52
|
+
return dataView;
|
|
53
|
+
}
|
|
54
|
+
function commitWrite() {
|
|
55
|
+
offset += lastLength;
|
|
56
|
+
}
|
|
57
|
+
function writeFloat64(value) {
|
|
58
|
+
commitWrite(prepareWrite(8).setFloat64(offset, value));
|
|
59
|
+
}
|
|
60
|
+
function writeUint8(value) {
|
|
61
|
+
commitWrite(prepareWrite(1).setUint8(offset, value));
|
|
62
|
+
}
|
|
63
|
+
function writeUint8Array(value) {
|
|
64
|
+
const dataView = prepareWrite(value.length);
|
|
65
|
+
for (let i = 0; i < value.length; ++i) {
|
|
66
|
+
dataView.setUint8(offset + i, value[i]);
|
|
67
|
+
}
|
|
68
|
+
commitWrite();
|
|
69
|
+
}
|
|
70
|
+
function writeUint16(value) {
|
|
71
|
+
commitWrite(prepareWrite(2).setUint16(offset, value));
|
|
72
|
+
}
|
|
73
|
+
function writeUint32(value) {
|
|
74
|
+
commitWrite(prepareWrite(4).setUint32(offset, value));
|
|
75
|
+
}
|
|
76
|
+
function writeUint64(value) {
|
|
77
|
+
const low = value % POW_2_32;
|
|
78
|
+
const high = (value - low) / POW_2_32;
|
|
79
|
+
const dataView = prepareWrite(8);
|
|
80
|
+
dataView.setUint32(offset, high);
|
|
81
|
+
dataView.setUint32(offset + 4, low);
|
|
82
|
+
commitWrite();
|
|
83
|
+
}
|
|
84
|
+
function writeTypeAndLength(type, length) {
|
|
85
|
+
if (length < 24) {
|
|
86
|
+
writeUint8((type << 5) | length);
|
|
87
|
+
} else if (length < 0x100) {
|
|
88
|
+
writeUint8((type << 5) | 24);
|
|
89
|
+
writeUint8(length);
|
|
90
|
+
} else if (length < 0x10000) {
|
|
91
|
+
writeUint8((type << 5) | 25);
|
|
92
|
+
writeUint16(length);
|
|
93
|
+
} else if (length < 0x100000000) {
|
|
94
|
+
writeUint8((type << 5) | 26);
|
|
95
|
+
writeUint32(length);
|
|
96
|
+
} else {
|
|
97
|
+
writeUint8((type << 5) | 27);
|
|
98
|
+
writeUint64(length);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function encodeItem(value) {
|
|
103
|
+
let i;
|
|
104
|
+
const utf8data = [];
|
|
105
|
+
let length;
|
|
106
|
+
|
|
107
|
+
if (value === false) {
|
|
108
|
+
return writeUint8(0xf4);
|
|
109
|
+
}
|
|
110
|
+
if (value === true) {
|
|
111
|
+
return writeUint8(0xf5);
|
|
112
|
+
}
|
|
113
|
+
if (value === null) {
|
|
114
|
+
return writeUint8(0xf6);
|
|
115
|
+
}
|
|
116
|
+
if (value === undefined) {
|
|
117
|
+
return writeUint8(0xf7);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
switch (typeof value) {
|
|
121
|
+
case "number":
|
|
122
|
+
if (Math.floor(value) === value) {
|
|
123
|
+
if (value >= 0 && value <= POW_2_53) {
|
|
124
|
+
return writeTypeAndLength(0, value);
|
|
125
|
+
}
|
|
126
|
+
if (-POW_2_53 <= value && value < 0) {
|
|
127
|
+
return writeTypeAndLength(1, -(value + 1));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
writeUint8(0xfb);
|
|
131
|
+
return writeFloat64(value);
|
|
132
|
+
|
|
133
|
+
case "string":
|
|
134
|
+
for (i = 0; i < value.length; ++i) {
|
|
135
|
+
let charCode = value.charCodeAt(i);
|
|
136
|
+
if (charCode < 0x80) {
|
|
137
|
+
utf8data.push(charCode);
|
|
138
|
+
} else if (charCode < 0x800) {
|
|
139
|
+
utf8data.push(0xc0 | (charCode >> 6));
|
|
140
|
+
utf8data.push(0x80 | (charCode & 0x3f));
|
|
141
|
+
} else if (charCode < 0xd800) {
|
|
142
|
+
utf8data.push(0xe0 | (charCode >> 12));
|
|
143
|
+
utf8data.push(0x80 | ((charCode >> 6) & 0x3f));
|
|
144
|
+
utf8data.push(0x80 | (charCode & 0x3f));
|
|
145
|
+
} else {
|
|
146
|
+
charCode = (charCode & 0x3ff) << 10;
|
|
147
|
+
charCode |= value.charCodeAt(++i) & 0x3ff;
|
|
148
|
+
charCode += 0x10000;
|
|
149
|
+
|
|
150
|
+
utf8data.push(0xf0 | (charCode >> 18));
|
|
151
|
+
utf8data.push(0x80 | ((charCode >> 12) & 0x3f));
|
|
152
|
+
utf8data.push(0x80 | ((charCode >> 6) & 0x3f));
|
|
153
|
+
utf8data.push(0x80 | (charCode & 0x3f));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
writeTypeAndLength(3, utf8data.length);
|
|
158
|
+
return writeUint8Array(utf8data);
|
|
159
|
+
|
|
160
|
+
default:
|
|
161
|
+
if (Array.isArray(value)) {
|
|
162
|
+
length = value.length;
|
|
163
|
+
writeTypeAndLength(4, length);
|
|
164
|
+
for (i = 0; i < length; ++i) {
|
|
165
|
+
encodeItem(value[i]);
|
|
166
|
+
}
|
|
167
|
+
} else if (value instanceof Uint8Array) {
|
|
168
|
+
writeTypeAndLength(2, value.length);
|
|
169
|
+
writeUint8Array(value);
|
|
170
|
+
} else {
|
|
171
|
+
const keys = Object.keys(value);
|
|
172
|
+
length = keys.length;
|
|
173
|
+
writeTypeAndLength(5, length);
|
|
174
|
+
for (i = 0; i < length; ++i) {
|
|
175
|
+
const key = keys[i];
|
|
176
|
+
encodeItem(key);
|
|
177
|
+
encodeItem(value[key]);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
encodeItem(value);
|
|
184
|
+
|
|
185
|
+
if ("slice" in data) {
|
|
186
|
+
return data.slice(0, offset);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const ret = new ArrayBuffer(offset);
|
|
190
|
+
const retView = new DataView(ret);
|
|
191
|
+
for (let i = 0; i < offset; ++i) {
|
|
192
|
+
retView.setUint8(i, dataView.getUint8(i));
|
|
193
|
+
}
|
|
194
|
+
return ret;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function decode(data, tagger, simpleValue) {
|
|
198
|
+
const dataView = new DataView(data);
|
|
199
|
+
let offset = 0;
|
|
200
|
+
|
|
201
|
+
if (typeof tagger !== "function") {
|
|
202
|
+
tagger = function (value) {
|
|
203
|
+
return value;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (typeof simpleValue !== "function") {
|
|
207
|
+
simpleValue = function () {
|
|
208
|
+
return undefined;
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function commitRead(length, value) {
|
|
213
|
+
offset += length;
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
function readArrayBuffer(length) {
|
|
217
|
+
return commitRead(length, new Uint8Array(data, offset, length));
|
|
218
|
+
}
|
|
219
|
+
function readFloat16() {
|
|
220
|
+
const tempArrayBuffer = new ArrayBuffer(4);
|
|
221
|
+
const tempDataView = new DataView(tempArrayBuffer);
|
|
222
|
+
const value = readUint16();
|
|
223
|
+
|
|
224
|
+
const sign = value & 0x8000;
|
|
225
|
+
let exponent = value & 0x7c00;
|
|
226
|
+
const fraction = value & 0x03ff;
|
|
227
|
+
|
|
228
|
+
if (exponent === 0x7c00) {
|
|
229
|
+
exponent = 0xff << 10;
|
|
230
|
+
} else if (exponent !== 0) {
|
|
231
|
+
exponent += (127 - 15) << 10;
|
|
232
|
+
} else if (fraction !== 0) {
|
|
233
|
+
return (sign ? -1 : 1) * fraction * POW_2_24;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
tempDataView.setUint32(0, (sign << 16) | (exponent << 13) | (fraction << 13));
|
|
237
|
+
return tempDataView.getFloat32(0);
|
|
238
|
+
}
|
|
239
|
+
function readFloat32() {
|
|
240
|
+
return commitRead(4, dataView.getFloat32(offset));
|
|
241
|
+
}
|
|
242
|
+
function readFloat64() {
|
|
243
|
+
return commitRead(8, dataView.getFloat64(offset));
|
|
244
|
+
}
|
|
245
|
+
function readUint8() {
|
|
246
|
+
return commitRead(1, dataView.getUint8(offset));
|
|
247
|
+
}
|
|
248
|
+
function readUint16() {
|
|
249
|
+
return commitRead(2, dataView.getUint16(offset));
|
|
250
|
+
}
|
|
251
|
+
function readUint32() {
|
|
252
|
+
return commitRead(4, dataView.getUint32(offset));
|
|
253
|
+
}
|
|
254
|
+
function readUint64() {
|
|
255
|
+
return readUint32() * POW_2_32 + readUint32();
|
|
256
|
+
}
|
|
257
|
+
function readBreak() {
|
|
258
|
+
if (dataView.getUint8(offset) !== 0xff) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
offset += 1;
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
function readLength(additionalInformation) {
|
|
265
|
+
if (additionalInformation < 24) {
|
|
266
|
+
return additionalInformation;
|
|
267
|
+
}
|
|
268
|
+
if (additionalInformation === 24) {
|
|
269
|
+
return readUint8();
|
|
270
|
+
}
|
|
271
|
+
if (additionalInformation === 25) {
|
|
272
|
+
return readUint16();
|
|
273
|
+
}
|
|
274
|
+
if (additionalInformation === 26) {
|
|
275
|
+
return readUint32();
|
|
276
|
+
}
|
|
277
|
+
if (additionalInformation === 27) {
|
|
278
|
+
return readUint64();
|
|
279
|
+
}
|
|
280
|
+
if (additionalInformation === 31) {
|
|
281
|
+
return -1;
|
|
282
|
+
}
|
|
283
|
+
throw new Error("Invalid length encoding");
|
|
284
|
+
}
|
|
285
|
+
function readIndefiniteStringLength(majorType) {
|
|
286
|
+
const initialByte = readUint8();
|
|
287
|
+
if (initialByte === 0xff) {
|
|
288
|
+
return -1;
|
|
289
|
+
}
|
|
290
|
+
const length = readLength(initialByte & 0x1f);
|
|
291
|
+
if (length < 0 || initialByte >> 5 !== majorType) {
|
|
292
|
+
throw new Error("Invalid indefinite length element");
|
|
293
|
+
}
|
|
294
|
+
return length;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function appendUtf16Data(utf16data, length) {
|
|
298
|
+
for (let i = 0; i < length; ++i) {
|
|
299
|
+
let value = readUint8();
|
|
300
|
+
if (value & 0x80) {
|
|
301
|
+
if (value < 0xe0) {
|
|
302
|
+
value = ((value & 0x1f) << 6) | (readUint8() & 0x3f);
|
|
303
|
+
length -= 1;
|
|
304
|
+
} else if (value < 0xf0) {
|
|
305
|
+
value = ((value & 0x0f) << 12) | ((readUint8() & 0x3f) << 6) | (readUint8() & 0x3f);
|
|
306
|
+
length -= 2;
|
|
307
|
+
} else {
|
|
308
|
+
value =
|
|
309
|
+
((value & 0x0f) << 18) | ((readUint8() & 0x3f) << 12) | ((readUint8() & 0x3f) << 6) | (readUint8() & 0x3f);
|
|
310
|
+
length -= 3;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (value < 0x10000) {
|
|
315
|
+
utf16data.push(value);
|
|
316
|
+
} else {
|
|
317
|
+
value -= 0x10000;
|
|
318
|
+
utf16data.push(0xd800 | (value >> 10));
|
|
319
|
+
utf16data.push(0xdc00 | (value & 0x3ff));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function decodeItem() {
|
|
325
|
+
const initialByte = readUint8();
|
|
326
|
+
const majorType = initialByte >> 5;
|
|
327
|
+
const additionalInformation = initialByte & 0x1f;
|
|
328
|
+
let i;
|
|
329
|
+
let length;
|
|
330
|
+
|
|
331
|
+
if (majorType === 7) {
|
|
332
|
+
switch (additionalInformation) {
|
|
333
|
+
case 25:
|
|
334
|
+
return readFloat16();
|
|
335
|
+
case 26:
|
|
336
|
+
return readFloat32();
|
|
337
|
+
case 27:
|
|
338
|
+
return readFloat64();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
length = readLength(additionalInformation);
|
|
343
|
+
if (length < 0 && (majorType < 2 || majorType > 6)) {
|
|
344
|
+
throw new Error("Invalid length");
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const utf16data = [];
|
|
348
|
+
let retArray;
|
|
349
|
+
const retObject = {};
|
|
350
|
+
|
|
351
|
+
switch (majorType) {
|
|
352
|
+
case 0:
|
|
353
|
+
return length;
|
|
354
|
+
case 1:
|
|
355
|
+
return -1 - length;
|
|
356
|
+
case 2:
|
|
357
|
+
if (length < 0) {
|
|
358
|
+
const elements = [];
|
|
359
|
+
let fullArrayLength = 0;
|
|
360
|
+
while ((length = readIndefiniteStringLength(majorType)) >= 0) {
|
|
361
|
+
fullArrayLength += length;
|
|
362
|
+
elements.push(readArrayBuffer(length));
|
|
363
|
+
}
|
|
364
|
+
const fullArray = new Uint8Array(fullArrayLength);
|
|
365
|
+
let fullArrayOffset = 0;
|
|
366
|
+
for (i = 0; i < elements.length; ++i) {
|
|
367
|
+
fullArray.set(elements[i], fullArrayOffset);
|
|
368
|
+
fullArrayOffset += elements[i].length;
|
|
369
|
+
}
|
|
370
|
+
return fullArray;
|
|
371
|
+
}
|
|
372
|
+
return readArrayBuffer(length);
|
|
373
|
+
case 3:
|
|
374
|
+
if (length < 0) {
|
|
375
|
+
while ((length = readIndefiniteStringLength(majorType)) >= 0) {
|
|
376
|
+
appendUtf16Data(utf16data, length);
|
|
377
|
+
}
|
|
378
|
+
} else {
|
|
379
|
+
appendUtf16Data(utf16data, length);
|
|
380
|
+
}
|
|
381
|
+
return String.fromCharCode.apply(null, utf16data);
|
|
382
|
+
case 4:
|
|
383
|
+
if (length < 0) {
|
|
384
|
+
retArray = [];
|
|
385
|
+
while (!readBreak()) {
|
|
386
|
+
retArray.push(decodeItem());
|
|
387
|
+
}
|
|
388
|
+
} else {
|
|
389
|
+
retArray = new Array(length);
|
|
390
|
+
for (i = 0; i < length; ++i) {
|
|
391
|
+
retArray[i] = decodeItem();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return retArray;
|
|
395
|
+
case 5:
|
|
396
|
+
for (i = 0; i < length || (length < 0 && !readBreak()); ++i) {
|
|
397
|
+
const key = decodeItem();
|
|
398
|
+
retObject[key] = decodeItem();
|
|
399
|
+
}
|
|
400
|
+
return retObject;
|
|
401
|
+
case 6:
|
|
402
|
+
return tagger(decodeItem(), length);
|
|
403
|
+
case 7:
|
|
404
|
+
switch (length) {
|
|
405
|
+
case 20:
|
|
406
|
+
return false;
|
|
407
|
+
case 21:
|
|
408
|
+
return true;
|
|
409
|
+
case 22:
|
|
410
|
+
return null;
|
|
411
|
+
case 23:
|
|
412
|
+
return undefined;
|
|
413
|
+
default:
|
|
414
|
+
return simpleValue(length);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const ret = decodeItem();
|
|
420
|
+
if (offset !== data.byteLength) {
|
|
421
|
+
throw new Error("Remaining bytes");
|
|
422
|
+
}
|
|
423
|
+
return ret;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export const CBOR = {
|
|
427
|
+
encode,
|
|
428
|
+
decode,
|
|
429
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createConsole } from "./Console.ts";
|
|
2
|
+
|
|
3
|
+
const _console = createConsole("checksum", { log: true });
|
|
4
|
+
|
|
5
|
+
// https://github.com/googlecreativelab/tiny-motion-trainer/blob/5fceb49f018ae0c403bf9f0ccc437309c2acb507/frontend/src/tf4micro-motion-kit/modules/bleFileTransfer#L195
|
|
6
|
+
|
|
7
|
+
// See http://home.thep.lu.se/~bjorn/crc/ for more information on simple CRC32 calculations.
|
|
8
|
+
export function crc32ForByte(r: number) {
|
|
9
|
+
for (let j = 0; j < 8; ++j) {
|
|
10
|
+
r = (r & 1 ? 0 : 0xedb88320) ^ (r >>> 1);
|
|
11
|
+
}
|
|
12
|
+
return r ^ 0xff000000;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const tableSize = 256;
|
|
16
|
+
const crc32Table = new Uint32Array(tableSize);
|
|
17
|
+
for (let i = 0; i < tableSize; ++i) {
|
|
18
|
+
crc32Table[i] = crc32ForByte(i);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function crc32(dataIterable: ArrayBuffer | number[]) {
|
|
22
|
+
let dataBytes = new Uint8Array(dataIterable);
|
|
23
|
+
let crc = 0;
|
|
24
|
+
for (let i = 0; i < dataBytes.byteLength; ++i) {
|
|
25
|
+
const crcLowByte = crc & 0x000000ff;
|
|
26
|
+
const dataByte = dataBytes[i];
|
|
27
|
+
const tableIndex = crcLowByte ^ dataByte;
|
|
28
|
+
// The last >>> is to convert this into an unsigned 32-bit integer.
|
|
29
|
+
crc = (crc32Table[tableIndex] ^ (crc >>> 8)) >>> 0;
|
|
30
|
+
}
|
|
31
|
+
return crc;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// This is a small test function for the CRC32 implementation, not normally called but left in
|
|
35
|
+
// for debugging purposes. We know the expected CRC32 of [97, 98, 99, 100, 101] is 2240272485,
|
|
36
|
+
// or 0x8587d865, so if anything else is output we know there's an error in the implementation.
|
|
37
|
+
export function testCrc32() {
|
|
38
|
+
const testArray = [97, 98, 99, 100, 101];
|
|
39
|
+
const testArrayCrc32 = crc32(testArray);
|
|
40
|
+
_console.log("CRC32 for [97, 98, 99, 100, 101] is 0x" + testArrayCrc32.toString(16) + " (" + testArrayCrc32 + ")");
|
|
41
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
type ENVIRONMENT_FLAG = "__BRILLIANTSOLE__DEV__" | "__BRILLIANTSOLE__PROD__";
|
|
2
|
+
const __BRILLIANTSOLE__ENVIRONMENT__: ENVIRONMENT_FLAG = "__BRILLIANTSOLE__DEV__";
|
|
3
|
+
|
|
4
|
+
//@ts-expect-error
|
|
5
|
+
const isInProduction = __BRILLIANTSOLE__ENVIRONMENT__ == "__BRILLIANTSOLE__PROD__";
|
|
6
|
+
const isInDev = __BRILLIANTSOLE__ENVIRONMENT__ == "__BRILLIANTSOLE__DEV__";
|
|
7
|
+
|
|
8
|
+
// https://github.com/flexdinesh/browser-or-node/blob/master/src/index.ts
|
|
9
|
+
const isInBrowser = typeof window !== "undefined" && typeof window?.document !== "undefined";
|
|
10
|
+
const isInNode = typeof process !== "undefined" && process?.versions?.node != null;
|
|
11
|
+
|
|
12
|
+
const userAgent = (isInBrowser && navigator.userAgent) || "";
|
|
13
|
+
|
|
14
|
+
let isBluetoothSupported = false;
|
|
15
|
+
if (isInBrowser) {
|
|
16
|
+
isBluetoothSupported = Boolean(navigator.bluetooth);
|
|
17
|
+
} else if (isInNode) {
|
|
18
|
+
isBluetoothSupported = true;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const isInBluefy = isInBrowser && /Bluefy/i.test(userAgent);
|
|
22
|
+
const isInWebBLE = isInBrowser && /WebBLE/i.test(userAgent);
|
|
23
|
+
|
|
24
|
+
const isAndroid = isInBrowser && /Android/i.test(userAgent);
|
|
25
|
+
const isSafari = isInBrowser && /Safari/i.test(userAgent) && !/Chrome/i.test(userAgent);
|
|
26
|
+
|
|
27
|
+
const isIOS = isInBrowser && /iPad|iPhone|iPod/i.test(userAgent);
|
|
28
|
+
const isMac = isInBrowser && /Macintosh/i.test(userAgent);
|
|
29
|
+
|
|
30
|
+
// @ts-expect-error
|
|
31
|
+
const isInLensStudio = !isInBrowser && !isInNode && typeof global !== "undefined" && typeof Studio !== "undefined";
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
isInDev,
|
|
35
|
+
isInProduction,
|
|
36
|
+
isInBrowser,
|
|
37
|
+
isInNode,
|
|
38
|
+
isAndroid,
|
|
39
|
+
isInBluefy,
|
|
40
|
+
isInWebBLE,
|
|
41
|
+
isSafari,
|
|
42
|
+
isInLensStudio,
|
|
43
|
+
isIOS,
|
|
44
|
+
isMac,
|
|
45
|
+
isBluetoothSupported,
|
|
46
|
+
};
|