Android sensors • • Make new app. In onCreate add – – – SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL); for (Sensor s : list) { • – List of sensors Log.e("SENSORS","name: "+s.getName()); } Nexus One Sensors Nexus S Sensors • • • • • • • • • • • • • • • • BMA150 3-axis Accelerometer AK8973 3-axis Magnetic field sensor AK8973 Orientation sensor CM3602 Proximity sensor CM3602 Light sensor Linear Acceleration Sensor Rotation Vector Sensor API also supports • pressure sensor (to help determine altitude) KR3DM 3-axis Accelerometer AK8973 3-axis Magnetic field sensor AK8973 Orientation sensor GP2A Proximity sensor GP2A Light sensor Linear Acceleration Sensor Rotation Vector Sensor K3G Gyroscope sensor Gravity Sensor compass • New app: Compass • Add member variables – SensorManager sensorManager; – Sensor compassSensor; – MyCompassListener myCompassListener = new MyCompassListener(); // we need to make this MyCompassListener • Make class – class MyCompassListener implements SensorEventListener {}; • Let eclipse add unimplemented functions • In onSensorChanged(SensorEvent event), add – Log.e("compass","x: "+event.values[0]+"y: "+event.values[1]); Register our sensor listener • In onCreate, get sensor and register listener – sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); – List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL); – for (Sensor s : list) { • Log.e("SENSORS","name: "+s.getName()+" tpye: "+s.getType()); • if (s.getType()==Sensor.TYPE_MAGNETIC_FIELD) { – Log.e("debuginfo","registering lin accel"); – compassSensor = s; – sensorManager.registerListener(myCompassListener, s, sensorManager.SENSOR_DELAY_FASTEST); • } – } • Run and see compass values unregister and reregister • Sensors will keep on creating events, so we must stop the events when the app is not active • In main activity – @Override – public void onPause() { • super.onPause(); • sensorManager.unregisterListener(myCompassListener); – } – @Override – public void onResume() { • super.onResume(); • sensorManager.registerListener(myCompassListener, compassSensor, sensorManager.SENSOR_DELAY_FASTEST); – } Draw compass • • • • Recall simple drawing on a canvas lecture In graphical editor, add “view” object. Save Go to xml and make the just made entry be of type edu.udel.eleg454.MyView instead of View – This requires replacing view and /view • Make new class – MyView that extends view – Add • public MyView(Context context, AttributeSet attrs) { – super(context, attrs); • } • public MyView(Context context) { – super(context); • } • In MyView, add member variables – public float x=0; – public float y=1; – float scale; • In onDraw, add – – – – – – – Paint paint = new Paint(); paint.setDither(true); paint.setColor(Color.RED); paint.setStyle(Paint.Style.FILL_AND_STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeWidth(2); • Now draw the compass – – – – scale = (float) Math.sqrt(x*x+y*y); // normalize x = x/scale*50; y = y/scale*50; canvas.drawLine(100,100,100+y,100+x, paint); In Compass (our main activity class) • In onCreate, get the view – view = (MyView)findViewById(R.id.View01); • In onSensorChanged(SensorEvent event), add – view.x = event.values[0]; – view.y = event.values[1]; – view.invalidate(); // forces redraw • run • • More sensors - Proximity Make new app (or maybe canalized Compass) Add member variables – – – • • In onCreate() add, if (s.getType()==Sensor.TYPE_PROXIMITY) { – • • • SensorManager sensorManager; Sensor sensor; MySensorListener mySensorListener = new MySensorListener (); // we need to make this Log.e("debuginfo","registering lin accel"); – compassSensor = s; – sensorManager.registerListener(myCompassListener, s, sensorManager.SENSOR_DELAY_FASTEST); } Make MySensorListener as we made MyCompassListener In onSensorChanged add – if (event.sensor.getType()==Sensor.TYPE_PROXIMITY) { • – Log.e("Proximity ","x: "+event.values[0]); } • Run • Try with light sensor – Sensor.TYPE_LIGHT • • • Linear Accelerometer Make a linear accelerometer listener Register listener Add member variable – • MyLinearAccelerationListener myLinearAccelerationListener = new MyLinearAccelerationListener(); Add local class – – – class MyLinearAccelerationListener implements SensorEventListener { }; Let eclipse add unimplemented methods Add class member variables • double[] linear_acceleration = new double[3]; • double[] location = new double[3]; • double[] velocity = new double[3]; • long lastTimeStamp = 0; • double timeDif; – In onSensorChanged(SensorEvent event) // make sure arg is called event – – – – – – if (event.sensor.getType()==10) { if (lastTimeStamp>0) { // to do: add a jetPlayer-based sounds • timeDif = ((double)(event.timestamp - lastTimeStamp))/1e9; • velocity[0] = velocity[0] + timeDif*event.values[0]; • velocity[1] = velocity[1] + timeDif*event.values[1]; • velocity[2] = velocity[2] + timeDif*event.values[2]; • location[0] = location[0] + timeDif*velocity[0]; • location[1] = location[1] + timeDif*velocity[1]; • location[2] = location[2] + timeDif*velocity[2]; • locationView.setText("location x: "+((double)((int)(location[0]*10.0)))/10.0+ " y: "+ ((double)((int)(location[1]*10.0)))/10.0+" z: "+((double)((int)(location[2]*10.0)))/10.0); • velocityView.setText("velocity x: "+((double)((int)(velocity[0]*10.0)))/10.0+ " y: "+ ((double)((int)(velocity[1]*10.0)))/10.0+" z: "+((double)((int)(velocity[2]*10.0)))/10.0); } lastTimeStamp = event.timestamp; } accelerometer • Challenge: remove gravity from measurement – gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; – – – gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; scale = Math.sqrt(gravity[0]*gravity[0] + gravity[1]*gravity[1] + gravity[2]*gravity[2])/SensorManager.GRAVITY_EARTH; gravity[0] = gravity[0]/scale; gravity[1] = gravity[1]/scale; gravity[2] = gravity[2]/scale; – – – • • • • linear_acceleration[0] = event.values[0] - gravity[0]; linear_acceleration[1] = event.values[1] - gravity[1]; linear_acceleration[2] = event.values[2] - gravity[2]; SAME as linear accelerometer todo • Rotation sensor or gyroscope – Show opengl image that rotates as phone rotates • E.g., see navigator – Allow phone to work as joystick • Gesture recognition – Hidden markov models • Location tracking – Keep history – Gryoscope (to track gravity) – Statistical signal processing