@hangtime/grip-connect 0.9.0 → 0.10.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.
Files changed (127) hide show
  1. package/README.md +24 -15
  2. package/dist/cjs/index.d.ts +3 -1
  3. package/dist/cjs/index.d.ts.map +1 -1
  4. package/dist/cjs/index.js +5 -1
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/interfaces/callback.interface.d.ts +37 -31
  7. package/dist/cjs/interfaces/callback.interface.d.ts.map +1 -1
  8. package/dist/cjs/interfaces/device/kilterboard.interface.d.ts +3 -2
  9. package/dist/cjs/interfaces/device/kilterboard.interface.d.ts.map +1 -1
  10. package/dist/cjs/interfaces/device.interface.d.ts +4 -2
  11. package/dist/cjs/interfaces/device.interface.d.ts.map +1 -1
  12. package/dist/cjs/models/device/climbro.model.d.ts.map +1 -1
  13. package/dist/cjs/models/device/climbro.model.js +4 -8
  14. package/dist/cjs/models/device/climbro.model.js.map +1 -1
  15. package/dist/cjs/models/device/entralpi.model.d.ts.map +1 -1
  16. package/dist/cjs/models/device/entralpi.model.js +5 -9
  17. package/dist/cjs/models/device/entralpi.model.js.map +1 -1
  18. package/dist/cjs/models/device/forceboard.model.d.ts +1 -0
  19. package/dist/cjs/models/device/forceboard.model.d.ts.map +1 -1
  20. package/dist/cjs/models/device/forceboard.model.js +10 -15
  21. package/dist/cjs/models/device/forceboard.model.js.map +1 -1
  22. package/dist/cjs/models/device/kilterboard.model.d.ts +5 -3
  23. package/dist/cjs/models/device/kilterboard.model.d.ts.map +1 -1
  24. package/dist/cjs/models/device/kilterboard.model.js +52 -16
  25. package/dist/cjs/models/device/kilterboard.model.js.map +1 -1
  26. package/dist/cjs/models/device/motherboard.model.d.ts +7 -0
  27. package/dist/cjs/models/device/motherboard.model.d.ts.map +1 -1
  28. package/dist/cjs/models/device/motherboard.model.js +28 -15
  29. package/dist/cjs/models/device/motherboard.model.js.map +1 -1
  30. package/dist/cjs/models/device/pb-700bt.model.d.ts +63 -0
  31. package/dist/cjs/models/device/pb-700bt.model.d.ts.map +1 -0
  32. package/dist/cjs/models/device/pb-700bt.model.js +247 -0
  33. package/dist/cjs/models/device/pb-700bt.model.js.map +1 -0
  34. package/dist/cjs/models/device/progressor.model.d.ts.map +1 -1
  35. package/dist/cjs/models/device/progressor.model.js +4 -8
  36. package/dist/cjs/models/device/progressor.model.js.map +1 -1
  37. package/dist/cjs/models/device/smartboard-pro.model.d.ts +8 -0
  38. package/dist/cjs/models/device/smartboard-pro.model.d.ts.map +1 -1
  39. package/dist/cjs/models/device/smartboard-pro.model.js +62 -6
  40. package/dist/cjs/models/device/smartboard-pro.model.js.map +1 -1
  41. package/dist/cjs/models/device/wh-c06.model.d.ts.map +1 -1
  42. package/dist/cjs/models/device/wh-c06.model.js +5 -9
  43. package/dist/cjs/models/device/wh-c06.model.js.map +1 -1
  44. package/dist/cjs/models/device.model.d.ts +81 -13
  45. package/dist/cjs/models/device.model.d.ts.map +1 -1
  46. package/dist/cjs/models/device.model.js +138 -6
  47. package/dist/cjs/models/device.model.js.map +1 -1
  48. package/dist/cjs/models/index.d.ts +2 -1
  49. package/dist/cjs/models/index.d.ts.map +1 -1
  50. package/dist/cjs/models/index.js +4 -1
  51. package/dist/cjs/models/index.js.map +1 -1
  52. package/dist/cjs/utils.d.ts +16 -0
  53. package/dist/cjs/utils.d.ts.map +1 -0
  54. package/dist/cjs/utils.js +54 -0
  55. package/dist/cjs/utils.js.map +1 -0
  56. package/dist/index.d.ts +3 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +2 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/interfaces/callback.interface.d.ts +37 -31
  61. package/dist/interfaces/callback.interface.d.ts.map +1 -1
  62. package/dist/interfaces/device/kilterboard.interface.d.ts +3 -2
  63. package/dist/interfaces/device/kilterboard.interface.d.ts.map +1 -1
  64. package/dist/interfaces/device.interface.d.ts +4 -2
  65. package/dist/interfaces/device.interface.d.ts.map +1 -1
  66. package/dist/models/device/climbro.model.d.ts.map +1 -1
  67. package/dist/models/device/climbro.model.js +4 -8
  68. package/dist/models/device/climbro.model.js.map +1 -1
  69. package/dist/models/device/entralpi.model.d.ts.map +1 -1
  70. package/dist/models/device/entralpi.model.js +5 -9
  71. package/dist/models/device/entralpi.model.js.map +1 -1
  72. package/dist/models/device/forceboard.model.d.ts +1 -0
  73. package/dist/models/device/forceboard.model.d.ts.map +1 -1
  74. package/dist/models/device/forceboard.model.js +10 -15
  75. package/dist/models/device/forceboard.model.js.map +1 -1
  76. package/dist/models/device/kilterboard.model.d.ts +5 -3
  77. package/dist/models/device/kilterboard.model.d.ts.map +1 -1
  78. package/dist/models/device/kilterboard.model.js +52 -16
  79. package/dist/models/device/kilterboard.model.js.map +1 -1
  80. package/dist/models/device/motherboard.model.d.ts +7 -0
  81. package/dist/models/device/motherboard.model.d.ts.map +1 -1
  82. package/dist/models/device/motherboard.model.js +28 -15
  83. package/dist/models/device/motherboard.model.js.map +1 -1
  84. package/dist/models/device/pb-700bt.model.d.ts +63 -0
  85. package/dist/models/device/pb-700bt.model.d.ts.map +1 -0
  86. package/dist/models/device/pb-700bt.model.js +243 -0
  87. package/dist/models/device/pb-700bt.model.js.map +1 -0
  88. package/dist/models/device/progressor.model.d.ts.map +1 -1
  89. package/dist/models/device/progressor.model.js +4 -8
  90. package/dist/models/device/progressor.model.js.map +1 -1
  91. package/dist/models/device/smartboard-pro.model.d.ts +8 -0
  92. package/dist/models/device/smartboard-pro.model.d.ts.map +1 -1
  93. package/dist/models/device/smartboard-pro.model.js +62 -6
  94. package/dist/models/device/smartboard-pro.model.js.map +1 -1
  95. package/dist/models/device/wh-c06.model.d.ts.map +1 -1
  96. package/dist/models/device/wh-c06.model.js +5 -9
  97. package/dist/models/device/wh-c06.model.js.map +1 -1
  98. package/dist/models/device.model.d.ts +81 -13
  99. package/dist/models/device.model.d.ts.map +1 -1
  100. package/dist/models/device.model.js +160 -15
  101. package/dist/models/device.model.js.map +1 -1
  102. package/dist/models/index.d.ts +2 -1
  103. package/dist/models/index.d.ts.map +1 -1
  104. package/dist/models/index.js +2 -1
  105. package/dist/models/index.js.map +1 -1
  106. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  107. package/dist/utils.d.ts +16 -0
  108. package/dist/utils.d.ts.map +1 -0
  109. package/dist/utils.js +50 -0
  110. package/dist/utils.js.map +1 -0
  111. package/package.json +4 -1
  112. package/src/index.ts +13 -0
  113. package/src/interfaces/callback.interface.ts +41 -31
  114. package/src/interfaces/device/kilterboard.interface.ts +2 -2
  115. package/src/interfaces/device.interface.ts +4 -2
  116. package/src/models/device/climbro.model.ts +4 -8
  117. package/src/models/device/entralpi.model.ts +5 -9
  118. package/src/models/device/forceboard.model.ts +11 -16
  119. package/src/models/device/kilterboard.model.ts +56 -19
  120. package/src/models/device/motherboard.model.ts +32 -15
  121. package/src/models/device/pb-700bt.model.ts +263 -0
  122. package/src/models/device/progressor.model.ts +4 -8
  123. package/src/models/device/smartboard-pro.model.ts +73 -6
  124. package/src/models/device/wh-c06.model.ts +5 -9
  125. package/src/models/device.model.ts +191 -17
  126. package/src/models/index.ts +3 -1
  127. package/src/utils.ts +57 -0
