need wait steps for motor control.

master
Steffen Pohle 2 years ago
parent 94043ab330
commit da15e98d2d

@ -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();

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

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

Loading…
Cancel
Save