node-mavlink 1.2.0 → 1.3.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.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -1
- package/dist/lib/logger.d.ts +2 -1
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +119 -1
- package/dist/lib/mavesp.d.ts +3 -1
- package/dist/lib/mavesp.d.ts.map +1 -0
- package/dist/lib/mavesp.js +101 -1
- package/dist/lib/mavlink.d.ts +14 -12
- package/dist/lib/mavlink.d.ts.map +1 -0
- package/dist/lib/mavlink.js +704 -1
- package/dist/lib/serialization.d.ts +9 -49
- package/dist/lib/serialization.d.ts.map +1 -0
- package/dist/lib/serialization.js +184 -1
- package/dist/lib/utils.d.ts +5 -4
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +77 -1
- package/examples/send-receive-file.ts +6 -2
- package/package.json +11 -9
- package/sanity-check.cjs +9 -0
- package/sanity-check.mjs +11 -0
- package/.vscode/launch.json +0 -19
- package/.vscode/settings.json +0 -3
- package/index.ts +0 -5
- package/jest.config.js +0 -5
- package/lib/logger.ts +0 -128
- package/lib/mavesp.ts +0 -112
- package/lib/mavlink.ts +0 -806
- package/lib/serialization.test.ts +0 -256
- package/lib/serialization.ts +0 -176
- package/lib/utils.ts +0 -75
- package/tests/data.mavlink +0 -0
- package/tests/main.ts +0 -59
- package/tsconfig.json +0 -16
@@ -1,58 +1,18 @@
|
|
1
1
|
/// <reference types="node" />
|
2
|
-
|
2
|
+
declare type Serializer = ((value: any, buffer: Buffer, offset: number) => void) | ((value: any, buffer: Buffer, offset: number, maxLen: number) => void);
|
3
3
|
/**
|
4
4
|
* A dictionary containing functions that serialize a certain value based on the field type
|
5
5
|
*/
|
6
6
|
export declare const SERIALIZERS: {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
uint16_t: (value: uint16_t, buffer: Buffer, offset: number) => number;
|
13
|
-
int32_t: (value: int32_t, buffer: Buffer, offset: number) => number;
|
14
|
-
uint32_t: (value: uint32_t, buffer: Buffer, offset: number) => number;
|
15
|
-
int64_t: (value: int64_t, buffer: Buffer, offset: number) => number;
|
16
|
-
uint64_t: (value: uint64_t, buffer: Buffer, offset: number) => number;
|
17
|
-
float: (value: float, buffer: Buffer, offset: number) => number;
|
18
|
-
double: (value: double, buffer: Buffer, offset: number) => number;
|
19
|
-
'char[]': (value: string, buffer: Buffer, offset: number, maxLen: number) => void;
|
20
|
-
'int8_t[]': (value: uint8_t[], buffer: Buffer, offset: number, maxLen: number) => void;
|
21
|
-
'uint8_t[]': (value: uint8_t[], buffer: Buffer, offset: number, maxLen: number) => void;
|
22
|
-
'int16_t[]': (value: uint16_t[], buffer: Buffer, offset: number, maxLen: number) => void;
|
23
|
-
'uint16_t[]': (value: uint16_t[], buffer: Buffer, offset: number, maxLen: number) => void;
|
24
|
-
'int32_t[]': (value: uint32_t[], buffer: Buffer, offset: number, maxLen: number) => void;
|
25
|
-
'uint32_t[]': (value: uint32_t[], buffer: Buffer, offset: number, maxLen: number) => void;
|
26
|
-
'int64_t[]': (value: uint64_t[], buffer: Buffer, offset: number, maxLen: number) => void;
|
27
|
-
'uint64_t[]': (value: uint64_t[], buffer: Buffer, offset: number, maxLen: number) => void;
|
28
|
-
'float[]': (value: float[], buffer: Buffer, offset: number, maxLen: number) => void;
|
29
|
-
'double[]': (value: double[], buffer: Buffer, offset: number, maxLen: number) => void;
|
7
|
+
[x: string]: Serializer;
|
8
|
+
};
|
9
|
+
declare type Deserializer = ((buffer: Buffer, offset: number) => any) | ((buffer: Buffer, offset: number, length: number) => any);
|
10
|
+
declare type Deserializers = {
|
11
|
+
[key: string]: Deserializer;
|
30
12
|
};
|
31
13
|
/**
|
32
14
|
* A dictionary containing functions that deserialize a certain value based on the field type
|
33
15
|
*/
|
34
|
-
export declare const DESERIALIZERS:
|
35
|
-
|
36
|
-
|
37
|
-
int8_t: (buffer: Buffer, offset: number) => number;
|
38
|
-
uint8_t: (buffer: Buffer, offset: number) => number;
|
39
|
-
int16_t: (buffer: Buffer, offset: number) => number;
|
40
|
-
uint16_t: (buffer: Buffer, offset: number) => number;
|
41
|
-
int32_t: (buffer: Buffer, offset: number) => number;
|
42
|
-
uint32_t: (buffer: Buffer, offset: number) => number;
|
43
|
-
int64_t: (buffer: Buffer, offset: number) => bigint;
|
44
|
-
uint64_t: (buffer: Buffer, offset: number) => bigint;
|
45
|
-
float: (buffer: Buffer, offset: number) => number;
|
46
|
-
double: (buffer: Buffer, offset: number) => number;
|
47
|
-
'char[]': (buffer: Buffer, offset: number, length: number) => string;
|
48
|
-
'int8_t[]': (buffer: Buffer, offset: number, length: number) => number[];
|
49
|
-
'uint8_t[]': (buffer: Buffer, offset: number, length: number) => number[];
|
50
|
-
'int16_t[]': (buffer: Buffer, offset: number, length: number) => number[];
|
51
|
-
'uint16_t[]': (buffer: Buffer, offset: number, length: number) => number[];
|
52
|
-
'int32_t[]': (buffer: Buffer, offset: number, length: number) => number[];
|
53
|
-
'uint32_t[]': (buffer: Buffer, offset: number, length: number) => number[];
|
54
|
-
'int64_t[]': (buffer: Buffer, offset: number, length: number) => BigInt[];
|
55
|
-
'uint64_t[]': (buffer: Buffer, offset: number, length: number) => BigInt[];
|
56
|
-
'float[]': (buffer: Buffer, offset: number, length: number) => number[];
|
57
|
-
'double[]': (buffer: Buffer, offset: number, length: number) => number[];
|
58
|
-
};
|
16
|
+
export declare const DESERIALIZERS: Deserializers;
|
17
|
+
export {};
|
18
|
+
//# sourceMappingURL=serialization.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../lib/serialization.ts"],"names":[],"mappings":";AAaA,aAAK,UAAU,GACd,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GACtD,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,CAAA;AAiFvE;;GAEG;AACH,eAAO,MAAM,WAAW;;CAIvB,CAAA;AAED,aAAK,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,GAAG,CAAC,CAAA;AACzH,aAAK,aAAa,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAA;AAqFpD;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,aAI3B,CAAA"}
|
@@ -1 +1,184 @@
|
|
1
|
-
"use strict";
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.DESERIALIZERS = exports.SERIALIZERS = void 0;
|
4
|
+
const SPECIAL_TYPES_SERIALIZERS = {
|
5
|
+
'uint8_t_mavlink_version': (value, buffer, offset) => buffer.writeUInt8(value, offset),
|
6
|
+
};
|
7
|
+
const SINGULAR_TYPES_SERIALIZERS = {
|
8
|
+
'char': (value, buffer, offset) => buffer.writeUInt8(value, offset),
|
9
|
+
'int8_t': (value, buffer, offset) => buffer.writeInt8(value, offset),
|
10
|
+
'uint8_t': (value, buffer, offset) => buffer.writeUInt8(value, offset),
|
11
|
+
'int16_t': (value, buffer, offset) => buffer.writeInt16LE(value, offset),
|
12
|
+
'uint16_t': (value, buffer, offset) => buffer.writeUInt16LE(value, offset),
|
13
|
+
'int32_t': (value, buffer, offset) => buffer.writeInt32LE(value, offset),
|
14
|
+
'uint32_t': (value, buffer, offset) => buffer.writeUInt32LE(value, offset),
|
15
|
+
'int64_t': (value, buffer, offset) => buffer.writeBigInt64LE(value, offset),
|
16
|
+
'uint64_t': (value, buffer, offset) => buffer.writeBigUInt64LE(value, offset),
|
17
|
+
'float': (value, buffer, offset) => buffer.writeFloatLE(value, offset),
|
18
|
+
'double': (value, buffer, offset) => buffer.writeDoubleLE(value, offset),
|
19
|
+
};
|
20
|
+
const ARRAY_TYPES_SERIALIZERS = {
|
21
|
+
'char[]': (value, buffer, offset, maxLen) => {
|
22
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
23
|
+
const code = value.charCodeAt(i);
|
24
|
+
buffer.writeUInt8(code, offset + i);
|
25
|
+
}
|
26
|
+
},
|
27
|
+
'int8_t[]': (value, buffer, offset, maxLen) => {
|
28
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
29
|
+
buffer.writeInt8(value[i], offset + i);
|
30
|
+
}
|
31
|
+
},
|
32
|
+
'uint8_t[]': (value, buffer, offset, maxLen) => {
|
33
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
34
|
+
buffer.writeUInt8(value[i], offset + i);
|
35
|
+
}
|
36
|
+
},
|
37
|
+
'int16_t[]': (value, buffer, offset, maxLen) => {
|
38
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
39
|
+
buffer.writeInt16LE(value[i], offset + i * 2);
|
40
|
+
}
|
41
|
+
},
|
42
|
+
'uint16_t[]': (value, buffer, offset, maxLen) => {
|
43
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
44
|
+
buffer.writeUInt16LE(value[i], offset + i * 2);
|
45
|
+
}
|
46
|
+
},
|
47
|
+
'int32_t[]': (value, buffer, offset, maxLen) => {
|
48
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
49
|
+
buffer.writeInt32LE(value[i], offset + i * 4);
|
50
|
+
}
|
51
|
+
},
|
52
|
+
'uint32_t[]': (value, buffer, offset, maxLen) => {
|
53
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
54
|
+
buffer.writeUInt32LE(value[i], offset + i * 4);
|
55
|
+
}
|
56
|
+
},
|
57
|
+
'int64_t[]': (value, buffer, offset, maxLen) => {
|
58
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
59
|
+
buffer.writeBigInt64LE(value[i], offset + i * 8);
|
60
|
+
}
|
61
|
+
},
|
62
|
+
'uint64_t[]': (value, buffer, offset, maxLen) => {
|
63
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
64
|
+
buffer.writeBigUInt64LE(value[i], offset + i * 8);
|
65
|
+
}
|
66
|
+
},
|
67
|
+
'float[]': (value, buffer, offset, maxLen) => {
|
68
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
69
|
+
buffer.writeFloatLE(value[i], offset + i * 4);
|
70
|
+
}
|
71
|
+
},
|
72
|
+
'double[]': (value, buffer, offset, maxLen) => {
|
73
|
+
for (let i = 0; i < value.length && i < maxLen; i++) {
|
74
|
+
buffer.writeDoubleLE(value[i], offset + i * 8);
|
75
|
+
}
|
76
|
+
},
|
77
|
+
};
|
78
|
+
/**
|
79
|
+
* A dictionary containing functions that serialize a certain value based on the field type
|
80
|
+
*/
|
81
|
+
exports.SERIALIZERS = {
|
82
|
+
...SPECIAL_TYPES_SERIALIZERS,
|
83
|
+
...SINGULAR_TYPES_SERIALIZERS,
|
84
|
+
...ARRAY_TYPES_SERIALIZERS,
|
85
|
+
};
|
86
|
+
const SPECIAL_DESERIALIZERS = {
|
87
|
+
'uint8_t_mavlink_version': (buffer, offset) => buffer.readUInt8(offset),
|
88
|
+
};
|
89
|
+
const SINGULAR_TYPES_DESERIALIZERS = {
|
90
|
+
'char': (buffer, offset) => String.fromCharCode(buffer.readUInt8(offset)),
|
91
|
+
'int8_t': (buffer, offset) => buffer.readInt8(offset),
|
92
|
+
'uint8_t': (buffer, offset) => buffer.readUInt8(offset),
|
93
|
+
'int16_t': (buffer, offset) => buffer.readInt16LE(offset),
|
94
|
+
'uint16_t': (buffer, offset) => buffer.readUInt16LE(offset),
|
95
|
+
'int32_t': (buffer, offset) => buffer.readInt32LE(offset),
|
96
|
+
'uint32_t': (buffer, offset) => buffer.readUInt32LE(offset),
|
97
|
+
'int64_t': (buffer, offset) => buffer.readBigInt64LE(offset),
|
98
|
+
'uint64_t': (buffer, offset) => buffer.readBigUInt64LE(offset),
|
99
|
+
'float': (buffer, offset) => buffer.readFloatLE(offset),
|
100
|
+
'double': (buffer, offset) => buffer.readDoubleLE(offset),
|
101
|
+
};
|
102
|
+
const ARRAY_TYPES_DESERIALIZERS = {
|
103
|
+
'char[]': (buffer, offset, length) => {
|
104
|
+
let result = '';
|
105
|
+
for (let i = 0; i < length; i++) {
|
106
|
+
const charCode = buffer.readUInt8(offset + i);
|
107
|
+
if (charCode !== 0) {
|
108
|
+
result += String.fromCharCode(charCode);
|
109
|
+
}
|
110
|
+
else {
|
111
|
+
break;
|
112
|
+
}
|
113
|
+
}
|
114
|
+
return result;
|
115
|
+
},
|
116
|
+
'int8_t[]': (buffer, offset, length) => {
|
117
|
+
const result = new Array(length);
|
118
|
+
for (let i = 0; i < length; i++)
|
119
|
+
result[i] = buffer.readInt8(offset + i);
|
120
|
+
return result;
|
121
|
+
},
|
122
|
+
'uint8_t[]': (buffer, offset, length) => {
|
123
|
+
const result = new Array(length);
|
124
|
+
for (let i = 0; i < length; i++)
|
125
|
+
result[i] = buffer.readUInt8(offset + i);
|
126
|
+
return result;
|
127
|
+
},
|
128
|
+
'int16_t[]': (buffer, offset, length) => {
|
129
|
+
const result = new Array(length);
|
130
|
+
for (let i = 0; i < length; i++)
|
131
|
+
result[i] = buffer.readInt16LE(offset + i * 2);
|
132
|
+
return result;
|
133
|
+
},
|
134
|
+
'uint16_t[]': (buffer, offset, length) => {
|
135
|
+
const result = new Array(length);
|
136
|
+
for (let i = 0; i < length; i++)
|
137
|
+
result[i] = buffer.readUInt16LE(offset + i * 2);
|
138
|
+
return result;
|
139
|
+
},
|
140
|
+
'int32_t[]': (buffer, offset, length) => {
|
141
|
+
const result = new Array(length);
|
142
|
+
for (let i = 0; i < length; i++)
|
143
|
+
result[i] = buffer.readInt32LE(offset + i * 4);
|
144
|
+
return result;
|
145
|
+
},
|
146
|
+
'uint32_t[]': (buffer, offset, length) => {
|
147
|
+
const result = new Array(length);
|
148
|
+
for (let i = 0; i < length; i++)
|
149
|
+
result[i] = buffer.readUInt32LE(offset + i * 4);
|
150
|
+
return result;
|
151
|
+
},
|
152
|
+
'int64_t[]': (buffer, offset, length) => {
|
153
|
+
const result = new Array(length);
|
154
|
+
for (let i = 0; i < length; i++)
|
155
|
+
result[i] = buffer.readBigInt64LE(offset + i * 8);
|
156
|
+
return result;
|
157
|
+
},
|
158
|
+
'uint64_t[]': (buffer, offset, length) => {
|
159
|
+
const result = new Array(length);
|
160
|
+
for (let i = 0; i < length; i++)
|
161
|
+
result[i] = buffer.readBigUInt64LE(offset + i * 8);
|
162
|
+
return result;
|
163
|
+
},
|
164
|
+
'float[]': (buffer, offset, length) => {
|
165
|
+
const result = new Array(length);
|
166
|
+
for (let i = 0; i < length; i++)
|
167
|
+
result[i] = buffer.readFloatLE(offset + i * 4);
|
168
|
+
return result;
|
169
|
+
},
|
170
|
+
'double[]': (buffer, offset, length) => {
|
171
|
+
const result = new Array(length);
|
172
|
+
for (let i = 0; i < length; i++)
|
173
|
+
result[i] = buffer.readDoubleLE(offset + i * 8);
|
174
|
+
return result;
|
175
|
+
},
|
176
|
+
};
|
177
|
+
/**
|
178
|
+
* A dictionary containing functions that deserialize a certain value based on the field type
|
179
|
+
*/
|
180
|
+
exports.DESERIALIZERS = {
|
181
|
+
...SPECIAL_DESERIALIZERS,
|
182
|
+
...SINGULAR_TYPES_DESERIALIZERS,
|
183
|
+
...ARRAY_TYPES_DESERIALIZERS,
|
184
|
+
};
|
package/dist/lib/utils.d.ts
CHANGED
@@ -18,9 +18,9 @@ export declare function dump(buffer: Buffer, lineWidth?: number): void;
|
|
18
18
|
/**
|
19
19
|
* Sleep for a given number of miliseconds
|
20
20
|
*
|
21
|
-
* @param ms
|
21
|
+
* @param {number} ms of miliseconds to sleep
|
22
22
|
*/
|
23
|
-
export declare function sleep(ms:
|
23
|
+
export declare function sleep(ms: number): Promise<unknown>;
|
24
24
|
/**
|
25
25
|
* Execute a callback every <code>interval</code>ms and if it will not return
|
26
26
|
* a truthy value in the <code>timeout<code>ms then throw a Timeout exception.
|
@@ -28,8 +28,9 @@ export declare function sleep(ms: any): Promise<unknown>;
|
|
28
28
|
* a particular expression should be evaluated and how long will it take to end
|
29
29
|
* the execution without success. Great for time-sensitive operations.
|
30
30
|
*
|
31
|
-
* @param cb callback to call every <code>interval</code>ms
|
31
|
+
* @param cb callback to call every <code>interval</code>ms. Waiting stops if the callback returns a truthy value.
|
32
32
|
* @param timeout number of miliseconds that need to pass before the Timeout exception is thrown
|
33
33
|
* @param interval number of miliseconds before re-running the callback
|
34
34
|
*/
|
35
|
-
export declare function waitFor(cb:
|
35
|
+
export declare function waitFor<T>(cb: () => T, timeout?: number, interval?: number): Promise<T>;
|
36
|
+
//# sourceMappingURL=utils.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAU,EAAE,MAAM,SAAO,UAE5D;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAK,QAclD;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,oBAE/B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,SAAQ,EAAE,QAAQ,SAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAoBzF"}
|
package/dist/lib/utils.js
CHANGED
@@ -1 +1,77 @@
|
|
1
|
-
"use strict";
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.waitFor = exports.sleep = exports.dump = exports.hex = void 0;
|
4
|
+
/**
|
5
|
+
* Convert a number to hexadecimal representation with a minumum
|
6
|
+
* number of characters and optional prefix (0x by default)
|
7
|
+
*
|
8
|
+
* @param n value to convert
|
9
|
+
* @param len length of the converted string (without prefix)
|
10
|
+
* @param prefix prefix to prepend the generated string with
|
11
|
+
*/
|
12
|
+
function hex(n, len = 2, prefix = '0x') {
|
13
|
+
return `${prefix}${n.toString(16).padStart(len, '0')}`;
|
14
|
+
}
|
15
|
+
exports.hex = hex;
|
16
|
+
/**
|
17
|
+
* Dump a buffer in a readable form
|
18
|
+
*
|
19
|
+
* @param buffer buffer to dump
|
20
|
+
* @param lineWidth width of the line, in bytes of buffer
|
21
|
+
*/
|
22
|
+
function dump(buffer, lineWidth = 16) {
|
23
|
+
const line = [];
|
24
|
+
let address = 0;
|
25
|
+
for (let i = 0; i < buffer.length; i++) {
|
26
|
+
line.push(hex(buffer[i], 2, '0x'));
|
27
|
+
if (line.length === lineWidth) {
|
28
|
+
console.log(hex(address, 4), '|', line.join(' '));
|
29
|
+
address += lineWidth;
|
30
|
+
line.length = 0;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
if (line.length > 0) {
|
34
|
+
console.log(hex(address, 4), '|', line.join(' '));
|
35
|
+
}
|
36
|
+
}
|
37
|
+
exports.dump = dump;
|
38
|
+
/**
|
39
|
+
* Sleep for a given number of miliseconds
|
40
|
+
*
|
41
|
+
* @param {number} ms of miliseconds to sleep
|
42
|
+
*/
|
43
|
+
function sleep(ms) {
|
44
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
45
|
+
}
|
46
|
+
exports.sleep = sleep;
|
47
|
+
/**
|
48
|
+
* Execute a callback every <code>interval</code>ms and if it will not return
|
49
|
+
* a truthy value in the <code>timeout<code>ms then throw a Timeout exception.
|
50
|
+
* This is a very useful utility that will allow you to specify how often
|
51
|
+
* a particular expression should be evaluated and how long will it take to end
|
52
|
+
* the execution without success. Great for time-sensitive operations.
|
53
|
+
*
|
54
|
+
* @param cb callback to call every <code>interval</code>ms. Waiting stops if the callback returns a truthy value.
|
55
|
+
* @param timeout number of miliseconds that need to pass before the Timeout exception is thrown
|
56
|
+
* @param interval number of miliseconds before re-running the callback
|
57
|
+
*/
|
58
|
+
async function waitFor(cb, timeout = 10000, interval = 100) {
|
59
|
+
return new Promise((resolve, reject) => {
|
60
|
+
const timeoutTimer = setTimeout(() => {
|
61
|
+
cleanup();
|
62
|
+
reject('Timeout');
|
63
|
+
}, timeout);
|
64
|
+
const intervalTimer = setInterval(() => {
|
65
|
+
const result = cb();
|
66
|
+
if (result) {
|
67
|
+
cleanup();
|
68
|
+
resolve(result);
|
69
|
+
}
|
70
|
+
});
|
71
|
+
const cleanup = () => {
|
72
|
+
clearTimeout(timeoutTimer);
|
73
|
+
clearTimeout(intervalTimer);
|
74
|
+
};
|
75
|
+
});
|
76
|
+
}
|
77
|
+
exports.waitFor = waitFor;
|
@@ -9,7 +9,7 @@ import {
|
|
9
9
|
|
10
10
|
const splitter = new MavLinkPacketSplitter()
|
11
11
|
const parser = new MavLinkPacketParser()
|
12
|
-
const file = createReadStream('
|
12
|
+
const file = createReadStream(__dirname + '/GH-5.bin')
|
13
13
|
const reader = file.pipe(splitter).pipe(parser)
|
14
14
|
|
15
15
|
// create a registry of mappings between a message id and a data class
|
@@ -28,7 +28,11 @@ reader.on('data', packet => {
|
|
28
28
|
const clazz = REGISTRY[packet.header.msgid]
|
29
29
|
if (clazz) {
|
30
30
|
const data = packet.protocol.data(packet.payload, clazz)
|
31
|
-
|
31
|
+
if (packet.header.timestamp) {
|
32
|
+
console.log(new Date(Number(packet.header.timestamp)).toISOString(), data)
|
33
|
+
} else {
|
34
|
+
console.log(data)
|
35
|
+
}
|
32
36
|
}
|
33
37
|
})
|
34
38
|
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "node-mavlink",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.3.1",
|
4
4
|
"author": "Matthias Hryniszak <padcom@gmail.com>",
|
5
5
|
"license": "LGPL",
|
6
6
|
"description": "MavLink definitions and parsing library",
|
@@ -22,15 +22,17 @@
|
|
22
22
|
"main": "dist/index.js",
|
23
23
|
"types": "dist/index.d.ts",
|
24
24
|
"dependencies": {
|
25
|
-
"mavlink-mappings": "^1.0.
|
25
|
+
"mavlink-mappings": "^1.0.12-20220825"
|
26
26
|
},
|
27
27
|
"scripts": {
|
28
|
-
"
|
29
|
-
"
|
30
|
-
"test
|
28
|
+
"clean": "rm -rf dist lib/*.js",
|
29
|
+
"build": "tsc",
|
30
|
+
"test": "jest",
|
31
|
+
"test:batch": "tests/main.js e2e --input tests/data.mavlink",
|
31
32
|
"dev": "jest --watch",
|
32
|
-
"test:e2e": "
|
33
|
-
"
|
33
|
+
"test:e2e": "./main.js e2e --input data.mavlink",
|
34
|
+
"sanity-check": "./sanity-check.cjs && ./sanity-check.mjs",
|
35
|
+
"prepublishOnly": "npm run clean && npm install && npm test && npm run build && npm run sanity-check"
|
34
36
|
},
|
35
37
|
"devDependencies": {
|
36
38
|
"@types/jest": "^27.4.1",
|
@@ -41,8 +43,8 @@
|
|
41
43
|
"minimize-js": "^1.3.0",
|
42
44
|
"serialport": "^10.0.0",
|
43
45
|
"ts-jest": "^27.1.4",
|
44
|
-
"ts-node": "^
|
45
|
-
"typescript": "^4.4
|
46
|
+
"ts-node": "^10.6.0",
|
47
|
+
"typescript": "^4.7.4",
|
46
48
|
"wget-improved": "^3.2.1",
|
47
49
|
"xml2js": "^0.4.23",
|
48
50
|
"yargs": "^17.3.1"
|
package/sanity-check.cjs
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
const { join } = require('node:path')
|
4
|
+
const { createReadStream } = require('node:fs')
|
5
|
+
const { createMavLinkStream } = require('.')
|
6
|
+
|
7
|
+
const port = createReadStream(join(__dirname, 'examples/GH-5.bin'))
|
8
|
+
const parser = createMavLinkStream(port)
|
9
|
+
parser.on('data', packet => console.log(packet.debug()))
|
package/sanity-check.mjs
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
import { join } from 'node:path'
|
4
|
+
import { fileURLToPath } from 'node:url'
|
5
|
+
import { createReadStream } from 'node:fs'
|
6
|
+
import { createMavLinkStream } from './dist/index.js'
|
7
|
+
|
8
|
+
const __dirname = fileURLToPath(new URL('.', import.meta.url))
|
9
|
+
const port = createReadStream(join(__dirname, 'examples/GH-5.bin'))
|
10
|
+
const parser = createMavLinkStream(port)
|
11
|
+
parser.on('data', packet => console.log(packet.debug()))
|
package/.vscode/launch.json
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"version": "0.2.0",
|
3
|
-
"configurations": [
|
4
|
-
{
|
5
|
-
"type": "node",
|
6
|
-
"request": "launch",
|
7
|
-
"name": "Launch Program",
|
8
|
-
"runtimeArgs": [
|
9
|
-
"-r",
|
10
|
-
"ts-node/register"
|
11
|
-
],
|
12
|
-
"args": [
|
13
|
-
"${workspaceFolder}/tests/main.ts",
|
14
|
-
"e2e",
|
15
|
-
"--input=tests/data.mavlink"
|
16
|
-
]
|
17
|
-
}
|
18
|
-
],
|
19
|
-
}
|
package/.vscode/settings.json
DELETED
package/index.ts
DELETED
package/jest.config.js
DELETED
package/lib/logger.ts
DELETED
@@ -1,128 +0,0 @@
|
|
1
|
-
import EventEmitter = require('events')
|
2
|
-
|
3
|
-
/**
|
4
|
-
* Level of the log entry
|
5
|
-
*/
|
6
|
-
export enum LogLevel {
|
7
|
-
trace = 5,
|
8
|
-
debug = 4,
|
9
|
-
info = 3,
|
10
|
-
warn = 2,
|
11
|
-
error = 1,
|
12
|
-
fatal = 0,
|
13
|
-
}
|
14
|
-
|
15
|
-
type LoggerRegistry = { [x: string]: Logger }
|
16
|
-
type LoggerEvents = 'log'
|
17
|
-
type LoggerEventHandler = (context: string, level: LogLevel, message: any[]) => void
|
18
|
-
|
19
|
-
/**
|
20
|
-
* Simplified interface for logging facilities
|
21
|
-
*/
|
22
|
-
export class Logger {
|
23
|
-
private static readonly events: EventEmitter = new EventEmitter()
|
24
|
-
private static registry: LoggerRegistry = {}
|
25
|
-
|
26
|
-
/**
|
27
|
-
* Gets a logger by name
|
28
|
-
*
|
29
|
-
* @param context logger context
|
30
|
-
*/
|
31
|
-
static getLogger(context) {
|
32
|
-
let name = ''
|
33
|
-
if (typeof context === 'function') name = context.name
|
34
|
-
else if (typeof context === 'object') name = (<any>context).constructor.name
|
35
|
-
else if (typeof context === 'string') name = context
|
36
|
-
else throw new Error(`Do not know how to get logger for ${context} (${typeof context})`)
|
37
|
-
|
38
|
-
if (!Logger.registry[name]) Logger.registry[name] = new Logger(name)
|
39
|
-
|
40
|
-
return Logger.registry[name]
|
41
|
-
}
|
42
|
-
|
43
|
-
/**
|
44
|
-
* Binds an event handler
|
45
|
-
*
|
46
|
-
* @param event event to react to
|
47
|
-
* @param handler event handler
|
48
|
-
*/
|
49
|
-
static on(event: LoggerEvents, handler: (context, level, message) => void) {
|
50
|
-
this.events.on(event, handler)
|
51
|
-
}
|
52
|
-
|
53
|
-
/**
|
54
|
-
* Removes an event handler
|
55
|
-
*
|
56
|
-
* @param event event to react to
|
57
|
-
* @param handler event handler
|
58
|
-
*/
|
59
|
-
static off(event: LoggerEvents, handler: LoggerEventHandler) {
|
60
|
-
this.events.off(event, handler)
|
61
|
-
}
|
62
|
-
|
63
|
-
private context: string
|
64
|
-
|
65
|
-
/**
|
66
|
-
* Constructs a new logger instance
|
67
|
-
*
|
68
|
-
* @param context logger context
|
69
|
-
*/
|
70
|
-
constructor(context: string) {
|
71
|
-
this.context = context
|
72
|
-
Logger.events.emit('logger-created', Logger.registry[context])
|
73
|
-
}
|
74
|
-
|
75
|
-
/**
|
76
|
-
* Sends a log message if the trace level is enabled for this logger
|
77
|
-
*
|
78
|
-
* @param args parameters for the log entry
|
79
|
-
*/
|
80
|
-
trace(...args: any) {
|
81
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.trace, message: args })
|
82
|
-
}
|
83
|
-
|
84
|
-
/**
|
85
|
-
* Sends a log message if the debug level is enabled for this logger
|
86
|
-
*
|
87
|
-
* @param args parameters for the log entry
|
88
|
-
*/
|
89
|
-
debug(...args: any) {
|
90
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.debug, message: args })
|
91
|
-
}
|
92
|
-
|
93
|
-
/**
|
94
|
-
* Sends a log message if the info level is enabled for this logger
|
95
|
-
*
|
96
|
-
* @param args parameters for the log entry
|
97
|
-
*/
|
98
|
-
info(...args: any) {
|
99
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.info, message: args })
|
100
|
-
}
|
101
|
-
|
102
|
-
/**
|
103
|
-
* Sends a log message if the warn level is enabled for this logger
|
104
|
-
*
|
105
|
-
* @param args parameters for the log entry
|
106
|
-
*/
|
107
|
-
warn(...args: any) {
|
108
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.warn, message: args })
|
109
|
-
}
|
110
|
-
|
111
|
-
/**
|
112
|
-
* Sends a log message if the error level is enabled for this logger
|
113
|
-
*
|
114
|
-
* @param args parameters for the log entry
|
115
|
-
*/
|
116
|
-
error(...args: any) {
|
117
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.error, message: args })
|
118
|
-
}
|
119
|
-
|
120
|
-
/**
|
121
|
-
* Sends a log message if the fatal level is enabled for this logger
|
122
|
-
*
|
123
|
-
* @param args parameters for the log entry
|
124
|
-
*/
|
125
|
-
fatal(...args: any) {
|
126
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.fatal, message: args })
|
127
|
-
}
|
128
|
-
}
|