@canboat/canboatjs 3.5.2 → 3.6.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.
@@ -0,0 +1,209 @@
1
+ # Architecture Diagram: canboatjs, n2k-signalk, and signalk-server Integration
2
+
3
+ ## Overview
4
+ This diagram shows how the three main components work together to process marine data from NMEA 2000 devices to Signal K format and beyond.
5
+
6
+ ```mermaid
7
+ graph TB
8
+ %% Hardware Layer
9
+ subgraph "Hardware Layer"
10
+ N2K[NMEA 2000 Network]
11
+ ACTISENSE[Actisense NGT-1]
12
+ YDWG[Yacht Devices YDWG-02]
13
+ IKON[Digital Yacht iKonvert]
14
+ MINIPLEX[MiniPlex-3-N2K]
15
+ SOCKETCAN[SocketCAN Interface]
16
+ end
17
+
18
+ %% Data Formats
19
+ subgraph "Raw Data Formats"
20
+ ACT_FMT["Actisense Format<br/>2017-03-13T01:00:00.146Z,2,127245,204,255,8,fc,f8,ff,7f,ff,7f,ff,ff"]
21
+ YDWG_FMT["YDWG Raw Format<br/>16:29:27.082 R 09F8017F 50 C3 B8 13 47 D8 2B C6"]
22
+ IKON_FMT["iKonvert Format<br/>!PDGY,127245,255,/Pj/f/9///8="]
23
+ CANDUMP_FMT["candump Format<br/>can0 09F8027F [8] 00 FC FF FF 00 00 FF FF"]
24
+ PCDIN_FMT["PCDIN Format<br/>$PCDIN,01F119,00000000,0F,2AAF00D1067414FF*59"]
25
+ MXPGN_FMT["MXPGN Format<br/>$MXPGN,01F801,2801,C1308AC40C5DE343*19"]
26
+ end
27
+
28
+ %% canboatjs Layer
29
+ FROMPGN["@canboat/canboatjs<br>FromPGN Parser"]
30
+ TOPGN["@canboat/canboatjs<br>ToPGN Converter"]
31
+ JSON_N2K_OUT["Canboat JSON Format<br/>(for output)"]
32
+
33
+ %% Parsed Data
34
+ subgraph "Parsed N2K Data (JSON)"
35
+ JSON_N2K["Canboat JSON Format<br/><code>{<br/> 'pgn': 127245,<br/> 'src': 204,<br/> 'dst': 255,<br/> 'fields': {<br/> 'Instance': 252,<br/> 'Direction Order': 0,<br/>'Angle Order': 0.1745<br> }<br/>}</code>"]
36
+ end
37
+ style JSON_N2K text-align:left
38
+
39
+ %% n2k-signalk Layer
40
+ N2K_MAPPER["@signalk/n2k-signalk<br>N2kMapper"]
41
+
42
+ %% Signal K Delta
43
+ subgraph "Signal K Delta Format"
44
+ SIGNALK_DELTA["Signal K Delta<br/><code>{<br/> 'context': 'vessels.self',<br/> 'updates': [{<br/>'values': [{<br/> 'path': 'steering.rudderAngle',<br/> 'value': 0.1745<br/> }]<br/> }]<br/>}</code>"]
45
+ end
46
+ style SIGNALK_DELTA text-align:left
47
+
48
+ %% signalk-server Layer
49
+ SIGNALK_SERVER[Signal K Server]
50
+
51
+ %% Client Applications
52
+ subgraph "Client Applications"
53
+ APPS[Navigation Apps<br/>Navionics, iSailor,<br/>iNavX, Aqua Map]
54
+ WILHELMSK[WilhelmSK]
55
+ WIDGETS[Web Widgets]
56
+ CUSTOM_CLIENTS[Custom Applications]
57
+ end
58
+
59
+ %% Output Formats
60
+ subgraph "Output Data Formats"
61
+ NMEA0183_OUT[NMEA 0183 TCP :10110]
62
+ SIGNALK_WS[Signal K WebSocket]
63
+ SIGNALK_REST[Signal K REST API]
64
+ SIGNALK_TCP[Signal K TCP]
65
+ end
66
+
67
+ %% Connections - Hardware to canboatjs
68
+ N2K <--> ACTISENSE
69
+ N2K <--> YDWG
70
+ N2K <--> IKON
71
+ N2K <--> MINIPLEX
72
+ N2K <--> SOCKETCAN
73
+
74
+ ACTISENSE <--> ACT_FMT
75
+ YDWG <--> YDWG_FMT
76
+ IKON <--> IKON_FMT
77
+ SOCKETCAN <--> CANDUMP_FMT
78
+ MINIPLEX <--> MXPGN_FMT
79
+
80
+ %% canboatjs parsing
81
+ ACT_FMT --> FROMPGN
82
+ YDWG_FMT --> FROMPGN
83
+ IKON_FMT --> FROMPGN
84
+ CANDUMP_FMT --> FROMPGN
85
+ PCDIN_FMT --> FROMPGN
86
+ MXPGN_FMT --> FROMPGN
87
+
88
+ FROMPGN --> JSON_N2K
89
+
90
+ %% n2k-signalk conversion
91
+ JSON_N2K --> N2K_MAPPER
92
+ N2K_MAPPER --> SIGNALK_DELTA
93
+
94
+ %% signalk-server processing
95
+ SIGNALK_DELTA --> SIGNALK_SERVER
96
+
97
+ %% Output connections
98
+ SIGNALK_SERVER --> SIGNALK_WS
99
+ SIGNALK_SERVER --> SIGNALK_REST
100
+ SIGNALK_SERVER --> SIGNALK_TCP
101
+ SIGNALK_SERVER --> NMEA0183_OUT
102
+
103
+ %% Client connections
104
+ SIGNALK_WS --> APPS
105
+ SIGNALK_REST --> WIDGETS
106
+ NMEA0183_OUT --> APPS
107
+ SIGNALK_TCP --> CUSTOM_CLIENTS
108
+ SIGNALK_WS --> WILHELMSK
109
+
110
+ %% Reverse flow - Signal K to N2K
111
+ SIGNALK_SERVER --> JSON_N2K_OUT
112
+ JSON_N2K_OUT --> TOPGN
113
+ TOPGN --> ACT_FMT
114
+
115
+ %% Styling
116
+ classDef hardware fill:#e1f5fe,stroke:#0277bd,stroke-width:2px
117
+ classDef format fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
118
+ classDef canboatjs fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
119
+ classDef n2ksignalk fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
120
+ classDef signalkserver fill:#e0f2f1,stroke:#00695c,stroke-width:2px
121
+ classDef output fill:#fce4ec,stroke:#c2185b,stroke-width:2px
122
+ classDef clients fill:#f1f8e9,stroke:#558b2f,stroke-width:2px
123
+
124
+ class N2K,CAN,ACTISENSE,YDWG,IKON,MINIPLEX,SOCKETCAN hardware
125
+ class ACT_FMT,YDWG_FMT,IKON_FMT,CANDUMP_FMT,PCDIN_FMT,MXPGN_FMT,JSON_N2K_OUT format
126
+ class FROMPGN canboatjs
127
+ class TOPGN canboatjs
128
+ class N2K_MAPPER,DELTA_CONV,STANDARD_PGNS,FUSION_PGNS,LOWRANCE_PGNS,RAYMARINE_PGNS,MARETRON_PGNS,ACTISENSE_PGNS,DIGITALYACHT_PGNS,SIMRAD_PGNS n2ksignalk
129
+ class SIGNALK_SERVER signalkserver
130
+ class NMEA0183_OUT,SIGNALK_WS,SIGNALK_REST,SIGNALK_TCP output
131
+ class APPS,WIDGETS,CUSTOM_CLIENTS,WILHELMSK clients
132
+ ```
133
+
134
+ ## Data Flow Explanation
135
+
136
+ ### 1. **Hardware Layer**
137
+ - **NMEA 2000 Network**: Marine electronics network using CAN bus protocol
138
+ - **Gateways**: Various hardware devices that bridge NMEA 2000 to serial/ethernet/wifi
139
+ - **Interfaces**: Direct CAN bus interfaces for Linux systems
140
+
141
+ ### 2. **canboatjs (@canboat/canboatjs)**
142
+ **Purpose**: Parse and encode NMEA 2000 data in various formats
143
+ - **FromPgn Parser**: Core parser that converts various N2K formats to standardized JSON
144
+
145
+ **Key Features**:
146
+ - Multi-format input support (Actisense, YDWG, iKonvert, etc.)
147
+ - Real-time stream processing
148
+ - Bidirectional conversion (parse and generate)
149
+ - Hardware abstraction layer
150
+
151
+ ### 3. **n2k-signalk (@signalk/n2k-signalk)**
152
+ **Purpose**: Convert parsed NMEA 2000 JSON to Signal K delta format
153
+ - **N2kMapper**: Main conversion engine
154
+ - **PGN Mappings**: Manufacturer-specific and standard PGN definitions
155
+ - **Delta Converter**: Transforms N2K data to Signal K delta updates
156
+
157
+ **Key Features**:
158
+ - Comprehensive PGN coverage
159
+ - Manufacturer-specific extensions
160
+ - Signal K delta format output
161
+ - Custom mapping support
162
+
163
+ ### 4. **signalk-server**
164
+ **Purpose**: Central hub for marine data processing and distribution
165
+ - **Stream Processors**: Handle different data types and formats
166
+ - **Data Providers**: Connect to various data sources
167
+ - **Plugin System**: Extensible architecture for custom functionality
168
+ - **Network Interfaces**: Serve data via HTTP, WebSocket, TCP, etc.
169
+
170
+ **Key Features**:
171
+ - Multi-protocol support (NMEA 2000, NMEA 0183, Signal K)
172
+ - Web-based administration interface
173
+ - Plugin ecosystem for extensions
174
+ - Real-time data streaming
175
+ - Format conversion and bridging
176
+
177
+ ## Integration Points
178
+
179
+ ### **canboatjs → n2k-signalk**
180
+ - canboatjs parses raw N2K data into standardized JSON format
181
+ - n2k-signalk consumes this JSON and converts it to Signal K deltas
182
+ - Both libraries share common PGN definitions from @canboat/ts-pgns
183
+
184
+ ### **n2k-signalk → signalk-server**
185
+ - signalk-server uses n2k-signalk as a stream processor
186
+ - N2K data flows through canboatjs → n2k-signalk → Signal K deltas
187
+ - Server maintains device metadata and manages data flow
188
+
189
+ ## Output Capabilities
190
+
191
+ ### **Data Formats**
192
+ - **Signal K**: Native JSON format via WebSocket and REST APIs
193
+ - **NMEA 0183**: Converted output via TCP for legacy applications
194
+ - **NMEA 2000**: Bidirectional N2K communication
195
+
196
+ ### **Client Applications**
197
+ - **Navigation Apps**: Navionics, iSailor, iNavX, Aqua Map via NMEA 0183 TCP
198
+ - **Signal K Apps**: WilhelmSK and custom applications via Signal K APIs
199
+ - **Web Applications**: Browser-based instruments and controls
200
+ - **Custom Clients**: Direct API access for specialized applications
201
+
202
+ ## Key Benefits
203
+
204
+ 1. **Multi-Format Support**: Handle various proprietary formats from different manufacturers
205
+ 2. **Real-Time Processing**: Stream-based architecture for live data
206
+ 3. **Extensibility**: Plugin system and custom mappings
207
+ 4. **Standardization**: Convert proprietary formats to open Signal K standard
208
+ 5. **Bridging**: Connect legacy NMEA 0183 apps to modern NMEA 2000 networks
209
+ 6. **Device Integration**: Support for multiple hardware interfaces and protocols
@@ -9,9 +9,10 @@ const minimist_1 = __importDefault(require("minimist"));
9
9
  const readline_1 = __importDefault(require("readline"));
