@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 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 = lookupEnumerationName(field.LookupEnumeration, value)
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
- bitLength = field.BitLength
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
- bitLength = field.BitLength
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 = lookupEnumerationValue(field.LookupEnumeration, stringValue)
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canboat/canboatjs",
3
- "version": "2.4.4",
3
+ "version": "2.5.0",
4
4
  "description": "Native javascript version of canboat",
5
5
  "main": "index.js",
6
6
  "scripts": {