@canboat/canboatjs 3.0.2 → 3.1.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/.github/workflows/test.yml +2 -2
- package/.github/workflows/test_canboat_changes.yml +91 -0
- package/.husky/pre-commit +4 -0
- package/.mocharc.js +7 -0
- package/.prettierrc.json +5 -0
- package/README.md +2 -7
- package/dist/actisense-serial.d.ts +17 -0
- package/dist/actisense-serial.d.ts.map +1 -0
- package/dist/actisense-serial.js +569 -0
- package/dist/actisense-serial.js.map +1 -0
- package/dist/bin/actisense-file.d.ts +3 -0
- package/dist/bin/actisense-file.d.ts.map +1 -0
- package/dist/bin/actisense-file.js +49 -0
- package/dist/bin/actisense-file.js.map +1 -0
- package/dist/bin/actisense-n2k-tcp.d.ts +3 -0
- package/dist/bin/actisense-n2k-tcp.d.ts.map +1 -0
- package/dist/bin/actisense-n2k-tcp.js +46 -0
- package/dist/bin/actisense-n2k-tcp.js.map +1 -0
- package/dist/bin/actisense-serialjs.d.ts +3 -0
- package/dist/bin/actisense-serialjs.d.ts.map +1 -0
- package/dist/bin/actisense-serialjs.js +51 -0
- package/dist/bin/actisense-serialjs.js.map +1 -0
- package/dist/bin/analyzerjs.d.ts +3 -0
- package/dist/bin/analyzerjs.d.ts.map +1 -0
- package/dist/bin/analyzerjs.js +61 -0
- package/dist/bin/analyzerjs.js.map +1 -0
- package/dist/bin/candumpanalyzerjs.d.ts +3 -0
- package/dist/bin/candumpanalyzerjs.d.ts.map +1 -0
- package/dist/bin/candumpanalyzerjs.js +31 -0
- package/dist/bin/candumpanalyzerjs.js.map +1 -0
- package/dist/bin/candumpjs.d.ts +3 -0
- package/dist/bin/candumpjs.d.ts.map +1 -0
- package/dist/bin/candumpjs.js +73 -0
- package/dist/bin/candumpjs.js.map +1 -0
- package/dist/bin/cansend.d.ts +3 -0
- package/dist/bin/cansend.d.ts.map +1 -0
- package/dist/bin/cansend.js +123 -0
- package/dist/bin/cansend.js.map +1 -0
- package/dist/bin/ikonvert-serial.d.ts +3 -0
- package/dist/bin/ikonvert-serial.d.ts.map +1 -0
- package/dist/bin/ikonvert-serial.js +36 -0
- package/dist/bin/ikonvert-serial.js.map +1 -0
- package/dist/bin/to-pgn.d.ts +3 -0
- package/dist/bin/to-pgn.d.ts.map +1 -0
- package/dist/bin/to-pgn.js +57 -0
- package/dist/bin/to-pgn.js.map +1 -0
- package/dist/canId.d.ts +21 -0
- package/dist/canId.d.ts.map +1 -0
- package/dist/canId.js +66 -0
- package/dist/canId.js.map +1 -0
- package/dist/canId.test.d.ts +2 -0
- package/dist/canId.test.d.ts.map +1 -0
- package/dist/canId.test.js +58 -0
- package/dist/canId.test.js.map +1 -0
- package/dist/canbus.d.ts +17 -0
- package/dist/canbus.d.ts.map +1 -0
- package/dist/canbus.js +261 -0
- package/dist/canbus.js.map +1 -0
- package/dist/candevice.d.ts +23 -0
- package/dist/candevice.d.ts.map +1 -0
- package/dist/candevice.js +38 -0
- package/dist/candevice.js.map +1 -0
- package/dist/codes.d.ts +2 -0
- package/dist/codes.d.ts.map +1 -0
- package/dist/codes.js +24 -0
- package/dist/codes.js.map +1 -0
- package/dist/discovery.d.ts +17 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +119 -0
- package/dist/discovery.js.map +1 -0
- package/dist/fromPgn.d.ts +51 -0
- package/dist/fromPgn.d.ts.map +1 -0
- package/dist/fromPgn.js +989 -0
- package/dist/fromPgn.js.map +1 -0
- package/dist/fromPgnStream.d.ts +17 -0
- package/dist/fromPgnStream.d.ts.map +1 -0
- package/dist/fromPgnStream.js +47 -0
- package/dist/fromPgnStream.js.map +1 -0
- package/dist/ikonvert.d.ts +17 -0
- package/dist/ikonvert.d.ts.map +1 -0
- package/dist/ikonvert.js +224 -0
- package/dist/ikonvert.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/n2k-actisense.d.ts +24 -0
- package/dist/n2k-actisense.d.ts.map +1 -0
- package/dist/n2k-actisense.js +126 -0
- package/dist/n2k-actisense.js.map +1 -0
- package/dist/n2k-actisense.test.d.ts +2 -0
- package/dist/n2k-actisense.test.d.ts.map +1 -0
- package/dist/n2k-actisense.test.js +49 -0
- package/dist/n2k-actisense.test.js.map +1 -0
- package/dist/n2kDevice.d.ts +40 -0
- package/dist/n2kDevice.d.ts.map +1 -0
- package/dist/n2kDevice.js +387 -0
- package/dist/n2kDevice.js.map +1 -0
- package/dist/ncanbus.d.ts +17 -0
- package/dist/ncanbus.d.ts.map +1 -0
- package/dist/ncanbus.js +92 -0
- package/dist/ncanbus.js.map +1 -0
- package/dist/pgns.d.ts +22 -0
- package/dist/pgns.d.ts.map +1 -0
- package/dist/pgns.js +157 -0
- package/dist/pgns.js.map +1 -0
- package/dist/pgns.test.d.ts +2 -0
- package/dist/pgns.test.d.ts.map +1 -0
- package/dist/pgns.test.js +14 -0
- package/dist/pgns.test.js.map +1 -0
- package/dist/simpleCan.d.ts +17 -0
- package/dist/simpleCan.d.ts.map +1 -0
- package/dist/simpleCan.js +125 -0
- package/dist/simpleCan.js.map +1 -0
- package/dist/stringMsg.d.ts +33 -0
- package/dist/stringMsg.d.ts.map +1 -0
- package/dist/stringMsg.js +359 -0
- package/dist/stringMsg.js.map +1 -0
- package/dist/stringMsg.test.d.ts +2 -0
- package/dist/stringMsg.test.d.ts.map +1 -0
- package/dist/stringMsg.test.js +244 -0
- package/dist/stringMsg.test.js.map +1 -0
- package/dist/toPgn.d.ts +34 -0
- package/dist/toPgn.d.ts.map +1 -0
- package/dist/toPgn.js +500 -0
- package/dist/toPgn.js.map +1 -0
- package/dist/utilities.d.ts +26 -0
- package/dist/utilities.d.ts.map +1 -0
- package/dist/utilities.js +112 -0
- package/dist/utilities.js.map +1 -0
- package/dist/utilities.test.d.ts +2 -0
- package/dist/utilities.test.d.ts.map +1 -0
- package/dist/utilities.test.js +9 -0
- package/dist/utilities.test.js.map +1 -0
- package/dist/venus-mqtt.d.ts +11 -0
- package/dist/venus-mqtt.d.ts.map +1 -0
- package/dist/venus-mqtt.js +100 -0
- package/dist/venus-mqtt.js.map +1 -0
- package/dist/venus.d.ts +11 -0
- package/dist/venus.d.ts.map +1 -0
- package/dist/venus.js +71 -0
- package/dist/venus.js.map +1 -0
- package/dist/w2k01.d.ts +17 -0
- package/dist/w2k01.d.ts.map +1 -0
- package/dist/w2k01.js +119 -0
- package/dist/w2k01.js.map +1 -0
- package/dist/yddevice.d.ts +25 -0
- package/dist/yddevice.d.ts.map +1 -0
- package/dist/yddevice.js +45 -0
- package/dist/yddevice.js.map +1 -0
- package/dist/ydgw02.d.ts +17 -0
- package/dist/ydgw02.d.ts.map +1 -0
- package/dist/ydgw02.js +163 -0
- package/dist/ydgw02.js.map +1 -0
- package/dist/ydvr.d.ts +17 -0
- package/dist/ydvr.d.ts.map +1 -0
- package/dist/ydvr.js +120 -0
- package/dist/ydvr.js.map +1 -0
- package/eslint.config.js +58 -0
- package/jest.config.js +5 -0
- package/lib/actisense-serial.ts +644 -0
- package/lib/bin/actisense-file.ts +53 -0
- package/lib/bin/actisense-n2k-tcp.ts +50 -0
- package/lib/bin/actisense-serialjs.ts +55 -0
- package/{bin/analyzerjs → lib/bin/analyzerjs.ts} +16 -15
- package/{bin/candumpjs → lib/bin/candumpjs.ts} +19 -20
- package/lib/bin/cansend.ts +131 -0
- package/lib/bin/ikonvert-serial.ts +44 -0
- package/{bin/to-pgn → lib/bin/to-pgn.ts} +23 -17
- package/lib/bin/ydvr-file +33 -0
- package/lib/canId.test.js +35 -15
- package/lib/canId.ts +84 -0
- package/lib/canbus.ts +293 -0
- package/lib/{candevice.js → candevice.ts} +14 -21
- package/lib/codes.ts +21 -0
- package/lib/{discovery.js → discovery.ts} +32 -30
- package/lib/fromPgn.ts +1207 -0
- package/lib/{fromPgnStream.js → fromPgnStream.ts} +17 -12
- package/lib/{ikonvert.js → ikonvert.ts} +90 -85
- package/lib/index.ts +48 -0
- package/lib/n2k-actisense.test.js +31 -32
- package/lib/n2k-actisense.ts +152 -0
- package/lib/n2kDevice.ts +458 -0
- package/lib/pgns.test.ts +12 -0
- package/lib/pgns.ts +191 -0
- package/lib/simpleCan.ts +140 -0
- package/lib/stringMsg.test.js +58 -41
- package/lib/stringMsg.ts +464 -0
- package/lib/toPgn.ts +597 -0
- package/lib/{utilities.js → utilities.ts} +48 -37
- package/lib/venus-mqtt.js +69 -73
- package/lib/venus.js +8 -8
- package/lib/{w2k01.js → w2k01.ts} +57 -44
- package/lib/{yddevice.js → yddevice.ts} +18 -13
- package/lib/{ydgw02.js → ydgw02.ts} +55 -47
- package/lib/ydvr.js +65 -147
- package/package.json +54 -18
- package/tsconfig.json +19 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/bin/actisense-file +0 -47
- package/bin/actisense-n2k-tcp +0 -45
- package/bin/actisense-serialjs +0 -52
- package/bin/candumpanalyzerjs +0 -29
- package/bin/cansend +0 -130
- package/bin/ikonvert-serial +0 -50
- package/bin/ydgw-analyzerjs +0 -36
- package/bin/ydvr-file +0 -33
- package/index.js +0 -53
- package/lib/canId.js +0 -64
- package/lib/canbus.js +0 -278
- package/lib/codes.js +0 -69
- package/lib/codes.test.js +0 -17
- package/lib/codesMfgs.json +0 -166
- package/lib/fromPgn.js +0 -1027
- package/lib/n2k-actisense.js +0 -108
- package/lib/n2kDevice.js +0 -390
- package/lib/pgns.js +0 -196
- package/lib/pgns.test.js +0 -13
- package/lib/serial.js +0 -647
- package/lib/simpleCan.js +0 -105
- package/lib/stringMsg.js +0 -339
- package/lib/toPgn.js +0 -518
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2025 Scott Bender <scott@scottbender.net>
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.encodeN2KActisense = exports.readN2KActisense = void 0;
|
|
19
|
+
const utilities_1 = require("./utilities");
|
|
20
|
+
const canId_1 = require("./canId");
|
|
21
|
+
const bit_buffer_1 = require("bit-buffer");
|
|
22
|
+
const utilities_2 = require("./utilities");
|
|
23
|
+
const debug = (0, utilities_1.createDebug)('canboatjs:w2k01');
|
|
24
|
+
const debugData = (0, utilities_1.createDebug)('canboatjs:w2k01-data');
|
|
25
|
+
const readN2KActisense = (data, plainText, context, cb) => {
|
|
26
|
+
const inBuf = Buffer.from(data);
|
|
27
|
+
let inOffset = 0;
|
|
28
|
+
let last;
|
|
29
|
+
if (debugData.enabled) {
|
|
30
|
+
debugData('Received: (' + data.length + ') ' + Buffer.from(data).toString('hex'));
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
while (true) {
|
|
34
|
+
const len = inBuf.readUInt16LE(inOffset + 3);
|
|
35
|
+
if (inBuf.length < inOffset + 5 + len) {
|
|
36
|
+
/*
|
|
37
|
+
I've never seen this happen
|
|
38
|
+
context.lastChunk = Buffer.alloc(inBuf.length - inOffset)
|
|
39
|
+
inBuf.copy(context.lastChunk, 0, inOffset, inBuf.length-1)
|
|
40
|
+
*/
|
|
41
|
+
if (debug.enabled) {
|
|
42
|
+
debug('incomplete packet: (' +
|
|
43
|
+
len +
|
|
44
|
+
') ' +
|
|
45
|
+
inBuf.toString('hex', inOffset));
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
else if (inBuf[inOffset + 5 + len - 1] != 0x03 ||
|
|
50
|
+
inBuf[inOffset + 5 + len - 2] != 0x10) {
|
|
51
|
+
if (debug.enabled) {
|
|
52
|
+
debug('bad packet: (' + len + ') ' + inBuf.toString('hex', inOffset));
|
|
53
|
+
}
|
|
54
|
+
//context.lastChunk = null
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const buf = Buffer.alloc(len);
|
|
58
|
+
inBuf.copy(buf, 0, inOffset + 5, inOffset + len + 5);
|
|
59
|
+
//console.log('NextBuf: (' + buf.length + ') ' + buf.toString('hex'))
|
|
60
|
+
let offset = 0;
|
|
61
|
+
const _dst = buf.readUInt8(offset);
|
|
62
|
+
offset += 1;
|
|
63
|
+
const canid = buf.readUInt32LE(offset);
|
|
64
|
+
offset += 4;
|
|
65
|
+
const _timestamp = buf.readUInt32LE(offset);
|
|
66
|
+
offset += 4;
|
|
67
|
+
const _mhs = buf.readUInt8(offset);
|
|
68
|
+
offset += 1;
|
|
69
|
+
const info = (0, canId_1.parseCanId)(canid);
|
|
70
|
+
//console.log(`${len} ${mhs} ${dst} (${info.src}, ${info.dst}) ${info.pgn} ${timestamp}`)
|
|
71
|
+
const pgnData = Buffer.alloc(len - offset - 3);
|
|
72
|
+
buf.copy(pgnData, 0, offset, len - 3);
|
|
73
|
+
const timestamp = new Date().toISOString();
|
|
74
|
+
if (plainText) {
|
|
75
|
+
last = (0, utilities_2.binToActisense)(info, timestamp, pgnData, pgnData.length);
|
|
76
|
+
cb && cb(last);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
last = {
|
|
80
|
+
pgn: info,
|
|
81
|
+
length: pgnData.length,
|
|
82
|
+
data: pgnData,
|
|
83
|
+
coalesced: true
|
|
84
|
+
};
|
|
85
|
+
cb && cb(last);
|
|
86
|
+
}
|
|
87
|
+
inOffset += len + 5;
|
|
88
|
+
if (inOffset == inBuf.length) {
|
|
89
|
+
return last;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
debug(`[error] ${error}`);
|
|
95
|
+
//context.lastChunk = null
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
exports.readN2KActisense = readN2KActisense;
|
|
100
|
+
const encodeN2KActisense = (pgn, data) => {
|
|
101
|
+
const bs = new bit_buffer_1.BitStream(Buffer.alloc(18 + data.length));
|
|
102
|
+
bs.writeUint8(0x10); //BST Message ID
|
|
103
|
+
bs.writeUint8(0x02);
|
|
104
|
+
bs.writeUint8(0xd0);
|
|
105
|
+
bs.writeUint16(13 + data.length); //len
|
|
106
|
+
bs.writeUint8(pgn.dst);
|
|
107
|
+
bs.writeUint32((0, canId_1.encodeCanId)({
|
|
108
|
+
pgn: pgn.pgn,
|
|
109
|
+
src: pgn.src || 0,
|
|
110
|
+
prio: pgn.prio || 2,
|
|
111
|
+
dst: pgn.dst
|
|
112
|
+
}));
|
|
113
|
+
bs.writeUint32(0); //timestamp
|
|
114
|
+
bs.writeUint8(0); //mhs
|
|
115
|
+
data.copy(bs.view.buffer, bs.byteIndex, 0);
|
|
116
|
+
bs.byteIndex += data.length;
|
|
117
|
+
bs.writeUint8(0); // ??
|
|
118
|
+
bs.writeUint8(0x10);
|
|
119
|
+
bs.writeUint8(0x03);
|
|
120
|
+
if (debugData.enabled) {
|
|
121
|
+
debugData('encoded: ' + bs.view.buffer.toString('hex'));
|
|
122
|
+
}
|
|
123
|
+
return bs.view.buffer;
|
|
124
|
+
};
|
|
125
|
+
exports.encodeN2KActisense = encodeN2KActisense;
|
|
126
|
+
//# sourceMappingURL=n2k-actisense.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"n2k-actisense.js","sourceRoot":"","sources":["../lib/n2k-actisense.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"n2k-actisense.test.d.ts","sourceRoot":"","sources":["../lib/n2k-actisense.test.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const { readN2KActisense, encodeN2KActisense } = require('./n2k-actisense');
|
|
3
|
+
describe('readN2KActisense', () => {
|
|
4
|
+
test('basic msg', () => {
|
|
5
|
+
const buffer = Buffer.from('1002d01500ff0502f809004c86fe00fffccba56800ffff7310031002d01500ff0501f809004c86fe000d474717e2da69d29c1003', 'hex');
|
|
6
|
+
const res = readN2KActisense(buffer, false, {});
|
|
7
|
+
delete res.pgn.timestamp;
|
|
8
|
+
expect(res).toEqual({
|
|
9
|
+
coalesced: true,
|
|
10
|
+
data: Buffer.from('0d474717e2da69d2', 'hex'),
|
|
11
|
+
length: 8,
|
|
12
|
+
pgn: {
|
|
13
|
+
canId: 167248133,
|
|
14
|
+
dst: 255,
|
|
15
|
+
pgn: 129025,
|
|
16
|
+
prio: 2,
|
|
17
|
+
src: 5
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('encodeN2KActisense', () => {
|
|
23
|
+
test('basic msg', () => {
|
|
24
|
+
const expected = '1002d01500ff0501f80900000000000d474717e2da69d2001003';
|
|
25
|
+
const pgn = {
|
|
26
|
+
dst: 255,
|
|
27
|
+
pgn: 129025,
|
|
28
|
+
prio: 2,
|
|
29
|
+
src: 5
|
|
30
|
+
};
|
|
31
|
+
const encoded = encodeN2KActisense(pgn, Buffer.from('0d474717e2da69d2', 'hex'));
|
|
32
|
+
expect(encoded).toEqual(Buffer.from(expected, 'hex'));
|
|
33
|
+
const read = readN2KActisense(encoded, false, {});
|
|
34
|
+
delete read.pgn.timestamp;
|
|
35
|
+
expect(read).toEqual({
|
|
36
|
+
coalesced: true,
|
|
37
|
+
data: Buffer.from('0d474717e2da69d2', 'hex'),
|
|
38
|
+
length: 8,
|
|
39
|
+
pgn: {
|
|
40
|
+
canId: 167248133,
|
|
41
|
+
dst: 255,
|
|
42
|
+
pgn: 129025,
|
|
43
|
+
prio: 2,
|
|
44
|
+
src: 5
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=n2k-actisense.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"n2k-actisense.test.js","sourceRoot":"","sources":["../lib/n2k-actisense.test.js"],"names":[],"mappings":";AAAA,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAE3E,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,0GAA0G,EAC1G,KAAK,CACN,CAAA;QACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;QAC/C,OAAO,GAAG,CAAC,GAAG,CAAC,SAAS,CAAA;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YAClB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC;YAC5C,MAAM,EAAE,CAAC;YACT,GAAG,EAAE;gBACH,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,GAAG;gBACR,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,CAAC;gBACP,GAAG,EAAE,CAAC;aACP;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,QAAQ,GAAG,sDAAsD,CAAA;QACvE,MAAM,GAAG,GAAG;YACV,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,MAAM;YACX,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,CAAC;SACP,CAAA;QAED,MAAM,OAAO,GAAG,kBAAkB,CAChC,GAAG,EACH,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CACvC,CAAA;QACD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;QAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;QACjD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAA;QAEzB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC;YAC5C,MAAM,EAAE,CAAC;YACT,GAAG,EAAE;gBACH,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,GAAG;gBACR,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,CAAC;gBACP,GAAG,EAAE,CAAC;aACP;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 Scott Bender (scott@scottbender.net)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { PGN } from '@canboat/ts-pgns';
|
|
17
|
+
import { EventEmitter } from 'node:events';
|
|
18
|
+
export declare class N2kDevice extends EventEmitter {
|
|
19
|
+
addressClaim: any;
|
|
20
|
+
productInfo: any;
|
|
21
|
+
configurationInfo: any;
|
|
22
|
+
options: any;
|
|
23
|
+
address: number;
|
|
24
|
+
cansend: boolean;
|
|
25
|
+
foundConflict: boolean;
|
|
26
|
+
heartbeatCounter: number;
|
|
27
|
+
devices: any;
|
|
28
|
+
sentAvailable: boolean;
|
|
29
|
+
addressClaimDetectionTime: number;
|
|
30
|
+
transmitPGNs: number[];
|
|
31
|
+
addressClaimSentAt?: number;
|
|
32
|
+
addressClaimChecker?: any;
|
|
33
|
+
heartbeatInterval?: any;
|
|
34
|
+
constructor(options: any);
|
|
35
|
+
start(): void;
|
|
36
|
+
setStatus(msg: string): void;
|
|
37
|
+
n2kMessage(pgn: PGN): void;
|
|
38
|
+
sendPGN(_pgn: PGN, _src?: number | undefined): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=n2kDevice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"n2kDevice.d.ts","sourceRoot":"","sources":["../lib/n2kDevice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,GAAG,EAgBJ,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAW1C,qBAAa,SAAU,SAAQ,YAAY;IACzC,YAAY,EAAE,GAAG,CAAA;IACjB,WAAW,EAAE,GAAG,CAAA;IAChB,iBAAiB,EAAE,GAAG,CAAA;IACtB,OAAO,EAAE,GAAG,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,OAAO,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,GAAG,CAAA;IACZ,aAAa,EAAE,OAAO,CAAA;IACtB,yBAAyB,EAAE,MAAM,CAAA;IACjC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB,CAAC,EAAE,GAAG,CAAA;IACzB,iBAAiB,CAAC,EAAE,GAAG,CAAA;gBAEX,OAAO,EAAE,GAAG;IAwFxB,KAAK;IAOL,SAAS,CAAC,GAAG,EAAE,MAAM;IAMrB,UAAU,CAAC,GAAG,EAAE,GAAG;IA4BnB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,GAAE,MAAM,GAAG,SAAqB;CACxD"}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2025 Scott Bender (scott@scottbender.net)
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.N2kDevice = void 0;
|
|
22
|
+
const ts_pgns_1 = require("@canboat/ts-pgns");
|
|
23
|
+
const utilities_1 = require("./utilities");
|
|
24
|
+
const node_events_1 = require("node:events");
|
|
25
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
26
|
+
const int64_buffer_1 = require("int64-buffer");
|
|
27
|
+
const codes_1 = require("./codes");
|
|
28
|
+
const toPgn_1 = require("./toPgn");
|
|
29
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
30
|
+
const debug = (0, utilities_1.createDebug)('canboatjs:n2kdevice');
|
|
31
|
+
const deviceTransmitPGNs = [60928, 59904, 126996, 126464];
|
|
32
|
+
class N2kDevice extends node_events_1.EventEmitter {
|
|
33
|
+
addressClaim;
|
|
34
|
+
productInfo;
|
|
35
|
+
configurationInfo;
|
|
36
|
+
options;
|
|
37
|
+
address;
|
|
38
|
+
cansend;
|
|
39
|
+
foundConflict;
|
|
40
|
+
heartbeatCounter;
|
|
41
|
+
devices;
|
|
42
|
+
sentAvailable;
|
|
43
|
+
addressClaimDetectionTime;
|
|
44
|
+
transmitPGNs;
|
|
45
|
+
addressClaimSentAt;
|
|
46
|
+
addressClaimChecker;
|
|
47
|
+
heartbeatInterval;
|
|
48
|
+
constructor(options) {
|
|
49
|
+
super();
|
|
50
|
+
if (options.addressClaim) {
|
|
51
|
+
this.addressClaim = options.addressClaim;
|
|
52
|
+
this.addressClaim.pgn = 60928;
|
|
53
|
+
this.addressClaim.dst = 255;
|
|
54
|
+
this.addressClaim.prio = 6;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.addressClaim = {
|
|
58
|
+
pgn: 60928,
|
|
59
|
+
dst: 255,
|
|
60
|
+
prio: 6,
|
|
61
|
+
'Unique Number': 1263,
|
|
62
|
+
'Manufacturer Code': 999,
|
|
63
|
+
'Device Function': 130, // PC gateway
|
|
64
|
+
'Device Class': 25, // Inter/Intranetwork Device
|
|
65
|
+
'Device Instance Lower': 0,
|
|
66
|
+
'Device Instance Upper': 0,
|
|
67
|
+
'System Instance': 0,
|
|
68
|
+
'Industry Group': 4, // Marine
|
|
69
|
+
Reserved1: 1,
|
|
70
|
+
Reserved2: 2
|
|
71
|
+
};
|
|
72
|
+
this.addressClaim['Unique Number'] =
|
|
73
|
+
options.uniqueNumber || Math.floor(Math.random() * Math.floor(2097151));
|
|
74
|
+
}
|
|
75
|
+
const version = package_json_1.default ? package_json_1.default.version : '1.0';
|
|
76
|
+
if (options.productInfo) {
|
|
77
|
+
this.productInfo = options.productInfo;
|
|
78
|
+
this.productInfo.pgn = 126996;
|
|
79
|
+
this.productInfo.dst = 255;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.productInfo = {
|
|
83
|
+
pgn: 126996,
|
|
84
|
+
dst: 255,
|
|
85
|
+
'NMEA 2000 Version': 1300,
|
|
86
|
+
'Product Code': 667, // Just made up..
|
|
87
|
+
'Model ID': 'Signal K',
|
|
88
|
+
'Model Version': 'canboatjs',
|
|
89
|
+
'Model Serial Code': options.uniqueNumber
|
|
90
|
+
? options.uniqueNumber.toString()
|
|
91
|
+
: '000001',
|
|
92
|
+
'Certification Level': 0,
|
|
93
|
+
'Load Equivalency': 1
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
this.productInfo['Software Version Code'] = version;
|
|
97
|
+
if (options.serverVersion && options.serverUrl) {
|
|
98
|
+
this.configurationInfo = {
|
|
99
|
+
pgn: 126998,
|
|
100
|
+
dst: 255,
|
|
101
|
+
'Installation Description #1': options.serverUrl,
|
|
102
|
+
'Installation Description #2': options.serverDescription,
|
|
103
|
+
'Manufacturer Information': options.serverVersion
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
this.options = lodash_1.default.isUndefined(options) ? {} : options;
|
|
107
|
+
this.address = lodash_1.default.isUndefined(options.preferredAddress)
|
|
108
|
+
? 100
|
|
109
|
+
: options.preferredAddress;
|
|
110
|
+
this.cansend = false;
|
|
111
|
+
this.foundConflict = false;
|
|
112
|
+
this.heartbeatCounter = 0;
|
|
113
|
+
this.devices = {};
|
|
114
|
+
this.sentAvailable = false;
|
|
115
|
+
this.addressClaimDetectionTime =
|
|
116
|
+
options.addressClaimDetectionTime !== undefined
|
|
117
|
+
? options.addressClaimDetectionTime
|
|
118
|
+
: 5000;
|
|
119
|
+
if (!options.disableDefaultTransmitPGNs) {
|
|
120
|
+
this.transmitPGNs = lodash_1.default.union(deviceTransmitPGNs, codes_1.defaultTransmitPGNs);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.transmitPGNs = [...deviceTransmitPGNs];
|
|
124
|
+
}
|
|
125
|
+
if (this.options.transmitPGNs) {
|
|
126
|
+
this.transmitPGNs = lodash_1.default.union(this.transmitPGNs, this.options.transmitPGNs);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
start() {
|
|
130
|
+
sendISORequest(this, 60928, 254);
|
|
131
|
+
setTimeout(() => {
|
|
132
|
+
sendAddressClaim(this);
|
|
133
|
+
}, 1000);
|
|
134
|
+
}
|
|
135
|
+
setStatus(msg) {
|
|
136
|
+
if (this.options.app && this.options.app.setPluginStatus) {
|
|
137
|
+
this.options.app.setProviderStatus(this.options.providerId, msg);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
n2kMessage(pgn) {
|
|
141
|
+
if (pgn.dst == 255 || pgn.dst == this.address) {
|
|
142
|
+
try {
|
|
143
|
+
if (pgn.pgn == 59904) {
|
|
144
|
+
handleISORequest(this, pgn);
|
|
145
|
+
}
|
|
146
|
+
else if (pgn.pgn == 126208) {
|
|
147
|
+
handleGroupFunction(this, pgn);
|
|
148
|
+
}
|
|
149
|
+
else if (pgn.pgn == 60928) {
|
|
150
|
+
handleISOAddressClaim(this, pgn);
|
|
151
|
+
}
|
|
152
|
+
else if (pgn.pgn == 126996) {
|
|
153
|
+
handleProductInformation(this, pgn);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
console.error(err);
|
|
158
|
+
}
|
|
159
|
+
/*
|
|
160
|
+
var handler = this.handlers[pgn.pgn.toString()]
|
|
161
|
+
if ( pgn.dst == this.address )
|
|
162
|
+
debug(`handler ${handler}`)
|
|
163
|
+
if ( _.isFunction(handler) ) {
|
|
164
|
+
debug(`got handled PGN %j ${handled}`, pgn)
|
|
165
|
+
handler(pgn)
|
|
166
|
+
}
|
|
167
|
+
*/
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
sendPGN(_pgn, _src = undefined) { }
|
|
171
|
+
}
|
|
172
|
+
exports.N2kDevice = N2kDevice;
|
|
173
|
+
function handleISORequest(device, n2kMsg) {
|
|
174
|
+
debug('handleISORequest %j', n2kMsg);
|
|
175
|
+
const PGN = Number(n2kMsg.fields.pgn);
|
|
176
|
+
switch (PGN) {
|
|
177
|
+
case 126996: // Product Information request
|
|
178
|
+
sendProductInformation(device);
|
|
179
|
+
break;
|
|
180
|
+
case 126998: // Config Information request
|
|
181
|
+
sendConfigInformation(device);
|
|
182
|
+
break;
|
|
183
|
+
case 60928: // ISO address claim request
|
|
184
|
+
debug('sending address claim %j', device.addressClaim);
|
|
185
|
+
device.sendPGN(device.addressClaim);
|
|
186
|
+
break;
|
|
187
|
+
case 126464:
|
|
188
|
+
sendPGNList(device, n2kMsg.src);
|
|
189
|
+
break;
|
|
190
|
+
default:
|
|
191
|
+
if (!device.options.disableNAKs) {
|
|
192
|
+
debug(`Got unsupported ISO request for PGN ${PGN}. Sending NAK.`);
|
|
193
|
+
sendNAKAcknowledgement(device, n2kMsg.src, PGN);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function handleGroupFunction(device, n2kMsg) {
|
|
198
|
+
debug('handleGroupFunction %j', n2kMsg);
|
|
199
|
+
const functionCode = n2kMsg.fields.functionCode;
|
|
200
|
+
if (functionCode === 'Request') {
|
|
201
|
+
handleRequestGroupFunction(device, n2kMsg);
|
|
202
|
+
}
|
|
203
|
+
else if (functionCode === 'Command') {
|
|
204
|
+
handleCommandGroupFunction(device, n2kMsg);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
debug('Got unsupported Group Function PGN: %j', n2kMsg);
|
|
208
|
+
}
|
|
209
|
+
function handleRequestGroupFunction(device, n2kMsg) {
|
|
210
|
+
if (!device.options.disableNAKs) {
|
|
211
|
+
// We really don't support group function requests for any PGNs yet -> always respond with pgnErrorCode 1 = "PGN not supported"
|
|
212
|
+
const PGN = n2kMsg.fields.pgn;
|
|
213
|
+
debug("Sending 'PGN Not Supported' Group Function response for requested PGN", PGN);
|
|
214
|
+
const acknowledgement = {
|
|
215
|
+
pgn: 126208,
|
|
216
|
+
dst: n2kMsg.src,
|
|
217
|
+
fields: {
|
|
218
|
+
functionCode: ts_pgns_1.GroupFunction.Acknowledge,
|
|
219
|
+
pgn: PGN,
|
|
220
|
+
pgnErrorCode: ts_pgns_1.PgnErrorCode.NotSupported,
|
|
221
|
+
transmissionIntervalPriorityErrorCode: ts_pgns_1.TransmissionInterval.Acknowledge,
|
|
222
|
+
numberOfParameters: 0,
|
|
223
|
+
list: []
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
device.sendPGN(acknowledgement);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function handleCommandGroupFunction(device, n2kMsg) {
|
|
230
|
+
if (!device.options.disableNAKs) {
|
|
231
|
+
// We really don't support group function commands for any PGNs yet -> always respond with pgnErrorCode 1 = "PGN not supported"
|
|
232
|
+
const PGN = n2kMsg.fields.pgn;
|
|
233
|
+
debug("Sending 'PGN Not Supported' Group Function response for commanded PGN", PGN);
|
|
234
|
+
const acknowledgement = {
|
|
235
|
+
pgn: 126208,
|
|
236
|
+
dst: n2kMsg.src,
|
|
237
|
+
fields: {
|
|
238
|
+
functionCode: ts_pgns_1.GroupFunction.Acknowledge,
|
|
239
|
+
pgn: PGN,
|
|
240
|
+
pgnErrorCode: ts_pgns_1.PgnErrorCode.NotSupported,
|
|
241
|
+
transmissionIntervalPriorityErrorCode: ts_pgns_1.TransmissionInterval.Acknowledge,
|
|
242
|
+
numberOfParameters: 0,
|
|
243
|
+
list: []
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
device.sendPGN(acknowledgement);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
function handleISOAddressClaim(device, n2kMsg) {
|
|
251
|
+
if (n2kMsg.src != device.address) {
|
|
252
|
+
if (!device.devices[n2kMsg.src]) {
|
|
253
|
+
debug(`registering device ${n2kMsg.src}`);
|
|
254
|
+
device.devices[n2kMsg.src] = { addressClaim: n2kMsg };
|
|
255
|
+
if (device.cansend) {
|
|
256
|
+
//sendISORequest(device, 126996, undefined, n2kMsg.src)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
debug('Checking ISO address claim. %j', n2kMsg);
|
|
262
|
+
const uint64ValueFromReceivedClaim = getISOAddressClaimAsUint64(n2kMsg);
|
|
263
|
+
const uint64ValueFromOurOwnClaim = getISOAddressClaimAsUint64(device.addressClaim);
|
|
264
|
+
if (uint64ValueFromOurOwnClaim < uint64ValueFromReceivedClaim) {
|
|
265
|
+
debug(`Address conflict detected! Kept our address as ${device.address}.`);
|
|
266
|
+
sendAddressClaim(device); // We have smaller address claim data -> we can keep our address -> re-claim it
|
|
267
|
+
}
|
|
268
|
+
else if (uint64ValueFromOurOwnClaim > uint64ValueFromReceivedClaim) {
|
|
269
|
+
device.foundConflict = true;
|
|
270
|
+
increaseOwnAddress(device); // We have bigger address claim data -> we have to change our address
|
|
271
|
+
debug(`Address conflict detected! trying address ${device.address}.`);
|
|
272
|
+
sendAddressClaim(device);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function increaseOwnAddress(device) {
|
|
276
|
+
const start = device.address;
|
|
277
|
+
do {
|
|
278
|
+
device.address = (device.address + 1) % 253;
|
|
279
|
+
} while (device.address != start && device.devices[device.address]);
|
|
280
|
+
}
|
|
281
|
+
function handleProductInformation(device, n2kMsg) {
|
|
282
|
+
if (!device.devices[n2kMsg.src]) {
|
|
283
|
+
device.devices[n2kMsg.src] = {};
|
|
284
|
+
}
|
|
285
|
+
debug('got product information %j', n2kMsg);
|
|
286
|
+
device.devices[n2kMsg.src].productInformation = n2kMsg;
|
|
287
|
+
}
|
|
288
|
+
function sendHeartbeat(device) {
|
|
289
|
+
device.heartbeatCounter = device.heartbeatCounter + 1;
|
|
290
|
+
if (device.heartbeatCounter > 252) {
|
|
291
|
+
device.heartbeatCounter = 0;
|
|
292
|
+
}
|
|
293
|
+
const hb = {
|
|
294
|
+
pgn: 126993,
|
|
295
|
+
dst: 255,
|
|
296
|
+
prio: 7,
|
|
297
|
+
fields: {
|
|
298
|
+
dataTransmitOffset: 60,
|
|
299
|
+
sequenceCounter: device.heartbeatCounter,
|
|
300
|
+
controller1State: ts_pgns_1.ControllerState.ErrorActive
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
device.sendPGN(hb);
|
|
304
|
+
}
|
|
305
|
+
function sendAddressClaim(device) {
|
|
306
|
+
if (device.devices[device.address]) {
|
|
307
|
+
//someone already has this address, so find a free one
|
|
308
|
+
increaseOwnAddress(device);
|
|
309
|
+
}
|
|
310
|
+
debug(`Sending address claim ${device.address}`);
|
|
311
|
+
device.sendPGN(device.addressClaim);
|
|
312
|
+
device.setStatus(`Claimed address ${device.address}`);
|
|
313
|
+
device.addressClaimSentAt = Date.now();
|
|
314
|
+
if (device.addressClaimChecker) {
|
|
315
|
+
clearTimeout(device.addressClaimChecker);
|
|
316
|
+
}
|
|
317
|
+
device.addressClaimChecker = setTimeout(() => {
|
|
318
|
+
//if ( Date.now() - device.addressClaimSentAt > 1000 ) {
|
|
319
|
+
//device.addressClaimChecker = null
|
|
320
|
+
debug('claimed address %d', device.address);
|
|
321
|
+
device.cansend = true;
|
|
322
|
+
if (!device.sentAvailable) {
|
|
323
|
+
if (device.options.app) {
|
|
324
|
+
device.options.app.emit('nmea2000OutAvailable');
|
|
325
|
+
}
|
|
326
|
+
device.emit('nmea2000OutAvailable');
|
|
327
|
+
device.sentAvailable = true;
|
|
328
|
+
}
|
|
329
|
+
sendISORequest(device, 126996);
|
|
330
|
+
if (!device.heartbeatInterval) {
|
|
331
|
+
device.heartbeatInterval = setInterval(() => {
|
|
332
|
+
sendHeartbeat(device);
|
|
333
|
+
}, 60 * 1000);
|
|
334
|
+
}
|
|
335
|
+
//}
|
|
336
|
+
}, device.addressClaimDetectionTime);
|
|
337
|
+
}
|
|
338
|
+
function sendISORequest(device, pgn, src = undefined, dst = 255) {
|
|
339
|
+
debug(`Sending iso request for ${pgn} to ${dst}`);
|
|
340
|
+
const isoRequest = {
|
|
341
|
+
pgn: 59904,
|
|
342
|
+
dst: dst,
|
|
343
|
+
fields: {
|
|
344
|
+
pgn
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
device.sendPGN(isoRequest, src);
|
|
348
|
+
}
|
|
349
|
+
function sendProductInformation(device) {
|
|
350
|
+
debug('Sending product info %j', device.productInfo);
|
|
351
|
+
device.sendPGN(device.productInfo);
|
|
352
|
+
}
|
|
353
|
+
function sendConfigInformation(device) {
|
|
354
|
+
if (device.configurationInfo) {
|
|
355
|
+
debug('Sending config info..');
|
|
356
|
+
device.sendPGN(device.configurationInfo);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function sendNAKAcknowledgement(device, src, requestedPGN) {
|
|
360
|
+
const acknowledgement = {
|
|
361
|
+
pgn: 59392,
|
|
362
|
+
dst: src,
|
|
363
|
+
fields: {
|
|
364
|
+
control: ts_pgns_1.IsoControl.Ack,
|
|
365
|
+
groupFunction: 255,
|
|
366
|
+
pgn: requestedPGN
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
device.sendPGN(acknowledgement);
|
|
370
|
+
}
|
|
371
|
+
function sendPGNList(device, dst) {
|
|
372
|
+
//FIXME: for now, adding everything that signalk-to-nmea2000 supports
|
|
373
|
+
//need a way for plugins, etc. to register the pgns they provide
|
|
374
|
+
const pgnList = {
|
|
375
|
+
pgn: 126464,
|
|
376
|
+
dst,
|
|
377
|
+
fields: {
|
|
378
|
+
functionCode: ts_pgns_1.PgnListFunction.TransmitPgnList,
|
|
379
|
+
list: device.transmitPGNs
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
device.sendPGN(pgnList);
|
|
383
|
+
}
|
|
384
|
+
function getISOAddressClaimAsUint64(pgn) {
|
|
385
|
+
return new int64_buffer_1.Uint64LE((0, toPgn_1.toPgn)(pgn));
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=n2kDevice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"n2kDevice.js","sourceRoot":"","sources":["../lib/n2kDevice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Transform } from 'stream';
|
|
2
|
+
export declare function CanbusStream(options: any): Canbus;
|
|
3
|
+
export declare class Canbus extends Transform {
|
|
4
|
+
plainText: boolean;
|
|
5
|
+
options: any;
|
|
6
|
+
setProviderStatus: any;
|
|
7
|
+
setProviderError: any;
|
|
8
|
+
socketcan: any;
|
|
9
|
+
noDataInterval: any;
|
|
10
|
+
channel: any;
|
|
11
|
+
lastDataReceived: number | undefined;
|
|
12
|
+
constructor(options: any);
|
|
13
|
+
start(): void;
|
|
14
|
+
connect(): boolean;
|
|
15
|
+
sendPGN(msg: any, force?: boolean): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ncanbus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ncanbus.d.ts","sourceRoot":"","sources":["../lib/ncanbus.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAWlC,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,UAExC;AAED,qBAAa,MAAO,SAAQ,SAAS;IACnC,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,GAAG,CAAA;IACZ,iBAAiB,EAAE,GAAG,CAAA;IACtB,gBAAgB,EAAE,GAAG,CAAA;IACrB,SAAS,EAAE,GAAG,CAAA;IACd,cAAc,EAAE,GAAG,CAAA;IACnB,OAAO,EAAE,GAAG,CAAA;IACZ,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;gBAExB,OAAO,EAAE,GAAG;IA2ExB,KAAK;IAEL,OAAO,IAAI,OAAO;IAIlB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,GAAE,OAAe;CACzC"}
|