From: Martin Vajnar Date: Wed, 22 Jan 2014 23:19:14 +0000 (+0100) Subject: RoboDruid: toggle Hokuyo output and speed control/monitor by touch input X-Git-Url: https://rtime.felk.cvut.cz/gitweb/orte.git/commitdiff_plain/37b9d79480bd83a8c65bce03129d1f2d33e1cb3c?ds=sidebyside RoboDruid: toggle Hokuyo output and speed control/monitor by touch input Single tap on Hokuyo output starts/stops subscriber. Single tap on speed vector starts/stops subscriber, long tap starts/stops publisher. --- diff --git a/orte/contrib/Robot_Demo/res/menu/activity_main.xml b/orte/contrib/Robot_Demo/res/menu/activity_main.xml index db290e5..b8e4b91 100644 --- a/orte/contrib/Robot_Demo/res/menu/activity_main.xml +++ b/orte/contrib/Robot_Demo/res/menu/activity_main.xml @@ -1,59 +1,39 @@ - - - - - - - - diff --git a/orte/contrib/Robot_Demo/src/org/ocera/orte/demo/HokuyoView.java b/orte/contrib/Robot_Demo/src/org/ocera/orte/demo/HokuyoView.java index b786adb..9ad8a14 100644 --- a/orte/contrib/Robot_Demo/src/org/ocera/orte/demo/HokuyoView.java +++ b/orte/contrib/Robot_Demo/src/org/ocera/orte/demo/HokuyoView.java @@ -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 { diff --git a/orte/contrib/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java b/orte/contrib/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java index a4405f8..512f58d 100644 --- a/orte/contrib/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java +++ b/orte/contrib/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java @@ -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 { @Override protected Void doInBackground(Void... arg0) {