@canboat/canboatjs 2.4.4 → 2.5.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/lib/fromPgn.js +32 -8
- package/lib/pgns.js +42 -0
- package/lib/toPgn.js +29 -9
- package/package.json +1 -1
package/lib/fromPgn.js
CHANGED
|
@@ -19,7 +19,7 @@ const trace = require('debug')('canboatjs:fromPgn:trace')
|
|
|
19
19
|
const EventEmitter = require('events')
|
|
20
20
|
const pkg = require('../package.json')
|
|
21
21
|
const _ = require('lodash')
|
|
22
|
-
const { pgns, getCustomPgn, addCustomPgns, lookupEnumerationName, lookupBitEnumerationName } = require('./pgns')
|
|
22
|
+
const { pgns, getCustomPgn, addCustomPgns, lookupEnumerationName, lookupFieldTypeEnumerationName, lookupBitEnumerationName, lookupFieldTypeEnumerationBits, lookupFieldTypeEnumerationValue } = require('./pgns')
|
|
23
23
|
const BitStream = require('bit-buffer').BitStream
|
|
24
24
|
const BitView = require('bit-buffer').BitView
|
|
25
25
|
const Int64LE = require('int64-buffer').Int64LE
|
|
@@ -212,7 +212,7 @@ class Parser extends EventEmitter {
|
|
|
212
212
|
var field = fields[i]
|
|
213
213
|
var hasMatch = !_.isUndefined(field.Match)
|
|
214
214
|
|
|
215
|
-
var value = readField(this.options, !hasMatch, pgn, field, bs)
|
|
215
|
+
var value = readField(this.options, !hasMatch, pgn, field, bs, fields)
|
|
216
216
|
|
|
217
217
|
if ( hasMatch ) {
|
|
218
218
|
//console.log(`looking for ${field.Name} == ${value}`)
|
|
@@ -243,6 +243,9 @@ class Parser extends EventEmitter {
|
|
|
243
243
|
fields = pgnData.Fields
|
|
244
244
|
//console.log(`using ${JSON.stringify(pgnData, null, 2)}`)
|
|
245
245
|
value = pgnData.Fields[i].Description
|
|
246
|
+
if ( value == null ) {
|
|
247
|
+
value = pgnData.Fields[i].Match
|
|
248
|
+
}
|
|
246
249
|
}
|
|
247
250
|
}
|
|
248
251
|
|
|
@@ -267,7 +270,7 @@ class Parser extends EventEmitter {
|
|
|
267
270
|
var group = {}
|
|
268
271
|
repeating.forEach(field => {
|
|
269
272
|
if ( bs.bitsLeft > 0 ) {
|
|
270
|
-
var value = readField(this.options, true, pgn, field, bs)
|
|
273
|
+
var value = readField(this.options, true, pgn, field, bs, fields)
|
|
271
274
|
if ( !_.isUndefined(value) && value != null ) {
|
|
272
275
|
group[field.Name] = value
|
|
273
276
|
}
|
|
@@ -558,11 +561,17 @@ function pad(n, p, c)
|
|
|
558
561
|
}
|
|
559
562
|
|
|
560
563
|
function lookup(field, value) {
|
|
561
|
-
var name
|
|
564
|
+
var name
|
|
565
|
+
if ( field.LookupEnumeration ) {
|
|
566
|
+
name = lookupEnumerationName(field.LookupEnumeration, value)
|
|
567
|
+
} else {
|
|
568
|
+
name = lookupFieldTypeEnumerationName(field.LookupFieldTypeEnumeration, value)
|
|
569
|
+
}
|
|
570
|
+
|
|
562
571
|
return name ? name : value
|
|
563
572
|
}
|
|
564
573
|
|
|
565
|
-
function readField(options, runPostProcessor, pgn, field, bs) {
|
|
574
|
+
function readField(options, runPostProcessor, pgn, field, bs, fields) {
|
|
566
575
|
var value
|
|
567
576
|
|
|
568
577
|
var reader = fieldTypeReaders[field.FieldType]
|
|
@@ -574,7 +583,7 @@ function readField(options, runPostProcessor, pgn, field, bs) {
|
|
|
574
583
|
bs.readBits(bs.bitsLeft, false)
|
|
575
584
|
return
|
|
576
585
|
}
|
|
577
|
-
value = readValue(options, pgn, field, bs)
|
|
586
|
+
value = readValue(options, pgn, field, bs, fields)
|
|
578
587
|
}
|
|
579
588
|
|
|
580
589
|
//console.log(`${field.Name} ${value} ${field.Resolution}`)
|
|
@@ -647,10 +656,14 @@ function readField(options, runPostProcessor, pgn, field, bs) {
|
|
|
647
656
|
return value
|
|
648
657
|
}
|
|
649
658
|
|
|
650
|
-
function readValue(options, pgn, field, bs, bitLength) {
|
|
659
|
+
function readValue(options, pgn, field, bs, fields, bitLength) {
|
|
651
660
|
var value
|
|
652
661
|
if ( _.isUndefined(bitLength) ) {
|
|
653
|
-
|
|
662
|
+
if ( field.BitLengthVariable && field.FieldType === "KEY_VALUE" ) {
|
|
663
|
+
bitLength = lookupKeyBitLength(pgn.fields, fields)
|
|
664
|
+
} else {
|
|
665
|
+
bitLength = field.BitLength
|
|
666
|
+
}
|
|
654
667
|
}
|
|
655
668
|
if ( field.FieldType == 'VARIABLE' ) {
|
|
656
669
|
return readVariableLengthField(options, pgn, field, bs)
|
|
@@ -893,6 +906,17 @@ fieldTypeReaders['BITLOOKUP'] = (pgn, field, bs) => {
|
|
|
893
906
|
return value
|
|
894
907
|
}
|
|
895
908
|
|
|
909
|
+
function lookupKeyBitLength(data, fields)
|
|
910
|
+
{
|
|
911
|
+
let field = fields.find(field => (field.Name === 'Key'))
|
|
912
|
+
|
|
913
|
+
let val = data['Key']
|
|
914
|
+
if ( typeof val === 'string' ) {
|
|
915
|
+
val = lookupFieldTypeEnumerationValue(field.LookupFieldTypeEnumeration, val)
|
|
916
|
+
}
|
|
917
|
+
return lookupFieldTypeEnumerationBits(field.LookupFieldTypeEnumeration, val)
|
|
918
|
+
}
|
|
919
|
+
|
|
896
920
|
fieldTypePostProcessors['DATE'] = (field, value) => {
|
|
897
921
|
if ( value >= 0xfffd ) {
|
|
898
922
|
value = undefined
|
package/lib/pgns.js
CHANGED
|
@@ -54,6 +54,29 @@ function getEnumeration(name) {
|
|
|
54
54
|
return enumeration
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
function getFieldTypeEnumeration(name) {
|
|
58
|
+
const enumeration = lookupFieldTypeEnumerations[name]
|
|
59
|
+
if ( enumeration ) {
|
|
60
|
+
if ( !enumeration.value2name ) {
|
|
61
|
+
enumeration.value2name = {}
|
|
62
|
+
enumeration.EnumFieldTypeValues.forEach((enumPair) => {
|
|
63
|
+
enumeration.value2name[Number(enumPair.value)] = enumPair.name
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
enumeration.name2value = {}
|
|
67
|
+
enumeration.EnumFieldTypeValues.forEach((enumPair) => {
|
|
68
|
+
enumeration.name2value[enumPair.name] = Number(enumPair.value)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
enumeration.value2bits = {}
|
|
72
|
+
enumeration.EnumFieldTypeValues.forEach((enumPair) => {
|
|
73
|
+
enumeration.value2bits[enumPair.value] = Number(enumPair.Bits)
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return enumeration
|
|
78
|
+
}
|
|
79
|
+
|
|
57
80
|
function getBitEnumeration(name) {
|
|
58
81
|
const enumeration = lookupBitEnumerations[name]
|
|
59
82
|
if ( enumeration ) {
|
|
@@ -82,6 +105,21 @@ function lookupEnumerationValue(enumName, name) {
|
|
|
82
105
|
return enumeration && enumeration.name2value[name]
|
|
83
106
|
}
|
|
84
107
|
|
|
108
|
+
function lookupFieldTypeEnumerationName(enumName, value) {
|
|
109
|
+
const enumeration = getFieldTypeEnumeration(enumName)
|
|
110
|
+
return enumeration && enumeration.value2name[value]
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function lookupFieldTypeEnumerationBits(enumName, value) {
|
|
114
|
+
const enumeration = getFieldTypeEnumeration(enumName)
|
|
115
|
+
return enumeration && enumeration.value2bits[value]
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function lookupFieldTypeEnumerationValue(enumName, name) {
|
|
119
|
+
const enumeration = getFieldTypeEnumeration(enumName)
|
|
120
|
+
return enumeration && enumeration.name2value[name]
|
|
121
|
+
}
|
|
122
|
+
|
|
85
123
|
function lookupBitEnumerationName(enumName, value) {
|
|
86
124
|
const enumeration = getBitEnumeration(enumName)
|
|
87
125
|
return enumeration && enumeration.value2name[value]
|
|
@@ -101,6 +139,7 @@ function organizeEnumerations(enums) {
|
|
|
101
139
|
}
|
|
102
140
|
|
|
103
141
|
const lookupEnumerations = organizeEnumerations(pgns.LookupEnumerations)
|
|
142
|
+
const lookupFieldTypeEnumerations = organizeEnumerations(pgns.LookupFieldTypeEnumerations)
|
|
104
143
|
const lookupBitEnumerations = organizeEnumerations(pgns.LookupBitEnumerations)
|
|
105
144
|
const organizedPGNs = organizePGNs()
|
|
106
145
|
const getPgn = pgn => organizedPGNs[pgn]
|
|
@@ -113,6 +152,9 @@ module.exports = {
|
|
|
113
152
|
pgns: organizedPGNs,
|
|
114
153
|
lookupEnumerationName,
|
|
115
154
|
lookupEnumerationValue,
|
|
155
|
+
lookupFieldTypeEnumerationName,
|
|
156
|
+
lookupFieldTypeEnumerationValue,
|
|
157
|
+
lookupFieldTypeEnumerationBits,
|
|
116
158
|
lookupBitEnumerationName,
|
|
117
159
|
lookupBitEnumerationValue,
|
|
118
160
|
addCustomPgns: (pgns, setter) => {
|
package/lib/toPgn.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
const { getField } = require('./fromPgn')
|
|
18
|
-
const { pgns, getCustomPgn, lookupEnumerationValue, lookupBitEnumerationName } = require('./pgns')
|
|
18
|
+
const { pgns, getCustomPgn, lookupEnumerationValue, lookupFieldTypeEnumerationValue, lookupBitEnumerationName, lookupFieldTypeEnumerationBits } = require('./pgns')
|
|
19
19
|
const _ = require('lodash')
|
|
20
20
|
const BitStream = require('bit-buffer').BitStream
|
|
21
21
|
const Int64LE = require('int64-buffer').Int64LE
|
|
@@ -95,7 +95,7 @@ function toPgn(data) {
|
|
|
95
95
|
RepeatingFields = pgnData.RepeatingFieldSet1Size ? pgnData.RepeatingFieldSet1Size : 0
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
|
-
writeField(bs, pgn_number, field, data, value)
|
|
98
|
+
writeField(bs, pgn_number, field, data, value, fields)
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
if ( data.list ) {
|
|
@@ -104,7 +104,7 @@ function toPgn(data) {
|
|
|
104
104
|
var field = fields[pgnData.Fields.length-RepeatingFields+index]
|
|
105
105
|
var value = repeat[field.Name];
|
|
106
106
|
|
|
107
|
-
writeField(bs, pgn_number, field, data, value)
|
|
107
|
+
writeField(bs, pgn_number, field, data, value, fields)
|
|
108
108
|
}
|
|
109
109
|
})
|
|
110
110
|
}
|
|
@@ -147,11 +147,15 @@ function dumpWritten(bs, field, startPos, value) {
|
|
|
147
147
|
console.log(string + `] ${value}`)
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
function writeField(bs, pgn_number, field, data, value, bitLength) {
|
|
150
|
+
function writeField(bs, pgn_number, field, data, value, fields, bitLength) {
|
|
151
151
|
var startPos = bs.byteIndex
|
|
152
152
|
|
|
153
153
|
if ( _.isUndefined(bitLength) ) {
|
|
154
|
-
|
|
154
|
+
if ( field.BitLengthVariable && field.FieldType === "KEY_VALUE" ) {
|
|
155
|
+
bitLength = lookupKeyBitLength(data, fields)
|
|
156
|
+
} else {
|
|
157
|
+
bitLength = field.BitLength
|
|
158
|
+
}
|
|
155
159
|
}
|
|
156
160
|
|
|
157
161
|
// console.log(`${field.Name}:${value}(${bitLength}-${field.Resolution})`)
|
|
@@ -204,7 +208,7 @@ function writeField(bs, pgn_number, field, data, value, bitLength) {
|
|
|
204
208
|
}
|
|
205
209
|
|
|
206
210
|
if ( field.FieldType === 'VARIABLE' ) {
|
|
207
|
-
writeVariableLengthField(bs, pgn_number, data, field, value)
|
|
211
|
+
writeVariableLengthField(bs, pgn_number, data, field, value, fields)
|
|
208
212
|
} else if ( _.isBuffer(value) ) {
|
|
209
213
|
value.copy(bs.view.buffer, bs.byteIndex)
|
|
210
214
|
bs.byteIndex += value.length
|
|
@@ -259,21 +263,37 @@ function writeField(bs, pgn_number, field, data, value, bitLength) {
|
|
|
259
263
|
//dumpWritten(bs, field, startPos, value)
|
|
260
264
|
}
|
|
261
265
|
|
|
262
|
-
function writeVariableLengthField(bs, pgn_number, pgn, field, value) {
|
|
266
|
+
function writeVariableLengthField(bs, pgn_number, pgn, field, value, fields) {
|
|
263
267
|
var refField = getField(pgn.PGN, bs.view.buffer[bs.byteIndex-1]-1, pgn)
|
|
264
268
|
|
|
265
269
|
if ( refField ) {
|
|
266
270
|
var bits = (refField.BitLength + 7) & ~7; // Round # of bits in field refField up to complete bytes: 1->8, 7->8, 8->8 etc.
|
|
267
271
|
|
|
268
|
-
return writeField(bs, pgn_number, refField, pgn, value, bits)
|
|
272
|
+
return writeField(bs, pgn_number, refField, pgn, value, fields, bits)
|
|
269
273
|
}
|
|
270
274
|
}
|
|
271
275
|
|
|
272
276
|
function lookup(field, stringValue) {
|
|
273
|
-
var res
|
|
277
|
+
var res
|
|
278
|
+
if ( field.LookupEnumeration ) {
|
|
279
|
+
res = lookupEnumerationValue(field.LookupEnumeration, stringValue)
|
|
280
|
+
} else {
|
|
281
|
+
res = lookupFieldTypeEnumerationValue(field.LookupFieldTypeEnumeration, stringValue)
|
|
282
|
+
}
|
|
274
283
|
return _.isUndefined(res) ? stringValue : res
|
|
275
284
|
}
|
|
276
285
|
|
|
286
|
+
function lookupKeyBitLength(data, fields)
|
|
287
|
+
{
|
|
288
|
+
let field = fields.find(field => (field.Name === 'Key'))
|
|
289
|
+
|
|
290
|
+
let val = data['Key']
|
|
291
|
+
if ( typeof val === 'string' ) {
|
|
292
|
+
val = lookupFieldTypeEnumerationValue(field.LookupFieldTypeEnumeration, val)
|
|
293
|
+
}
|
|
294
|
+
return lookupFieldTypeEnumerationBits(field.LookupFieldTypeEnumeration, val)
|
|
295
|
+
}
|
|
296
|
+
|
|
277
297
|
function isDefined(value) {
|
|
278
298
|
return typeof value !== 'undefined' && value != null
|
|
279
299
|
}
|