need wait steps for motor control.

master
Steffen Pohle 2 years ago
parent 94043ab330
commit da15e98d2d

@ -54,10 +54,12 @@ enum {
enum { enum {
POSCTL_CALIB_MODE_OFF = 0, POSCTL_CALIB_MODE_OFF = 0,
POSCTL_CALIB_MODE_START, POSCTL_CALIB_MODE_STOP1,
POSCTL_CALIB_MODE_DELTA, POSCTL_CALIB_MODE_DELTAM,
POSCTL_CALIB_MODE_AXIS1, POSCTL_CALIB_MODE_AXIS1START,
POSCTL_CALIB_MODE_AXIS2, POSCTL_CALIB_MODE_AXIS1M,
POSCTL_CALIB_MODE_AXIS2START,
POSCTL_CALIB_MODE_AXIS2M,
POSCTL_CALIB_MODE_FINISH POSCTL_CALIB_MODE_FINISH
}; };
@ -87,6 +89,7 @@ class PosCtl {
void CalibModeDelta(int x, int y); void CalibModeDelta(int x, int y);
void CalibModeAxis(int x, int y); void CalibModeAxis(int x, int y);
void CalibModeFinish(); void CalibModeFinish();
void CalibModeWait(int x, int y);
int OutputClose(); int OutputClose();
int OutputOpen(); int OutputOpen();

@ -60,7 +60,8 @@ void axis_history_add(int axis, double diff, double out) {
#define CALIB_DURATION_DELTA 120.0 // max time in sec for the detection of rotation 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_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_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(); void posctl_gui_update();
@ -620,7 +621,7 @@ void PosCtl::StartCalibration() {
return; return;
} }
mode = POSCTL_MODE_CALIB; mode = POSCTL_MODE_CALIB;
calib_mode = POSCTL_CALIB_MODE_START; calib_mode = POSCTL_CALIB_MODE_STOP1;
gettimeofday (&calib_timestamp, NULL); gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, 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.x = x;
calib_pos.y = y; calib_pos.y = y;
calib_mode = POSCTL_CALIB_MODE_DELTA; calib_mode = POSCTL_CALIB_MODE_STOP1;
if (OutputWriteStop()) mode = POSCTL_MODE_OFF; if (OutputWriteStop()) mode = POSCTL_MODE_OFF;
gettimeofday (&calib_timestamp, NULL); gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, 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) { void PosCtl::CalibModeDelta(int x, int y) {
struct timeval tv; struct timeval tv;
float timediff; float timediff;
@ -697,12 +718,12 @@ void PosCtl::CalibModeDelta(int x, int y) {
LockMutex(); LockMutex();
calib_rot_v = fp; calib_rot_v = fp;
calc_vec2anglelen(&fp, &calib_rot); 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(); UnLockMutex();
calib_mode = POSCTL_CALIB_MODE_AXIS1; calib_mode = POSCTL_CALIB_MODE_AXIS1START;
calib_pos.x = x;
calib_pos.y = y;
if (OutputWriteStop()) mode = POSCTL_MODE_OFF;
if (OutputWriteValue(0, pid_axis[0].GetMax())) mode = POSCTL_MODE_OFF; if (OutputWriteValue(0, pid_axis[0].GetMax())) mode = POSCTL_MODE_OFF;
gettimeofday (&calib_timestamp, NULL); gettimeofday (&calib_timestamp, NULL);
@ -723,25 +744,23 @@ void PosCtl::CalibModeAxis(int x, int y) {
if (timediff > CALIB_DURATION_AXIS || dist > CALIB_DURATION_DIST) { 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 %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.x = (x - calib_pos.x) / timediff;
fp.y = +(y - calib_pos.y) / timediff; fp.y = (y - calib_pos.y) / timediff;
if (calib_mode == POSCTL_CALIB_MODE_AXIS1) { if (calib_mode == POSCTL_CALIB_MODE_AXIS1M) {
calib_axis1_v = fp - calib_rot_v; calib_axis1_v = fp;
calc_vec2anglelen(&calib_axis1_v, &calib_axis1); calc_vec2anglelen(&calib_axis1_v, &calib_axis1);
if (OutputWriteStop()) mode = POSCTL_MODE_OFF; if (OutputWriteStop()) mode = POSCTL_MODE_OFF;
else if (OutputWriteValue(1, pid_axis[1].GetMax())) mode = POSCTL_MODE_OFF; else if (OutputWriteValue(1, pid_axis[1].GetMax())) mode = POSCTL_MODE_OFF;
} }
else if (calib_mode == POSCTL_CALIB_MODE_AXIS2) { else if (calib_mode == POSCTL_CALIB_MODE_AXIS2M) {
calib_axis2_v = fp - calib_rot_v; calib_axis2_v = fp;
calc_vec2anglelen(&calib_axis2_v, &calib_axis2); calc_vec2anglelen(&calib_axis2_v, &calib_axis2);
if (OutputWriteStart()) mode = POSCTL_MODE_OFF;
} }
calib_mode++; if (calib_mode != POSCTL_CALIB_MODE_OFF) calib_mode++;
calib_pos.x = x;
calib_pos.y = y;
gettimeofday (&calib_timestamp, NULL); gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, NULL); gdk_threads_add_idle(cb_thread_posctl, NULL);
} }
@ -753,13 +772,16 @@ void PosCtl::CalibModeFinish() {
mode = POSCTL_MODE_OFF; mode = POSCTL_MODE_OFF;
calib_mode = POSCTL_CALIB_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); gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, 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) { void PosCtl::Loop (int posx, int posy) {
#ifdef DEBUG_POSCTL #ifdef DEBUG_POSCTL
@ -773,14 +795,16 @@ void PosCtl::Loop (int posx, int posy) {
// calibration mode? // calibration mode?
if (mode == POSCTL_MODE_CALIB) { if (mode == POSCTL_MODE_CALIB) {
switch (calib_mode) { switch (calib_mode) {
case (POSCTL_CALIB_MODE_START): case (POSCTL_CALIB_MODE_STOP1):
CalibModeStart(posx, posy); case (POSCTL_CALIB_MODE_AXIS1START):
case (POSCTL_CALIB_MODE_AXIS2START):
CalibModeWait(posx, posy);
break; break;
case (POSCTL_CALIB_MODE_DELTA): case (POSCTL_CALIB_MODE_DELTAM):
CalibModeDelta(posx, posy); CalibModeDelta(posx, posy);
break; break;
case (POSCTL_CALIB_MODE_AXIS1): case (POSCTL_CALIB_MODE_AXIS1M):
case (POSCTL_CALIB_MODE_AXIS2): case (POSCTL_CALIB_MODE_AXIS2M):
CalibModeAxis(posx, posy); CalibModeAxis(posx, posy);
break; break;
case (POSCTL_CALIB_MODE_FINISH): case (POSCTL_CALIB_MODE_FINISH):
@ -790,6 +814,7 @@ void PosCtl::Loop (int posx, int posy) {
calib_mode = POSCTL_CALIB_MODE_OFF; calib_mode = POSCTL_CALIB_MODE_OFF;
mode = POSCTL_MODE_OFF; mode = POSCTL_MODE_OFF;
gdk_threads_add_idle(cb_thread_posctl, NULL); gdk_threads_add_idle(cb_thread_posctl, NULL);
break;
} }
} }

@ -324,6 +324,7 @@
<property name="receives-default">False</property> <property name="receives-default">False</property>
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">start</property> <property name="valign">start</property>
<property name="active">True</property>
<property name="draw-indicator">True</property> <property name="draw-indicator">True</property>
<property name="group">detect-pos-cboff</property> <property name="group">detect-pos-cboff</property>
<signal name="toggled" handler="cb_detect_detecttype" swapped="no"/> <signal name="toggled" handler="cb_detect_detecttype" swapped="no"/>

Loading…
Cancel
Save