@canboat/canboatjs 2.4.5 → 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}`)
@@ -270,7 +270,7 @@ class Parser extends EventEmitter {
270
270
  var group = {}
271
271
  repeating.forEach(field => {
272
272
  if ( bs.bitsLeft > 0 ) {
273
- var value = readField(this.options, true, pgn, field, bs)
273
+ var value = readField(this.options, true, pgn, field, bs, fields)
274
274
  if ( !_.isUndefined(value) && value != null ) {
275
275
  group[field.Name] = value
276
276
  }
@@ -561,11 +561,17 @@ function pad(n, p, c)
561
561
  }
562
562
 
563
563
  function lookup(field, value) {
564
- 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
+
565
571
  return name ? name : value
566
572
  }
567
573
 
568
- function readField(options, runPostProcessor, pgn, field, bs) {
574
+ function readField(options, runPostProcessor, pgn, field, bs, fields) {
569
575
  var value
570
576
 
571
577
  var reader = fieldTypeReaders[field.FieldType]
@@ -577,7 +583,7 @@ function readField(options, runPostProcessor, pgn, field, bs) {
577
583
  bs.readBits(bs.bitsLeft, false)
578
584
  return
579
585
  }
580
- value = readValue(options, pgn, field, bs)
586
+ value = readValue(options, pgn, field, bs, fields)
581
587
  }
582
588
 
583
589
  //console.log(`${field.Name} ${value} ${field.Resolution}`)
@@ -650,10 +656,14 @@ function readField(options, runPostProcessor, pgn, field, bs) {
650
656
  return value
651
657
  }
652
658
 
653
- function readValue(options, pgn, field, bs, bitLength) {
659
+ function readValue(options, pgn, field, bs, fields, bitLength) {
654
660
  var value
655
661
  if ( _.isUndefined(bitLength) ) {
656
- bitLength = field.BitLength
662
+ if ( field.BitLengthVariable && field.FieldType === "KEY_VALUE" ) {
663
+ bitLength = lookupKeyBitLength(pgn.fields, fields)
664
+ } else {
665
+ bitLength = field.BitLength
666
+ }
657
667
  }
658
668
  if ( field.FieldType == 'VARIABLE' ) {
659
669
  return readVariableLengthField(options, pgn, field, bs)
@@ -896,6 +906,17 @@ fieldTypeReaders['BITLOOKUP'] = (pgn, field, bs) => {
896
906
  return value
897
907
  }
898
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
+
899
920
  fieldTypePostProcessors['DATE'] = (field, value) => {
900
921
  if ( value >= 0xfffd ) {
901
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.5",
3
+ "version": "2.5.0",
4
4
  "description": "Native javascript version of canboat",
5
5
  "main": "index.js",
6
6
  "scripts": {