aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debug.xml11
-rw-r--r--src/org/traccar/BasePipelineFactory.java10
-rw-r--r--src/org/traccar/DistanceHandler.java59
-rw-r--r--src/org/traccar/OdometerHandler.java55
-rw-r--r--src/org/traccar/model/Event.java1
-rw-r--r--src/org/traccar/model/Position.java4
-rw-r--r--test/org/traccar/DistanceHandlerTest.java22
7 files changed, 94 insertions, 68 deletions
diff --git a/debug.xml b/debug.xml
index 25f2cc320..ceee553ce 100644
--- a/debug.xml
+++ b/debug.xml
@@ -18,15 +18,15 @@
<entry key='geocoder.type'>nominatim</entry>
<entry key='geocoder.url'>http://nominatim.openstreetmap.org/reverse</entry>
+ <entry key='distance.enable'>true</entry>
+
<!--<entry key='filter.enable'>true</entry>
<entry key='filter.limit'>3600</entry>
<entry key='filter.invalid'>true</entry>
<entry key='filter.zero'>true</entry>
<entry key='filter.duplicate'>true</entry>
<entry key='filter.distance'>50</entry>-->
-
- <entry key='system.odometer.enable'>true</entry>
-
+
<!--<entry key='forward.enable'>true</entry>
<entry key='forward.url'>http://example.com:8080/gprmc/Data?id={uniqueId}&amp;code=0x0000&amp;gprmc={gprmc}</entry>-->
@@ -99,7 +99,6 @@
altitude FLOAT NOT NULL,
speed FLOAT NOT NULL,
course FLOAT NOT NULL,
- odometer FLOAT NOT NULL,
address VARCHAR(512),
other VARCHAR(4096) NOT NULL,
FOREIGN KEY (deviceId) REFERENCES device (id) ON DELETE CASCADE);
@@ -235,8 +234,8 @@
</entry>
<entry key='database.insertPosition'>
- INSERT INTO position (deviceId, protocol, serverTime, deviceTime, fixTime, valid, latitude, longitude, altitude, speed, course, odometer, address, other)
- VALUES (:deviceId, :protocol, CURRENT_TIMESTAMP(), :time, :time, :valid, :latitude, :longitude, :altitude, :speed, :course, :odometer, :address, :other);
+ INSERT INTO position (deviceId, protocol, serverTime, deviceTime, fixTime, valid, latitude, longitude, altitude, speed, course, address, other)
+ VALUES (:deviceId, :protocol, CURRENT_TIMESTAMP(), :time, :time, :valid, :latitude, :longitude, :altitude, :speed, :course, :address, :other);
</entry>
<entry key='database.selectLatestPositions'>
diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java
index 6c4a6b5bd..216e48709 100644
--- a/src/org/traccar/BasePipelineFactory.java
+++ b/src/org/traccar/BasePipelineFactory.java
@@ -37,7 +37,7 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
private int resetDelay;
private FilterHandler filterHandler;
- private OdometerHandler odometerHandler;
+ private DistanceHandler distanceHandler;
private ReverseGeocoderHandler reverseGeocoderHandler;
protected class OpenChannelHandler extends SimpleChannelHandler {
@@ -96,6 +96,10 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
reverseGeocoderHandler = new ReverseGeocoderHandler(
Context.getReverseGeocoder(), Context.getConfig().getBoolean("geocode.processInvalidPositions"));
}
+
+ if (Context.getConfig().getBoolean("distance.enable")) {
+ distanceHandler = new DistanceHandler();
+ }
}
protected abstract void addSpecificHandlers(ChannelPipeline pipeline);
@@ -114,8 +118,8 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
if (filterHandler != null) {
pipeline.addLast("filter", filterHandler);
}
- if (odometerHandler != null) {
- pipeline.addLast("odometer", odometerHandler);
+ if (distanceHandler != null) {
+ pipeline.addLast("distance", distanceHandler);
}
if (reverseGeocoderHandler != null) {
pipeline.addLast("geocoder", reverseGeocoderHandler);
diff --git a/src/org/traccar/DistanceHandler.java b/src/org/traccar/DistanceHandler.java
new file mode 100644
index 000000000..57dddfe87
--- /dev/null
+++ b/src/org/traccar/DistanceHandler.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2015 Amila Silva
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.traccar;
+
+import org.traccar.helper.DistanceCalculator;
+import org.traccar.model.Event;
+import org.traccar.model.Position;
+
+import java.math.BigDecimal;
+
+public class DistanceHandler extends BaseDataHandler {
+
+ private Position getLastPosition(long deviceId) {
+ if (Context.getConnectionManager() != null) {
+ return Context.getConnectionManager().getLastPosition(deviceId);
+ }
+ return null;
+ }
+
+ public Position calculateDistance(Position position) {
+
+ double distance = 0.0;
+
+ Position last = getLastPosition(position.getDeviceId());
+ if (last != null) {
+ if (last.getOther().containsKey(Event.KEY_DISTANCE)) {
+ distance = ((Number) last.getOther().get(Event.KEY_DISTANCE)).doubleValue();
+ }
+
+ distance += DistanceCalculator.distance(
+ position.getLatitude(), position.getLongitude(),
+ last.getLatitude(), last.getLongitude());
+
+ distance = BigDecimal.valueOf(distance).setScale(2).doubleValue();
+ }
+
+ position.set(Event.KEY_DISTANCE, distance);
+ return position;
+ }
+
+ @Override
+ protected Position handlePosition(Position position) {
+ return calculateDistance(position);
+ }
+
+}
diff --git a/src/org/traccar/OdometerHandler.java b/src/org/traccar/OdometerHandler.java
deleted file mode 100644
index d5860c02e..000000000
--- a/src/org/traccar/OdometerHandler.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- *
- */
-package org.traccar;
-
-import org.traccar.helper.DistanceCalculator;
-import org.traccar.helper.Log;
-import org.traccar.model.Position;
-
-/**
- * <p>
- * Odometer - total mileage calculation handler
- * </p>
- *
- * @author Amila Silva
- *
- */
-public class OdometerHandler extends BaseDataHandler {
-
- public OdometerHandler() {
- Log.debug("System based odometer calculation enabled for all devices");
- }
-
- private Position getLastPosition(long deviceId) {
- if (Context.getConnectionManager() != null) {
- return Context.getConnectionManager().getLastPosition(deviceId);
- }
- return null;
- }
-
- private Position calculateDistance(Position position) {
- Position last = getLastPosition(position.getDeviceId());
- if (last != null) {
- // set odometer only on movement
- double odometer = 0.0;
- if (last.getSpeed() == 0 && position.getSpeed() == 0) {
- odometer = last.getOdometer();
- } else {
- double distance = DistanceCalculator.distance(
- position.getLatitude(), position.getLongitude(),
- last.getLatitude(), last.getLongitude());
- distance = Math.round((distance) * 100.0) / 100.0;
- odometer = distance + last.getOdometer();
- }
- position.setOdometer(odometer);
- }
- return position;
- }
-
- @Override
- protected Position handlePosition(Position position) {
- return calculateDistance(position);
- }
-
-}
diff --git a/src/org/traccar/model/Event.java b/src/org/traccar/model/Event.java
index df9a9a8e5..831ae31b3 100644
--- a/src/org/traccar/model/Event.java
+++ b/src/org/traccar/model/Event.java
@@ -78,6 +78,7 @@ public abstract class Event {
public static final String KEY_CHARGE = "charge";
public static final String KEY_IP = "ip";
public static final String KEY_ARCHIVE = "archive";
+ public static final String KEY_DISTANCE = "distance";
// Starts with 1 not 0
public static final String PREFIX_TEMP = "temp";
diff --git a/src/org/traccar/model/Position.java b/src/org/traccar/model/Position.java
index 0c928439c..62c999d94 100644
--- a/src/org/traccar/model/Position.java
+++ b/src/org/traccar/model/Position.java
@@ -56,10 +56,6 @@ public class Position extends Event implements Factory {
private double course;
public double getCourse() { return course; }
public void setCourse(double course) { this.course = course; }
-
- private double odometer; // value in meters
- public double getOdometer() { return odometer; }
- public void setOdometer(double odometer) { this.odometer = odometer; }
private String address;
public String getAddress() { return address; }
diff --git a/test/org/traccar/DistanceHandlerTest.java b/test/org/traccar/DistanceHandlerTest.java
new file mode 100644
index 000000000..8afeb83f0
--- /dev/null
+++ b/test/org/traccar/DistanceHandlerTest.java
@@ -0,0 +1,22 @@
+package org.traccar;
+
+import org.junit.Test;
+import org.traccar.model.Event;
+import org.traccar.model.Position;
+
+import static org.junit.Assert.assertEquals;
+
+public class DistanceHandlerTest {
+
+ @Test
+ public void testCalculateDistance() throws Exception {
+
+ DistanceHandler distanceHandler = new DistanceHandler();
+
+ Position position = distanceHandler.calculateDistance(new Position());
+
+ assertEquals(0.0, position.getOther().get(Event.KEY_DISTANCE));
+
+ }
+
+}