1 package org.ocera.orte.demo.GUI;
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;
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;
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() {
57 public void handleMessage(Message msg) {
58 double[] values = msg.getData().getDoubleArray("voltages");
60 if (voltage33 != null) {
61 voltage33.setText(Double.toString(values[0]));
63 if (voltage50 != null) {
64 voltage50.setText(Double.toString(values[1]));
66 if (voltage80 != null) {
67 voltage80.setText(Double.toString(values[2]));
69 if (voltageBAT != null) {
70 voltageBAT.setText(Double.toString(values[3]));
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;
98 System.loadLibrary("jorte");
102 protected void onPause() {
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);
113 if (motion_speed_subs != null && !motion_speed_subs.isCancelled()) {
114 hokuyo_view.runMotion(false);
115 motion_speed_subs.cancel();
116 hokuyo_view.invalidate();
118 //mWifiLock.release();
121 if (hokuyo_scan != null && !hokuyo_scan.isCancelled()) {
122 hokuyo_view.run(false);
123 hokuyo_scan.cancel();
124 hokuyo_view.invalidate();
126 //mWifiLock.release();
131 protected void onDestroy() {
134 if (pwr_voltage != null && !pwr_voltage.isCancelled()) {
135 if (voltageDialog.isShowing())
136 voltageDialog.dismiss();
139 if (crane_cmd != null && !crane_cmd.isCancelled()) {
143 if (magnet_cmd != null && !crane_cmd.isCancelled()) {
147 if (appDomain != null) {
152 if (manager != null) {
159 public void onCreate(Bundle savedInstanceState) {
160 super.onCreate(savedInstanceState);
161 setContentView(R.layout.hokuyo_view);
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");
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());
177 prefs = getSharedPreferences("prefs", 0);
178 mgrs = prefs.getString("managers", "10.1.1.1");
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(){
189 public void onDismiss(DialogInterface arg0) {
190 voltageDialog.dismiss();
191 pwr_voltage.cancel();
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);
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();
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);
212 managersBuilder.setView(managersView);
213 managersBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
215 public void onClick(DialogInterface dialog, int which) {
216 SharedPreferences.Editor editor = prefs.edit();
217 mgrs = managersField.getText().toString();
218 editor.putString("managers", mgrs);
223 manager = new Manager(mgrs);
225 managersDialog.dismiss();
228 managersBuilder.setNeutralButton("Cancel", null);
229 managersBuilder.setTitle("Set fellow managers");
230 managersDialog = managersBuilder.create();
231 managersDialog.setOnDismissListener(new OnDismissListener() {
233 public void onDismiss(DialogInterface arg0) {
234 managersField.setText(mgrs);
235 wifiInfoTask.cancel(false);
239 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
240 mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
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() {
246 public boolean onTouch(View v, MotionEvent event) {
247 return gDetector.onTouchEvent(event);
252 manager = new Manager(mgrs);
254 appDomain = new DomainApp();
255 magnet_cmd = new MagnetCmdPublish(appDomain);
257 crane_cmd = new CraneCmdPublish(appDomain);
262 public boolean onCreateOptionsMenu(Menu menu) {
263 getMenuInflater().inflate(R.menu.activity_main, menu);
269 public boolean onOptionsItemSelected (MenuItem item) {
270 if (item.getTitle().equals("Crane: up")) {
271 crane_cmd.send(0x190);
272 item.setTitle("Crane: down");
274 else if (item.getTitle().equals("Crane: down")) {
275 crane_cmd.send(0x100);
276 item.setTitle("Crane: up");
278 else if (item.getTitle().equals("Magnet")) {
279 if (!item.isChecked()) {
281 item.setChecked(true);
285 item.setChecked(false);
288 else if (item.getTitle().equals("Voltage monitor")) {
290 if (pwr_voltage == null)
291 pwr_voltage = new PwrVoltageSubscribe(appDomain, dialogHandler);
293 voltageDialog.show();
295 else if (item.getTitle().equals("Fellow managers")) {
296 wifiInfoTask = new NetworkInfo();
298 managersDialog.show();
299 wifiInfoTask.execute();
301 else if (item.getTitle().equals("About")) {
304 else if (item.getTitle().equals("Exit")) {
311 private class HandleAccelerometer implements SensorEventListener {
314 public void onAccuracyChanged(Sensor sensor, int accuracy) {}
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]);
325 // hokuyo_view.setOnTouchListener(new View.OnTouchListener() {
326 private class HokuyoGestures extends GestureDetector.SimpleOnGestureListener {
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;
339 norm = hokuyo_view.getHeight() - norm;
341 // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
342 double normSpeed = ((double)(isVertical ? hokuyo_view.getWidth() : hokuyo_view.getHeight())) * 0.375;
344 if (event.getYPrecision()*event.getY() < normSpeed &&
345 event.getXPrecision()*event.getX() < normSpeed) {
346 if(!hokuyo_view.isRunningMotion()) {
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();
357 hokuyo_view.runMotion(false);
358 motion_speed_subs.cancel();
359 hokuyo_view.invalidate();
361 //mWifiLock.release();
362 Toast.makeText(getApplicationContext(), "Speed Monitor: OFF", Toast.LENGTH_SHORT).show();
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()) {
372 //mWifiLock.acquire();
373 hokuyo_view.setData(new int[681]);
374 if (hokuyo_scan == null)
375 hokuyo_scan = new HokuyoScanSubscribe(appDomain, hokuyo_view);
377 hokuyo_view.run(true);
378 hokuyo_view.invalidate();
379 Toast.makeText(getApplicationContext(), "Hokuyo LRF: ON", Toast.LENGTH_SHORT).show();
382 hokuyo_view.run(false);
383 hokuyo_scan.cancel();
384 hokuyo_view.invalidate();
386 //mWifiLock.release();
387 Toast.makeText(getApplicationContext(), "Hokuyo LRF: OFF", Toast.LENGTH_SHORT).show();
396 public boolean onDown(MotionEvent e) {
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;
405 if (event.getYPrecision()*event.getY() < normSpeed &&
406 event.getXPrecision()*event.getX() < normSpeed) {
407 if (motion_speed_publ == null || motion_speed_publ.isCancelled()) {
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();
419 mSensorManager.unregisterListener(accel);
420 motion_speed_publ.cancel();
421 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
424 Toast.makeText(getApplicationContext(), "Motion Control: OFF", Toast.LENGTH_SHORT).show();
430 private class NetworkInfo extends AsyncTask<Void, String, Void> {
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();
439 publishProgress("\nOwn IP Address: " + ipAddress + "\nNetwork SSID: " + ssid);
443 } catch (InterruptedException e) {
452 protected void onProgressUpdate(String... values) {
453 super.onProgressUpdate(values);
455 ownIP.setText(values[0]);