From b5f33434ff94cbad7a8c37f9211b0c939c6cdc4b Mon Sep 17 00:00:00 2001 From: Valerii Vyshniak Date: Thu, 16 Nov 2017 23:14:27 +0100 Subject: T580W: add battery level to all events It is possible to use "processing.copyAttributes" configuration to have battery level in all events, but this will not work if battery events will be filtered somehow and dropped from DB, so it will be no event in DB with latest battery level. So, ensure all our events have latest battery level. --- src/org/traccar/protocol/Tk103ProtocolDecoder.java | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/org') diff --git a/src/org/traccar/protocol/Tk103ProtocolDecoder.java b/src/org/traccar/protocol/Tk103ProtocolDecoder.java index 9232fa249..e52d60848 100644 --- a/src/org/traccar/protocol/Tk103ProtocolDecoder.java +++ b/src/org/traccar/protocol/Tk103ProtocolDecoder.java @@ -29,6 +29,8 @@ import org.traccar.model.Position; import org.traccar.model.WifiAccessPoint; import java.net.SocketAddress; +import java.util.HashMap; +import java.util.Map; import java.util.regex.Pattern; public class Tk103ProtocolDecoder extends BaseProtocolDecoder { @@ -236,6 +238,34 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder { } } + private static Map batteryInfo = new HashMap(); + + public void setLastBatteryPower(Position positionWithCurrentBatteryInfo) { + batteryInfo.put(positionWithCurrentBatteryInfo.getDeviceId(), positionWithCurrentBatteryInfo); + } + + // It is possible to use "processing.copyAttributes" configuration to have battery level in all events, + // but this will not work if battery events will be filtered somehow and dropped from DB, so it will be no + // event in DB with latest battery level. So, ensure all our events have latest battery level. + public void getLastBatteryPower(Position position) { + if (position != null && position.getDeviceId() != 0) { + Position bi = batteryInfo.get(position.getDeviceId()); + if (bi == null) { + bi = new Position(); + getLastLocation(bi, null); + } + if (bi.getAttributes().containsKey(Position.KEY_BATTERY_LEVEL)) { + position.set(Position.KEY_BATTERY_LEVEL, bi.getDouble(Position.KEY_BATTERY_LEVEL)); + } + if (bi.getAttributes().containsKey(Position.KEY_BATTERY)) { + position.set(Position.KEY_BATTERY, bi.getDouble(Position.KEY_BATTERY)); + } + if (bi.getAttributes().containsKey(Position.KEY_POWER)) { + position.set(Position.KEY_POWER, bi.getDouble(Position.KEY_POWER)); + } + } + } + private Position decodeBattery(Channel channel, SocketAddress remoteAddress, String sentence) { Parser parser = new Parser(PATTERN_BATTERY, sentence); if (!parser.matches()) { @@ -268,6 +298,8 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder { position.set(Position.KEY_POWER, power * 0.1); } + setLastBatteryPower(position); + return position; } @@ -288,6 +320,8 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder { getLastLocation(position, null); + getLastBatteryPower(position); + position.setNetwork(new Network(CellTower.from( parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0)))); @@ -313,6 +347,8 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder { getLastLocation(position, null); + getLastBatteryPower(position); + Network network = new Network(); // Parse LBS @@ -402,6 +438,8 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder { decodeType(position, parser.next(), parser.next()); + getLastBatteryPower(position); + DateBuilder dateBuilder = new DateBuilder(); if (alternative) { dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); -- cgit v1.2.3