added DTW to app
[gsk.git] / GestureDetectionApp / GestureSensitiveControl / src / at / mus / GestureSensitiveControl / GestureActivity.java
blob68ef95056f7fb87ff7c9b9fd20569f346398af1f
1 package at.mus.GestureSensitiveControl;
3 import java.io.DataOutputStream;
4 import java.io.IOException;
5 import java.net.DatagramPacket;
6 import java.net.DatagramSocket;
7 import java.net.InetAddress;
8 import java.net.Socket;
9 import java.text.DecimalFormat;
10 import java.text.NumberFormat;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Locale;
15 import android.app.Activity;
16 import android.content.Intent;
17 import android.hardware.Sensor;
18 import android.hardware.SensorEvent;
19 import android.hardware.SensorEventListener;
20 import android.hardware.SensorManager;
21 import android.os.Bundle;
22 import android.view.View;
23 import android.view.View.OnClickListener;
24 import android.widget.Button;
25 import android.widget.EditText;
26 import android.widget.TextView;
27 import at.mus.recognition.Acceleration;
28 import at.mus.recognition.DTW;
29 import at.mus.recognition.ICoordinate;
30 import at.mus.recognition.IRecognizer;
31 import at.mus.recognition.Result;
32 import at.mus.recognition.Vector;
34 public class GestureActivity extends Activity implements SensorEventListener {
36 // ui elements
37 private Button btnFindServer;
38 private Button btnCloseApp;
39 private Button btnConnect;
40 private Button btnDevMessage1;
41 private Button btnDevMessage2;
42 private Button btnStartGesture;
43 private Button btnEndGesture;
44 private TextView lbInformation;
45 private TextView lbAcceleration;
46 private TextView lbOrientation;
47 private TextView lbGyroscope;
48 private EditText txtServerIp;
50 // communication
51 private Socket clientSocket;
52 private DataOutputStream outToServer;
53 private final int UDP_PORT = 45000;
54 private final int TCP_PORT = 35000;
56 // sensor
57 private SensorManager mSensorManager;
58 private Sensor mAccelerometer;
59 private Sensor mOrientation;
60 private Sensor mLinearAcceleration;
62 private ArrayList<Vector> acclerationValues = new ArrayList<Vector>();
63 private static final NumberFormat codePointFormat = DecimalFormat
64 .getInstance(Locale.ENGLISH);
66 private IRecognizer dtw = new DTW();
67 private ArrayList<ICoordinate> data = new ArrayList<ICoordinate>();
69 @Override
70 public void onCreate(Bundle savedInstanceState) {
71 super.onCreate(savedInstanceState);
72 setContentView(R.layout.main);
74 // get ui controls
75 lbInformation = (TextView) findViewById(R.id.lbInformation);
76 lbAcceleration = (TextView) findViewById(R.id.lbAcceleration);
77 lbOrientation = (TextView) findViewById(R.id.lbOrientation);
78 lbGyroscope = (TextView) findViewById(R.id.lbGyroscope);
79 txtServerIp = (EditText) findViewById(R.id.txtServerIp);
80 btnFindServer = (Button) findViewById(R.id.btnFindServer);
81 btnFindServer.setOnClickListener(new OnClickListener() {
82 public void onClick(View v) {
83 findServers();
85 });
86 btnCloseApp = (Button) findViewById(R.id.btnCloseApp);
87 btnCloseApp.setOnClickListener(new OnClickListener() {
88 public void onClick(View v) {
89 try {
90 if (outToServer != null)
91 outToServer.close();
92 if (clientSocket != null)
93 clientSocket.close();
94 } catch (IOException e) {
95 e.printStackTrace();
97 finish();
99 });
100 btnConnect = (Button) findViewById(R.id.btnConnect);
101 btnConnect.setOnClickListener(new OnClickListener() {
102 public void onClick(View v) {
103 connectToServer();
106 btnDevMessage1 = (Button) findViewById(R.id.btnSendDevMessag1);
107 btnDevMessage1.setOnClickListener(new OnClickListener() {
108 public void onClick(View v) {
109 try {
110 outToServer.writeBytes("ForwardGesture");
111 } catch (IOException e) {
112 e.printStackTrace();
116 btnDevMessage2 = (Button) findViewById(R.id.btnSendDevMessag2);
117 btnDevMessage2.setOnClickListener(new OnClickListener() {
118 public void onClick(View v) {
119 try {
120 outToServer.writeBytes("BackwardGesture");
121 } catch (IOException e) {
122 e.printStackTrace();
126 btnStartGesture = (Button) findViewById(R.id.btnStartGesture);
127 btnStartGesture.setOnClickListener(new OnClickListener() {
128 public void onClick(View v) {
129 startGesture();
133 btnEndGesture = (Button) findViewById(R.id.btnEndGesture);
134 btnEndGesture.setOnClickListener(new OnClickListener() {
135 public void onClick(View v) {
136 endGesture();
141 private void findServers() {
142 DatagramPacket pack;
143 byte[] buf = new byte[1000];
144 String message = "FindServer";
145 btnFindServer.setEnabled(false);
146 try {
147 InetAddress addr = InetAddress.getByName("255.255.255.255");
148 DatagramSocket dgsock = new DatagramSocket();
149 pack = new DatagramPacket(message.getBytes(), message.length(),
150 addr, UDP_PORT);
151 dgsock.send(pack); // send udp message
153 pack = new DatagramPacket(buf, buf.length);
154 dgsock.receive(pack);
155 String recString = new String(pack.getData(), 0, pack.getLength());
156 txtServerIp.setText(recString);
157 } catch (Exception e) {
158 e.printStackTrace();
160 btnFindServer.setEnabled(true);
163 private void connectToServer() {
164 lbInformation.setText("Trying to connect to Server ...");
166 Thread t = new Thread() {
167 public void run() {
168 try {
169 String ip = txtServerIp.getText().toString();
170 clientSocket = new Socket(ip, TCP_PORT);
171 outToServer = new DataOutputStream(clientSocket
172 .getOutputStream());
174 outToServer.writeBytes("Hello Server");
175 Thread.sleep(1000);
177 } catch (IOException e) {
178 e.printStackTrace();
179 } catch (InterruptedException e) {
180 e.printStackTrace();
184 t.start();
186 lbInformation.setText("Connected to Server, make gesture !");
187 btnDevMessage1.setEnabled(true);
188 btnDevMessage2.setEnabled(true);
189 btnStartGesture.setEnabled(true);
190 btnEndGesture.setEnabled(true);
193 protected void onResume() {
194 super.onResume();
195 if (mSensorManager != null) { // maybe delete this one
196 mSensorManager.registerListener(this, mAccelerometer,
197 SensorManager.SENSOR_DELAY_NORMAL);
198 mSensorManager.registerListener(this, mLinearAcceleration,
199 SensorManager.SENSOR_DELAY_NORMAL);
200 mSensorManager.registerListener(this, mOrientation,
201 SensorManager.SENSOR_DELAY_NORMAL);
205 protected void onPause() {
206 super.onPause();
207 if (mSensorManager != null) {
208 mSensorManager.unregisterListener(this);
212 private void startGesture() {
213 // create sensor manager and accelerometer
214 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
215 mAccelerometer = mSensorManager
216 .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
217 mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
218 mLinearAcceleration = mSensorManager
219 .getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
221 // clear list
222 data.clear();
223 acclerationValues.clear();
225 // register listener
226 mSensorManager.registerListener(this, mAccelerometer,
227 SensorManager.SENSOR_DELAY_FASTEST);
228 mSensorManager.registerListener(this, mLinearAcceleration,
229 SensorManager.SENSOR_DELAY_FASTEST);
230 mSensorManager.registerListener(this, mOrientation,
231 SensorManager.SENSOR_DELAY_NORMAL);
234 private void endGesture() {
235 // deregister listener
236 mSensorManager.unregisterListener(this);
238 Result r = dtw.recognize(data, Templates.templates, 0, 0, null);
239 lbGyroscope.setText(r.getTemplate().name);
241 // this.createVectorListCode(acclerationValues);
244 // will be called if accuracy changes
245 public void onAccuracyChanged(Sensor sensor, int accuracy) {
248 // will be called if a sensor changes its value
249 public void onSensorChanged(SensorEvent event) {
250 String s = "";
251 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
252 s = String.format("Acc.: X:%f Y:%f Z:%f", event.values[0],
253 event.values[1], event.values[2]);
254 lbAcceleration.setText(s);
258 if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
259 s = String.format("%s %n Orientation: X:%f Y:%f Z:%f", s,
260 event.values[0], event.values[1], event.values[2]);
261 lbOrientation.setText(s);
262 // mPosRecorder.setOrientation(event.values);
264 if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
265 s = String.format("LinAcc.: X:%f Y:%f Z:%f", event.values[0],
266 event.values[1], event.values[2]);
267 lbGyroscope.setText(s);
269 data.add(new Acceleration(event.values[0], event.values[1],
270 event.values[2]));
271 acclerationValues.add(new Vector(event.values));
275 private void createVectorListCode(List<Vector> points) {
276 StringBuilder sb = new StringBuilder();
277 sb.append(String.format("public static double[][] vectors = { "));
279 int cnt = 0;
280 for (Vector v : points) {
281 sb.append(String.format("{ %1$s, %2$s, %3$s }", codePointFormat
282 .format(v.x), codePointFormat.format(v.y), codePointFormat
283 .format(v.z)));
284 ++cnt;
285 if (cnt < points.size())
286 sb.append(", ");
288 sb.append("};");
290 // send mail
291 final Intent emailIntent = new Intent(
292 android.content.Intent.ACTION_SEND);
293 emailIntent.setType("plain/text");
294 emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
295 new String[] { "patrick.ecker@gmail.com" });
296 emailIntent.putExtra(android.content.Intent.EXTRA_CC, new String[] {
297 "martin.enzelsberger@fh-hagenberg.at", "knittl89@gmail.com" });
298 emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
299 "MUS Testdata - Links");
300 emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, sb.toString());
301 this.startActivity(Intent.createChooser(emailIntent, "Send mail..."));