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.
Files changed (215) hide show
  1. package/README.md +16 -10
  2. package/assets/3d/anchor.glb +0 -0
  3. package/assets/3d/coin.glb +0 -0
  4. package/assets/3d/glasses.glb +0 -0
  5. package/assets/3d/rightHand.glb +0 -0
  6. package/assets/audio/bounceMedium.wav +0 -0
  7. package/assets/audio/bounceStrong.wav +0 -0
  8. package/assets/audio/bounceWeak.wav +0 -0
  9. package/assets/audio/coin.wav +0 -0
  10. package/assets/audio/getUp.wav +0 -0
  11. package/assets/audio/grab.wav +0 -0
  12. package/assets/audio/kick.wav +0 -0
  13. package/assets/audio/platterFadeIn old.wav +0 -0
  14. package/assets/audio/platterFadeIn.wav +0 -0
  15. package/assets/audio/platterFadeOut.wav +0 -0
  16. package/assets/audio/punch.wav +0 -0
  17. package/assets/audio/punchSqueak.wav +0 -0
  18. package/assets/audio/purr.wav +0 -0
  19. package/assets/audio/purrFadeOut.wav +0 -0
  20. package/assets/audio/release.wav +0 -0
  21. package/assets/audio/splat.wav +0 -0
  22. package/assets/audio/stomp.wav +0 -0
  23. package/assets/images/ukaton-pressure-0.svg +9 -0
  24. package/assets/images/ukaton-pressure-1.svg +9 -0
  25. package/assets/images/ukaton-pressure-10.svg +9 -0
  26. package/assets/images/ukaton-pressure-11.svg +9 -0
  27. package/assets/images/ukaton-pressure-12.svg +9 -0
  28. package/assets/images/ukaton-pressure-13.svg +9 -0
  29. package/assets/images/ukaton-pressure-14.svg +9 -0
  30. package/assets/images/ukaton-pressure-15.svg +9 -0
  31. package/assets/images/ukaton-pressure-2.svg +9 -0
  32. package/assets/images/ukaton-pressure-3.svg +9 -0
  33. package/assets/images/ukaton-pressure-4.svg +9 -0
  34. package/assets/images/ukaton-pressure-5.svg +9 -0
  35. package/assets/images/ukaton-pressure-6.svg +9 -0
  36. package/assets/images/ukaton-pressure-7.svg +9 -0
  37. package/assets/images/ukaton-pressure-8.svg +9 -0
  38. package/assets/images/ukaton-pressure-9.svg +9 -0
  39. package/assets/images/ukaton-right-insole.svg +798 -0
  40. package/build/brilliantsole.cjs +2870 -882
  41. package/build/brilliantsole.cjs.map +1 -1
  42. package/build/brilliantsole.js +2477 -782
  43. package/build/brilliantsole.js.map +1 -1
  44. package/build/brilliantsole.ls.js +2260 -592
  45. package/build/brilliantsole.ls.js.map +1 -1
  46. package/build/brilliantsole.min.js +1 -1
  47. package/build/brilliantsole.min.js.map +1 -1
  48. package/build/brilliantsole.module.d.ts +302 -116
  49. package/build/brilliantsole.module.js +2468 -782
  50. package/build/brilliantsole.module.js.map +1 -1
  51. package/build/brilliantsole.module.min.d.ts +302 -116
  52. package/build/brilliantsole.module.min.js +1 -1
  53. package/build/brilliantsole.module.min.js.map +1 -1
  54. package/build/brilliantsole.node.module.d.ts +295 -113
  55. package/build/brilliantsole.node.module.js +2860 -882
  56. package/build/brilliantsole.node.module.js.map +1 -1
  57. package/build/dts/BS-output.d.ts +10 -0
  58. package/build/dts/BS.d.ts +21 -9
  59. package/build/dts/CameraManager.d.ts +72 -0
  60. package/build/dts/Device.d.ts +53 -16
  61. package/build/dts/DeviceInformationManager.d.ts +4 -4
  62. package/build/dts/DeviceManager.d.ts +3 -0
  63. package/build/dts/FileTransferManager.d.ts +18 -8
  64. package/build/dts/InformationManager.d.ts +8 -5
  65. package/build/dts/TfliteManager.d.ts +22 -2
  66. package/build/dts/WifiManager.d.ts +61 -0
  67. package/build/dts/connection/BaseConnectionManager.d.ts +37 -3
  68. package/build/dts/connection/ClientConnectionManager.d.ts +11 -2
  69. package/build/dts/connection/bluetooth/BluetoothConnectionManager.d.ts +1 -0
  70. package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +3 -1
  71. package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +2 -0
  72. package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +2 -2
  73. package/build/dts/connection/udp/UDPConnectionManager.d.ts +28 -0
  74. package/build/dts/connection/webSocket/WebSocketConnectionManager.d.ts +25 -0
  75. package/build/dts/devicePair/DevicePair.d.ts +14 -10
  76. package/build/dts/devicePair/DevicePairPressureSensorDataManager.d.ts +8 -4
  77. package/build/dts/devicePair/DevicePairSensorDataManager.d.ts +2 -2
  78. package/build/dts/scanner/BaseScanner.d.ts +4 -1
  79. package/build/dts/scanner/NobleScanner.d.ts +2 -1
  80. package/build/dts/sensor/MotionSensorDataManager.d.ts +5 -2
  81. package/build/dts/sensor/SensorDataManager.d.ts +5 -4
  82. package/build/dts/server/BaseClient.d.ts +6 -3
  83. package/build/dts/server/ServerUtils.d.ts +1 -1
  84. package/build/dts/server/websocket/WebSocketUtils.d.ts +1 -1
  85. package/build/dts/utils/CenterOfPressureHelper.d.ts +2 -2
  86. package/build/dts/utils/Console.d.ts +2 -0
  87. package/build/dts/utils/MathUtils.d.ts +2 -0
  88. package/build/dts/utils/ThrottleUtils.d.ts +2 -0
  89. package/build/dts/vibration/VibrationManager.d.ts +19 -2
  90. package/build/index.d.ts +299 -113
  91. package/build/index.node.d.ts +292 -110
  92. package/examples/3d/scene.html +19 -5
  93. package/examples/3d/script.js +90 -17
  94. package/examples/3d-generic/index.html +144 -0
  95. package/examples/3d-generic/script.js +266 -0
  96. package/examples/balance/script.js +2 -1
  97. package/examples/basic/index.html +232 -18
  98. package/examples/basic/script.js +746 -106
  99. package/examples/bottango/index.html +11 -1
  100. package/examples/bottango/script.js +2 -2
  101. package/examples/center-of-pressure/index.html +114 -114
  102. package/examples/center-of-pressure/script.js +1 -1
  103. package/examples/device-pair/index.html +58 -58
  104. package/examples/device-pair/script.js +12 -8
  105. package/examples/edge-impulse/script.js +135 -44
  106. package/examples/edge-impulse-test/README.md +11 -0
  107. package/examples/edge-impulse-test/edge-impulse-standalone.js +7228 -0
  108. package/examples/edge-impulse-test/edge-impulse-standalone.wasm +0 -0
  109. package/examples/edge-impulse-test/index.html +75 -0
  110. package/examples/edge-impulse-test/run-impulse.js +135 -0
  111. package/examples/edge-impulse-test/script.js +200 -0
  112. package/examples/gloves/edge-impulse-standalone.js +7228 -0
  113. package/examples/gloves/edge-impulse-standalone.wasm +0 -0
  114. package/examples/gloves/index.html +119 -0
  115. package/examples/gloves/run-impulse.js +135 -0
  116. package/examples/gloves/scene.html +124 -0
  117. package/examples/gloves/script.js +931 -0
  118. package/examples/graph/index.html +11 -1
  119. package/examples/graph/script.js +94 -37
  120. package/examples/pressure/index.html +180 -12
  121. package/examples/pressure/script.js +144 -7
  122. package/examples/punch/index.html +135 -0
  123. package/examples/punch/punch.tflite +0 -0
  124. package/examples/punch/script.js +169 -0
  125. package/examples/recording/index.html +191 -183
  126. package/examples/server/index.html +109 -23
  127. package/examples/server/script.js +322 -111
  128. package/examples/ukaton-firmware-update/index.html +20 -0
  129. package/examples/ukaton-firmware-update/manifest.json +11 -0
  130. package/examples/ukaton-firmware-update/merged-firmware.bin +0 -0
  131. package/examples/utils/aframe/aframe-master.min.js +2 -0
  132. package/examples/utils/aframe/bs-vibration.js +150 -0
  133. package/examples/utils/aframe/force-pushable.js +80 -0
  134. package/examples/utils/aframe/grabbable-anchor.js +46 -0
  135. package/examples/utils/aframe/grabbable-listener.js +31 -0
  136. package/examples/utils/aframe/grabbable-physics-body.js +190 -0
  137. package/examples/utils/aframe/grow-shrink.js +25 -0
  138. package/examples/utils/aframe/hand-punch.js +119 -0
  139. package/examples/utils/aframe/my-obb-collider.js +293 -0
  140. package/examples/utils/aframe/occlude-hand-tracking-controls.js +47 -0
  141. package/examples/utils/aframe/occlude-mesh.js +42 -0
  142. package/examples/utils/aframe/palm-up-detector.js +47 -0
  143. package/examples/utils/aframe/shadow-material.js +20 -0
  144. package/examples/utils/aframe/soft-shadow-light.js +9 -0
  145. package/examples/webxr/script.js +3 -3
  146. package/examples/webxr-2/assets/3d/soccerBall.glb +0 -0
  147. package/examples/webxr-2/assets/audio/shellBounce.wav +0 -0
  148. package/examples/webxr-2/assets/audio/shellHit.wav +0 -0
  149. package/examples/webxr-2/assets/audio/shellKick.wav +0 -0
  150. package/examples/webxr-2/assets/audio/soccerBounce.wav +0 -0
  151. package/examples/webxr-2/assets/audio/soccerKick.mp3 +0 -0
  152. package/examples/webxr-2/assets/images/shellTexture.png +0 -0
  153. package/examples/webxr-2/components/bs-ankle.js +337 -0
  154. package/examples/webxr-2/components/coin.js +84 -0
  155. package/examples/webxr-2/components/custom-wrap.js +17 -0
  156. package/examples/webxr-2/components/goomba.js +3250 -0
  157. package/examples/webxr-2/components/init-shell-material.js +215 -0
  158. package/examples/webxr-2/components/platter.js +172 -0
  159. package/examples/webxr-2/components/shell.js +374 -0
  160. package/examples/webxr-2/components/soccer-ball.js +250 -0
  161. package/examples/webxr-2/components/squashed-goomba.js +249 -0
  162. package/examples/webxr-2/edge-impulse-standalone.js +7228 -0
  163. package/examples/webxr-2/edge-impulse-standalone.wasm +0 -0
  164. package/examples/webxr-2/index.html +996 -0
  165. package/examples/webxr-2/kick.tflite +0 -0
  166. package/examples/webxr-2/kick2.tflite +0 -0
  167. package/examples/webxr-2/run-impulse.js +135 -0
  168. package/examples/webxr-2/script.js +384 -0
  169. package/package.json +2 -1
  170. package/src/.prettierrc +4 -0
  171. package/src/BS.ts +66 -9
  172. package/src/CameraManager.ts +499 -0
  173. package/src/Device.ts +620 -92
  174. package/src/DeviceInformationManager.ts +22 -11
  175. package/src/DeviceManager.ts +94 -25
  176. package/src/FileTransferManager.ts +146 -21
  177. package/src/FirmwareManager.ts +1 -1
  178. package/src/InformationManager.ts +62 -20
  179. package/src/TfliteManager.ts +172 -26
  180. package/src/WifiManager.ts +323 -0
  181. package/src/connection/BaseConnectionManager.ts +145 -30
  182. package/src/connection/ClientConnectionManager.ts +47 -11
  183. package/src/connection/bluetooth/BluetoothConnectionManager.ts +14 -3
  184. package/src/connection/bluetooth/NobleConnectionManager.ts +155 -42
  185. package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +104 -35
  186. package/src/connection/bluetooth/bluetoothUUIDs.ts +40 -13
  187. package/src/connection/udp/UDPConnectionManager.ts +356 -0
  188. package/src/connection/websocket/WebSocketConnectionManager.ts +282 -0
  189. package/src/devicePair/DevicePair.ts +145 -49
  190. package/src/devicePair/DevicePairPressureSensorDataManager.ts +72 -24
  191. package/src/devicePair/DevicePairSensorDataManager.ts +5 -5
  192. package/src/scanner/BaseScanner.ts +49 -11
  193. package/src/scanner/NobleScanner.ts +81 -17
  194. package/src/sensor/BarometerSensorDataManager.ts +1 -1
  195. package/src/sensor/MotionSensorDataManager.ts +22 -7
  196. package/src/sensor/PressureSensorDataManager.ts +47 -13
  197. package/src/sensor/SensorConfigurationManager.ts +75 -24
  198. package/src/sensor/SensorDataManager.ts +107 -26
  199. package/src/server/BaseClient.ts +192 -37
  200. package/src/server/BaseServer.ts +201 -43
  201. package/src/server/ServerUtils.ts +39 -9
  202. package/src/server/udp/UDPServer.ts +74 -23
  203. package/src/server/udp/UDPUtils.ts +9 -2
  204. package/src/server/websocket/WebSocketClient.ts +30 -9
  205. package/src/server/websocket/WebSocketServer.ts +1 -1
  206. package/src/server/websocket/WebSocketUtils.ts +4 -2
  207. package/src/utils/CenterOfPressureHelper.ts +5 -5
  208. package/src/utils/Console.ts +62 -9
  209. package/src/utils/MathUtils.ts +31 -1
  210. package/src/utils/ParseUtils.ts +25 -6
  211. package/src/utils/ThrottleUtils.ts +62 -0
  212. package/src/utils/Timer.ts +1 -1
  213. package/src/utils/checksum.ts +1 -1
  214. package/src/utils/mcumgr.js +1 -1
  215. 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 { PressureData } from "../sensor/PressureSensorDataManager.ts";
