node-mavlink 1.0.13 → 1.2.0

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.
@@ -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
- "runtimeExecutable": "node",
9
- "runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"],
10
-
11
- "args": ["send-receive-file.ts", "--example", "hello"],
12
-
13
- "cwd": "${workspaceRoot}/examples",
14
- "internalConsoleOptions": "openOnSessionStart",
15
- "skipFiles": ["<node_internals>/**", "node_modules/**"],
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/README.md CHANGED
@@ -19,11 +19,11 @@ $ npm install --save node-mavlink serialport
19
19
  Once you've done it you can start using it. First you'll need a serial port that can parse messages one by one. Please note that since we're using ECMAScript modules the file name should end with `.mjs` extension (e.g. `test.mjs`)
20
20
 
21
21
  ```javascript
22
- import SerialPort from 'serialport'
22
+ import { SerialPort } from 'serialport'
23
23
  import { MavLinkPacketSplitter, MavLinkPacketParser } from 'node-mavlink'
24
24
 
25
25
  // substitute /dev/ttyACM0 with your serial port!
26
- const port = new SerialPort('/dev/ttyACM0')
26
+ const port = new SerialPort({ path: '/dev/ttyACM0', baudRate: 115200 })
27
27
 
28
28
  // constructing a reader that will emit each packet separately
29
29
  const reader = port
@@ -41,18 +41,15 @@ Each message consists of multiple fields that contain specific data. Parsing the
41
41
 
42
42
  ```javascript
43
43
  import {
44
- minimal, common, ardupilotmega, uavionix, icarous, asluav, ualberta
44
+ MavLinkPacketRegistry,
45
+ minimal, common, ardupilotmega
45
46
  } from 'node-mavlink'
46
47
 
47
48
  // create a registry of mappings between a message id and a data class
48
- const REGISTRY = {
49
+ const REGISTRY: MavLinkPacketRegistry = {
49
50
  ...minimal.REGISTRY,
50
51
  ...common.REGISTRY,
51
52
  ...ardupilotmega.REGISTRY,
52
- ...uavionix.REGISTRY,
53
- ...icarous.REGISTRY,
54
- ...asluav.REGISTRY,
55
- ...ualberta.REGISTRY,
56
53
  }
57
54
 
58
55
  reader.on('data', packet => {
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);
@@ -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={};
@@ -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;
@@ -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(chunk: Buffer, encoding: any, callback: TransformCallback): void;
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