Skip to content

Commit c595024

Browse files
author
xf
committed
新版本
1 parent 2529968 commit c595024

File tree

3 files changed

+132
-158
lines changed

3 files changed

+132
-158
lines changed

app/src/main/java/com/base/basepedo/service/StepDcretor.java

Lines changed: 132 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,19 @@ public class StepDcretor implements SensorEventListener {
4747

4848
private final String TAG = "StepDcretor";
4949
// 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
5757
// private final float verminValue = 8.5f;
58-
//10.0f
58+
// //10.0f
5959
// 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+
6263
/**
6364
* 0-准备计时 1-计时中 2-准备为正常计步计时 3-正常计步中
6465
*/
@@ -73,33 +74,24 @@ public class StepDcretor implements SensorEventListener {
7374
public static float average = 0;
7475

7576
private Timer timer;
76-
// 倒计时5秒,5秒内不会显示计步,用于屏蔽细微波动
77+
// 倒计时4秒,4秒内不会显示计步,用于屏蔽细微波动
7778
private long duration = 4000;
7879
private TimeCount time;
7980

8081
OnSensorChangeListener onSensorChangeListener;
8182

82-
public StepDcretor(Context context) {
83-
super();
83+
public interface OnSensorChangeListener {
84+
void onChange();
8485
}
8586

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();
9389
}
9490

9591
public void onAccuracyChanged(Sensor arg0, int arg1) {
9692

9793
}
9894

99-
public interface OnSensorChangeListener {
100-
void onChange();
101-
}
102-
10395
public OnSensorChangeListener getOnSensorChangeListener() {
10496
return onSensorChangeListener;
10597
}
@@ -109,141 +101,21 @@ public void setOnSensorChangeListener(
109101
this.onSensorChangeListener = onSensorChangeListener;
110102
}
111103

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);
154109
}
155110
}
156-
157111
}
158112

159113
synchronized private void calc_step(SensorEvent event) {
160114
average = (float) Math.sqrt(Math.pow(event.values[0], 2)
161115
+ Math.pow(event.values[1], 2) + Math.pow(event.values[2], 2));
162-
// avg_check_v(average);
163116
DetectorNewStep(average);
164117
}
165118

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-
247119
/*
248120
* 检测步子,并开始计步
249121
* 1.传入sersor中的数据
@@ -260,14 +132,7 @@ public void DetectorNewStep(float values) {
260132
if (timeOfNow - timeOfLastPeak >= 200
261133
&& (peakOfWave - valleyOfWave >= ThreadValue) && timeOfNow - timeOfLastPeak <= 2000) {
262134
timeOfThisPeak = timeOfNow;
263-
/*
264-
* 更新界面的处理,不涉及到算法
265-
* 一般在通知更新界面之前,增加下面处理,为了处理无效运动:
266-
* 1.连续记录10才开始计步
267-
* 2.例如记录的9步用户停住超过3秒,则前面的记录失效,下次从头开始
268-
* 3.连续记录了9步用户还在运动,之前的数据才有效
269-
* */
270-
135+
//更新界面的处理,不涉及到算法
271136
preStep();
272137
}
273138
if (timeOfNow - timeOfLastPeak >= 200
@@ -280,13 +145,32 @@ public void DetectorNewStep(float values) {
280145
gravityOld = values;
281146
}
282147

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+
283167
/*
284168
* 检测波峰
285169
* 以下四个条件判断为波峰:
286170
* 1.目前点为下降的趋势:isDirectionUp为false
287171
* 2.之前的点为上升的趋势:lastStatus为true
288172
* 3.到波峰为止,持续上升大于等于2次
289-
* 4.波峰值大于20
173+
* 4.波峰值大于1.2g,小于2g
290174
* 记录波谷值
291175
* 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值
292176
* 2.所以要记录每次的波谷值,为了和下次的波峰做对比
@@ -360,4 +244,94 @@ else if (ave >= 3 && ave < 4)
360244
}
361245
return ave;
362246
}
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+
// }
363337
}

sample/basepedo-2016-02-29.apk

1.06 MB
Binary file not shown.

sample/basepedo.apk

106 KB
Binary file not shown.

0 commit comments

Comments
 (0)