@@ -151,20 +151,16 @@ class Progressor extends device_model_js_1.Device {
151
151
  masses: [numericData],
152
152
  });
153
153
  // Check for max weight
154
- this.massMax = Math.max(Number(this.massMax), Number(numericData)).toFixed(1);
154
+ this.peak = Math.max(this.peak, Number(numericData));
155
155
  // Update running sum and count
156
156
  const currentMassTotal = Math.max(-1000, Number(numericData));
157
- this.massTotalSum += currentMassTotal;
157
+ this.sum += currentMassTotal;
158
158
  this.dataPointCount++;
159
159
  // Calculate the average dynamically
160
- this.massAverage = (this.massTotalSum / this.dataPointCount).toFixed(1);
160
+ this.mean = this.sum / this.dataPointCount;
161
161
  // Check if device is being used
162
162
  this.activityCheck(numericData);
163
- this.notifyCallback({
164
- massMax: this.massMax,
165
- massAverage: this.massAverage,
166
- massTotal: Math.max(-1000, numericData).toFixed(1),
167
- });
163
+ this.notifyCallback(this.buildForceMeasurement(Math.max(-1000, numericData)));
168
164
  }
169
165
  }
170
166
  }
@@ -1 +1 @@
1
- {"version":3,"file":"progressor.model.js","sourceRoot":"","sources":["../../../../src/models/device/progressor.model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"progressor.model.js","sourceRoot":"","sources":["../../../../src/models/device/progressor.model.ts"],"names":[],"mappings":"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"}
@@ -7,5 +7,13 @@ import type { ISmartBoardPro } from "../../interfaces/device/smartboard-pro.inte
7
7
  */
8
8
  export declare class SmartBoardPro extends Device implements ISmartBoardPro {
9
9
  constructor();
10
+ /**
11
+ * Handles data received from the device, processes weight measurements,
12
+ * and updates mass data including maximum and average values.
13
+ * It also handles command responses for retrieving device information.
14
+ *
15
+ * @param {DataView} value - The notification event.
16
+ */
17
+ handleNotifications: (value: DataView) => void;
10
18
  }
11
19
  //# sourceMappingURL=smartboard-pro.model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"smartboard-pro.model.d.ts","sourceRoot":"","sources":["../../../../src/models/device/smartboard-pro.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAA;AAEzF;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,MAAO,YAAW,cAAc;;CA4ClE"}
1
+ {"version":3,"file":"smartboard-pro.model.d.ts","sourceRoot":"","sources":["../../../../src/models/device/smartboard-pro.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAA;AAEzF;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,MAAO,YAAW,cAAc;;IA6CjE;;;;;;OAMG;IACM,mBAAmB,GAAI,OAAO,QAAQ,KAAG,IAAI,CA0DrD;CACF"}
@@ -13,8 +13,8 @@ class SmartBoardPro extends device_model_js_1.Device {
13
13
  filters: [{ name: "SMARTBOARD" }],
14
14
  services: [
15
15
  {
16
- name: "Basic Audio Announcement",
17
- id: "audio",
16
+ name: "Weight Scale Service",
17
+ id: "weight",
18
18
  uuid: "00001851-0000-1000-8000-00805f9b34fb",
19
19
  characteristics: [
20
20
  {
@@ -25,13 +25,13 @@ class SmartBoardPro extends device_model_js_1.Device {
25
25
  ],
26
26
  },
27
27
  {
28
- name: "Read + Notify",
29
- id: "",
28
+ name: "Smartboard Service",
29
+ id: "smartboard",
30
30
  uuid: "0000403d-0000-1000-8000-00805f9b34fb",
31
31
  characteristics: [
32
32
  {
33
- name: "",
34
- id: "",
33
+ name: "SmartBoard Measurement",
34
+ id: "rx",
35
35
  uuid: "00001583-0000-1000-8000-00805f9b34fb",
36
36
  },
37
37
  ],
@@ -50,6 +50,62 @@ class SmartBoardPro extends device_model_js_1.Device {
50
50
  },
51
51
  ],
52
52
  });
53
+ /**
54
+ * Handles data received from the device, processes weight measurements,
55
+ * and updates mass data including maximum and average values.
56
+ * It also handles command responses for retrieving device information.
57
+ *
58
+ * @param {DataView} value - The notification event.
59
+ */
60
+ this.handleNotifications = (value) => {
61
+ if (value) {
62
+ // Update timestamp
63
+ this.updateTimestamp();
64
+ if (value.buffer) {
65
+ const length = value.byteLength / 2;
66
+ const dataArray = [];
67
+ for (let i = 0; i < length; i++) {
68
+ const offset = i * 2;
69
+ if (offset + 1 < value.byteLength) {
70
+ const intValue = value.getInt16(offset, true);
71
+ // For debugging purposes
72
+ console.log(intValue);
73
+ dataArray.push(intValue);
74
+ }
75
+ }
76
+ if (dataArray.length === 0)
77
+ return;
78
+ const receivedTime = Date.now();
79
+ // Process each data point
80
+ for (const receivedData of dataArray) {
81
+ // Skip invalid values
82
+ if (!Number.isFinite(receivedData))
83
+ continue;
84
+ const numericData = receivedData - this.applyTare(receivedData);
85
+ // Add data to downloadable Array
86
+ this.downloadPackets.push({
87
+ received: receivedTime,
88
+ sampleNum: this.dataPointCount,
89
+ battRaw: 0,
90
+ samples: [numericData],
91
+ masses: [numericData],
92
+ });
93
+ // Update peak
94
+ this.peak = Math.max(this.peak, numericData);
95
+ // Update running sum and count
96
+ const currentMassTotal = Math.max(-1000, numericData);
97
+ this.sum += currentMassTotal;
98
+ this.dataPointCount++;
99
+ // Calculate the average dynamically
100
+ this.mean = this.sum / this.dataPointCount;
101
+ // Check if device is being used
102
+ this.activityCheck(numericData);
103
+ // Notify with weight data
104
+ this.notifyCallback(this.buildForceMeasurement(Math.max(-1000, numericData)));
105
+ }
106
+ }
107
+ }
108
+ };
53
109
  }
54
110
  }
55
111
  exports.SmartBoardPro = SmartBoardPro;
@@ -1 +1 @@
1
- {"version":3,"file":"smartboard-pro.model.js","sourceRoot":"","sources":["../../../../src/models/device/smartboard-pro.model.ts"],"names":[],"mappings":";;;AAAA,wDAA2C;AAG3C;;;;GAIG;AACH,MAAa,aAAc,SAAQ,wBAAM;IACvC;QACE,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YACjC,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,0BAA0B;oBAChC,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,sCAAsC;oBAC5C,eAAe,EAAE;wBACf;4BACE,IAAI,EAAE,EAAE;4BACR,EAAE,EAAE,EAAE;4BACN,IAAI,EAAE,sCAAsC;yBAC7C;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,eAAe;oBACrB,EAAE,EAAE,EAAE;oBACN,IAAI,EAAE,sCAAsC;oBAC5C,eAAe,EAAE;wBACf;4BACE,IAAI,EAAE,EAAE;4BACR,EAAE,EAAE,EAAE;4BACN,IAAI,EAAE,sCAAsC;yBAC7C;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,mBAAmB;oBACzB,EAAE,EAAE,WAAW;oBACf,IAAI,EAAE,sCAAsC;oBAC5C,eAAe,EAAE;wBACf;4BACE,IAAI,EAAE,iBAAiB;4BACvB,EAAE,EAAE,SAAS;4BACb,IAAI,EAAE,sCAAsC;yBAC7C;qBACF;iBACF;aACF;SACF,CAAC,CAAA;IACJ,CAAC;CACF;AA5CD,sCA4CC"}
1
+ {"version":3,"file":"smartboard-pro.model.js","sourceRoot":"","sources":["../../../../src/models/device/smartboard-pro.model.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wh-c06.model.d.ts","sourceRoot":"","sources":["../../../../src/models/device/wh-c06.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6CAA6C,CAAA;AAEzE;;;;;GAKG;AACH,qBAAa,KAAM,SAAQ,MAAO,YAAW,MAAM;IACjD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAa;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAc;IAEpD;;;;OAIG;IACH,OAAO,CAAC,oBAAoB,CAA6C;IAEzE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAa;;IA0BtD;;;;OAIG;IACM,OAAO,GACd,YAAW,MAAM,IAAkD,EACnE,UAAS,CAAC,KAAK,EAAE,KAAK,KAAK,IAAsC,KAChE,OAAO,CAAC,IAAI,CAAC,CAqFf;IAED;;;;OAIG;IACM,WAAW,QAAO,OAAO,CAEjC;IAED;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAkBhC;CACF"}
1
+ {"version":3,"file":"wh-c06.model.d.ts","sourceRoot":"","sources":["../../../../src/models/device/wh-c06.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6CAA6C,CAAA;AAEzE;;;;;GAKG;AACH,qBAAa,KAAM,SAAQ,MAAO,YAAW,MAAM;IACjD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAa;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAc;IAEpD;;;;OAIG;IACH,OAAO,CAAC,oBAAoB,CAA6C;IAEzE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAa;;IA0BtD;;;;OAIG;IACM,OAAO,GACd,YAAW,MAAM,IAAkD,EACnE,UAAS,CAAC,KAAK,EAAE,KAAK,KAAK,IAAsC,KAChE,OAAO,CAAC,IAAI,CAAC,CAiFf;IAED;;;;OAIG;IACM,WAAW,QAAO,OAAO,CAEjC;IAED;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAkBhC;CACF"}
@@ -83,22 +83,18 @@ class WHC06 extends device_model_js_1.Device {
83
83
  samples: [numericData],
84
84
  masses: [numericData],
85
85
  });
86
- // Update massMax
87
- this.massMax = Math.max(Number(this.massMax), numericData).toFixed(1);
86
+ // Update peak
87
+ this.peak = Math.max(this.peak, numericData);
88
88
  // Update running sum and count
89
89
  const currentMassTotal = Math.max(-1000, numericData);
90
- this.massTotalSum += currentMassTotal;
90
+ this.sum += currentMassTotal;
91
91
  this.dataPointCount++;
92
92
  // Calculate the average dynamically
93
- this.massAverage = (this.massTotalSum / this.dataPointCount).toFixed(1);
93
+ this.mean = this.sum / this.dataPointCount;
94
94
  // Check if device is being used
95
95
  this.activityCheck(numericData);
96
96
  // Notify with weight data
97
- this.notifyCallback({
98
- massMax: this.massMax,
99
- massAverage: this.massAverage,
100
- massTotal: Math.max(-1000, numericData).toFixed(1),
101
- });
97
+ this.notifyCallback(this.buildForceMeasurement(Math.max(-1000, numericData)));
102
98
  }
103
99
  // Reset "still advertising" counter
104
100
  this.resetAdvertisementTimeout();
@@ -1 +1 @@
1
- {"version":3,"file":"wh-c06.model.js","sourceRoot":"","sources":["../../../../src/models/device/wh-c06.model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wh-c06.model.js","sourceRoot":"","sources":["../../../../src/models/device/wh-c06.model.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { BaseModel } from "./../models/base.model.js";
2
2
  import type { IDevice, Service } from "../interfaces/device.interface.js";
3
- import type { ActiveCallback, NotifyCallback, WriteCallback } from "../interfaces/callback.interface.js";
3
+ import type { ActiveCallback, ForceMeasurement, ForceUnit, NotifyCallback, WriteCallback } from "../interfaces/callback.interface.js";
4
4
  import type { DownloadPacket } from "../interfaces/download.interface.js";
5
5
  import type { Commands } from "../interfaces/command.interface.js";
6
6
  export declare abstract class Device extends BaseModel implements IDevice {
@@ -57,24 +57,55 @@ export declare abstract class Device extends BaseModel implements IDevice {
57
57
  */
58
58
  private activeConfig;
59
59
  /**
60
- * Maximum mass recorded from the device, initialized to "0".
61
- * @type {string}
60
+ * Highest instantaneous force (peak) recorded in the session; may be negative.
61
+ * Initialized to Number.NEGATIVE_INFINITY so the first sample sets the peak.
62
+ * @type {number}
62
63
  * @protected
63
64
  */
64
- protected massMax: string;
65
+ protected peak: number;
65
66
  /**
66
- * Average mass calculated from the device data, initialized to "0".
67
- * @type {string}
67
+ * Mean (average) force over the session, initialized to 0.
68
+ * @type {number}
68
69
  * @protected
69
70
  */
70
- protected massAverage: string;
71
+ protected mean: number;
71
72
  /**
72
- * Total sum of all mass data points recorded from the device.
73
- * Used to calculate the average mass.
73
+ * Display unit for force measurements (output unit for notify callbacks).
74
+ * @type {ForceUnit}
75
+ * @protected
76
+ */
77
+ protected unit: ForceUnit;
78
+ /**
79
+ * Unit of the values streamed by the device (kg for most devices, lbs for ForceBoard).
80
+ * @type {ForceUnit}
81
+ * @protected
82
+ */
83
+ protected streamUnit: ForceUnit;
84
+ /**
85
+ * Optional sampling rate in Hz when known or calculated from notification timestamps.
86
+ * @type {number | undefined}
87
+ * @protected
88
+ */
89
+ protected samplingRateHz?: number;
90
+ /**
91
+ * Start time of the current rate measurement interval.
92
+ * @type {number}
93
+ * @private
94
+ */
95
+ private rateIntervalStart;
96
+ /**
97
+ * Number of samples in the current rate measurement interval.
98
+ * @type {number}
99
+ * @private
100
+ */
101
+ private rateIntervalSamples;
102
+ /**
103
+ * Running sum of force values for the session.
104
+ * Used to calculate mean (average) force.
74
105
  * @type {number}
75
106
  * @protected
76
107
  */
77
- protected massTotalSum: number;
108
+ protected sum: number;
78
109
  /**
79
110
  * Number of data points received from the device.
80
111
  * Used to calculate the average mass.
@@ -115,9 +146,9 @@ export declare abstract class Device extends BaseModel implements IDevice {
115
146
  */
116
147
  private tareDuration;
117
148
  /**
118
- * Optional callback for handling write operations.
149
+ * Optional callback for handling mass/force data notifications.
119
150
  * @callback NotifyCallback
120
- * @param {massObject} data - The data passed to the callback.
151
+ * @param {ForceMeasurement} data - The force measurement passed to the callback.
121
152
  * @type {NotifyCallback | undefined}
122
153
  * @protected
123
154
  */
@@ -155,6 +186,41 @@ export declare abstract class Device extends BaseModel implements IDevice {
155
186
  */
156
187
  private notificationListeners;
157
188
  constructor(device: Partial<IDevice>);
189
+ /**
190
+ * Builds a ForceMeasurement for a single zone (e.g. left/center/right).
191
+ * With one argument, current/peak/mean are all set to that value.
192
+ * With three arguments, uses the given current, peak, and mean for the zone.
193
+ * @param valueOrCurrent - Force value, or current force for this zone
194
+ * @param peak - Optional peak for this zone (required if mean is provided)
195
+ * @param mean - Optional mean for this zone
196
+ * @returns ForceMeasurement (no nested distribution)
197
+ * @protected
198
+ */
199
+ protected buildZoneMeasurement(valueOrCurrent: number, peak?: number, mean?: number): ForceMeasurement;
200
+ /**
201
+ * Interval duration (ms) for sampling rate calculation.
202
+ * @private
203
+ * @readonly
204
+ */
205
+ private static readonly RATE_INTERVAL_MS;
206
+ /**
207
+ * Calculates sampling rate: samples per second.
208
+ * Uses fixed intervals to avoid sliding window edge effects.
209
+ * @private
210
+ */
211
+ private updateSamplingRate;
212
+ /**
213
+ * Builds a ForceMeasurement payload with unit and timestamp for notify callbacks.
214
+ * @param current - Current force at this sample
215
+ * @param distribution - Optional zone distribution: numbers (converted via buildZoneMeasurement) or full ForceMeasurement per zone
216
+ * @returns ForceMeasurement
217
+ * @protected
218
+ */
219
+ protected buildForceMeasurement(current: number, distribution?: {
220
+ left?: ForceMeasurement;
221
+ center?: ForceMeasurement;
222
+ right?: ForceMeasurement;
223
+ }): ForceMeasurement;
158
224
  /**
159
225
  * Sets the callback function to be called when the activity status changes,
160
226
  * and optionally sets the configuration for threshold and duration.
@@ -308,6 +374,7 @@ export declare abstract class Device extends BaseModel implements IDevice {
308
374
  /**
309
375
  * Sets the callback function to be called when notifications are received.
310
376
  * @param {NotifyCallback} callback - The callback function to be set.
377
+ * @param {ForceUnit} [unit="kg"] - Optional display unit for force values in the callback payload.
311
378
  * @returns {void}
312
379
  * @public
313
380
  *
@@ -315,8 +382,9 @@ export declare abstract class Device extends BaseModel implements IDevice {
315
382
  * device.notify((data) => {
316
383
  * console.log('Received notification:', data);
317
384
  * });
385
+ * device.notify((data) => { ... }, 'lbs');
318
386
  */
319
- notify: (callback: NotifyCallback) => void;
387
+ notify: (callback: NotifyCallback, unit?: ForceUnit) => void;
320
388
  /**
321
389
  * Handles the 'connected' event.
322
390
  * @param {Function} onSuccess - Callback function to execute on successful connection.
@@ -1 +1 @@
1
- {"version":3,"file":"device.model.d.ts","sourceRoot":"","sources":["../../../src/models/device.model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device.model.d.ts","sourceRoot":"","sources":["../../../src/models/device.model.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Device = void 0;
4
4
  const base_model_js_1 = require("./../models/base.model.js");
5
+ const utils_js_1 = require("../utils.js");
5
6
  class Device extends base_model_js_1.BaseModel {
6
7
  constructor(device) {
7
8
  super(device);
@@ -23,6 +24,24 @@ class Device extends base_model_js_1.BaseModel {
23
24
  threshold: 2.5,
24
25
  duration: 1000,
25
26
  };
27
+ /**
28
+ * Unit of the values streamed by the device (kg for most devices, lbs for ForceBoard).
29
+ * @type {ForceUnit}
30
+ * @protected
31
+ */
32
+ this.streamUnit = "kg";
33
+ /**
34
+ * Start time of the current rate measurement interval.
35
+ * @type {number}
36
+ * @private
37
+ */
38
+ this.rateIntervalStart = 0;
39
+ /**
40
+ * Number of samples in the current rate measurement interval.
41
+ * @type {number}
42
+ * @private
43
+ */
44
+ this.rateIntervalSamples = 0;
26
45
  /**
27
46
  * Array of DownloadPacket entries.
28
47
  * This array holds packets that contain data downloaded from the device.
@@ -56,9 +75,9 @@ class Device extends base_model_js_1.BaseModel {
56
75
  */
57
76
  this.tareDuration = 5000;
58
77
  /**
59
- * Optional callback for handling write operations.
78
+ * Optional callback for handling mass/force data notifications.
60
79
  * @callback NotifyCallback
61
- * @param {massObject} data - The data passed to the callback.
80
+ * @param {ForceMeasurement} data - The force measurement passed to the callback.
62
81
  * @type {NotifyCallback | undefined}
63
82
  * @protected
64
83
  */
@@ -167,6 +186,27 @@ class Device extends base_model_js_1.BaseModel {
167
186
  // Request device and set up connection
168
187
  const deviceServices = this.getAllServiceUUIDs();
169
188
  const bluetooth = await this.getBluetooth();
189
+ // Experiment: Reconnect to known devices, enable these Chrome flags:
190
+ // - chrome://flags/#enable-experimental-web-platform-features → enables getDevices() API
191
+ // - chrome://flags/#enable-web-bluetooth-new-permissions-backend → ensures it returns all permitted devices, not just connected ones
192
+ // let reconnectDevice: BluetoothDevice | undefined
193
+ // if (typeof bluetooth.getDevices === "function") {
194
+ // const devices: BluetoothDevice[] = await bluetooth.getDevices()
195
+ // if (devices.length > 0 && this.filters.length > 0) {
196
+ // reconnectDevice = devices.find((device) => {
197
+ // if (!device.name) return false
198
+ // const d = device
199
+ // return this.filters.some(
200
+ // (f) => (f.name && d.name === f.name) || (f.namePrefix && d.name?.startsWith(f.namePrefix)),
201
+ // )
202
+ // })
203
+ // }
204
+ // if (reconnectDevice) {
205
+ // this.bluetooth = reconnectDevice
206
+ // // It's currently impossible to call this.bluetooth.gatt.connect() here.
207
+ // // After restarting the Browser, it will always give: "Bluetooth Device is no longer in range."
208
+ // }
209
+ // }
170
210
  this.bluetooth = await bluetooth.requestDevice({
171
211
  filters: this.filters,
172
212
  optionalServices: deviceServices,
@@ -393,6 +433,7 @@ class Device extends base_model_js_1.BaseModel {
393
433
  /**
394
434
  * Sets the callback function to be called when notifications are received.
395
435
  * @param {NotifyCallback} callback - The callback function to be set.
436
+ * @param {ForceUnit} [unit="kg"] - Optional display unit for force values in the callback payload.
396
437
  * @returns {void}
397
438
  * @public
398
439
  *
@@ -400,8 +441,10 @@ class Device extends base_model_js_1.BaseModel {
400
441
  * device.notify((data) => {
401
442
  * console.log('Received notification:', data);
402
443
  * });
444
+ * device.notify((data) => { ... }, 'lbs');
403
445
  */
404
- this.notify = (callback) => {
446
+ this.notify = (callback, unit) => {
447
+ this.unit = unit !== null && unit !== void 0 ? unit : "kg";
405
448
  this.notifyCallback = callback;
406
449
  };
407
450
  /**
@@ -584,13 +627,96 @@ class Device extends base_model_js_1.BaseModel {
584
627
  if (device.bluetooth !== undefined) {
585
628
  this.bluetooth = device.bluetooth;
586
629
  }
587
- this.massMax = "0";
588
- this.massAverage = "0";
589
- this.massTotalSum = 0;
630
+ this.peak = Number.NEGATIVE_INFINITY;
631
+ this.mean = 0;
632
+ this.sum = 0;
590
633
  this.dataPointCount = 0;
634
+ this.unit = "kg";
635
+ // Reset sampling rate calculation state
636
+ this.rateIntervalStart = 0;
637
+ this.rateIntervalSamples = 0;
591
638
  this.createdAt = new Date();
592
639
  this.updatedAt = new Date();
593
640
  }
641
+ /**
642
+ * Builds a ForceMeasurement for a single zone (e.g. left/center/right).
643
+ * With one argument, current/peak/mean are all set to that value.
644
+ * With three arguments, uses the given current, peak, and mean for the zone.
645
+ * @param valueOrCurrent - Force value, or current force for this zone
646
+ * @param peak - Optional peak for this zone (required if mean is provided)
647
+ * @param mean - Optional mean for this zone
648
+ * @returns ForceMeasurement (no nested distribution)
649
+ * @protected
650
+ */
651
+ buildZoneMeasurement(valueOrCurrent, peak, mean) {
652
+ const useFullStats = peak !== undefined && mean !== undefined;
653
+ const current = valueOrCurrent;
654
+ const zonePeak = useFullStats ? (peak === 0 && current < 0 ? current : peak) : valueOrCurrent;
655
+ const zoneMean = useFullStats ? mean : valueOrCurrent;
656
+ const zone = {
657
+ unit: this.unit,
658
+ timestamp: Date.now(),
659
+ current,
660
+ peak: zonePeak,
661
+ mean: zoneMean,
662
+ };
663
+ if (this.samplingRateHz !== undefined) {
664
+ zone.samplingRateHz = this.samplingRateHz;
665
+ }
666
+ return zone;
667
+ }
668
+ /**
669
+ * Calculates sampling rate: samples per second.
670
+ * Uses fixed intervals to avoid sliding window edge effects.
671
+ * @private
672
+ */
673
+ updateSamplingRate() {
674
+ const now = Date.now();
675
+ if (this.rateIntervalStart === 0) {
676
+ this.rateIntervalStart = now;
677
+ }
678
+ this.rateIntervalSamples++;
679
+ const elapsed = now - this.rateIntervalStart;
680
+ if (elapsed >= Device.RATE_INTERVAL_MS) {
681
+ this.samplingRateHz = Math.round((this.rateIntervalSamples / elapsed) * 1000);
682
+ this.rateIntervalStart = now;
683
+ this.rateIntervalSamples = 0;
684
+ }
685
+ }
686
+ /**
687
+ * Builds a ForceMeasurement payload with unit and timestamp for notify callbacks.
688
+ * @param current - Current force at this sample
689
+ * @param distribution - Optional zone distribution: numbers (converted via buildZoneMeasurement) or full ForceMeasurement per zone
690
+ * @returns ForceMeasurement
691
+ * @protected
692
+ */
693
+ buildForceMeasurement(current, distribution) {
694
+ this.updateSamplingRate();
695
+ const payload = {
696
+ unit: this.unit,
697
+ timestamp: Date.now(),
698
+ current: (0, utils_js_1.convertForce)(current, this.streamUnit, this.unit),
699
+ peak: (0, utils_js_1.convertForce)(this.peak, this.streamUnit, this.unit),
700
+ mean: (0, utils_js_1.convertForce)(this.mean, this.streamUnit, this.unit),
701
+ };
702
+ if (this.samplingRateHz !== undefined) {
703
+ payload.samplingRateHz = this.samplingRateHz;
704
+ }
705
+ if (distribution !== undefined &&
706
+ (distribution.left !== undefined || distribution.center !== undefined || distribution.right !== undefined)) {
707
+ payload.distribution = {};
708
+ if (distribution.left !== undefined) {
709
+ payload.distribution.left = (0, utils_js_1.convertForceMeasurement)(distribution.left, this.streamUnit, this.unit);
710
+ }
711
+ if (distribution.center !== undefined) {
712
+ payload.distribution.center = (0, utils_js_1.convertForceMeasurement)(distribution.center, this.streamUnit, this.unit);
713
+ }
714
+ if (distribution.right !== undefined) {
715
+ payload.distribution.right = (0, utils_js_1.convertForceMeasurement)(distribution.right, this.streamUnit, this.unit);
716
+ }
717
+ }
718
+ return payload;
719
+ }
594
720
  /**
595
721
  * Returns the Bluetooth instance available for the current environment.
596
722
  * In browsers, it returns the native Web Bluetooth API (i.e. `navigator.bluetooth`).
@@ -662,4 +788,10 @@ class Device extends base_model_js_1.BaseModel {
662
788
  }
663
789
  }
664
790
  exports.Device = Device;
791
+ /**
792
+ * Interval duration (ms) for sampling rate calculation.
793
+ * @private
794
+ * @readonly
795
+ */
796
+ Device.RATE_INTERVAL_MS = 1000;
665
797
  //# sourceMappingURL=device.model.js.map