@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.
- package/README.md +42 -35
- package/package.json +5 -3
- package/src/battery.d.ts +6 -0
- package/src/battery.js +19 -0
- package/src/calibration.d.ts +6 -0
- package/src/calibration.js +15 -0
- package/src/characteristic.d.ts +9 -0
- package/src/characteristic.js +15 -0
- package/src/commands/climbro.d.ts +6 -0
- package/src/commands/climbro.js +5 -0
- package/src/commands/entralpi.d.ts +6 -0
- package/src/commands/entralpi.js +5 -0
- package/src/commands/index.d.ts +5 -0
- package/src/commands/index.js +5 -0
- package/src/commands/motherboard.d.ts +6 -0
- package/src/commands/motherboard.js +13 -0
- package/src/commands/progressor.d.ts +15 -0
- package/src/commands/progressor.js +27 -0
- package/src/commands/smartboard.d.ts +6 -0
- package/src/commands/smartboard.js +5 -0
- package/src/commands/types.d.ts +18 -0
- package/src/commands/types.js +1 -0
- package/src/connect.d.ts +7 -0
- package/src/connect.js +159 -0
- package/src/connect.ts +3 -58
- package/src/data.d.ts +9 -0
- package/src/data.js +157 -0
- package/src/data.ts +45 -0
- package/src/devices/climbro.d.ts +2 -0
- package/src/devices/climbro.js +4 -0
- package/src/devices/entralpi.d.ts +2 -0
- package/src/devices/entralpi.js +52 -0
- package/src/devices/index.d.ts +5 -0
- package/src/devices/index.js +5 -0
- package/src/devices/motherboard.d.ts +2 -0
- package/src/devices/motherboard.js +79 -0
- package/src/devices/progressor.d.ts +2 -0
- package/src/devices/progressor.js +34 -0
- package/src/devices/smartboard.d.ts +2 -0
- package/src/devices/smartboard.js +4 -0
- package/src/devices/types.d.ts +20 -0
- package/src/devices/types.js +1 -0
- package/src/disconnect.d.ts +6 -0
- package/src/disconnect.js +10 -0
- package/src/index.d.ts +10 -0
- package/src/index.js +12 -0
- package/src/info.d.ts +6 -0
- package/src/info.js +23 -0
- package/src/is-connected.d.ts +7 -0
- package/src/is-connected.js +10 -0
- package/src/notify.d.ts +4 -0
- package/src/notify.js +6 -0
- package/src/read.d.ts +6 -0
- package/src/read.js +45 -0
- package/src/stop.d.ts +6 -0
- package/src/stop.js +18 -0
- package/src/stream.d.ts +6 -0
- package/src/stream.js +35 -0
- package/src/struct/index.d.ts +9 -0
- package/src/struct/index.js +176 -0
- package/src/struct/index.ts +215 -0
- package/src/write.d.ts +8 -0
- 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
|
+
};
|