|
12 | 12 | import java.util.TimerTask;
|
13 | 13 |
|
14 | 14 | public class StepDcretor implements SensorEventListener {
|
| 15 | + float avg_v = 0; |
| 16 | + float min_v = 0; |
| 17 | + float max_v = 0; |
| 18 | + |
| 19 | + int acc_count = 0; |
| 20 | + int up_c = 0; |
| 21 | + int down_c = 0; |
| 22 | + long pre_time = 0; |
| 23 | + |
| 24 | + |
15 | 25 | private final String TAG = "StepDcretor";
|
16 | 26 | // alpha 由 t / (t + dT)计算得来,其中 t 是低通滤波器的时间常数,dT 是事件报送频率
|
17 | 27 | private final float alpha = 0.8f;
|
18 | 28 | private long perCalTime = 0;
|
19 | 29 |
|
20 | 30 | //最新修改的精度值
|
21 |
| - private final float minValue = 9.7f; |
22 |
| - private final float maxValue = 9.8f; |
| 31 | + private final float minValue = 9.8f; |
| 32 | + private final float maxValue = 9.9f; |
23 | 33 | //9.5f
|
24 | 34 | // private final float verminValue = 8.5f;
|
25 | 35 | //10.0f
|
@@ -54,69 +64,16 @@ public void onSensorChanged(SensorEvent event) {
|
54 | 64 | Sensor sensor = event.sensor;
|
55 | 65 | synchronized (this) {
|
56 | 66 | if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
|
| 67 | + calc_step(event); |
57 | 68 |
|
58 |
| - // 用低通滤波器分离出重力加速度 |
59 |
| - gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; |
60 |
| - gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; |
61 |
| - gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; |
62 |
| - |
63 |
| - average = (float) Math.sqrt(Math.pow(gravity[0], 2) |
64 |
| - + Math.pow(gravity[1], 2) + Math.pow(gravity[2], 2)); |
65 |
| - |
66 |
| -// if (average <= verminValue) { |
67 |
| - if (average <= minValue) { |
68 |
| - Log.v("xfblog","低"); |
69 |
| - perCalTime = System.currentTimeMillis(); |
70 |
| - } |
71 |
| -// } else if (average >= vermaxValue) { |
72 |
| - else if (average >= maxValue) { |
73 |
| - Log.v("xfblog","高"); |
74 |
| - float betweentime = System.currentTimeMillis() |
75 |
| - - perCalTime; |
76 |
| - if (betweentime >= minTime && betweentime < maxTime) { |
77 |
| - perCalTime = 0; |
78 |
| - if (CountTimeState == 0) { |
79 |
| - // 开启计时器 |
80 |
| - time = new TimeCount(duration, 800); |
81 |
| - time.start(); |
82 |
| - CountTimeState = 1; |
83 |
| - Log.v(TAG, "开启计时器"); |
84 |
| - } else if (CountTimeState == 1) { |
85 |
| - TEMP_STEP++; |
86 |
| - Log.v(TAG, "计步中 TEMP_STEP:" + TEMP_STEP); |
87 |
| - } |
88 |
| -// else if (CountTimeState == 2) { |
89 |
| -// timer = new Timer(true); |
90 |
| -// TimerTask task = new TimerTask() { |
91 |
| -// public void run() { |
92 |
| -// if (lastStep == CURRENT_SETP) { |
93 |
| -// timer.cancel(); |
94 |
| -// CountTimeState = 0; |
95 |
| -// lastStep = -1; |
96 |
| -// TEMP_STEP = 0; |
97 |
| -// Log.v(TAG, "停止计步:" + CURRENT_SETP); |
98 |
| -// } else { |
99 |
| -// lastStep = CURRENT_SETP; |
100 |
| -// } |
101 |
| -// } |
102 |
| -// }; |
103 |
| -// timer.schedule(task, 0, 2000); |
104 |
| -// CountTimeState = 3; |
105 |
| -// } |
106 |
| - else if (CountTimeState == 3) { |
107 |
| - CURRENT_SETP++; |
108 |
| - if (onSensorChangeListener != null) { |
109 |
| - onSensorChangeListener.onChange(); |
110 |
| - } |
111 |
| - } |
112 |
| - } |
113 |
| - } |
114 |
| -// } |
115 | 69 | }
|
116 | 70 | }
|
117 | 71 | }
|
118 | 72 |
|
119 | 73 |
|
| 74 | + |
| 75 | + |
| 76 | + |
120 | 77 | public void onAccuracyChanged(Sensor arg0, int arg1) {
|
121 | 78 |
|
122 | 79 | }
|
@@ -180,4 +137,147 @@ public void onTick(long millisUntilFinished) {
|
180 | 137 | }
|
181 | 138 |
|
182 | 139 | }
|
| 140 | + |
| 141 | + |
| 142 | + void avg_check_v(float v) { |
| 143 | + acc_count++; |
| 144 | + //求移动平均线 |
| 145 | + //50ms 1 second 20 , 3 sec60; |
| 146 | + if (acc_count < 64) { |
| 147 | + //avg_v=((acc_count-1)*avg_v+v)/acc_count; |
| 148 | + avg_v = avg_v + (v - avg_v) / acc_count; |
| 149 | + } else { |
| 150 | + //avg_v=(avg_v*99+v)/100; |
| 151 | + avg_v = avg_v * 63 / 64 + v / 64; |
| 152 | + } |
| 153 | + |
| 154 | + if (v > avg_v) { |
| 155 | + up_c++; |
| 156 | + if (up_c == 1) { |
| 157 | + //Log.e("wokao","diff:"+(max_v-min_v)); |
| 158 | + max_v = avg_v; |
| 159 | + } else { |
| 160 | + max_v = Math.max(v, max_v); |
| 161 | + } |
| 162 | + if (up_c >= 2) { |
| 163 | + down_c = 0; |
| 164 | + } |
| 165 | + } else { |
| 166 | + down_c++; |
| 167 | + if (down_c == 1) { |
| 168 | + min_v = v; |
| 169 | + } else { |
| 170 | + min_v = Math.min(v, min_v); |
| 171 | + } |
| 172 | + if (down_c >= 2) { |
| 173 | + up_c = 0; |
| 174 | + } |
| 175 | + } |
| 176 | + //Log.e("wokao","avg_v:"+avg_v+",v:"+v+",uc"+up_c+",dc:"+down_c); |
| 177 | + |
| 178 | + if (up_c == 2 && (max_v - min_v) > 2) { |
| 179 | + // |
| 180 | + long cur_time = System.currentTimeMillis(); |
| 181 | + if (cur_time - pre_time > 250) { |
| 182 | + pre_time = cur_time; |
| 183 | + preStep(); |
| 184 | +// StepDcretor.CURRENT_SETP++; |
| 185 | +// //记步,通知ui |
| 186 | +// if (onSensorChangeListener != null) { |
| 187 | +// onSensorChangeListener.onChange(); |
| 188 | +// } |
| 189 | + Log.e("xfblog","CURRENT_SETP:"+CURRENT_SETP); |
| 190 | + } else { |
| 191 | + up_c = 1; |
| 192 | + } |
| 193 | + } |
| 194 | + } |
| 195 | + |
| 196 | + synchronized private void calc_step(SensorEvent arg0) { |
| 197 | + float v = (float) Math.sqrt(arg0.values[0] * arg0.values[0] + arg0.values[1] * arg0.values[1] + arg0.values[2] * arg0.values[2]); |
| 198 | + avg_check_v(v); |
| 199 | + } |
| 200 | + |
| 201 | + private void preStep(){ |
| 202 | + if (CountTimeState == 0) { |
| 203 | + // 开启计时器 |
| 204 | + time = new TimeCount(duration, 700); |
| 205 | + time.start(); |
| 206 | + CountTimeState = 1; |
| 207 | + Log.v(TAG, "开启计时器"); |
| 208 | + } else if (CountTimeState == 1) { |
| 209 | + TEMP_STEP++; |
| 210 | + Log.v(TAG, "计步中 TEMP_STEP:" + TEMP_STEP); |
| 211 | + } else if (CountTimeState == 3) { |
| 212 | + CURRENT_SETP++; |
| 213 | + if (onSensorChangeListener != null) { |
| 214 | + onSensorChangeListener.onChange(); |
| 215 | + } |
| 216 | + } |
| 217 | + } |
| 218 | + |
| 219 | + |
| 220 | + |
| 221 | + private void oldCalStep(SensorEvent event){ |
| 222 | + // 用低通滤波器分离出重力加速度 |
| 223 | + gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; |
| 224 | + gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; |
| 225 | + gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; |
| 226 | + |
| 227 | + average = (float) Math.sqrt(Math.pow(gravity[0], 2) |
| 228 | + + Math.pow(gravity[1], 2) + Math.pow(gravity[2], 2)); |
| 229 | + |
| 230 | +// if (average <= verminValue) { |
| 231 | + if (average <= minValue) { |
| 232 | + Log.v("xfblog","低"); |
| 233 | + perCalTime = System.currentTimeMillis(); |
| 234 | + } |
| 235 | +// } else if (average >= vermaxValue) { |
| 236 | + else if (average >= maxValue) { |
| 237 | + Log.v("xfblog","高"); |
| 238 | + float betweentime = System.currentTimeMillis() |
| 239 | + - perCalTime; |
| 240 | + if (betweentime >= minTime && betweentime < maxTime) { |
| 241 | + perCalTime = 0; |
| 242 | + if (CountTimeState == 0) { |
| 243 | + // 开启计时器 |
| 244 | + time = new TimeCount(duration, 800); |
| 245 | + time.start(); |
| 246 | + CountTimeState = 1; |
| 247 | + Log.v(TAG, "开启计时器"); |
| 248 | + } else if (CountTimeState == 1) { |
| 249 | + TEMP_STEP++; |
| 250 | + Log.v(TAG, "计步中 TEMP_STEP:" + TEMP_STEP); |
| 251 | + } |
| 252 | +// else if (CountTimeState == 2) { |
| 253 | +// timer = new Timer(true); |
| 254 | +// TimerTask task = new TimerTask() { |
| 255 | +// public void run() { |
| 256 | +// if (lastStep == CURRENT_SETP) { |
| 257 | +// timer.cancel(); |
| 258 | +// CountTimeState = 0; |
| 259 | +// lastStep = -1; |
| 260 | +// TEMP_STEP = 0; |
| 261 | +// Log.v(TAG, "停止计步:" + CURRENT_SETP); |
| 262 | +// } else { |
| 263 | +// lastStep = CURRENT_SETP; |
| 264 | +// } |
| 265 | +// } |
| 266 | +// }; |
| 267 | +// timer.schedule(task, 0, 2000); |
| 268 | +// CountTimeState = 3; |
| 269 | +// } |
| 270 | + else if (CountTimeState == 3) { |
| 271 | + CURRENT_SETP++; |
| 272 | + if (onSensorChangeListener != null) { |
| 273 | + onSensorChangeListener.onChange(); |
| 274 | + } |
| 275 | + } |
| 276 | + |
| 277 | + |
| 278 | + |
| 279 | + } |
| 280 | + } |
| 281 | +// } |
| 282 | + } |
183 | 283 | }
|
0 commit comments