]> Pileus Git - ~andy/iBeaconNav/commitdiff
Switch to a single service design
authorAndy Spencer <andy753421@gmail.com>
Tue, 18 Mar 2014 03:05:23 +0000 (03:05 +0000)
committerAndy Spencer <andy753421@gmail.com>
Tue, 18 Mar 2014 03:06:33 +0000 (03:06 +0000)
This moves the iBeacon and Sensors code out of services so that they can
be used directly by the Task component.

makefile
src/edu/ucla/iBeaconNav/Beacon.java [new file with mode: 0644]
src/edu/ucla/iBeaconNav/CMD.java
src/edu/ucla/iBeaconNav/Main.java
src/edu/ucla/iBeaconNav/Sensors.java
src/edu/ucla/iBeaconNav/Task.java

index 2ddaa4c1a4c23901db3672730d3ebda8f7e91db4..7eaf6844b3e3dc938ee17ad40cc7c09683ae922f 100644 (file)
--- a/makefile
+++ b/makefile
@@ -34,19 +34,19 @@ clean:
 
 # ADB targets
 logcat:
 
 # ADB targets
 logcat:
-       adb logcat $(PROGRAM):D IBeaconManager:D AndroidRuntime:E '*:S'
+       adb $(ADBFLAGS) logcat $(PROGRAM):D IBeaconManager:D AndroidRuntime:E '*:S'
 
 run: bin/install.stamp
 
 run: bin/install.stamp
-       adb shell am start -W                 \
+       adb $(ADBFLAGS) shell am start -W                 \
                -a android.intent.action.MAIN \
                -n $(PACKAGE)/.Main
 
 install bin/install.stamp: bin/$(PROGRAM).dbg
                -a android.intent.action.MAIN \
                -n $(PACKAGE)/.Main
 
 install bin/install.stamp: bin/$(PROGRAM).dbg
-       adb install -r $+
+       adb $(ADBFLAGS) install -r $+
        touch bin/install.stamp
 
 uninstall:
        touch bin/install.stamp
 
 uninstall:
-       adb uninstall $(PACKAGE)
+       adb $(ADBFLAGS) uninstall $(PACKAGE)
        rm -f bin/install.stamp
 
 # Rules
        rm -f bin/install.stamp
 
 # Rules
