1 package org.ocera.orte.demo;
3 import java.io.BufferedInputStream;
4 import java.io.BufferedOutputStream;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
9 import org.ocera.orte.DomainApp;
10 import org.ocera.orte.JOrte;
11 import org.ocera.orte.Publication;
12 import org.ocera.orte.R;
13 import org.ocera.orte.types.DomainProp;
14 import org.ocera.orte.types.NtpTime;
15 import org.ocera.orte.types.ORTEConstant;
16 import org.ocera.orte.types.PublProp;
18 import android.app.Activity;
19 import android.content.Context;
20 import android.hardware.Sensor;
21 import android.hardware.SensorEvent;
22 import android.hardware.SensorEventListener;
23 import android.hardware.SensorManager;
24 import android.os.AsyncTask;
25 import android.os.Bundle;
26 import android.os.PowerManager;
27 import android.os.PowerManager.WakeLock;
28 import android.view.View;
29 import android.widget.Button;
30 import android.widget.TextView;
32 public class MainActivity extends Activity {
36 Button start_pub = null;
37 Button stop_pub = null;
38 TextView textview = null;
39 Process manager = null;
40 Thread publisher = null;
41 boolean tContinue = true;
43 private SensorManager mSensorManager;
44 private PowerManager mPowerManager;
45 private WakeLock mWakeLock;
46 private Sensor mGravity;
48 private AsyncTask<Void, Short, Void> accel;
53 private Object lock = new Object();
57 System.loadLibrary("jorte");
60 private class HandleAccelerometer extends AsyncTask<Void, Short, Void> implements SensorEventListener {
62 public static final int VMAX = 16000;
63 //private int count = 0;
66 protected Void doInBackground(Void... params) {
71 public void onAccuracyChanged(Sensor sensor, int accuracy) {
75 public void onSensorChanged(SensorEvent event) {
76 if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
80 calculateSpeed(event.values[0],event.values[1]);
87 private void calculateSpeed(float mAccelX, float mAccelY) {
92 double angle = 0, lenght, v, omega;
94 v = (double)mAccelY/mGravity.getMaximumRange();
95 omega = (double)mAccelX/mGravity.getMaximumRange();
96 lenght = Math.sqrt(Math.pow(v,2) + Math.pow(omega,2));
97 /* if lenght si more than 1 is used unit circle */
99 /* computing new speed and omega */
100 angle = Math.atan2(mAccelY, mAccelX);
102 omega = Math.cos(angle);
106 right = (short)(-((v + r*omega))*VMAX);
107 left = (short)(-(v - r*omega)*VMAX);
109 publishProgress(right, left);
113 protected void onProgressUpdate(Short... input) {
117 textview.setText("Values: left = " + input[1] + ", right = " + input[0]);
122 public void copyManager() {
123 BufferedInputStream bis = null;
124 BufferedOutputStream bos = null;
126 String path = getFilesDir().getAbsolutePath() + "/ortemanager";
128 if (!new File(path).exists()) {
130 bis = new BufferedInputStream(getAssets().open("ortemanager"));
131 bos = new BufferedOutputStream(new FileOutputStream(path));
134 byte[] buffer = new byte[4096];
136 while((delka = bis.read(buffer, 0, 4096)) > 0) {
137 bos.write(buffer, 0, delka);
144 Runtime.getRuntime().exec("chmod 744 " + path);
145 } catch (IOException e) {
152 protected void onResume() {
155 accel = new HandleAccelerometer().execute();
156 mSensorManager.registerListener((SensorEventListener)accel, mGravity, SensorManager.SENSOR_DELAY_UI);
162 protected void onPause() {
165 mSensorManager.unregisterListener((SensorEventListener)accel);
173 public void onCreate(Bundle savedInstanceState) {
174 super.onCreate(savedInstanceState);
175 setContentView(R.layout.activity_main);
177 textview = (TextView)findViewById(R.id.textView1);
179 start = (Button)findViewById(R.id.button1);
180 stop = (Button)findViewById(R.id.button2);
181 stop.setEnabled(false);
182 start_pub = (Button)findViewById(R.id.button3);
183 start_pub.setEnabled(false);
184 stop_pub = (Button)findViewById(R.id.button4);
185 stop_pub.setEnabled(false);
187 // Get an instance of the SensorManager
188 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
190 // Get an instance of the PowerManager
191 mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
193 // Create a bright wake lock
194 mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName());
196 mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
200 start.setOnClickListener(new View.OnClickListener() {
201 String[] orte = {getFilesDir().getAbsolutePath() + "/ortemanager","-p 192.168.1.5:192.168.1.8"};
204 public void onClick(View v) {
205 start.setEnabled(false);
206 stop.setEnabled(true);
208 manager = Runtime.getRuntime().exec(orte);
209 } catch (IOException e) {
212 start_pub.setEnabled(true);
216 stop.setOnClickListener(new View.OnClickListener() {
219 public void onClick(View v) {
220 start.setEnabled(true);
221 stop.setEnabled(false);
222 start_pub.setEnabled(false);
223 stop_pub.setEnabled(false);
228 start_pub.setOnClickListener(new View.OnClickListener() {
231 public void onClick(View v) {
232 start_pub.setEnabled(false);
233 stop_pub.setEnabled(true);
236 publisher = new Thread(new Runnable() {
240 NtpTime persistence = new NtpTime(3);
242 MyEvents events = new MyEvents();
244 DomainApp appDomain = new DomainApp(ORTEConstant.ORTE_DEFAULT_DOMAIN,
245 DomainProp.defaultPropsCreate(),
249 HelloMsg hellomsg = new HelloMsg(appDomain,"motion_speed");
251 PublProp publProp = new PublProp(hellomsg.getTopic(),
256 Publication pub = appDomain.createPublication(publProp,
262 hellomsg.left = mLeft;
263 hellomsg.right = mRight;
266 System.out.println("<< data to send: " + hellomsg);
268 System.out.println(" ");
281 stop_pub.setOnClickListener(new View.OnClickListener() {
284 public void onClick(View v) {
285 start_pub.setEnabled(true);
286 stop_pub.setEnabled(false);