@@ -47,18 +47,19 @@ public class StepDcretor implements SensorEventListener {
47
47
48
48
private final String TAG = "StepDcretor" ;
49
49
// alpha 由 t / (t + dT)计算得来,其中 t 是低通滤波器的时间常数,dT 是事件报送频率
50
- private final float alpha = 0.8f ;
51
- private long perCalTime = 0 ;
52
-
53
- //最新修改的精度值
54
- private final float minValue = 9.8f ;
55
- private final float maxValue = 9.9f ;
56
- //9.5f
50
+ // private final float alpha = 0.8f;
51
+ // private long perCalTime = 0;
52
+ //
53
+ // //最新修改的精度值
54
+ // private final float minValue = 9.8f;
55
+ // private final float maxValue = 9.9f;
56
+ // //9.5f
57
57
// private final float verminValue = 8.5f;
58
- //10.0f
58
+ // //10.0f
59
59
// private final float vermaxValue = 11.5f;
60
- private final float minTime = 150 ;
61
- private final float maxTime = 2000 ;
60
+ // private final float minTime = 150;
61
+ // private final float maxTime = 2000;
62
+
62
63
/**
63
64
* 0-准备计时 1-计时中 2-准备为正常计步计时 3-正常计步中
64
65
*/
@@ -73,33 +74,24 @@ public class StepDcretor implements SensorEventListener {
73
74
public static float average = 0 ;
74
75
75
76
private Timer timer ;
76
- // 倒计时5秒,5秒内不会显示计步 ,用于屏蔽细微波动
77
+ // 倒计时4秒,4秒内不会显示计步 ,用于屏蔽细微波动
77
78
private long duration = 4000 ;
78
79
private TimeCount time ;
79
80
80
81
OnSensorChangeListener onSensorChangeListener ;
81
82
82
- public StepDcretor ( Context context ) {
83
- super ();
83
+ public interface OnSensorChangeListener {
84
+ void onChange ();
84
85
}
85
86
86
- public void onSensorChanged (SensorEvent event ) {
87
- Sensor sensor = event .sensor ;
88
- synchronized (this ) {
89
- if (sensor .getType () == Sensor .TYPE_ACCELEROMETER ) {
90
- calc_step (event );
91
- }
92
- }
87
+ public StepDcretor (Context context ) {
88
+ super ();
93
89
}
94
90
95
91
public void onAccuracyChanged (Sensor arg0 , int arg1 ) {
96
92
97
93
}
98
94
99
- public interface OnSensorChangeListener {
100
- void onChange ();
101
- }
102
-
103
95
public OnSensorChangeListener getOnSensorChangeListener () {
104
96
return onSensorChangeListener ;
105
97
}
@@ -109,141 +101,21 @@ public void setOnSensorChangeListener(
109
101
this .onSensorChangeListener = onSensorChangeListener ;
110
102
}
111
103
112
- class TimeCount extends CountDownTimer {
113
- public TimeCount (long millisInFuture , long countDownInterval ) {
114
- super (millisInFuture , countDownInterval );
115
- }
116
-
117
- @ Override
118
- public void onFinish () {
119
- // 如果计时器正常结束,则开始计步
120
- time .cancel ();
121
- CURRENT_SETP += TEMP_STEP ;
122
- lastStep = -1 ;
123
- // CountTimeState = 2;
124
- Log .v (TAG , "计时正常结束" );
125
-
126
- timer = new Timer (true );
127
- TimerTask task = new TimerTask () {
128
- public void run () {
129
- if (lastStep == CURRENT_SETP ) {
130
- timer .cancel ();
131
- CountTimeState = 0 ;
132
- lastStep = -1 ;
133
- TEMP_STEP = 0 ;
134
- Log .v (TAG , "停止计步:" + CURRENT_SETP );
135
- } else {
136
- lastStep = CURRENT_SETP ;
137
- }
138
- }
139
- };
140
- timer .schedule (task , 0 , 3000 );
141
- CountTimeState = 3 ;
142
- }
143
-
144
- @ Override
145
- public void onTick (long millisUntilFinished ) {
146
- if (lastStep == TEMP_STEP ) {
147
- Log .v (TAG , "onTick 计时停止" );
148
- time .cancel ();
149
- CountTimeState = 0 ;
150
- lastStep = -1 ;
151
- TEMP_STEP = 0 ;
152
- } else {
153
- lastStep = TEMP_STEP ;
104
+ public void onSensorChanged (SensorEvent event ) {
105
+ Sensor sensor = event .sensor ;
106
+ synchronized (this ) {
107
+ if (sensor .getType () == Sensor .TYPE_ACCELEROMETER ) {
108
+ calc_step (event );
154
109
}
155
110
}
156
-
157
111
}
158
112
159
113
synchronized private void calc_step (SensorEvent event ) {
160
114
average = (float ) Math .sqrt (Math .pow (event .values [0 ], 2 )
161
115
+ Math .pow (event .values [1 ], 2 ) + Math .pow (event .values [2 ], 2 ));
162
- // avg_check_v(average);
163
116
DetectorNewStep (average );
164
117
}
165
118
166
- private void preStep () {
167
- if (CountTimeState == 0 ) {
168
- // 开启计时器
169
- time = new TimeCount (duration , 700 );
170
- time .start ();
171
- CountTimeState = 1 ;
172
- Log .v (TAG , "开启计时器" );
173
- } else if (CountTimeState == 1 ) {
174
- TEMP_STEP ++;
175
- Log .v (TAG , "计步中 TEMP_STEP:" + TEMP_STEP );
176
- } else if (CountTimeState == 3 ) {
177
- CURRENT_SETP ++;
178
- if (onSensorChangeListener != null ) {
179
- onSensorChangeListener .onChange ();
180
- }
181
- }
182
- }
183
-
184
- private void oldCalStep (SensorEvent event ) {
185
- // 用低通滤波器分离出重力加速度
186
- gravity [0 ] = alpha * gravity [0 ] + (1 - alpha ) * event .values [0 ];
187
- gravity [1 ] = alpha * gravity [1 ] + (1 - alpha ) * event .values [1 ];
188
- gravity [2 ] = alpha * gravity [2 ] + (1 - alpha ) * event .values [2 ];
189
-
190
- average = (float ) Math .sqrt (Math .pow (gravity [0 ], 2 )
191
- + Math .pow (gravity [1 ], 2 ) + Math .pow (gravity [2 ], 2 ));
192
-
193
- // if (average <= verminValue) {
194
- if (average <= minValue ) {
195
- Log .v ("xfblog" , "低" );
196
- perCalTime = System .currentTimeMillis ();
197
- }
198
- // } else if (average >= vermaxValue) {
199
- else if (average >= maxValue ) {
200
- Log .v ("xfblog" , "高" );
201
- float betweentime = System .currentTimeMillis ()
202
- - perCalTime ;
203
- if (betweentime >= minTime && betweentime < maxTime ) {
204
- perCalTime = 0 ;
205
- if (CountTimeState == 0 ) {
206
- // 开启计时器
207
- time = new TimeCount (duration , 800 );
208
- time .start ();
209
- CountTimeState = 1 ;
210
- Log .v (TAG , "开启计时器" );
211
- } else if (CountTimeState == 1 ) {
212
- TEMP_STEP ++;
213
- Log .v (TAG , "计步中 TEMP_STEP:" + TEMP_STEP );
214
- }
215
- // else if (CountTimeState == 2) {
216
- // timer = new Timer(true);
217
- // TimerTask task = new TimerTask() {
218
- // public void run() {
219
- // if (lastStep == CURRENT_SETP) {
220
- // timer.cancel();
221
- // CountTimeState = 0;
222
- // lastStep = -1;
223
- // TEMP_STEP = 0;
224
- // Log.v(TAG, "停止计步:" + CURRENT_SETP);
225
- // } else {
226
- // lastStep = CURRENT_SETP;
227
- // }
228
- // }
229
- // };
230
- // timer.schedule(task, 0, 2000);
231
- // CountTimeState = 3;
232
- // }
233
- else if (CountTimeState == 3 ) {
234
- CURRENT_SETP ++;
235
- if (onSensorChangeListener != null ) {
236
- onSensorChangeListener .onChange ();
237
- }
238
- }
239
-
240
-
241
- }
242
- }
243
- // }
244
- }
245
-
246
-
247
119
/*
248
120
* 检测步子,并开始计步
249
121
* 1.传入sersor中的数据
@@ -260,14 +132,7 @@ public void DetectorNewStep(float values) {
260
132
if (timeOfNow - timeOfLastPeak >= 200
261
133
&& (peakOfWave - valleyOfWave >= ThreadValue ) && timeOfNow - timeOfLastPeak <= 2000 ) {
262
134
timeOfThisPeak = timeOfNow ;
263
- /*
264
- * 更新界面的处理,不涉及到算法
265
- * 一般在通知更新界面之前,增加下面处理,为了处理无效运动:
266
- * 1.连续记录10才开始计步
267
- * 2.例如记录的9步用户停住超过3秒,则前面的记录失效,下次从头开始
268
- * 3.连续记录了9步用户还在运动,之前的数据才有效
269
- * */
270
-
135
+ //更新界面的处理,不涉及到算法
271
136
preStep ();
272
137
}
273
138
if (timeOfNow - timeOfLastPeak >= 200
@@ -280,13 +145,32 @@ public void DetectorNewStep(float values) {
280
145
gravityOld = values ;
281
146
}
282
147
148
+ private void preStep () {
149
+ if (CountTimeState == 0 ) {
150
+ // 开启计时器
151
+ time = new TimeCount (duration , 700 );
152
+ time .start ();
153
+ CountTimeState = 1 ;
154
+ Log .v (TAG , "开启计时器" );
155
+ } else if (CountTimeState == 1 ) {
156
+ TEMP_STEP ++;
157
+ Log .v (TAG , "计步中 TEMP_STEP:" + TEMP_STEP );
158
+ } else if (CountTimeState == 3 ) {
159
+ CURRENT_SETP ++;
160
+ if (onSensorChangeListener != null ) {
161
+ onSensorChangeListener .onChange ();
162
+ }
163
+ }
164
+ }
165
+
166
+
283
167
/*
284
168
* 检测波峰
285
169
* 以下四个条件判断为波峰:
286
170
* 1.目前点为下降的趋势:isDirectionUp为false
287
171
* 2.之前的点为上升的趋势:lastStatus为true
288
172
* 3.到波峰为止,持续上升大于等于2次
289
- * 4.波峰值大于20
173
+ * 4.波峰值大于1.2g,小于2g
290
174
* 记录波谷值
291
175
* 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值
292
176
* 2.所以要记录每次的波谷值,为了和下次的波峰做对比
@@ -360,4 +244,94 @@ else if (ave >= 3 && ave < 4)
360
244
}
361
245
return ave ;
362
246
}
247
+
248
+ class TimeCount extends CountDownTimer {
249
+ public TimeCount (long millisInFuture , long countDownInterval ) {
250
+ super (millisInFuture , countDownInterval );
251
+ }
252
+
253
+ @ Override
254
+ public void onFinish () {
255
+ // 如果计时器正常结束,则开始计步
256
+ time .cancel ();
257
+ CURRENT_SETP += TEMP_STEP ;
258
+ lastStep = -1 ;
259
+ // CountTimeState = 2;
260
+ Log .v (TAG , "计时正常结束" );
261
+
262
+ timer = new Timer (true );
263
+ TimerTask task = new TimerTask () {
264
+ public void run () {
265
+ if (lastStep == CURRENT_SETP ) {
266
+ timer .cancel ();
267
+ CountTimeState = 0 ;
268
+ lastStep = -1 ;
269
+ TEMP_STEP = 0 ;
270
+ Log .v (TAG , "停止计步:" + CURRENT_SETP );
271
+ } else {
272
+ lastStep = CURRENT_SETP ;
273
+ }
274
+ }
275
+ };
276
+ timer .schedule (task , 0 , 3000 );
277
+ CountTimeState = 3 ;
278
+ }
279
+
280
+ @ Override
281
+ public void onTick (long millisUntilFinished ) {
282
+ if (lastStep == TEMP_STEP ) {
283
+ Log .v (TAG , "onTick 计时停止" );
284
+ time .cancel ();
285
+ CountTimeState = 0 ;
286
+ lastStep = -1 ;
287
+ TEMP_STEP = 0 ;
288
+ } else {
289
+ lastStep = TEMP_STEP ;
290
+ }
291
+ }
292
+
293
+ }
294
+
295
+
296
+ //废弃的算法
297
+ // private void oldCalStep(SensorEvent event) {
298
+ // // 用低通滤波器分离出重力加速度
299
+ // gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
300
+ // gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
301
+ // gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
302
+ //
303
+ // average = (float) Math.sqrt(Math.pow(gravity[0], 2)
304
+ // + Math.pow(gravity[1], 2) + Math.pow(gravity[2], 2));
305
+ //
306
+ // if (average <= minValue) {
307
+ // Log.v("xfblog", "低");
308
+ // perCalTime = System.currentTimeMillis();
309
+ // }
310
+ // else if (average >= maxValue) {
311
+ // Log.v("xfblog", "高");
312
+ // float betweentime = System.currentTimeMillis()
313
+ // - perCalTime;
314
+ // if (betweentime >= minTime && betweentime < maxTime) {
315
+ // perCalTime = 0;
316
+ // if (CountTimeState == 0) {
317
+ // // 开启计时器
318
+ // time = new TimeCount(duration, 800);
319
+ // time.start();
320
+ // CountTimeState = 1;
321
+ // Log.v(TAG, "开启计时器");
322
+ // } else if (CountTimeState == 1) {
323
+ // TEMP_STEP++;
324
+ // Log.v(TAG, "计步中 TEMP_STEP:" + TEMP_STEP);
325
+ // }
326
+ // else if (CountTimeState == 3) {
327
+ // CURRENT_SETP++;
328
+ // if (onSensorChangeListener != null) {
329
+ // onSensorChangeListener.onChange();
330
+ // }
331
+ // }
332
+ //
333
+ //
334
+ // }
335
+ // }
336
+ // }
363
337
}
0 commit comments