diff --git a/src/edu/ucla/iBeaconNav/Beacon.java b/src/edu/ucla/iBeaconNav/Beacon.java
new file mode 100644 (file)
index 0000000..d0ee4a8
--- /dev/null
@@ -0,0 +1,108 @@
+package edu.ucla.iBeaconNav;
+
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Collection;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.SharedPreferences;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.preference.PreferenceManager;
+
+import com.radiusnetworks.ibeacon.*;
+import com.radiusnetworks.ibeacon.client.*;
+import com.radiusnetworks.ibeacon.service.*;
+
+public class Beacon implements IBeaconConsumer, RangeNotifier, MonitorNotifier
+{
+       /* Private data */
+       private Task           task;
+
+       private IBeaconManager ibeacon;
+
+       /* Public methods */
+       public Beacon(Task task) {
+               this.task = task;
+               IBeaconManager.LOG_DEBUG = true;
+       }
+
+       public void connect() {
+               Util.debug("Task: handle - connect");
+               this.task.notify("Connected", android.R.drawable.presence_online);
+               this.ibeacon = IBeaconManager.getInstanceForApplication(this.task);
+               this.ibeacon.bind(this);
+               //this.ibeacon.setBackgroundMode(this, false);
+       }
+
+       public void disconnect() {
+               Util.debug("Task: handle - register");
+               this.ibeacon.unBind(this);
+               //this.ibeacon.setBackgroundMode(this, true);
+       }
+
+       /* IBeaconConsumer Methods
+        *   Pass most of these off to Task,
+        *   I don't even know why they're here */
+       @Override
+       public boolean bindService(Intent intent, ServiceConnection connection, int mode) {
+               return this.task.bindService(intent, connection, mode);
+       }
+
+       @Override
+       public Context getApplicationContext() {
+               return this.task.getApplicationContext();
+       }
+
+       @Override
+       public void unbindService(ServiceConnection connection)  {
+               this.task.unbindService(connection);
+       }
+
+       @Override
+       public void onIBeaconServiceConnect() {
+               Util.debug("Task: onIBeaconServiceConnect");
+
+               this.ibeacon.setRangeNotifier(this);
+               this.ibeacon.setMonitorNotifier(this);
+
+               try {
+                       Region region = new Region("iBeaconNavMonitoringId", null, null, null);
+                       this.ibeacon.startRangingBeaconsInRegion(region);
+                       this.ibeacon.startMonitoringBeaconsInRegion(region);
+               } catch (RemoteException e) {
+                       Util.debug("Task: onIBeaconServiceConnect - error");
+               }
+       }
+
+       /* RangeNotifier Methods */
+        @Override
+        public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
+               Util.debug("Task: didRangeBeaconsInRegion");
+        }
+
+       /* MonitorNotifier Methods */
+       @Override
+       public void didEnterRegion(Region region) {
+               Util.debug("Task: didEnterRegion");
+       }
+
+       @Override
+       public void didExitRegion(Region region) {
+               Util.debug("Task: didExitRegion");
+       }
+
+       @Override
+       public void didDetermineStateForRegion(int state, Region region) {
+               Util.debug("Task: didDetermineStateForRegion");
+       }
+}
index ce385d198ca42670fca262a417d9528a46aff623..70e8e4feca17d974f5716d803a38719805b911eb 100644 (file)
@@ -12,12 +12,18 @@ public class CMD {
 
        /* Responses Commands */
        static enum Response {
 
        /* Responses Commands */
        static enum Response {
-               REGISTER_TASK,
-               REGISTER_SENSORS,
+               REGISTER,
                NOTIFY,
                SHOWDATA,
        }
 
                NOTIFY,
                SHOWDATA,
        }
 
+       /* Data Source IDs */
+       static enum Source {
+               GPS,
+               INERTIAL,
+               IBEACON,
+       }
+
        /* Show Data Commands */
        static enum Data {
                ACC,
        /* Show Data Commands */
        static enum Data {
                ACC,
index d6cc092df02781d8dd77d2b6aeccde9f80fed1a9..9082279c9640887711cf34454391eb5ce17b396c 100644 (file)
@@ -40,7 +40,6 @@ public class Main extends Activity
        private Handler      handler;
        private Messenger    messenger;
        private Task         task;
        private Handler      handler;
        private Messenger    messenger;
        private Task         task;
-       private Sensors      sensors;
        private Toast        toast;
 
        /* Widgets */
        private Toast        toast;
 
        /* Widgets */
@@ -69,12 +68,6 @@ public class Main extends Activity
                this.task    = task;
        }
        
                this.task    = task;
        }
        
-       private void onRegister(Sensors sensors)
-       {
-               Util.debug("Main: onRegister_sensors");
-               this.sensors = sensors;
-       }
-
        private void onPosition()
        {
                Util.debug("Main: onPosition");
        private void onPosition()
        {
                Util.debug("Main: onPosition");
@@ -174,9 +167,6 @@ public class Main extends Activity
                startService(new Intent(this, Task.class)
                                .putExtra("Command",   CMD.Command.REGISTER)
                                .putExtra("Messenger", this.messenger));
                startService(new Intent(this, Task.class)
                                .putExtra("Command",   CMD.Command.REGISTER)
                                .putExtra("Messenger", this.messenger));
-               startService(new Intent(this, Sensors.class)
-                               .putExtra("Command",   CMD.Command.REGISTER)
-                               .putExtra("Messenger", this.messenger));
        }
 
        private void connect()
        }
 
        private void connect()
@@ -184,8 +174,6 @@ public class Main extends Activity
                Util.debug("Main: connect");
                startService(new Intent(this, Task.class)
                                .putExtra("Command", CMD.Command.CONNECT));
                Util.debug("Main: connect");
                startService(new Intent(this, Task.class)
                                .putExtra("Command", CMD.Command.CONNECT));
-               startService(new Intent(this, Sensors.class)
-                               .putExtra("Command", CMD.Command.CONNECT));
        }
 
        private void disconnect()
        }
 
        private void disconnect()
@@ -193,8 +181,6 @@ public class Main extends Activity
                Util.debug("Main: disconnect");
                startService(new Intent(this, Task.class)
                                .putExtra("Command", CMD.Command.DISCONNECT));
                Util.debug("Main: disconnect");
                startService(new Intent(this, Task.class)
                                .putExtra("Command", CMD.Command.DISCONNECT));
