diff --git a/detect.h b/detect.h index 1d2090d..fa48f99 100644 --- a/detect.h +++ b/detect.h @@ -54,10 +54,12 @@ enum { enum { POSCTL_CALIB_MODE_OFF = 0, - POSCTL_CALIB_MODE_START, - POSCTL_CALIB_MODE_DELTA, - POSCTL_CALIB_MODE_AXIS1, - POSCTL_CALIB_MODE_AXIS2, + POSCTL_CALIB_MODE_STOP1, + POSCTL_CALIB_MODE_DELTAM, + POSCTL_CALIB_MODE_AXIS1START, + POSCTL_CALIB_MODE_AXIS1M, + POSCTL_CALIB_MODE_AXIS2START, + POSCTL_CALIB_MODE_AXIS2M, POSCTL_CALIB_MODE_FINISH }; @@ -87,6 +89,7 @@ class PosCtl { void CalibModeDelta(int x, int y); void CalibModeAxis(int x, int y); void CalibModeFinish(); + void CalibModeWait(int x, int y); int OutputClose(); int OutputOpen(); diff --git a/posctl.cc b/posctl.cc index b2b5ae2..4c20a62 100644 --- a/posctl.cc +++ b/posctl.cc @@ -58,9 +58,10 @@ void axis_history_add(int axis, double diff, double out) { axis_history[axis][axis_history_pos[axis]].out = out; } -#define CALIB_DURATION_DELTA 120.0 // max time in sec for the detection of rotation movement -#define CALIB_DURATION_AXIS 120.0 // max time in sec for the detection of axis movement -#define CALIB_DURATION_DIST 100.0 // max distance to detect movement +#define CALIB_DURATION_DELTA 120.0 // max time in sec for the detection of rotation movement +#define CALIB_DURATION_AXIS 120.0 // max time in sec for the detection of axis movement +#define CALIB_DURATION_DIST 20.0 // max distance to detect movement +#define CALIB_STARTSTOP_DELAY 2.5 // time to wait for start and stop void posctl_gui_update(); @@ -620,7 +621,7 @@ void PosCtl::StartCalibration() { return; } mode = POSCTL_MODE_CALIB; - calib_mode = POSCTL_CALIB_MODE_START; + calib_mode = POSCTL_CALIB_MODE_STOP1; gettimeofday (&calib_timestamp, NULL); gdk_threads_add_idle(cb_thread_posctl, NULL); } @@ -669,13 +670,33 @@ void PosCtl::CalibModeStart(int x, int y) { calib_pos.x = x; calib_pos.y = y; - calib_mode = POSCTL_CALIB_MODE_DELTA; + calib_mode = POSCTL_CALIB_MODE_STOP1; if (OutputWriteStop()) mode = POSCTL_MODE_OFF; gettimeofday (&calib_timestamp, NULL); gdk_threads_add_idle(cb_thread_posctl, NULL); }; +void PosCtl::CalibModeWait(int x, int y) { + struct timeval tv; + float timediff; + + gettimeofday (&tv, NULL); + timediff = (float)(tv.tv_sec - calib_timestamp.tv_sec) + ((tv.tv_usec - calib_timestamp.tv_usec) / 1000000.0); + + if (timediff > CALIB_STARTSTOP_DELAY) { + printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); + + calib_mode++; + calib_pos.x = x; + calib_pos.y = y; + + gettimeofday (&calib_timestamp, NULL); + gdk_threads_add_idle(cb_thread_posctl, NULL); + } +} + + void PosCtl::CalibModeDelta(int x, int y) { struct timeval tv; float timediff; @@ -697,12 +718,12 @@ void PosCtl::CalibModeDelta(int x, int y) { LockMutex(); calib_rot_v = fp; calc_vec2anglelen(&fp, &calib_rot); + printf ("%s:%d %s calib_rot_v.x:%f calib_rot_v.y:%f\n", __FILE__, __LINE__, __FUNCTION__, calib_rot_v.x, calib_rot_v.y); UnLockMutex(); - calib_mode = POSCTL_CALIB_MODE_AXIS1; - calib_pos.x = x; - calib_pos.y = y; + calib_mode = POSCTL_CALIB_MODE_AXIS1START; + if (OutputWriteStop()) mode = POSCTL_MODE_OFF; if (OutputWriteValue(0, pid_axis[0].GetMax())) mode = POSCTL_MODE_OFF; gettimeofday (&calib_timestamp, NULL); @@ -723,25 +744,23 @@ void PosCtl::CalibModeAxis(int x, int y) { if (timediff > CALIB_DURATION_AXIS || dist > CALIB_DURATION_DIST) { printf ("%s:%d %s calib_mode: %d\n", __FILE__, __LINE__, __FUNCTION__, calib_mode); + printf ("%s:%d x: %d y: %d cpos.x:%d cpos.y:%d rot.x:%f rot.y:%f\n", __FILE__, __LINE__, x, y, calib_pos.x, calib_pos.y, calib_rot_v.x, calib_rot_v.y); - fp.x = +(x - calib_pos.x) / timediff; - fp.y = +(y - calib_pos.y) / timediff; + fp.x = (x - calib_pos.x) / timediff; + fp.y = (y - calib_pos.y) / timediff; - if (calib_mode == POSCTL_CALIB_MODE_AXIS1) { - calib_axis1_v = fp - calib_rot_v; + if (calib_mode == POSCTL_CALIB_MODE_AXIS1M) { + calib_axis1_v = fp; calc_vec2anglelen(&calib_axis1_v, &calib_axis1); if (OutputWriteStop()) mode = POSCTL_MODE_OFF; else if (OutputWriteValue(1, pid_axis[1].GetMax())) mode = POSCTL_MODE_OFF; } - else if (calib_mode == POSCTL_CALIB_MODE_AXIS2) { - calib_axis2_v = fp - calib_rot_v; + else if (calib_mode == POSCTL_CALIB_MODE_AXIS2M) { + calib_axis2_v = fp; calc_vec2anglelen(&calib_axis2_v, &calib_axis2); - if (OutputWriteStart()) mode = POSCTL_MODE_OFF; } - calib_mode++; - calib_pos.x = x; - calib_pos.y = y; + if (calib_mode != POSCTL_CALIB_MODE_OFF) calib_mode++; gettimeofday (&calib_timestamp, NULL); gdk_threads_add_idle(cb_thread_posctl, NULL); } @@ -753,13 +772,16 @@ void PosCtl::CalibModeFinish() { mode = POSCTL_MODE_OFF; calib_mode = POSCTL_CALIB_MODE_OFF; + if (OutputWriteStop()) mode = POSCTL_MODE_OFF; + if (OutputWriteValue(0, 0.5 * (pid_axis[0].GetMin() + pid_axis[0].GetMax()))) mode = POSCTL_MODE_OFF; + if (OutputWriteValue(1, 0.5 * (pid_axis[1].GetMin() + pid_axis[1].GetMax()))) mode = POSCTL_MODE_OFF; gettimeofday (&calib_timestamp, NULL); gdk_threads_add_idle(cb_thread_posctl, NULL); }; /* - * Loop, if new data is aviable + * Loop, if new data is aviable{ */ void PosCtl::Loop (int posx, int posy) { #ifdef DEBUG_POSCTL @@ -773,14 +795,16 @@ void PosCtl::Loop (int posx, int posy) { // calibration mode? if (mode == POSCTL_MODE_CALIB) { switch (calib_mode) { - case (POSCTL_CALIB_MODE_START): - CalibModeStart(posx, posy); + case (POSCTL_CALIB_MODE_STOP1): + case (POSCTL_CALIB_MODE_AXIS1START): + case (POSCTL_CALIB_MODE_AXIS2START): + CalibModeWait(posx, posy); break; - case (POSCTL_CALIB_MODE_DELTA): + case (POSCTL_CALIB_MODE_DELTAM): CalibModeDelta(posx, posy); break; - case (POSCTL_CALIB_MODE_AXIS1): - case (POSCTL_CALIB_MODE_AXIS2): + case (POSCTL_CALIB_MODE_AXIS1M): + case (POSCTL_CALIB_MODE_AXIS2M): CalibModeAxis(posx, posy); break; case (POSCTL_CALIB_MODE_FINISH): @@ -790,6 +814,7 @@ void PosCtl::Loop (int posx, int posy) { calib_mode = POSCTL_CALIB_MODE_OFF; mode = POSCTL_MODE_OFF; gdk_threads_add_idle(cb_thread_posctl, NULL); + break; } } diff --git a/simpleskycam.ui b/simpleskycam.ui index 2f0b37a..38bad78 100644 --- a/simpleskycam.ui +++ b/simpleskycam.ui @@ -324,6 +324,7 @@ False start start + True True detect-pos-cboff