1111
1212public class SensorHandler extends FencyHandler implements SensorEventListener {
1313
14+ private final long attackMinLength = 350000000 ; //nanoseconds
15+ private final float sogliaY = 5.0f ;
16+ private final int sogliaRoll = 55 , pitch_upbound = -60 , pitch_midbound = -5 , pitch_lowbound = 60 ;
17+
1418 private SensorFusion sensorFusion ;
1519 private SensorManager sensorManager ;
1620 private Sensor sensorLinearAcceleration ;
@@ -22,9 +26,14 @@ public class SensorHandler extends FencyHandler implements SensorEventListener {
2226
2327 public SensorHandler (FencyActivity context , Player player ) {
2428 super (context , player );
29+
30+ sensorManager = (SensorManager )context .getSystemService (context .SENSOR_SERVICE );
31+ sensorLinearAcceleration = sensorManager .getDefaultSensor (Sensor .TYPE_LINEAR_ACCELERATION );
32+ sensorFusion = new SensorFusion ();
33+ sensorFusion .setMode (SensorFusion .Mode .GYRO );
2534 }
2635
27- public void registerSensorManagerListeners () {
36+ public void registerListeners () {
2837 // Register 3 sensors for SensorFusion
2938 sensorManager .registerListener (this ,
3039 sensorManager .getDefaultSensor (Sensor .TYPE_ACCELEROMETER ),
@@ -43,8 +52,114 @@ public void registerSensorManagerListeners() {
4352 }
4453
4554 @ Override
46- public void onSensorChanged (SensorEvent sensorEvent ) {
55+ public void onSensorChanged (SensorEvent event ) {
56+ int id = event .sensor .getType ();
57+ //handle SensorFusion cases
58+ switch (id ) {
59+ case Sensor .TYPE_ACCELEROMETER :
60+ sensorFusion .setAccel (event .values );
61+ sensorFusion .calculateAccMagOrientation ();
62+ break ;
63+
64+ case Sensor .TYPE_GYROSCOPE :
65+ sensorFusion .gyroFunction (event );
66+ break ;
67+
68+ case Sensor .TYPE_MAGNETIC_FIELD :
69+ sensorFusion .setMagnet (event .values );
70+ break ;
71+ }
72+
73+ if (id == Sensor .TYPE_LINEAR_ACCELERATION ) {
74+
75+ float yCurrent = event .values [1 ];
76+ double pitch = sensorFusion .getPitch ();
77+ double roll = sensorFusion .getRoll ();
78+
79+ if (roll > sogliaRoll || roll < -sogliaRoll ) {
80+ //("Invalid")
81+ player .changeState (R .integer .INVALID );
82+ } else if (pitch > pitch_upbound && pitch < pitch_midbound ) {
83+ //("High Guard")
84+ player .changeState (R .integer .HIGH_STAND );
85+ } else if (pitch >= pitch_midbound && pitch < pitch_lowbound ) {
86+ //("Low Guard")
87+ player .changeState (R .integer .LOW_STAND );
88+ } else {
89+ //("Invalid")
90+ player .changeState (R .integer .INVALID );
91+ }
92+
93+ if (start ){
94+ // Initialize last y
95+ yPrevious = yCurrent ;
96+ start = false ;
97+ }
98+ else {
99+ yDelta = yCurrent - yPrevious ;
47100
101+ switch (state ) {
102+ case 0 :
103+ if (yCurrent >= -sogliaY && yCurrent <= sogliaY ) {
104+ //stay in state 0
105+ }
106+ else if (yCurrent > sogliaY && yDelta > 0
107+ && player .getState () != R .integer .INVALID ) {
108+ //save the starting time of the (possible) attack
109+ startingAttackTime = event .timestamp ;
110+ //go to state 1
111+ state = 1 ;
112+ }
113+ else if (yCurrent < -sogliaY && yDelta < 0 ){
114+ //go to state -1
115+ state = -1 ;
116+ }
117+ break ;
118+ case 1 :
119+ //waiting for positive spike
120+ if (yDelta < 0 ) {
121+ peak = yCurrent ;
122+ //go to state 2
123+ state = 2 ;
124+ }
125+ break ;
126+ case 2 :
127+ //waiting for negative spike
128+ if (yDelta > 0 ) {
129+ float spike2 = yCurrent ;
130+ if (player .getState () != R .integer .INVALID &&
131+ (peak + spike2 < 0 ) && (event .timestamp - startingAttackTime > attackMinLength )) {
132+ //AFFONDO!
133+ if (player .getState ()==R .integer .LOW_STAND )
134+ player .changeState (R .integer .LOW_ATTACK );
135+ else if (player .getState ()==R .integer .HIGH_STAND )
136+ player .changeState (R .integer .HIGH_ATTACK );
137+ }
138+ startingAttackTime = 0 ;
139+ peak = 0 ;
140+ //go to state 0
141+ state = 0 ;
142+ }
143+ break ;
144+ case -1 :
145+ //waiting for negative spike
146+ if (yDelta >0 ){
147+ //go to state -2
148+ state = -2 ;
149+ }
150+ break ;
151+ case -2 :
152+ //waiting for positive spike
153+ if (yDelta <0 ){
154+ //back to state 0 (idle)
155+ state = 0 ;
156+ }
157+ break ;
158+ default :
159+ break ;
160+ }
161+ }
162+ }
48163 }
49164
50165 @ Override
0 commit comments