diff options
Diffstat (limited to 'src/org/traccar/protocol/TelicProtocolDecoder.java')
-rw-r--r-- | src/org/traccar/protocol/TelicProtocolDecoder.java | 90 |
1 files changed, 74 insertions, 16 deletions
diff --git a/src/org/traccar/protocol/TelicProtocolDecoder.java b/src/org/traccar/protocol/TelicProtocolDecoder.java index 4d496426d..a9b794c38 100644 --- a/src/org/traccar/protocol/TelicProtocolDecoder.java +++ b/src/org/traccar/protocol/TelicProtocolDecoder.java @@ -26,6 +26,7 @@ import org.traccar.model.Position; import java.net.SocketAddress; import java.util.regex.Pattern; +import org.traccar.helper.Log; public class TelicProtocolDecoder extends BaseProtocolDecoder { @@ -35,27 +36,27 @@ public class TelicProtocolDecoder extends BaseProtocolDecoder { private static final Pattern PATTERN = new PatternBuilder() .number("dddd") - .number("(d{6})") // device id - .number("(d+),") // type - .number("d{12},") // event time + .number("(d{6})") // device id + .number("(d+),") // type + .number("d{12},") // event time .number("d+,") - .number("(dd)(dd)(dd)") // date - .number("(dd)(dd)(dd),") // time + .number("(dd)(dd)(dd)") // date + .number("(dd)(dd)(dd),") // time .groupBegin() - .number("(ddd)(dd)(dddd),") // longitude - .number("(dd)(dd)(dddd),") // latitude + .number("(ddd)(dd)(dddd),") // longitude + .number("(dd)(dd)(dddd),") // latitude .or() - .number("(-?d+),") // longitude - .number("(-?d+),") // latitude + .number("(-?d+),") // longitude + .number("(-?d+),") // latitude .groupEnd() - .number("(d),") // validity - .number("(d+),") // speed - .number("(d+),") // course - .number("(d+),") // satellites + .number("(d),") // validity + .number("(d+),") // speed + .number("(d+),") // course + .number("(d+),") // satellites .expression("(?:[^,]*,){7}") - .number("(d+),") // battery + .number("(d+),") // battery .expression("[^,]*,") - .number("(d+),") // external + .number("(d+),") // external .any() .compile(); @@ -77,7 +78,11 @@ public class TelicProtocolDecoder extends BaseProtocolDecoder { } position.setDeviceId(deviceSession.getDeviceId()); - position.set(Position.KEY_TYPE, parser.next()); + String eventValue = parser.next(); + position.set(Position.KEY_TYPE, eventValue); + + // alarm + position.set(Position.KEY_ALARM, decodeAlarm(eventValue)); DateBuilder dateBuilder = new DateBuilder() .setDateReverse(parser.nextInt(), parser.nextInt(), parser.nextInt()) @@ -105,4 +110,57 @@ public class TelicProtocolDecoder extends BaseProtocolDecoder { return position; } + private String decodeAlarm(String event) { + + int eventId = 0; + + try { + eventId = Integer.parseInt(event); + } catch (Exception e) { + Log.error("TelicProtocolDecoder: Error parsing event (" + eventId + "): " + e.toString()); + } + + switch (eventId) { + case 1: + return Position.ALARM_POWER_ON; // Power on + case 2: + return Position.ALARM_SOS; // Emergency + case 3: + return null; // Position lock alarm + case 4: + return null; // Alarm Tracking + case 5: + return Position.ALARM_POWER_OFF; // Power off + case 6: + return null; // Course change + case 7: + return Position.ALARM_GEOFENCE_ENTER; // Geofence area enter + case 8: + return Position.ALARM_GEOFENCE_EXIT; // Geofence area exit + case 9: + return null; // GPS fix lost + case 10: + return null; // Periodic wakeup / Routine message + case 13: + return null; // Digital input 2 Low -> High / Charger connected + case 14: + return null; // Digital input 2 High -> Low / Charger disconnected + case 15: + return null; // Digital input 3 Low -> High + case 16: + return null; // Digital input 3 High -> Low + case 21: + return null; // Analog input 1 High / Battery level OK + case 22: + return Position.ALARM_LOW_BATTERY; // Analog input 1 Low / Battery level low + case 25: + return Position.ALARM_MOVEMENT; // Device is moving + case 26: + return null; // Device is stationary + case 29: + return null; // Force GPRS reconnection + default: + return null; + } + } } |