@hangtime/grip-connect 0.2.3 → 0.2.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hangtime/grip-connect",
3
- "version": "0.2.3",
3
+ "version": "0.2.6",
4
4
  "description": "A client that can establish connections with various Force-Sensing Hangboards/Plates used by climbers for strength measurement. Examples of such hangboards include the Griptonite Motherboard, Climbro, SmartBoard, Entralpi or Tindeq Progressor",
5
5
  "main": "src/index.ts",
6
6
  "scripts": {
@@ -19,13 +19,13 @@
19
19
  "hangboard",
20
20
  "hangboarding",
21
21
  "beastmaker",
22
- "motherboard"
22
+ "motherboard",
23
+ "tindeq",
24
+ "progressor",
25
+ "entralpi"
23
26
  ],
24
27
  "bugs": {
25
28
  "url": "https://github.com/Stevie-Ray/hangtime-grip-connect/issues"
26
29
  },
27
- "homepage": "https://stevie-ray.github.io/hangtime-grip-connect/",
28
- "dependencies": {
29
- "@aksel/structjs": "^1.0.0"
30
- }
30
+ "homepage": "https://stevie-ray.github.io/hangtime-grip-connect/"
31
31
  }
package/src/data.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { notifyCallback } from "./notify";
2
2
  import { ProgressorCommands, ProgressorResponses } from "./commands/progressor";
3
3
  import { lastWrite } from "./write";
4
- import struct from "@aksel/structjs";
4
+ import struct from "./struct";
5
5
  const PACKET_LENGTH = 32;
6
6
  const NUM_SAMPLES = 3;
7
7
  export const CALIBRATION = [[], [], [], []];
@@ -120,7 +120,7 @@ export const handleProgressorData = (uuid, data) => {
120
120
  notifyCallback({
121
121
  uuid: uuid,
122
122
  value: {
123
- massTotal: Math.max(-1000, weight - tare).toFixed(1),
123
+ massTotal: Math.max(-1000, Number(weight) - tare).toFixed(1),
124
124
  },
125
125
  });
126
126
  }
package/src/data.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { notifyCallback } from "./notify"
2
2
  import { ProgressorCommands, ProgressorResponses } from "./commands/progressor"
3
3
  import { lastWrite } from "./write"
4
- import struct from "@aksel/structjs"
4
+ import struct from "./struct"
5
5
 
6
6
  const PACKET_LENGTH: number = 32
7
7
  const NUM_SAMPLES: number = 3
@@ -145,7 +145,7 @@ export const handleProgressorData = (uuid: string, data: DataView): void => {
145
145
  notifyCallback({
146
146
  uuid: uuid,
147
147
  value: {
148
- massTotal: Math.max(-1000, weight - tare).toFixed(1),
148
+ massTotal: Math.max(-1000, Number(weight) - tare).toFixed(1),
149
149
  },
150
150
  })
151
151
  }
