From b588b3c723cad4629dcecbce8983933f7ff2a255 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Tue, 14 Jun 2016 18:05:05 +0500 Subject: - Overlapping geofences - Simplified user-device link --- .../traccar/events/CommandResultEventHandler.java | 9 ++- src/org/traccar/events/GeofenceEventHandler.java | 70 ++++++++++++---------- src/org/traccar/events/MotionEventHandler.java | 30 ++++++---- src/org/traccar/events/OverspeedEventHandler.java | 12 ++-- 4 files changed, 69 insertions(+), 52 deletions(-) (limited to 'src/org/traccar/events') diff --git a/src/org/traccar/events/CommandResultEventHandler.java b/src/org/traccar/events/CommandResultEventHandler.java index 23c62566a..9dbdb4b4c 100644 --- a/src/org/traccar/events/CommandResultEventHandler.java +++ b/src/org/traccar/events/CommandResultEventHandler.java @@ -1,5 +1,8 @@ package org.traccar.events; +import java.util.ArrayList; +import java.util.Collection; + import org.traccar.BaseEventHandler; import org.traccar.model.Event; import org.traccar.model.Position; @@ -7,10 +10,12 @@ import org.traccar.model.Position; public class CommandResultEventHandler extends BaseEventHandler { @Override - protected Event analizePosition(Position position) { + protected Collection analizePosition(Position position) { Object commandResult = position.getAttributes().get(Position.KEY_RESULT); if (commandResult != null) { - return new Event(Event.TYPE_COMMAND_RESULT, position.getDeviceId(), position.getId()); + Collection events = new ArrayList<>(); + events.add(new Event(Event.TYPE_COMMAND_RESULT, position.getDeviceId(), position.getId())); + return events; } return null; } diff --git a/src/org/traccar/events/GeofenceEventHandler.java b/src/org/traccar/events/GeofenceEventHandler.java index bf9060ca1..ed63b6f7d 100644 --- a/src/org/traccar/events/GeofenceEventHandler.java +++ b/src/org/traccar/events/GeofenceEventHandler.java @@ -1,7 +1,9 @@ package org.traccar.events; import java.sql.SQLException; -import java.util.Set; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -25,50 +27,52 @@ public class GeofenceEventHandler extends BaseEventHandler { } @Override - protected Event analizePosition(Position position) { - Event event = null; - if (!isLastPosition() || !position.getValid()) { - return event; + protected Collection analizePosition(Position position) { + if (!isLastPosition() || !position.getValid()) { + return null; } Device device = dataManager.getDeviceById(position.getDeviceId()); if (device == null) { - return event; + return null; } - Set geofences = geofenceManager.getAllDeviceGeofences(position.getDeviceId()); - if (geofences == null) { - return event; - } - long geofenceId = 0; - for (Long geofence : geofences) { - if (geofenceManager.getGeofence(geofence).getGeometry() - .containsPoint(position.getLatitude(), position.getLongitude())) { - geofenceId = geofence; - break; - } + List currentGeofences = geofenceManager.getCurrentDeviceGeofences(position); + List oldGeofences = new ArrayList(); + if (device.getGeofenceIds() != null) { + oldGeofences.addAll(device.getGeofenceIds()); } + List newGeofences = new ArrayList(currentGeofences); + newGeofences.removeAll(oldGeofences); + oldGeofences.removeAll(currentGeofences); - if (device.getGeofenceId() != geofenceId) { - try { - if (geofenceId == 0) { - event = new Event(Event.TYPE_GEOFENCE_EXIT, position.getDeviceId(), position.getId()); - event.setGeofenceId(device.getGeofenceId()); - } else { - event = new Event(Event.TYPE_GEOFENCE_ENTER, position.getDeviceId(), position.getId()); + device.setGeofenceIds(currentGeofences); + + Collection events = new ArrayList<>(); + try { + if (dataManager.getLastEvents(position.getDeviceId(), + Event.TYPE_GEOFENCE_ENTER, suppressRepeated).isEmpty()) { + for (Long geofenceId : newGeofences) { + Event event = new Event(Event.TYPE_GEOFENCE_ENTER, position.getDeviceId(), position.getId()); event.setGeofenceId(geofenceId); + events.add(event); } - if (event != null && !dataManager.getLastEvents( - position.getDeviceId(), event.getType(), suppressRepeated).isEmpty()) { - event = null; + } + } catch (SQLException error) { + Log.warning(error); + } + try { + if (dataManager.getLastEvents(position.getDeviceId(), + Event.TYPE_GEOFENCE_EXIT, suppressRepeated).isEmpty()) { + for (Long geofenceId : oldGeofences) { + Event event = new Event(Event.TYPE_GEOFENCE_EXIT, position.getDeviceId(), position.getId()); + event.setGeofenceId(geofenceId); + events.add(event); } - device.setGeofenceId(geofenceId); - dataManager.updateDeviceStatus(device); - } catch (SQLException error) { - Log.warning(error); } - + } catch (SQLException error) { + Log.warning(error); } - return event; + return events; } } diff --git a/src/org/traccar/events/MotionEventHandler.java b/src/org/traccar/events/MotionEventHandler.java index 306fa8a4e..54b6b922d 100644 --- a/src/org/traccar/events/MotionEventHandler.java +++ b/src/org/traccar/events/MotionEventHandler.java @@ -1,6 +1,8 @@ package org.traccar.events; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -19,18 +21,17 @@ public class MotionEventHandler extends BaseEventHandler { } @Override - protected Event analizePosition(Position position) { - Event event = null; - + protected Collection analizePosition(Position position) { + Collection result = null; if (!isLastPosition()) { - return event; + return null; } double speed = position.getSpeed(); boolean valid = position.getValid(); Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); if (device == null) { - return event; + return null; } String motion = device.getMotion(); if (motion == null) { @@ -38,21 +39,26 @@ public class MotionEventHandler extends BaseEventHandler { } if (valid && speed > SPEED_THRESHOLD && !motion.equals(Device.STATUS_MOVING)) { Context.getConnectionManager().updateDevice(position.getDeviceId(), Device.STATUS_MOVING, null); - event = new Event(Event.TYPE_DEVICE_MOVING, position.getDeviceId(), position.getId()); + result = new ArrayList<>(); + result.add(new Event(Event.TYPE_DEVICE_MOVING, position.getDeviceId(), position.getId())); } else if (valid && speed < SPEED_THRESHOLD && motion.equals(Device.STATUS_MOVING)) { Context.getConnectionManager().updateDevice(position.getDeviceId(), Device.STATUS_STOPPED, null); - event = new Event(Event.TYPE_DEVICE_STOPPED, position.getDeviceId(), position.getId()); + result = new ArrayList<>(); + result.add(new Event(Event.TYPE_DEVICE_STOPPED, position.getDeviceId(), position.getId())); } try { - if (event != null && !Context.getDataManager().getLastEvents( - position.getDeviceId(), event.getType(), suppressRepeated).isEmpty()) { - event = null; + if (result != null && !result.isEmpty()) { + for (Event event : result) { + if (!Context.getDataManager().getLastEvents(position.getDeviceId(), + event.getType(), suppressRepeated).isEmpty()) { + event = null; + } + } } - } catch (SQLException error) { Log.warning(error); } - return event; + return result; } } diff --git a/src/org/traccar/events/OverspeedEventHandler.java b/src/org/traccar/events/OverspeedEventHandler.java index 30410ff32..152fe6f22 100644 --- a/src/org/traccar/events/OverspeedEventHandler.java +++ b/src/org/traccar/events/OverspeedEventHandler.java @@ -1,6 +1,8 @@ package org.traccar.events; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -20,10 +22,10 @@ public class OverspeedEventHandler extends BaseEventHandler { } @Override - protected Event analizePosition(Position position) { - Event event = null; + protected Collection analizePosition(Position position) { + Collection events = new ArrayList<>(); if (!isLastPosition()) { - return event; + return null; } double speed = position.getSpeed(); boolean valid = position.getValid(); @@ -32,14 +34,14 @@ public class OverspeedEventHandler extends BaseEventHandler { try { if (Context.getDataManager().getLastEvents( position.getDeviceId(), Event.TYPE_DEVICE_OVERSPEED, suppressRepeated).isEmpty()) { - event = new Event(Event.TYPE_DEVICE_OVERSPEED, position.getDeviceId(), position.getId()); + events.add(new Event(Event.TYPE_DEVICE_OVERSPEED, position.getDeviceId(), position.getId())); } } catch (SQLException error) { Log.warning(error); } } - return event; + return events; } } -- cgit v1.2.3