diff --git a/hooks/ALK.js b/hooks/ALK.js index e8b15247..ecbcd88e 100644 --- a/hooks/ALK.js +++ b/hooks/ALK.js @@ -30,11 +30,11 @@ STALK Raymarine Seatalk1 datagram sentence const seatalkHooks = require('./seatalk') -module.exports = function(input) { +module.exports = function(input, session) { const { id, sentence, parts, tags } = input const key = '0x' + (parts[0]).toUpperCase() if (typeof seatalkHooks[key] === 'function'){ - return seatalkHooks[key](input) + return seatalkHooks[key](input, session) } else { return null } diff --git a/hooks/seatalk/0x50.js b/hooks/seatalk/0x50.js index 12a3a9ee..48cabc76 100644 --- a/hooks/seatalk/0x50.js +++ b/hooks/seatalk/0x50.js @@ -26,7 +26,7 @@ Corresponding NMEA sentences: RMC, GAA, GLL */ -module.exports = function (input) { +module.exports = function (input, session) { const { id, sentence, parts, tags } = input var Z = (parseInt(parts[1],16) & 0xF0) >> 4; @@ -35,14 +35,16 @@ module.exports = function (input) { var s=1; if ((YYYY & 0x8000)!=0) { s=-1; } var minutes=(YYYY & 0x7FFF)/100.0 - var latitude=s*(XX+minutes/60); - + session['latitude']=s*(XX+minutes/60); + var pathValues = [] - pathValues.push({ - path: 'navigation.position.latitude', - value: utils.float(latitude) - }) + if (session.hasOwnProperty('latitude') && session.hasOwnProperty('longitude')) { + pathValues.push({ + path: 'navigation.position', + value: { "longitude": utils.float(session['longitude']), "latitude": utils.float(session['latitude']) } + }) + } return { updates: [ diff --git a/hooks/seatalk/0x51.js b/hooks/seatalk/0x51.js index 852b7916..4b18c066 100644 --- a/hooks/seatalk/0x51.js +++ b/hooks/seatalk/0x51.js @@ -26,7 +26,7 @@ Corresponding NMEA sentences: RMC, GAA, GLL */ -module.exports = function (input) { +module.exports = function (input, session) { const { id, sentence, parts, tags } = input var Z = (parseInt(parts[1],16) & 0xF0) >> 4; @@ -35,14 +35,16 @@ module.exports = function (input) { var s=1; if ((YYYY & 0x8000)==0) { s=-1; } var minutes=(YYYY & 0x7FFF)/100.0 - var longitude=s*(XX+minutes/60); + session['longitude']=s*(XX+minutes/60.0); var pathValues = [] - pathValues.push({ - path: 'navigation.position.longitude', - value: utils.float(longitude) - }) + if (session.hasOwnProperty('latitude') && session.hasOwnProperty('longitude')) { + pathValues.push({ + path: 'navigation.position', + value: { "longitude": utils.float(session['longitude']), "latitude": utils.float(session['latitude']) } + }) + } return { updates: [ diff --git a/hooks/seatalk/0x54.js b/hooks/seatalk/0x54.js index bfb7ccb9..9769163b 100644 --- a/hooks/seatalk/0x54.js +++ b/hooks/seatalk/0x54.js @@ -24,7 +24,7 @@ 6 LSBits of RST = seconds = ST & 0x3F */ -module.exports = function (input) { +module.exports = function (input, session) { const { id, sentence, parts, tags } = input var T = (parseInt(parts[1],16) & 0xF0) >> 4; @@ -39,19 +39,24 @@ module.exports = function (input) { var second=ST & 0x3F var milliSecond=0 - var year=parseInt(tags.timestamp.substr(0,4)) - var month=parseInt(tags.timestamp.substr(5,2))-1 - var day=parseInt(tags.timestamp.substr(8,2)) + session["time"]={ "hour":hour, "minute":minute, "second":second, "milliSecond": milliSecond } - const d = new Date(Date.UTC(year, month, day, hour, minute, second, milliSecond )) - const ts = d.toISOString(); var pathValues = [] - throw new Error('Seatalk 0x54 disabled due to incomplete datetime structure') - /*pathValues.push({ - path: 'navigation.datetime', - value: ts - }) + if (session.hasOwnProperty('date') && session.hasOwnProperty('time')) { + + const d = new Date( + Date.UTC( + session["date"].year, session["date"].month, session["date"].day, + session["time"].hour, session["time"].minute, session["time"].second, + session["time"].milliSecond )) + const ts = d.toISOString(); + + pathValues.push({ + path: 'navigation.datetime', + value: ts + }) + } return { updates: [ { @@ -60,5 +65,5 @@ module.exports = function (input) { values: pathValues } ] - }*/ + } } diff --git a/hooks/seatalk/0x56.js b/hooks/seatalk/0x56.js index a9da2f02..312b81cf 100644 --- a/hooks/seatalk/0x56.js +++ b/hooks/seatalk/0x56.js @@ -22,7 +22,7 @@ 56 M1 DD YY Date: YY year, M month, DD day in month */ -module.exports = function (input) { +module.exports = function (input, session) { const { id, sentence, parts, tags } = input var M = (parseInt(parts[1],16) & 0xF0) >> 4; @@ -30,23 +30,28 @@ module.exports = function (input) { var YY = parseInt(parts[3],16); var year=2000+YY - var month=M-1 + var month=M var day=DD - var hour=parseInt(tags.timestamp.substr(11,2)) - var minute=parseInt(tags.timestamp.substr(14,2)) - var second=parseInt(tags.timestamp.substr(17,2)) - var milliSecond=parseInt(tags.timestamp.substr(20,3)) + session["date"]={ "year":year, "month":month, "day":day} - const d = new Date(Date.UTC(year, month, day, hour, minute, second, milliSecond )) - const ts = d.toISOString(); var pathValues = [] - throw new Error('Seatalk 0x56 disabled due to incomplete datetime structure') - /*pathValues.push({ - path: 'navigation.datetime', - value: ts - }) + if (session.hasOwnProperty('date') && session.hasOwnProperty('time')) { + + const d = new Date( + Date.UTC( + session["date"].year, session["date"].month-1, session["date"].day, + session["time"].hour, session["time"].minute, session["time"].second, + session["time"].milliSecond )) + const ts = d.toISOString(); + + pathValues.push({ + path: 'navigation.datetime', + value: ts + }) + } + return { updates: [ { @@ -55,5 +60,5 @@ module.exports = function (input) { values: pathValues } ] - }*/ + } } diff --git a/test/ALK.js b/test/ALK.js index 09dae0b6..2e6f4fa0 100644 --- a/test/ALK.js +++ b/test/ALK.js @@ -105,16 +105,19 @@ describe('ALK', () => { delta.updates[0].values[0].value.should.be.closeTo(288.9, 0.5) }) + const parser = new Parser() + it('0x50 Latitude converted', () => { - const delta = new Parser().parse(latitude) - delta.updates[0].values.should.contain.an.item.with.property('path', 'navigation.position.latitude') - delta.updates[0].values[0].value.should.be.closeTo(33, 0.5) + const delta = parser.parse(latitude) }) it('0x51 Longitude converted', () => { - const delta = new Parser().parse(longitude) - delta.updates[0].values.should.contain.an.item.with.property('path', 'navigation.position.longitude') - delta.updates[0].values[0].value.should.be.closeTo(-33, 0.5) + const delta = parser.parse(longitude) + + delta.updates[0].values.should.contain.an.item.with.property('path', 'navigation.position') + console.log(delta.updates[0].values[0]) + delta.updates[0].values[0].value["latitude"].should.be.closeTo(33, 0.5) + delta.updates[0].values[0].value["longitude"].should.be.closeTo(-33, 0.5) }) it('0x52 SOG converted', () => { @@ -130,19 +133,14 @@ describe('ALK', () => { }) it('0x54 time disabled', () => { - should.Throw(() => { - new Parser().parse(time) - }, - /Seatalk 0x54 disabled due to incomplete datetime structure/ - ) + const delta = parser.parse(time) }) it('0x56 time disabled', () => { - should.Throw(() => { - new Parser().parse(date) - }, - /Seatalk 0x56 disabled due to incomplete datetime structure/ - ) + const delta = parser.parse(date) + + delta.updates[0].values.should.contain.an.item.with.property('path', 'navigation.datetime') + delta.updates[0].values[0].value.should.equal( '2024-04-04T17:08:34.000Z') }) it('0x57 satelite info converted', () => {