# 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
--- /dev/null
+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");
+ }
+}
/* 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,
private Handler handler;
private Messenger messenger;
private Task task;
- private Sensors sensors;
private Toast toast;
/* Widgets */
this.task = task;
}
- private void onRegister(Sensors sensors)
- {
- Util.debug("Main: onRegister_sensors");
- this.sensors = sensors;
- }
-
private void onPosition()
{
Util.debug("Main: onPosition");
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()
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()
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()
@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));
}
});
@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));
}
});
{
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;
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;
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 gyroscopeRef = 0;
private boolean ifSetGrvRef = false;
-
/* Position Related Stuff */
//private float startPosX = 0;
//private float startPos = 0;
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++;
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 processSensorInfo(){
displayData(CMD.Data.STPCNT);
float epsl = (float)0.6;
}
}
-
-
private void updateOrientation(){
if (accValues == null || magValues == null){
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){
}
}
- 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]);
}
- public void printVector(String s, float[] v){
+ private void printVector(String s, float[] v){
Util.debug("Sensor: ["+s+"] "+v[0]+" "+v[1]+" "+v[2]);
}
}
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 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();
}
}
- private void notify(String text, int icon)
+ public 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!")
this.startForeground(1, note);
}
+ public boolean isRunning()
+ {
+ return this.running;
+ }
+
+ /* Private methods */
private void handle(CMD.Command cmd, Messenger mgr)
{
// Validate messenger
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");
+ this.running = true;
this.notify("Connected", android.R.drawable.presence_online);
- this.ibeacon = IBeaconManager.getInstanceForApplication(this);
- this.ibeacon.bind(this);
//this.ibeacon.setBackgroundMode(this, false);
break;
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;
- }
- }
- /* 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 */
{
Util.debug("Task: onCreate");
super.onCreate();
- IBeaconManager.LOG_DEBUG = true;
+ this.beacon = new Beacon(this);
+ this.sensors = new Sensors(this);
}
@Override
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");
- }
}