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