org.placelab.spotter
Class AsyncSpotter

java.lang.Object
  extended byorg.placelab.spotter.AbstractSpotter
      extended byorg.placelab.spotter.AsyncSpotter
All Implemented Interfaces:
Spotter
Direct Known Subclasses:
BluetoothSpotter

public abstract class AsyncSpotter
extends AbstractSpotter

This convenience class provides all the groundwork for Spotters whose implementations are most naturally asynchronous. Subclasses provide their own startOneScan and cancelScan implementations, and AsyncSpotter then builds the continuous scanning methods based on those.


Constructor Summary
AsyncSpotter()
           
 
Method Summary
protected abstract  void cancelScan()
          Stops the scan that was started in startOneScan(EventSystem)
 void errorInBackgroundThreadAndThreadDeath(java.lang.Throwable t)
           
 Measurement getMeasurement()
          A blocking call to get a new Measurement.
protected abstract  Measurement getMeasurementImpl()
          Collect Measurements with a blocking implementation and return them.
protected abstract  long nextScanInterval()
           
protected  void scanDone()
           
 void scanOnce()
          Performs a single background scan for Measurements and returns the result to registered SpotterListeners' SpotterListener.gotMeasurement(Spotter, Measurement) method.
 void scanOnce(EventSystem evs)
          Like scanOnce() but instead uses the given EventSystem to deliver the callback to hide the background thread from the application.
protected  void scanUsingBackgroundThread(EventSystem evs)
           
protected  void scanUsingEventSystem(EventSystem evs)
           
protected abstract  void startOneScan(EventSystem evs)
          This performs a single scan of the environment that should call AbstractSpotter.notifyGotMeasurement(EventSystem, Measurement) upon collecting the Measurement.
 void startScanning()
          Start scanning for Measurements in the background and return the Measurements by notifying SpotterListeners with the SpotterListener.gotMeasurement(Spotter, Measurement) method.
 void startScanning(EventSystem evs)
          Start scanning for Measurements.
 void stopScanning()
          Stops a currently running background scan started from either scanOnce or startScanning.
 
Methods inherited from class org.placelab.spotter.AbstractSpotter
addListener, notifyEndOfScan, notifyEndOfScan, notifyGotException, notifyGotException, notifyGotMeasurement, notifyGotMeasurement, removeListener, waitForThread
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.placelab.spotter.Spotter
close, open
 

Constructor Detail

AsyncSpotter

public AsyncSpotter()
Method Detail

nextScanInterval

protected abstract long nextScanInterval()
Returns:
the interval that the spotter should wait before invoking the next scan

startOneScan

protected abstract void startOneScan(EventSystem evs)
This performs a single scan of the environment that should call AbstractSpotter.notifyGotMeasurement(EventSystem, Measurement) upon collecting the Measurement.

Parameters:
evs - the EventSystem to pass through to notifyGotMeasurement

cancelScan

protected abstract void cancelScan()
Stops the scan that was started in startOneScan(EventSystem)


getMeasurementImpl

protected abstract Measurement getMeasurementImpl()
                                           throws SpotterException
Collect Measurements with a blocking implementation and return them.

Throws:
SpotterException

getMeasurement

public Measurement getMeasurement()
                           throws SpotterException
Description copied from interface: Spotter
A blocking call to get a new Measurement. A spotter implementation may choose to just return the last cached Measurement, or go ahead and do a new scan and return the results of that scan. Note that the accuracy of timestamps returned by this usage model depends on the spotter implementation. You should not call this method while this Spotter is performing a continous scan. Doing so will result in a SpotterException being thrown.

Throws:
SpotterException

scanOnce

public void scanOnce()
Description copied from interface: Spotter
Performs a single background scan for Measurements and returns the result to registered SpotterListeners' SpotterListener.gotMeasurement(Spotter, Measurement) method. This may start a new thread and deliver the callback in that new thread.

Registered SpotterListeners that also implement the ScanOnceListener interface will also receive ScanOnceListener.endOfScan(Spotter) notifications.

Specified by:
scanOnce in interface Spotter
Overrides:
scanOnce in class AbstractSpotter

scanOnce

public void scanOnce(EventSystem evs)
Description copied from interface: Spotter
Like Spotter.scanOnce() but instead uses the given EventSystem to deliver the callback to hide the background thread from the application.

Specified by:
scanOnce in interface Spotter
Overrides:
scanOnce in class AbstractSpotter

startScanning

public void startScanning()
Description copied from interface: Spotter
Start scanning for Measurements in the background and return the Measurements by notifying SpotterListeners with the SpotterListener.gotMeasurement(Spotter, Measurement) method. Depending on the Spotter implementation this may start up a new background thread. Callbacks to the SpotterListener are not guaranteed to (and probably won't) be in the the same thread as startScanning was called in.

Specified by:
startScanning in interface Spotter
Specified by:
startScanning in class AbstractSpotter

startScanning

public void startScanning(EventSystem evs)
Description copied from interface: Spotter
Start scanning for Measurements. This method may or may not create a new thread internally, but should never expose that thread to the application. Instead callbacks to SpotterListeners should be invoked via the Eventsystem.notifyTransientEvent() method, so that the callbacks get run through the EventSystem thread.

Specified by:
startScanning in interface Spotter
Specified by:
startScanning in class AbstractSpotter

stopScanning

public void stopScanning()
Description copied from interface: Spotter
Stops a currently running background scan started from either scanOnce or startScanning.

Specified by:
stopScanning in interface Spotter
Specified by:
stopScanning in class AbstractSpotter

scanUsingBackgroundThread

protected void scanUsingBackgroundThread(EventSystem evs)

scanUsingEventSystem

protected void scanUsingEventSystem(EventSystem evs)

scanDone

protected void scanDone()

errorInBackgroundThreadAndThreadDeath

public void errorInBackgroundThreadAndThreadDeath(java.lang.Throwable t)