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
{
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
;
51 private Socket clientSocket
;
52 private DataOutputStream outToServer
;
53 private final int UDP_PORT
= 45000;
54 private final int TCP_PORT
= 35000;
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
>();
70 public void onCreate(Bundle savedInstanceState
) {
71 super.onCreate(savedInstanceState
);
72 setContentView(R
.layout
.main
);
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
) {
86 btnCloseApp
= (Button
) findViewById(R
.id
.btnCloseApp
);
87 btnCloseApp
.setOnClickListener(new OnClickListener() {
88 public void onClick(View v
) {
90 if (outToServer
!= null)
92 if (clientSocket
!= null)
94 } catch (IOException e
) {
100 btnConnect
= (Button
) findViewById(R
.id
.btnConnect
);
101 btnConnect
.setOnClickListener(new OnClickListener() {
102 public void onClick(View v
) {
106 btnDevMessage1
= (Button
) findViewById(R
.id
.btnSendDevMessag1
);
107 btnDevMessage1
.setOnClickListener(new OnClickListener() {
108 public void onClick(View v
) {
110 outToServer
.writeBytes("ForwardGesture");
111 } catch (IOException e
) {
116 btnDevMessage2
= (Button
) findViewById(R
.id
.btnSendDevMessag2
);
117 btnDevMessage2
.setOnClickListener(new OnClickListener() {
118 public void onClick(View v
) {
120 outToServer
.writeBytes("BackwardGesture");
121 } catch (IOException e
) {
126 btnStartGesture
= (Button
) findViewById(R
.id
.btnStartGesture
);
127 btnStartGesture
.setOnClickListener(new OnClickListener() {
128 public void onClick(View v
) {
133 btnEndGesture
= (Button
) findViewById(R
.id
.btnEndGesture
);
134 btnEndGesture
.setOnClickListener(new OnClickListener() {
135 public void onClick(View v
) {
141 private void findServers() {
143 byte[] buf
= new byte[1000];
144 String message
= "FindServer";
145 btnFindServer
.setEnabled(false);
147 InetAddress addr
= InetAddress
.getByName("255.255.255.255");
148 DatagramSocket dgsock
= new DatagramSocket();
149 pack
= new DatagramPacket(message
.getBytes(), message
.length(),
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
) {
160 btnFindServer
.setEnabled(true);
163 private void connectToServer() {
164 lbInformation
.setText("Trying to connect to Server ...");
166 Thread t
= new Thread() {
169 String ip
= txtServerIp
.getText().toString();
170 clientSocket
= new Socket(ip
, TCP_PORT
);
171 outToServer
= new DataOutputStream(clientSocket
174 outToServer
.writeBytes("Hello Server");
177 } catch (IOException e
) {
179 } catch (InterruptedException e
) {
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() {
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() {
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
);
223 acclerationValues
.clear();
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
) {
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],
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 = { "));
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
285 if (cnt
< points
.size())
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..."));