|
|
|
@ -46,6 +46,8 @@ struct AxisHistory {
|
|
|
|
|
struct AxisHistory axis_history[2][AXIS_HISTORY_CNT];
|
|
|
|
|
int axis_history_pos[2] = { 0, 0 };
|
|
|
|
|
|
|
|
|
|
struct PosCtl_ThreadData posctl_calib_debug;
|
|
|
|
|
|
|
|
|
|
void axis_history_add(int axis, double diff, double out) {
|
|
|
|
|
if (axis > 1 || axis < 0) return;
|
|
|
|
|
|
|
|
|
@ -99,8 +101,16 @@ void cb_posctl_btncontrol (GtkWidget *widget, gpointer data) {
|
|
|
|
|
posctl_gui_update();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cb_menu_set_displaycalibdata(GtkCheckMenuItem *checkmenuitem, gpointer user_data) {
|
|
|
|
|
if (gtk_check_menu_item_get_active(checkmenuitem) == TRUE) config.SetCalibrationShowData(true);
|
|
|
|
|
else config.SetCalibrationShowData(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cb_posctl_show (GtkWidget *widget, gpointer data) {
|
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
posctl_calib_debug.mode = -1;
|
|
|
|
|
posctl_gui_update();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -569,6 +579,7 @@ void posctl_gui_update() {
|
|
|
|
|
gboolean cb_thread_posctl (gpointer data) {
|
|
|
|
|
GtkWidget *da1 = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_da_axis1"));
|
|
|
|
|
GtkWidget *da2 = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_da_axis2"));
|
|
|
|
|
GtkWidget *tg = NULL;
|
|
|
|
|
|
|
|
|
|
posctl_gui_update();
|
|
|
|
|
|
|
|
|
@ -579,6 +590,47 @@ gboolean cb_thread_posctl (gpointer data) {
|
|
|
|
|
posctl_rot_da = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_da_rotation"));
|
|
|
|
|
gdk_window_invalidate_rect(gtk_widget_get_window(posctl_rot_da), NULL, true);
|
|
|
|
|
|
|
|
|
|
if (data != NULL) {
|
|
|
|
|
posctl_calib_debug = *(struct PosCtl_ThreadData*) data;
|
|
|
|
|
free (data);
|
|
|
|
|
|
|
|
|
|
switch (posctl_calib_debug.mode) {
|
|
|
|
|
case (POSCTL_CALIB_MODE_OFF):
|
|
|
|
|
tg = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cal_mode_off"));
|
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tg), true);
|
|
|
|
|
break;
|
|
|
|
|
case (POSCTL_CALIB_MODE_STOP1):
|
|
|
|
|
tg = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cal_mode_rs"));
|
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tg), true);
|
|
|
|
|
break;
|
|
|
|
|
case (POSCTL_CALIB_MODE_DELTAM):
|
|
|
|
|
tg = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cal_mode_r"));
|
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tg), true);
|
|
|
|
|
break;
|
|
|
|
|
case (POSCTL_CALIB_MODE_AXIS1START):
|
|
|
|
|
tg = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cal_mode_a1s"));
|
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tg), true);
|
|
|
|
|
break;
|
|
|
|
|
case (POSCTL_CALIB_MODE_AXIS1M):
|
|
|
|
|
tg = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cal_mode_a1"));
|
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tg), true);
|
|
|
|
|
break;
|
|
|
|
|
case (POSCTL_CALIB_MODE_AXIS2START):
|
|
|
|
|
tg = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cal_mode_a2s"));
|
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tg), true);
|
|
|
|
|
break;
|
|
|
|
|
case (POSCTL_CALIB_MODE_AXIS2M):
|
|
|
|
|
tg = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cal_mode_a2"));
|
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tg), true);
|
|
|
|
|
break;
|
|
|
|
|
case (POSCTL_CALIB_MODE_FINISH):
|
|
|
|
|
tg = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cal_mode_f"));
|
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tg), true);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
};
|
|
|
|
@ -607,7 +659,51 @@ PosCtl::PosCtl() {
|
|
|
|
|
void PosCtl::Stop() {
|
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
mode = POSCTL_MODE_OFF;
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void PosCtl::NotifyGtk() {
|
|
|
|
|
int i;
|
|
|
|
|
struct PosCtl_ThreadData *data = (struct PosCtl_ThreadData*) malloc(sizeof(struct PosCtl_ThreadData));
|
|
|
|
|
threaddata.mode = calib_mode;
|
|
|
|
|
switch (calib_mode) {
|
|
|
|
|
case(POSCTL_CALIB_MODE_STOP1):
|
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
|
|
|
threaddata.c[i].x = threaddata.c[i].y = -1;
|
|
|
|
|
threaddata.a1[1].x = threaddata.a1[i].y = -1;
|
|
|
|
|
threaddata.a2[1].x = threaddata.a2[i].y = -1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case(POSCTL_CALIB_MODE_DELTAM):
|
|
|
|
|
threaddata.c[0].x = calib_pos.x;
|
|
|
|
|
threaddata.c[0].y = calib_pos.y;
|
|
|
|
|
break;
|
|
|
|
|
case(POSCTL_CALIB_MODE_AXIS1START):
|
|
|
|
|
threaddata.c[1].x = calib_pos.x;
|
|
|
|
|
threaddata.c[1].y = calib_pos.y;
|
|
|
|
|
break;
|
|
|
|
|
case(POSCTL_CALIB_MODE_AXIS1M):
|
|
|
|
|
threaddata.a1[0].x = calib_pos.x;
|
|
|
|
|
threaddata.a1[0].y = calib_pos.y;
|
|
|
|
|
break;
|
|
|
|
|
case(POSCTL_CALIB_MODE_AXIS2START):
|
|
|
|
|
threaddata.a1[1].x = calib_pos.x;
|
|
|
|
|
threaddata.a1[1].y = calib_pos.y;
|
|
|
|
|
break;
|
|
|
|
|
case(POSCTL_CALIB_MODE_AXIS2M):
|
|
|
|
|
threaddata.a2[0].x = calib_pos.x;
|
|
|
|
|
threaddata.a2[0].y = calib_pos.y;
|
|
|
|
|
break;
|
|
|
|
|
case(POSCTL_CALIB_MODE_FINISH):
|
|
|
|
|
threaddata.a2[1].x = calib_pos.x;
|
|
|
|
|
threaddata.a2[1].y = calib_pos.y;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
*(struct PosCtl_ThreadData*)data = threaddata;
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -623,7 +719,7 @@ void PosCtl::StartCalibration() {
|
|
|
|
|
mode = POSCTL_MODE_CALIB;
|
|
|
|
|
calib_mode = POSCTL_CALIB_MODE_STOP1;
|
|
|
|
|
gettimeofday (&calib_timestamp, NULL);
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PosCtl::StartControl() {
|
|
|
|
@ -637,7 +733,7 @@ void PosCtl::StartControl() {
|
|
|
|
|
pid_axis[0].Start();
|
|
|
|
|
pid_axis[1].Start();
|
|
|
|
|
mode = POSCTL_MODE_CONTROL;
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -673,7 +769,7 @@ void PosCtl::CalibModeStart(int x, int y) {
|
|
|
|
|
calib_mode = POSCTL_CALIB_MODE_STOP1;
|
|
|
|
|
if (OutputWriteStop()) mode = POSCTL_MODE_OFF;
|
|
|
|
|
gettimeofday (&calib_timestamp, NULL);
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -692,7 +788,7 @@ void PosCtl::CalibModeWait(int x, int y) {
|
|
|
|
|
calib_pos.y = y;
|
|
|
|
|
|
|
|
|
|
gettimeofday (&calib_timestamp, NULL);
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -727,7 +823,9 @@ void PosCtl::CalibModeDelta(int x, int y) {
|
|
|
|
|
if (OutputWriteValue(0, pid_axis[0].GetMax())) mode = POSCTL_MODE_OFF;
|
|
|
|
|
|
|
|
|
|
gettimeofday (&calib_timestamp, NULL);
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
calib_pos.x = x;
|
|
|
|
|
calib_pos.y = y;
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -762,7 +860,10 @@ void PosCtl::CalibModeAxis(int x, int y) {
|
|
|
|
|
|
|
|
|
|
if (calib_mode != POSCTL_CALIB_MODE_OFF) calib_mode++;
|
|
|
|
|
gettimeofday (&calib_timestamp, NULL);
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
|
|
|
|
|
calib_pos.x = x;
|
|
|
|
|
calib_pos.y = y;
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -776,7 +877,7 @@ void PosCtl::CalibModeFinish() {
|
|
|
|
|
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);
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -813,7 +914,7 @@ void PosCtl::Loop (int posx, int posy) {
|
|
|
|
|
default:
|
|
|
|
|
calib_mode = POSCTL_CALIB_MODE_OFF;
|
|
|
|
|
mode = POSCTL_MODE_OFF;
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -858,7 +959,7 @@ void PosCtl::Loop (int posx, int posy) {
|
|
|
|
|
axis_history_add(1, axis_pv[1], axis_op[1]);
|
|
|
|
|
|
|
|
|
|
UnLockMutex();
|
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
|
NotifyGtk();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else {
|
|
|
|
|