@hangtime/grip-connect 0.2.1 → 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.
Files changed (63) hide show
  1. package/README.md +42 -35
  2. package/package.json +5 -3
  3. package/src/battery.d.ts +6 -0
  4. package/src/battery.js +19 -0
  5. package/src/calibration.d.ts +6 -0
  6. package/src/calibration.js +15 -0
  7. package/src/characteristic.d.ts +9 -0
  8. package/src/characteristic.js +15 -0
  9. package/src/commands/climbro.d.ts +6 -0
  10. package/src/commands/climbro.js +5 -0
  11. package/src/commands/entralpi.d.ts +6 -0
  12. package/src/commands/entralpi.js +5 -0
  13. package/src/commands/index.d.ts +5 -0
  14. package/src/commands/index.js +5 -0
  15. package/src/commands/motherboard.d.ts +6 -0
  16. package/src/commands/motherboard.js +13 -0
  17. package/src/commands/progressor.d.ts +15 -0
  18. package/src/commands/progressor.js +27 -0
  19. package/src/commands/smartboard.d.ts +6 -0
  20. package/src/commands/smartboard.js +5 -0
  21. package/src/commands/types.d.ts +18 -0
  22. package/src/commands/types.js +1 -0
  23. package/src/connect.d.ts +7 -0
  24. package/src/connect.js +159 -0
  25. package/src/connect.ts +3 -58
  26. package/src/data.d.ts +9 -0
  27. package/src/data.js +157 -0
  28. package/src/data.ts +45 -0
  29. package/src/devices/climbro.d.ts +2 -0
  30. package/src/devices/climbro.js +4 -0
  31. package/src/devices/entralpi.d.ts +2 -0
  32. package/src/devices/entralpi.js +52 -0
  33. package/src/devices/index.d.ts +5 -0
  34. package/src/devices/index.js +5 -0
  35. package/src/devices/motherboard.d.ts +2 -0
  36. package/src/devices/motherboard.js +79 -0
  37. package/src/devices/progressor.d.ts +2 -0
  38. package/src/devices/progressor.js +34 -0
  39. package/src/devices/smartboard.d.ts +2 -0
  40. package/src/devices/smartboard.js +4 -0
  41. package/src/devices/types.d.ts +20 -0
  42. package/src/devices/types.js +1 -0
  43. package/src/disconnect.d.ts +6 -0
  44. package/src/disconnect.js +10 -0
  45. package/src/index.d.ts +10 -0
  46. package/src/index.js +12 -0
  47. package/src/info.d.ts +6 -0
  48. package/src/info.js +23 -0
  49. package/src/is-connected.d.ts +7 -0
  50. package/src/is-connected.js +10 -0
  51. package/src/notify.d.ts +4 -0
  52. package/src/notify.js +6 -0
  53. package/src/read.d.ts +6 -0
  54. package/src/read.js +45 -0
  55. package/src/stop.d.ts +6 -0
  56. package/src/stop.js +18 -0
  57. package/src/stream.d.ts +6 -0
  58. package/src/stream.js +35 -0
  59. package/src/struct/index.d.ts +9 -0
  60. package/src/struct/index.js +176 -0
  61. package/src/struct/index.ts +215 -0
  62. package/src/write.d.ts +8 -0
  63. package/src/write.js +41 -0
package/src/stream.js ADDED
@@ -0,0 +1,35 @@
1
+ import { isConnected } from "./is-connected";
2
+ import { write } from "./write";
3
+ import { stop } from "./stop";
4
+ import { Motherboard, Progressor } from "./devices";
5
+ import { MotherboardCommands, ProgressorCommands } from "./commands";
6
+ import { CALIBRATION } from "./data";
7
+ import { calibration } from "./calibration";
8
+ /**
9
+ * stream output
10
+ * @param board
11
+ */
12
+ export const stream = async (board, duration = 0) => {
13
+ if (isConnected(board)) {
14
+ if (board.name === "Motherboard") {
15
+ // read calibration (required before reading data)
16
+ if (!CALIBRATION[0].length) {
17
+ await calibration(Motherboard);
18
+ }
19
+ // start stream
20
+ await write(Motherboard, "uart", "tx", MotherboardCommands.START_WEIGHT_MEAS, duration);
21
+ // end stream if duration is set
22
+ if (duration !== 0) {
23
+ await stop(Motherboard);
24
+ }
25
+ }
26
+ if (board.name && board.name.startsWith("Progressor")) {
27
+ // start stream
28
+ await write(Progressor, "progressor", "tx", ProgressorCommands.START_WEIGHT_MEAS, duration);
29
+ // end stream if duration is set
30
+ if (duration !== 0) {
31
+ await stop(Progressor);
32
+ }
33
+ }
34
+ }
35
+ };
@@ -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
+ }
package/src/write.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { Device } from "./devices/types";
2
+ export declare let lastWrite: string | null;
3
+ /**
4
+ * write
5
+ * @param characteristic
6
+ * @param message
7
+ */
8
+ export declare const write: (board: Device, serviceId: string, characteristicId: string, message: string | undefined, duration?: number) => Promise<void>;
package/src/write.js ADDED
@@ -0,0 +1,41 @@
1
+ import { isConnected } from "./is-connected";
2
+ import { getCharacteristic } from "./characteristic";
3
+ export let lastWrite = null;
4
+ /**
5
+ * write
6
+ * @param characteristic
7
+ * @param message
8
+ */
9
+ export const write = (board, serviceId, characteristicId, message, duration = 0) => {
10
+ return new Promise((resolve, reject) => {
11
+ if (isConnected(board)) {
12
+ if (!message)
13
+ return;
14
+ const characteristic = getCharacteristic(board, serviceId, characteristicId);
15
+ if (characteristic) {
16
+ const encoder = new TextEncoder();
17
+ characteristic
18
+ .writeValue(encoder.encode(message))
19
+ .then(() => {
20
+ // update last written message
21
+ lastWrite = message;
22
+ // handle timeout
23
+ if (duration !== 0) {
24
+ setTimeout(() => {
25
+ resolve();
26
+ }, duration);
27
+ }
28
+ })
29
+ .catch((error) => {
30
+ reject(error);
31
+ });
32
+ }
33
+ else {
34
+ reject(new Error("Characteristics is undefined"));
35
+ }
36
+ }
37
+ else {
38
+ reject(new Error("Device is not connected"));
39
+ }
40
+ });
41
+ };