diff options
Diffstat (limited to 'src/org/traccar/events')
-rw-r--r-- | src/org/traccar/events/GeofenceEventHandler.java | 74 | ||||
-rw-r--r-- | src/org/traccar/events/MotionEventHandler.java | 3 |
2 files changed, 77 insertions, 0 deletions
diff --git a/src/org/traccar/events/GeofenceEventHandler.java b/src/org/traccar/events/GeofenceEventHandler.java new file mode 100644 index 000000000..bf9060ca1 --- /dev/null +++ b/src/org/traccar/events/GeofenceEventHandler.java @@ -0,0 +1,74 @@ +package org.traccar.events; + +import java.sql.SQLException; +import java.util.Set; + +import org.traccar.BaseEventHandler; +import org.traccar.Context; +import org.traccar.database.DataManager; +import org.traccar.database.GeofenceManager; +import org.traccar.helper.Log; +import org.traccar.model.Device; +import org.traccar.model.Event; +import org.traccar.model.Position; + +public class GeofenceEventHandler extends BaseEventHandler { + + private int suppressRepeated; + private GeofenceManager geofenceManager; + private DataManager dataManager; + + public GeofenceEventHandler() { + suppressRepeated = Context.getConfig().getInteger("event.suppressRepeated", 60); + geofenceManager = Context.getGeofenceManager(); + dataManager = Context.getDataManager(); + } + + @Override + protected Event analizePosition(Position position) { + Event event = null; + if (!isLastPosition() || !position.getValid()) { + return event; + } + + Device device = dataManager.getDeviceById(position.getDeviceId()); + if (device == null) { + return event; + } + + Set<Long> 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; + } + } + + 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()); + event.setGeofenceId(geofenceId); + } + if (event != null && !dataManager.getLastEvents( + position.getDeviceId(), event.getType(), suppressRepeated).isEmpty()) { + event = null; + } + device.setGeofenceId(geofenceId); + dataManager.updateDeviceStatus(device); + } catch (SQLException error) { + Log.warning(error); + } + + } + return event; + } +} diff --git a/src/org/traccar/events/MotionEventHandler.java b/src/org/traccar/events/MotionEventHandler.java index a3b81ddc4..306fa8a4e 100644 --- a/src/org/traccar/events/MotionEventHandler.java +++ b/src/org/traccar/events/MotionEventHandler.java @@ -33,6 +33,9 @@ public class MotionEventHandler extends BaseEventHandler { return event; } String motion = device.getMotion(); + if (motion == null) { + motion = Device.STATUS_STOPPED; + } 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()); |