summaryrefslogtreecommitdiff
path: root/src/com/benburwell/planes/sbs
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/benburwell/planes/sbs')
-rw-r--r--src/com/benburwell/planes/sbs/AggregateDataSource.java31
-rw-r--r--src/com/benburwell/planes/sbs/DataSource.java2
-rw-r--r--src/com/benburwell/planes/sbs/SBSPacket.java122
-rw-r--r--src/com/benburwell/planes/sbs/TCPDataSource.java63
4 files changed, 182 insertions, 36 deletions
diff --git a/src/com/benburwell/planes/sbs/AggregateDataSource.java b/src/com/benburwell/planes/sbs/AggregateDataSource.java
index 08b89ea..2850404 100644
--- a/src/com/benburwell/planes/sbs/AggregateDataSource.java
+++ b/src/com/benburwell/planes/sbs/AggregateDataSource.java
@@ -2,22 +2,47 @@ package com.benburwell.planes.sbs;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
/**
* Created by ben on 11/15/16.
*/
public class AggregateDataSource implements DataSource {
private List<DataListener> subscribers = new ArrayList<>();
+ private boolean isOpen = false;
+ private int nextSourceNumber = 1;
+ private Map<Integer,DataSource> sources = new HashMap<>();
- public void addSource(DataSource source) {
+ public int addSource(DataSource source) {
+ int thisSourceNumber = this.nextSourceNumber++;
+ this.sources.put(thisSourceNumber, source);
source.subscribe((SBSPacket packet) -> {
- for (DataListener listener : subscribers) {
- listener.handleMessage(packet);
+ if (isOpen) {
+ for (DataListener listener : subscribers) {
+ listener.handleMessage(packet);
+ }
}
});
+ return thisSourceNumber;
}
public void subscribe(DataListener listener) {
this.subscribers.add(listener);
}
+
+ public void open() {
+ this.isOpen = true;
+ }
+
+ public void close() {
+ this.isOpen = false;
+ }
+
+ public void closeSource(int sourceNumber) {
+ if (this.sources.containsKey(sourceNumber)) {
+ this.sources.get(sourceNumber).close();
+ this.sources.remove(sourceNumber);
+ }
+ }
}
diff --git a/src/com/benburwell/planes/sbs/DataSource.java b/src/com/benburwell/planes/sbs/DataSource.java
index 959e273..961c6e2 100644
--- a/src/com/benburwell/planes/sbs/DataSource.java
+++ b/src/com/benburwell/planes/sbs/DataSource.java
@@ -5,4 +5,6 @@ package com.benburwell.planes.sbs;
*/
public interface DataSource {
void subscribe(DataListener listener);
+ void open();
+ void close();
}
diff --git a/src/com/benburwell/planes/sbs/SBSPacket.java b/src/com/benburwell/planes/sbs/SBSPacket.java
index 0988f3a..5684803 100644
--- a/src/com/benburwell/planes/sbs/SBSPacket.java
+++ b/src/com/benburwell/planes/sbs/SBSPacket.java
@@ -4,35 +4,31 @@ 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() {
- }
+ private TransmissionType transmissionType = null;
+ private String sessionId = null;
+ private String aircraftId = null;
+ private String hexIdent = null;
+ private String flightId = null;
+ private Date dateGenerated = null;
+ private Date dateLogged = null;
+ private String callsign = null;
+ private Double altitude = null;
+ private Double groundSpeed = null;
+ private Double track = null;
+ private Double latitude = null;
+ private Double longitude = null;
+ private Double verticalRate = null;
+ private String squawk = null;
+ private Boolean alert = null;
+ private Boolean emergency = null;
+ private Boolean spi = null;
+ private Boolean isOnGround = null;
public SBSPacket(String packet) throws MalformedPacketException {
this.parse(packet);
@@ -137,4 +133,84 @@ public class SBSPacket {
public String toString() {
return this.messageType.name();
}
+
+ public MessageType getMessageType() {
+ return messageType;
+ }
+
+ public TransmissionType getTransmissionType() {
+ return transmissionType;
+ }
+
+ public String getSessionId() {
+ return sessionId;
+ }
+
+ public String getAircraftId() {
+ return aircraftId;
+ }
+
+ public String getHexIdent() {
+ return hexIdent;
+ }
+
+ public String getFlightId() {
+ return flightId;
+ }
+
+ public Date getDateGenerated() {
+ return dateGenerated;
+ }
+
+ public Date getDateLogged() {
+ return dateLogged;
+ }
+
+ public String getCallsign() {
+ return callsign;
+ }
+
+ public Double getAltitude() {
+ return altitude;
+ }
+
+ public Double getGroundSpeed() {
+ return groundSpeed;
+ }
+
+ public Double getTrack() {
+ return track;
+ }
+
+ public Double getLatitude() {
+ return latitude;
+ }
+
+ public Double getLongitude() {
+ return longitude;
+ }
+
+ public Double getVerticalRate() {
+ return verticalRate;
+ }
+
+ public String getSquawk() {
+ return squawk;
+ }
+
+ public Boolean isAlert() {
+ return alert;
+ }
+
+ public Boolean isEmergency() {
+ return emergency;
+ }
+
+ public Boolean isSpi() {
+ return spi;
+ }
+
+ public Boolean isOnGround() {
+ return isOnGround;
+ }
}
diff --git a/src/com/benburwell/planes/sbs/TCPDataSource.java b/src/com/benburwell/planes/sbs/TCPDataSource.java
index 6c0e51d..2224d36 100644
--- a/src/com/benburwell/planes/sbs/TCPDataSource.java
+++ b/src/com/benburwell/planes/sbs/TCPDataSource.java
@@ -10,20 +10,67 @@ import java.net.*;
*/
public class TCPDataSource implements DataSource {
private List<DataListener> subscribers = new ArrayList<>();
+ private String host;
+ private int port;
+ private Thread clientThread = null;
+ private SocketClient client = null;
public TCPDataSource(String host, int port) {
- new Thread(() -> {
+ this.host = host;
+ this.port = port;
+ }
+
+ public void subscribe(DataListener listener) {
+ this.subscribers.add(listener);
+ }
+
+ public void open() {
+ this.client = new SocketClient(this.host, this.port);
+ this.clientThread = new Thread(this.client);
+ this.clientThread.start();
+ }
+
+ public void close() {
+ if (this.client != null) {
+ this.client.terminate();
+ try {
+ this.clientThread.join();
+ } catch (InterruptedException ignored) {}
+ }
+ }
+
+ private class SocketClient implements Runnable {
+ private String host;
+ private int port;
+ private Socket clientSocket = null;
+
+ public SocketClient(String host, int port) {
+ this.host = host;
+ this.port = port;
+ }
+
+ public void terminate() {
+ if (this.clientSocket != null) {
+ try {
+ this.clientSocket.close();
+ } catch (IOException e) {
+ System.out.println("Got exception closing socket: " + e.getMessage());
+ }
+ }
+ }
+
+ @Override
+ public void run() {
System.out.println("Starting socket client");
- Socket clientSocket;
BufferedReader socketReader;
try {
- clientSocket = new Socket(host, port);
+ this.clientSocket = new Socket(this.host, this.port);
} catch (IOException e) {
- System.out.println("Could not connect to " + host + " on port " + port + ": " + e.getMessage());
+ System.out.println("Could not connect to " + this.host + " on port " + this.port + ": " + e.getMessage());
return;
}
try {
- socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+ socketReader = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
} catch (IOException e) {
System.out.println("Could not create socket reader: " + e.getMessage());
return;
@@ -47,10 +94,6 @@ public class TCPDataSource implements DataSource {
System.out.println(e.getMessage());
}
}
- }).start();
- }
-
- public void subscribe(DataListener listener) {
- this.subscribers.add(listener);
+ }
}
}