/* @file SensorActivity.java * * @author marco corvi * @date aug 2012 * * @brief TopoDroid DistoX sensor activity * -------------------------------------------------------- * Copyright This sowftare is distributed under GPL-3.0 or later * See the file COPYING. * -------------------------------------------------------- */ package com.topodroid.DistoX; import java.util.List; import java.util.ArrayList; import java.util.Locale; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.content.Context; import android.widget.RadioButton; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import android.view.View; import android.view.KeyEvent; import android.hardware.Sensor; import android.hardware.SensorEventListener; import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.util.Log; public class SensorActivity extends Activity implements View.OnClickListener { private TopoDroidApp app; private SensorManager mSensorManager; private float[] mValues; private float mAlpha = 0.85f; private boolean mFirst; private int mSensorType; // current sensor type private ArrayList< Sensor > mSensor; private RadioButton mRBLight = null; private RadioButton mRBMagnetic = null; private RadioButton mRBTemperature = null; private RadioButton mRBPressure = null; private RadioButton mRBGravity = null; // private RadioButton mRBHumidity = null; private RadioButton mRBExtern = null; private EditText mETtype; private EditText mETvalue; private EditText mETcomment; // private Button mBTtype; private Button mBTok; private Button mBTcancel; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView(R.layout.sensor_activity); app = (TopoDroidApp) getApplication(); mSensorManager = (SensorManager)getSystemService( Context.SENSOR_SERVICE ); mValues = new float[3]; mFirst = true; mAlpha = 0.8f; mRBLight = ( RadioButton ) findViewById( R.id.sensor_light ); mRBMagnetic = ( RadioButton ) findViewById( R.id.sensor_magnetic_field ); mRBTemperature = ( RadioButton ) findViewById( R.id.sensor_temperature ); mRBPressure = ( RadioButton ) findViewById( R.id.sensor_pressure ); mRBGravity = ( RadioButton ) findViewById( R.id.sensor_gravity ); // mRBHumidity = ( RadioButton ) findViewById( R.id.sensor_humidity ); mRBExtern = ( RadioButton ) findViewById( R.id.sensor_extern ); mETtype = ( EditText ) findViewById( R.id.sensor_type ); mETvalue = ( EditText ) findViewById( R.id.sensor_value ); mETcomment = ( EditText ) findViewById( R.id.sensor_comment ); mSensor = new ArrayList< Sensor >(); mRBExtern.setOnClickListener( this ); List< Sensor > sl = mSensorManager.getSensorList( Sensor.TYPE_LIGHT ); if ( sl.size() > 0 ) { mRBLight.setOnClickListener( this ); for ( Sensor s : sl ) mSensor.add( s ); } else { mRBLight.setEnabled( false ); } sl = mSensorManager.getSensorList( Sensor.TYPE_MAGNETIC_FIELD ); if ( sl.size() > 0 ) { mRBMagnetic.setOnClickListener( this ); for ( Sensor s : sl ) mSensor.add( s ); } else { mRBMagnetic.setEnabled( false ); } sl = mSensorManager.getSensorList( Sensor.TYPE_TEMPERATURE ); if ( sl.size() > 0 ) { mRBTemperature.setOnClickListener( this ); for ( Sensor s : sl ) mSensor.add( s ); } else { mRBTemperature.setEnabled( false ); } sl = mSensorManager.getSensorList( Sensor.TYPE_PRESSURE ); if ( sl.size() > 0 ) { mRBPressure.setOnClickListener( this ); for ( Sensor s : sl ) mSensor.add( s ); } else { mRBPressure.setEnabled( false ); } sl = mSensorManager.getSensorList( Sensor.TYPE_ORIENTATION ); if ( sl.size() > 0 ) { mRBGravity.setOnClickListener( this ); for ( Sensor s : sl ) mSensor.add( s ); } else { mRBGravity.setEnabled( false ); } // sl = mSensorManager.getSensorList( Sensor.TYPE_RELATIVE_HUMIDITY ); // if ( sl.size() > 0 ) { // mRBHumidity.setOnClickListener( this ); // for ( Sensor s : sl ) mSensor.add( s ); // } else { // mRBHumidity.setEnabled( false ); // } mBTok = ( Button ) findViewById( R.id.sensor_ok ); mBTcancel = ( Button ) findViewById( R.id.sensor_cancel ); mBTok.setOnClickListener( this ); mBTcancel.setOnClickListener( this ); // setTitleColor( 0x006d6df6 ); // mETtype.setText( null ); // mETvalue.setText( null ); } private void setSensor( ) { if ( mSensorType != -1 ) { mSensorManager.unregisterListener(mListener); } mETvalue.setText( null ); mSensorType = -1; if ( mRBLight != null && mRBLight.isChecked() ) { mSensorType = Sensor.TYPE_LIGHT; mETtype.setText( R.string.sensor_light ); } else if ( mRBMagnetic != null && mRBMagnetic.isChecked() ) { mSensorType = Sensor.TYPE_MAGNETIC_FIELD; mETtype.setText( R.string.sensor_magnetic_field ); } else if ( mRBTemperature != null && mRBTemperature.isChecked() ) { mSensorType = Sensor.TYPE_TEMPERATURE; // Sensor.TYPE_AMBIENT_TEMPERATURE; mETtype.setText( R.string.sensor_temperature ); } else if ( mRBPressure != null && mRBPressure.isChecked() ) { mSensorType = Sensor.TYPE_PRESSURE; mETtype.setText( R.string.sensor_pressure ); } else if ( mRBGravity != null && mRBGravity.isChecked() ) { mSensorType = Sensor.TYPE_ORIENTATION; // Sensor.TYPE_GRAVITY; mETtype.setText( R.string.sensor_gravity ); // } else if ( mRBHumidity != null && mRBHumidity.isChecked() ) { // mSensorType = Sensor.TYPE_RELATIVE_HUMIDITY; // mETtype.setText( R.string.sensor_humidity ); } else if ( mRBExtern != null && mRBExtern.isChecked() ) { mSensorType = -1; mETtype.setText( null ); mSensorManager.unregisterListener(mListener); } if ( mSensorType != -1 ) { mFirst = true; mAlpha = 0.8f; registerSensorEventListener(); } } private void registerSensorEventListener() { if ( mSensorType != -1 ) { for ( Sensor s : mSensor ) { if ( s.getType() == mSensorType ) { mSensorManager.registerListener(mListener, s, SensorManager.SENSOR_DELAY_NORMAL); } } } } private final SensorEventListener mListener = new SensorEventListener() { @Override public void onSensorChanged( SensorEvent event) { if ( event.sensor.getType() == mSensorType ) { // TDLog.Log( TDLog.LOG_SENSOR, // "sensorChanged (" + evenmt.values[0] + ", " + evenmt.values[1] + ", " + evenmt.values[2] + ")"); if ( mFirst ) Log.v("DistoX", "sensor changed first " + event.values[0] ); String value = ""; switch ( mSensorType ) { case Sensor.TYPE_LIGHT: // case Sensor.TYPE_PROXIMITY: case Sensor.TYPE_TEMPERATURE: case Sensor.TYPE_PRESSURE: // case Sensor.TYPE_RELATIVE_HUMIDITY: if ( mFirst ) { mValues[0] = event.values[0]; mFirst = false; } else { mValues[0] = ( 1 - mAlpha ) * mValues[0] + mAlpha * event.values[0]; if ( mAlpha > 0.01f ) mAlpha *= 0.9f; } value = String.format(Locale.US, "%.2f", mValues[0] ); break; case Sensor.TYPE_MAGNETIC_FIELD: case Sensor.TYPE_ORIENTATION: // case Sensor.TYPE_ACCELEROMETER: default: if ( mFirst ) { mFirst = false; mValues[0] = event.values[0]; mValues[1] = event.values[1]; mValues[2] = event.values[2]; } else { mValues[0] = ( 1 - mAlpha ) * mValues[0] + mAlpha * event.values[0]; mValues[1] = ( 1 - mAlpha ) * mValues[1] + mAlpha * event.values[1]; mValues[2] = ( 1 - mAlpha ) * mValues[2] + mAlpha * event.values[2]; if ( mAlpha > 0.01f ) mAlpha *= 0.9f; } value = String.format(Locale.US, "%.2f %.2f %.2f", mValues[0], mValues[1], mValues[2] ); break; } mETvalue.setText( value ); } } @Override public void onAccuracyChanged( Sensor sensor, int accuracy ) { // TODO Auto-generated method stub mFirst = true; mAlpha = 0.8f; } }; @Override public void onClick( View view ) { Button b = (Button) view; // TDLog.Log( TDLog.LOG_INPUT, "SensorActivity onClick() button " + b.getText().toString() ); String error; if ( b == mBTok ) { String type = mETtype.getText().toString().trim(); String value = mETvalue.getText().toString().trim(); String comment = mETcomment.getText().toString().trim(); if ( type.length() == 0 ) { error = getResources().getString( R.string.error_sensor_required ); mETtype.setError( error ); return; } if ( value.length() == 0 ) { error = getResources().getString( R.string.error_value_required ); mETvalue.setError( error ); return; } // TDLog.Log( TDLog.LOG_SENSOR, "sensor " + type + " " + value ); Intent intent = new Intent(); intent.putExtra( TDTag.TOPODROID_SENSOR_TYPE, type ); intent.putExtra( TDTag.TOPODROID_SENSOR_VALUE, value ); intent.putExtra( TDTag.TOPODROID_SENSOR_COMMENT, comment ); setResult( RESULT_OK, intent ); finish(); } else if ( b == mBTcancel ) { setResult( RESULT_CANCELED ); if ( mSensorType != -1 ) { mSensorManager.unregisterListener(mListener); } finish(); } else { setSensor(); } } @Override protected void onResume() { super.onResume(); registerSensorEventListener(); } @Override protected void onStop() { mSensorManager.unregisterListener(mListener); super.onStop(); } @Override public boolean onKeyDown( int code, KeyEvent event ) { switch ( code ) { case KeyEvent.KEYCODE_MENU: // HARDWRAE MENU (82) String help_page = getResources().getString( R.string.SensorActivity ); if ( help_page != null ) UserManualActivity.showHelpPage( this, help_page ); return true; case KeyEvent.KEYCODE_BACK: // HARDWARE BACK (4) super.onBackPressed(); return true; // case KeyEvent.KEYCODE_SEARCH: // return onSearchRequested(); // case KeyEvent.KEYCODE_VOLUME_UP: // (24) // case KeyEvent.KEYCODE_VOLUME_DOWN: // (25) default: // TDLog.Error( "key down: code " + code ); } return false; } }