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);
		}
	}
}