3
+ import {
4
+ PressureData,
5
+ PressureSensorPosition,
6
+ PressureSensorValue,
7
+ } from "../sensor/PressureSensorDataManager.ts";
4
8
  import { CenterOfPressure } from "../utils/CenterOfPressureHelper.ts";
5
- import { InsoleSide, InsoleSides } from "../InformationManager.ts";
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", { log: true });
13
+ const _console = createConsole("DevicePairPressureSensorDataManager", {
14
+ log: false,
15
+ });
9
16
 
10
- export type DevicePairRawPressureData = { [insoleSide in InsoleSide]: PressureData };
17
+ export type DevicePairRawPressureData = { [side in Side]: PressureData };
11
18
 
12
19
  export interface DevicePairPressureData {
13
- rawSum: number;
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 insoleSide = event.target.insoleSide;
39
- _console.log({ pressure, insoleSide });
40
- this.#rawPressure[insoleSide] = pressure;
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 InsoleSides.every((side) => side in this.#rawPressure);
64
+ return Sides.every((side) => side in this.#rawPressure);
50
65
  }
51
66
 
52
67
  #updatePressureData() {
53
- const pressure: DevicePairPressureData = { rawSum: 0, normalizedSum: 0 };
54
-
55
- InsoleSides.forEach((side) => {
56
- pressure.rawSum += this.#rawPressure[side]!.scaledSum;
57
- pressure.normalizedSum += this.#rawPressure[side]!.normalizedSum;
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.normalizedSum > 0.001) {
85
+ if (pressure.scaledSum > 0) {
61
86
  pressure.center = { x: 0, y: 0 };
62
- InsoleSides.forEach((side) => {
87
+ Sides.forEach((side) => {
63
88
  const sidePressure = this.#rawPressure[side]!;
64
- const normalizedPressureSumWeight = sidePressure.normalizedSum / pressure.normalizedSum;
65
- if (normalizedPressureSumWeight > 0) {
66
- if (sidePressure.normalizedCenter?.y != undefined) {
67
- pressure.center!.y += sidePressure.normalizedCenter.y * normalizedPressureSumWeight;
68
- }
69
- if (side == "right") {
70
- pressure.center!.x = normalizedPressureSumWeight;
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 = this.#centerOfPressureHelper.updateAndGetNormalization(pressure.center);
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 { InsoleSide } from "../InformationManager.ts";
5
+ import { Side } from "../InformationManager.ts";
6
6
  import { SensorType } from "../sensor/SensorDataManager.ts";
7
- import { DeviceEventMap, SpecificDeviceEvent } from "../Device.ts";
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: true });
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 = { [insoleSide in InsoleSide]: number };
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.insoleSide] = timestamp;
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, { BoundEventListeners, Event, EventMap } from "../utils/EventDispatcher.ts";
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<BaseScanner, ScannerEventType, ScannerEventMessages>;
36
- export type ScannerEventMap = EventMap<BaseScanner, ScannerEventType, ScannerEventMessages>;
37
- export type ScannerEvent = Event<BaseScanner, ScannerEventType, ScannerEventMessages>;
38
- export type BoundScannerEventListeners = BoundEventListeners<BaseScanner, ScannerEventType, ScannerEventMessages>;
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(this.isSupported, `${this.constructor.name} is not supported`);
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(this.constructor != BaseScanner, `${this.constructor.name} must be subclassed`);
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(this as BaseScanner, ScannerEventTypes);
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 this.#discoveredDeviceTimestamps[a.bluetoothId] - this.#discoveredDeviceTimestamps[b.bluetoothId];
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(this.#checkDiscoveredDevicesExpiration.bind(this), 1000);
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, { DiscoveredDevice, ScannerEventMap } from "./BaseScanner.ts";
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 { serviceDataUUID, serviceUUIDs } from "../connection/bluetooth/bluetoothUUIDs.ts";
7
+ import {
8
+ serviceDataUUID,
9
+ serviceUUIDs,
10
+ } from "../connection/bluetooth/bluetoothUUIDs.ts";
5
11
  import Device from "../Device.ts";
6
- import NobleConnectionManager, { NoblePeripheral } from "../connection/bluetooth/NobleConnectionManager.ts";
12
+ import NobleConnectionManager, {
13
+ NoblePeripheral,
14
+ } from "../connection/bluetooth/NobleConnectionManager.ts";
7
15
 
8
- const _console = createConsole("NobleScanner", { log: true });
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 = ["unknown", "resetting", "unsupported", "unauthorized", "poweredOff", "poweredOn"] as const;
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", { isScanningAvailable: this.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
- const deviceTypeEnum = manufacturerData.readUint8(manufacturerData.byteLength - 1);
92
- deviceType = DeviceTypes[deviceTypeEnum];
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(event: ScannerEventMap["expiredDiscoveredDevice"]) {
195
+ #onExpiredDiscoveredDevice(
196
+ event: ScannerEventMap["expiredDiscoveredDevice"]
197
+ ) {
155
198
  const { discoveredDevice } = event.message;
156
- const noblePeripheral = this.#noblePeripherals[discoveredDevice.bluetoothId];
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(deviceId: string) {
175
- super.connectToDevice(deviceId);
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((device) => device.connectionType == "noble").find(
181
- (device) => device.bluetoothId == deviceId
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
- await device.connect();
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
- await device.reconnect();
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: true });
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: true });
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 = ["still", "walking", "running", "bicycle", "vehicle", "tilting"] as const;
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 = ValueOf<MotionSensorDataEventMessages>;
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] = [dataView.getInt16(0, true), dataView.getInt16(2, true), dataView.getInt16(4, true)].map(
80
- (value) => value * scalar
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 += 360;
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: true });
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 = (typeof ContinuousPressureSensorTypes)[number];
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(this.numberOfSensors, () => new RangeHelper());
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.forEach((rangeHelper) => rangeHelper.reset());
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 = { sensors: [], scaledSum: 0, normalizedSum: 0 };
85
- for (let index = 0, byteOffset = 0; byteOffset < dataView.byteLength; index++, byteOffset += 2) {
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
- const scaledValue = rawValue * scalar;
101
+ let scaledValue = (rawValue * scalar) / this.numberOfSensors;
88
102
  const rangeHelper = this.#sensorRangeHelpers[index];
89
- const normalizedValue = rangeHelper.updateAndGetNormalization(scaledValue, true);
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] = { rawValue, scaledValue, normalizedValue, position, weightedValue: 0 };
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 / this.numberOfSensors;
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 && pressure.normalizedSum > 0.001) {
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 = this.#centerOfPressureHelper.updateAndGetNormalization(pressure.center);
134
+ pressure.normalizedCenter =
135
+ this.#centerOfPressureHelper.updateAndGetNormalization(
136
+ pressure.center,
137
+ false
138
+ );
105
139
  }
106
140
 
107
141
  _console.log({ pressure });