@canboat/canboatjs 3.5.3 → 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.
- package/.mocharc.js +2 -3
- package/README.md +604 -27
- package/architecture-diagram.md +209 -0
- package/dist/bin/analyzerjs.js +33 -5
- package/dist/bin/analyzerjs.js.map +1 -1
- package/dist/bin/candumpjs.js +41 -6
- package/dist/bin/candumpjs.js.map +1 -1
- package/dist/fromPgn.d.ts +1 -0
- package/dist/fromPgn.d.ts.map +1 -1
- package/dist/fromPgn.js +61 -23
- package/dist/fromPgn.js.map +1 -1
- package/package.json +3 -3
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -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
|
package/dist/bin/analyzerjs.js
CHANGED
|
@@ -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
|
-
|
|
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":";;;;;;AAGA,wCAAmC;AACnC,wDAA+B;AAC/B,wDAA+B;AAC/B,mCAAsC;AACtC,4CAAmB;
|
|
1
|
+
{"version":3,"file":"analyzerjs.js","sourceRoot":"","sources":["../../lib/bin/analyzerjs.ts"],"names":[],"mappings":";;;;;;AAGA,wCAAmC;AACnC,wDAA+B;AAC/B,wDAA+B;AAC/B,mCAAsC;AACtC,4CAAmB;AACnB,gDAAuB;AAEvB,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IAC3C,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IACrD,OAAO,EAAE;QACP,GAAG;QACH,GAAG;QACH,OAAO;QACP,cAAc;QACd,kBAAkB;QAClB,qBAAqB;QACrB,QAAQ;QACR,eAAe;QACf,WAAW;QACX,IAAI;QACJ,WAAW;KACZ;CACF,CAAC,CAAA;AAEF,IAAA,oBAAY,EAAC,IAAI,CAAC,CAAA;AAElB,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACjB,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;iDAoBQ,CAAC,CAAA;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,IAAI,MAAM,GAAuB,SAAS,CAAA;AAC1C,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;IACtB,MAAM,GAAG,CAAC,CAAA;AACZ,CAAC;KAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB,MAAM,GAAG,CAAC,CAAA;AACZ,CAAC;AACD,IAAI,UAAU,GAAQ,IAAI,CAAC,KAAK,CAAC,CAAA;AACjC,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAA;AAEhD,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;IACpE,UAAU,GAAG,CAAC,UAAU,CAAC,CAAA;AAC3B,CAAC;AAED,IAAI,UAAU,GAAQ,IAAI,CAAC,KAAK,CAAC,CAAA;AACjC,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;IACpE,UAAU,GAAG,CAAC,UAAU,CAAC,CAAA;AAC3B,CAAC;AAED,IAAI,UAAU,GAAQ,IAAI,CAAC,KAAK,CAAC,CAAA;AACjC,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;IACpE,UAAU,GAAG,CAAC,UAAU,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,gBAAM,CAAC;IACxB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI;IAC/B,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI;IACrC,qBAAqB,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI;IACzC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;IACvB,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC;IACpC,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC;IAC1C,MAAM;CACP,CAAC,CAAA;AAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAQ,EAAE,KAAU,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAQ,EAAE,KAAU,EAAE,EAAE;IAC5C,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAA;IACtD,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,EAAE,CAAA;AACN,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;AACzB,IAAI,IAAI,EAAE,CAAC;IACT,MAAM,UAAU,GAAG,YAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAC5C,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QAC5B,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,QAAQ,CAAC,oEAAoE;KACzF,CAAC,CAAA;AACJ,CAAC;KAAM,CAAC;IACN,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAA;AACJ,CAAC;AAED,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;IAC7B,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAM;IACR,CAAC;IACD,IAAI,GAAoB,CAAA;IACxB,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5B,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC;IAED,IACE,GAAG;QACH,CAAC,UAAU,KAAK,SAAS;YACvB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,UAAU,KAAK,SAAS;YACvB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,UAAU,KAAK,SAAS;YACvB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EACxD,CAAC;QACD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,YAAY,GACf,GAAW,CAAC,MAAM,CAAC,gBAAgB;gBACnC,GAAW,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC1C,IAAI,YAAY,KAAK,mBAAmB,EAAE,CAAC;gBACzC,OAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CACT,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE;gBAChB,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;gBACzB,WAAW,EAAE,CAAC;aACf,CAAC,CACH,CAAA;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAA"}
|
package/dist/bin/candumpjs.js
CHANGED
|
@@ -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: [
|
|
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
|
-
|
|
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":";;;;;;AAEA,oCAAkC;AAClC,oCAAqC;AACrC,wDAA+B;AAC/B,4CAA6C;AAC7C,mCAAsC;
|
|
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;
|
package/dist/fromPgn.d.ts.map
CHANGED
|
@@ -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;
|
|
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 (
|
|
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
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
|
|
592
|
-
|
|
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
|
-
|
|
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
|
-
|
|
653
|
-
|
|
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,13 +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
778
|
bitLength = bs.bitsLeft < bitLength ? bs.bitsLeft : bitLength;
|
|
742
779
|
const data = bs.readArrayBuffer(Math.floor(bitLength / 8));
|
|
743
|
-
return (0, utilities_1.byteString)(Buffer.from(data), ' ');
|
|
780
|
+
return [(0, utilities_1.byteString)(Buffer.from(data), ' '), undefined];
|
|
744
781
|
}
|
|
745
782
|
else if (bitLength === 8) {
|
|
746
783
|
if (field.Signed) {
|
|
@@ -816,7 +853,7 @@ function readValue(definition, options, pgn, field, bs, fields, bitLength = unde
|
|
|
816
853
|
if (bs.bitsLeft < bitLength) {
|
|
817
854
|
bitLength = bs.bitsLeft;
|
|
818
855
|
if (bitLength === undefined) {
|
|
819
|
-
return null;
|
|
856
|
+
return [null, undefined];
|
|
820
857
|
}
|
|
821
858
|
}
|
|
822
859
|
value = bs.readArrayBuffer(bitLength / 8); //, field.Signed)
|
|
@@ -828,14 +865,14 @@ function readValue(definition, options, pgn, field, bs, fields, bitLength = unde
|
|
|
828
865
|
}, arr)
|
|
829
866
|
.map((x) => (x.length === 1 ? '0' + x : x))
|
|
830
867
|
.join(' ');
|
|
831
|
-
return value;
|
|
868
|
+
return [value, undefined];
|
|
832
869
|
}
|
|
833
870
|
if (value != null &&
|
|
834
871
|
typeof value !== 'undefined' &&
|
|
835
872
|
typeof value !== 'number') {
|
|
836
873
|
value = Number(value);
|
|
837
874
|
}
|
|
838
|
-
return value;
|
|
875
|
+
return [value, undefined];
|
|
839
876
|
}
|
|
840
877
|
}
|
|
841
878
|
function isMax(numBits, value, signed) {
|
|
@@ -862,19 +899,20 @@ function readVariableLengthField(definition, options, pgn, field, bs) {
|
|
|
862
899
|
try {
|
|
863
900
|
const refField = getField(pgn.fields.pgn || pgn.fields.PGN, bs.view.buffer[bs.byteIndex - 1] - 1, pgn);
|
|
864
901
|
if (refField) {
|
|
865
|
-
const res = readField(definition, options,
|
|
902
|
+
const [res] = readField(definition, options, true, pgn, refField, bs);
|
|
866
903
|
if (refField.BitLength !== undefined) {
|
|
867
904
|
const bits = (refField.BitLength + 7) & ~7; // Round # of bits in field refField up to complete bytes: 1->8, 7->8, 8->8 etc.
|
|
868
905
|
if (bits > refField.BitLength) {
|
|
869
906
|
bs.readBits(bits - refField.BitLength, false);
|
|
870
907
|
}
|
|
871
908
|
}
|
|
872
|
-
return res;
|
|
909
|
+
return [res, refField];
|
|
873
910
|
}
|
|
874
911
|
}
|
|
875
912
|
catch (error) {
|
|
876
913
|
debug(error);
|
|
877
914
|
}
|
|
915
|
+
return [null, undefined];
|
|
878
916
|
}
|
|
879
917
|
fieldTypeReaders['STRING_LAU'
|
|
880
918
|
//'ASCII or UNICODE string starting with length and control byte'
|