package com.aerodynelabs.habtk.tracking;
import java.io.File;
import java.util.Vector;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.aerodynelabs.habtk.logging.TrackingFormatter;
import com.aerodynelabs.map.MapPoint;
public class TrackingService implements Runnable {
private static final Logger debugLog = Logger.getLogger("Debug");
private static final Logger primaryLog = Logger.getLogger("Primary");
private static final Logger secondaryLog = Logger.getLogger("Secondary");
private static final Logger recoveryLog = Logger.getLogger("Recovery");
// Status variables
private boolean stop = false;
private boolean enabled = false;
private boolean nearby = false;
private Tracker primary = null;
private Tracker secondary = null;
private Tracker recovery = null;
private Vector<PositionListener> listeners;
public TrackingService() {
listeners = new Vector<PositionListener>();
File logStore = new File("flights/current");
logStore.mkdirs();
try {
FileHandler primaryFile = new FileHandler("flights/current/primary.log");
primaryFile.setFormatter(new TrackingFormatter());
FileHandler secondaryFile = new FileHandler("flights/current/secondary.log");
secondaryFile.setFormatter(new TrackingFormatter());
FileHandler recoveryFile = new FileHandler("flights/current/recovery.log");
recoveryFile.setFormatter(new TrackingFormatter());
primaryLog.addHandler(primaryFile);
secondaryLog.addHandler(secondaryFile);
recoveryLog.addHandler(recoveryFile);
} catch(Exception e) {
System.err.println("Problem creating tracking logs:");
e.printStackTrace();
debugLog.log(Level.SEVERE, "Exception", e);
}
new Thread(this, "Tracking Service").start();
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean e) {
enabled = e;
}
public void stop() {
stop = true;
}
public void addListener(final PositionListener listener) {
listeners.add(listener);
}
public boolean removeListener(PositionListener listener) {
return listeners.remove(listener);
}
public void setMapNearby(boolean x) {
nearby = x;
}
public void setPrimary(Tracker t) {
primary = t;
}
public void setSecondary(Tracker t) {
secondary = t;
}
public void setRecovery(Tracker t) {
recovery = t;
}
public Tracker getPrimary() {
return primary;
}
public Tracker getSecondary() {
return secondary;
}
public Tracker getRecovery() {
return recovery;
}
public boolean getMapNearby() {
return nearby;
}
private void notifyListeners(int source, MapPoint pkt) {
for(PositionListener listener : listeners) {
listener.positionUpdateEvent(new PositionEvent(source, pkt));
}
}
@Override
public void run() {
while(stop != true) {
while(primary != null && primary.isReady()) {
MapPoint pkt = primary.getPacket();
if(pkt != null && enabled == true) {
notifyListeners(PositionEvent.PRIMARY, pkt);
primaryLog.log(Level.INFO, pkt.toString());
}
}
while(secondary != null && secondary.isReady()) {
MapPoint pkt = secondary.getPacket();
if(pkt != null && enabled == true) {
notifyListeners(PositionEvent.SECONDARY, pkt);
secondaryLog.log(Level.INFO, pkt.toString());
}
}
while(recovery != null && recovery.isReady()) {
MapPoint pkt = recovery.getPacket();
if(pkt != null && enabled == true) {
notifyListeners(PositionEvent.RECOVERY, pkt);
recoveryLog.log(Level.INFO, pkt.toString());
}
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
stop = true;
e.printStackTrace();
debugLog.log(Level.SEVERE, "Exception", e);
}
}
}
}