node-mavlink 1.1.0 → 1.2.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/.vscode/launch.json +11 -10
- package/dist/index.js +1 -21
- package/dist/lib/logger.js +1 -118
- package/dist/lib/mavesp.js +1 -99
- package/dist/lib/mavlink.d.ts +9 -4
- package/dist/lib/mavlink.js +1 -676
- package/dist/lib/serialization.js +1 -172
- package/dist/lib/utils.js +1 -77
- package/examples/parse-tlog-file.ts +43 -0
- package/examples/send-receive-file.ts +6 -2
- package/examples/vtol.tlog +0 -0
- package/lib/mavlink.ts +22 -12
- package/package.json +6 -4
- package/tests/main.ts +4 -8
- package/coverage/coverage-final.json +0 -1
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -101
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/serialization.ts.html +0 -613
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -0
package/.vscode/launch.json
CHANGED
@@ -2,17 +2,18 @@
|
|
2
2
|
"version": "0.2.0",
|
3
3
|
"configurations": [
|
4
4
|
{
|
5
|
-
"name": "Example",
|
6
5
|
"type": "node",
|
7
6
|
"request": "launch",
|
8
|
-
"
|
9
|
-
"runtimeArgs": [
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
"
|
14
|
-
|
15
|
-
|
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
|
+
]
|
16
17
|
}
|
17
|
-
]
|
18
|
+
],
|
18
19
|
}
|
package/dist/index.js
CHANGED
@@ -1,21 +1 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
-
if (k2 === undefined) k2 = k;
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
-
}
|
8
|
-
Object.defineProperty(o, k2, desc);
|
9
|
-
}) : (function(o, m, k, k2) {
|
10
|
-
if (k2 === undefined) k2 = k;
|
11
|
-
o[k2] = m[k];
|
12
|
-
}));
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
-
};
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
-
__exportStar(require("mavlink-mappings"), exports);
|
18
|
-
__exportStar(require("./lib/utils"), exports);
|
19
|
-
__exportStar(require("./lib/logger"), exports);
|
20
|
-
__exportStar(require("./lib/mavlink"), exports);
|
21
|
-
__exportStar(require("./lib/mavesp"), exports);
|
1
|
+
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(i,r,e,t){t===void 0&&(t=e);var n=Object.getOwnPropertyDescriptor(r,e);(!n||("get"in n?!r.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return r[e]}}),Object.defineProperty(i,t,n)}:function(i,r,e,t){t===void 0&&(t=e),i[t]=r[e]}),__exportStar=this&&this.__exportStar||function(i,r){for(var e in i)e!=="default"&&!Object.prototype.hasOwnProperty.call(r,e)&&__createBinding(r,i,e)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("mavlink-mappings"),exports),__exportStar(require("./lib/utils"),exports),__exportStar(require("./lib/logger"),exports),__exportStar(require("./lib/mavlink"),exports),__exportStar(require("./lib/mavesp"),exports);
|
package/dist/lib/logger.js
CHANGED
@@ -1,118 +1 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.Logger = exports.LogLevel = void 0;
|
4
|
-
const EventEmitter = require("events");
|
5
|
-
/**
|
6
|
-
* Level of the log entry
|
7
|
-
*/
|
8
|
-
var LogLevel;
|
9
|
-
(function (LogLevel) {
|
10
|
-
LogLevel[LogLevel["trace"] = 5] = "trace";
|
11
|
-
LogLevel[LogLevel["debug"] = 4] = "debug";
|
12
|
-
LogLevel[LogLevel["info"] = 3] = "info";
|
13
|
-
LogLevel[LogLevel["warn"] = 2] = "warn";
|
14
|
-
LogLevel[LogLevel["error"] = 1] = "error";
|
15
|
-
LogLevel[LogLevel["fatal"] = 0] = "fatal";
|
16
|
-
})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));
|
17
|
-
/**
|
18
|
-
* Simplified interface for logging facilities
|
19
|
-
*/
|
20
|
-
class Logger {
|
21
|
-
/**
|
22
|
-
* Constructs a new logger instance
|
23
|
-
*
|
24
|
-
* @param context logger context
|
25
|
-
*/
|
26
|
-
constructor(context) {
|
27
|
-
this.context = context;
|
28
|
-
Logger.events.emit('logger-created', Logger.registry[context]);
|
29
|
-
}
|
30
|
-
/**
|
31
|
-
* Gets a logger by name
|
32
|
-
*
|
33
|
-
* @param context logger context
|
34
|
-
*/
|
35
|
-
static getLogger(context) {
|
36
|
-
let name = '';
|
37
|
-
if (typeof context === 'function')
|
38
|
-
name = context.name;
|
39
|
-
else if (typeof context === 'object')
|
40
|
-
name = context.constructor.name;
|
41
|
-
else if (typeof context === 'string')
|
42
|
-
name = context;
|
43
|
-
else
|
44
|
-
throw new Error(`Do not know how to get logger for ${context} (${typeof context})`);
|
45
|
-
if (!Logger.registry[name])
|
46
|
-
Logger.registry[name] = new Logger(name);
|
47
|
-
return Logger.registry[name];
|
48
|
-
}
|
49
|
-
/**
|
50
|
-
* Binds an event handler
|
51
|
-
*
|
52
|
-
* @param event event to react to
|
53
|
-
* @param handler event handler
|
54
|
-
*/
|
55
|
-
static on(event, handler) {
|
56
|
-
this.events.on(event, handler);
|
57
|
-
}
|
58
|
-
/**
|
59
|
-
* Removes an event handler
|
60
|
-
*
|
61
|
-
* @param event event to react to
|
62
|
-
* @param handler event handler
|
63
|
-
*/
|
64
|
-
static off(event, handler) {
|
65
|
-
this.events.off(event, handler);
|
66
|
-
}
|
67
|
-
/**
|
68
|
-
* Sends a log message if the trace level is enabled for this logger
|
69
|
-
*
|
70
|
-
* @param args parameters for the log entry
|
71
|
-
*/
|
72
|
-
trace(...args) {
|
73
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.trace, message: args });
|
74
|
-
}
|
75
|
-
/**
|
76
|
-
* Sends a log message if the debug level is enabled for this logger
|
77
|
-
*
|
78
|
-
* @param args parameters for the log entry
|
79
|
-
*/
|
80
|
-
debug(...args) {
|
81
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.debug, message: args });
|
82
|
-
}
|
83
|
-
/**
|
84
|
-
* Sends a log message if the info level is enabled for this logger
|
85
|
-
*
|
86
|
-
* @param args parameters for the log entry
|
87
|
-
*/
|
88
|
-
info(...args) {
|
89
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.info, message: args });
|
90
|
-
}
|
91
|
-
/**
|
92
|
-
* Sends a log message if the warn level is enabled for this logger
|
93
|
-
*
|
94
|
-
* @param args parameters for the log entry
|
95
|
-
*/
|
96
|
-
warn(...args) {
|
97
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.warn, message: args });
|
98
|
-
}
|
99
|
-
/**
|
100
|
-
* Sends a log message if the error level is enabled for this logger
|
101
|
-
*
|
102
|
-
* @param args parameters for the log entry
|
103
|
-
*/
|
104
|
-
error(...args) {
|
105
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.error, message: args });
|
106
|
-
}
|
107
|
-
/**
|
108
|
-
* Sends a log message if the fatal level is enabled for this logger
|
109
|
-
*
|
110
|
-
* @param args parameters for the log entry
|
111
|
-
*/
|
112
|
-
fatal(...args) {
|
113
|
-
Logger.events.emit('log', { context: this.context, level: LogLevel.fatal, message: args });
|
114
|
-
}
|
115
|
-
}
|
116
|
-
exports.Logger = Logger;
|
117
|
-
Logger.events = new EventEmitter();
|
118
|
-
Logger.registry = {};
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Logger=exports.LogLevel=void 0;const EventEmitter=require("events");var LogLevel;(function(t){t[t.trace=5]="trace",t[t.debug=4]="debug",t[t.info=3]="info",t[t.warn=2]="warn",t[t.error=1]="error",t[t.fatal=0]="fatal"})(LogLevel=exports.LogLevel||(exports.LogLevel={}));class Logger{constructor(e){this.context=e,Logger.events.emit("logger-created",Logger.registry[e])}static getLogger(e){let s="";if(typeof e=="function")s=e.name;else if(typeof e=="object")s=e.constructor.name;else if(typeof e=="string")s=e;else throw new Error(`Do not know how to get logger for ${e} (${typeof e})`);return Logger.registry[s]||(Logger.registry[s]=new Logger(s)),Logger.registry[s]}static on(e,s){this.events.on(e,s)}static off(e,s){this.events.off(e,s)}trace(...e){Logger.events.emit("log",{context:this.context,level:LogLevel.trace,message:e})}debug(...e){Logger.events.emit("log",{context:this.context,level:LogLevel.debug,message:e})}info(...e){Logger.events.emit("log",{context:this.context,level:LogLevel.info,message:e})}warn(...e){Logger.events.emit("log",{context:this.context,level:LogLevel.warn,message:e})}error(...e){Logger.events.emit("log",{context:this.context,level:LogLevel.error,message:e})}fatal(...e){Logger.events.emit("log",{context:this.context,level:LogLevel.fatal,message:e})}}exports.Logger=Logger,Logger.events=new EventEmitter,Logger.registry={};
|
package/dist/lib/mavesp.js
CHANGED
@@ -1,99 +1 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.MavEsp8266 = void 0;
|
4
|
-
const events_1 = require("events");
|
5
|
-
const dgram_1 = require("dgram");
|
6
|
-
const stream_1 = require("stream");
|
7
|
-
const mavlink_1 = require("./mavlink");
|
8
|
-
const mavlink_2 = require("./mavlink");
|
9
|
-
const utils_1 = require("./utils");
|
10
|
-
/**
|
11
|
-
* Encapsulation of communication with MavEsp8266
|
12
|
-
*/
|
13
|
-
class MavEsp8266 extends events_1.EventEmitter {
|
14
|
-
constructor() {
|
15
|
-
super();
|
16
|
-
this.ip = '';
|
17
|
-
this.sendPort = 14555;
|
18
|
-
this.seq = 0;
|
19
|
-
this.input = new stream_1.PassThrough();
|
20
|
-
this.processIncommingUDPData = this.processIncommingUDPData.bind(this);
|
21
|
-
this.processIncommingPacket = this.processIncommingPacket.bind(this);
|
22
|
-
// Create the reader as usual by piping the source stream through the splitter
|
23
|
-
// and packet parser
|
24
|
-
const reader = this.input
|
25
|
-
.pipe(new mavlink_1.MavLinkPacketSplitter())
|
26
|
-
.pipe(new mavlink_1.MavLinkPacketParser());
|
27
|
-
reader.on('data', this.processIncommingPacket);
|
28
|
-
}
|
29
|
-
/**
|
30
|
-
* Start communication with the controller via MAVESP2866
|
31
|
-
*
|
32
|
-
* @param receivePort port to receive messages on (default: 14550)
|
33
|
-
* @param sendPort port to send messages to (default: 14555)
|
34
|
-
*/
|
35
|
-
async start(receivePort = 14550, sendPort = 14555) {
|
36
|
-
this.sendPort = sendPort;
|
37
|
-
// Create a UDP socket
|
38
|
-
this.socket = (0, dgram_1.createSocket)({ type: 'udp4', reuseAddr: true });
|
39
|
-
this.socket.on('message', this.processIncommingUDPData);
|
40
|
-
// Start listening on the socket
|
41
|
-
return new Promise((resolve, reject) => {
|
42
|
-
this.socket.bind(receivePort, () => {
|
43
|
-
// Wait for the first package to be returned to read the ip address
|
44
|
-
// of the controller
|
45
|
-
(0, utils_1.waitFor)(() => this.ip !== '')
|
46
|
-
.then(() => { resolve(this.ip); })
|
47
|
-
.catch(e => { reject(e); });
|
48
|
-
});
|
49
|
-
});
|
50
|
-
}
|
51
|
-
/**
|
52
|
-
* Send a packet
|
53
|
-
*
|
54
|
-
* @param msg message to send
|
55
|
-
* @param sysid system id
|
56
|
-
* @param compid component id
|
57
|
-
*/
|
58
|
-
send(msg, sysid = mavlink_2.MavLinkProtocol.SYS_ID, compid = mavlink_2.MavLinkProtocol.COMP_ID) {
|
59
|
-
const protocol = new mavlink_2.MavLinkProtocolV2(sysid, compid);
|
60
|
-
const buffer = protocol.serialize(msg, this.seq++);
|
61
|
-
this.seq &= 255;
|
62
|
-
this.sendBuffer(buffer);
|
63
|
-
}
|
64
|
-
/**
|
65
|
-
* Send a signed packet
|
66
|
-
*
|
67
|
-
* @param msg message to send
|
68
|
-
* @param sysid system id
|
69
|
-
* @param compid component id
|
70
|
-
* @param linkId link id for the signature
|
71
|
-
*/
|
72
|
-
sendSigned(msg, key, linkId = 1, sysid = mavlink_2.MavLinkProtocol.SYS_ID, compid = mavlink_2.MavLinkProtocol.COMP_ID) {
|
73
|
-
const protocol = new mavlink_2.MavLinkProtocolV2(sysid, compid, mavlink_2.MavLinkProtocolV2.IFLAG_SIGNED);
|
74
|
-
const b1 = protocol.serialize(msg, this.seq++);
|
75
|
-
this.seq &= 255;
|
76
|
-
const b2 = protocol.sign(b1, linkId, key);
|
77
|
-
this.sendBuffer(b2);
|
78
|
-
}
|
79
|
-
/**
|
80
|
-
* Send raw data over the socket. Useful for custom implementation of data sending
|
81
|
-
*
|
82
|
-
* @param buffer buffer to send
|
83
|
-
*/
|
84
|
-
sendBuffer(buffer) {
|
85
|
-
this.socket.send(buffer, this.sendPort, this.ip);
|
86
|
-
}
|
87
|
-
processIncommingUDPData(buffer, metadata) {
|
88
|
-
// store the remote ip address
|
89
|
-
if (this.ip === '')
|
90
|
-
this.ip = metadata.address;
|
91
|
-
// pass on the data to the input stream
|
92
|
-
this.input.write(buffer);
|
93
|
-
}
|
94
|
-
processIncommingPacket(packet) {
|
95
|
-
// let the user know we received the packet
|
96
|
-
this.emit('data', packet);
|
97
|
-
}
|
98
|
-
}
|
99
|
-
exports.MavEsp8266 = MavEsp8266;
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MavEsp8266=void 0;const events_1=require("events"),dgram_1=require("dgram"),stream_1=require("stream"),mavlink_1=require("./mavlink"),mavlink_2=require("./mavlink"),utils_1=require("./utils");class MavEsp8266 extends events_1.EventEmitter{constructor(){super(),this.ip="",this.sendPort=14555,this.seq=0,this.input=new stream_1.PassThrough,this.processIncommingUDPData=this.processIncommingUDPData.bind(this),this.processIncommingPacket=this.processIncommingPacket.bind(this),this.input.pipe(new mavlink_1.MavLinkPacketSplitter).pipe(new mavlink_1.MavLinkPacketParser).on("data",this.processIncommingPacket)}async start(s=14550,t=14555){return this.sendPort=t,this.socket=(0,dgram_1.createSocket)({type:"udp4",reuseAddr:!0}),this.socket.on("message",this.processIncommingUDPData),new Promise((e,o)=>{this.socket.bind(s,()=>{(0,utils_1.waitFor)(()=>this.ip!=="").then(()=>{e(this.ip)}).catch(i=>{o(i)})})})}send(s,t=mavlink_2.MavLinkProtocol.SYS_ID,e=mavlink_2.MavLinkProtocol.COMP_ID){const i=new mavlink_2.MavLinkProtocolV2(t,e).serialize(s,this.seq++);this.seq&=255,this.sendBuffer(i)}sendSigned(s,t,e=1,o=mavlink_2.MavLinkProtocol.SYS_ID,i=mavlink_2.MavLinkProtocol.COMP_ID){const n=new mavlink_2.MavLinkProtocolV2(o,i,mavlink_2.MavLinkProtocolV2.IFLAG_SIGNED),r=n.serialize(s,this.seq++);this.seq&=255;const c=n.sign(r,e,t);this.sendBuffer(c)}sendBuffer(s){this.socket.send(s,this.sendPort,this.ip)}processIncommingUDPData(s,t){this.ip===""&&(this.ip=t.address),this.input.write(s)}processIncommingPacket(s){this.emit("data",s)}}exports.MavEsp8266=MavEsp8266;
|
package/dist/lib/mavlink.d.ts
CHANGED
@@ -7,6 +7,7 @@ import { Logger } from './logger';
|
|
7
7
|
* Header definition of the MavLink packet
|
8
8
|
*/
|
9
9
|
export declare class MavLinkPacketHeader {
|
10
|
+
timestamp: BigInt;
|
10
11
|
magic: number;
|
11
12
|
payloadLength: uint8_t;
|
12
13
|
incompatibilityFlags: uint8_t;
|
@@ -37,7 +38,7 @@ export declare abstract class MavLinkProtocol {
|
|
37
38
|
/**
|
38
39
|
* Deserialize packet header
|
39
40
|
*/
|
40
|
-
abstract header(buffer: any): MavLinkPacketHeader;
|
41
|
+
abstract header(buffer: any, timestamp?: any): MavLinkPacketHeader;
|
41
42
|
/**
|
42
43
|
* Deserialize packet checksum
|
43
44
|
*/
|
@@ -66,7 +67,7 @@ export declare class MavLinkProtocolV1 extends MavLinkProtocol {
|
|
66
67
|
static PAYLOAD_OFFSET: number;
|
67
68
|
constructor(sysid?: uint8_t, compid?: uint8_t);
|
68
69
|
serialize(message: MavLinkData, seq: number): Buffer;
|
69
|
-
header(buffer: Buffer): MavLinkPacketHeader;
|
70
|
+
header(buffer: Buffer, timestamp?: any): MavLinkPacketHeader;
|
70
71
|
/**
|
71
72
|
* Deserialize packet checksum
|
72
73
|
*/
|
@@ -100,7 +101,7 @@ export declare class MavLinkProtocolV2 extends MavLinkProtocol {
|
|
100
101
|
*/
|
101
102
|
sign(buffer: Buffer, linkId: number, key: Buffer, timestamp?: number): Buffer;
|
102
103
|
private calculateTruncatedPayloadLength;
|
103
|
-
header(buffer: Buffer): MavLinkPacketHeader;
|
104
|
+
header(buffer: Buffer, timestamp?: any): MavLinkPacketHeader;
|
104
105
|
/**
|
105
106
|
* Deserialize packet checksum
|
106
107
|
*/
|
@@ -194,6 +195,7 @@ export declare class MavLinkPacketSplitter extends Transform {
|
|
194
195
|
protected readonly log: Logger;
|
195
196
|
private buffer;
|
196
197
|
private onCrcError;
|
198
|
+
private timestamp;
|
197
199
|
private _validPackagesCount;
|
198
200
|
private _unknownPackagesCount;
|
199
201
|
private _invalidPackagesCount;
|
@@ -246,7 +248,10 @@ export declare class MavLinkPacketParser extends Transform {
|
|
246
248
|
protected readonly log: Logger;
|
247
249
|
constructor(opts?: {});
|
248
250
|
private getProtocol;
|
249
|
-
_transform(
|
251
|
+
_transform({ buffer, timestamp, ...rest }: {
|
252
|
+
buffer?: Buffer;
|
253
|
+
timestamp?: any;
|
254
|
+
}, encoding: any, callback: TransformCallback): void;
|
250
255
|
}
|
251
256
|
/**
|
252
257
|
* Creates a MavLink packet stream reader that is reading packets from the given input
|