-               startService(new Intent(this, Sensors.class)
-                               .putExtra("Command", CMD.Command.DISCONNECT));
        }
 
        private void quit()
        }
 
        private void quit()
@@ -240,7 +226,7 @@ public class Main extends Activity
                                @Override
                                public void onClick(View v) {
                                        // TODO Auto-generated method stub
                                @Override
                                public void onClick(View v) {
                                        // TODO Auto-generated method stub
-                                       startService(new Intent(Main.this, Sensors.class)
+                                       startService(new Intent(Main.this, Task.class)
                                        .putExtra("Command",   CMD.Command.RSTHEAD));
                                }
                        });
                                        .putExtra("Command",   CMD.Command.RSTHEAD));
                                }
                        });
@@ -249,7 +235,7 @@ public class Main extends Activity
                                @Override
                                public void onClick(View v) {
                                        // TODO Auto-generated method stub
                                @Override
                                public void onClick(View v) {
                                        // TODO Auto-generated method stub
-                                       startService(new Intent(Main.this, Sensors.class)
+                                       startService(new Intent(Main.this, Task.class)
                                        .putExtra("Command",   CMD.Command.RSTDST));
                                }
                        });
                                        .putExtra("Command",   CMD.Command.RSTDST));
                                }
                        });
@@ -382,12 +368,9 @@ public class Main extends Activity
                {
                        CMD.Response resp = CMD.Response.values()[msg.what];
                        switch (resp) {
                {
                        CMD.Response resp = CMD.Response.values()[msg.what];
                        switch (resp) {
-                               case REGISTER_TASK:
+                               case REGISTER:
                                        Main.this.onRegister((Task)msg.obj);
                                        break;
                                        Main.this.onRegister((Task)msg.obj);
                                        break;
-                               case REGISTER_SENSORS:
-                                       Main.this.onRegister((Sensors)msg.obj);
-                                       break;
                                case NOTIFY:
                                        Main.this.onNotify((String)msg.obj);
                                        break;
                                case NOTIFY:
                                        Main.this.onNotify((String)msg.obj);
                                        break;
index 745c6e6bfbcb4ced82cb0dc7bde916c666ceb320..5d6fb2dd1e94fc4302a868b8bc9c19500ec7e593 100644 (file)
@@ -15,21 +15,21 @@ import android.hardware.SensorManager;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
-import android.os.Messenger;
 import android.os.SystemClock;
 import android.widget.EditText;
 import edu.ucla.iBeaconNav.R;
 
 import android.os.SystemClock;
 import android.widget.EditText;
 import edu.ucla.iBeaconNav.R;
 
-public class Sensors extends Service implements SensorEventListener
+public class Sensors implements SensorEventListener
 {
        /* Private data */
 {
        /* Private data */
+       private Task          task;
+
        private SensorManager sensorManager;
        private Sensor        accSensor;
        private Sensor        grvSensor;
        private Sensor        magSensor;
        private Sensor        gyrSensor;
 
        private SensorManager sensorManager;
        private Sensor        accSensor;
        private Sensor        grvSensor;
        private Sensor        magSensor;
        private Sensor        gyrSensor;
 
-       private Messenger     messenger;
        private boolean       active;
        private long          lastTime_ms    = 0;
        private float         snsInterval_ms = 0;
        private boolean       active;
        private long          lastTime_ms    = 0;
        private float         snsInterval_ms = 0;
@@ -61,7 +61,7 @@ public class Sensors extends Service implements SensorEventListener
        private LinkedList<Float> rtMtrxBuffers = new LinkedList<Float>();
        private float[] data        = new float[4];
        private float[] accSum      = {0,0,0};
        private LinkedList<Float> rtMtrxBuffers = new LinkedList<Float>();
        private float[] data        = new float[4];
        private float[] accSum      = {0,0,0};
-    private float[] accAvg      = {0,0,0};
+       private float[] accAvg      = {0,0,0};
        private float[] magSum      = {0,0,0};
        private float[] gyrSum      = {0,0,0};
        private float[] gyrOffset   = {0,0,0};
        private float[] magSum      = {0,0,0};
        private float[] gyrSum      = {0,0,0};
        private float[] gyrOffset   = {0,0,0};
@@ -91,7 +91,6 @@ public class Sensors extends Service implements SensorEventListener
        private float   gyroscopeRef      = 0;
        private boolean ifSetGrvRef       = false;
 
        private float   gyroscopeRef      = 0;
        private boolean ifSetGrvRef       = false;
 
-
        /* Position Related Stuff */
        //private float   startPosX      = 0;
        //private float   startPos       = 0;
        /* Position Related Stuff */
        //private float   startPosX      = 0;
        //private float   startPos       = 0;
@@ -113,148 +112,48 @@ public class Sensors extends Service implements SensorEventListener
        private long    time1hz        = 0;
        private Vect    gyr1hz         = new Vect();
 
        private long    time1hz        = 0;
        private Vect    gyr1hz         = new Vect();
 
-       /* Private methods */
-       private void tellMain(CMD.Response cmd, Object value)
-       {
-               try {
-                       android.os.Message msg = android.os.Message.obtain();
-                       msg.what = cmd.ordinal();
-                       msg.obj  = value;
-                       this.messenger.send(msg);
-               } catch (Exception e) {
-                       Util.debug("Sensors: error sending message", e);
-               }
-       }
-
-       private void notify(String text, int icon)
-       {
-               // Notify Main
-               this.tellMain(CMD.Response.NOTIFY, text);
-
-               // Notification bar
-               //Notification  note   = new Notification(icon, null, 0);
-               //Intent        intent = new Intent(this, Main.class);
-               //PendingIntent pend   = PendingIntent.getActivity(this, 0, intent, 0);
-               //note.setLatestEventInfo(this, "iBeaconNav!", text, pend);
-               //PendingIntent pend = PendingIntent.getActivity(this, 0, intent, 0);
-
-               Notification  note = new Notification.Builder(this)
-                       .setContentTitle("iBeaconNav!")
-                       .setContentText("iBeaconNav!")
-                       .setSmallIcon(icon)
-                       .build();
-
-               this.startForeground(1, note);
-       }
-
-       private void handle(CMD.Command cmd, Messenger mgr)
-       {
-               // Validate messenger
-               if (cmd != CMD.Command.REGISTER && mgr != null && mgr != this.messenger)
-                       Util.debug("Sensors: handle - invalid messenger");
-
-               // Handle the command
-               switch (cmd) {
-                       // Setup communication with Main
-                       case REGISTER:
-                               Util.debug("Sensors: handle - register");
-                               this.messenger = mgr;
-                               break;
-
-                       // Create client thread
-                       case CONNECT:
-                               Util.debug("Sensors: handle - connect");
-                               sensorManager.registerListener(this, accSensor, SensorManager.SENSOR_DELAY_FASTEST);
-                               sensorManager.registerListener(this, grvSensor, SensorManager.SENSOR_DELAY_FASTEST);
-                               sensorManager.registerListener(this, magSensor, SensorManager.SENSOR_DELAY_FASTEST);
-                               sensorManager.registerListener(this, gyrSensor, SensorManager.SENSOR_DELAY_FASTEST);
-                               break;
-
-                       // Stop client thread
-                       case DISCONNECT:
-                               Util.debug("Sensors: handle - register");
-                               // TODO
-                               break;
-
-                       // Reset heading
-                       case RSTHEAD:
-                               Util.debug("Sensors: handle - reset heading");
-                               this.rotation = new Quat();
-                               currentHeading = 0;
-                               displayData(CMD.Data.HEADING);
-                               break;
-
-                       // Reset distance
-                       case RSTDST:
-                               Util.debug("Sensors: handle - reset distance");
-                               currentPosX = 0;
-                               currentPosY = 0;
-                               displayData(CMD.Data.POSITION);
-                               break;
-               }
-       }
-
        /* Public methods */
        /* Public methods */
-       public boolean isRunning()
+       public Sensors(Task task)
        {
        {
-               return true; // TODO
-       }
+               Util.debug("Sensors: constructor");
+               this.task          = task;
+               this.sensorManager = (SensorManager)task.getSystemService(Context.SENSOR_SERVICE);
 
 
-       /* Service Methods */
-       @Override
-       public void onCreate()
-       {
-               Util.debug("Sensors: onCreate");
-               super.onCreate();
-               sensorManager =  (SensorManager) getSystemService(Context.SENSOR_SERVICE);
+               // Get sensors
                accSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                grvSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
                magSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
                gyrSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
                accSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                grvSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
                magSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
                gyrSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
-       }
 
 
-       @Override
-       public void onDestroy()
-       {
-               Util.debug("Sensors: onDestroy");
-               //this.handle(CMD.Response.DISCONNECT, null);
+               // Connect sensor listeners
+               sensorManager.registerListener(this, accSensor, SensorManager.SENSOR_DELAY_FASTEST);
+               sensorManager.registerListener(this, grvSensor, SensorManager.SENSOR_DELAY_FASTEST);
+               sensorManager.registerListener(this, magSensor, SensorManager.SENSOR_DELAY_FASTEST);
+               sensorManager.registerListener(this, gyrSensor, SensorManager.SENSOR_DELAY_FASTEST);
        }
 
        }
 
-       @Override
-       public int onStartCommand(Intent intent, int flags, int startId)
-       {
-               Util.debug("Sensors: onStartCommand");
-               int         rval = super.onStartCommand(intent, flags, startId);
-               CMD.Command cmd  = (CMD.Command)intent.getExtras().get("Command");
-               Messenger   mgr  = (Messenger)intent.getExtras().get("Messenger");
-               this.handle(cmd, mgr);
-               return rval;
+       public void reset_heading() {
+               Util.debug("Sensors: handle - reset heading");
+               this.rotation = new Quat();
+               currentHeading = 0;
+               displayData(CMD.Data.HEADING);
        }
 
        }
 
-       @Override
-       public IBinder onBind(Intent intent)
-       {
-               Util.debug("Sensors: onBind");
-               return messenger.getBinder();
-       }
-       class IncomingHandler extends Handler{
-               @Override
-               public void handleMessage(Message msg) {
-                       //Util.debug("Sensors: MSG HANDLERRRRRRRRR");
-                       super.handleMessage(msg);
-               }
+       public void reset_distance() {
+               Util.debug("Sensors: handle - reset distance");
+               currentPosX = 0;
+               currentPosY = 0;
+               displayData(CMD.Data.POSITION);
        }
 
        }
 
+       /* Sensor Event Listener functions */
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
-               // TODO Auto-generated method stub
                Util.debug("Sensors: onAccuracyChanged");
                Util.debug("Sensors: onAccuracyChanged");
-
        }
 
        @Override
        public void onSensorChanged(SensorEvent event) {
        }
 
        @Override
        public void onSensorChanged(SensorEvent event) {
-               // TODO Auto-generated method stub
                switch(event.sensor.getType()){
                case Sensor.TYPE_ACCELEROMETER:
                        accCnt++;
                switch(event.sensor.getType()){
                case Sensor.TYPE_ACCELEROMETER:
                        accCnt++;
@@ -349,6 +248,7 @@ public class Sensors extends Service implements SensorEventListener
                processSensorInfo();
        }
 
                processSensorInfo();
        }
 
+       /* Private helper functions */
        private void cycleFloatArray(float[] array, int length){
                float temp = array[length-1];
                for(int i=1; i<length; i++){
        private void cycleFloatArray(float[] array, int length){
                float temp = array[length-1];
                for(int i=1; i<length; i++){
@@ -398,8 +298,6 @@ public class Sensors extends Service implements SensorEventListener
                }
        }
 
                }
        }
 
-
-
        private void processSensorInfo(){
                displayData(CMD.Data.STPCNT);
                float epsl = (float)0.6;
        private void processSensorInfo(){
                displayData(CMD.Data.STPCNT);
                float epsl = (float)0.6;
@@ -422,8 +320,6 @@ public class Sensors extends Service implements SensorEventListener
                }
        }
 
                }
        }
 
-
-
        private void updateOrientation(){
                if (accValues == null || magValues == null){
                        return;
        private void updateOrientation(){
                if (accValues == null || magValues == null){
                        return;
@@ -525,7 +421,7 @@ public class Sensors extends Service implements SensorEventListener
                        return;
                }
 
                        return;
                }
 
-               this.tellMain(CMD.Response.SHOWDATA, data);
+               this.task.tellMain(CMD.Response.SHOWDATA, data);
        }
 
        private int everyAveragedBuffer(float[] buffer, float[] values, int length, int cnt, int cycle, CMD.Data cmd){
        }
 
        private int everyAveragedBuffer(float[] buffer, float[] values, int length, int cnt, int cycle, CMD.Data cmd){
@@ -572,13 +468,13 @@ public class Sensors extends Service implements SensorEventListener
                }
        }
 
                }
        }
 
-       public void printMatrix(String s, Matrix m){
+       private void printMatrix(String s, Matrix m){
                Util.debug("Sensor: ["+s+"] "+m.mValue[0]+" "+m.mValue[1]+" "+m.mValue[2]);
                Util.debug("Sensor:       "  +m.mValue[3]+" "+m.mValue[4]+" "+m.mValue[5]);
                Util.debug("Sensor:       "  +m.mValue[6]+" "+m.mValue[7]+" "+m.mValue[8]);
        }
 
                Util.debug("Sensor: ["+s+"] "+m.mValue[0]+" "+m.mValue[1]+" "+m.mValue[2]);
                Util.debug("Sensor:       "  +m.mValue[3]+" "+m.mValue[4]+" "+m.mValue[5]);
                Util.debug("Sensor:       "  +m.mValue[6]+" "+m.mValue[7]+" "+m.mValue[8]);
        }
 
-       public void printVector(String s, float[] v){
+       private void printVector(String s, float[] v){
                Util.debug("Sensor: ["+s+"] "+v[0]+" "+v[1]+" "+v[2]);
        }
 }
                Util.debug("Sensor: ["+s+"] "+v[0]+" "+v[1]+" "+v[2]);
        }
 }
