: gesture_detector(view)
, _d(NULL)
, transiting(false)
+ , transiting_trajectory(false)
{
reset();
: gesture_detector(NULL)
, _d(NULL)
, transiting(false)
+ , transiting_trajectory(false)
{
}
_prev[finger_no] = tp;
_cur_x[finger_no] = tp._x;
_cur_y[finger_no] = tp._y;
+ _inertial_start[finger_no] = tp;
if (_d)
_d->tap(finger_no, tp);
MAPS_LOGI("TRANSITION finger %d move", finger_no);
_maps_view_halt_inertial_camera(_view);
+ update_inertial_start_point(finger_no);
_prev[finger_no] = _last[finger_no];
_last[finger_no] = tp;
_cur_x[finger_no] = tp._x;
_cur_y[finger_no] = tp._y;
+ /* check if moved enough as much as effective length */
+ int trajectory = get_trajectory_effective_length(_down[finger_no], tp);
+ MAPS_LOGD("trajectory=%d", trajectory);
+ if (trajectory >= __CLICK_AREA)
+ transiting_trajectory = true;
+
if (_d)
_d->move(finger_no, tp);
}
_last[finger_no] = tp;
- const int delta_x = _last[finger_no]._x - _prev[finger_no]._x;
- const int delta_y = _last[finger_no]._y - _prev[finger_no]._y;
- unsigned int dt = _last[finger_no]._timestamp - _prev[finger_no]._timestamp;
+ const int delta_x = _last[finger_no]._x - _inertial_start[finger_no]._x;
+ const int delta_y = _last[finger_no]._y - _inertial_start[finger_no]._y;
+ unsigned int dt = _last[finger_no]._timestamp - _inertial_start[finger_no]._timestamp;
- int trajectory = get_trajectory_effective_length(_down[finger_no], tp);
- MAPS_LOGD("trajectory=%d", trajectory);
- if (trajectory <= __CLICK_AREA) dt = 0;
+ /* check if moved enough as much as effective length */
+ int trajectory_total = get_trajectory_effective_length(_down[finger_no], tp);
+ int trajectory_last = get_trajectory_effective_length(_prev[finger_no], tp);
+ MAPS_LOGD("trajectory total=%d, local=%d dx=%d, dy=%d, dt=%d",
+ trajectory_total, trajectory_last, delta_x, delta_y, dt);
- if (dt == 0) {
+ if (trajectory_total >= __CLICK_AREA)
+ transiting_trajectory = true;
+ if (trajectory_last <= __CLICK_AREA / 3.)
+ transiting_trajectory = false;
+
+ if (dt == 0 || !transiting_trajectory) {
_derivative_x[finger_no] = .0;
_derivative_y[finger_no] = .0;
} else {
- _derivative_x[finger_no] = 40. * (delta_x) / dt;
- _derivative_y[finger_no] = 40. * (delta_y) / dt;
+ _derivative_x[finger_no] = 10. * (delta_x) / dt;
+ _derivative_y[finger_no] = 10. * (delta_y) / dt;
}
_dt[finger_no] = MIN(1.*dt, 1.);
transiting_part[i] = false;
+#if 1
+ if ((ABS(_derivative_x[i]) > __ACCURACY) || (ABS(_derivative_y[i]) > __ACCURACY)) {
+ _cur_x[i] = get_next_point(_cur_x[i], _derivative_x[i], _dt[i]);
+ _derivative_x[i] = get_next_derivative(_derivative_x[i], _dt[i]);
+ transiting_part[i] |= ABS(_derivative_x[i]) > __ACCURACY;
+
+ _cur_y[i] = get_next_point(_cur_y[i], _derivative_y[i], _dt[i]);
+ _derivative_y[i] = get_next_derivative(_derivative_y[i], _dt[i]);
+ transiting_part[i] |= ABS(_derivative_y[i]) > __ACCURACY;
+ }
+#else
if (ABS(_derivative_x[i]) > __ACCURACY) {
_cur_x[i] = get_next_point(_cur_x[i], _derivative_x[i], _dt[i]);
_derivative_x[i] = get_next_derivative(_derivative_x[i], _dt[i]);
_derivative_y[i] = get_next_derivative(_derivative_y[i], _dt[i]);
transiting_part[i] |= ABS(_derivative_y[i]) > __ACCURACY;
}
+#endif
unsigned int timestamp = _last[i]._timestamp + get_transition_time(i);
void view::inertial_gesture::reset()
{
transiting = false;
+ transiting_trajectory = false;
for (int i = 0; i < MAX_FINGERS; i ++) {
transiting_part[i] = false;
transiting_start[i] = 0;
}
}
+
+void view::inertial_gesture::update_inertial_start_point(int finger_no)
+{
+ const int margin = 3;
+ if (((_last[finger_no]._x > _prev[finger_no]._x + margin) && (_last[finger_no]._x < _inertial_start[finger_no]._x - margin)) ||
+ ((_last[finger_no]._x < _prev[finger_no]._x - margin) && (_last[finger_no]._x > _inertial_start[finger_no]._x + margin)) ||
+ ((_last[finger_no]._y > _prev[finger_no]._y + margin) && (_last[finger_no]._y < _inertial_start[finger_no]._y - margin)) ||
+ ((_last[finger_no]._y < _prev[finger_no]._y - margin) && (_last[finger_no]._y > _inertial_start[finger_no]._y + margin))) {
+ _inertial_start[finger_no] = _last[finger_no];
+ MAPS_LOGD("reset inertial start (%d,%d)", _inertial_start[finger_no]._x, _inertial_start[finger_no]._y);
+ }
+}
+