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