10
10
  const utils_1 = require("./utils");
11
11
  const fs_1 = __importDefault(require("fs"));
12
+ const util_1 = __importDefault(require("util"));
12
13
  const argv = (0, minimist_1.default)(process.argv.slice(2), {
13
14
  alias: { h: 'help' },
14
- string: ['pgn', 'manufacturer', 'file'],
15
+ string: ['pgn', 'manufacturer', 'src', 'file', 'dst'],
15
16
  boolean: [
16
17
  'n',
17
18
  'r',
@@ -21,7 +22,9 @@ const argv = (0, minimist_1.default)(process.argv.slice(2), {
21
22
  //'show-create-pgns',
22
23
  'pretty',
23
24
  'show-warnings',
24
- 'coalesced'
25
+ 'coalesced',
26
+ 'js',
27
+ 'js-colors'
25
28
  ]
26
29
  });
27
30
  (0, utils_1.printVersion)(argv);
@@ -33,7 +36,9 @@ Options:
33
36
  -n output null values
34
37
  -r parse $MXPGN as little endian
35
38
  --file <path> read from the given file
36
- --pretty pretty json
39
+ --pretty output pretty json
40
+ --js output in JavaScript format
41
+ --js-colors output in JavaScript format with colors
37
42
  --camel output field names in camelCase
38
43
  --camel-compat output field names in camelCase and regular
39
44
  --show-non-matches show pgn data without any matches
@@ -41,6 +46,8 @@ Options:
41
46
  --coalesced force coalesced format
42
47
  --fast force fast format
43
48
  --pgn <number> filter for the given pgn number
49
+ --src <number> filter for the given source address
50
+ --dst <number> filter for the given destination address
44
51
  --manufacturer <str> filter for pgns from the given manufacturer
45
52
  -h, --help output usage information`);
46
53
  process.exit(1);
@@ -57,6 +64,14 @@ const manufacturer_filter = argv['manufacturer'];
57
64
  if (pgn_filter !== undefined && Array.isArray(pgn_filter) === false) {
58
65
  pgn_filter = [pgn_filter];
59
66
  }
67
+ let src_filter = argv['src'];
68
+ if (src_filter !== undefined && Array.isArray(src_filter) === false) {
69
+ src_filter = [src_filter];
70
+ }
71
+ let dst_filter = argv['dst'];
72
+ if (dst_filter !== undefined && Array.isArray(dst_filter) === false) {
73
+ dst_filter = [dst_filter];
74
+ }
60
75
  const parser = new fromPgn_1.Parser({
61
76
  returnNulls: argv['n'] === true,
62
77
  littleEndianMXPGN: argv['r'] === true,
@@ -109,7 +124,11 @@ rl.on('line', (line) => {
109
124
  }
110
125
  if (pgn &&
111
126
  (pgn_filter === undefined ||
112
- pgn_filter.find((p) => pgn.pgn === Number(p)))) {
127
+ pgn_filter.find((p) => pgn.pgn === Number(p))) &&
128
+ (src_filter === undefined ||
129
+ src_filter.find((s) => pgn.src === Number(s))) &&
130
+ (dst_filter === undefined ||
131
+ dst_filter.find((d) => pgn.dst === Number(d)))) {
113
132
  if (manufacturer_filter !== undefined) {
114
133
  const manufacturer = pgn.fields.manufacturerCode ||
115
134
  pgn.fields['Manufacturer Code'];
@@ -117,7 +136,16 @@ rl.on('line', (line) => {
117
136
  return;
118
137
  }
119
138
  }
120
- console.log(JSON.stringify(pgn, null, argv['pretty'] ? 2 : 0));
139
+ if (argv['js'] || argv['js-colors']) {
140
+ console.log(util_1.default.inspect(pgn, {
141
+ depth: null,
142
+ colors: argv['js-colors'],
143
+ breakLength: 1
144
+ }));
145
+ }
146
+ else {
147
+ console.log(JSON.stringify(pgn, null, argv['pretty'] ? 2 : 0));
148
+ }
121
149
  }
122
150
  });
123
151
  //# sourceMappingURL=analyzerjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyzerjs.js","sourceRoot":"","sources":["../../lib/bin/analyzerjs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyzerjs.js","sourceRoot":"","sources":["../../lib/bin/analyzerjs.ts"],"names":[],"mappings":"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"}
@@ -9,14 +9,24 @@ const canId_1 = require("../canId");
9
9
  const minimist_1 = __importDefault(require("minimist"));
10
10
  const utilities_1 = require("../utilities");
11
11
  const utils_1 = require("./utils");
12
+ const util_1 = __importDefault(require("util"));
12
13
  // eslint-disable-next-line @typescript-eslint/no-require-imports
13
14
  const socketcan = require('socketcan');
14
15
  const argv = (0, minimist_1.default)(process.argv.slice(2), {
15
16
  alias: {
16
17
  h: 'help'
17
18
  },
18
- string: ['format', 'manufacturer'],
19
- boolean: ['n', 'r', 'camel', 'camel-compat', 'show-non-matches', 'pretty']
19
+ string: ['format', 'manufacturer', 'src', 'pgn', 'dst'],
20
+ boolean: [
21
+ 'n',
22
+ 'r',
23
+ 'camel',
24
+ 'camel-compat',
25
+ 'show-non-matches',
26
+ 'pretty',
27
+ 'js',
28
+ 'js-colors'
29
+ ]
20
30
  });
21
31
  (0, utils_1.printVersion)(argv);
22
32
  if (argv['help']) {
@@ -27,11 +37,15 @@ Options:
27
37
  -c don't check for invalid values
28
38
  -n output null values
29
39
  -r parse $MXPGN as little endian
30
- --pretty pretty json
40
+ --pretty pretty json
41
+ --js output in JavaScript format
42
+ --js-colors output in JavaScript format with colors
31
43
  --camel output field names in camelCase
32
44
  --camel-compat output field names in camelCase and regular
33
45
  --show-non-matches show pgn data without any matches
34
46
  --pgn <number> filter for the given pgn number
47
+ --src <number> filter for the given source address
48
+ --dst <number> filter for the given destination address
35
49
  --manufacturer <str> filter for pgns from the given manufacturer
36
50
  -h, --help output usage information`);
37
51
  process.exit(1);
@@ -45,6 +59,14 @@ const manufacturer_filter = argv['manufacturer'];
45
59
  if (pgn_filter !== undefined && Array.isArray(pgn_filter) === false) {
46
60
  pgn_filter = [pgn_filter];
47
61
  }
62
+ let src_filter = argv['src'];
63
+ if (src_filter !== undefined && Array.isArray(src_filter) === false) {
64
+ src_filter = [src_filter];
65
+ }
66
+ let dst_filter = argv['dst'];
67
+ if (dst_filter !== undefined && Array.isArray(dst_filter) === false) {
68
+ dst_filter = [dst_filter];
69
+ }
48
70
  const parser = new index_1.FromPgn({
49
71
  returnNulls: argv['n'] === true,
50
72
  littleEndianMXPGN: argv['r'] === true,
@@ -59,15 +81,28 @@ parser.on('error', (pgn, error) => {
59
81
  console.error(error.stack);
60
82
  });
61
83
  parser.on('pgn', (pgn) => {
62
- if (pgn_filter === undefined ||
63
- pgn_filter.find((p) => pgn.pgn === Number(p))) {
84
+ if ((pgn_filter === undefined ||
85
+ pgn_filter.find((p) => pgn.pgn === Number(p))) &&
86
+ (src_filter === undefined ||
87
+ src_filter.find((s) => pgn.src === Number(s))) &&
88
+ (dst_filter === undefined ||
89
+ dst_filter.find((d) => pgn.dst === Number(d)))) {
64
90
  if (manufacturer_filter !== undefined) {
65
91
  const manufacturer = pgn.fields.manufacturerCode || pgn.fields['Manufacturer Code'];
66
92
  if (manufacturer !== manufacturer_filter) {
67
93
  return;
68
94
  }
69
95
  }
70
- console.log(JSON.stringify(pgn, null, argv['pretty'] ? 2 : 0));
96
+ if (argv['js'] || argv['js-colors']) {
97
+ console.log(util_1.default.inspect(pgn, {
98
+ depth: null,
99
+ colors: argv['js-colors'],
100
+ breakLength: 1
101
+ }));
102
+ }
103
+ else {
104
+ console.log(JSON.stringify(pgn, null, argv['pretty'] ? 2 : 0));
105
+ }
71
106
  }
72
107
  });
73
108
  const canDevice = argv['_'][0];
@@ -1 +1 @@
1
- {"version":3,"file":"candumpjs.js","sourceRoot":"","sources":["../../lib/bin/candumpjs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"candumpjs.js","sourceRoot":"","sources":["../../lib/bin/candumpjs.ts"],"names":[],"mappings":"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"}
package/dist/fromPgn.d.ts CHANGED
@@ -34,6 +34,7 @@ export declare class Parser extends EventEmitter {
34
34
  constructor(opts?: any);
35
35
  _parse(pgn: PGN, bs: BitStream, len: number, coalesced: boolean, cb: FromPgnCallback | undefined, sourceString?: string | undefined): PGN | undefined;
36
36
  setField(res: any, field: Field, value: any): void;
37
+ getField(res: any, field: Field): any;
37
38
  findNonMatchPgn(pgnList: Definition[]): Definition | undefined;
38
39
  findMatchPgn(pgnList: Definition[]): Definition | undefined;
39
40
  parse(data: any, cb?: FromPgnCallback | undefined): PGN | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"fromPgn.d.ts","sourceRoot":"","sources":["../lib/fromPgn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,UAAU,EACV,KAAK,EACL,GAAG,EAUJ,MAAM,kBAAkB,CAAA;AAIzB,QAAA,MAAM,YAAY,KAAoB,CAAA;AAItC,OAAO,EAAE,SAAS,EAAW,MAAM,YAAY,CAAA;AAc/C,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,SAAS,KAAK,IAAI,CAAA;AACtE,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;AAuB7D,qBAAa,MAAO,SAAQ,YAAY;IACtC,OAAO,EAAE,GAAG,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAA;KAAE,CAAA;IAClD,WAAW,EAAE,OAAO,CAAA;gBAER,IAAI,GAAE,GAAQ;IA2C1B,MAAM,CACJ,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,OAAO,EAClB,EAAE,EAAE,eAAe,GAAG,SAAS,EAC/B,YAAY,GAAE,MAAM,GAAG,SAAqB;IA4V9C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG;IAW3C,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS;IAM9D,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS;IAM3D,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAE,eAAe,GAAG,SAAqB;IAiB5D,YAAY,CACV,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EACvB,SAAS,EAAE,OAAO,EAClB,EAAE,EAAE,eAAe,GAAG,SAAS,EAC/B,YAAY,EAAE,MAAM;IA0BtB,aAAa,CAAC,QAAQ,EAAE,MAAM;IAI9B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe;IA+BtD,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe;IAuB9C,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe;IAsBzD,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe;IAkC5C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAE,eAAe,GAAG,SAAqB;IAkCzE,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe,GAAG,SAAS;CAgC3D;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,4BAuDpE"}
1
+ {"version":3,"file":"fromPgn.d.ts","sourceRoot":"","sources":["../lib/fromPgn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,UAAU,EACV,KAAK,EACL,GAAG,EAUJ,MAAM,kBAAkB,CAAA;AAIzB,QAAA,MAAM,YAAY,KAAoB,CAAA;AAItC,OAAO,EAAE,SAAS,EAAW,MAAM,YAAY,CAAA;AAc/C,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,SAAS,KAAK,IAAI,CAAA;AACtE,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;AAuB7D,qBAAa,MAAO,SAAQ,YAAY;IACtC,OAAO,EAAE,GAAG,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAA;KAAE,CAAA;IAClD,WAAW,EAAE,OAAO,CAAA;gBAER,IAAI,GAAE,GAAQ;IA2C1B,MAAM,CACJ,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,OAAO,EAClB,EAAE,EAAE,eAAe,GAAG,SAAS,EAC/B,YAAY,GAAE,MAAM,GAAG,SAAqB;IA6W9C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG;IAW3C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK;IAQ/B,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS;IAM9D,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS;IAM3D,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAE,eAAe,GAAG,SAAqB;IAiB5D,YAAY,CACV,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EACvB,SAAS,EAAE,OAAO,EAClB,EAAE,EAAE,eAAe,GAAG,SAAS,EAC/B,YAAY,EAAE,MAAM;IA0BtB,aAAa,CAAC,QAAQ,EAAE,MAAM;IAI9B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe;IA+BtD,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe;IAuB9C,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe;IAsBzD,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe;IAkC5C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAE,eAAe,GAAG,SAAqB;IAkCzE,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe,GAAG,SAAS;CAgC3D;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,4BA0DpE"}
package/dist/fromPgn.js CHANGED
@@ -224,7 +224,7 @@ class Parser extends EventEmitter {
224
224
  for (let i = 0; i < fields.length - RepeatingFields && continueReading; i++) {
225
225
  const field = fields[i];
226
226
  const hasMatch = field.Match !== undefined;
227
- let value = readField(pgnData, this.options, !hasMatch, pgn, field, bs, fields);
227
+ let [value] = readField(pgnData, this.options, !hasMatch, pgn, field, bs, fields);
228
228
  if (hasMatch) {
229
229
  //console.log(`looking for ${field.Name} == ${value}`)
230
230
  //console.log(JSON.stringify(pgnList, null, 2))
@@ -300,15 +300,18 @@ class Parser extends EventEmitter {
300
300
  const group = {};
301
301
  repeating.forEach((field) => {
302
302
  if (bs.bitsLeft > 0) {
303
- const value = readField(pgnData, this.options, true, pgn, field, bs, fields);
304
- if (value !== undefined && value != null) {
303
+ const [value, refField] = readField(pgnData, this.options, true, pgn, field, bs, fields);
304
+ if (refField) {
305
+ group.parameterId = refField.Id;
306
+ }
307
+ if (value !== undefined &&
308
+ (value != null || this.options.returnNulls)) {
305
309
  this.setField(group, field, value);
306
310
  }
307
311
  }
308
312
  });
309
313
  if (lodash_1.default.keys(group).length > 0) {
310
- ;
311
- pgn.fields.list.push(group);
314
+ fany.list.push(group);
312
315
  }
313
316
  }
314
317
  }
@@ -337,11 +340,27 @@ class Parser extends EventEmitter {
337
340
  res.src = pgn.src;
338
341
  res.dst = pgn.dst;
339
342
  res.prio = pgn.prio;
340
- res.canId = pgn.canId;
341
- res.time = pgn.time;
342
- res.timer = pgn.timer;
343
- res.direction = pgn.direction;
344
- res.input = pgn.input;
343
+ const apgn = pgn;
344
+ if (apgn.canId !== undefined) {
345
+ ;
346
+ res.canId = apgn.canId;
347
+ }
348
+ if (apgn.time !== undefined) {
349
+ ;
350
+ res.time = apgn.time;
351
+ }
352
+ if (apgn.timer !== undefined) {
353
+ ;
354
+ res.timer = apgn.timer;
355
+ }
356
+ if (apgn.direction !== undefined) {
357
+ ;
358
+ res.direction = apgn.direction;
359
+ }
360
+ if (apgn.input !== undefined) {
361
+ ;
362
+ res.input = apgn.input;
363
+ }
345
364
  // Stringify timestamp because SK Server needs it that way.
346
365
  const ts = lodash_1.default.get(pgn, 'timestamp', new Date());
347
366
  res.timestamp = lodash_1.default.isDate(ts) ? ts.toISOString() : ts;
@@ -367,6 +386,14 @@ class Parser extends EventEmitter {
367
386
  res[field.Name] = value;
368
387
  }
369
388
  }
389
+ getField(res, field) {
390
+ if (this.options.useCamelCompat || this.options.useCamel) {
391
+ return res[field.Id];
392
+ }
393
+ else {
394
+ return res[field.Name];
395
+ }
396
+ }
370
397
  findNonMatchPgn(pgnList) {
371
398
  return pgnList.find((f) => {
372
399
  return !f.Fields.find((f) => f.Match !== undefined);
@@ -587,9 +614,10 @@ function getField(pgn_number, index, data) {
587
614
  return param === idx + 1;
588
615
  });
589
616
  if (param) {
617
+ const value = param.value !== undefined ? param.value : param.Value;
590
618
  pgnList = pgnList.filter((f) => {
591
- const value = param.value !== undefined ? param.value : param.Value;
592
- return f.Fields[idx].Match == value;
619
+ return (f.Fields[idx].Match == value ||
620
+ f.Fields[idx].Description == value);
593
621
  });
594
622
  if (pgnList.length == 0) {
595
623
  throw new Error('unable to read: ' + JSON.stringify(data));
@@ -635,6 +663,7 @@ function lookup(field, value) {
635
663
  }
636
664
  function readField(definition, options, runPostProcessor, pgn, field, bs, fields = undefined) {
637
665
  let value;
666
+ let refField = undefined;
638
667
  const reader = fieldTypeReaders[field.FieldType];
639
668
  if (reader) {
640
669
  value = reader(pgn, field, bs);
@@ -645,12 +674,20 @@ function readField(definition, options, runPostProcessor, pgn, field, bs, fields
645
674
  bs.bitsLeft < field.BitLength) {
646
675
  //no more data
647
676
  bs.readBits(bs.bitsLeft, false);
648
- return;
677
+ return [null, undefined];
649
678
  }
650
- value = readValue(definition, options, pgn, field, bs, fields);
679
+ ;
680
+ [value, refField] = readValue(definition, options, pgn, field, bs, fields);
681
+ }
682
+ if (refField === undefined) {
683
+ return [convertField(field, value, runPostProcessor, options), undefined];
684
+ }
685
+ else {
686
+ return [value, refField];
651
687
  }
652
- //console.log(`${field.Name} ${value} ${field.Resolution}`)
653
- if (value != null && !lodash_1.default.isUndefined(value)) {
688
+ }
689
+ function convertField(field, value, runPostProcessor, options) {
690
+ if (value != null && value !== undefined) {
654
691
  const type = field.FieldType; //hack, missing type
655
692
  const postProcessor = fieldTypePostProcessors[type];
656
693
  if (postProcessor) {
@@ -734,12 +771,13 @@ function readValue(definition, options, pgn, field, bs, fields, bitLength = unde
734
771
  }
735
772
  if (bitLength === undefined) {
736
773
  //FIXME?? error? mesg? should never happen
737
- return;
774
+ return [null, undefined];
738
775
  }
739
776
  }
740
777
  if (field.FieldType === ts_pgns_1.FieldType.Binary && definition.Fallback === true) {
741
- const data = bs.readArrayBuffer(bitLength / 8);
742
- return (0, utilities_1.byteString)(Buffer.from(data), ' ');
778
+ bitLength = bs.bitsLeft < bitLength ? bs.bitsLeft : bitLength;
779
+ const data = bs.readArrayBuffer(Math.floor(bitLength / 8));
780
+ return [(0, utilities_1.byteString)(Buffer.from(data), ' '), undefined];
743
781
  }
744
782
  else if (bitLength === 8) {
745
783
  if (field.Signed) {
@@ -815,7 +853,7 @@ function readValue(definition, options, pgn, field, bs, fields, bitLength = unde
815
853
  if (bs.bitsLeft < bitLength) {
816
854
  bitLength = bs.bitsLeft;
817
855
  if (bitLength === undefined) {
818
- return null;
856
+ return [null, undefined];
819
857
  }
820
858
  }
821
859
  value = bs.readArrayBuffer(bitLength / 8); //, field.Signed)
@@ -827,14 +865,14 @@ function readValue(definition, options, pgn, field, bs, fields, bitLength = unde
827
865
  }, arr)
828
866
  .map((x) => (x.length === 1 ? '0' + x : x))
829
867
  .join(' ');
830
- return value;
868
+ return [value, undefined];
831
869
  }
832
870
  if (value != null &&
833
871
  typeof value !== 'undefined' &&
834
872
  typeof value !== 'number') {
835
873
  value = Number(value);
836
874
  }
837
- return value;
875
+ return [value, undefined];
838
876
  }
839
877
  }
840
878
  function isMax(numBits, value, signed) {
@@ -861,19 +899,20 @@ function readVariableLengthField(definition, options, pgn, field, bs) {
861
899
  try {
862
900
  const refField = getField(pgn.fields.pgn || pgn.fields.PGN, bs.view.buffer[bs.byteIndex - 1] - 1, pgn);
863
901
  if (refField) {
864
- const res = readField(definition, options, false, pgn, refField, bs);
902
+ const [res] = readField(definition, options, true, pgn, refField, bs);
865
903
  if (refField.BitLength !== undefined) {
866
904
  const bits = (refField.BitLength + 7) & ~7; // Round # of bits in field refField up to complete bytes: 1->8, 7->8, 8->8 etc.
867
905
  if (bits > refField.BitLength) {
868
906
  bs.readBits(bits - refField.BitLength, false);
869
907
  }
870
908
  }
871
- return res;
909
+ return [res, refField];
872
910
  }
873
911
  }
874
912
  catch (error) {
875
913
  debug(error);
876
914
  }
915
+ return [null, undefined];
877
916
  }
878
917
  fieldTypeReaders['STRING_LAU'
879
918
  //'ASCII or UNICODE string starting with length and control byte'