index 6d8c777d33960792e38be0f87f0fd13b0aa21968..c3def77fb4084f7bf983312466f94ab97626fe79 100644 (file)
@@ -18,18 +18,16 @@ import android.os.Messenger;
 import android.os.RemoteException;
 import android.preference.PreferenceManager;
 
 import android.os.RemoteException;
 import android.preference.PreferenceManager;
 
-import com.radiusnetworks.ibeacon.*;
-import com.radiusnetworks.ibeacon.client.*;
-import com.radiusnetworks.ibeacon.service.*;
-
-public class Task extends Service implements IBeaconConsumer, RangeNotifier, MonitorNotifier
+public class Task extends Service
 {
        /* Private data */
        private Messenger      messenger;
 {
        /* Private data */
        private Messenger      messenger;
-       private IBeaconManager ibeacon;
+       private Beacon         beacon;
+       private Sensors        sensors;
+       private boolean        running;
 
 
-       /* Private methods */
-       private void tellMain(CMD.Response cmd, Object value)
+       /* Public methods */
+       public void tellMain(CMD.Response cmd, Object value)
        {
                try {
                        android.os.Message msg = android.os.Message.obtain();
        {
                try {
                        android.os.Message msg = android.os.Message.obtain();
@@ -41,18 +39,12 @@ public class Task extends Service implements IBeaconConsumer, RangeNotifier, Mon
                }
        }
 
                }
        }
 
-       private void notify(String text, int icon)
+       public void notify(String text, int icon)
        {
                // Notify Main
                this.tellMain(CMD.Response.NOTIFY, text);
 
                // Notification bar
        {
                // Notify Main
                this.tellMain(CMD.Response.NOTIFY, text);
 
                // Notification bar
-               //Notification  note   = new Notification(icon, null, 0);
-               //Intent        intent = new Intent(this, Main.class);
-               //PendingIntent pend   = PendingIntent.getActivity(this, 0, intent, 0);
-               //note.setLatestEventInfo(this, "iBeaconNav!", text, pend);
-               //PendingIntent pend = PendingIntent.getActivity(this, 0, intent, 0);
-
                Notification  note = new Notification.Builder(this)
                        .setContentTitle("iBeaconNav!")
                        .setContentText("iBeaconNav!")
                Notification  note = new Notification.Builder(this)
                        .setContentTitle("iBeaconNav!")
                        .setContentText("iBeaconNav!")
@@ -62,6 +54,12 @@ public class Task extends Service implements IBeaconConsumer, RangeNotifier, Mon
                this.startForeground(1, note);
        }
 
                this.startForeground(1, note);
        }
 
+       public boolean isRunning()
+       {
+               return this.running;
+       }
+
+       /* Private methods */
        private void handle(CMD.Command cmd, Messenger mgr)
        {
                // Validate messenger
        private void handle(CMD.Command cmd, Messenger mgr)
        {
                // Validate messenger
@@ -74,14 +72,14 @@ public class Task extends Service implements IBeaconConsumer, RangeNotifier, Mon
                        case REGISTER:
                                Util.debug("Task: handle - register");
                                this.messenger = mgr;
                        case REGISTER:
                                Util.debug("Task: handle - register");
                                this.messenger = mgr;
+                               this.tellMain(CMD.Response.REGISTER, this);
                                break;
 
                        // Create client thread
                        case CONNECT:
                                Util.debug("Task: handle - connect");
                                break;
 
                        // Create client thread
                        case CONNECT:
                                Util.debug("Task: handle - connect");
+                               this.running = true;
                                this.notify("Connected", android.R.drawable.presence_online);
                                this.notify("Connected", android.R.drawable.presence_online);
-                               this.ibeacon = IBeaconManager.getInstanceForApplication(this);
-                               this.ibeacon.bind(this);
                                //this.ibeacon.setBackgroundMode(this, false);
                                break;
 
                                //this.ibeacon.setBackgroundMode(this, false);
                                break;
 
@@ -89,17 +87,21 @@ public class Task extends Service implements IBeaconConsumer, RangeNotifier, Mon
                        case DISCONNECT:
                                Util.debug("Task: handle - register");
                                //this.ibeacon.setBackgroundMode(this, true);
                        case DISCONNECT:
                                Util.debug("Task: handle - register");
                                //this.ibeacon.setBackgroundMode(this, true);
-                               this.ibeacon.unBind(this);
-                               this.ibeacon = null;
+                               this.running = false;
                                this.stopForeground(true);
                                break;
                                this.stopForeground(true);
                                break;
-               }
-       }
 
 
-       /* Public methods */
-       public boolean isRunning()
-       {
-               return this.ibeacon != null;
+                       // Reset heading
+                       case RSTHEAD:
+                               this.sensors.reset_heading();
+                               break;
+
+                       // Reset distance
+                       case RSTDST:
+                               this.sensors.reset_distance();
+                               break;
+
+               }
        }
 
        /* Service Methods */
        }
 
        /* Service Methods */
