From 9d26d56e297f7bdd147cb702a75d78584d7db6ec Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 10 Jul 2018 22:17:59 +0300 Subject: Support Continental extended precision --- src/org/traccar/protocol/ContinentalProtocolDecoder.java | 16 +++++++++++----- .../traccar/protocol/ContinentalProtocolDecoderTest.java | 4 ++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/org/traccar/protocol/ContinentalProtocolDecoder.java b/src/org/traccar/protocol/ContinentalProtocolDecoder.java index 20134fc1f..b8f322dc6 100644 --- a/src/org/traccar/protocol/ContinentalProtocolDecoder.java +++ b/src/org/traccar/protocol/ContinentalProtocolDecoder.java @@ -37,6 +37,14 @@ public class ContinentalProtocolDecoder extends BaseProtocolDecoder { public static final int MSG_ACK = 0x06; public static final int MSG_NACK = 0x15; + private double readCoordinate(ByteBuf buf, boolean extended) { + long value = buf.readUnsignedInt(); + if (extended ? (value & 0x08000000) != 0 : (value & 0x00800000) != 0) { + value |= extended ? 0xF0000000 : 0xFF000000; + } + return (int) value / (extended ? 360000.0 : 3600.0); + } + @Override protected Object decode( Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { @@ -64,11 +72,9 @@ public class ContinentalProtocolDecoder extends BaseProtocolDecoder { position.setFixTime(new Date(buf.readUnsignedInt() * 1000L)); - buf.readUnsignedByte(); - position.setLatitude(buf.readMedium() / 3600.0); - - buf.readUnsignedByte(); - position.setLongitude(buf.readMedium() / 3600.0); + boolean extended = buf.getUnsignedByte(buf.readerIndex()) != 0; + position.setLatitude(readCoordinate(buf, extended)); + position.setLongitude(readCoordinate(buf, extended)); position.setCourse(buf.readUnsignedShort()); position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); diff --git a/test/org/traccar/protocol/ContinentalProtocolDecoderTest.java b/test/org/traccar/protocol/ContinentalProtocolDecoderTest.java index fbc7c3219..95b3b409a 100644 --- a/test/org/traccar/protocol/ContinentalProtocolDecoderTest.java +++ b/test/org/traccar/protocol/ContinentalProtocolDecoderTest.java @@ -10,6 +10,10 @@ public class ContinentalProtocolDecoderTest extends ProtocolTest { ContinentalProtocolDecoder decoder = new ContinentalProtocolDecoder(new ContinentalProtocol()); + verifyPosition(decoder, binary( + "5356003216001eb48505025b4001e90f7f18ce0f00522200400001015b4001e9000e820100000c24000100014e0400736a7a"), + position("2018-07-06 23:57:29.000", true, -23.46609, -46.54497)); + verifyPosition(decoder, binary( "5356002A1100003039030243A68B5700FEB5AB00FD715F012700000143A68B57000E000000000C2F00000130"), position("2005-12-19 10:28:39.000", true, -23.49027, -46.55138)); -- cgit v1.2.3