diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2018-05-11 14:22:21 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-11 14:22:21 -0700 |
commit | 662b774234298c38a38c172d1dcb4668996045ac (patch) | |
tree | 7f46a605aabd630d3f07b7ec6f7d8713ed3be2ce /src/org/traccar/events/OverspeedEventHandler.java | |
parent | a97c12829e99b63f1951bffc658c37ec180e5379 (diff) | |
parent | 3639bc6d289fa137d5dc7aaa47b67cd6a6bcc47d (diff) | |
download | trackermap-server-662b774234298c38a38c172d1dcb4668996045ac.tar.gz trackermap-server-662b774234298c38a38c172d1dcb4668996045ac.tar.bz2 trackermap-server-662b774234298c38a38c172d1dcb4668996045ac.zip |
Merge pull request #3870 from Abyss777/geo_overspeed
Add basic support of overspeeding inside geofences.
Diffstat (limited to 'src/org/traccar/events/OverspeedEventHandler.java')
-rw-r--r-- | src/org/traccar/events/OverspeedEventHandler.java | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/src/org/traccar/events/OverspeedEventHandler.java b/src/org/traccar/events/OverspeedEventHandler.java index cb658415c..4ebe43fda 100644 --- a/src/org/traccar/events/OverspeedEventHandler.java +++ b/src/org/traccar/events/OverspeedEventHandler.java @@ -1,5 +1,6 @@ /* - * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2018 Andrey Kunitsyn (andrey@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +24,7 @@ import org.traccar.Context; import org.traccar.model.Device; import org.traccar.model.DeviceState; import org.traccar.model.Event; +import org.traccar.model.Geofence; import org.traccar.model.Position; public class OverspeedEventHandler extends BaseEventHandler { @@ -30,11 +32,13 @@ public class OverspeedEventHandler extends BaseEventHandler { public static final String ATTRIBUTE_SPEED_LIMIT = "speedLimit"; private boolean notRepeat; + private boolean preferLowest; private long minimalDuration; - public OverspeedEventHandler(long minimalDuration, boolean notRepeat) { + public OverspeedEventHandler(long minimalDuration, boolean notRepeat, boolean preferLowest) { this.notRepeat = notRepeat; this.minimalDuration = minimalDuration; + this.preferLowest = preferLowest; } private Map<Event, Position> newEvent(DeviceState deviceState, double speedLimit) { @@ -42,8 +46,10 @@ public class OverspeedEventHandler extends BaseEventHandler { Event event = new Event(Event.TYPE_DEVICE_OVERSPEED, position.getDeviceId(), position.getId()); event.set("speed", deviceState.getOverspeedPosition().getSpeed()); event.set(ATTRIBUTE_SPEED_LIMIT, speedLimit); + event.setGeofenceId(deviceState.getOverspeedGeofenceId()); deviceState.setOverspeedState(notRepeat); deviceState.setOverspeedPosition(null); + deviceState.setOverspeedGeofenceId(0); return Collections.singletonMap(event, position); } @@ -61,7 +67,8 @@ public class OverspeedEventHandler extends BaseEventHandler { return result; } - public Map<Event, Position> updateOverspeedState(DeviceState deviceState, Position position, double speedLimit) { + public Map<Event, Position> updateOverspeedState( + DeviceState deviceState, Position position, double speedLimit, long geofenceId) { Map<Event, Position> result = null; Boolean oldOverspeed = deviceState.getOverspeedState(); @@ -71,12 +78,15 @@ public class OverspeedEventHandler extends BaseEventHandler { if (newOverspeed && !oldOverspeed) { if (deviceState.getOverspeedPosition() == null) { deviceState.setOverspeedPosition(position); + deviceState.setOverspeedGeofenceId(geofenceId); } } else if (oldOverspeed && !newOverspeed) { deviceState.setOverspeedState(false); deviceState.setOverspeedPosition(null); + deviceState.setOverspeedGeofenceId(0); } else { deviceState.setOverspeedPosition(null); + deviceState.setOverspeedGeofenceId(0); } Position overspeedPosition = deviceState.getOverspeedPosition(); if (overspeedPosition != null) { @@ -101,6 +111,28 @@ public class OverspeedEventHandler extends BaseEventHandler { } double speedLimit = Context.getDeviceManager().lookupAttributeDouble(deviceId, ATTRIBUTE_SPEED_LIMIT, 0, false); + + double geofenceSpeedLimit = 0; + long overspeedGeofenceId = 0; + + if (Context.getGeofenceManager() != null) { + for (long geofenceId : device.getGeofenceIds()) { + Geofence geofence = Context.getGeofenceManager().getById(geofenceId); + if (geofence != null) { + double currentSpeedLimit = geofence.getDouble(ATTRIBUTE_SPEED_LIMIT); + if (currentSpeedLimit > 0 && geofenceSpeedLimit == 0 + || preferLowest && currentSpeedLimit < geofenceSpeedLimit + || !preferLowest && currentSpeedLimit > geofenceSpeedLimit) { + geofenceSpeedLimit = currentSpeedLimit; + overspeedGeofenceId = geofenceId; + } + } + } + } + if (geofenceSpeedLimit > 0) { + speedLimit = geofenceSpeedLimit; + } + if (speedLimit == 0) { return null; } @@ -110,8 +142,9 @@ public class OverspeedEventHandler extends BaseEventHandler { if (deviceState.getOverspeedState() == null) { deviceState.setOverspeedState(position.getSpeed() > speedLimit); + deviceState.setOverspeedGeofenceId(position.getSpeed() > speedLimit ? overspeedGeofenceId : 0); } else { - result = updateOverspeedState(deviceState, position, speedLimit); + result = updateOverspeedState(deviceState, position, speedLimit, overspeedGeofenceId); } Context.getDeviceManager().setDeviceState(deviceId, deviceState); |