aboutsummaryrefslogtreecommitdiff
path: root/src/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/org')
-rw-r--r--src/org/traccar/BasePipelineFactory.java10
-rw-r--r--src/org/traccar/ODOMeterHandler.java51
-rw-r--r--src/org/traccar/model/Position.java4
3 files changed, 65 insertions, 0 deletions
diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java
index 4d8b0ffc4..410b57318 100644
--- a/src/org/traccar/BasePipelineFactory.java
+++ b/src/org/traccar/BasePipelineFactory.java
@@ -38,6 +38,7 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
private int resetDelay;
private FilterHandler filterHandler;
+ private ODOMeterHandler odoMeterHandler;
private ReverseGeocoderHandler reverseGeocoderHandler;
protected class OpenChannelHandler extends SimpleChannelHandler {
@@ -92,6 +93,10 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
filterHandler = new FilterHandler();
}
+ if (Context.getConfig().getBoolean("system.odometer.enable")) {
+ odoMeterHandler = new ODOMeterHandler();
+ }
+
if (Context.getReverseGeocoder() != null) {
reverseGeocoderHandler = new ReverseGeocoderHandler(
Context.getReverseGeocoder(), Context.getConfig().getBoolean("geocode.processInvalidPositions"));
@@ -114,6 +119,11 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
if (filterHandler != null) {
pipeline.addLast("filter", filterHandler);
}
+
+ if (odoMeterHandler != null) {
+ pipeline.addLast("odoMeter", odoMeterHandler);
+ }
+
if (reverseGeocoderHandler != null) {
pipeline.addLast("geocoder", reverseGeocoderHandler);
}
diff --git a/src/org/traccar/ODOMeterHandler.java b/src/org/traccar/ODOMeterHandler.java
new file mode 100644
index 000000000..1dc3aed44
--- /dev/null
+++ b/src/org/traccar/ODOMeterHandler.java
@@ -0,0 +1,51 @@
+/**
+ *
+ */
+package org.traccar;
+
+import org.traccar.helper.DistanceCalculator;
+import org.traccar.helper.Log;
+import org.traccar.model.Position;
+
+/**
+ * <p>
+ * ODO Meter handler
+ * </p>
+ *
+ * @author Amila Silva
+ *
+ */
+public class ODOMeterHandler extends BaseDataHandler {
+
+ public ODOMeterHandler() {
+ Log.debug("System based ODO meter 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) {
+ double distance = DistanceCalculator.distance(
+ position.getLatitude(), position.getLongitude(),
+ last.getLatitude(), last.getLongitude());
+ distance = Math.round((distance) * 100.0) / 100.0;
+ double odoMeter = distance + last.getOdoMeter();
+ Log.info("::: Device Course : " + position.getDeviceId()
+ + ", Distance :" + distance + "m, ODO Meter :" + odoMeter + " m");
+ position.setOdoMeter(odoMeter);
+ }
+ return position;
+ }
+
+ @Override
+ protected Position handlePosition(Position position) {
+ return calculateDistance(position);
+ }
+
+}
diff --git a/src/org/traccar/model/Position.java b/src/org/traccar/model/Position.java
index 62c999d94..8c3340d9c 100644
--- a/src/org/traccar/model/Position.java
+++ b/src/org/traccar/model/Position.java
@@ -56,6 +56,10 @@ 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; }