@@ -0,0 +1,9 @@
1
+ export default function struct(format: string): Readonly<{
2
+ unpack: (arrb: ArrayBuffer) => unknown[];
3
+ pack: (...values: unknown[]) => ArrayBuffer;
4
+ unpack_from: (arrb: ArrayBuffer, offs: number) => unknown[];
5
+ pack_into: (arrb: ArrayBuffer, offs: number, ...values: unknown[]) => void;
6
+ iter_unpack: (arrb: ArrayBuffer) => IterableIterator<unknown[]>;
7
+ format: string;
8
+ size: number;
9
+ }>;
@@ -0,0 +1,176 @@
1
+ const rechk = /^([<>])?(([1-9]\d*)?([xcbB?hHiIfdsp]))*$/;
2
+ const refmt = /([1-9]\d*)?([xcbB?hHiIfdsp])/g;
3
+ const str = (v, o, c) => String.fromCharCode(...Array.from(new Uint8Array(v.buffer, v.byteOffset + o, c)));
4
+ const rts = (v, o, c, s) => new Uint8Array(v.buffer, v.byteOffset + o, c).set(s.split("").map((str) => str.charCodeAt(0)));
5
+ const pst = (v, o, c) => str(v, o + 1, Math.min(v.getUint8(o), c - 1));
6
+ const tsp = (v, o, c, s) => {
7
+ v.setUint8(o, s.length);
8
+ rts(v, o + 1, c - 1, s);
9
+ };
10
+ const lut = (le) => ({
11
+ x: (c) => [
12
+ 1,
13
+ c,
14
+ () => ({
15
+ u: () => undefined,
16
+ p: () => undefined,
17
+ }),
18
+ ],
19
+ c: (c) => [
20
+ c,
21
+ 1,
22
+ (o) => ({
23
+ u: (v) => str(v, o, 1),
24
+ p: (v, s) => rts(v, o, 1, s),
25
+ }),
26
+ ],
27
+ "?": (c) => [
28
+ c,
29
+ 1,
30
+ (o) => ({
31
+ u: (v) => Boolean(v.getUint8(o)),
32
+ p: (v, B) => v.setUint8(o, B ? 1 : 0),
33
+ }),
34
+ ],
35
+ b: (c) => [
36
+ c,
37
+ 1,
38
+ (o) => ({
39
+ u: (v) => v.getInt8(o),
40
+ p: (v, b) => v.setInt8(o, b),
41
+ }),
42
+ ],
43
+ B: (c) => [
44
+ c,
45
+ 1,
46
+ (o) => ({
47
+ u: (v) => v.getUint8(o),
48
+ p: (v, B) => v.setUint8(o, B),
49
+ }),
50
+ ],
51
+ h: (c) => [
52
+ c,
53
+ 2,
54
+ (o) => ({
55
+ u: (v) => v.getInt16(o, le),
56
+ p: (v, h) => v.setInt16(o, h, le),
57
+ }),
58
+ ],
59
+ H: (c) => [
60
+ c,
61
+ 2,
62
+ (o) => ({
63
+ u: (v) => v.getUint16(o, le),
64
+ p: (v, H) => v.setUint16(o, H, le),
65
+ }),
66
+ ],
67
+ i: (c) => [
68
+ c,
69
+ 4,
70
+ (o) => ({
71
+ u: (v) => v.getInt32(o, le),
72
+ p: (v, i) => v.setInt32(o, i, le),
73
+ }),
74
+ ],
75
+ I: (c) => [
76
+ c,
77
+ 4,
78
+ (o) => ({
79
+ u: (v) => v.getUint32(o, le),
80
+ p: (v, I) => v.setUint32(o, I, le),
81
+ }),
82
+ ],
83
+ f: (c) => [
84
+ c,
85
+ 4,
86
+ (o) => ({
87
+ u: (v) => v.getFloat32(o, le),
88
+ p: (v, f) => v.setFloat32(o, f, le),
89
+ }),
90
+ ],
91
+ d: (c) => [
92
+ c,
93
+ 8,
94
+ (o) => ({
95
+ u: (v) => v.getFloat64(o, le),
96
+ p: (v, d) => v.setFloat64(o, d, le),
97
+ }),
98
+ ],
99
+ s: (c) => [
100
+ 1,
101
+ c,
102
+ (o) => ({
103
+ u: (v) => str(v, o, c),
104
+ p: (v, s) => rts(v, o, c, s.slice(0, c)),
105
+ }),
106
+ ],
107
+ p: (c) => [
108
+ 1,
109
+ c,
110
+ (o) => ({
111
+ u: (v) => pst(v, o, c),
112
+ p: (v, s) => tsp(v, o, c, s.slice(0, c - 1)),
113
+ }),
114
+ ],
115
+ });
116
+ const errbuf = new RangeError("Structure larger than remaining buffer");
117
+ const errval = new RangeError("Not enough values for structure");
118
+ export default function struct(format) {
119
+ const fns = [];
120
+ let size = 0;
121
+ let m = rechk.exec(format);
122
+ if (!m) {
123
+ throw new RangeError("Invalid format string");
124
+ }
125
+ const t = lut("<" === m[1]);
126
+ const lu = (n, c) => t[c](n ? parseInt(n, 10) : 1);
127
+ while ((m = refmt.exec(format))) {
128
+ // eslint-disable-next-line no-extra-semi
129
+ ;
130
+ ((r, s, f) => {
131
+ for (let i = 0; i < r; ++i, size += s) {
132
+ if (f) {
133
+ fns.push(f(size));
134
+ }
135
+ }
136
+ })(...lu(...m.slice(1)));
137
+ }
138
+ const unpack_from = (arrb, offs) => {
139
+ if (arrb.byteLength < (offs | 0) + size) {
140
+ throw errbuf;
141
+ }
142
+ const v = new DataView(arrb, offs | 0);
143
+ return fns.map((f) => f.u(v));
144
+ };
145
+ const pack_into = (arrb, offs, ...values) => {
146
+ if (values.length < fns.length) {
147
+ throw errval;
148
+ }
149
+ if (arrb.byteLength < offs + size) {
150
+ throw errbuf;
151
+ }
152
+ const v = new DataView(arrb, offs);
153
+ new Uint8Array(arrb, offs, size).fill(0);
154
+ fns.forEach((f, i) => f.p(v, values[i]));
155
+ };
156
+ const pack = (...values) => {
157
+ const b = new ArrayBuffer(size);
158
+ pack_into(b, 0, ...values);
159
+ return b;
160
+ };
161
+ const unpack = (arrb) => unpack_from(arrb, 0);
162
+ function* iter_unpack(arrb) {
163
+ for (let offs = 0; offs + size <= arrb.byteLength; offs += size) {
164
+ yield unpack_from(arrb, offs);
165
+ }
166
+ }
167
+ return Object.freeze({
168
+ unpack,
169
+ pack,
170
+ unpack_from,
171
+ pack_into,
172
+ iter_unpack,
173
+ format,
174
+ size,
175
+ });
176
+ }
@@ -0,0 +1,215 @@
1
+ const rechk: RegExp = /^([<>])?(([1-9]\d*)?([xcbB?hHiIfdsp]))*$/
2
+ const refmt: RegExp = /([1-9]\d*)?([xcbB?hHiIfdsp])/g
3
+
4
+ const str = (v: DataView, o: number, c: number): string =>
5
+ String.fromCharCode(...Array.from(new Uint8Array(v.buffer, v.byteOffset + o, c)))
6
+
7
+ const rts = (v: DataView, o: number, c: number, s: string): void =>
8
+ new Uint8Array(v.buffer, v.byteOffset + o, c).set(s.split("").map((str) => str.charCodeAt(0)))
9
+
10
+ const pst = (v: DataView, o: number, c: number): string => str(v, o + 1, Math.min(v.getUint8(o), c - 1))
11
+
12
+ const tsp = (v: DataView, o: number, c: number, s: string): void => {
13
+ v.setUint8(o, s.length)
14
+ rts(v, o + 1, c - 1, s)
15
+ }
16
+
17
+ interface FormatFn {
18
+ u: (v: DataView) => unknown
19
+ p: (v: DataView, value: unknown) => void
20
+ }
21
+
22
+ interface LUT {
23
+ [key: string]: (c: number) => [number, number, (o: number) => FormatFn]
24
+ }
25
+
26
+ const lut = (le: boolean): LUT => ({
27
+ x: (c: number) =>
28
+ [
29
+ 1,
30
+ c,
31
+ () => ({
32
+ u: () => undefined,
33
+ p: () => undefined,
34
+ }),
35
+ ] as [number, number, (o: number) => FormatFn],
36
+ c: (c: number) =>
37
+ [
38
+ c,
39
+ 1,
40
+ (o: number) => ({
41
+ u: (v: DataView) => str(v, o, 1),
42
+ p: (v: DataView, s: string) => rts(v, o, 1, s),
43
+ }),
44
+ ] as [number, number, (o: number) => FormatFn],
45
+ "?": (c: number) =>
46
+ [
47
+ c,
48
+ 1,
49
+ (o: number) => ({
50
+ u: (v: DataView) => Boolean(v.getUint8(o)),
51
+ p: (v: DataView, B: boolean) => v.setUint8(o, B ? 1 : 0),
52
+ }),
53
+ ] as [number, number, (o: number) => FormatFn],
54
+ b: (c: number) =>
55
+ [
56
+ c,
57
+ 1,
58
+ (o: number) => ({
59
+ u: (v: DataView) => v.getInt8(o),
60
+ p: (v: DataView, b: number) => v.setInt8(o, b),
61
+ }),
62
+ ] as [number, number, (o: number) => FormatFn],
63
+ B: (c: number) =>
64
+ [
65
+ c,
66
+ 1,
67
+ (o: number) => ({
68
+ u: (v: DataView) => v.getUint8(o),
69
+ p: (v: DataView, B: number) => v.setUint8(o, B),
70
+ }),
71
+ ] as [number, number, (o: number) => FormatFn],
72
+ h: (c: number) =>
73
+ [
74
+ c,
75
+ 2,
76
+ (o: number) => ({
77
+ u: (v: DataView) => v.getInt16(o, le),
78
+ p: (v: DataView, h: number) => v.setInt16(o, h, le),
79
+ }),
80
+ ] as [number, number, (o: number) => FormatFn],
81
+ H: (c: number) =>
82
+ [
83
+ c,
84
+ 2,
85
+ (o: number) => ({
86
+ u: (v: DataView) => v.getUint16(o, le),
87
+ p: (v: DataView, H: number) => v.setUint16(o, H, le),
88
+ }),
89
+ ] as [number, number, (o: number) => FormatFn],
90
+ i: (c: number) =>
91
+ [
92
+ c,
93
+ 4,
94
+ (o: number) => ({
95
+ u: (v: DataView) => v.getInt32(o, le),
96
+ p: (v: DataView, i: number) => v.setInt32(o, i, le),
97
+ }),
98
+ ] as [number, number, (o: number) => FormatFn],
99
+ I: (c: number) =>
100
+ [
101
+ c,
102
+ 4,
103
+ (o: number) => ({
104
+ u: (v: DataView) => v.getUint32(o, le),
105
+ p: (v: DataView, I: number) => v.setUint32(o, I, le),
106
+ }),
107
+ ] as [number, number, (o: number) => FormatFn],
108
+ f: (c: number) =>
109
+ [
110
+ c,
111
+ 4,
112
+ (o: number) => ({
113
+ u: (v: DataView) => v.getFloat32(o, le),
114
+ p: (v: DataView, f: number) => v.setFloat32(o, f, le),
115
+ }),
116
+ ] as [number, number, (o: number) => FormatFn],
117
+ d: (c: number) =>
118
+ [
119
+ c,
120
+ 8,
121
+ (o: number) => ({
122
+ u: (v: DataView) => v.getFloat64(o, le),
123
+ p: (v: DataView, d: number) => v.setFloat64(o, d, le),
124
+ }),
125
+ ] as [number, number, (o: number) => FormatFn],
126
+ s: (c: number) =>
127
+ [
128
+ 1,
129
+ c,
130
+ (o: number) => ({
131
+ u: (v: DataView) => str(v, o, c),
132
+ p: (v: DataView, s: string) => rts(v, o, c, s.slice(0, c)),
133
+ }),
134
+ ] as [number, number, (o: number) => FormatFn],
135
+ p: (c: number) =>
136
+ [
137
+ 1,
138
+ c,
139
+ (o: number) => ({
140
+ u: (v: DataView) => pst(v, o, c),
141
+ p: (v: DataView, s: string) => tsp(v, o, c, s.slice(0, c - 1)),
142
+ }),
143
+ ] as [number, number, (o: number) => FormatFn],
144
+ })
145
+
146
+ const errbuf: RangeError = new RangeError("Structure larger than remaining buffer")
147
+ const errval: RangeError = new RangeError("Not enough values for structure")
148
+
149
+ export default function struct(format: string) {
150
+ const fns: FormatFn[] = []
151
+ let size: number = 0
152
+ let m: RegExpExecArray | null = rechk.exec(format)
153
+
154
+ if (!m) {
155
+ throw new RangeError("Invalid format string")
156
+ }
157
+
158
+ const t: LUT = lut("<" === m[1])
159
+ const lu = (n: string, c: string): [number, number, (o: number) => FormatFn] => t[c](n ? parseInt(n, 10) : 1)
160
+
161
+ while ((m = refmt.exec(format))) {
162
+ // eslint-disable-next-line no-extra-semi
163
+ ;((r: number, s: number, f: (o: number) => FormatFn) => {
164
+ for (let i = 0; i < r; ++i, size += s) {
165
+ if (f) {
166
+ fns.push(f(size))
167
+ }
168
+ }
169
+ })(...lu(...(m.slice(1) as [string, string])))
170
+ }
171
+
172
+ const unpack_from = (arrb: ArrayBuffer, offs: number): unknown[] => {
173
+ if (arrb.byteLength < (offs | 0) + size) {
174
+ throw errbuf
175
+ }
176
+ const v = new DataView(arrb, offs | 0)
177
+ return fns.map((f) => f.u(v))
178
+ }
179
+
180
+ const pack_into = (arrb: ArrayBuffer, offs: number, ...values: unknown[]): void => {
181
+ if (values.length < fns.length) {
182
+ throw errval
183
+ }
184
+ if (arrb.byteLength < offs + size) {
185
+ throw errbuf
186
+ }
187
+ const v = new DataView(arrb, offs)
188
+ new Uint8Array(arrb, offs, size).fill(0)
189
+ fns.forEach((f, i) => f.p(v, values[i]))
190
+ }
191
+
192
+ const pack = (...values: unknown[]): ArrayBuffer => {
193
+ const b = new ArrayBuffer(size)
194
+ pack_into(b, 0, ...values)
195
+ return b
196
+ }
197
+
198
+ const unpack = (arrb: ArrayBuffer): unknown[] => unpack_from(arrb, 0)
199
+
200
+ function* iter_unpack(arrb: ArrayBuffer): IterableIterator<unknown[]> {
201
+ for (let offs = 0; offs + size <= arrb.byteLength; offs += size) {
202
+ yield unpack_from(arrb, offs)
203
+ }
204
+ }
205
+
206
+ return Object.freeze({
207
+ unpack,
208
+ pack,
209
+ unpack_from,
210
+ pack_into,
211
+ iter_unpack,
212
+ format,
213
+ size,
214
+ })
215
+ }
@@ -1 +0,0 @@
1
- declare module "@aksel/structjs"