Skip to content

Commit

Permalink
feature: use canboat v4 pgn data (#208)
Browse files Browse the repository at this point in the history
  • Loading branch information
sbender9 authored Jul 20, 2023
1 parent 905c547 commit 1c5497d
Show file tree
Hide file tree
Showing 33 changed files with 76 additions and 60 deletions.
33 changes: 20 additions & 13 deletions lib/fromPgn.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,9 @@ class Parser extends EventEmitter {
})
}

trace(`${pgn.pgn} ${len} ${pgnData.Length} ${pgnData.RepeatingFields} ${couldBeMulti}`)
const RepeatingFields = pgnData.RepeatingFieldSet1Size ? pgnData.RepeatingFieldSet1Size : 0

trace(`${pgn.pgn} ${len} ${pgnData.Length} ${RepeatingFields} ${couldBeMulti}`)
if ( coalesced || len > 0x8 || (this.format == FORMAT_COALESCED && !this.mixedFormat) ) {
this.format = FORMAT_COALESCED
if ( sourceString ) {
Expand Down Expand Up @@ -200,7 +202,7 @@ class Parser extends EventEmitter {
try {
var fields = pgnData.Fields

for ( var i = 0; i < fields.length-pgnData.RepeatingFields; i++ ) {
for ( var i = 0; i < fields.length-RepeatingFields; i++ ) {
var field = fields[i]
var hasMatch = !_.isUndefined(field.Match)

Expand Down Expand Up @@ -242,8 +244,8 @@ class Parser extends EventEmitter {
pgn.fields[field.Name] = value
}
}
if ( pgnData.RepeatingFields > 0 ) {
var repeating = fields.slice(fields.length-pgnData.RepeatingFields)
if ( RepeatingFields > 0 ) {
var repeating = fields.slice(fields.length-RepeatingFields)
pgn.fields.list = []

while ( bs.bitsLeft > 0 ) {
Expand Down Expand Up @@ -479,9 +481,9 @@ class Parser extends EventEmitter {
}
return res
} catch ( error ) {
const err = new Error(`error reading pgn ${JSON.stringify(pgn)} ${error}`)
const err = new Error(`error reading pgn ${JSON.stringify(pgn_data)} ${error}`)
cb && cb(err)
this.emit('error', pgn, error)
this.emit('error', pgn_data, error)
console.error(err)
return
}
Expand Down Expand Up @@ -517,9 +519,10 @@ function getField(pgn, index, data) {
return pgn.Fields[index]
}

if ( pgn.RepeatingFields ) {
var startOfRepeatingFields = pgn.Fields.length - pgn.RepeatingFields
index = startOfRepeatingFields + ((index - startOfRepeatingFields) % pgn.RepeatingFields);
const RepeatingFields = pgn.RepeatingFieldSet1Size ? pgn.RepeatingFieldSet1Size : 0
if ( RepeatingFields ) {
var startOfRepeatingFields = pgn.Fields.length - RepeatingFields
index = startOfRepeatingFields + ((index - startOfRepeatingFields) % RepeatingFields);
return pgn.Fields[index]
}
}
Expand Down Expand Up @@ -580,7 +583,8 @@ function readField(options, runPostProcessor, pgn, field, bs) {
//console.log(`${field.Name} ${value} ${field.Resolution}`)

if ( value != null && !_.isUndefined(value) ) {
var postProcessor = fieldTypePostProcessors[field.Type]
let type = field.Type //hack, missing type
var postProcessor = fieldTypePostProcessors[type]
if ( postProcessor ) {
if ( runPostProcessor ) {
value = postProcessor(field, value)
Expand Down Expand Up @@ -646,7 +650,7 @@ function readValue(options, pgn, field, bs, bitLength) {
if ( _.isUndefined(bitLength) ) {
bitLength = field.BitLength
}
if ( bitLength == 0 ) {
if ( !field.Type && field.BitLengthVariable ) { ///hack for missing FieldType
return readVariableLengthField(options, pgn, field, bs)
} else if (bitLength === 8) {
if ( field.Signed ) {
Expand Down Expand Up @@ -790,6 +794,10 @@ fieldTypeReaders['ASCII or UNICODE string starting with length and control byte'
buf.writeUInt8(c, idx)
}

if ( buf[buf.length-1] === 0 ) {
nameLen = nameLen - 1
}

return buf.toString(control == 0 ? 'utf8' : 'ascii', 0, idx < nameLen ? idx : nameLen).trim()
} else {
return null
Expand Down Expand Up @@ -889,8 +897,7 @@ fieldTypePostProcessors['Time'] = (field, value) => {
if (value >= 0xfffffffd) {
value = undefined
} else {
var seconds = (value / timeUnitsPerSecond)
//var units = value % timeUnitsPerSecond;
var seconds = (value * field.Resolution)
var minutes = (seconds / 60);
var seconds = seconds % 60;
var hours = Math.floor(minutes / 60);
Expand Down
22 changes: 11 additions & 11 deletions lib/toPgn.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ function toPgn(data) {
if ( !_.isArray(fields) ) {
fields = [ fields.Field ]
}

for ( var index = 0; index < fields.length - pgnData.RepeatingFields; index++ ) {
const RepeatingFields = pgnData.RepeatingFieldSet1Size ? pgnData.RepeatingFieldSet1Size : 0
for ( var index = 0; index < fields.length - RepeatingFields; index++ ) {
var field = fields[index]
var value = data[field.Name];

Expand All @@ -99,8 +99,8 @@ function toPgn(data) {

if ( data.list ) {
data.list.forEach(repeat => {
for (var index = 0; index < pgnData.RepeatingFields; index++ ) {
var field = fields[pgnData.Fields.length-pgnData.RepeatingFields+index]
for (var index = 0; index < RepeatingFields; index++ ) {
var field = fields[pgnData.Fields.length-RepeatingFields+index]
var value = repeat[field.Name];

writeField(bs, pgn_number, field, data, value)
Expand All @@ -118,7 +118,7 @@ function toPgn(data) {
if ( pgnData.Length != 0xff
&& fields[fields.length-1].Type != RES_STRINGLAU
&& fields[fields.length-1].Type != RES_STRINGLZ
&& !pgnData.RepeatingFields ) {
&& !RepeatingFields ) {

var len = lengthsOff[pgnData.PGN] || pgnData.Length
//console.log(`Length ${len}`)
Expand Down Expand Up @@ -166,16 +166,16 @@ function writeField(bs, pgn_number, field, data, value, bitLength) {
}
bs.writeUint8(field.Signed ? 0x7f : 0xff)
} else {
bs.writeBits(0xffffff, bitLength)
bs.writeBits(0xffffffff, bitLength)
}
} else {

let type = field.Type
if ( field.Name === 'Industry Code' ) {
if ( _.isString(value) ) {
value = Number(getIndustryCode(value))
}
} else if ( field.Type && fieldTypeMappers[field.Type] ) {
value = fieldTypeMappers[field.Type](field, value)
} else if ( type && fieldTypeMappers[type] ) {
value = fieldTypeMappers[type](field, value)
} else if (field.EnumValues && _.isString(value)) {
if (!(field.Id === "timeStamp" && value < 60)) {
value = lookup(field, value)
Expand All @@ -189,7 +189,7 @@ function writeField(bs, pgn_number, field, data, value, bitLength) {
if ( field.Type && fieldTypeWriters[field.Type] ) {
fieldTypeWriters[field.Type](pgn_number, field, value, bs)
} else {
if ( _.isString(value) && bitLength !== 0 ) {
if ( _.isString(value) && typeof bitLength !== 'undefined' && bitLength !== 0 ) {
value = Number(value)
}

Expand All @@ -202,7 +202,7 @@ function writeField(bs, pgn_number, field, data, value, bitLength) {
value -= field.Offset
}

if (bitLength == 0) {
if ( !field.Type && field.BitLengthVariable ) {
writeVariableLengthField(bs, pgn_number, data, field, value)
} else if ( _.isBuffer(value) ) {
value.copy(bs.view.buffer, bs.byteIndex)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
],
"license": "Apache-2.0",
"dependencies": {
"@canboat/pgns": "^1.4.0",
"@canboat/pgns": "2.x.x",
"bit-buffer": "0.2.3",
"date-fns": "2.0.0-alpha.27",
"debug": "^4.3.4",
Expand Down
4 changes: 2 additions & 2 deletions test/ikonvert.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ const pgns = [
"timer": 0.563,
"fields":{
"Date": "2141.11.12",
"Reserved1": "6",
"Reserved1": 6,
"SID": 119,
"Source": 13,
"Time": "55:11:40.08140"
Expand Down Expand Up @@ -51,7 +51,7 @@ const pgns = [
{
"Reference Station Type":"GPS",
"Reference Station ID":0,
"Age of DGNSS Corrections":0
"Age of DGNSS Corrections":"00:00:00"
}
]
},
Expand Down
2 changes: 1 addition & 1 deletion test/pgns/126208.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = [{
"expected": {"prio":2,"pgn":126208,"dst":67,"src":0,"timestamp":"2020-04-19T00:35:55.571Z","fields":{"Function Code":"Command","PGN":126998,"# of Parameters":1,"list":[{"Parameter":2,"Value":"YD:VOLUME 60"}]},"description":"NMEA - Command group function"},
"expected": {"prio":2,"pgn":126208,"dst":67,"src":0,"timestamp":"2020-04-19T00:35:55.571Z","fields":{"Function Code":"Command","PGN":126998,"Number of Parameters":1,"list":[{"Parameter":2,"Value":"YD:VOLUME 60"}]},"description":"NMEA - Command group function"},
"input": "2020-04-19T00:35:55.571Z,2,126208,0,67,21,01,16,f0,01,ff,01,02,0e,01,59,44,3a,56,4f,4c,55,4d,45,20,36,30"
}]
2 changes: 1 addition & 1 deletion test/pgns/126720.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = [{
"expected": {"timestamp":"2017-04-15T16:02:48.913Z","prio":7,"src":1,"dst":255,"pgn":126720,"description":"Seatalk1: Device Identification","fields":{"Manufacturer Code":"Raymarine","Industry Code":"Marine Industry","Proprietary ID":"0x81f0","command":"0x90","device":"S100"}},
"input": "2017-04-15T16:02:48.913Z,7,126720,1,255,8,3b,9f,f0,81,90,ff,03,ff"
"input": "2017-04-15T16:02:48.913Z,7,126720,1,255,7,3b,9f,f0,81,90,ff,03"
}]
2 changes: 1 addition & 1 deletion test/pgns/126996.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion test/pgns/127237.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = [{
"expected": {"timestamp":"2017-04-15T14:57:58.469Z","prio":2,"src":172,"dst":255,"pgn":127237,"description":"Heading/Track control","fields":{"Rudder Limit Exceeded":"No","Override":"No","Steering Mode":2,"Turn Mode":"Rudder Limit controlled","Commanded Rudder Direction":"Move to starboard","Commanded Rudder Angle":-0.0015}},
"expected": {"timestamp":"2017-04-15T14:57:58.469Z","prio":2,"src":172,"dst":255,"pgn":127237,"description":"Heading/Track control","fields":{"Rudder Limit Exceeded":"No","Override":"No","Steering Mode":"Follow-Up Device","Turn Mode":"Rudder limit controlled","Commanded Rudder Direction":"Move to starboard","Commanded Rudder Angle":-0.0015}},
"input": "2017-04-15T14:57:58.469Z,2,127237,172,255,21,3c,c2,3f,f1,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,7f,ff,7f,ff,7f,ff,ff"
}]
2 changes: 1 addition & 1 deletion test/pgns/127251.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = [{
"expected": {"timestamp":"2017-04-15T14:57:58.468Z","prio":2,"src":204,"dst":255,"pgn":127251,"description":"Rate of Turn","fields":{"Rate":0.00069103}},
"expected": {"timestamp":"2017-04-15T14:57:58.468Z","prio":2,"src":204,"dst":255,"pgn":127251,"description":"Rate of Turn","fields":{"Rate":0.00069103, "Reserved1": 16777215}},
"input": "2017-04-15T14:57:58.468Z,2,127251,204,255,8,ff,61,56,00,00,ff,ff,ff"
}]
4 changes: 2 additions & 2 deletions test/pgns/127489.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
//fixme: add "Total Engine hours" when implemented

module.exports = [{
"expected": {"timestamp":"2016-04-09T16:41:38.175Z","prio":2,"src":16,"dst":255,"pgn":127489,"description":"Engine Parameters, Dynamic","fields":{"Instance":"Single Engine or Dual Engine Port","Oil pressure":158300,"Temperature":296.67,"Alternator Potential":13.82,"Discrete Status 1":["Over Temperature","Low Oil Pressure"],"Discrete Status 2": []}},
"input": "2016-04-09T16:41:38.175Z,2,127489,16,255,26,00,2f,06,ff,ff,e3,73,66,05,ff,7f,ff,ff,ff,ff,ff,ff,ff,ff,ff,06,00,00,00,7f,7f"
"expected": {"timestamp":"2023-04-01T17:24:51.634Z","prio":2,"src":16,"dst":255,"pgn":127489,"description":"Engine Parameters, Dynamic","fields":{"Instance":"Single Engine or Dual Engine Port","Oil pressure":158300,"Temperature":296.67,"Alternator Potential":13.82,"Discrete Status 1":["Over Temperature","Low Oil Pressure"],"Discrete Status 2": [], "Total Engine hours":"00:10:00"}},
"input": "2023-04-01T17:24:51.634Z,2,127489,16,255,26,00,2f,06,ff,ff,e3,73,66,05,ff,7f,58,02,00,00,ff,ff,ff,ff,ff,06,00,00,00,7f,7f"
},
{
"expected": {"timestamp":"2017-04-15T14:57:58.469Z","prio":2,"src":17,"dst":255,"pgn":127489,"description":"Engine Parameters, Dynamic","fields":{"Instance":"Single Engine or Dual Engine Port","Oil pressure":393000,"Temperature":330.43,"Discrete Status 1": [],"Discrete Status 2": []}},
Expand Down
4 changes: 4 additions & 0 deletions test/pgns/127497.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module.exports = [{
"expected": {"prio":5,"pgn":127497,"dst":255,"src":57,"timestamp":"2020-03-31T02:34:18.529Z","fields":{"Instance":224,"Trip Fuel Used":9,"Fuel Rate, Average":-3100.2,"Instantaneous Fuel Economy":-0.1},"description":"Trip Parameters, Engine"},
"input": "2020-03-31T02:34:18.529Z,5,127497,57,255,9,e0,09,00,e6,86,ff,7f,ff,ff"
}]
5 changes: 3 additions & 2 deletions test/pgns/127506.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
module.exports = [{
"expected": {"timestamp":"2016-02-28T19:57:02.829Z","prio":6,"src":60,"dst":255,"pgn":127506,"description":"DC Detailed Status","fields":{"Instance":3,"State of Charge":100}},
"input": "2016-02-28T19:57:02.829Z,6,127506,60,255,11,ff,03,ff,64,ff,ff,ff,ff,ff,ff,ff"
"expected": {"timestamp":"2023-04-01T17:28:01.128Z","prio":2,"src":60,"dst":255,"pgn":127506,"description":"DC Detailed Status","fields":{"Instance":3,"State of Charge":100, "Time Remaining": "00:20:00"}},
"input": "2023-04-01T17:28:01.128Z,2,127506,60,255,11,ff,03,ff,64,ff,14,00,ff,ff,ff,ff"
//"2016-02-28T19:57:02.829Z,6,127506,60,255,11,ff,03,ff,64,ff,ff,ff,ff,ff,ff,ff"
}]
2 changes: 1 addition & 1 deletion test/pgns/129033.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = [{
"expected": {"timestamp":"2017-04-15T14:57:58.470Z","prio":3,"src":3,"dst":255,"pgn":129033,"description":"Time & Date","fields":{"Date":"2017.04.15", "Time": "14:57:56.89500","Local Offset":-240}},
"expected": {"timestamp":"2017-04-15T14:57:58.470Z","prio":3,"src":3,"dst":255,"pgn":129033,"description":"Time & Date","fields":{"Date":"2017.04.15", "Time": "14:57:56.89500","Local Offset":-14400}},
"input": "2017-04-15T14:57:58.470Z,3,129033,3,255,8,77,43,36,f6,1c,20,10,ff"
}]
2 changes: 1 addition & 1 deletion test/pgns/129038.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions test/pgns/129039.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion test/pgns/129041.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 1c5497d

Please sign in to comment.