node-mavlink 1.0.7 → 1.0.10-beta.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.
@@ -17,14 +17,14 @@ export declare const SERIALIZERS: {
17
17
  float: (value: float, buffer: Buffer, offset: number) => number;
18
18
  double: (value: double, buffer: Buffer, offset: number) => number;
19
19
  'char[]': (value: string, buffer: Buffer, offset: number, maxLen: number) => void;
20
- 'int8[]': (value: uint8_t[], buffer: Buffer, offset: number, maxLen: number) => void;
21
- 'uint8[]': (value: uint8_t[], buffer: Buffer, offset: number, maxLen: number) => void;
22
- 'int16[]': (value: uint16_t[], buffer: Buffer, offset: number, maxLen: number) => void;
23
- 'uint16[]': (value: uint16_t[], buffer: Buffer, offset: number, maxLen: number) => void;
24
- 'int32[]': (value: uint32_t[], buffer: Buffer, offset: number, maxLen: number) => void;
25
- 'uint32[]': (value: uint32_t[], buffer: Buffer, offset: number, maxLen: number) => void;
26
- 'int64[]': (value: uint64_t[], buffer: Buffer, offset: number, maxLen: number) => void;
27
- 'uint64[]': (value: uint64_t[], 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
28
  'float[]': (value: float[], buffer: Buffer, offset: number, maxLen: number) => void;
29
29
  'double[]': (value: double[], buffer: Buffer, offset: number, maxLen: number) => void;
30
30
  };
@@ -26,42 +26,42 @@ exports.SERIALIZERS = {
26
26
  buffer.writeUInt8(code, offset + i);
27
27
  }
28
28
  },
