From 94a922eaf167a73a0188255398fb1c6799767e18 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Tue, 8 Aug 2017 09:53:31 +0500 Subject: Implement motion detection similar to trips detection --- src/org/traccar/database/ConnectionManager.java | 45 +++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'src/org/traccar/database/ConnectionManager.java') diff --git a/src/org/traccar/database/ConnectionManager.java b/src/org/traccar/database/ConnectionManager.java index 1445fb785..b3b00fefa 100644 --- a/src/org/traccar/database/ConnectionManager.java +++ b/src/org/traccar/database/ConnectionManager.java @@ -23,8 +23,11 @@ import org.traccar.GlobalTimer; import org.traccar.Protocol; import org.traccar.helper.Log; import org.traccar.model.Device; +import org.traccar.model.DeviceState; import org.traccar.model.Event; import org.traccar.model.Position; +import org.traccar.reports.ReportUtils; +import org.traccar.reports.model.TripsConfig; import java.net.SocketAddress; import java.sql.SQLException; @@ -41,6 +44,7 @@ public class ConnectionManager { private final long deviceTimeout; private final boolean enableStatusEvents; + private TripsConfig tripsConfig = null; private final Map activeDevices = new ConcurrentHashMap<>(); private final Map> listeners = new ConcurrentHashMap<>(); @@ -49,6 +53,9 @@ public class ConnectionManager { public ConnectionManager() { deviceTimeout = Context.getConfig().getLong("status.timeout", DEFAULT_TIMEOUT) * 1000; enableStatusEvents = Context.getConfig().getBoolean("event.enable"); + if (Context.getConfig().getBoolean("status.updateDeviceState")) { + tripsConfig = ReportUtils.initTripsConfig(); + } } public void addActiveDevice(long deviceId, Protocol protocol, Channel channel, SocketAddress remoteAddress) { @@ -80,21 +87,30 @@ public class ConnectionManager { if (enableStatusEvents && !status.equals(oldStatus)) { String eventType; + Event stateEvent = null; switch (status) { case Device.STATUS_ONLINE: eventType = Event.TYPE_DEVICE_ONLINE; break; case Device.STATUS_UNKNOWN: eventType = Event.TYPE_DEVICE_UNKNOWN; + if (tripsConfig != null) { + stateEvent = updateDeviceState(deviceId); + } break; default: eventType = Event.TYPE_DEVICE_OFFLINE; + if (tripsConfig != null) { + stateEvent = updateDeviceState(deviceId); + } break; } - Event event = new Event(eventType, deviceId); - if (Context.getNotificationManager() != null) { - Context.getNotificationManager().updateEvent(event, null); + Set events = new HashSet<>(); + if (stateEvent != null) { + events.add(stateEvent); } + events.add(new Event(eventType, deviceId)); + Context.getNotificationManager().updateEvents(events, null); } Timeout timeout = timeouts.remove(deviceId); @@ -126,6 +142,29 @@ public class ConnectionManager { updateDevice(device); } + public Event updateDeviceState(long deviceId) { + DeviceState deviceState = Context.getDeviceManager().getDeviceState(deviceId); + if (deviceState == null || deviceState.getMotionState() == null) { + return null; + } + Event result = null; + Boolean oldMotion = deviceState.getMotionState(); + long currentTime = new Date().getTime(); + boolean newMotion = !oldMotion; + Position potentialPosition = deviceState.getMotionPosition(); + if (potentialPosition != null) { + long potentialTime = potentialPosition.getFixTime().getTime() + + (newMotion ? tripsConfig.getMinimalTripDuration() : tripsConfig.getMinimalParkingDuration()); + if (potentialTime <= currentTime) { + String eventType = newMotion ? Event.TYPE_DEVICE_MOVING : Event.TYPE_DEVICE_STOPPED; + result = new Event(eventType, potentialPosition.getDeviceId(), potentialPosition.getId()); + deviceState.setMotionState(newMotion); + deviceState.setMotionPosition(null); + } + } + return result; + } + public synchronized void updateDevice(Device device) { for (long userId : Context.getPermissionsManager().getDeviceUsers(device.getId())) { if (listeners.containsKey(userId)) { -- cgit v1.2.3