@canboat/canboatjs 1.21.1 → 1.22.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/README.md +2 -2
- package/lib/candevice.js +2 -2
- package/lib/codes.test.js +2 -0
- package/lib/codesMfgs.json +1 -0
- package/lib/fromPgn.js +20 -13
- package/lib/simpleCan.js +2 -2
- package/lib/stringMsg.js +16 -7
- package/lib/stringMsg.test.js +2 -1
- package/package.json +1 -1
- package/ios_canboat.js +0 -26
package/README.md
CHANGED
|
@@ -205,9 +205,9 @@ Output: `!PDGY,127245,255,/Pj/f/9///8=`
|
|
|
205
205
|
## Generate YDGW-02 format from canboat json
|
|
206
206
|
|
|
207
207
|
```js
|
|
208
|
-
const
|
|
208
|
+
const pgnToYdgwRawFormat = require("./index").pgnToYdgwRawFormat;
|
|
209
209
|
|
|
210
|
-
const array =
|
|
210
|
+
const array = pgnToYdgwRawFormat({
|
|
211
211
|
src: 127,
|
|
212
212
|
prio: 3,
|
|
213
213
|
dst: 255,
|
package/lib/candevice.js
CHANGED
|
@@ -177,7 +177,7 @@ function handleGroupFunction(device, n2kMsg) {
|
|
|
177
177
|
const acknowledgement = {
|
|
178
178
|
pgn: 126208,
|
|
179
179
|
dst: n2kMsg.src,
|
|
180
|
-
"Function Code":
|
|
180
|
+
"Function Code": 2,
|
|
181
181
|
"PGN": n2kMsg.fields.PGN,
|
|
182
182
|
"PGN error code": 4,
|
|
183
183
|
"Transmission interval/Priority error code": 0,
|
|
@@ -195,7 +195,7 @@ function handleGroupFunction(device, n2kMsg) {
|
|
|
195
195
|
const acknowledgement = {
|
|
196
196
|
pgn: 126208,
|
|
197
197
|
dst: n2kMsg.src,
|
|
198
|
-
"Function Code":
|
|
198
|
+
"Function Code": 2,
|
|
199
199
|
"PGN": n2kMsg.fields.PGN,
|
|
200
200
|
"PGN error code": 4,
|
|
201
201
|
"Transmission interval/Priority error code": 0,
|
package/lib/codes.test.js
CHANGED
|
@@ -4,6 +4,7 @@ describe('getManufacturerCode', () => {
|
|
|
4
4
|
test('Return mfg number from name string', () => {
|
|
5
5
|
expect(getManufacturerCode('Furuno')).toBe(1855)
|
|
6
6
|
expect(getManufacturerCode('Yacht Devices')).toBe(717)
|
|
7
|
+
expect(getManufacturerCode('TJC Micro')).toBe(963)
|
|
7
8
|
})
|
|
8
9
|
})
|
|
9
10
|
|
|
@@ -11,5 +12,6 @@ describe('getManufacturerName', () => {
|
|
|
11
12
|
test('Return name string from mfg number', () => {
|
|
12
13
|
expect(getManufacturerName(1855)).toBe('Furuno')
|
|
13
14
|
expect(getManufacturerName(717)).toBe('Yacht Devices')
|
|
15
|
+
expect(getManufacturerName(963)).toBe('TJC Micro')
|
|
14
16
|
})
|
|
15
17
|
})
|
package/lib/codesMfgs.json
CHANGED
package/lib/fromPgn.js
CHANGED
|
@@ -111,14 +111,13 @@ class Parser extends EventEmitter {
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
trace(`${pgn.pgn} ${len} ${pgnData.Length} ${pgnData.RepeatingFields} ${couldBeMulti}`)
|
|
114
|
-
if ( len > 0x8 || (this.format == FORMAT_FAST && !this.mixedFormat) ) {
|
|
115
|
-
//if ( (len > 0x8 || pgnData.Type === 'Fast') && coalesced ) {
|
|
114
|
+
if ( coalesced || len > 0x8 || (this.format == FORMAT_FAST && !this.mixedFormat) ) {
|
|
116
115
|
this.format = FORMAT_FAST
|
|
117
116
|
if ( sourceString ) {
|
|
118
117
|
pgn.input = [ sourceString ]
|
|
119
118
|
}
|
|
120
|
-
} else if ( pgnData.Length > 0x8 || (len == 0x8 && (pgnData.RepeatingFields || couldBeMulti))) {
|
|
121
|
-
|
|
119
|
+
//} else if ( pgnData.Length > 0x8 || (len == 0x8 && (pgnData.RepeatingFields || couldBeMulti))) {
|
|
120
|
+
} else if ( pgnData.Type === 'Fast' ) {
|
|
122
121
|
//partial packet
|
|
123
122
|
this.format = FORMAT_PLAIN
|
|
124
123
|
|
|
@@ -156,9 +155,6 @@ class Parser extends EventEmitter {
|
|
|
156
155
|
bs.view.buffer.copy(packet.buffer, 0, FASTPACKET_BUCKET_0_OFFSET, 8)
|
|
157
156
|
trace(`${pgn.pgn} targetStart: 0 sourceStart: ${FASTPACKET_BUCKET_0_OFFSET}`)
|
|
158
157
|
} else {
|
|
159
|
-
if ( sourceString ) {
|
|
160
|
-
packet.src.push(sourceString)
|
|
161
|
-
}
|
|
162
158
|
if (packet.lastPacket + 1 != packetIndex) {
|
|
163
159
|
debug(`PGN ${pgn.pgn} malformed packet for ${pgn.src} received; expected ${packet.lastPacket+1} but got ${packetIndex}`)
|
|
164
160
|
cb && cb(`Could not parse ${JSON.stringify(pgn)}`)
|
|
@@ -520,17 +516,26 @@ function readField(options, runPostProcessor, pgn, field, bs) {
|
|
|
520
516
|
if ( field.Resolution && typeof value === 'number' ) {
|
|
521
517
|
var resolution = field.Resolution
|
|
522
518
|
|
|
519
|
+
if ( _.isString(resolution) ) {
|
|
520
|
+
resolution = Number.parseFloat(resolution)
|
|
521
|
+
}
|
|
522
|
+
|
|
523
523
|
value = (value * resolution)
|
|
524
|
+
|
|
525
|
+
let precision = 0;
|
|
526
|
+
for (let r = resolution; (r > 0.0) && (r < 1.0); r = r * 10.0)
|
|
527
|
+
{
|
|
528
|
+
precision++;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
value = Number.parseFloat(value.toFixed(precision))
|
|
524
532
|
|
|
533
|
+
/*
|
|
525
534
|
if ( resolution === 3.125e-8 ) {
|
|
526
535
|
//yes. hack.
|
|
527
536
|
resolution = "0.0000000001"
|
|
528
537
|
}
|
|
529
|
-
|
|
530
|
-
if ( _.isString(resolution) &&
|
|
531
|
-
resolution.indexOf('.') != -1 ) {
|
|
532
|
-
value = Number.parseFloat(value.toFixed(resolution.length-2))
|
|
533
|
-
}
|
|
538
|
+
*/
|
|
534
539
|
}
|
|
535
540
|
|
|
536
541
|
if (field.EnumValues &&
|
|
@@ -708,7 +713,9 @@ fieldTypeReaders['ASCII string starting with length byte'] = (pgn, field, bs) =>
|
|
|
708
713
|
fieldTypeReaders["String with start/stop byte"] = (pgn, field, bs) => {
|
|
709
714
|
var len
|
|
710
715
|
var first = bs.readUint8()
|
|
711
|
-
if ( first ==
|
|
716
|
+
if ( first == 0xff ) { // no name, stop reading
|
|
717
|
+
return ''
|
|
718
|
+
} else if ( first == 0x02 ) {
|
|
712
719
|
var buf = Buffer.alloc(255)
|
|
713
720
|
var c
|
|
714
721
|
var idx = 0
|
package/lib/simpleCan.js
CHANGED
|
@@ -27,9 +27,9 @@ SimpleCan.prototype.start = function () {
|
|
|
27
27
|
|
|
28
28
|
pgn.timestamp = new Date().toISOString()
|
|
29
29
|
if ( this.plainText ) {
|
|
30
|
-
messageCb(binToActisense(pgn, msg.data, msg.data.length))
|
|
30
|
+
this.messageCb(binToActisense(pgn, msg.data, msg.data.length))
|
|
31
31
|
} else {
|
|
32
|
-
messageCb({ pgn, length: msg.data.length, data: msg.data })
|
|
32
|
+
this.messageCb({ pgn, length: msg.data.length, data: msg.data })
|
|
33
33
|
}
|
|
34
34
|
})
|
|
35
35
|
}
|
package/lib/stringMsg.js
CHANGED
|
@@ -49,7 +49,7 @@ exports.parseActisense = (input) => {
|
|
|
49
49
|
buildCanId(prio, pgn, dst, src),
|
|
50
50
|
'Actisense',
|
|
51
51
|
Buffer.from(data.join(''), 'hex'),
|
|
52
|
-
{ len: Number(len), timestamp
|
|
52
|
+
{ len: Number(len), timestamp },
|
|
53
53
|
)
|
|
54
54
|
}
|
|
55
55
|
exports.encodeActisense = ({
|
|
@@ -153,12 +153,21 @@ exports.encodeMXPGN = ({ prefix = '$MXPGN', pgn, prio, src, data }) => {
|
|
|
153
153
|
exports.isPDGY = startsWith('!PDGY,')
|
|
154
154
|
exports.parsePDGY = (input) => {
|
|
155
155
|
const parts = input.split(',')
|
|
156
|
-
if ( parts.length
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
156
|
+
if ( parts.length === 7 ) {
|
|
157
|
+
const [ prefix, pgn, prio, src, dst, timer, data ] = parts
|
|
158
|
+
return buildMsg(
|
|
159
|
+
buildCanId(prio, pgn, dst, src), 'PDGY', Buffer.from(data, 'base64'),
|
|
160
|
+
{ timer: Number(timer), prefix, coalesced: true },
|
|
161
|
+
)
|
|
162
|
+
} else if ( parts.length === 4 ) {
|
|
163
|
+
const [ prefix, pgn, dst, data ] = parts
|
|
164
|
+
return buildMsg(
|
|
165
|
+
buildCanId(0, pgn, dst, 0), 'PDGY', Buffer.from(data, 'base64'),
|
|
166
|
+
{ coalesced: true }
|
|
167
|
+
)
|
|
168
|
+
} else {
|
|
169
|
+
return buildErr('iKonvert', 'Invalid parts.', input)
|
|
170
|
+
}
|
|
162
171
|
}
|
|
163
172
|
exports.encodePDGY = ({ prefix = '!PDGY', pgn, data, dst = 255}) => (
|
|
164
173
|
[ prefix, pgn, dst, data.toString('base64')].join(',')
|
package/lib/stringMsg.test.js
CHANGED
|
@@ -65,7 +65,6 @@ describe('parseActisense', () => {
|
|
|
65
65
|
test('basic msg', () => {
|
|
66
66
|
const msg = '2016-04-09T16:41:09.078Z,3,127257,17,255,8,00,ff,7f,52,00,21,fe,ff'
|
|
67
67
|
expect(parseActisense(msg)).toEqual({
|
|
68
|
-
coalesced: true,
|
|
69
68
|
data: Buffer.from('00ff7f520021feff', 'hex'),
|
|
70
69
|
dst: 255,
|
|
71
70
|
len: 8,
|
|
@@ -99,6 +98,7 @@ describe('parsePDGY', () => {
|
|
|
99
98
|
prio: 3,
|
|
100
99
|
src: 2,
|
|
101
100
|
timer: 0.563,
|
|
101
|
+
coalesced: true
|
|
102
102
|
})
|
|
103
103
|
})
|
|
104
104
|
test('long msg', () => {
|
|
@@ -111,6 +111,7 @@ describe('parsePDGY', () => {
|
|
|
111
111
|
prio: 3,
|
|
112
112
|
src: 2,
|
|
113
113
|
timer: 483.236,
|
|
114
|
+
coalesced: true
|
|
114
115
|
})
|
|
115
116
|
})
|
|
116
117
|
})
|