summaryrefslogtreecommitdiff
path: root/src/com/benburwell/planes/sbs/SBSPacket.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/benburwell/planes/sbs/SBSPacket.java')
-rw-r--r--src/com/benburwell/planes/sbs/SBSPacket.java140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/com/benburwell/planes/sbs/SBSPacket.java b/src/com/benburwell/planes/sbs/SBSPacket.java
new file mode 100644
index 0000000..0988f3a
--- /dev/null
+++ b/src/com/benburwell/planes/sbs/SBSPacket.java
@@ -0,0 +1,140 @@
+package com.benburwell.planes.sbs;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.DoubleSummaryStatistics;
+
+/**
+ * Created by ben on 11/15/16.
+ */
+public class SBSPacket {
+ private MessageType messageType;
+ private TransmissionType transmissionType;
+ private String sessionId;
+ private String aircraftId;
+ private String hexIdent;
+ private String flightId;
+ private Date dateGenerated;
+ private Date dateLogged;
+ private String callsign;
+ private double altitude;
+ private double groundSpeed;
+ private double track;
+ private double latitude;
+ private double longitude;
+ private double verticalRate;
+ private String squawk;
+ private boolean alert;
+ private boolean emergency;
+ private boolean spi;
+ private boolean isOnGround;
+
+ public SBSPacket() {
+ }
+
+ public SBSPacket(String packet) throws MalformedPacketException {
+ this.parse(packet);
+ }
+
+ public void parse(String packet) throws MalformedPacketException {
+ String[] segments = packet.split(",", -1);
+ if (segments.length < 11) {
+ throw new MalformedPacketException("Packet must have at least 11 fields, but has only " + segments.length);
+ }
+
+ // get the message type
+ try {
+ this.messageType = MessageType.parse(segments[0]);
+ } catch (UnrecognizedMessageTypeException e) {
+ throw new MalformedPacketException("Packet has an unrecognized message type: " + e.getType());
+ }
+
+ // get the transmission type
+ if (this.messageType.equals(MessageType.TRANSMISSION)) {
+ try {
+ this.transmissionType = TransmissionType.parse(segments[1]);
+ } catch (UnrecognizedTransmissionTypeException e) {
+ throw new MalformedPacketException("Packet has an unrecognized transmission type code: " + e.getCode());
+ }
+ }
+
+ this.sessionId = segments[2];
+ this.aircraftId = segments[3];
+ this.hexIdent = segments[4];
+ this.flightId = segments[5];
+ this.dateGenerated = this.parseDateAndTime(segments[6], segments[7]);
+ this.dateLogged = this.parseDateAndTime(segments[8], segments[9]);
+ this.callsign = segments[10];
+
+ if (this.messageType.equals(MessageType.TRANSMISSION)) {
+ if (segments.length < 22) {
+ throw new MalformedPacketException("Packet is a message (22 fields), but only has " + segments.length);
+ }
+ if (segments[11].length() > 0) {
+ this.altitude = Double.parseDouble(segments[11]);
+ }
+ if (segments[12].length() > 0) {
+ this.groundSpeed = Double.parseDouble(segments[12]);
+ }
+ if (segments[13].length() > 0) {
+ this.track = Double.parseDouble(segments[13]);
+ }
+ if (segments[14].length() > 0) {
+ this.latitude = Double.parseDouble(segments[14]);
+ }
+ if (segments[15].length() > 0) {
+ this.longitude = Double.parseDouble(segments[15]);
+ }
+ if (segments[16].length() > 0) {
+ this.verticalRate = Double.parseDouble(segments[16]);
+ }
+ this.squawk = segments[17];
+ if (segments[18].length() > 0) {
+ this.alert = segments[18].equals("1");
+ }
+ if (segments[19].length() > 0) {
+ this.emergency = segments[19].equals("1");
+ }
+ if (segments[20].length() > 0) {
+ this.spi = segments[20].equals("1");
+ }
+ if (segments[21].length() > 0) {
+ this.isOnGround = segments[21].equals("1");
+ }
+ }
+ }
+
+ public Date parseDateAndTime(String date, String time) {
+ String combined = "";
+ Calendar now = Calendar.getInstance();
+ if (date == null || date.isEmpty()) {
+ combined += now.get(Calendar.YEAR) + "/" + now.get(Calendar.MONTH) + "/" + now.get(Calendar.DAY_OF_MONTH);
+ } else {
+ combined += date;
+ }
+
+ combined += " ";
+
+ if (time == null || time.isEmpty()) {
+ combined += now.get(Calendar.HOUR_OF_DAY) + ":" +
+ now.get(Calendar.MINUTE) + ":" +
+ now.get(Calendar.SECOND) + "." +
+ now.get(Calendar.MILLISECOND);
+ } else {
+ combined += time;
+ }
+
+ SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss.sss");
+ try {
+ return fmt.parse(combined);
+ } catch (ParseException e) {
+ return null;
+ }
+ }
+
+ public String toString() {
+ return this.messageType.name();
+ }
+}