|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|