]> rtime.felk.cvut.cz Git - orte.git/blob - orte/contrib/Robot_Demo/src/org/ocera/orte/demo/GUI/MainActivity.java
ROBOT_DEMO: reduce WifiLocks usage
[orte.git] / orte / contrib / Robot_Demo / src / org / ocera / orte / demo / GUI / MainActivity.java
1 package org.ocera.orte.demo.GUI;
2
3 import org.ocera.orte.DomainApp;
4 import org.ocera.orte.Manager;
5 //import org.ocera.orte.demo.R;
6 import org.ocera.orte.demo.Publishers.CraneCmdPublish;
7 import org.ocera.orte.demo.Publishers.MagnetCmdPublish;
8 import org.ocera.orte.demo.Publishers.MotionSpeedPublish;
9 import org.ocera.orte.demo.Subscribers.HokuyoScanSubscribe;
10 import org.ocera.orte.demo.Subscribers.MotionSpeedSubscribe;
11 import org.ocera.orte.demo.Subscribers.PwrVoltageSubscribe;
12
13 import android.app.Activity;
14 import android.app.AlertDialog;
15 import android.content.Context;
16 import android.content.DialogInterface;
17 import android.content.DialogInterface.OnDismissListener;
18 import android.content.SharedPreferences;
19 import android.content.pm.ActivityInfo;
20 import android.hardware.Sensor;
21 import android.hardware.SensorEvent;
22 import android.hardware.SensorEventListener;
23 import android.hardware.SensorManager;
24 import android.net.wifi.WifiInfo;
25 import android.net.wifi.WifiManager;
26 import android.net.wifi.WifiManager.WifiLock;
27 import android.os.AsyncTask;
28 import android.os.Bundle;
29 import android.os.Handler;
30 import android.os.Message;
31 import android.os.PowerManager;
32 import android.os.PowerManager.WakeLock;
33 import android.text.format.Formatter;
34 import android.view.GestureDetector;
35 import android.view.LayoutInflater;
36 import android.view.Menu;
37 import android.view.MenuItem;
38 import android.view.MotionEvent;
39 import android.view.View;
40 import android.widget.EditText;
41 import android.widget.TextView;
42 import android.widget.Toast;
43  
44 public class MainActivity extends Activity {
45         private AlertDialog voltageDialog = null;
46         private AlertDialog aboutDialog = null;
47         private AlertDialog managersDialog = null;
48         private EditText managersField = null;
49         private TextView ownIP = null;
50         private NetworkInfo wifiInfoTask = null; 
51         static EditText voltage33 = null;
52         static EditText voltage50 = null;
53         static EditText voltage80 = null;
54         static EditText voltageBAT = null;
55         static Handler dialogHandler = new Handler() {
56                 @Override
57                 public void handleMessage(Message msg) {
58                         double[] values = msg.getData().getDoubleArray("voltages");
59                         if (values != null) {
60                                 if (voltage33 != null) {
61                                         voltage33.setText(Double.toString(values[0]));
62                                 }
63                                 if (voltage50 != null) {
64                                         voltage50.setText(Double.toString(values[1]));
65                                 }
66                                 if (voltage80 != null) {
67                                         voltage80.setText(Double.toString(values[2]));
68                                 }
69                                 if (voltageBAT != null) {
70                                         voltageBAT.setText(Double.toString(values[3]));
71                                 }
72                         }
73                 }
74     };
75         
76         private Manager manager = null;
77     private String mgrs = null;
78         private MotionSpeedPublish motion_speed_publ = null;
79         private MotionSpeedSubscribe motion_speed_subs = null;
80         private HokuyoScanSubscribe hokuyo_scan = null;
81         private PwrVoltageSubscribe pwr_voltage = null;
82         private MagnetCmdPublish magnet_cmd = null;
83         private CraneCmdPublish crane_cmd = null;
84     private SensorManager mSensorManager = null;
85     private Sensor mGravity = null;
86     private SensorEventListener accel = null;
87     private PowerManager mPowerManager = null;
88     private WifiManager mWifiManager = null;
89     private WakeLock mWakeLock = null;
90     private WakeLock mDimLock = null;
91     private WifiLock mWifiLock = null;
92     private DomainApp appDomain = null;
93     private HokuyoView hokuyo_view = null;
94     private SharedPreferences prefs = null;
95     private GestureDetector gDetector = null;
96
97     static {
98         System.loadLibrary("jorte");     
99     }
100
101     @Override
102     protected void onPause() {
103         super.onPause();
104         
105         if (motion_speed_publ != null && !motion_speed_publ.isCancelled()) {
106                 motion_speed_publ.cancel();
107             mSensorManager.unregisterListener(accel);
108             this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
109             mDimLock.release();
110             mWifiLock.release();
111         }
112         
113         if (motion_speed_subs != null && !motion_speed_subs.isCancelled()) {
114                 hokuyo_view.runMotion(false);
115                 motion_speed_subs.cancel();
116                 hokuyo_view.invalidate();
117             mWakeLock.release();
118             //mWifiLock.release();
119         }
120
121         if (hokuyo_scan != null && !hokuyo_scan.isCancelled()) {
122                         hokuyo_view.run(false);
123                         hokuyo_scan.cancel();
124                         hokuyo_view.invalidate();
125                 mWakeLock.release();
126                 //mWifiLock.release();
127         }
128     }
129     
130     @Override
131     protected void onDestroy() {
132         super.onDestroy();
133
134         if (pwr_voltage != null && !pwr_voltage.isCancelled()) {
135                 if (voltageDialog.isShowing())
136                         voltageDialog.dismiss();
137         }
138         
139         if (crane_cmd != null && !crane_cmd.isCancelled()) {
140                 crane_cmd.cancel();
141         }
142         
143         if (magnet_cmd != null && !crane_cmd.isCancelled()) {
144                 magnet_cmd.cancel();
145         }
146         
147         if (appDomain != null) {
148                 appDomain.destroy();
149                 appDomain = null;
150         }
151         
152         if (manager != null) {
153                 manager.destroy();
154                 manager = null;
155         }
156     }
157         
158         @Override
159     public void onCreate(Bundle savedInstanceState) {
160         super.onCreate(savedInstanceState);
161         setContentView(R.layout.hokuyo_view);
162         
163         mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
164         mWakeLock = mPowerManager.newWakeLock(
165                         PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
166                         getClass().getName() + " Bright");
167         mDimLock = mPowerManager.newWakeLock(
168                         PowerManager.SCREEN_DIM_WAKE_LOCK,
169                         getClass().getName() + " Dim");
170
171         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
172         mWifiLock = mWifiManager.createWifiLock(
173                         android.os.Build.VERSION.SDK_INT >= 12
174                         ? WifiManager.WIFI_MODE_FULL_HIGH_PERF
175                         : WifiManager.WIFI_MODE_FULL, getClass().getName());
176         
177         prefs = getSharedPreferences("prefs", 0);
178         mgrs = prefs.getString("managers", "10.1.1.1");
179         
180                 AlertDialog.Builder voltageBuilder = new AlertDialog.Builder(this);
181                 LayoutInflater inflater = getLayoutInflater();
182                 View voltageView = inflater.inflate(R.layout.status_dialog, null);
183                 voltageBuilder.setView(voltageView);
184                 voltageBuilder.setPositiveButton("OK",null);
185                 voltageBuilder.setTitle("Voltages");
186                 voltageDialog = voltageBuilder.create();
187                 voltageDialog.setOnDismissListener(new OnDismissListener(){
188                         @Override
189                         public void onDismiss(DialogInterface arg0) {
190                                 voltageDialog.dismiss();
191                                 pwr_voltage.cancel();
192                                 mDimLock.release();
193                         }
194                 });
195                 voltage33 = (EditText)voltageView.findViewById(R.id.editText1);
196                 voltage50 = (EditText)voltageView.findViewById(R.id.editText2);
197                 voltage80 = (EditText)voltageView.findViewById(R.id.editText3);
198                 voltageBAT = (EditText)voltageView.findViewById(R.id.editText4);
199                 
200                 AlertDialog.Builder builder = new AlertDialog.Builder(this);
201                 View aboutView = inflater.inflate(R.layout.about_dialog, null);
202                 builder.setView(aboutView);
203                 builder.setPositiveButton("OK", null);
204                 aboutDialog = builder.create();
205                 
206                 AlertDialog.Builder managersBuilder = new AlertDialog.Builder(this);
207                 View managersView = inflater.inflate(R.layout.managers_view, null);
208                 ownIP = (TextView)managersView.findViewById(R.id.ownIP);
209                 managersField = (EditText)managersView.findViewById(R.id.managers);
210                 managersField.setText(mgrs);
211                 
212                 managersBuilder.setView(managersView);
213                 managersBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
214                         @Override
215                         public void onClick(DialogInterface dialog, int which) {
216                                 SharedPreferences.Editor editor = prefs.edit();
217                                 mgrs = managersField.getText().toString();
218                                 editor.putString("managers", mgrs);
219                                 editor.commit();
220                                 
221                                 if (manager != null)
222                                         manager.destroy();
223                                 manager = new Manager(mgrs);
224                                 
225                                 managersDialog.dismiss();
226                         }
227                 });
228                 managersBuilder.setNeutralButton("Cancel", null);
229                 managersBuilder.setTitle("Set fellow managers");
230                 managersDialog = managersBuilder.create();
231                 managersDialog.setOnDismissListener(new OnDismissListener() {
232                         @Override
233                         public void onDismiss(DialogInterface arg0) {
234                                 managersField.setText(mgrs);
235                                 wifiInfoTask.cancel(false);
236                         }
237                 });
238                 
239         mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
240         mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
241         
242         hokuyo_view = (HokuyoView) findViewById(R.id.hokuyo_view);
243         gDetector = new GestureDetector(hokuyo_view.getContext(), new HokuyoGestures());
244         hokuyo_view.setOnTouchListener(new View.OnTouchListener() {
245                         @Override
246                         public boolean onTouch(View v, MotionEvent event) {
247                                 return gDetector.onTouchEvent(event);
248                         }
249                 
250         });
251
252         manager = new Manager(mgrs);
253
254         appDomain = new DomainApp();
255         magnet_cmd = new MagnetCmdPublish(appDomain);
256         magnet_cmd.start();
257         crane_cmd = new CraneCmdPublish(appDomain);
258         crane_cmd.start();
259     }
260     
261         @Override
262         public boolean onCreateOptionsMenu(Menu menu) {
263                 getMenuInflater().inflate(R.menu.activity_main, menu);
264
265                 return true;
266         }
267         
268         @Override
269         public boolean onOptionsItemSelected (MenuItem item) {
270                 if (item.getTitle().equals("Crane: up")) {
271                         crane_cmd.send(0x190);
272                         item.setTitle("Crane: down");
273                 }
274                 else if (item.getTitle().equals("Crane: down")) {
275                         crane_cmd.send(0x100);
276                         item.setTitle("Crane: up");
277                 }
278                 else if (item.getTitle().equals("Magnet")) {
279                         if (!item.isChecked()) {
280                                 magnet_cmd.send(1);
281                                 item.setChecked(true);
282                         }
283                         else {
284                                 magnet_cmd.send(0);
285                                 item.setChecked(false); 
286                         }
287                 }
288                 else if (item.getTitle().equals("Voltage monitor")) {
289                         mDimLock.acquire();
290                         if (pwr_voltage == null)
291                                 pwr_voltage = new PwrVoltageSubscribe(appDomain, dialogHandler);
292                         pwr_voltage.start();
293                         voltageDialog.show();
294                 }
295                 else if (item.getTitle().equals("Fellow managers")) {
296                         wifiInfoTask = new NetworkInfo();
297
298                         managersDialog.show();
299                         wifiInfoTask.execute();
300                 }
301                 else if (item.getTitle().equals("About")) {
302                         aboutDialog.show();
303                 }
304                 else if (item.getTitle().equals("Exit")) {
305                         finish();
306                 }
307                 
308                 return true;
309         }
310         
311     private class HandleAccelerometer implements SensorEventListener {
312
313         @Override
314         public void onAccuracyChanged(Sensor sensor, int accuracy) {}
315
316         @Override
317         public void onSensorChanged(SensorEvent event) {
318                  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
319                          if (motion_speed_publ != null)
320                                  motion_speed_publ.setSpeed(event.values[0], event.values[1]);
321                  }
322         }
323     }
324     
325 //    hokuyo_view.setOnTouchListener(new View.OnTouchListener() {
326     private class HokuyoGestures extends GestureDetector.SimpleOnGestureListener {
327
328                 @Override
329                 public boolean onSingleTapConfirmed(MotionEvent event) {
330                         // urceni orientace HokuyoView a poctu pixelu, ktere zabira hokuyo
331                         double norm = (double)hokuyo_view.getWidth()/(2*HokuyoView.COSINUS);
332                         boolean isVertical = true;
333                         if (norm > hokuyo_view.getHeight()) {
334                                 norm = HokuyoView.COSINUS*hokuyo_view.getHeight()*2;
335                                 norm = (hokuyo_view.getWidth() - norm)/2;
336                                 isVertical = false;
337                         }
338                         else
339                                 norm = hokuyo_view.getHeight() - norm;
340                         
341                         // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
342                         double normSpeed = ((double)(isVertical ? hokuyo_view.getWidth() : hokuyo_view.getHeight())) * 0.375;
343                         
344                         if (event.getYPrecision()*event.getY() < normSpeed &&
345                                         event.getXPrecision()*event.getX() < normSpeed) {
346                                 if(!hokuyo_view.isRunningMotion()) {
347                                         mWakeLock.acquire();
348                                         //mWifiLock.acquire();
349                                         if (motion_speed_subs == null)
350                                                 motion_speed_subs = new MotionSpeedSubscribe(appDomain, hokuyo_view);
351                                         motion_speed_subs.start();
352                                         hokuyo_view.runMotion(true);
353                                         hokuyo_view.invalidate();
354                                         Toast.makeText(getApplicationContext(), "Speed Monitor: ON", Toast.LENGTH_SHORT).show();
355                                 }
356                                 else {
357                                         hokuyo_view.runMotion(false);
358                                         motion_speed_subs.cancel();
359                                         hokuyo_view.invalidate();
360                                         mWakeLock.release();
361                                         //mWifiLock.release();
362                                         Toast.makeText(getApplicationContext(), "Speed Monitor: OFF", Toast.LENGTH_SHORT).show();
363                                 }
364                                 return true;
365                         }
366                         
367                         if ((isVertical && event.getYPrecision()*event.getY() > norm) ||
368                                         (!isVertical && event.getXPrecision()*event.getX() > norm &&
369                                                         event.getXPrecision()*event.getX() < hokuyo_view.getWidth() - norm)) {
370                                 if (!hokuyo_view.isRunning()) {
371                                         mWakeLock.acquire();
372                                         //mWifiLock.acquire();
373                                         hokuyo_view.setData(new int[681]);
374                                         if (hokuyo_scan == null)
375                                                 hokuyo_scan = new HokuyoScanSubscribe(appDomain, hokuyo_view);
376                                         hokuyo_scan.start();
377                                         hokuyo_view.run(true);
378                                         hokuyo_view.invalidate();
379                                         Toast.makeText(getApplicationContext(), "Hokuyo LRF: ON", Toast.LENGTH_SHORT).show();
380                                 }
381                                 else {
382                                         hokuyo_view.run(false);
383                                         hokuyo_scan.cancel();
384                                         hokuyo_view.invalidate();
385                                         mWakeLock.release();
386                                         //mWifiLock.release();
387                                         Toast.makeText(getApplicationContext(), "Hokuyo LRF: OFF", Toast.LENGTH_SHORT).show();
388                                 }
389                                 return true;
390                         }
391                         
392                         return false;
393                 }
394
395                 @Override
396                 public boolean onDown(MotionEvent e) {
397                         return true;
398                 }
399
400                 @Override
401                 public void onLongPress(MotionEvent event) {
402                         // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
403                         double normSpeed = ((double)(hokuyo_view.getHeight() < hokuyo_view.getWidth() ? hokuyo_view.getHeight() : hokuyo_view.getWidth())) * 0.375;
404                         
405                         if (event.getYPrecision()*event.getY() < normSpeed &&
406                                         event.getXPrecision()*event.getX() < normSpeed) {
407                                 if (motion_speed_publ == null || motion_speed_publ.isCancelled()) {
408                                         mDimLock.acquire();
409                                         mWifiLock.acquire();
410                                         accel = new HandleAccelerometer();
411                                         mSensorManager.registerListener(accel, mGravity, SensorManager.SENSOR_DELAY_GAME);
412                                         if (motion_speed_publ == null)
413                                                 motion_speed_publ = new MotionSpeedPublish(appDomain);
414                                         motion_speed_publ.start();
415                                         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
416                                         Toast.makeText(getApplicationContext(), "Motion Control: ON", Toast.LENGTH_SHORT).show();
417                                 }
418                                 else {
419                                         mSensorManager.unregisterListener(accel);
420                                         motion_speed_publ.cancel();
421                                         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
422                                         mDimLock.release();
423                                         mWifiLock.release();
424                                         Toast.makeText(getApplicationContext(), "Motion Control: OFF", Toast.LENGTH_SHORT).show();
425                                 }
426                         }
427                 }
428     }
429     
430     private class NetworkInfo extends AsyncTask<Void, String, Void> {
431         @Override
432         protected Void doInBackground(Void... arg0) {
433                 while (!isCancelled()) {
434                         WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
435                         int ip = wifiInfo.getIpAddress();
436                         String ipAddress = Formatter.formatIpAddress(ip);
437                         String ssid = wifiInfo.getSSID();
438         
439                         publishProgress("\nOwn IP Address: " + ipAddress + "\nNetwork SSID: " + ssid);
440                         
441                         try {
442                                         Thread.sleep(1000);
443                                 } catch (InterruptedException e) {
444                                         e.printStackTrace();
445                                 }
446                 }
447                 
448                 return null;
449         }
450
451         @Override
452         protected void onProgressUpdate(String... values) {
453                 super.onProgressUpdate(values);
454                 
455                 ownIP.setText(values[0]);
456         }
457     }
458 }