brilliantsole 0.0.26 → 0.0.28
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 +16 -10
- package/assets/3d/anchor.glb +0 -0
- package/assets/3d/coin.glb +0 -0
- package/assets/3d/glasses.glb +0 -0
- package/assets/3d/rightHand.glb +0 -0
- package/assets/audio/bounceMedium.wav +0 -0
- package/assets/audio/bounceStrong.wav +0 -0
- package/assets/audio/bounceWeak.wav +0 -0
- package/assets/audio/coin.wav +0 -0
- package/assets/audio/getUp.wav +0 -0
- package/assets/audio/grab.wav +0 -0
- package/assets/audio/kick.wav +0 -0
- package/assets/audio/platterFadeIn old.wav +0 -0
- package/assets/audio/platterFadeIn.wav +0 -0
- package/assets/audio/platterFadeOut.wav +0 -0
- package/assets/audio/punch.wav +0 -0
- package/assets/audio/punchSqueak.wav +0 -0
- package/assets/audio/purr.wav +0 -0
- package/assets/audio/purrFadeOut.wav +0 -0
- package/assets/audio/release.wav +0 -0
- package/assets/audio/splat.wav +0 -0
- package/assets/audio/stomp.wav +0 -0
- package/assets/images/ukaton-pressure-0.svg +9 -0
- package/assets/images/ukaton-pressure-1.svg +9 -0
- package/assets/images/ukaton-pressure-10.svg +9 -0
- package/assets/images/ukaton-pressure-11.svg +9 -0
- package/assets/images/ukaton-pressure-12.svg +9 -0
- package/assets/images/ukaton-pressure-13.svg +9 -0
- package/assets/images/ukaton-pressure-14.svg +9 -0
- package/assets/images/ukaton-pressure-15.svg +9 -0
- package/assets/images/ukaton-pressure-2.svg +9 -0
- package/assets/images/ukaton-pressure-3.svg +9 -0
- package/assets/images/ukaton-pressure-4.svg +9 -0
- package/assets/images/ukaton-pressure-5.svg +9 -0
- package/assets/images/ukaton-pressure-6.svg +9 -0
- package/assets/images/ukaton-pressure-7.svg +9 -0
- package/assets/images/ukaton-pressure-8.svg +9 -0
- package/assets/images/ukaton-pressure-9.svg +9 -0
- package/assets/images/ukaton-right-insole.svg +798 -0
- package/build/brilliantsole.cjs +2870 -882
- package/build/brilliantsole.cjs.map +1 -1
- package/build/brilliantsole.js +2477 -782
- package/build/brilliantsole.js.map +1 -1
- package/build/brilliantsole.ls.js +2260 -592
- package/build/brilliantsole.ls.js.map +1 -1
- package/build/brilliantsole.min.js +1 -1
- package/build/brilliantsole.min.js.map +1 -1
- package/build/brilliantsole.module.d.ts +302 -116
- package/build/brilliantsole.module.js +2468 -782
- package/build/brilliantsole.module.js.map +1 -1
- package/build/brilliantsole.module.min.d.ts +302 -116
- package/build/brilliantsole.module.min.js +1 -1
- package/build/brilliantsole.module.min.js.map +1 -1
- package/build/brilliantsole.node.module.d.ts +295 -113
- package/build/brilliantsole.node.module.js +2860 -882
- package/build/brilliantsole.node.module.js.map +1 -1
- package/build/dts/BS-output.d.ts +10 -0
- package/build/dts/BS.d.ts +21 -9
- package/build/dts/CameraManager.d.ts +72 -0
- package/build/dts/Device.d.ts +53 -16
- package/build/dts/DeviceInformationManager.d.ts +4 -4
- package/build/dts/DeviceManager.d.ts +3 -0
- package/build/dts/FileTransferManager.d.ts +18 -8
- package/build/dts/InformationManager.d.ts +8 -5
- package/build/dts/TfliteManager.d.ts +22 -2
- package/build/dts/WifiManager.d.ts +61 -0
- package/build/dts/connection/BaseConnectionManager.d.ts +37 -3
- package/build/dts/connection/ClientConnectionManager.d.ts +11 -2
- package/build/dts/connection/bluetooth/BluetoothConnectionManager.d.ts +1 -0
- package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +3 -1
- package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +2 -0
- package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +2 -2
- package/build/dts/connection/udp/UDPConnectionManager.d.ts +28 -0
- package/build/dts/connection/webSocket/WebSocketConnectionManager.d.ts +25 -0
- package/build/dts/devicePair/DevicePair.d.ts +14 -10
- package/build/dts/devicePair/DevicePairPressureSensorDataManager.d.ts +8 -4
- package/build/dts/devicePair/DevicePairSensorDataManager.d.ts +2 -2
- package/build/dts/scanner/BaseScanner.d.ts +4 -1
- package/build/dts/scanner/NobleScanner.d.ts +2 -1
- package/build/dts/sensor/MotionSensorDataManager.d.ts +5 -2
- package/build/dts/sensor/SensorDataManager.d.ts +5 -4
- package/build/dts/server/BaseClient.d.ts +6 -3
- package/build/dts/server/ServerUtils.d.ts +1 -1
- package/build/dts/server/websocket/WebSocketUtils.d.ts +1 -1
- package/build/dts/utils/CenterOfPressureHelper.d.ts +2 -2
- package/build/dts/utils/Console.d.ts +2 -0
- package/build/dts/utils/MathUtils.d.ts +2 -0
- package/build/dts/utils/ThrottleUtils.d.ts +2 -0
- package/build/dts/vibration/VibrationManager.d.ts +19 -2
- package/build/index.d.ts +299 -113
- package/build/index.node.d.ts +292 -110
- package/examples/3d/scene.html +19 -5
- package/examples/3d/script.js +90 -17
- package/examples/3d-generic/index.html +144 -0
- package/examples/3d-generic/script.js +266 -0
- package/examples/balance/script.js +2 -1
- package/examples/basic/index.html +232 -18
- package/examples/basic/script.js +746 -106
- package/examples/bottango/index.html +11 -1
- package/examples/bottango/script.js +2 -2
- package/examples/center-of-pressure/index.html +114 -114
- package/examples/center-of-pressure/script.js +1 -1
- package/examples/device-pair/index.html +58 -58
- package/examples/device-pair/script.js +12 -8
- package/examples/edge-impulse/script.js +135 -44
- package/examples/edge-impulse-test/README.md +11 -0
- package/examples/edge-impulse-test/edge-impulse-standalone.js +7228 -0
- package/examples/edge-impulse-test/edge-impulse-standalone.wasm +0 -0
- package/examples/edge-impulse-test/index.html +75 -0
- package/examples/edge-impulse-test/run-impulse.js +135 -0
- package/examples/edge-impulse-test/script.js +200 -0
- package/examples/gloves/edge-impulse-standalone.js +7228 -0
- package/examples/gloves/edge-impulse-standalone.wasm +0 -0
- package/examples/gloves/index.html +119 -0
- package/examples/gloves/run-impulse.js +135 -0
- package/examples/gloves/scene.html +124 -0
- package/examples/gloves/script.js +931 -0
- package/examples/graph/index.html +11 -1
- package/examples/graph/script.js +94 -37
- package/examples/pressure/index.html +180 -12
- package/examples/pressure/script.js +144 -7
- package/examples/punch/index.html +135 -0
- package/examples/punch/punch.tflite +0 -0
- package/examples/punch/script.js +169 -0
- package/examples/recording/index.html +191 -183
- package/examples/server/index.html +109 -23
- package/examples/server/script.js +322 -111
- package/examples/ukaton-firmware-update/index.html +20 -0
- package/examples/ukaton-firmware-update/manifest.json +11 -0
- package/examples/ukaton-firmware-update/merged-firmware.bin +0 -0
- package/examples/utils/aframe/aframe-master.min.js +2 -0
- package/examples/utils/aframe/bs-vibration.js +150 -0
- package/examples/utils/aframe/force-pushable.js +80 -0
- package/examples/utils/aframe/grabbable-anchor.js +46 -0
- package/examples/utils/aframe/grabbable-listener.js +31 -0
- package/examples/utils/aframe/grabbable-physics-body.js +190 -0
- package/examples/utils/aframe/grow-shrink.js +25 -0
- package/examples/utils/aframe/hand-punch.js +119 -0
- package/examples/utils/aframe/my-obb-collider.js +293 -0
- package/examples/utils/aframe/occlude-hand-tracking-controls.js +47 -0
- package/examples/utils/aframe/occlude-mesh.js +42 -0
- package/examples/utils/aframe/palm-up-detector.js +47 -0
- package/examples/utils/aframe/shadow-material.js +20 -0
- package/examples/utils/aframe/soft-shadow-light.js +9 -0
- package/examples/webxr/script.js +3 -3
- package/examples/webxr-2/assets/3d/soccerBall.glb +0 -0
- package/examples/webxr-2/assets/audio/shellBounce.wav +0 -0
- package/examples/webxr-2/assets/audio/shellHit.wav +0 -0
- package/examples/webxr-2/assets/audio/shellKick.wav +0 -0
- package/examples/webxr-2/assets/audio/soccerBounce.wav +0 -0
- package/examples/webxr-2/assets/audio/soccerKick.mp3 +0 -0
- package/examples/webxr-2/assets/images/shellTexture.png +0 -0
- package/examples/webxr-2/components/bs-ankle.js +337 -0
- package/examples/webxr-2/components/coin.js +84 -0
- package/examples/webxr-2/components/custom-wrap.js +17 -0
- package/examples/webxr-2/components/goomba.js +3250 -0
- package/examples/webxr-2/components/init-shell-material.js +215 -0
- package/examples/webxr-2/components/platter.js +172 -0
- package/examples/webxr-2/components/shell.js +374 -0
- package/examples/webxr-2/components/soccer-ball.js +250 -0
- package/examples/webxr-2/components/squashed-goomba.js +249 -0
- package/examples/webxr-2/edge-impulse-standalone.js +7228 -0
- package/examples/webxr-2/edge-impulse-standalone.wasm +0 -0
- package/examples/webxr-2/index.html +996 -0
- package/examples/webxr-2/kick.tflite +0 -0
- package/examples/webxr-2/kick2.tflite +0 -0
- package/examples/webxr-2/run-impulse.js +135 -0
- package/examples/webxr-2/script.js +384 -0
- package/package.json +2 -1
- package/src/.prettierrc +4 -0
- package/src/BS.ts +66 -9
- package/src/CameraManager.ts +499 -0
- package/src/Device.ts +620 -92
- package/src/DeviceInformationManager.ts +22 -11
- package/src/DeviceManager.ts +94 -25
- package/src/FileTransferManager.ts +146 -21
- package/src/FirmwareManager.ts +1 -1
- package/src/InformationManager.ts +62 -20
- package/src/TfliteManager.ts +172 -26
- package/src/WifiManager.ts +323 -0
- package/src/connection/BaseConnectionManager.ts +145 -30
- package/src/connection/ClientConnectionManager.ts +47 -11
- package/src/connection/bluetooth/BluetoothConnectionManager.ts +14 -3
- package/src/connection/bluetooth/NobleConnectionManager.ts +155 -42
- package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +104 -35
- package/src/connection/bluetooth/bluetoothUUIDs.ts +40 -13
- package/src/connection/udp/UDPConnectionManager.ts +356 -0
- package/src/connection/websocket/WebSocketConnectionManager.ts +282 -0
- package/src/devicePair/DevicePair.ts +145 -49
- package/src/devicePair/DevicePairPressureSensorDataManager.ts +72 -24
- package/src/devicePair/DevicePairSensorDataManager.ts +5 -5
- package/src/scanner/BaseScanner.ts +49 -11
- package/src/scanner/NobleScanner.ts +81 -17
- package/src/sensor/BarometerSensorDataManager.ts +1 -1
- package/src/sensor/MotionSensorDataManager.ts +22 -7
- package/src/sensor/PressureSensorDataManager.ts +47 -13
- package/src/sensor/SensorConfigurationManager.ts +75 -24
- package/src/sensor/SensorDataManager.ts +107 -26
- package/src/server/BaseClient.ts +192 -37
- package/src/server/BaseServer.ts +201 -43
- package/src/server/ServerUtils.ts +39 -9
- package/src/server/udp/UDPServer.ts +74 -23
- package/src/server/udp/UDPUtils.ts +9 -2
- package/src/server/websocket/WebSocketClient.ts +30 -9
- package/src/server/websocket/WebSocketServer.ts +1 -1
- package/src/server/websocket/WebSocketUtils.ts +4 -2
- package/src/utils/CenterOfPressureHelper.ts +5 -5
- package/src/utils/Console.ts +62 -9
- package/src/utils/MathUtils.ts +31 -1
- package/src/utils/ParseUtils.ts +25 -6
- package/src/utils/ThrottleUtils.ts +62 -0
- package/src/utils/Timer.ts +1 -1
- package/src/utils/checksum.ts +1 -1
- package/src/utils/mcumgr.js +1 -1
- package/src/vibration/VibrationManager.ts +166 -40
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import { createConsole } from "../utils/Console.ts";
|
|
2
2
|
import CenterOfPressureHelper from "../utils/CenterOfPressureHelper.ts";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
PressureData,
|
|
5
|
+
PressureSensorPosition,
|
|
6
|
+
PressureSensorValue,
|
|
7
|
+
} from "../sensor/PressureSensorDataManager.ts";
|
|
4
8
|
import { CenterOfPressure } from "../utils/CenterOfPressureHelper.ts";
|
|
5
|
-
import {
|
|
9
|
+
import { Side, Sides } from "../InformationManager.ts";
|
|
6
10
|
import { DeviceEventMap } from "../Device.ts";
|
|
11
|
+
import { RangeHelper } from "../BS.ts";
|
|
7
12
|
|
|
8
|
-
const _console = createConsole("DevicePairPressureSensorDataManager", {
|
|
13
|
+
const _console = createConsole("DevicePairPressureSensorDataManager", {
|
|
14
|
+
log: false,
|
|
15
|
+
});
|
|
9
16
|
|
|
10
|
-
export type DevicePairRawPressureData = { [
|
|
17
|
+
export type DevicePairRawPressureData = { [side in Side]: PressureData };
|
|
11
18
|
|
|
12
19
|
export interface DevicePairPressureData {
|
|
13
|
-
|
|
20
|
+
sensors: { [key in Side]: PressureSensorValue[] };
|
|
21
|
+
scaledSum: number;
|
|
14
22
|
normalizedSum: number;
|
|
15
23
|
center?: CenterOfPressure;
|
|
16
24
|
normalizedCenter?: CenterOfPressure;
|
|
@@ -29,15 +37,22 @@ class DevicePairPressureSensorDataManager {
|
|
|
29
37
|
|
|
30
38
|
#centerOfPressureHelper = new CenterOfPressureHelper();
|
|
31
39
|
|
|
40
|
+
#normalizedSumRangeHelper = new RangeHelper();
|
|
41
|
+
|
|
42
|
+
constructor() {
|
|
43
|
+
this.resetPressureRange();
|
|
44
|
+
}
|
|
45
|
+
|
|
32
46
|
resetPressureRange() {
|
|
33
47
|
this.#centerOfPressureHelper.reset();
|
|
48
|
+
this.#normalizedSumRangeHelper.reset();
|
|
34
49
|
}
|
|
35
50
|
|
|
36
51
|
onDevicePressureData(event: DeviceEventMap["pressure"]) {
|
|
37
52
|
const { pressure } = event.message;
|
|
38
|
-
const
|
|
39
|
-
_console.log({ pressure,
|
|
40
|
-
this.#rawPressure[
|
|
53
|
+
const { side } = event.target;
|
|
54
|
+
_console.log({ pressure, side });
|
|
55
|
+
this.#rawPressure[side] = pressure;
|
|
41
56
|
if (this.#hasAllPressureData) {
|
|
42
57
|
return this.#updatePressureData();
|
|
43
58
|
} else {
|
|
@@ -46,33 +61,66 @@ class DevicePairPressureSensorDataManager {
|
|
|
46
61
|
}
|
|
47
62
|
|
|
48
63
|
get #hasAllPressureData() {
|
|
49
|
-
return
|
|
64
|
+
return Sides.every((side) => side in this.#rawPressure);
|
|
50
65
|
}
|
|
51
66
|
|
|
52
67
|
#updatePressureData() {
|
|
53
|
-
const pressure: DevicePairPressureData = {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
68
|
+
const pressure: DevicePairPressureData = {
|
|
69
|
+
scaledSum: 0,
|
|
70
|
+
normalizedSum: 0,
|
|
71
|
+
sensors: { left: [], right: [] },
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
Sides.forEach((side) => {
|
|
75
|
+
const sidePressure = this.#rawPressure[side]!;
|
|
76
|
+
pressure.scaledSum += sidePressure.scaledSum;
|
|
77
|
+
//pressure.normalizedSum += this.#rawPressure[side]!.normalizedSum;
|
|
58
78
|
});
|
|
79
|
+
pressure.normalizedSum +=
|
|
80
|
+
this.#normalizedSumRangeHelper.updateAndGetNormalization(
|
|
81
|
+
pressure.scaledSum,
|
|
82
|
+
false
|
|
83
|
+
);
|
|
59
84
|
|
|
60
|
-
if (pressure.
|
|
85
|
+
if (pressure.scaledSum > 0) {
|
|
61
86
|
pressure.center = { x: 0, y: 0 };
|
|
62
|
-
|
|
87
|
+
Sides.forEach((side) => {
|
|
63
88
|
const sidePressure = this.#rawPressure[side]!;
|
|
64
|
-
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
89
|
+
|
|
90
|
+
if (false) {
|
|
91
|
+
const sidePressureWeight =
|
|
92
|
+
sidePressure.scaledSum / pressure.scaledSum;
|
|
93
|
+
if (sidePressureWeight > 0) {
|
|
94
|
+
if (sidePressure.normalizedCenter?.y != undefined) {
|
|
95
|
+
pressure.center!.y +=
|
|
96
|
+
sidePressure.normalizedCenter!.y * sidePressureWeight;
|
|
97
|
+
}
|
|
98
|
+
if (side == "right") {
|
|
99
|
+
pressure.center!.x = sidePressureWeight;
|
|
100
|
+
}
|
|
71
101
|
}
|
|
102
|
+
} else {
|
|
103
|
+
sidePressure.sensors.forEach((sensor) => {
|
|
104
|
+
const _sensor: PressureSensorValue = { ...sensor };
|
|
105
|
+
_sensor.weightedValue = sensor.scaledValue / pressure.scaledSum;
|
|
106
|
+
let { x, y } = sensor.position;
|
|
107
|
+
x /= 2;
|
|
108
|
+
if (side == "right") {
|
|
109
|
+
x += 0.5;
|
|
110
|
+
}
|
|
111
|
+
_sensor.position = { x, y };
|
|
112
|
+
pressure.center!.x += _sensor.position.x * _sensor.weightedValue;
|
|
113
|
+
pressure.center!.y += _sensor.position.y * _sensor.weightedValue;
|
|
114
|
+
pressure.sensors[side].push(_sensor);
|
|
115
|
+
});
|
|
72
116
|
}
|
|
73
117
|
});
|
|
74
118
|
|
|
75
|
-
pressure.normalizedCenter =
|
|
119
|
+
pressure.normalizedCenter =
|
|
120
|
+
this.#centerOfPressureHelper.updateAndGetNormalization(
|
|
121
|
+
pressure.center,
|
|
122
|
+
false
|
|
123
|
+
);
|
|
76
124
|
}
|
|
77
125
|
|
|
78
126
|
_console.log({ devicePairPressure: pressure });
|
|
@@ -2,14 +2,14 @@ import DevicePairPressureSensorDataManager, {
|
|
|
2
2
|
DevicePairPressureDataEventMessages,
|
|
3
3
|
} from "./DevicePairPressureSensorDataManager.ts";
|
|
4
4
|
import { createConsole } from "../utils/Console.ts";
|
|
5
|
-
import {
|
|
5
|
+
import { Side } from "../InformationManager.ts";
|
|
6
6
|
import { SensorType } from "../sensor/SensorDataManager.ts";
|
|
7
|
-
import { DeviceEventMap
|
|
7
|
+
import { DeviceEventMap } from "../Device.ts";
|
|
8
8
|
import EventDispatcher from "../utils/EventDispatcher.ts";
|
|
9
9
|
import DevicePair from "./DevicePair.ts";
|
|
10
10
|
import { AddKeysAsPropertyToInterface, ExtendInterfaceValues, ValueOf } from "../utils/TypeScriptUtils.ts";
|
|
11
11
|
|
|
12
|
-
const _console = createConsole("DevicePairSensorDataManager", { log:
|
|
12
|
+
const _console = createConsole("DevicePairSensorDataManager", { log: false });
|
|
13
13
|
|
|
14
14
|
export const DevicePairSensorTypes = ["pressure", "sensorData"] as const;
|
|
15
15
|
export type DevicePairSensorType = (typeof DevicePairSensorTypes)[number];
|
|
@@ -17,7 +17,7 @@ export type DevicePairSensorType = (typeof DevicePairSensorTypes)[number];
|
|
|
17
17
|
export const DevicePairSensorDataEventTypes = DevicePairSensorTypes;
|
|
18
18
|
export type DevicePairSensorDataEventType = (typeof DevicePairSensorDataEventTypes)[number];
|
|
19
19
|
|
|
20
|
-
export type DevicePairSensorDataTimestamps = { [
|
|
20
|
+
export type DevicePairSensorDataTimestamps = { [side in Side]: number };
|
|
21
21
|
|
|
22
22
|
interface BaseDevicePairSensorDataEventMessage {
|
|
23
23
|
timestamps: DevicePairSensorDataTimestamps;
|
|
@@ -63,7 +63,7 @@ class DevicePairSensorDataManager {
|
|
|
63
63
|
if (!this.#timestamps[sensorType]) {
|
|
64
64
|
this.#timestamps[sensorType] = {};
|
|
65
65
|
}
|
|
66
|
-
this.#timestamps[sensorType]![event.target.
|
|
66
|
+
this.#timestamps[sensorType]![event.target.side] = timestamp;
|
|
67
67
|
|
|
68
68
|
let value;
|
|
69
69
|
switch (sensorType) {
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import EventDispatcher, {
|
|
1
|
+
import EventDispatcher, {
|
|
2
|
+
BoundEventListeners,
|
|
3
|
+
Event,
|
|
4
|
+
EventMap,
|
|
5
|
+
} from "../utils/EventDispatcher.ts";
|
|
2
6
|
import { addEventListeners } from "../utils/EventUtils.ts";
|
|
3
7
|
import { createConsole } from "../utils/Console.ts";
|
|
4
8
|
import Timer from "../utils/Timer.ts";
|
|
5
9
|
import { DeviceType } from "../InformationManager.ts";
|
|
10
|
+
import { ConnectionType } from "../connection/BaseConnectionManager.ts";
|
|
6
11
|
|
|
7
12
|
const _console = createConsole("BaseScanner");
|
|
8
13
|
|
|
@@ -19,6 +24,8 @@ export interface DiscoveredDevice {
|
|
|
19
24
|
name: string;
|
|
20
25
|
deviceType: DeviceType;
|
|
21
26
|
rssi: number;
|
|
27
|
+
ipAddress?: string;
|
|
28
|
+
isWifiSecure?: boolean;
|
|
22
29
|
}
|
|
23
30
|
|
|
24
31
|
interface ScannerDiscoveredDeviceEventMessage {
|
|
@@ -32,10 +39,26 @@ export interface ScannerEventMessages {
|
|
|
32
39
|
isScanning: { isScanning: boolean };
|
|
33
40
|
}
|
|
34
41
|
|
|
35
|
-
export type ScannerEventDispatcher = EventDispatcher<
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
export type ScannerEventDispatcher = EventDispatcher<
|
|
43
|
+
BaseScanner,
|
|
44
|
+
ScannerEventType,
|
|
45
|
+
ScannerEventMessages
|
|
46
|
+
>;
|
|
47
|
+
export type ScannerEventMap = EventMap<
|
|
48
|
+
BaseScanner,
|
|
49
|
+
ScannerEventType,
|
|
50
|
+
ScannerEventMessages
|
|
51
|
+
>;
|
|
52
|
+
export type ScannerEvent = Event<
|
|
53
|
+
BaseScanner,
|
|
54
|
+
ScannerEventType,
|
|
55
|
+
ScannerEventMessages
|
|
56
|
+
>;
|
|
57
|
+
export type BoundScannerEventListeners = BoundEventListeners<
|
|
58
|
+
BaseScanner,
|
|
59
|
+
ScannerEventType,
|
|
60
|
+
ScannerEventMessages
|
|
61
|
+
>;
|
|
39
62
|
|
|
40
63
|
export type DiscoveredDevicesMap = { [deviceId: string]: DiscoveredDevice };
|
|
41
64
|
|
|
@@ -52,12 +75,18 @@ abstract class BaseScanner {
|
|
|
52
75
|
}
|
|
53
76
|
|
|
54
77
|
#assertIsSupported() {
|
|
55
|
-
_console.assertWithError(
|
|
78
|
+
_console.assertWithError(
|
|
79
|
+
this.isSupported,
|
|
80
|
+
`${this.constructor.name} is not supported`
|
|
81
|
+
);
|
|
56
82
|
}
|
|
57
83
|
|
|
58
84
|
// CONSTRUCTOR
|
|
59
85
|
#assertIsSubclass() {
|
|
60
|
-
_console.assertWithError(
|
|
86
|
+
_console.assertWithError(
|
|
87
|
+
this.constructor != BaseScanner,
|
|
88
|
+
`${this.constructor.name} must be subclassed`
|
|
89
|
+
);
|
|
61
90
|
}
|
|
62
91
|
constructor() {
|
|
63
92
|
this.#assertIsSubclass();
|
|
@@ -71,7 +100,10 @@ abstract class BaseScanner {
|
|
|
71
100
|
};
|
|
72
101
|
|
|
73
102
|
// EVENT DISPATCHER
|
|
74
|
-
#eventDispatcher: ScannerEventDispatcher = new EventDispatcher(
|
|
103
|
+
#eventDispatcher: ScannerEventDispatcher = new EventDispatcher(
|
|
104
|
+
this as BaseScanner,
|
|
105
|
+
ScannerEventTypes
|
|
106
|
+
);
|
|
75
107
|
get addEventListener() {
|
|
76
108
|
return this.#eventDispatcher.addEventListener;
|
|
77
109
|
}
|
|
@@ -127,7 +159,10 @@ abstract class BaseScanner {
|
|
|
127
159
|
}
|
|
128
160
|
get discoveredDevicesArray() {
|
|
129
161
|
return Object.values(this.#discoveredDevices).sort((a, b) => {
|
|
130
|
-
return
|
|
162
|
+
return (
|
|
163
|
+
this.#discoveredDeviceTimestamps[a.bluetoothId] -
|
|
164
|
+
this.#discoveredDeviceTimestamps[b.bluetoothId]
|
|
165
|
+
);
|
|
131
166
|
});
|
|
132
167
|
}
|
|
133
168
|
#assertValidDiscoveredDeviceId(discoveredDeviceId: string) {
|
|
@@ -153,7 +188,10 @@ abstract class BaseScanner {
|
|
|
153
188
|
get #discoveredDeviceExpirationTimeout() {
|
|
154
189
|
return BaseScanner.DiscoveredDeviceExpirationTimeout;
|
|
155
190
|
}
|
|
156
|
-
#checkDiscoveredDevicesExpirationTimer = new Timer(
|
|
191
|
+
#checkDiscoveredDevicesExpirationTimer = new Timer(
|
|
192
|
+
this.#checkDiscoveredDevicesExpiration.bind(this),
|
|
193
|
+
1000
|
|
194
|
+
);
|
|
157
195
|
#checkDiscoveredDevicesExpiration() {
|
|
158
196
|
const entries = Object.entries(this.#discoveredDevices);
|
|
159
197
|
if (entries.length == 0) {
|
|
@@ -173,7 +211,7 @@ abstract class BaseScanner {
|
|
|
173
211
|
}
|
|
174
212
|
|
|
175
213
|
// DEVICE CONNECTION
|
|
176
|
-
async connectToDevice(deviceId: string) {
|
|
214
|
+
async connectToDevice(deviceId: string, connectionType?: ConnectionType) {
|
|
177
215
|
this.#assertIsAvailable();
|
|
178
216
|
}
|
|
179
217
|
|
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import BaseScanner, {
|
|
1
|
+
import BaseScanner, {
|
|
2
|
+
DiscoveredDevice,
|
|
3
|
+
ScannerEventMap,
|
|
4
|
+
} from "./BaseScanner.ts";
|
|
2
5
|
import { createConsole } from "../utils/Console.ts";
|
|
3
6
|
import { addEventListeners } from "../utils/EventUtils.ts";
|
|
4
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
serviceDataUUID,
|
|
9
|
+
serviceUUIDs,
|
|
10
|
+
} from "../connection/bluetooth/bluetoothUUIDs.ts";
|
|
5
11
|
import Device from "../Device.ts";
|
|
6
|
-
import NobleConnectionManager, {
|
|
12
|
+
import NobleConnectionManager, {
|
|
13
|
+
NoblePeripheral,
|
|
14
|
+
} from "../connection/bluetooth/NobleConnectionManager.ts";
|
|
7
15
|
|
|
8
|
-
const _console = createConsole("NobleScanner", { log:
|
|
16
|
+
const _console = createConsole("NobleScanner", { log: false });
|
|
9
17
|
|
|
10
18
|
let isSupported = false;
|
|
11
19
|
|
|
@@ -13,10 +21,21 @@ let isSupported = false;
|
|
|
13
21
|
import noble from "@abandonware/noble";
|
|
14
22
|
import { DeviceTypes } from "../InformationManager.ts";
|
|
15
23
|
import DeviceManager from "../DeviceManager.ts";
|
|
24
|
+
import {
|
|
25
|
+
ClientConnectionType,
|
|
26
|
+
ConnectionType,
|
|
27
|
+
} from "../connection/BaseConnectionManager.ts";
|
|
16
28
|
isSupported = true;
|
|
17
29
|
/** NODE_END */
|
|
18
30
|
|
|
19
|
-
export const NobleStates = [
|
|
31
|
+
export const NobleStates = [
|
|
32
|
+
"unknown",
|
|
33
|
+
"resetting",
|
|
34
|
+
"unsupported",
|
|
35
|
+
"unauthorized",
|
|
36
|
+
"poweredOff",
|
|
37
|
+
"poweredOn",
|
|
38
|
+
] as const;
|
|
20
39
|
export type NobleState = (typeof NobleStates)[number];
|
|
21
40
|
|
|
22
41
|
class NobleScanner extends BaseScanner {
|
|
@@ -55,7 +74,9 @@ class NobleScanner extends BaseScanner {
|
|
|
55
74
|
}
|
|
56
75
|
this.#_nobleState = newNobleState;
|
|
57
76
|
_console.log({ newNobleState });
|
|
58
|
-
this.dispatchEvent("isScanningAvailable", {
|
|
77
|
+
this.dispatchEvent("isScanningAvailable", {
|
|
78
|
+
isScanningAvailable: this.isScanningAvailable,
|
|
79
|
+
});
|
|
59
80
|
}
|
|
60
81
|
|
|
61
82
|
// NOBLE LISTENERS
|
|
@@ -84,12 +105,29 @@ class NobleScanner extends BaseScanner {
|
|
|
84
105
|
this.#noblePeripherals[noblePeripheral.id] = noblePeripheral;
|
|
85
106
|
}
|
|
86
107
|
|
|
108
|
+
_console.log("advertisement", noblePeripheral.advertisement);
|
|
109
|
+
|
|
87
110
|
let deviceType;
|
|
111
|
+
let ipAddress;
|
|
112
|
+
let isWifiSecure;
|
|
88
113
|
const { manufacturerData, serviceData } = noblePeripheral.advertisement;
|
|
89
114
|
if (manufacturerData) {
|
|
90
115
|
_console.log("manufacturerData", manufacturerData);
|
|
91
|
-
|
|
92
|
-
|
|
116
|
+
if (manufacturerData.byteLength >= 3) {
|
|
117
|
+
const deviceTypeEnum = manufacturerData.readUint8(2);
|
|
118
|
+
deviceType = DeviceTypes[deviceTypeEnum];
|
|
119
|
+
_console;
|
|
120
|
+
}
|
|
121
|
+
if (manufacturerData.byteLength >= 3 + 4) {
|
|
122
|
+
ipAddress = new Uint8Array(
|
|
123
|
+
manufacturerData.buffer.slice(3, 3 + 4)
|
|
124
|
+
).join(".");
|
|
125
|
+
//_console.log({ ipAddress });
|
|
126
|
+
}
|
|
127
|
+
if (manufacturerData.byteLength >= 3 + 4 + 1) {
|
|
128
|
+
isWifiSecure = manufacturerData.readUint8(3 + 4) != 0;
|
|
129
|
+
_console.log({ isWifiSecure });
|
|
130
|
+
}
|
|
93
131
|
}
|
|
94
132
|
if (serviceData) {
|
|
95
133
|
_console.log("serviceData", serviceData);
|
|
@@ -103,6 +141,7 @@ class NobleScanner extends BaseScanner {
|
|
|
103
141
|
}
|
|
104
142
|
}
|
|
105
143
|
if (deviceType == undefined) {
|
|
144
|
+
_console.log("skipping device - no deviceType");
|
|
106
145
|
return;
|
|
107
146
|
}
|
|
108
147
|
|
|
@@ -111,6 +150,8 @@ class NobleScanner extends BaseScanner {
|
|
|
111
150
|
bluetoothId: noblePeripheral.id,
|
|
112
151
|
deviceType,
|
|
113
152
|
rssi: noblePeripheral.rssi,
|
|
153
|
+
ipAddress,
|
|
154
|
+
isWifiSecure,
|
|
114
155
|
};
|
|
115
156
|
this.dispatchEvent("discoveredDevice", { discoveredDevice });
|
|
116
157
|
}
|
|
@@ -151,9 +192,12 @@ class NobleScanner extends BaseScanner {
|
|
|
151
192
|
expiredDiscoveredDevice: this.#onExpiredDiscoveredDevice.bind(this),
|
|
152
193
|
};
|
|
153
194
|
|
|
154
|
-
#onExpiredDiscoveredDevice(
|
|
195
|
+
#onExpiredDiscoveredDevice(
|
|
196
|
+
event: ScannerEventMap["expiredDiscoveredDevice"]
|
|
197
|
+
) {
|
|
155
198
|
const { discoveredDevice } = event.message;
|
|
156
|
-
const noblePeripheral =
|
|
199
|
+
const noblePeripheral =
|
|
200
|
+
this.#noblePeripherals[discoveredDevice.bluetoothId];
|
|
157
201
|
if (noblePeripheral) {
|
|
158
202
|
// disconnect?
|
|
159
203
|
delete this.#noblePeripherals[discoveredDevice.bluetoothId];
|
|
@@ -171,20 +215,40 @@ class NobleScanner extends BaseScanner {
|
|
|
171
215
|
}
|
|
172
216
|
|
|
173
217
|
// DEVICES
|
|
174
|
-
async connectToDevice(
|
|
175
|
-
|
|
218
|
+
async connectToDevice(
|
|
219
|
+
deviceId: string,
|
|
220
|
+
connectionType?: ClientConnectionType
|
|
221
|
+
) {
|
|
222
|
+
super.connectToDevice(deviceId, connectionType);
|
|
176
223
|
this.#assertValidNoblePeripheralId(deviceId);
|
|
177
224
|
const noblePeripheral = this.#noblePeripherals[deviceId];
|
|
178
225
|
_console.log("connecting to discoveredDevice...", deviceId);
|
|
179
226
|
|
|
180
|
-
let device = DeviceManager.AvailableDevices.filter(
|
|
181
|
-
(device) => device.
|
|
182
|
-
);
|
|
227
|
+
let device = DeviceManager.AvailableDevices.filter(
|
|
228
|
+
(device) => device.connectionType == "noble"
|
|
229
|
+
).find((device) => device.bluetoothId == deviceId);
|
|
183
230
|
if (!device) {
|
|
184
231
|
device = this.#createDevice(noblePeripheral);
|
|
185
|
-
|
|
232
|
+
const { ipAddress, isWifiSecure } =
|
|
233
|
+
this.discoveredDevices[device.bluetoothId!];
|
|
234
|
+
if (connectionType && connectionType != "noble" && ipAddress) {
|
|
235
|
+
await device.connect({ type: connectionType, ipAddress, isWifiSecure });
|
|
236
|
+
} else {
|
|
237
|
+
await device.connect();
|
|
238
|
+
}
|
|
186
239
|
} else {
|
|
187
|
-
|
|
240
|
+
const { ipAddress, isWifiSecure } =
|
|
241
|
+
this.discoveredDevices[device.bluetoothId!];
|
|
242
|
+
if (
|
|
243
|
+
connectionType &&
|
|
244
|
+
connectionType != "noble" &&
|
|
245
|
+
connectionType != device.connectionType &&
|
|
246
|
+
ipAddress
|
|
247
|
+
) {
|
|
248
|
+
await device.connect({ type: connectionType, ipAddress, isWifiSecure });
|
|
249
|
+
} else {
|
|
250
|
+
await device.reconnect();
|
|
251
|
+
}
|
|
188
252
|
}
|
|
189
253
|
}
|
|
190
254
|
|
|
@@ -13,7 +13,7 @@ export interface BarometerSensorDataEventMessages {
|
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
const _console = createConsole("BarometerSensorDataManager", { log:
|
|
16
|
+
const _console = createConsole("BarometerSensorDataManager", { log: false });
|
|
17
17
|
|
|
18
18
|
class BarometerSensorDataManager {
|
|
19
19
|
#calculcateAltitude(pressure: number) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createConsole } from "../utils/Console.ts";
|
|
2
2
|
|
|
3
|
-
const _console = createConsole("MotionSensorDataManager", { log:
|
|
3
|
+
const _console = createConsole("MotionSensorDataManager", { log: false });
|
|
4
4
|
|
|
5
5
|
export const MotionSensorTypes = [
|
|
6
6
|
"acceleration",
|
|
@@ -15,6 +15,7 @@ export const MotionSensorTypes = [
|
|
|
15
15
|
"stepCounter",
|
|
16
16
|
"stepDetector",
|
|
17
17
|
"deviceOrientation",
|
|
18
|
+
"tapDetector",
|
|
18
19
|
] as const;
|
|
19
20
|
export type MotionSensorType = (typeof MotionSensorTypes)[number];
|
|
20
21
|
|
|
@@ -26,6 +27,7 @@ export const ContinuousMotionTypes = [
|
|
|
26
27
|
"magnetometer",
|
|
27
28
|
"gameRotation",
|
|
28
29
|
"rotation",
|
|
30
|
+
"orientation",
|
|
29
31
|
] as const;
|
|
30
32
|
export type ContinuousMotionType = (typeof ContinuousMotionTypes)[number];
|
|
31
33
|
|
|
@@ -36,7 +38,14 @@ export const Vector2Size = 2 * 2;
|
|
|
36
38
|
export const Vector3Size = 3 * 2;
|
|
37
39
|
export const QuaternionSize = 4 * 2;
|
|
38
40
|
|
|
39
|
-
export const ActivityTypes = [
|
|
41
|
+
export const ActivityTypes = [
|
|
42
|
+
"still",
|
|
43
|
+
"walking",
|
|
44
|
+
"running",
|
|
45
|
+
"bicycle",
|
|
46
|
+
"vehicle",
|
|
47
|
+
"tilting",
|
|
48
|
+
] as const;
|
|
40
49
|
export type ActivityType = (typeof ActivityTypes)[number];
|
|
41
50
|
|
|
42
51
|
export interface Activity {
|
|
@@ -70,15 +79,19 @@ export interface MotionSensorDataEventMessages {
|
|
|
70
79
|
stepCounter: { stepCounter: number };
|
|
71
80
|
activity: { activity: Activity };
|
|
72
81
|
deviceOrientation: { deviceOrientation: DeviceOrientation };
|
|
82
|
+
tapDetector: { tapDetector: Object };
|
|
73
83
|
}
|
|
74
84
|
|
|
75
|
-
export type MotionSensorDataEventMessage =
|
|
85
|
+
export type MotionSensorDataEventMessage =
|
|
86
|
+
ValueOf<MotionSensorDataEventMessages>;
|
|
76
87
|
|
|
77
88
|
class MotionSensorDataManager {
|
|
78
89
|
parseVector3(dataView: DataView, scalar: number): Vector3 {
|
|
79
|
-
let [x, y, z] = [
|
|
80
|
-
(
|
|
81
|
-
|
|
90
|
+
let [x, y, z] = [
|
|
91
|
+
dataView.getInt16(0, true),
|
|
92
|
+
dataView.getInt16(2, true),
|
|
93
|
+
dataView.getInt16(4, true),
|
|
94
|
+
].map((value) => value * scalar);
|
|
82
95
|
|
|
83
96
|
const vector: Vector3 = { x, y, z };
|
|
84
97
|
|
|
@@ -109,7 +122,9 @@ class MotionSensorDataManager {
|
|
|
109
122
|
|
|
110
123
|
pitch *= -1;
|
|
111
124
|
heading *= -1;
|
|
112
|
-
heading
|
|
125
|
+
if (heading < 0) {
|
|
126
|
+
heading += 360;
|
|
127
|
+
}
|
|
113
128
|
|
|
114
129
|
const euler: Euler = { heading, pitch, roll };
|
|
115
130
|
|
|
@@ -3,15 +3,16 @@ import CenterOfPressureHelper from "../utils/CenterOfPressureHelper.ts";
|
|
|
3
3
|
import RangeHelper from "../utils/RangeHelper.ts";
|
|
4
4
|
import { createArray } from "../utils/ArrayUtils.ts";
|
|
5
5
|
|
|
6
|
-
const _console = createConsole("PressureDataManager", { log:
|
|
6
|
+
const _console = createConsole("PressureDataManager", { log: false });
|
|
7
7
|
|
|
8
8
|
export const PressureSensorTypes = ["pressure"] as const;
|
|
9
9
|
export type PressureSensorType = (typeof PressureSensorTypes)[number];
|
|
10
10
|
|
|
11
11
|
export const ContinuousPressureSensorTypes = PressureSensorTypes;
|
|
12
|
-
export type ContinuousPressureSensorType =
|
|
12
|
+
export type ContinuousPressureSensorType =
|
|
13
|
+
(typeof ContinuousPressureSensorTypes)[number];
|
|
13
14
|
|
|
14
|
-
import { Vector2 } from "../utils/MathUtils.ts";
|
|
15
|
+
import { computeVoronoiWeights, Vector2 } from "../utils/MathUtils.ts";
|
|
15
16
|
export type PressureSensorPosition = Vector2;
|
|
16
17
|
|
|
17
18
|
import { CenterOfPressure } from "../utils/CenterOfPressureHelper.ts";
|
|
@@ -66,42 +67,75 @@ class PressureSensorDataManager {
|
|
|
66
67
|
|
|
67
68
|
this.#positions = positions;
|
|
68
69
|
|
|
69
|
-
this.#sensorRangeHelpers = createArray(
|
|
70
|
+
this.#sensorRangeHelpers = createArray(
|
|
71
|
+
this.numberOfSensors,
|
|
72
|
+
() => new RangeHelper()
|
|
73
|
+
);
|
|
70
74
|
|
|
71
75
|
this.resetRange();
|
|
72
76
|
}
|
|
73
77
|
|
|
74
78
|
#sensorRangeHelpers!: RangeHelper[];
|
|
79
|
+
#normalizedSumRangeHelper = new RangeHelper();
|
|
75
80
|
|
|
76
81
|
#centerOfPressureHelper = new CenterOfPressureHelper();
|
|
77
82
|
|
|
78
83
|
resetRange() {
|
|
79
|
-
this.#sensorRangeHelpers
|
|
84
|
+
this.#sensorRangeHelpers?.forEach((rangeHelper) => rangeHelper.reset());
|
|
80
85
|
this.#centerOfPressureHelper.reset();
|
|
86
|
+
this.#normalizedSumRangeHelper.reset();
|
|
81
87
|
}
|
|
82
88
|
|
|
83
89
|
parseData(dataView: DataView, scalar: number) {
|
|
84
|
-
const pressure: PressureData = {
|
|
85
|
-
|
|
90
|
+
const pressure: PressureData = {
|
|
91
|
+
sensors: [],
|
|
92
|
+
scaledSum: 0,
|
|
93
|
+
normalizedSum: 0,
|
|
94
|
+
};
|
|
95
|
+
for (
|
|
96
|
+
let index = 0, byteOffset = 0;
|
|
97
|
+
byteOffset < dataView.byteLength;
|
|
98
|
+
index++, byteOffset += 2
|
|
99
|
+
) {
|
|
86
100
|
const rawValue = dataView.getUint16(byteOffset, true);
|
|
87
|
-
|
|
101
|
+
let scaledValue = (rawValue * scalar) / this.numberOfSensors;
|
|
88
102
|
const rangeHelper = this.#sensorRangeHelpers[index];
|
|
89
|
-
const normalizedValue = rangeHelper.updateAndGetNormalization(
|
|
103
|
+
const normalizedValue = rangeHelper.updateAndGetNormalization(
|
|
104
|
+
scaledValue,
|
|
105
|
+
false
|
|
106
|
+
);
|
|
107
|
+
//scaledValue -= rangeHelper.min;
|
|
108
|
+
|
|
90
109
|
const position = this.positions[index];
|
|
91
|
-
pressure.sensors[index] = {
|
|
110
|
+
pressure.sensors[index] = {
|
|
111
|
+
rawValue,
|
|
112
|
+
scaledValue,
|
|
113
|
+
normalizedValue,
|
|
114
|
+
position,
|
|
115
|
+
weightedValue: 0,
|
|
116
|
+
};
|
|
92
117
|
|
|
93
118
|
pressure.scaledSum += scaledValue;
|
|
94
|
-
pressure.normalizedSum += normalizedValue
|
|
119
|
+
//pressure.normalizedSum += normalizedValue;
|
|
95
120
|
}
|
|
121
|
+
pressure.normalizedSum =
|
|
122
|
+
this.#normalizedSumRangeHelper.updateAndGetNormalization(
|
|
123
|
+
pressure.scaledSum,
|
|
124
|
+
false
|
|
125
|
+
);
|
|
96
126
|
|
|
97
|
-
if (pressure.scaledSum > 0
|
|
127
|
+
if (pressure.scaledSum > 0) {
|
|
98
128
|
pressure.center = { x: 0, y: 0 };
|
|
99
129
|
pressure.sensors.forEach((sensor) => {
|
|
100
130
|
sensor.weightedValue = sensor.scaledValue / pressure.scaledSum;
|
|
101
131
|
pressure.center!.x += sensor.position.x * sensor.weightedValue;
|
|
102
132
|
pressure.center!.y += sensor.position.y * sensor.weightedValue;
|
|
103
133
|
});
|
|
104
|
-
pressure.normalizedCenter =
|
|
134
|
+
pressure.normalizedCenter =
|
|
135
|
+
this.#centerOfPressureHelper.updateAndGetNormalization(
|
|
136
|
+
pressure.center,
|
|
137
|
+
false
|
|
138
|
+
);
|
|
105
139
|
}
|
|
106
140
|
|
|
107
141
|
_console.log({ pressure });
|