1 package at
.mus
.GestureSensitiveControl
;
3 import java
.text
.DecimalFormat
;
4 import java
.text
.NumberFormat
;
7 import android
.app
.Activity
;
8 import android
.content
.Intent
;
9 import android
.hardware
.Sensor
;
10 import android
.hardware
.SensorEvent
;
11 import android
.hardware
.SensorEventListener
;
12 import android
.hardware
.SensorManager
;
13 import android
.os
.Bundle
;
14 import android
.view
.MotionEvent
;
15 import android
.view
.View
;
16 import android
.view
.View
.OnClickListener
;
17 import android
.view
.View
.OnTouchListener
;
18 import android
.widget
.Button
;
19 import android
.widget
.EditText
;
20 import android
.widget
.TextView
;
21 import at
.mus
.recognition
.*;
22 import at
.mus
.recognition
.dtw
.AccelerationFactory
;
23 import at
.mus
.recognition
.dtw
.DTW
;
25 public class GestureActivity
extends Activity
implements SensorEventListener
{
26 private static final NumberFormat codePointFormat
= DecimalFormat
.getInstance(Locale
.ENGLISH
);
29 private Button btnFindServer
;
30 private Button btnCloseApp
;
31 private Button btnConnect
;
32 private Button btnDevMessage1
;
33 private Button btnDevMessage2
;
34 private Button btnRecognize
;
35 private TextView lbInformation
;
36 private TextView lbAcceleration
;
37 private TextView lbOrientation
;
38 private TextView lbGyroscope
;
39 private EditText txtServerIp
;
42 private Connector connector
;
45 private SensorManager mSensorManager
;
46 private Sensor mAccelerometer
;
47 private Sensor mOrientation
;
48 private Sensor mLinearAcceleration
;
50 private ArrayList
<ICoordinate
> data
= new ArrayList
<ICoordinate
>();
51 private IRecognizer dtw
= new DTW();
52 private CoordinateFactory coords
= new AccelerationFactory();
55 public void onCreate(Bundle savedInstanceState
) {
56 super.onCreate(savedInstanceState
);
58 connector
= new Connector();
60 setContentView(R
.layout
.main
);
63 lbInformation
= (TextView
) findViewById(R
.id
.lbInformation
);
64 lbAcceleration
= (TextView
) findViewById(R
.id
.lbAcceleration
);
65 lbOrientation
= (TextView
) findViewById(R
.id
.lbOrientation
);
66 lbGyroscope
= (TextView
) findViewById(R
.id
.lbGyroscope
);
67 txtServerIp
= (EditText
) findViewById(R
.id
.txtServerIp
);
68 btnFindServer
= (Button
) findViewById(R
.id
.btnFindServer
);
69 btnFindServer
.setOnClickListener(new OnClickListener() {
70 public void onClick(View v
) {
71 btnFindServer
.setEnabled(false);
72 txtServerIp
.setText(connector
.findServers());
73 btnFindServer
.setEnabled(true);
76 btnCloseApp
= (Button
) findViewById(R
.id
.btnCloseApp
);
77 btnCloseApp
.setOnClickListener(new OnClickListener() {
78 public void onClick(View v
) {
83 btnConnect
= (Button
) findViewById(R
.id
.btnConnect
);
84 btnConnect
.setOnClickListener(new OnClickListener() {
85 public void onClick(View v
) {
86 lbInformation
.setText("Trying to connect to Server ...");
87 String ip
= txtServerIp
.getText().toString();
88 connector
.connectToServer(ip
);
90 lbInformation
.setText("Connected to Server, make gesture !");
91 btnDevMessage1
.setEnabled(true);
92 btnDevMessage2
.setEnabled(true);
93 btnRecognize
.setEnabled(true);
96 btnDevMessage1
= (Button
) findViewById(R
.id
.btnSendDevMessag1
);
97 btnDevMessage1
.setOnClickListener(new OnClickListener() {
98 public void onClick(View v
) {
99 connector
.send("ForwardGesture");
102 btnDevMessage2
= (Button
) findViewById(R
.id
.btnSendDevMessag2
);
103 btnDevMessage2
.setOnClickListener(new OnClickListener() {
104 public void onClick(View v
) {
105 connector
.send("BackwardGesture");
109 btnRecognize
= (Button
) findViewById(R
.id
.btnRecognize
);
110 btnRecognize
.setOnTouchListener(new OnTouchListener() {
111 public boolean onTouch(View v
, MotionEvent event
) {
112 if (event
.getAction() == MotionEvent
.ACTION_DOWN
) {
114 } else if (event
.getAction() == MotionEvent
.ACTION_UP
) {
122 protected void onResume() {
124 if (mSensorManager
!= null) { // maybe delete this one
125 mSensorManager
.registerListener(this, mAccelerometer
, SensorManager
.SENSOR_DELAY_NORMAL
);
126 mSensorManager
.registerListener(this, mLinearAcceleration
, SensorManager
.SENSOR_DELAY_NORMAL
);
127 mSensorManager
.registerListener(this, mOrientation
, SensorManager
.SENSOR_DELAY_NORMAL
);
131 protected void onPause() {
133 if (mSensorManager
!= null) {
134 mSensorManager
.unregisterListener(this);
138 private void startGesture() {
139 // create sensor manager and accelerometer
140 mSensorManager
= (SensorManager
) getSystemService(SENSOR_SERVICE
);
141 mAccelerometer
= mSensorManager
.getDefaultSensor(Sensor
.TYPE_ACCELEROMETER
);
142 mOrientation
= mSensorManager
.getDefaultSensor(Sensor
.TYPE_ORIENTATION
);
143 mLinearAcceleration
= mSensorManager
.getDefaultSensor(Sensor
.TYPE_LINEAR_ACCELERATION
);
149 mSensorManager
.registerListener(this, mAccelerometer
, SensorManager
.SENSOR_DELAY_FASTEST
);
150 mSensorManager
.registerListener(this, mLinearAcceleration
, SensorManager
.SENSOR_DELAY_FASTEST
);
151 mSensorManager
.registerListener(this, mOrientation
, SensorManager
.SENSOR_DELAY_NORMAL
);
154 private void endGesture() {
155 // deregister listener
156 mSensorManager
.unregisterListener(this);
158 Result r
= dtw
.recognize(data
, Templates
.templates
, 0, 0, null);
159 lbOrientation
.setText(r
.getTemplate().name
+ " " + r
.getMatch());
161 connector
.send(r
.getTemplate().name
);
163 //this.createVectorListCode(data);
166 // will be called if accuracy changes
167 public void onAccuracyChanged(Sensor sensor
, int accuracy
) {
170 // will be called if a sensor changes its value
171 public void onSensorChanged(SensorEvent event
) {
173 if (event
.sensor
.getType() == Sensor
.TYPE_ACCELEROMETER
) {
174 s
= String
.format("Acc.: X:%f Y:%f Z:%f", event
.values
[0],
175 event
.values
[1], event
.values
[2]);
176 lbAcceleration
.setText(s
);
178 if (event
.sensor
.getType() == Sensor
.TYPE_ORIENTATION
) {
179 s
= String
.format("%s %n Orientation: X:%f Y:%f Z:%f", s
,
180 event
.values
[0], event
.values
[1], event
.values
[2]);
181 lbOrientation
.setText(s
);
182 // mPosRecorder.setOrientation(event.values);
184 if (event
.sensor
.getType() == Sensor
.TYPE_LINEAR_ACCELERATION
) {
185 s
= String
.format("LinAcc.: X:%f Y:%f Z:%f", event
.values
[0],
186 event
.values
[1], event
.values
[2]);
187 lbGyroscope
.setText(s
);
188 data
.add(coords
.create(event
.values
));
192 @SuppressWarnings("unused")
193 private void createVectorListCode(List
<ICoordinate
> points
) {
194 StringBuilder sb
= new StringBuilder();
195 sb
.append(String
.format("public static float[][] vectors = { "));
198 for (ICoordinate c
: points
) {
199 sb
.append(String
.format("{ %1$sf, %2$sf, %3$sf }", codePointFormat
.format(c
.getX()),
200 codePointFormat
.format(c
.getY()),
201 codePointFormat
.format(c
.getZ())));
203 if (cnt
< points
.size())
209 final Intent emailIntent
= new Intent(
210 android
.content
.Intent
.ACTION_SEND
);
211 emailIntent
.setType("plain/text");
212 emailIntent
.putExtra(android
.content
.Intent
.EXTRA_EMAIL
,
213 new String
[] { "patrick.ecker@gmail.com" });
214 emailIntent
.putExtra(android
.content
.Intent
.EXTRA_CC
, new String
[] {
215 "martin.enzelsberger@fh-hagenberg.at", "knittl89@gmail.com" });
216 emailIntent
.putExtra(android
.content
.Intent
.EXTRA_SUBJECT
,
217 "MUS Testdata - Links Krümmung");
218 emailIntent
.putExtra(android
.content
.Intent
.EXTRA_TEXT
, sb
.toString());
219 this.startActivity(Intent
.createChooser(emailIntent
, "Send mail..."));