@canboat/canboatjs 3.0.2 → 3.1.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/.github/workflows/test.yml +2 -2
- package/.github/workflows/test_canboat_changes.yml +91 -0
- package/.husky/pre-commit +4 -0
- package/.mocharc.js +7 -0
- package/.prettierrc.json +5 -0
- package/README.md +2 -7
- package/dist/actisense-serial.d.ts +17 -0
- package/dist/actisense-serial.d.ts.map +1 -0
- package/dist/actisense-serial.js +569 -0
- package/dist/actisense-serial.js.map +1 -0
- package/dist/bin/actisense-file.d.ts +3 -0
- package/dist/bin/actisense-file.d.ts.map +1 -0
- package/dist/bin/actisense-file.js +49 -0
- package/dist/bin/actisense-file.js.map +1 -0
- package/dist/bin/actisense-n2k-tcp.d.ts +3 -0
- package/dist/bin/actisense-n2k-tcp.d.ts.map +1 -0
- package/dist/bin/actisense-n2k-tcp.js +46 -0
- package/dist/bin/actisense-n2k-tcp.js.map +1 -0
- package/dist/bin/actisense-serialjs.d.ts +3 -0
- package/dist/bin/actisense-serialjs.d.ts.map +1 -0
- package/dist/bin/actisense-serialjs.js +51 -0
- package/dist/bin/actisense-serialjs.js.map +1 -0
- package/dist/bin/analyzerjs.d.ts +3 -0
- package/dist/bin/analyzerjs.d.ts.map +1 -0
- package/dist/bin/analyzerjs.js +61 -0
- package/dist/bin/analyzerjs.js.map +1 -0
- package/dist/bin/candumpanalyzerjs.d.ts +3 -0
- package/dist/bin/candumpanalyzerjs.d.ts.map +1 -0
- package/dist/bin/candumpanalyzerjs.js +31 -0
- package/dist/bin/candumpanalyzerjs.js.map +1 -0
- package/dist/bin/candumpjs.d.ts +3 -0
- package/dist/bin/candumpjs.d.ts.map +1 -0
- package/dist/bin/candumpjs.js +73 -0
- package/dist/bin/candumpjs.js.map +1 -0
- package/dist/bin/cansend.d.ts +3 -0
- package/dist/bin/cansend.d.ts.map +1 -0
- package/dist/bin/cansend.js +123 -0
- package/dist/bin/cansend.js.map +1 -0
- package/dist/bin/ikonvert-serial.d.ts +3 -0
- package/dist/bin/ikonvert-serial.d.ts.map +1 -0
- package/dist/bin/ikonvert-serial.js +36 -0
- package/dist/bin/ikonvert-serial.js.map +1 -0
- package/dist/bin/to-pgn.d.ts +3 -0
- package/dist/bin/to-pgn.d.ts.map +1 -0
- package/dist/bin/to-pgn.js +57 -0
- package/dist/bin/to-pgn.js.map +1 -0
- package/dist/canId.d.ts +21 -0
- package/dist/canId.d.ts.map +1 -0
- package/dist/canId.js +66 -0
- package/dist/canId.js.map +1 -0
- package/dist/canId.test.d.ts +2 -0
- package/dist/canId.test.d.ts.map +1 -0
- package/dist/canId.test.js +58 -0
- package/dist/canId.test.js.map +1 -0
- package/dist/canbus.d.ts +17 -0
- package/dist/canbus.d.ts.map +1 -0
- package/dist/canbus.js +261 -0
- package/dist/canbus.js.map +1 -0
- package/dist/candevice.d.ts +23 -0
- package/dist/candevice.d.ts.map +1 -0
- package/dist/candevice.js +38 -0
- package/dist/candevice.js.map +1 -0
- package/dist/codes.d.ts +2 -0
- package/dist/codes.d.ts.map +1 -0
- package/dist/codes.js +24 -0
- package/dist/codes.js.map +1 -0
- package/dist/discovery.d.ts +17 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +119 -0
- package/dist/discovery.js.map +1 -0
- package/dist/fromPgn.d.ts +51 -0
- package/dist/fromPgn.d.ts.map +1 -0
- package/dist/fromPgn.js +989 -0
- package/dist/fromPgn.js.map +1 -0
- package/dist/fromPgnStream.d.ts +17 -0
- package/dist/fromPgnStream.d.ts.map +1 -0
- package/dist/fromPgnStream.js +47 -0
- package/dist/fromPgnStream.js.map +1 -0
- package/dist/ikonvert.d.ts +17 -0
- package/dist/ikonvert.d.ts.map +1 -0
- package/dist/ikonvert.js +224 -0
- package/dist/ikonvert.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/n2k-actisense.d.ts +24 -0
- package/dist/n2k-actisense.d.ts.map +1 -0
- package/dist/n2k-actisense.js +126 -0
- package/dist/n2k-actisense.js.map +1 -0
- package/dist/n2k-actisense.test.d.ts +2 -0
- package/dist/n2k-actisense.test.d.ts.map +1 -0
- package/dist/n2k-actisense.test.js +49 -0
- package/dist/n2k-actisense.test.js.map +1 -0
- package/dist/n2kDevice.d.ts +40 -0
- package/dist/n2kDevice.d.ts.map +1 -0
- package/dist/n2kDevice.js +387 -0
- package/dist/n2kDevice.js.map +1 -0
- package/dist/ncanbus.d.ts +17 -0
- package/dist/ncanbus.d.ts.map +1 -0
- package/dist/ncanbus.js +92 -0
- package/dist/ncanbus.js.map +1 -0
- package/dist/pgns.d.ts +22 -0
- package/dist/pgns.d.ts.map +1 -0
- package/dist/pgns.js +157 -0
- package/dist/pgns.js.map +1 -0
- package/dist/pgns.test.d.ts +2 -0
- package/dist/pgns.test.d.ts.map +1 -0
- package/dist/pgns.test.js +14 -0
- package/dist/pgns.test.js.map +1 -0
- package/dist/simpleCan.d.ts +17 -0
- package/dist/simpleCan.d.ts.map +1 -0
- package/dist/simpleCan.js +125 -0
- package/dist/simpleCan.js.map +1 -0
- package/dist/stringMsg.d.ts +33 -0
- package/dist/stringMsg.d.ts.map +1 -0
- package/dist/stringMsg.js +359 -0
- package/dist/stringMsg.js.map +1 -0
- package/dist/stringMsg.test.d.ts +2 -0
- package/dist/stringMsg.test.d.ts.map +1 -0
- package/dist/stringMsg.test.js +244 -0
- package/dist/stringMsg.test.js.map +1 -0
- package/dist/toPgn.d.ts +34 -0
- package/dist/toPgn.d.ts.map +1 -0
- package/dist/toPgn.js +500 -0
- package/dist/toPgn.js.map +1 -0
- package/dist/utilities.d.ts +26 -0
- package/dist/utilities.d.ts.map +1 -0
- package/dist/utilities.js +112 -0
- package/dist/utilities.js.map +1 -0
- package/dist/utilities.test.d.ts +2 -0
- package/dist/utilities.test.d.ts.map +1 -0
- package/dist/utilities.test.js +9 -0
- package/dist/utilities.test.js.map +1 -0
- package/dist/venus-mqtt.d.ts +11 -0
- package/dist/venus-mqtt.d.ts.map +1 -0
- package/dist/venus-mqtt.js +100 -0
- package/dist/venus-mqtt.js.map +1 -0
- package/dist/venus.d.ts +11 -0
- package/dist/venus.d.ts.map +1 -0
- package/dist/venus.js +71 -0
- package/dist/venus.js.map +1 -0
- package/dist/w2k01.d.ts +17 -0
- package/dist/w2k01.d.ts.map +1 -0
- package/dist/w2k01.js +119 -0
- package/dist/w2k01.js.map +1 -0
- package/dist/yddevice.d.ts +25 -0
- package/dist/yddevice.d.ts.map +1 -0
- package/dist/yddevice.js +45 -0
- package/dist/yddevice.js.map +1 -0
- package/dist/ydgw02.d.ts +17 -0
- package/dist/ydgw02.d.ts.map +1 -0
- package/dist/ydgw02.js +163 -0
- package/dist/ydgw02.js.map +1 -0
- package/dist/ydvr.d.ts +17 -0
- package/dist/ydvr.d.ts.map +1 -0
- package/dist/ydvr.js +120 -0
- package/dist/ydvr.js.map +1 -0
- package/eslint.config.js +58 -0
- package/jest.config.js +5 -0
- package/lib/actisense-serial.ts +644 -0
- package/lib/bin/actisense-file.ts +53 -0
- package/lib/bin/actisense-n2k-tcp.ts +50 -0
- package/lib/bin/actisense-serialjs.ts +55 -0
- package/{bin/analyzerjs → lib/bin/analyzerjs.ts} +16 -15
- package/{bin/candumpjs → lib/bin/candumpjs.ts} +19 -20
- package/lib/bin/cansend.ts +131 -0
- package/lib/bin/ikonvert-serial.ts +44 -0
- package/{bin/to-pgn → lib/bin/to-pgn.ts} +23 -17
- package/lib/bin/ydvr-file +33 -0
- package/lib/canId.test.js +35 -15
- package/lib/canId.ts +84 -0
- package/lib/canbus.ts +293 -0
- package/lib/{candevice.js → candevice.ts} +14 -21
- package/lib/codes.ts +21 -0
- package/lib/{discovery.js → discovery.ts} +32 -30
- package/lib/fromPgn.ts +1207 -0
- package/lib/{fromPgnStream.js → fromPgnStream.ts} +17 -12
- package/lib/{ikonvert.js → ikonvert.ts} +90 -85
- package/lib/index.ts +48 -0
- package/lib/n2k-actisense.test.js +31 -32
- package/lib/n2k-actisense.ts +152 -0
- package/lib/n2kDevice.ts +458 -0
- package/lib/pgns.test.ts +12 -0
- package/lib/pgns.ts +191 -0
- package/lib/simpleCan.ts +140 -0
- package/lib/stringMsg.test.js +58 -41
- package/lib/stringMsg.ts +464 -0
- package/lib/toPgn.ts +597 -0
- package/lib/{utilities.js → utilities.ts} +48 -37
- package/lib/venus-mqtt.js +69 -73
- package/lib/venus.js +8 -8
- package/lib/{w2k01.js → w2k01.ts} +57 -44
- package/lib/{yddevice.js → yddevice.ts} +18 -13
- package/lib/{ydgw02.js → ydgw02.ts} +55 -47
- package/lib/ydvr.js +65 -147
- package/package.json +54 -18
- package/tsconfig.json +19 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/bin/actisense-file +0 -47
- package/bin/actisense-n2k-tcp +0 -45
- package/bin/actisense-serialjs +0 -52
- package/bin/candumpanalyzerjs +0 -29
- package/bin/cansend +0 -130
- package/bin/ikonvert-serial +0 -50
- package/bin/ydgw-analyzerjs +0 -36
- package/bin/ydvr-file +0 -33
- package/index.js +0 -53
- package/lib/canId.js +0 -64
- package/lib/canbus.js +0 -278
- package/lib/codes.js +0 -69
- package/lib/codes.test.js +0 -17
- package/lib/codesMfgs.json +0 -166
- package/lib/fromPgn.js +0 -1027
- package/lib/n2k-actisense.js +0 -108
- package/lib/n2kDevice.js +0 -390
- package/lib/pgns.js +0 -196
- package/lib/pgns.test.js +0 -13
- package/lib/serial.js +0 -647
- package/lib/simpleCan.js +0 -105
- package/lib/stringMsg.js +0 -339
- package/lib/toPgn.js +0 -518
package/lib/toPgn.js
DELETED
|
@@ -1,518 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2018 Scott Bender (scott@scottbender.net)
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const { getField } = require('./fromPgn')
|
|
18
|
-
const { pgns, getCustomPgn, lookupEnumerationValue, lookupFieldTypeEnumerationValue, lookupBitEnumerationName, lookupFieldTypeEnumerationBits } = require('./pgns')
|
|
19
|
-
const _ = require('lodash')
|
|
20
|
-
const BitStream = require('bit-buffer').BitStream
|
|
21
|
-
const Int64LE = require('int64-buffer').Int64LE
|
|
22
|
-
const Uint64LE = require('int64-buffer').Uint64LE
|
|
23
|
-
const { getPlainPGNs } = require('./utilities')
|
|
24
|
-
const { encodeActisense, encodeActisenseN2KACSII, encodeYDRAW, encodeYDRAWFull, parseActisense, encodePCDIN, encodeMXPGN, encodePDGY } = require('./stringMsg')
|
|
25
|
-
const { encodeN2KActisense } = require('./n2k-actisense')
|
|
26
|
-
const { encodeCanId } = require('./canId')
|
|
27
|
-
const { getIndustryCode, getManufacturerCode } = require('./codes')
|
|
28
|
-
const debug = require('debug')('canboatjs:toPgn')
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
var fieldTypeWriters = {}
|
|
35
|
-
var fieldTypeMappers = {}
|
|
36
|
-
|
|
37
|
-
var lengthsOff = { 129029: 45, 127257:8, 127258:8, 127251:8 }
|
|
38
|
-
|
|
39
|
-
const a126208_oldKey = '# of Parameters'
|
|
40
|
-
const a126208_newKey = 'Number of Parameters'
|
|
41
|
-
|
|
42
|
-
function toPgn(data) {
|
|
43
|
-
const customPgns = getCustomPgn(data.pgn)
|
|
44
|
-
let pgnList = pgns[data.pgn]
|
|
45
|
-
if (!pgnList && !customPgns ) {
|
|
46
|
-
debug("no pgn found: " + data.pgn)
|
|
47
|
-
return
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if ( customPgns ) {
|
|
51
|
-
pgnList = [ ...customPgns.definitions, ...(pgnList || []) ]
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const pgn_number = data.pgn
|
|
55
|
-
var pgnData = pgnList[0]
|
|
56
|
-
|
|
57
|
-
var bs = new BitStream(Buffer.alloc(500))
|
|
58
|
-
|
|
59
|
-
if ( data.fields ) {
|
|
60
|
-
data = data.fields
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if ( pgn_number === 126208 && !data[a126208_newKey] && data[a126208_oldKey] ) {
|
|
64
|
-
//a bit of a hack because this field name changed and I'm sure there is code out
|
|
65
|
-
//there that still uses the old field name
|
|
66
|
-
|
|
67
|
-
data[a126208_newKey] = data[a126208_oldKey]
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
var fields = pgnData.Fields
|
|
71
|
-
if ( !_.isArray(fields) ) {
|
|
72
|
-
fields = [ fields.Field ]
|
|
73
|
-
}
|
|
74
|
-
let RepeatingFields = pgnData.RepeatingFieldSet1Size ? pgnData.RepeatingFieldSet1Size : 0
|
|
75
|
-
for ( var index = 0; index < fields.length - RepeatingFields; index++ ) {
|
|
76
|
-
var field = fields[index]
|
|
77
|
-
var value = data[field.Name] !== undefined ? data[field.Name] : data[field.Id]
|
|
78
|
-
|
|
79
|
-
if ( !_.isUndefined(field.Match) ) {
|
|
80
|
-
//console.log(`matching ${field.Name} ${field.Match} ${value} ${_.isString(value)}`)
|
|
81
|
-
if ( _.isString(value) ) {
|
|
82
|
-
pgnList = pgnList.filter(f => f.Fields[index].Description == value)
|
|
83
|
-
} else {
|
|
84
|
-
pgnList = pgnList.filter(f => f.Fields[index].Match == value)
|
|
85
|
-
}
|
|
86
|
-
if ( pgnList.length > 0 ) {
|
|
87
|
-
//console.log(`matched ${field.Name} ${pgnList[0].Fields[index].Match}`)
|
|
88
|
-
pgnData = pgnList[0]
|
|
89
|
-
value = pgnData.Fields[index].Match
|
|
90
|
-
fields = pgnData.Fields
|
|
91
|
-
RepeatingFields = pgnData.RepeatingFieldSet1Size ? pgnData.RepeatingFieldSet1Size : 0
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
writeField(bs, pgn_number, field, data, value, fields)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if ( data.list ) {
|
|
98
|
-
data.list.forEach(repeat => {
|
|
99
|
-
for (var index = 0; index < RepeatingFields; index++ ) {
|
|
100
|
-
var field = fields[pgnData.Fields.length-RepeatingFields+index]
|
|
101
|
-
var value = repeat[field.Name] !== undefined ? repeat[field.Name] : repeat[field.Id]
|
|
102
|
-
|
|
103
|
-
writeField(bs, pgn_number, field, data, value, fields)
|
|
104
|
-
}
|
|
105
|
-
})
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
var bitsLeft = (bs.byteIndex * 8) - bs.index
|
|
109
|
-
if ( bitsLeft > 0 ) {
|
|
110
|
-
//finish off the last byte
|
|
111
|
-
bs.writeBits(0xffff, bitsLeft)
|
|
112
|
-
//console.log(`bits left ${bitsLeft}`)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if ( pgnData.Length != 0xff
|
|
116
|
-
&& fields[fields.length-1].FieldType != RES_STRINGLAU
|
|
117
|
-
&& fields[fields.length-1].FieldType != RES_STRINGLZ
|
|
118
|
-
&& !RepeatingFields ) {
|
|
119
|
-
|
|
120
|
-
var len = lengthsOff[pgnData.PGN] || pgnData.Length
|
|
121
|
-
//console.log(`Length ${len}`)
|
|
122
|
-
|
|
123
|
-
if ( bs.byteIndex < len ) {
|
|
124
|
-
//console.log(`bytes left ${pgnData.Length-bs.byteIndex}`)
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
for ( var i = bs.byteIndex; i < len; i++ ) {
|
|
128
|
-
bs.writeUint8(0xff)
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return bs.view.buffer.slice(0, bs.byteIndex)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function dumpWritten(bs, field, startPos, value) {
|
|
136
|
-
//console.log(`${startPos} ${bs.byteIndex}`)
|
|
137
|
-
if ( startPos == bs.byteIndex )
|
|
138
|
-
startPos--
|
|
139
|
-
var string = `${field.Name} (${field.BitLength}): [`
|
|
140
|
-
for ( var i = startPos; i < bs.byteIndex; i++ ) {
|
|
141
|
-
string = string + bs.view.buffer[i].toString(16) + ', '
|
|
142
|
-
}
|
|
143
|
-
console.log(string + `] ${value}`)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function writeField(bs, pgn_number, field, data, value, fields, bitLength) {
|
|
147
|
-
var startPos = bs.byteIndex
|
|
148
|
-
|
|
149
|
-
if ( _.isUndefined(bitLength) ) {
|
|
150
|
-
if ( field.BitLengthVariable && field.FieldType === "DYNAMIC_FIELD_VALUE" ) {
|
|
151
|
-
bitLength = lookupKeyBitLength(data, fields)
|
|
152
|
-
} else {
|
|
153
|
-
bitLength = field.BitLength
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// console.log(`${field.Name}:${value}(${bitLength}-${field.Resolution})`)
|
|
158
|
-
if ( _.isUndefined(value) || value === null) {
|
|
159
|
-
if ( field.FieldType && fieldTypeWriters[field.FieldType] ) {
|
|
160
|
-
fieldTypeWriters[field.FieldType](pgn_number, field, value, bs)
|
|
161
|
-
} else if ( bitLength % 8 == 0 ) {
|
|
162
|
-
var bytes = bitLength/8
|
|
163
|
-
var lastByte = field.Signed ? 0x7f : 0xff
|
|
164
|
-
var byte = field.Name.startsWith('Reserved') ? 0x00 : 0xff
|
|
165
|
-
for ( var i = 0; i < bytes-1; i++ ) {
|
|
166
|
-
bs.writeUint8(0xff)
|
|
167
|
-
}
|
|
168
|
-
bs.writeUint8(field.Signed ? 0x7f : 0xff)
|
|
169
|
-
} else {
|
|
170
|
-
bs.writeBits(0xffffffff, bitLength)
|
|
171
|
-
}
|
|
172
|
-
} else {
|
|
173
|
-
let type = field.FieldType
|
|
174
|
-
if ( field.Id === 'industryCode' ) {
|
|
175
|
-
if ( _.isString(value) ) {
|
|
176
|
-
value = Number(getIndustryCode(value))
|
|
177
|
-
}
|
|
178
|
-
} else if ( type && fieldTypeMappers[type] ) {
|
|
179
|
-
value = fieldTypeMappers[type](field, value)
|
|
180
|
-
} else if ((field.FieldType === 'LOOKUP' ||
|
|
181
|
-
field.FieldType === 'DYNAMIC_FIELD_KEY') && _.isString(value)) {
|
|
182
|
-
if (!(field.Id === "timeStamp" && value < 60)) {
|
|
183
|
-
value = lookup(field, value)
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if ( field.FieldType == "NUMBER" && _.isString(value) ) {
|
|
188
|
-
value = Number(value)
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (field.Resolution && typeof value === 'number' ) {
|
|
192
|
-
value = Number((value / field.Resolution).toFixed(0))
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if ( field.FieldType && fieldTypeWriters[field.FieldType] ) {
|
|
196
|
-
fieldTypeWriters[field.FieldType](pgn_number, field, value, bs)
|
|
197
|
-
} else {
|
|
198
|
-
/*
|
|
199
|
-
if ( _.isString(value) && typeof bitLength !== 'undefined' && bitLength !== 0 ) {
|
|
200
|
-
value = Number(value)
|
|
201
|
-
}
|
|
202
|
-
*/
|
|
203
|
-
|
|
204
|
-
if ( field.Unit === "kWh" ) {
|
|
205
|
-
value /= 3.6e6; // 1 kWh = 3.6 MJ.
|
|
206
|
-
} else if (field.Unit === "Ah") {
|
|
207
|
-
value /= 3600.0; // 1 Ah = 3600 C.
|
|
208
|
-
}
|
|
209
|
-
if ( field.Offset ) {
|
|
210
|
-
value -= field.Offset
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if ( field.FieldType === 'VARIABLE' ) {
|
|
214
|
-
writeVariableLengthField(bs, pgn_number, data, field, value, fields)
|
|
215
|
-
} else if ( _.isBuffer(value) ) {
|
|
216
|
-
value.copy(bs.view.buffer, bs.byteIndex)
|
|
217
|
-
bs.byteIndex += value.length
|
|
218
|
-
} else if (bitLength === 8) {
|
|
219
|
-
if (field.Signed) {
|
|
220
|
-
bs.writeInt8(value)
|
|
221
|
-
} else {
|
|
222
|
-
bs.writeUint8(value)
|
|
223
|
-
}
|
|
224
|
-
} else if (bitLength === 16) {
|
|
225
|
-
if (field.Signed) {
|
|
226
|
-
bs.writeInt16(value)
|
|
227
|
-
} else {
|
|
228
|
-
bs.writeUint16(value)
|
|
229
|
-
}
|
|
230
|
-
} else if (bitLength === 32) {
|
|
231
|
-
if (field.Signed) {
|
|
232
|
-
bs.writeInt32(value)
|
|
233
|
-
} else {
|
|
234
|
-
bs.writeUint32(value)
|
|
235
|
-
}
|
|
236
|
-
} else if (bitLength === 48 || bitLength == 24) {
|
|
237
|
-
var count = bitLength/8;
|
|
238
|
-
var val = value;
|
|
239
|
-
if ( value < 0 ) {
|
|
240
|
-
val++
|
|
241
|
-
}
|
|
242
|
-
while (count-- > 0 ) {
|
|
243
|
-
if ( value > 0 ) {
|
|
244
|
-
bs.writeUint8(val & 255);
|
|
245
|
-
val /= 256;
|
|
246
|
-
} else {
|
|
247
|
-
bs.writeUint8(((-val) & 255) ^ 255);
|
|
248
|
-
val /= 256;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
} else if (bitLength === 64) {
|
|
252
|
-
var num
|
|
253
|
-
if (field.Signed) {
|
|
254
|
-
num = new Int64LE(value)
|
|
255
|
-
} else {
|
|
256
|
-
num = new Int64LE(value)
|
|
257
|
-
}
|
|
258
|
-
var buf = num.toBuffer()
|
|
259
|
-
buf.copy(bs.view.buffer, bs.byteIndex)
|
|
260
|
-
bs.byteIndex += buf.length
|
|
261
|
-
} else {
|
|
262
|
-
bs.writeBits(value, bitLength)
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
//dumpWritten(bs, field, startPos, value)
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
function writeVariableLengthField(bs, pgn_number, pgn, field, value, fields) {
|
|
270
|
-
var refField = getField(pgn.PGN, bs.view.buffer[bs.byteIndex-1]-1, pgn)
|
|
271
|
-
|
|
272
|
-
if ( refField ) {
|
|
273
|
-
var bits = (refField.BitLength + 7) & ~7; // Round # of bits in field refField up to complete bytes: 1->8, 7->8, 8->8 etc.
|
|
274
|
-
|
|
275
|
-
return writeField(bs, pgn_number, refField, pgn, value, fields, bits)
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function lookup(field, stringValue) {
|
|
280
|
-
var res
|
|
281
|
-
if ( field.LookupEnumeration ) {
|
|
282
|
-
res = lookupEnumerationValue(field.LookupEnumeration, stringValue)
|
|
283
|
-
} else {
|
|
284
|
-
res = lookupFieldTypeEnumerationValue(field.LookupFieldTypeEnumeration, stringValue)
|
|
285
|
-
}
|
|
286
|
-
return _.isUndefined(res) ? stringValue : res
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
function lookupKeyBitLength(data, fields)
|
|
290
|
-
{
|
|
291
|
-
let field = fields.find(field => (field.Name === 'Key'))
|
|
292
|
-
|
|
293
|
-
let val = data['Key'] || data['key']
|
|
294
|
-
if ( typeof val === 'string' ) {
|
|
295
|
-
val = lookupFieldTypeEnumerationValue(field.LookupFieldTypeEnumeration, val)
|
|
296
|
-
}
|
|
297
|
-
return lookupFieldTypeEnumerationBits(field.LookupFieldTypeEnumeration, val)
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
function isDefined(value) {
|
|
301
|
-
return typeof value !== 'undefined' && value != null
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
function parseHex(s) {
|
|
305
|
-
return parseInt(s, 16)
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
function canboat2Buffer(canboatData) {
|
|
309
|
-
return Buffer.alloc(canboatData.split(',').slice(6).map(parseHex), 'hex')
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
function pgnToActisenseSerialFormat(pgn) {
|
|
313
|
-
return encodeActisense({ pgn: pgn.pgn, data: toPgn(pgn), dst: pgn.dst, src: pgn.src, prio: pgn.prio})
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
function pgnToActisenseN2KAsciiFormat(pgn) {
|
|
317
|
-
return encodeActisenseN2KACSII({ pgn: pgn.pgn, data: toPgn(pgn), dst: pgn.dst, src: pgn.src, prio: pgn.prio})
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
function pgnToN2KActisenseFormat(pgn) {
|
|
321
|
-
return encodeN2KActisense({ pgn: pgn.pgn, data: toPgn(pgn), dst: pgn.dst, src: pgn.src, prio: pgn.prio})
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
function toiKonvertSerialFormat(pgn, data, dst=255) {
|
|
325
|
-
return `!PDGY,${pgn},${dst},${data.toString('base64')}`
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
function pgnToiKonvertSerialFormat(pgn) {
|
|
329
|
-
return toiKonvertSerialFormat(pgn.pgn, toPgn(pgn), pgn.dst)
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
function pgnToYdgwRawFormat(info) {
|
|
333
|
-
return encodeYDRAW({ ...info, data: toPgn(info) })
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
function pgnToYdgwFullRawFormat(info) {
|
|
337
|
-
return encodeYDRAWFull({ ...info, data: toPgn(info) })
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
function pgnToPCDIN(info) {
|
|
341
|
-
return encodePCDIN({ ...info, data: toPgn(info) })
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
function pgnToMXPGN(info) {
|
|
345
|
-
return encodeMXPGN({ ...info, data: toPgn(info) })
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const actisenseToYdgwRawFormat = _.flow(parseActisense, encodeYDRAW)
|
|
349
|
-
const actisenseToYdgwFullRawFormat = _.flow(parseActisense, encodeYDRAWFull)
|
|
350
|
-
const actisenseToPCDIN = _.flow(parseActisense, encodePCDIN)
|
|
351
|
-
const actisenseToMXPGN = _.flow(parseActisense, encodeMXPGN)
|
|
352
|
-
const actisenseToiKonvert = _.flow(parseActisense, encodePDGY)
|
|
353
|
-
const actisenseToN2KAsciiFormat = _.flow(parseActisense, encodeActisenseN2KACSII)
|
|
354
|
-
const actisenseToN2KActisenseFormat = _.flow(parseActisense, encodeN2KActisense)
|
|
355
|
-
|
|
356
|
-
function bitIsSet(field, index, value) {
|
|
357
|
-
return value.indexOf(lookupBitEnumerationName(field.LookupBitEnumeration, index)) != -1
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
fieldTypeWriters['BITLOOKUP'] = (pgn, field, value, bs) => {
|
|
361
|
-
if ( _.isUndefined(value) || value.length === 0 ) {
|
|
362
|
-
if ( field.BitLength % 8 == 0 ) {
|
|
363
|
-
var bytes = field.BitLength/8
|
|
364
|
-
var lastByte = field.Signed ? 0x7f : 0xff
|
|
365
|
-
for ( var i = 0; i < bytes-1; i++ ) {
|
|
366
|
-
bs.writeUint8(0x0)
|
|
367
|
-
}
|
|
368
|
-
bs.writeUint8(0x0)
|
|
369
|
-
} else {
|
|
370
|
-
bs.writeBits(0xffffffff, field.BitLength)
|
|
371
|
-
}
|
|
372
|
-
} else {
|
|
373
|
-
for ( var i = 0; i < field.BitLength; i++ ) {
|
|
374
|
-
bs.writeBits(bitIsSet(field, i, value) ? 1 : 0, 1)
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
fieldTypeWriters['STRING_FIX'] = (pgn, field, value, bs) => {
|
|
380
|
-
|
|
381
|
-
let fill = 0xff
|
|
382
|
-
if ( (pgn === 129810 && (field.Name === "Vendor ID" || field.Name === "Callsign")) || (pgn === 129809 && field.Name === 'Name') ) {
|
|
383
|
-
if ( _.isUndefined(value) || value.length == 0 ) {
|
|
384
|
-
{
|
|
385
|
-
fill = 0x40
|
|
386
|
-
value = ""
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
if ( _.isUndefined(value) ) {
|
|
392
|
-
value = ""
|
|
393
|
-
}
|
|
394
|
-
var fieldLen = field.BitLength / 8
|
|
395
|
-
|
|
396
|
-
for ( var i = 0; i < value.length; i++ ) {
|
|
397
|
-
bs.writeUint8(value.charCodeAt(i))
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
for ( var i = 0; i < fieldLen - value.length; i++ ) {
|
|
401
|
-
bs.writeUint8(fill)
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
fieldTypeWriters[RES_STRINGLZ] = (pgn, field, value, bs) => {
|
|
406
|
-
if ( _.isUndefined(value) ) {
|
|
407
|
-
value = ""
|
|
408
|
-
}
|
|
409
|
-
bs.writeUint8(value.length)
|
|
410
|
-
for ( var i = 0; i < value.length; i++ ) {
|
|
411
|
-
bs.writeUint8(value.charCodeAt(i))
|
|
412
|
-
}
|
|
413
|
-
bs.writeUint8(0)
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
fieldTypeWriters["String with start/stop byte"] = (pgn, field, value, bs) => {
|
|
417
|
-
if ( _.isUndefined(value) ) {
|
|
418
|
-
value = ""
|
|
419
|
-
}
|
|
420
|
-
bs.writeUint8(0x02)
|
|
421
|
-
for ( var i = 0; i < value.length; i++ ) {
|
|
422
|
-
bs.writeUint8(value.charCodeAt(i))
|
|
423
|
-
}
|
|
424
|
-
bs.writeUint8(0x01)
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
fieldTypeWriters[RES_STRINGLAU] = (pgn, field, value, bs) => {
|
|
428
|
-
if ( pgn === 129041 && field.Name === "AtoN Name" ) {
|
|
429
|
-
if ( value.length > 18 ) {
|
|
430
|
-
value = value.substring(0, 18)
|
|
431
|
-
} else {
|
|
432
|
-
value = value.padEnd(18, ' ')
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
bs.writeUint8(value ? value.length+2 : 2)
|
|
437
|
-
bs.writeUint8(1)
|
|
438
|
-
|
|
439
|
-
if ( value ) {
|
|
440
|
-
for ( var idx = 0; idx < value.length; idx++ ) {
|
|
441
|
-
bs.writeUint8(value.charCodeAt(idx))
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
fieldTypeMappers['DATE'] = (field, value) => {
|
|
447
|
-
//console.log(`Date: ${value}`)
|
|
448
|
-
if ( _.isString(value) ) {
|
|
449
|
-
var date = new Date(value)
|
|
450
|
-
return date.getTime() / 86400 / 1000
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
return value
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
fieldTypeMappers['TIME'] = (field, value) => {
|
|
457
|
-
if ( _.isString(value) ) {
|
|
458
|
-
var split = value.split(':')
|
|
459
|
-
|
|
460
|
-
var hours = Number(split[0])
|
|
461
|
-
var minutes = Number(split[1])
|
|
462
|
-
var seconds = Number(split[2])
|
|
463
|
-
|
|
464
|
-
value = (hours * 60 * 60) + (minutes * 60) + seconds
|
|
465
|
-
}
|
|
466
|
-
return value
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
fieldTypeMappers['DURATION'] = fieldTypeMappers['TIME']
|
|
470
|
-
|
|
471
|
-
/*
|
|
472
|
-
fieldTypeMappers['Manufacturer code'] = (field, value) => {
|
|
473
|
-
if ( _.isString(value) ) {
|
|
474
|
-
value = getManufacturerCode(value)
|
|
475
|
-
}
|
|
476
|
-
return Number(value)
|
|
477
|
-
}
|
|
478
|
-
*/
|
|
479
|
-
|
|
480
|
-
fieldTypeMappers['Pressure'] = (field, value) => {
|
|
481
|
-
if (field.Unit)
|
|
482
|
-
{
|
|
483
|
-
switch (field.Unit[0]) {
|
|
484
|
-
case 'h':
|
|
485
|
-
case 'H':
|
|
486
|
-
value /= 100;
|
|
487
|
-
break;
|
|
488
|
-
case 'k':
|
|
489
|
-
case 'K':
|
|
490
|
-
value /= 1000;
|
|
491
|
-
break;
|
|
492
|
-
case 'd':
|
|
493
|
-
value *= 10;
|
|
494
|
-
break;
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
return value
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
module.exports.canboat2Buffer = canboat2Buffer
|
|
502
|
-
module.exports.toPgn = toPgn
|
|
503
|
-
module.exports.toiKonvertSerialFormat = toiKonvertSerialFormat
|
|
504
|
-
module.exports.pgnToiKonvertSerialFormat = pgnToiKonvertSerialFormat
|
|
505
|
-
module.exports.pgnToYdgwRawFormat = pgnToYdgwRawFormat
|
|
506
|
-
module.exports.pgnToYdgwFullRawFormat = pgnToYdgwFullRawFormat
|
|
507
|
-
module.exports.actisenseToYdgwRawFormat = actisenseToYdgwRawFormat
|
|
508
|
-
module.exports.actisenseToYdgwFullRawFormat = actisenseToYdgwFullRawFormat
|
|
509
|
-
module.exports.pgnToActisenseSerialFormat = pgnToActisenseSerialFormat
|
|
510
|
-
module.exports.pgnToActisenseN2KAsciiFormat = pgnToActisenseN2KAsciiFormat
|
|
511
|
-
module.exports.pgnToN2KActisenseFormat = pgnToN2KActisenseFormat
|
|
512
|
-
module.exports.pgnToPCDIN = pgnToPCDIN
|
|
513
|
-
module.exports.actisenseToPCDIN = actisenseToPCDIN
|
|
514
|
-
module.exports.pgnToMXPGN = pgnToMXPGN
|
|
515
|
-
module.exports.actisenseToMXPGN = actisenseToMXPGN
|
|
516
|
-
module.exports.actisenseToiKonvert = actisenseToiKonvert
|
|
517
|
-
module.exports.actisenseToN2KAsciiFormat = actisenseToN2KAsciiFormat
|
|
518
|
-
module.exports.actisenseToN2KActisenseFormat = actisenseToN2KActisenseFormat
|