]> rtime.felk.cvut.cz Git - orte.git/commitdiff
RoboDruid: toggle Hokuyo output and speed control/monitor by touch input
authorMartin Vajnar <martin@martin-HP-ProBook-4330s.(none)>
Wed, 22 Jan 2014 23:19:14 +0000 (00:19 +0100)
committerPavel Pisa <pisa@cmp.felk.cvut.cz>
Fri, 19 Sep 2014 20:21:37 +0000 (22:21 +0200)
Single tap on Hokuyo output starts/stops subscriber.
Single tap on speed vector starts/stops subscriber,
long tap starts/stops publisher.

orte/contrib/Robot_Demo/res/menu/activity_main.xml
orte/contrib/Robot_Demo/src/org/ocera/orte/demo/HokuyoView.java
orte/contrib/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java

index db290e5b3a11591cdd086bae2d736f78f5a9a952..b8e4b9105c505e510bd39689165ee11dcde19ef4 100644 (file)
@@ -1,59 +1,39 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
-    <item android:id="@+id/speed"
-        android:title="Motion control"
-        android:showAsAction="never"
-        android:checkable="true"
-        android:orderInCategory="1">
-    </item>
-
-    <item android:id="@+id/speed_mon"
-        android:title="Speed monitor"
-        android:showAsAction="never"
-        android:checkable="true"
-        android:orderInCategory="2">
-    </item>
-
-    <item android:id="@+id/hokuyo"
-        android:title="Hokuyo"
-        android:showAsAction="never"
-        android:checkable="true"
-        android:orderInCategory="3">
-    </item>
     
     <item android:id="@+id/crane"
         android:title="Crane: up"
-        android:orderInCategory="4"
+        android:orderInCategory="1"
         android:showAsAction="never">
     </item>
     
     <item android:id="@+id/magnet"
         android:title="Magnet"
-        android:orderInCategory="5"
+        android:orderInCategory="2"
         android:checkable="true"
         android:showAsAction="never">
     </item>
 
     <item android:id="@+id/voltage"
         android:title="Voltage monitor"
-        android:orderInCategory="6"
+        android:orderInCategory="3"
         android:showAsAction="never">
     </item>
     
     <item android:id="@+id/managers"
         android:title="Fellow managers"
-        android:orderInCategory="7"
+        android:orderInCategory="4"
         android:showAsAction="never">
     </item>
 
     <item android:id="@+id/about"
         android:title="About"
-        android:orderInCategory="8"
+        android:orderInCategory="5"
         android:showAsAction="never">
     </item>
 
     <item android:id="@+id/exit"
         android:title="Exit"
-        android:orderInCategory="8"
+        android:orderInCategory="6"
         android:showAsAction="never">
     </item>
 </menu>
