@canboat/canboatjs 2.1.1 → 2.2.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/index.js +1 -1
- package/lib/fromPgn.js +38 -42
- package/lib/pgns.js +61 -53
- package/lib/toPgn.js +25 -31
- package/package.json +2 -2
package/index.js
CHANGED
|
@@ -39,7 +39,7 @@ module.exports = {
|
|
|
39
39
|
VenusMQTT: require('./lib/venus-mqtt'),
|
|
40
40
|
discover: require('./lib/discovery'),
|
|
41
41
|
SimpleCan: require('./lib/simpleCan'),
|
|
42
|
-
|
|
42
|
+
addCustomPgns: pgns.addCustomPgns,
|
|
43
43
|
lookupEnumerationValue: pgns.lookupEnumerationValue,
|
|
44
44
|
lookupEnumerationName: pgns.lookupEnumerationName
|
|
45
45
|
}
|
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,
|
|
22
|
+
const { pgns, getCustomPgn, addCustomPgns, lookupEnumerationName, lookupBitEnumerationName } = 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
|
|
@@ -71,12 +71,7 @@ class Parser extends EventEmitter {
|
|
|
71
71
|
if ( this.options.onPropertyValues ) {
|
|
72
72
|
this.options.onPropertyValues('canboat-custom-pgns', values => {
|
|
73
73
|
values.filter(v => v != null).forEach(pv => {
|
|
74
|
-
pv.value.
|
|
75
|
-
if ( !addCustomPgn(pgn, pv.value.callback) ) {
|
|
76
|
-
this.emit('warning', pgn, `pgn ${pgn.PGN} can't be overwritten`)
|
|
77
|
-
}
|
|
78
|
-
debug('registered custom pgn %d by %s', pgn.PGN, pv.setter)
|
|
79
|
-
})
|
|
74
|
+
addCustomPgns(pv.value, pv.setter)
|
|
80
75
|
})
|
|
81
76
|
})
|
|
82
77
|
}
|
|
@@ -221,7 +216,7 @@ class Parser extends EventEmitter {
|
|
|
221
216
|
pgnList = [ nonMatch ]
|
|
222
217
|
pgnData = pgnList[0]
|
|
223
218
|
fields = pgnData.Fields
|
|
224
|
-
var postProcessor = fieldTypePostProcessors[field.
|
|
219
|
+
var postProcessor = fieldTypePostProcessors[field.FieldType]
|
|
225
220
|
if ( postProcessor ) {
|
|
226
221
|
value = postProcessor(pgnData.Fields[i], value)
|
|
227
222
|
}
|
|
@@ -543,29 +538,18 @@ function pad(n, p, c)
|
|
|
543
538
|
}
|
|
544
539
|
|
|
545
540
|
function lookup(field, value) {
|
|
546
|
-
var name =
|
|
541
|
+
var name = lookupEnumerationName(field.LookupEnumeration, value)
|
|
547
542
|
return name ? name : value
|
|
548
543
|
}
|
|
549
544
|
|
|
550
|
-
function lookupBitField(field, value) {
|
|
551
|
-
if (!field.value2name) {
|
|
552
|
-
field.value2name = {};
|
|
553
|
-
field.EnumBitValues.forEach(function(enumPair) {
|
|
554
|
-
var key = _.keys(enumPair)[0]
|
|
555
|
-
field.value2name[Number(key)] = enumPair[key]
|
|
556
|
-
})
|
|
557
|
-
}
|
|
558
|
-
return (field.value2name[value]);
|
|
559
|
-
}
|
|
560
|
-
|
|
561
545
|
function readField(options, runPostProcessor, pgn, field, bs) {
|
|
562
546
|
var value
|
|
563
547
|
|
|
564
|
-
var reader = fieldTypeReaders[field.
|
|
548
|
+
var reader = fieldTypeReaders[field.FieldType]
|
|
565
549
|
if ( reader ) {
|
|
566
550
|
value = reader(pgn, field, bs)
|
|
567
551
|
} else {
|
|
568
|
-
if ( field.
|
|
552
|
+
if ( field.FieldType !== RES_BINARY && bs.bitsLeft < field.BitLength ) {
|
|
569
553
|
//no more data
|
|
570
554
|
bs.readBits(bs.bitsLeft, false)
|
|
571
555
|
return
|
|
@@ -576,7 +560,7 @@ function readField(options, runPostProcessor, pgn, field, bs) {
|
|
|
576
560
|
//console.log(`${field.Name} ${value} ${field.Resolution}`)
|
|
577
561
|
|
|
578
562
|
if ( value != null && !_.isUndefined(value) ) {
|
|
579
|
-
let type = field.
|
|
563
|
+
let type = field.FieldType //hack, missing type
|
|
580
564
|
var postProcessor = fieldTypePostProcessors[type]
|
|
581
565
|
if ( postProcessor ) {
|
|
582
566
|
if ( runPostProcessor ) {
|
|
@@ -603,15 +587,16 @@ function readField(options, runPostProcessor, pgn, field, bs) {
|
|
|
603
587
|
|
|
604
588
|
value = Number.parseFloat(value.toFixed(precision))
|
|
605
589
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
590
|
+
if ( typeof field.RangeMin !== 'undefined' && value < field.RangeMin ) {
|
|
591
|
+
value = null
|
|
592
|
+
}
|
|
593
|
+
if ( typeof field.RangeMax !== 'undefined' && value > field.RangeMax ) {
|
|
594
|
+
value = null
|
|
610
595
|
}
|
|
611
|
-
*/
|
|
612
596
|
}
|
|
613
597
|
|
|
614
|
-
if (field.
|
|
598
|
+
if (field.FieldType === 'LOOKUP' &&
|
|
599
|
+
runPostProcessor &&
|
|
615
600
|
(_.isUndefined(options.resolveEnums) ||
|
|
616
601
|
options.resolveEnums)) {
|
|
617
602
|
if (field.Id === "timeStamp" && value < 60) {
|
|
@@ -628,9 +613,9 @@ function readField(options, runPostProcessor, pgn, field, bs) {
|
|
|
628
613
|
}
|
|
629
614
|
}
|
|
630
615
|
|
|
631
|
-
if ( field.
|
|
616
|
+
if ( field.Unit === "kWh" ) {
|
|
632
617
|
value *= 3.6e6; // 1 kWh = 3.6 MJ.
|
|
633
|
-
} else if (field.
|
|
618
|
+
} else if (field.Unit === "Ah") {
|
|
634
619
|
value *= 3600.0; // 1 Ah = 3600 C.
|
|
635
620
|
}
|
|
636
621
|
}
|
|
@@ -643,7 +628,7 @@ function readValue(options, pgn, field, bs, bitLength) {
|
|
|
643
628
|
if ( _.isUndefined(bitLength) ) {
|
|
644
629
|
bitLength = field.BitLength
|
|
645
630
|
}
|
|
646
|
-
if (
|
|
631
|
+
if ( field.FieldType == 'VARIABLE' ) {
|
|
647
632
|
return readVariableLengthField(options, pgn, field, bs)
|
|
648
633
|
} else if (bitLength === 8) {
|
|
649
634
|
if ( field.Signed ) {
|
|
@@ -713,6 +698,7 @@ function readValue(options, pgn, field, bs, bitLength) {
|
|
|
713
698
|
}, [])
|
|
714
699
|
.map(x => (x.length === 1 ? "0" + x : x))
|
|
715
700
|
.join(" ")
|
|
701
|
+
|
|
716
702
|
return value
|
|
717
703
|
}
|
|
718
704
|
|
|
@@ -767,7 +753,10 @@ function readVariableLengthField(options, pgn, field, bs) {
|
|
|
767
753
|
}
|
|
768
754
|
}
|
|
769
755
|
|
|
770
|
-
fieldTypeReaders[
|
|
756
|
+
fieldTypeReaders[
|
|
757
|
+
'STRING_LAU'
|
|
758
|
+
//'ASCII or UNICODE string starting with length and control byte'
|
|
759
|
+
] = (pgn, field, bs) => {
|
|
771
760
|
|
|
772
761
|
if ( bs.bitsLeft >= 16 ) {
|
|
773
762
|
const len = bs.readUint8()-2
|
|
@@ -797,7 +786,10 @@ fieldTypeReaders['ASCII or UNICODE string starting with length and control byte'
|
|
|
797
786
|
}
|
|
798
787
|
}
|
|
799
788
|
|
|
800
|
-
fieldTypeReaders[
|
|
789
|
+
fieldTypeReaders[
|
|
790
|
+
'STRING_LZ'
|
|
791
|
+
//'ASCII string starting with length byte'
|
|
792
|
+
] = (pgn, field, bs) => {
|
|
801
793
|
var len = bs.readUint8()
|
|
802
794
|
|
|
803
795
|
var buf = Buffer.alloc(len)
|
|
@@ -842,7 +834,7 @@ fieldTypeReaders["String with start/stop byte"] = (pgn, field, bs) => {
|
|
|
842
834
|
}
|
|
843
835
|
}
|
|
844
836
|
|
|
845
|
-
fieldTypeReaders['
|
|
837
|
+
fieldTypeReaders['STRING_FIX'] = (pgn, field, bs) => {
|
|
846
838
|
var len = field.BitLength / 8
|
|
847
839
|
var buf = Buffer.alloc(len)
|
|
848
840
|
|
|
@@ -865,17 +857,19 @@ fieldTypeReaders['ASCII text'] = (pgn, field, bs) => {
|
|
|
865
857
|
return buf.toString('ascii', 0, len)
|
|
866
858
|
}
|
|
867
859
|
|
|
868
|
-
fieldTypeReaders['
|
|
860
|
+
fieldTypeReaders['BITLOOKUP'] = (pgn, field, bs) => {
|
|
869
861
|
var value = []
|
|
870
862
|
for ( var i = 0; i < field.BitLength; i++ ) {
|
|
871
863
|
if ( bs.readBits(1, 0) ) {
|
|
872
|
-
value.push(
|
|
864
|
+
value.push(
|
|
865
|
+
lookupBitEnumerationName(field.LookupBitEnumeration, i)
|
|
866
|
+
)
|
|
873
867
|
}
|
|
874
868
|
}
|
|
875
869
|
return value
|
|
876
870
|
}
|
|
877
871
|
|
|
878
|
-
fieldTypePostProcessors['
|
|
872
|
+
fieldTypePostProcessors['DATE'] = (field, value) => {
|
|
879
873
|
if ( value >= 0xfffd ) {
|
|
880
874
|
value = undefined
|
|
881
875
|
} else {
|
|
@@ -886,7 +880,7 @@ fieldTypePostProcessors['Date'] = (field, value) => {
|
|
|
886
880
|
return value
|
|
887
881
|
}
|
|
888
882
|
|
|
889
|
-
fieldTypePostProcessors['
|
|
883
|
+
fieldTypePostProcessors['TIME'] = (field, value) => {
|
|
890
884
|
if (value >= 0xfffffffd) {
|
|
891
885
|
value = undefined
|
|
892
886
|
} else {
|
|
@@ -906,9 +900,9 @@ fieldTypePostProcessors['Time'] = (field, value) => {
|
|
|
906
900
|
}
|
|
907
901
|
|
|
908
902
|
fieldTypePostProcessors['Pressure'] = (field, value) => {
|
|
909
|
-
if (field.
|
|
903
|
+
if (field.Unit)
|
|
910
904
|
{
|
|
911
|
-
switch (field.
|
|
905
|
+
switch (field.Unit[0]) {
|
|
912
906
|
case 'h':
|
|
913
907
|
case 'H':
|
|
914
908
|
value *= 100;
|
|
@@ -929,10 +923,12 @@ fieldTypePostProcessors[RES_BINARY] = (field, value) => {
|
|
|
929
923
|
return value.toString()
|
|
930
924
|
}
|
|
931
925
|
|
|
926
|
+
/*
|
|
932
927
|
fieldTypePostProcessors['Manufacturer code'] = (field, value) => {
|
|
933
928
|
var manufacturer = getManufacturerName(value)
|
|
934
929
|
return manufacturer ? manufacturer : value
|
|
935
|
-
}
|
|
930
|
+
}
|
|
931
|
+
*/
|
|
936
932
|
|
|
937
933
|
module.exports = {
|
|
938
934
|
Parser: Parser,
|
package/lib/pgns.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const { flow, first, isArray, isEmpty, propertyOf } = require('lodash/fp')
|
|
2
2
|
const pgns = require('@canboat/pgns')
|
|
3
|
-
const pgnsIK = require('@canboat/pgns/pgns-ik')
|
|
4
|
-
const pgnsNGT = require('@canboat/pgns/pgns-ngt')
|
|
3
|
+
const pgnsIK = { PGNs: [] } //require('@canboat/pgns/pgns-ik')
|
|
4
|
+
const pgnsNGT = { PGNs: [] } //require('@canboat/pgns/pgns-ngt')
|
|
5
5
|
const _ = require('lodash')
|
|
6
|
+
const debug = require('debug')('canboatjs:pgns')
|
|
6
7
|
|
|
7
8
|
function organizePGNs() {
|
|
8
9
|
const res = {}
|
|
@@ -35,10 +36,6 @@ function organizePGNs() {
|
|
|
35
36
|
return res
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
function getField(pgn, name) {
|
|
39
|
-
return pgn.Fields.find(f => f.Name === name)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
39
|
function getEnumeration(name) {
|
|
43
40
|
const enumeration = lookupEnumerations[name]
|
|
44
41
|
if ( enumeration ) {
|
|
@@ -57,48 +54,45 @@ function getEnumeration(name) {
|
|
|
57
54
|
return enumeration
|
|
58
55
|
}
|
|
59
56
|
|
|
57
|
+
function getBitEnumeration(name) {
|
|
58
|
+
const enumeration = lookupBitEnumerations[name]
|
|
59
|
+
if ( enumeration ) {
|
|
60
|
+
if ( !enumeration.value2name ) {
|
|
61
|
+
enumeration.value2name = {}
|
|
62
|
+
enumeration.EnumBitValues.forEach((enumPair) => {
|
|
63
|
+
enumeration.value2name[Number(enumPair.Bit)] = enumPair.Name
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
enumeration.name2value = {}
|
|
67
|
+
enumeration.EnumBitValues.forEach((enumPair) => {
|
|
68
|
+
enumeration.name2value[enumPair.Name] = Number(enumPair.Bit)
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return enumeration
|
|
73
|
+
}
|
|
74
|
+
|
|
60
75
|
function lookupEnumerationName(enumName, value) {
|
|
61
76
|
const enumeration = getEnumeration(enumName)
|
|
62
|
-
return enumeration.value2name[value]
|
|
77
|
+
return enumeration && enumeration.value2name[value]
|
|
63
78
|
}
|
|
64
79
|
|
|
65
80
|
function lookupEnumerationValue(enumName, name) {
|
|
66
81
|
const enumeration = getEnumeration(enumName)
|
|
67
|
-
return enumeration.name2value[name]
|
|
82
|
+
return enumeration && enumeration.name2value[name]
|
|
68
83
|
}
|
|
69
84
|
|
|
70
|
-
function
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
field.EnumValues.forEach(function(enumPair) {
|
|
74
|
-
field.value2name[Number(enumPair.value)] = enumPair.name
|
|
75
|
-
})
|
|
76
|
-
}
|
|
77
|
-
return field.value2name
|
|
85
|
+
function lookupBitEnumerationName(enumName, value) {
|
|
86
|
+
const enumeration = getBitEnumeration(enumName)
|
|
87
|
+
return enumeration && enumeration.value2name[value]
|
|
78
88
|
}
|
|
79
89
|
|
|
80
|
-
function
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
field.EnumValues.forEach(function(enumPair) {
|
|
84
|
-
field.name2value[enumPair.name] = Number(enumPair.value)
|
|
85
|
-
})
|
|
86
|
-
}
|
|
87
|
-
return field.name2value
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function lookupEnumNameForField(field, value) {
|
|
91
|
-
let value2name = getValue2Name(field)
|
|
92
|
-
return value2name && value2name[value]
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function lookupEnumValueForField(field, stringValue) {
|
|
96
|
-
let name2value = getName2Value(field)
|
|
97
|
-
return name2value && name2value[stringValue]
|
|
90
|
+
function lookupBitEnumerationValue(enumName, name) {
|
|
91
|
+
const enumeration = getBitEnumeration(enumName)
|
|
92
|
+
return enumeration.name2value[name]
|
|
98
93
|
}
|
|
99
94
|
|
|
100
|
-
function organizeEnumerations() {
|
|
101
|
-
let enums = require('@canboat/pgns/canboat').LookupEnumerations
|
|
95
|
+
function organizeEnumerations(enums) {
|
|
102
96
|
let map = {}
|
|
103
97
|
enums.forEach(e => {
|
|
104
98
|
map[e.Name] = e
|
|
@@ -106,7 +100,8 @@ function organizeEnumerations() {
|
|
|
106
100
|
return map
|
|
107
101
|
}
|
|
108
102
|
|
|
109
|
-
const lookupEnumerations = organizeEnumerations()
|
|
103
|
+
const lookupEnumerations = organizeEnumerations(pgns.LookupEnumerations)
|
|
104
|
+
const lookupBitEnumerations = organizeEnumerations(pgns.LookupBitEnumerations)
|
|
110
105
|
const organizedPGNs = organizePGNs()
|
|
111
106
|
const getPgn = pgn => organizedPGNs[pgn]
|
|
112
107
|
const getPgn0 = flow(getPgn, first)
|
|
@@ -116,26 +111,39 @@ module.exports = {
|
|
|
116
111
|
getPgn,
|
|
117
112
|
getPgn0,
|
|
118
113
|
pgns: organizedPGNs,
|
|
119
|
-
lookupEnumValueForField,
|
|
120
|
-
lookupEnumNameForField,
|
|
121
114
|
lookupEnumerationName,
|
|
122
115
|
lookupEnumerationValue,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
116
|
+
lookupBitEnumerationName,
|
|
117
|
+
lookupBitEnumerationValue,
|
|
118
|
+
addCustomPgns: (pgns, setter) => {
|
|
119
|
+
pgns.PGNs.forEach(pgn => {
|
|
120
|
+
if ( !customPgns[pgn.PGN] ) {
|
|
121
|
+
customPgns[pgn.PGN] = {
|
|
122
|
+
definitions: [],
|
|
123
|
+
callbacks: []
|
|
124
|
+
}
|
|
128
125
|
}
|
|
126
|
+
|
|
127
|
+
customPgns[pgn.PGN].definitions.push(pgn)
|
|
128
|
+
|
|
129
|
+
/*
|
|
130
|
+
if ( pgn.calllback ) {
|
|
131
|
+
customPgns[pgn.PGN].callbacks.push()
|
|
132
|
+
}
|
|
133
|
+
*/
|
|
134
|
+
|
|
135
|
+
debug('registered custom pgn %d by %s', pgn.PGN, setter)
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
if ( pgns.LookupEnumerations ) {
|
|
139
|
+
pgns.LookupEnumerations.forEach(e => {
|
|
140
|
+
if ( !lookupEnumerations[e.Name] ) {
|
|
141
|
+
lookupEnumerations[e.Name] = e
|
|
142
|
+
} else {
|
|
143
|
+
debug(`enumeration ${e.Name} already exists`)
|
|
144
|
+
}
|
|
145
|
+
})
|
|
129
146
|
}
|
|
130
|
-
|
|
131
|
-
customPgns[pgn.PGN].definitions.push(pgn)
|
|
132
|
-
/*
|
|
133
|
-
if ( pgn.calllback ) {
|
|
134
|
-
customPgns[pgn.PGN].callbacks.push()
|
|
135
|
-
}
|
|
136
|
-
*/
|
|
137
|
-
|
|
138
|
-
return customPgns[pgn.PGN]
|
|
139
147
|
},
|
|
140
148
|
getCustomPgn: (pgnNum) => {
|
|
141
149
|
return customPgns[pgnNum]
|
package/lib/toPgn.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
const { getField } = require('./fromPgn')
|
|
18
|
-
const { pgns, getCustomPgn,
|
|
18
|
+
const { pgns, getCustomPgn, lookupEnumerationValue, lookupBitEnumerationName } = require('./pgns')
|
|
19
19
|
const _ = require('lodash')
|
|
20
20
|
const BitStream = require('bit-buffer').BitStream
|
|
21
21
|
const Int64LE = require('int64-buffer').Int64LE
|
|
@@ -27,8 +27,8 @@ const { encodeCanId } = require('./canId')
|
|
|
27
27
|
const { getIndustryCode, getManufacturerCode } = require('./codes')
|
|
28
28
|
const debug = require('debug')('canboatjs:toPgn')
|
|
29
29
|
|
|
30
|
-
const RES_STRINGLAU = 'ASCII or UNICODE string starting with length and control byte'
|
|
31
|
-
const RES_STRINGLZ = 'ASCII string starting with length byte'
|
|
30
|
+
const RES_STRINGLAU = 'STRING_LAU' //'ASCII or UNICODE string starting with length and control byte'
|
|
31
|
+
const RES_STRINGLZ = 'STRING_LZ' //'ASCII string starting with length byte'
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
var fieldTypeWriters = {}
|
|
@@ -117,8 +117,8 @@ function toPgn(data) {
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
if ( pgnData.Length != 0xff
|
|
120
|
-
&& fields[fields.length-1].
|
|
121
|
-
&& fields[fields.length-1].
|
|
120
|
+
&& fields[fields.length-1].FieldType != RES_STRINGLAU
|
|
121
|
+
&& fields[fields.length-1].FieldType != RES_STRINGLZ
|
|
122
122
|
&& !RepeatingFields ) {
|
|
123
123
|
|
|
124
124
|
var len = lengthsOff[pgnData.PGN] || pgnData.Length
|
|
@@ -156,8 +156,8 @@ function writeField(bs, pgn_number, field, data, value, bitLength) {
|
|
|
156
156
|
|
|
157
157
|
// console.log(`${field.Name}:${value}(${bitLength}-${field.Resolution})`)
|
|
158
158
|
if ( _.isUndefined(value) || value === null) {
|
|
159
|
-
if ( field.
|
|
160
|
-
fieldTypeWriters[field.
|
|
159
|
+
if ( field.FieldType && fieldTypeWriters[field.FieldType] ) {
|
|
160
|
+
fieldTypeWriters[field.FieldType](pgn_number, field, value, bs)
|
|
161
161
|
} else if ( bitLength % 8 == 0 ) {
|
|
162
162
|
var bytes = bitLength/8
|
|
163
163
|
var lastByte = field.Signed ? 0x7f : 0xff
|
|
@@ -170,14 +170,14 @@ function writeField(bs, pgn_number, field, data, value, bitLength) {
|
|
|
170
170
|
bs.writeBits(0xffffffff, bitLength)
|
|
171
171
|
}
|
|
172
172
|
} else {
|
|
173
|
-
let type = field.
|
|
173
|
+
let type = field.FieldType
|
|
174
174
|
if ( field.Name === 'Industry Code' ) {
|
|
175
175
|
if ( _.isString(value) ) {
|
|
176
176
|
value = Number(getIndustryCode(value))
|
|
177
177
|
}
|
|
178
178
|
} else if ( type && fieldTypeMappers[type] ) {
|
|
179
179
|
value = fieldTypeMappers[type](field, value)
|
|
180
|
-
} else if (field.
|
|
180
|
+
} else if (field.FieldType === 'LOOKUP' && _.isString(value)) {
|
|
181
181
|
if (!(field.Id === "timeStamp" && value < 60)) {
|
|
182
182
|
value = lookup(field, value)
|
|
183
183
|
}
|
|
@@ -187,23 +187,23 @@ function writeField(bs, pgn_number, field, data, value, bitLength) {
|
|
|
187
187
|
value = Number((value / field.Resolution).toFixed(0))
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
if ( field.
|
|
191
|
-
fieldTypeWriters[field.
|
|
190
|
+
if ( field.FieldType && fieldTypeWriters[field.FieldType] ) {
|
|
191
|
+
fieldTypeWriters[field.FieldType](pgn_number, field, value, bs)
|
|
192
192
|
} else {
|
|
193
193
|
if ( _.isString(value) && typeof bitLength !== 'undefined' && bitLength !== 0 ) {
|
|
194
194
|
value = Number(value)
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
-
if ( field.
|
|
197
|
+
if ( field.Unit === "kWh" ) {
|
|
198
198
|
value /= 3.6e6; // 1 kWh = 3.6 MJ.
|
|
199
|
-
} else if (field.
|
|
199
|
+
} else if (field.Unit === "Ah") {
|
|
200
200
|
value /= 3600.0; // 1 Ah = 3600 C.
|
|
201
201
|
}
|
|
202
202
|
if ( field.Offset ) {
|
|
203
203
|
value -= field.Offset
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
-
if (
|
|
206
|
+
if ( field.FieldType === 'VARIABLE' ) {
|
|
207
207
|
writeVariableLengthField(bs, pgn_number, data, field, value)
|
|
208
208
|
} else if ( _.isBuffer(value) ) {
|
|
209
209
|
value.copy(bs.view.buffer, bs.byteIndex)
|
|
@@ -270,7 +270,7 @@ function writeVariableLengthField(bs, pgn_number, pgn, field, value) {
|
|
|
270
270
|
}
|
|
271
271
|
|
|
272
272
|
function lookup(field, stringValue) {
|
|
273
|
-
var res =
|
|
273
|
+
var res = lookupEnumerationValue(field.LookupEnumeration, stringValue)
|
|
274
274
|
return _.isUndefined(res) ? stringValue : res
|
|
275
275
|
}
|
|
276
276
|
|
|
@@ -326,17 +326,10 @@ const actisenseToN2KAsciiFormat = _.flow(parseActisense, encodeActisenseN2KACSII
|
|
|
326
326
|
const actisenseToN2KActisenseFormat = _.flow(parseActisense, encodeN2KActisense)
|
|
327
327
|
|
|
328
328
|
function bitIsSet(field, index, value) {
|
|
329
|
-
|
|
330
|
-
field.value2name = {};
|
|
331
|
-
field.EnumBitValues.forEach(function(enumPair) {
|
|
332
|
-
var key = _.keys(enumPair)[0]
|
|
333
|
-
field.value2name[Number(key)] = enumPair[key]
|
|
334
|
-
})
|
|
335
|
-
}
|
|
336
|
-
return value.indexOf(field.value2name[index]) != -1
|
|
329
|
+
return value.indexOf(lookupBitEnumerationName(field.LookupBitEnumeration, index)) != -1
|
|
337
330
|
}
|
|
338
331
|
|
|
339
|
-
fieldTypeWriters['
|
|
332
|
+
fieldTypeWriters['BITLOOKUP'] = (pgn, field, value, bs) => {
|
|
340
333
|
if ( _.isUndefined(value) || value.length === 0 ) {
|
|
341
334
|
if ( field.BitLength % 8 == 0 ) {
|
|
342
335
|
var bytes = field.BitLength/8
|
|
@@ -355,7 +348,7 @@ fieldTypeWriters['Bitfield'] = (pgn, field, value, bs) => {
|
|
|
355
348
|
}
|
|
356
349
|
}
|
|
357
350
|
|
|
358
|
-
fieldTypeWriters['
|
|
351
|
+
fieldTypeWriters['STRING_FIX'] = (pgn, field, value, bs) => {
|
|
359
352
|
|
|
360
353
|
let fill = 0xff
|
|
361
354
|
if ( (pgn === 129810 && (field.Name === "Vendor ID" || field.Name === "Callsign")) || (pgn === 129809 && field.Name === 'Name') ) {
|
|
@@ -422,7 +415,7 @@ fieldTypeWriters[RES_STRINGLAU] = (pgn, field, value, bs) => {
|
|
|
422
415
|
}
|
|
423
416
|
}
|
|
424
417
|
|
|
425
|
-
fieldTypeMappers['
|
|
418
|
+
fieldTypeMappers['DATE'] = (field, value) => {
|
|
426
419
|
//console.log(`Date: ${value}`)
|
|
427
420
|
if ( _.isString(value) ) {
|
|
428
421
|
var date = new Date(value)
|
|
@@ -432,7 +425,7 @@ fieldTypeMappers['Date'] = (field, value) => {
|
|
|
432
425
|
return value
|
|
433
426
|
}
|
|
434
427
|
|
|
435
|
-
fieldTypeMappers['
|
|
428
|
+
fieldTypeMappers['TIME'] = (field, value) => {
|
|
436
429
|
if ( _.isString(value) ) {
|
|
437
430
|
var split = value.split(':')
|
|
438
431
|
|
|
@@ -445,18 +438,19 @@ fieldTypeMappers['Time'] = (field, value) => {
|
|
|
445
438
|
return value
|
|
446
439
|
}
|
|
447
440
|
|
|
448
|
-
|
|
441
|
+
/*
|
|
449
442
|
fieldTypeMappers['Manufacturer code'] = (field, value) => {
|
|
450
443
|
if ( _.isString(value) ) {
|
|
451
444
|
value = getManufacturerCode(value)
|
|
452
445
|
}
|
|
453
446
|
return Number(value)
|
|
454
|
-
}
|
|
447
|
+
}
|
|
448
|
+
*/
|
|
455
449
|
|
|
456
450
|
fieldTypeMappers['Pressure'] = (field, value) => {
|
|
457
|
-
if (field.
|
|
451
|
+
if (field.Unit)
|
|
458
452
|
{
|
|
459
|
-
switch (field.
|
|
453
|
+
switch (field.Unit[0]) {
|
|
460
454
|
case 'h':
|
|
461
455
|
case 'H':
|
|
462
456
|
value /= 100;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canboat/canboatjs",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Native javascript version of canboat",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
],
|
|
54
54
|
"license": "Apache-2.0",
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@canboat/pgns": "
|
|
56
|
+
"@canboat/pgns": "3.x.x",
|
|
57
57
|
"bit-buffer": "0.2.3",
|
|
58
58
|
"date-fns": "2.0.0-alpha.27",
|
|
59
59
|
"debug": "^4.3.4",
|