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