29
- 'int8[]': (value, buffer, offset, maxLen) => {
29
+ 'int8_t[]': (value, buffer, offset, maxLen) => {
30
30
  for (let i = 0; i < value.length && i < maxLen; i++) {
31
31
  buffer.writeInt8(value[i], offset + i);
32
32
  }
33
33
  },
34
- 'uint8[]': (value, buffer, offset, maxLen) => {
34
+ 'uint8_t[]': (value, buffer, offset, maxLen) => {
35
35
  for (let i = 0; i < value.length && i < maxLen; i++) {
36
36
  buffer.writeUInt8(value[i], offset + i);
37
37
  }
38
38
  },
39
- 'int16[]': (value, buffer, offset, maxLen) => {
39
+ 'int16_t[]': (value, buffer, offset, maxLen) => {
40
40
  for (let i = 0; i < value.length && i < maxLen; i++) {
41
41
  buffer.writeInt16LE(value[i], offset + i * 2);
42
42
  }
43
43
  },
44
- 'uint16[]': (value, buffer, offset, maxLen) => {
44
+ 'uint16_t[]': (value, buffer, offset, maxLen) => {
45
45
  for (let i = 0; i < value.length && i < maxLen; i++) {
46
46
  buffer.writeUInt16LE(value[i], offset + i * 2);
47
47
  }
48
48
  },
49
- 'int32[]': (value, buffer, offset, maxLen) => {
49
+ 'int32_t[]': (value, buffer, offset, maxLen) => {
50
50
  for (let i = 0; i < value.length && i < maxLen; i++) {
51
51
  buffer.writeInt32LE(value[i], offset + i * 4);
52
52
  }
53
53
  },
54
- 'uint32[]': (value, buffer, offset, maxLen) => {
54
+ 'uint32_t[]': (value, buffer, offset, maxLen) => {
55
55
  for (let i = 0; i < value.length && i < maxLen; i++) {
56
56
  buffer.writeUInt32LE(value[i], offset + i * 4);
57
57
  }
58
58
  },
59
- 'int64[]': (value, buffer, offset, maxLen) => {
59
+ 'int64_t[]': (value, buffer, offset, maxLen) => {
60
60
  for (let i = 0; i < value.length && i < maxLen; i++) {
61
61
  buffer.writeBigInt64LE(value[i], offset + i * 8);
62
62
  }
63
63
  },
64
- 'uint64[]': (value, buffer, offset, maxLen) => {
64
+ 'uint64_t[]': (value, buffer, offset, maxLen) => {
65
65
  for (let i = 0; i < value.length && i < maxLen; i++) {
66
66
  buffer.writeBigUInt64LE(value[i], offset + i * 8);
67
67
  }
@@ -160,7 +160,7 @@ exports.DESERIALIZERS = {
160
160
  'float[]': (buffer, offset, length) => {
161
161
  const result = new Array(length);
162
162
  for (let i = 0; i < length; i++)
163
- result[i] = buffer.readFloatLE(offset + i * 8);
163
+ result[i] = buffer.readFloatLE(offset + i * 4);
164
164
  return result;
165
165
  },
166
166
  'double[]': (buffer, offset, length) => {
@@ -0,0 +1,35 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * Convert a number to hexadecimal representation with a minumum
4
+ * number of characters and optional prefix (0x by default)
5
+ *
6
+ * @param n value to convert
7
+ * @param len length of the converted string (without prefix)
8
+ * @param prefix prefix to prepend the generated string with
9
+ */
10
+ export declare function hex(n: number, len?: number, prefix?: string): string;
11
+ /**
12
+ * Dump a buffer in a readable form
13
+ *
14
+ * @param buffer buffer to dump
15
+ * @param lineWidth width of the line, in bytes of buffer
16
+ */
17
+ export declare function dump(buffer: Buffer, lineWidth?: number): void;
18
+ /**
19
+ * Sleep for a given number of miliseconds
20
+ *
21
+ * @param ms number of miliseconds to sleep
22
+ */
23
+ export declare function sleep(ms: any): Promise<unknown>;
24
+ /**
25
+ * Execute a callback every <code>interval</code>ms and if it will not return
26
+ * a truthy value in the <code>timeout<code>ms then throw a Timeout exception.
27
+ * This is a very useful utility that will allow you to specify how often
28
+ * a particular expression should be evaluated and how long will it take to end
29
+ * the execution without success. Great for time-sensitive operations.
30
+ *
31
+ * @param cb callback to call every <code>interval</code>ms
32
+ * @param timeout number of miliseconds that need to pass before the Timeout exception is thrown
33
+ * @param interval number of miliseconds before re-running the callback
34
+ */
35
+ export declare function waitFor(cb: any, timeout?: number, interval?: number): Promise<unknown>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.waitFor = exports.sleep = exports.dump = exports.hex = void 0;
13
+ /**
14
+ * Convert a number to hexadecimal representation with a minumum
15
+ * number of characters and optional prefix (0x by default)
16
+ *
17
+ * @param n value to convert
18
+ * @param len length of the converted string (without prefix)
19
+ * @param prefix prefix to prepend the generated string with
20
+ */
21
+ function hex(n, len = 2, prefix = '0x') {
22
+ return `${prefix}${n.toString(16).padStart(len, '0')}`;
23
+ }
24
+ exports.hex = hex;
25
+ /**
26
+ * Dump a buffer in a readable form
27
+ *
28
+ * @param buffer buffer to dump
29
+ * @param lineWidth width of the line, in bytes of buffer
30
+ */
31
+ function dump(buffer, lineWidth = 16) {
32
+ const line = [];
33
+ let address = 0;
34
+ for (let i = 0; i < buffer.length; i++) {
35
+ line.push(hex(buffer[i], 2, '0x'));
36
+ if (line.length === lineWidth) {
37
+ console.log(hex(address, 4), '|', line.join(' '));
38
+ address += lineWidth;
39
+ line.length = 0;
40
+ }
41
+ }
42
+ if (line.length > 0) {
43
+ console.log(hex(address, 4), '|', line.join(' '));
44
+ }
45
+ }
46
+ exports.dump = dump;
47
+ /**
48
+ * Sleep for a given number of miliseconds
49
+ *
50
+ * @param ms number of miliseconds to sleep
51
+ */
52
+ function sleep(ms) {
53
+ return new Promise(resolve => setTimeout(resolve, ms));
54
+ }
55
+ exports.sleep = sleep;
56
+ /**
57
+ * Execute a callback every <code>interval</code>ms and if it will not return
58
+ * a truthy value in the <code>timeout<code>ms then throw a Timeout exception.
59
+ * This is a very useful utility that will allow you to specify how often
60
+ * a particular expression should be evaluated and how long will it take to end
61
+ * the execution without success. Great for time-sensitive operations.
62
+ *
63
+ * @param cb callback to call every <code>interval</code>ms
64
+ * @param timeout number of miliseconds that need to pass before the Timeout exception is thrown
65
+ * @param interval number of miliseconds before re-running the callback
66
+ */
67
+ function waitFor(cb, timeout = 10000, interval = 100) {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ return new Promise((resolve, reject) => {
70
+ const timeoutTimer = setTimeout(() => {
71
+ cleanup();
72
+ reject('Timeout');
73
+ }, timeout);
74
+ const intervalTimer = setInterval(() => {
75
+ const result = cb();
76
+ if (result) {
77
+ cleanup();
78
+ resolve(result);
79
+ }
80
+ });
81
+ const cleanup = () => {
82
+ clearTimeout(timeoutTimer);
83
+ clearTimeout(intervalTimer);
84
+ };
85
+ });
86
+ });
87
+ }
88
+ exports.waitFor = waitFor;
Binary file
@@ -1,12 +1,15 @@
1
1
  #!/usr/bin/env -S npx ts-node
2
2
 
3
3
  import { createReadStream } from 'fs'
4
- import { MavLinkPacketSplitter, MavLinkPacketParser, MavLinkPacket } from '..'
5
- import { minimal, common, ardupilotmega, uavionix, icarous } from '..'
4
+ import { MavLinkPacketSplitter, MavLinkPacketParser } from '..'
5
+ import {
6
+ minimal, common, ardupilotmega, uavionix, icarous,
7
+ asluav, development, ualberta,
8
+ } from '..'
6
9
 
7
- const file = createReadStream('./mavlink-v2-3412-packets.bin')
10
+ const file = createReadStream('./GH-5.bin')
8
11
 
9
- const splitter = new MavLinkPacketSplitter({}, true)
12
+ const splitter = new MavLinkPacketSplitter()
10
13
 
11
14
  const reader = file
12
15
  .pipe(splitter)
@@ -20,6 +23,9 @@ const REGISTRY = {
20
23
  ...ardupilotmega.REGISTRY,
21
24
  ...uavionix.REGISTRY,
22
25
  ...icarous.REGISTRY,
26
+ ...asluav.REGISTRY,
27
+ ...development.REGISTRY,
28
+ ...ualberta.REGISTRY,
23
29
  }
24
30
 
25
31
  reader.on('data', packet => {
package/index.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export * from 'mavlink-mappings'
2
+ export * from './lib/utils'
3
+ export * from './lib/logger'
2
4
  export * from './lib/mavlink'
3
5
  export * from './lib/mavesp'
package/lib/logger.ts ADDED
@@ -0,0 +1,128 @@
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
+ }
package/lib/mavesp.ts CHANGED
@@ -4,7 +4,8 @@ import { Socket, createSocket } from 'dgram'
4
4
  import { Writable, PassThrough } from 'stream'
5
5
  import { MavLinkPacketSplitter, MavLinkPacketParser, MavLinkPacketSignature } from './mavlink'
6
6
  import { MavLinkProtocol, MavLinkProtocolV2 } from './mavlink'
7
- import { uint8_t, waitFor, MavLinkData } from 'mavlink-mappings'
7
+ import { waitFor } from './utils'
8
+ import { uint8_t, MavLinkData } from 'mavlink-mappings'
8
9
 
9
10
  /**
10
11
  * Encapsulation of communication with MavEsp8266