@@ -108,7 +110,8 @@ public class Task extends Service implements IBeaconConsumer, RangeNotifier, Mon
        {
                Util.debug("Task: onCreate");
                super.onCreate();
        {
                Util.debug("Task: onCreate");
                super.onCreate();
-               IBeaconManager.LOG_DEBUG = true;
+               this.beacon  = new Beacon(this);
+               this.sensors = new Sensors(this);
        }
 
        @Override
        }
 
        @Override
@@ -135,43 +138,4 @@ public class Task extends Service implements IBeaconConsumer, RangeNotifier, Mon
                Util.debug("Task: onBind");
                return null;
        }
                Util.debug("Task: onBind");
                return null;
        }
-
-       /* IBeaconConsumer Methods */
-       @Override
-       public void onIBeaconServiceConnect() {
-               Util.debug("Task: onIBeaconServiceConnect");
-
-               this.ibeacon.setRangeNotifier(this);
-               this.ibeacon.setMonitorNotifier(this);
-
-               try {
-                       Region region = new Region("iBeaconNavMonitoringId", null, null, null);
-                       this.ibeacon.startRangingBeaconsInRegion(region);
-                       this.ibeacon.startMonitoringBeaconsInRegion(region);
-               } catch (RemoteException e) {
-                       Util.debug("Task: onIBeaconServiceConnect - error");
-               }
-       }
-
-       /* RangeNotifier Methods */
-        @Override
-        public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
-               Util.debug("Task: didRangeBeaconsInRegion");
-        }
-
-       /* MonitorNotifier Methods */
-       @Override
-       public void didEnterRegion(Region region) {
-               Util.debug("Task: didEnterRegion");
-       }
-
-       @Override
-       public void didExitRegion(Region region) {
-               Util.debug("Task: didExitRegion");
-       }
-
-       @Override
-       public void didDetermineStateForRegion(int state, Region region) {
-               Util.debug("Task: didDetermineStateForRegion");
-       }
 }
 }