From: Andy Spencer Date: Tue, 18 Mar 2014 03:05:23 +0000 (+0000) Subject: Switch to a single service design X-Git-Url: http://pileus.org/git/?p=~andy%2FiBeaconNav;a=commitdiff_plain;h=c3395e49388e5166d24a770457bffaa9914ac2f2 Switch to a single service design This moves the iBeacon and Sensors code out of services so that they can be used directly by the Task component. --- diff --git a/makefile b/makefile index 2ddaa4c..7eaf684 100644 --- a/makefile +++ b/makefile @@ -34,19 +34,19 @@ clean: # 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 - 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 - adb install -r $+ + adb $(ADBFLAGS) install -r $+ touch bin/install.stamp uninstall: - adb uninstall $(PACKAGE) + adb $(ADBFLAGS) uninstall $(PACKAGE) 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 index 0000000..d0ee4a8 --- /dev/null +++ b/src/edu/ucla/iBeaconNav/Beacon.java @@ -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 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"); + } +} diff --git a/src/edu/ucla/iBeaconNav/CMD.java b/src/edu/ucla/iBeaconNav/CMD.java index ce385d1..70e8e4f 100644 --- a/src/edu/ucla/iBeaconNav/CMD.java +++ b/src/edu/ucla/iBeaconNav/CMD.java @@ -12,12 +12,18 @@ public class CMD { /* Responses Commands */ static enum Response { - REGISTER_TASK, - REGISTER_SENSORS, + REGISTER, NOTIFY, SHOWDATA, } + /* Data Source IDs */ + static enum Source { + GPS, + INERTIAL, + IBEACON, + } + /* Show Data Commands */ static enum Data { ACC, diff --git a/src/edu/ucla/iBeaconNav/Main.java b/src/edu/ucla/iBeaconNav/Main.java index d6cc092..9082279 100644 --- a/src/edu/ucla/iBeaconNav/Main.java +++ b/src/edu/ucla/iBeaconNav/Main.java @@ -40,7 +40,6 @@ public class Main extends Activity private Handler handler; private Messenger messenger; private Task task; - private Sensors sensors; private Toast toast; /* Widgets */ @@ -69,12 +68,6 @@ public class Main extends Activity this.task = task; } - private void onRegister(Sensors sensors) - { - Util.debug("Main: onRegister_sensors"); - this.sensors = sensors; - } - 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, Sensors.class) - .putExtra("Command", CMD.Command.REGISTER) - .putExtra("Messenger", this.messenger)); } 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)); - startService(new Intent(this, Sensors.class) - .putExtra("Command", CMD.Command.CONNECT)); } 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)); - startService(new Intent(this, Sensors.class) - .putExtra("Command", CMD.Command.DISCONNECT)); } private void quit() @@ -240,7 +226,7 @@ public class Main extends Activity @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)); } }); @@ -249,7 +235,7 @@ public class Main extends Activity @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)); } }); @@ -382,12 +368,9 @@ public class Main extends Activity { CMD.Response resp = CMD.Response.values()[msg.what]; switch (resp) { - case REGISTER_TASK: + case REGISTER: 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; diff --git a/src/edu/ucla/iBeaconNav/Sensors.java b/src/edu/ucla/iBeaconNav/Sensors.java index 745c6e6..5d6fb2d 100644 --- a/src/edu/ucla/iBeaconNav/Sensors.java +++ b/src/edu/ucla/iBeaconNav/Sensors.java @@ -15,21 +15,21 @@ import android.hardware.SensorManager; 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; -public class Sensors extends Service implements SensorEventListener +public class Sensors implements SensorEventListener { /* Private data */ + private Task task; + 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; @@ -61,7 +61,7 @@ public class Sensors extends Service implements SensorEventListener private LinkedList rtMtrxBuffers = new LinkedList(); 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}; @@ -91,7 +91,6 @@ public class Sensors extends Service implements SensorEventListener private float gyroscopeRef = 0; private boolean ifSetGrvRef = false; - /* 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 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 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); - } - @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) { - // TODO Auto-generated method stub Util.debug("Sensors: onAccuracyChanged"); - } @Override public void onSensorChanged(SensorEvent event) { - // TODO Auto-generated method stub switch(event.sensor.getType()){ case Sensor.TYPE_ACCELEROMETER: accCnt++; @@ -349,6 +248,7 @@ public class Sensors extends Service implements SensorEventListener processSensorInfo(); } + /* Private helper functions */ private void cycleFloatArray(float[] array, int length){ float temp = array[length-1]; for(int i=1; i 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"); - } }