]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java
RoboDruid: improve handling of short taps
[orte.git] / orte / Robot_Demo / src / org / ocera / orte / demo / MainActivity.java
index f74ab0f943a4128502e1e1c976fa22229fca1f7e..8c80301c45169bc7399f6fc91137356b253dbaef 100644 (file)
@@ -7,6 +7,7 @@ import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.DialogInterface.OnDismissListener;
 import android.content.SharedPreferences;
 import android.content.pm.ActivityInfo;
 import android.hardware.Sensor;
@@ -23,9 +24,11 @@ import android.os.Message;
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
 import android.text.format.Formatter;
+import android.view.GestureDetector;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.MotionEvent;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.TextView;
@@ -36,6 +39,7 @@ public class MainActivity extends Activity {
        private AlertDialog managersDialog = null;
        private EditText managersField = null;
        private TextView ownIP = null;
+       private NetworkInfo wifiInfoTask = null; 
        static EditText voltage33 = null;
        static EditText voltage50 = null;
        static EditText voltage80 = null;
@@ -75,13 +79,12 @@ public class MainActivity extends Activity {
     private PowerManager mPowerManager = null;
     private WifiManager mWifiManager = null;
     private WakeLock mWakeLock = null;
+    private WakeLock mDimLock = null;
     private WifiLock mWifiLock = null;
     private DomainApp appDomain = null;
     private HokuyoView hokuyo_view = null;
-    private MenuItem speed_publ_item = null;
-    private MenuItem speed_subs_item = null;
-    private MenuItem hokuyo_item = null;
     private SharedPreferences prefs = null;
+    private GestureDetector gDetector = null;
 
     static {
        System.loadLibrary("jorte");     
@@ -95,8 +98,7 @@ public class MainActivity extends Activity {
                motion_speed_publ.cancel();
             mSensorManager.unregisterListener(accel);
             this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
-               speed_publ_item.setChecked(false);
-            mWakeLock.release();
+            mDimLock.release();
             mWifiLock.release();
         }
         
@@ -104,7 +106,6 @@ public class MainActivity extends Activity {
                hokuyo_view.runMotion(false);
                motion_speed_subs.cancel();
                hokuyo_view.invalidate();
-               speed_subs_item.setChecked(false);
             mWakeLock.release();
             mWifiLock.release();
         }
@@ -113,15 +114,6 @@ public class MainActivity extends Activity {
                        hokuyo_view.run(false);
                        hokuyo_scan.cancel();
                        hokuyo_view.invalidate();
-                       hokuyo_item.setChecked(false);
-               mWakeLock.release();
-               mWifiLock.release();
-        }
-
-        if (pwr_voltage != null && !pwr_voltage.isCancelled()) {
-               if (voltageDialog.isShowing())
-                       voltageDialog.dismiss();
-                       pwr_voltage.cancel();
                mWakeLock.release();
                mWifiLock.release();
         }
@@ -130,6 +122,11 @@ public class MainActivity extends Activity {
     @Override
     protected void onDestroy() {
        super.onDestroy();
+
+        if (pwr_voltage != null && !pwr_voltage.isCancelled()) {
+               if (voltageDialog.isShowing())
+                       voltageDialog.dismiss();
+        }
        
        if (crane_cmd != null && !crane_cmd.isCancelled()) {
                crane_cmd.cancel();
@@ -150,7 +147,6 @@ public class MainActivity extends Activity {
         }
     }
        
-       @SuppressWarnings("deprecation")
        @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
@@ -158,12 +154,17 @@ public class MainActivity extends Activity {
         
         mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
         mWakeLock = mPowerManager.newWakeLock(
-                       PowerManager.SCREEN_BRIGHT_WAKE_LOCK
-                       | PowerManager.ACQUIRE_CAUSES_WAKEUP,
-                       getClass().getName());
+                       PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
+                       getClass().getName() + " Bright");
+        mDimLock = mPowerManager.newWakeLock(
+                       PowerManager.SCREEN_DIM_WAKE_LOCK,
+                       getClass().getName() + " Dim");
 
         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
-        mWifiLock = mWifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, getClass().getName());
+        mWifiLock = mWifiManager.createWifiLock(
+                       android.os.Build.VERSION.SDK_INT >= 12
+                       ? WifiManager.WIFI_MODE_FULL_HIGH_PERF
+                       : WifiManager.WIFI_MODE_FULL, getClass().getName());
         
         prefs = getSharedPreferences("prefs", 0);
         mgrs = prefs.getString("managers", "10.1.1.1");
@@ -171,19 +172,18 @@ public class MainActivity extends Activity {
                AlertDialog.Builder voltageBuilder = new AlertDialog.Builder(this);
                LayoutInflater inflater = getLayoutInflater();
                View voltageView = inflater.inflate(R.layout.status_dialog, null);
-               voltageBuilder.setCancelable(false);
                voltageBuilder.setView(voltageView);
-               voltageBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
+               voltageBuilder.setPositiveButton("OK",null);
+               voltageBuilder.setTitle("Voltages");
+               voltageDialog = voltageBuilder.create();
+               voltageDialog.setOnDismissListener(new OnDismissListener(){
                        @Override
-                       public void onClick(DialogInterface dialog, int which) {
+                       public void onDismiss(DialogInterface arg0) {
                                voltageDialog.dismiss();
                                pwr_voltage.cancel();
-                               mWakeLock.release();
-                               mWifiLock.release();
+                               mDimLock.release();
                        }
                });
-               voltageBuilder.setTitle("Voltages");
-               voltageDialog = voltageBuilder.create();
                voltage33 = (EditText)voltageView.findViewById(R.id.editText1);
                voltage50 = (EditText)voltageView.findViewById(R.id.editText2);
                voltage80 = (EditText)voltageView.findViewById(R.id.editText3);
@@ -201,38 +201,53 @@ public class MainActivity extends Activity {
                managersField = (EditText)managersView.findViewById(R.id.managers);
                managersField.setText(mgrs);
                
-               NetworkInfo wifiInfoTask = new NetworkInfo();
-               managersBuilder.setCancelable(false);
                managersBuilder.setView(managersView);
                managersBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                SharedPreferences.Editor editor = prefs.edit();
                                mgrs = managersField.getText().toString();
-                               System.out.println(mgrs);
                                editor.putString("managers", mgrs);
                                editor.commit();
                                
-                       manager = new Manager(mgrs);
-
-                       appDomain = new DomainApp();
-                       magnet_cmd = new MagnetCmdPublish(appDomain);
-                       magnet_cmd.start();
-                       crane_cmd = new CraneCmdPublish(appDomain);
-                       crane_cmd.start();
+                               if (manager != null)
+                                       manager.destroy();
+                               manager = new Manager(mgrs);
+                               
                                managersDialog.dismiss();
                        }
                });
+               managersBuilder.setNeutralButton("Cancel", null);
                managersBuilder.setTitle("Set fellow managers");
                managersDialog = managersBuilder.create();
+               managersDialog.setOnDismissListener(new OnDismissListener() {
+                       @Override
+                       public void onDismiss(DialogInterface arg0) {
+                               managersField.setText(mgrs);
+                               wifiInfoTask.cancel(false);
+                       }
+               });
                
         mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
         mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
         
         hokuyo_view = (HokuyoView) findViewById(R.id.hokuyo_view);
-        
-        managersDialog.show();
-               wifiInfoTask.execute();
+        gDetector = new GestureDetector(hokuyo_view.getContext(), new HokuyoGestures());
+        hokuyo_view.setOnTouchListener(new View.OnTouchListener() {
+                       @Override
+                       public boolean onTouch(View v, MotionEvent event) {
+                               return gDetector.onTouchEvent(event);
+                       }
+               
+        });
+
+        manager = new Manager(mgrs);
+
+        appDomain = new DomainApp();
+        magnet_cmd = new MagnetCmdPublish(appDomain);
+        magnet_cmd.start();
+        crane_cmd = new CraneCmdPublish(appDomain);
+        crane_cmd.start();
     }
     
        @Override
@@ -244,94 +259,37 @@ public class MainActivity extends Activity {
        
        @Override
        public boolean onOptionsItemSelected (MenuItem item) {
-               if(item.getTitle().equals("Motion control")) {
-                       if (!item.isChecked()) {
-                               mWakeLock.acquire();
-                               mWifiLock.acquire();
-                               accel = new HandleAccelerometer();
-                               mSensorManager.registerListener(accel, mGravity, SensorManager.SENSOR_DELAY_GAME);
-                               if (motion_speed_publ == null)
-                                       motion_speed_publ = new MotionSpeedPublish(appDomain);
-                               motion_speed_publ.start();
-                               speed_publ_item = item;
-                               this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
-                               item.setChecked(true);
-                       }
-                       else {
-                               mSensorManager.unregisterListener(accel);
-                               motion_speed_publ.cancel();
-                               this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
-                               item.setChecked(false);
-                               mWakeLock.release();
-                               mWifiLock.release();
-                       }
+               if (item.getTitle().equals("Crane: up")) {
+                       crane_cmd.send(0x190);
+                       item.setTitle("Crane: down");
                }
-               else if (item.getTitle().equals("Speed monitor")) {
-                       if(!item.isChecked()) {
-                               mWakeLock.acquire();
-                               mWifiLock.acquire();
-                               if (motion_speed_subs == null)
-                                       motion_speed_subs = new MotionSpeedSubscribe(appDomain, hokuyo_view);
-                               motion_speed_subs.start();
-                               hokuyo_view.runMotion(true);
-                               hokuyo_view.invalidate();
-                               speed_subs_item = item;
-                               item.setChecked(true);
-                       }
-                       else {
-                               hokuyo_view.runMotion(false);
-                               motion_speed_subs.cancel();
-                               hokuyo_view.invalidate();
-                               item.setChecked(false);
-                               mWakeLock.release();
-                               mWifiLock.release();
-                       }
+               else if (item.getTitle().equals("Crane: down")) {
+                       crane_cmd.send(0x100);
+                       item.setTitle("Crane: up");
                }
-               else if (item.getTitle().equals("Hokuyo")) {
+               else if (item.getTitle().equals("Magnet")) {
                        if (!item.isChecked()) {
-                               mWakeLock.acquire();
-                               mWifiLock.acquire();
-                               if (hokuyo_scan == null)
-                                       hokuyo_scan = new HokuyoScanSubscribe(appDomain, hokuyo_view);
-                               hokuyo_scan.start();
-                               hokuyo_view.run(true);
-                               hokuyo_view.invalidate();
-                               hokuyo_item = item;
+                               magnet_cmd.send(1);
                                item.setChecked(true);
                        }
                        else {
-                               hokuyo_view.run(false);
-                               hokuyo_scan.cancel();
-                               hokuyo_view.invalidate();
-                               item.setChecked(false);
-                               mWakeLock.release();
-                               mWifiLock.release();
+                               magnet_cmd.send(0);
+                               item.setChecked(false); 
                        }
                }
-               else if (item.getTitle().equals("Crane up")) {
-                       crane_cmd.send(0x100);
-                       item.setTitle("Crane down");
-               }
-               else if (item.getTitle().equals("Crane down")) {
-                       crane_cmd.send(0x190);
-                       item.setTitle("Crane up");
-               }
-               else if (item.getTitle().equals("Magnet on")) {
-                       magnet_cmd.send(1);
-                       item.setTitle("Magnet off");                    
-               }
-               else if (item.getTitle().equals("Magnet off")) {
-                       magnet_cmd.send(0);
-                       item.setTitle("Magnet on");                     
-               }
                else if (item.getTitle().equals("Voltage monitor")) {
-                       mWakeLock.acquire();
-                       mWifiLock.acquire();
+                       mDimLock.acquire();
                        if (pwr_voltage == null)
                                pwr_voltage = new PwrVoltageSubscribe(appDomain, dialogHandler);
                        pwr_voltage.start();
                        voltageDialog.show();
                }
+               else if (item.getTitle().equals("Fellow managers")) {
+                       wifiInfoTask = new NetworkInfo();
+
+                       managersDialog.show();
+                       wifiInfoTask.execute();
+               }
                else if (item.getTitle().equals("About")) {
                        aboutDialog.show();
                }
@@ -356,10 +314,109 @@ public class MainActivity extends Activity {
        }
     }
     
+//    hokuyo_view.setOnTouchListener(new View.OnTouchListener() {
+    private class HokuyoGestures extends GestureDetector.SimpleOnGestureListener {
+
+               @Override
+               public boolean onSingleTapConfirmed(MotionEvent event) {
+                       // urceni orientace HokuyoView a poctu pixelu, ktere zabira hokuyo
+                       double norm = (double)hokuyo_view.getWidth()/(2*HokuyoView.COSINUS);
+                       boolean isVertical = true;
+                       if (norm > hokuyo_view.getHeight()) {
+                               norm = HokuyoView.COSINUS*hokuyo_view.getHeight()*2;
+                               norm = (hokuyo_view.getWidth() - norm)/2;
+                               isVertical = false;
+                       }
+                       else
+                               norm = hokuyo_view.getHeight() - norm;
+                       
+                       // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
+                       double normSpeed = ((double)(isVertical ? hokuyo_view.getWidth() : hokuyo_view.getHeight())) * 0.375;
+                       
+                       if (event.getYPrecision()*event.getY() < normSpeed &&
+                                       event.getXPrecision()*event.getX() < normSpeed) {
+                               if(!hokuyo_view.isRunningMotion()) {
+                                       mWakeLock.acquire();
+                                       mWifiLock.acquire();
+                                       if (motion_speed_subs == null)
+                                               motion_speed_subs = new MotionSpeedSubscribe(appDomain, hokuyo_view);
+                                       motion_speed_subs.start();
+                                       hokuyo_view.runMotion(true);
+                                       hokuyo_view.invalidate();
+                               }
+                               else {
+                                       hokuyo_view.runMotion(false);
+                                       motion_speed_subs.cancel();
+                                       hokuyo_view.invalidate();
+                                       mWakeLock.release();
+                                       mWifiLock.release();
+                               }
+                               return true;
+                       }
+                       
+                       if ((isVertical && event.getYPrecision()*event.getY() > norm) ||
+                                       (!isVertical && event.getXPrecision()*event.getX() > norm &&
+                                                       event.getXPrecision()*event.getX() < hokuyo_view.getWidth() - norm)) {
+                               if (!hokuyo_view.isRunning()) {
+                                       mWakeLock.acquire();
+                                       mWifiLock.acquire();
+                                       hokuyo_view.setData(new int[681]);
+                                       if (hokuyo_scan == null)
+                                               hokuyo_scan = new HokuyoScanSubscribe(appDomain, hokuyo_view);
+                                       hokuyo_scan.start();
+                                       hokuyo_view.run(true);
+                                       hokuyo_view.invalidate();
+                               }
+                               else {
+                                       hokuyo_view.run(false);
+                                       hokuyo_scan.cancel();
+                                       hokuyo_view.invalidate();
+                                       mWakeLock.release();
+                                       mWifiLock.release();
+                               }
+                               return true;
+                       }
+                       
+                       return false;
+               }
+
+               @Override
+               public boolean onDown(MotionEvent e) {
+                       return true;
+               }
+
+               @Override
+               public void onLongPress(MotionEvent event) {
+                       // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
+                       double normSpeed = ((double)(hokuyo_view.getHeight() < hokuyo_view.getWidth() ? hokuyo_view.getHeight() : hokuyo_view.getWidth())) * 0.375;
+                       
+                       if (event.getYPrecision()*event.getY() < normSpeed &&
+                                       event.getXPrecision()*event.getX() < normSpeed) {
+                               if (motion_speed_publ == null || motion_speed_publ.isCancelled()) {
+                                       mDimLock.acquire();
+                                       mWifiLock.acquire();
+                                       accel = new HandleAccelerometer();
+                                       mSensorManager.registerListener(accel, mGravity, SensorManager.SENSOR_DELAY_GAME);
+                                       if (motion_speed_publ == null)
+                                               motion_speed_publ = new MotionSpeedPublish(appDomain);
+                                       motion_speed_publ.start();
+                                       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+                               }
+                               else {
+                                       mSensorManager.unregisterListener(accel);
+                                       motion_speed_publ.cancel();
+                                       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
+                                       mDimLock.release();
+                                       mWifiLock.release();
+                               }
+                       }
+               }
+    }
+    
     private class NetworkInfo extends AsyncTask<Void, String, Void> {
        @Override
        protected Void doInBackground(Void... arg0) {
-               while (managersDialog.isShowing()) {
+               while (!isCancelled()) {
                        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
                        int ip = wifiInfo.getIpAddress();
                        String ipAddress = Formatter.formatIpAddress(ip);