@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.
Files changed (222) hide show
  1. package/.github/workflows/test.yml +2 -2
  2. package/.github/workflows/test_canboat_changes.yml +91 -0
  3. package/.husky/pre-commit +4 -0
  4. package/.mocharc.js +7 -0
  5. package/.prettierrc.json +5 -0
  6. package/README.md +2 -7
  7. package/dist/actisense-serial.d.ts +17 -0
  8. package/dist/actisense-serial.d.ts.map +1 -0
  9. package/dist/actisense-serial.js +569 -0
  10. package/dist/actisense-serial.js.map +1 -0
  11. package/dist/bin/actisense-file.d.ts +3 -0
  12. package/dist/bin/actisense-file.d.ts.map +1 -0
  13. package/dist/bin/actisense-file.js +49 -0
  14. package/dist/bin/actisense-file.js.map +1 -0
  15. package/dist/bin/actisense-n2k-tcp.d.ts +3 -0
  16. package/dist/bin/actisense-n2k-tcp.d.ts.map +1 -0
  17. package/dist/bin/actisense-n2k-tcp.js +46 -0
  18. package/dist/bin/actisense-n2k-tcp.js.map +1 -0
  19. package/dist/bin/actisense-serialjs.d.ts +3 -0
  20. package/dist/bin/actisense-serialjs.d.ts.map +1 -0
  21. package/dist/bin/actisense-serialjs.js +51 -0
  22. package/dist/bin/actisense-serialjs.js.map +1 -0
  23. package/dist/bin/analyzerjs.d.ts +3 -0
  24. package/dist/bin/analyzerjs.d.ts.map +1 -0
  25. package/dist/bin/analyzerjs.js +61 -0
  26. package/dist/bin/analyzerjs.js.map +1 -0
  27. package/dist/bin/candumpanalyzerjs.d.ts +3 -0
  28. package/dist/bin/candumpanalyzerjs.d.ts.map +1 -0
  29. package/dist/bin/candumpanalyzerjs.js +31 -0
  30. package/dist/bin/candumpanalyzerjs.js.map +1 -0
  31. package/dist/bin/candumpjs.d.ts +3 -0
  32. package/dist/bin/candumpjs.d.ts.map +1 -0
  33. package/dist/bin/candumpjs.js +73 -0
  34. package/dist/bin/candumpjs.js.map +1 -0
  35. package/dist/bin/cansend.d.ts +3 -0
  36. package/dist/bin/cansend.d.ts.map +1 -0
  37. package/dist/bin/cansend.js +123 -0
  38. package/dist/bin/cansend.js.map +1 -0
  39. package/dist/bin/ikonvert-serial.d.ts +3 -0
  40. package/dist/bin/ikonvert-serial.d.ts.map +1 -0
  41. package/dist/bin/ikonvert-serial.js +36 -0
  42. package/dist/bin/ikonvert-serial.js.map +1 -0
  43. package/dist/bin/to-pgn.d.ts +3 -0
  44. package/dist/bin/to-pgn.d.ts.map +1 -0
  45. package/dist/bin/to-pgn.js +57 -0
  46. package/dist/bin/to-pgn.js.map +1 -0
  47. package/dist/canId.d.ts +21 -0
  48. package/dist/canId.d.ts.map +1 -0
  49. package/dist/canId.js +66 -0
  50. package/dist/canId.js.map +1 -0
  51. package/dist/canId.test.d.ts +2 -0
  52. package/dist/canId.test.d.ts.map +1 -0
  53. package/dist/canId.test.js +58 -0
  54. package/dist/canId.test.js.map +1 -0
  55. package/dist/canbus.d.ts +17 -0
  56. package/dist/canbus.d.ts.map +1 -0
  57. package/dist/canbus.js +261 -0
  58. package/dist/canbus.js.map +1 -0
  59. package/dist/candevice.d.ts +23 -0
  60. package/dist/candevice.d.ts.map +1 -0
  61. package/dist/candevice.js +38 -0
  62. package/dist/candevice.js.map +1 -0
  63. package/dist/codes.d.ts +2 -0
  64. package/dist/codes.d.ts.map +1 -0
  65. package/dist/codes.js +24 -0
  66. package/dist/codes.js.map +1 -0
  67. package/dist/discovery.d.ts +17 -0
  68. package/dist/discovery.d.ts.map +1 -0
  69. package/dist/discovery.js +119 -0
  70. package/dist/discovery.js.map +1 -0
  71. package/dist/fromPgn.d.ts +51 -0
  72. package/dist/fromPgn.d.ts.map +1 -0
  73. package/dist/fromPgn.js +989 -0
  74. package/dist/fromPgn.js.map +1 -0
  75. package/dist/fromPgnStream.d.ts +17 -0
  76. package/dist/fromPgnStream.d.ts.map +1 -0
  77. package/dist/fromPgnStream.js +47 -0
  78. package/dist/fromPgnStream.js.map +1 -0
  79. package/dist/ikonvert.d.ts +17 -0
  80. package/dist/ikonvert.d.ts.map +1 -0
  81. package/dist/ikonvert.js +224 -0
  82. package/dist/ikonvert.js.map +1 -0
  83. package/dist/index.d.ts +31 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +60 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/n2k-actisense.d.ts +24 -0
  88. package/dist/n2k-actisense.d.ts.map +1 -0
  89. package/dist/n2k-actisense.js +126 -0
  90. package/dist/n2k-actisense.js.map +1 -0
  91. package/dist/n2k-actisense.test.d.ts +2 -0
  92. package/dist/n2k-actisense.test.d.ts.map +1 -0
  93. package/dist/n2k-actisense.test.js +49 -0
  94. package/dist/n2k-actisense.test.js.map +1 -0
  95. package/dist/n2kDevice.d.ts +40 -0
  96. package/dist/n2kDevice.d.ts.map +1 -0
  97. package/dist/n2kDevice.js +387 -0
  98. package/dist/n2kDevice.js.map +1 -0
  99. package/dist/ncanbus.d.ts +17 -0
  100. package/dist/ncanbus.d.ts.map +1 -0
  101. package/dist/ncanbus.js +92 -0
  102. package/dist/ncanbus.js.map +1 -0
  103. package/dist/pgns.d.ts +22 -0
  104. package/dist/pgns.d.ts.map +1 -0
  105. package/dist/pgns.js +157 -0
  106. package/dist/pgns.js.map +1 -0
  107. package/dist/pgns.test.d.ts +2 -0
  108. package/dist/pgns.test.d.ts.map +1 -0
  109. package/dist/pgns.test.js +14 -0
  110. package/dist/pgns.test.js.map +1 -0
  111. package/dist/simpleCan.d.ts +17 -0
  112. package/dist/simpleCan.d.ts.map +1 -0
  113. package/dist/simpleCan.js +125 -0
  114. package/dist/simpleCan.js.map +1 -0
  115. package/dist/stringMsg.d.ts +33 -0
  116. package/dist/stringMsg.d.ts.map +1 -0
  117. package/dist/stringMsg.js +359 -0
  118. package/dist/stringMsg.js.map +1 -0
  119. package/dist/stringMsg.test.d.ts +2 -0
  120. package/dist/stringMsg.test.d.ts.map +1 -0
  121. package/dist/stringMsg.test.js +244 -0
  122. package/dist/stringMsg.test.js.map +1 -0
  123. package/dist/toPgn.d.ts +34 -0
  124. package/dist/toPgn.d.ts.map +1 -0
  125. package/dist/toPgn.js +500 -0
  126. package/dist/toPgn.js.map +1 -0
  127. package/dist/utilities.d.ts +26 -0
  128. package/dist/utilities.d.ts.map +1 -0
  129. package/dist/utilities.js +112 -0
  130. package/dist/utilities.js.map +1 -0
  131. package/dist/utilities.test.d.ts +2 -0
  132. package/dist/utilities.test.d.ts.map +1 -0
  133. package/dist/utilities.test.js +9 -0
  134. package/dist/utilities.test.js.map +1 -0
  135. package/dist/venus-mqtt.d.ts +11 -0
  136. package/dist/venus-mqtt.d.ts.map +1 -0
  137. package/dist/venus-mqtt.js +100 -0
  138. package/dist/venus-mqtt.js.map +1 -0
  139. package/dist/venus.d.ts +11 -0
  140. package/dist/venus.d.ts.map +1 -0
  141. package/dist/venus.js +71 -0
  142. package/dist/venus.js.map +1 -0
  143. package/dist/w2k01.d.ts +17 -0
  144. package/dist/w2k01.d.ts.map +1 -0
  145. package/dist/w2k01.js +119 -0
  146. package/dist/w2k01.js.map +1 -0
  147. package/dist/yddevice.d.ts +25 -0
  148. package/dist/yddevice.d.ts.map +1 -0
  149. package/dist/yddevice.js +45 -0
  150. package/dist/yddevice.js.map +1 -0
  151. package/dist/ydgw02.d.ts +17 -0
  152. package/dist/ydgw02.d.ts.map +1 -0
  153. package/dist/ydgw02.js +163 -0
  154. package/dist/ydgw02.js.map +1 -0
  155. package/dist/ydvr.d.ts +17 -0
  156. package/dist/ydvr.d.ts.map +1 -0
  157. package/dist/ydvr.js +120 -0
  158. package/dist/ydvr.js.map +1 -0
  159. package/eslint.config.js +58 -0
  160. package/jest.config.js +5 -0
  161. package/lib/actisense-serial.ts +644 -0
  162. package/lib/bin/actisense-file.ts +53 -0
  163. package/lib/bin/actisense-n2k-tcp.ts +50 -0
  164. package/lib/bin/actisense-serialjs.ts +55 -0
  165. package/{bin/analyzerjs → lib/bin/analyzerjs.ts} +16 -15
  166. package/{bin/candumpjs → lib/bin/candumpjs.ts} +19 -20
  167. package/lib/bin/cansend.ts +131 -0
  168. package/lib/bin/ikonvert-serial.ts +44 -0
  169. package/{bin/to-pgn → lib/bin/to-pgn.ts} +23 -17
  170. package/lib/bin/ydvr-file +33 -0
  171. package/lib/canId.test.js +35 -15
  172. package/lib/canId.ts +84 -0
  173. package/lib/canbus.ts +293 -0
  174. package/lib/{candevice.js → candevice.ts} +14 -21
  175. package/lib/codes.ts +21 -0
  176. package/lib/{discovery.js → discovery.ts} +32 -30
  177. package/lib/fromPgn.ts +1207 -0
  178. package/lib/{fromPgnStream.js → fromPgnStream.ts} +17 -12
  179. package/lib/{ikonvert.js → ikonvert.ts} +90 -85
  180. package/lib/index.ts +48 -0
  181. package/lib/n2k-actisense.test.js +31 -32
  182. package/lib/n2k-actisense.ts +152 -0
  183. package/lib/n2kDevice.ts +458 -0
  184. package/lib/pgns.test.ts +12 -0
  185. package/lib/pgns.ts +191 -0
  186. package/lib/simpleCan.ts +140 -0
  187. package/lib/stringMsg.test.js +58 -41
  188. package/lib/stringMsg.ts +464 -0
  189. package/lib/toPgn.ts +597 -0
  190. package/lib/{utilities.js → utilities.ts} +48 -37
  191. package/lib/venus-mqtt.js +69 -73
  192. package/lib/venus.js +8 -8
  193. package/lib/{w2k01.js → w2k01.ts} +57 -44
  194. package/lib/{yddevice.js → yddevice.ts} +18 -13
  195. package/lib/{ydgw02.js → ydgw02.ts} +55 -47
  196. package/lib/ydvr.js +65 -147
  197. package/package.json +54 -18
  198. package/tsconfig.json +19 -0
  199. package/tsconfig.tsbuildinfo +1 -0
  200. package/bin/actisense-file +0 -47
  201. package/bin/actisense-n2k-tcp +0 -45
  202. package/bin/actisense-serialjs +0 -52
  203. package/bin/candumpanalyzerjs +0 -29
  204. package/bin/cansend +0 -130
  205. package/bin/ikonvert-serial +0 -50
  206. package/bin/ydgw-analyzerjs +0 -36
  207. package/bin/ydvr-file +0 -33
  208. package/index.js +0 -53
  209. package/lib/canId.js +0 -64
  210. package/lib/canbus.js +0 -278
  211. package/lib/codes.js +0 -69
  212. package/lib/codes.test.js +0 -17
  213. package/lib/codesMfgs.json +0 -166
  214. package/lib/fromPgn.js +0 -1027
  215. package/lib/n2k-actisense.js +0 -108
  216. package/lib/n2kDevice.js +0 -390
  217. package/lib/pgns.js +0 -196
  218. package/lib/pgns.test.js +0 -13
  219. package/lib/serial.js +0 -647
  220. package/lib/simpleCan.js +0 -105
  221. package/lib/stringMsg.js +0 -339
  222. 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