index b786adb3cbff5dd2121bb285e86f56b8ce75fae7..9ad8a1417a90d212a4bc11904f6444d1bcc3c74e 100644 (file)
@@ -53,55 +53,50 @@ public class HokuyoView extends View {
        protected void onDraw(Canvas canvas) {
                rcLock.lock();
                try {
-                       if (isRunning) {
-                               lock.lock();
-                               try {
-                                       double norm = (double)getWidth()/(2*COSINUS);
-                                       if (norm > getHeight())
-                                               norm = getHeight();
-                                       paint.setStyle(Style.STROKE);
-                                       paint.setStrokeWidth(3);
-                                       paint.setColor(Color.BLACK);
-                                       canvas.drawLine((int)(getWidth()*0.95),
-                                                                       (int)(getHeight()*0.97),
-                                                                       (int)(getWidth()*0.95-norm/4),
-                                                                       (int)(getHeight()*0.97),
-                                                                       paint);
-                                       paint.setStrokeWidth(2);
-                                       canvas.drawText("1 m", (int)(getWidth()*0.95-norm/8), (int)(getHeight()*0.97-10), paint);
-                                       paint.setStrokeWidth(3);
-                                       paint.setStyle(Style.FILL);
-                                       paint.setColor(Color.argb(40, 62, 62, 171));
-                                       if (!hasBeenDrawn) {
-                                               path.reset();
-                                               path.moveTo(getWidth()/2, getHeight());
-                                               for(int i = HOKUYO_INDEX_LOWER+1; i <= HOKUYO_INDEX_UPPER; i++) {
-                                                       if (data[i] > 4000)
-                                                               data[i] = 4000;
-                                                       data[i] = (int)(((double)data[i]/4000)*norm);
-                                                       if (data[i] < 5)
-                                                               data[i] = 5;
-                                           int x = (int)(getWidth()/2) - (int)(data[i] * Math.sin(HOKUYO_INDEX_TO_RAD(i)));
-                                           int y = getHeight() - (int)(data[i] * Math.cos(HOKUYO_INDEX_TO_RAD(i)));
-                                                       path.lineTo(x, y);
-                                               }
-                                               path.close();
-                                               hasBeenDrawn = true;
+                       lock.lock();
+                       try {
+                               double norm = (double)getWidth()/(2*COSINUS);
+                               if (norm > getHeight())
+                                       norm = getHeight();
+                               paint.setStyle(Style.STROKE);
+                               paint.setStrokeWidth(3);
+                               paint.setColor(isRunning ? Color.BLACK : Color.GRAY);
+                               canvas.drawLine((int)(getWidth()*0.95),
+                                                               (int)(getHeight()*0.97),
+                                                               (int)(getWidth()*0.95-norm/4),
+                                                               (int)(getHeight()*0.97),
+                                                               paint);
+                               paint.setStrokeWidth(2);
+                               canvas.drawText("1 m", (int)(getWidth()*0.95-norm/8), (int)(getHeight()*0.97-10), paint);
+                               paint.setStrokeWidth(3);
+                               paint.setStyle(Style.FILL);
+                               paint.setColor(isRunning ? Color.argb(40, 62, 62, 171) : Color.LTGRAY);
+                               if (!hasBeenDrawn || !isRunning) {
+                                       path.reset();
+                                       path.moveTo(getWidth()/2, getHeight());
+                                       for(int i = HOKUYO_INDEX_LOWER+1; i <= HOKUYO_INDEX_UPPER; i++) {
+                                               if (data[i] > 4000)
+                                                       data[i] = 4000;
+                                               data[i] = (int)(((double)data[i]/4000)*norm);
+                                               if (data[i] < 5)
+                                                       data[i] = 5;
+                                   int x = (int)(getWidth()/2) - (int)((isRunning ? data[i] : norm) * Math.sin(HOKUYO_INDEX_TO_RAD(i)));
+                                   int y = getHeight() - (int)((isRunning ? data[i] : norm) * Math.cos(HOKUYO_INDEX_TO_RAD(i)));
+                                               path.lineTo(x, y);
                                        }
-                               }
-                               finally {
-                                       lock.unlock();
+                                       path.close();
+                                       hasBeenDrawn = true;
                                }
                        }
-                       else {
-                               path.reset();
+                       finally {
+                               lock.unlock();
                        }
                        canvas.drawPath(path, paint);
                        paint.setStyle(Style.STROKE);
-                       paint.setColor(Color.BLACK);
+                       paint.setColor(isRunning ? Color.BLACK : Color.GRAY);
                        canvas.drawPath(path, paint);
                        
-                       if (isMonitoring) {
+//                     if (isMonitoring) {
                                lockMotion.lock();
                                try {
                                        double norm;
@@ -111,7 +106,7 @@ public class HokuyoView extends View {
                                                 norm = getWidth()*0.125;
                                        paint.setStyle(Style.STROKE);
                                        paint.setStrokeWidth(1);
-                                       paint.setColor(Color.BLACK);
+                                       paint.setColor(isMonitoring ? Color.BLACK : Color.LTGRAY);
                                        canvas.drawLine((int)(10),
                                                                        (int)(10+norm*1.5),
                                                                        (int)(10+norm*3),
@@ -123,7 +118,7 @@ public class HokuyoView extends View {
                                                                        (int)(10+norm*3),
                                                                        paint);
                                        paint.setStrokeWidth(4);
-                                       paint.setColor(Color.BLUE);
+                                       paint.setColor(isMonitoring ? Color.BLUE : Color.GRAY);
                                        canvas.drawLine((int)(10+norm*1.5),
                                                                        (int)(10+norm*1.5),
                                                                        (int)(speedCo[0]*norm+10+norm*1.5),
@@ -132,7 +127,7 @@ public class HokuyoView extends View {
                                } finally {
                                        lockMotion.unlock();
                                }
-                       }
+//                     }
                } finally {
                        rcLock.unlock();
                }
@@ -170,6 +165,32 @@ public class HokuyoView extends View {
                }
        }
        
+       public boolean isRunning() {
+               Boolean retVal = false;
+               
+               rcLock.lock();
+               try {
+                       retVal = isRunning;
+               } finally {
+                       rcLock.unlock();
+               }
+               
+               return retVal;
+       }
+       
+       public boolean isRunningMotion() {
+               Boolean retVal = false;
+               
+               rcLock.lock();
+               try {
+                       retVal = isMonitoring;
+               } finally {
+                       rcLock.unlock();
+               }
+               
+               return retVal;
+       }
+       
        public void setData(int[] data) {
                if (lock.tryLock()) {
                        try {
index a4405f84c4a875b59435185853f48987335e2731..512f58d6ee281bad07397a72f7243ee46a71b65b 100644 (file)
@@ -24,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;
@@ -81,10 +83,8 @@ public class MainActivity extends Activity {
     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");     
@@ -98,7 +98,6 @@ public class MainActivity extends Activity {
                motion_speed_publ.cancel();
             mSensorManager.unregisterListener(accel);
             this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
-               speed_publ_item.setChecked(false);
             mDimLock.release();
             mWifiLock.release();
         }
@@ -107,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();
         }
@@ -116,7 +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();
         }
@@ -235,7 +232,15 @@ public class MainActivity extends Activity {
         mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
         
         hokuyo_view = (HokuyoView) findViewById(R.id.hokuyo_view);
-        
+        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();
@@ -254,71 +259,7 @@ public class MainActivity extends Activity {
        
        @Override
        public boolean onOptionsItemSelected (MenuItem item) {
-               if(item.getTitle().equals("Motion control")) {
-                       if (!item.isChecked()) {
-                               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();
-                               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);
-                               mDimLock.release();
-                               mWifiLock.release();
-                       }
-               }
-               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("Hokuyo")) {
-                       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;
-                               item.setChecked(true);
-                       }
-                       else {
-                               hokuyo_view.run(false);
-                               hokuyo_scan.cancel();
-                               hokuyo_view.invalidate();
-                               item.setChecked(false);
-                               mWakeLock.release();
-                               mWifiLock.release();
-                       }
-               }
-               else if (item.getTitle().equals("Crane: up")) {
+               if (item.getTitle().equals("Crane: up")) {
                        crane_cmd.send(0x190);
                        item.setTitle("Crane: down");
                }
@@ -373,6 +314,102 @@ 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();
+                               }
+                       }
+                       
+                       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;
+               }
+
+               @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) {