package simplelocationviewer;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
import org.osgi.util.tracker.ServiceTracker;
import com.buglabs.application.IServiceProvider;
import com.buglabs.application.RunnableWithServices;
import com.buglabs.application.ServiceTrackerHelper;
import com.buglabs.bug.module.gps.pub.INMEASentenceProvider;
import com.buglabs.nmea.sentences.RMC;
import com.buglabs.status.IStatusBarProvider;
import com.buglabs.util.LogServiceUtil;
public class Activator implements BundleActivator, RunnableWithServices {
private String[] services = { IStatusBarProvider.class.getName(),
INMEASentenceProvider.class.getName() };
private ServiceTracker st;
private UpdateThread updateThread;
private LogService log;
public void start(BundleContext context) throws Exception {
log = LogServiceUtil.getLogService(context);
st = ServiceTrackerHelper.createAndOpen(context, services, this);
}
public void stop(BundleContext context) throws Exception {
st.close();
}
public void allServicesAvailable(IServiceProvider serviceProvider) {
updateThread = new UpdateThread((IStatusBarProvider) serviceProvider
.getService(IStatusBarProvider.class),
(INMEASentenceProvider) serviceProvider
.getService(INMEASentenceProvider.class));
updateThread.start();
}
public void serviceUnavailable(IServiceProvider serviceProvider,
ServiceReference sr, Object service) {
if (updateThread != null) {
updateThread.interrupt();
}
}
private class UpdateThread extends Thread {
private final IStatusBarProvider sb;
private final INMEASentenceProvider pos;
public UpdateThread(IStatusBarProvider sb, INMEASentenceProvider pos) {
this.sb = sb;
this.pos = pos;
}
public void run() {
log.log(LogService.LOG_INFO, "startup");
String key = null;
int cc = 0;
for (int i = 30; i > 0 && key == null; --i) {
key = sb.acquireRegion(i);
cc = i;
}
log.log(LogService.LOG_INFO, "got chars: " + cc);
boolean flash = false;
if (key == null) {
log.log(LogService.LOG_ERROR, "Unable to get display");
return;
}
try {
while (true) {
RMC r = pos.getRMC();
String fchar = "*";
if (!flash) {
fchar = ".";
}
flash = !flash;
String msg = fchar + "No fix";
if (r != null) {
msg = fchar + r.getLatitude() + " " + r.getLongitude();
}
sb.write(key, msg);
sleep(1000);
}
} catch (InterruptedException e) {
}
sb.releaseRegion(key);
}
}
}