|
|
@ -21,6 +21,8 @@
|
|
|
|
#include "error.h"
|
|
|
|
#include "error.h"
|
|
|
|
|
|
|
|
|
|
|
|
extern PosCtl posctl;
|
|
|
|
extern PosCtl posctl;
|
|
|
|
|
|
|
|
extern Simulation simulation;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern GtkBuilder *_builder_; // work around for threads
|
|
|
|
extern GtkBuilder *_builder_; // work around for threads
|
|
|
|
GtkWidget *posctl_rot_da = NULL;
|
|
|
|
GtkWidget *posctl_rot_da = NULL;
|
|
|
@ -452,6 +454,7 @@ PosCtl::PosCtl() {
|
|
|
|
calib_axis2max_len = 0.0;
|
|
|
|
calib_axis2max_len = 0.0;
|
|
|
|
device_fd = -1;
|
|
|
|
device_fd = -1;
|
|
|
|
device = "";
|
|
|
|
device = "";
|
|
|
|
|
|
|
|
device_type = POSCTL_DEVTYPE_TTY;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
@ -542,14 +545,18 @@ void PosCtl::CalibModeDelta(int x, int y) {
|
|
|
|
OutputWriteStart();
|
|
|
|
OutputWriteStart();
|
|
|
|
|
|
|
|
|
|
|
|
fp.x = (x - calib_pos.x) / (float)timediff;
|
|
|
|
fp.x = (x - calib_pos.x) / (float)timediff;
|
|
|
|
fp.y = (y - calib_pos.y) / (float)timediff;
|
|
|
|
fp.y = -(y - calib_pos.y) / (float)timediff;
|
|
|
|
|
|
|
|
|
|
|
|
LockMutex();
|
|
|
|
LockMutex();
|
|
|
|
calib_rot_angle = atan2(fp.x, fp.y) * 180.0 / M_PI;
|
|
|
|
calib_rot_angle = atan2(fp.x, fp.y) * 180.0 / M_PI;
|
|
|
|
|
|
|
|
while (calib_rot_angle < 0.0) calib_rot_angle += 360.0;
|
|
|
|
calib_rot_len = sqrt(fp.x * fp.x + fp.y * fp.y);
|
|
|
|
calib_rot_len = sqrt(fp.x * fp.x + fp.y * fp.y);
|
|
|
|
UnLockMutex();
|
|
|
|
UnLockMutex();
|
|
|
|
|
|
|
|
|
|
|
|
calib_mode = POSCTL_CALIB_MODE_AXIS1_MI;
|
|
|
|
calib_mode = POSCTL_CALIB_MODE_AXIS1_MI;
|
|
|
|
|
|
|
|
calib_pos.x = x;
|
|
|
|
|
|
|
|
calib_pos.y = y;
|
|
|
|
|
|
|
|
|
|
|
|
OutputWriteValue(0, a1min);
|
|
|
|
OutputWriteValue(0, a1min);
|
|
|
|
gettimeofday (&calib_timestamp, NULL);
|
|
|
|
gettimeofday (&calib_timestamp, NULL);
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
|
gdk_threads_add_idle(cb_thread_posctl, NULL);
|
|
|
@ -561,6 +568,7 @@ void PosCtl::CalibModeAxis(int x, int y) {
|
|
|
|
struct timeval tv;
|
|
|
|
struct timeval tv;
|
|
|
|
float timediff;
|
|
|
|
float timediff;
|
|
|
|
double a1min, a1max, a2min, a2max;
|
|
|
|
double a1min, a1max, a2min, a2max;
|
|
|
|
|
|
|
|
position_f_2d fp;
|
|
|
|
|
|
|
|
|
|
|
|
gettimeofday (&tv, NULL);
|
|
|
|
gettimeofday (&tv, NULL);
|
|
|
|
timediff = (float)(tv.tv_sec - calib_timestamp.tv_sec) + ((tv.tv_usec - calib_timestamp.tv_usec) / 1000000.0);
|
|
|
|
timediff = (float)(tv.tv_sec - calib_timestamp.tv_sec) + ((tv.tv_usec - calib_timestamp.tv_usec) / 1000000.0);
|
|
|
@ -571,20 +579,37 @@ void PosCtl::CalibModeAxis(int x, int y) {
|
|
|
|
pid_axis[0].GetParam(&a1min, &a1max, NULL, NULL, NULL);
|
|
|
|
pid_axis[0].GetParam(&a1min, &a1max, NULL, NULL, NULL);
|
|
|
|
pid_axis[1].GetParam(&a2min, &a2max, NULL, NULL, NULL);
|
|
|
|
pid_axis[1].GetParam(&a2min, &a2max, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fp.x = (x - calib_pos.x) / (float)timediff;
|
|
|
|
|
|
|
|
fp.y = -(y - calib_pos.y) / (float)timediff;
|
|
|
|
|
|
|
|
|
|
|
|
if (calib_mode == POSCTL_CALIB_MODE_AXIS1_MI) {
|
|
|
|
if (calib_mode == POSCTL_CALIB_MODE_AXIS1_MI) {
|
|
|
|
|
|
|
|
calib_axis1min_angle = atan2(fp.x, fp.y) * 180.0 / M_PI;
|
|
|
|
|
|
|
|
while (calib_axis1min_angle < 0.0) calib_axis1min_angle += 360.0;
|
|
|
|
|
|
|
|
calib_axis1min_len = sqrt(fp.x * fp.x + fp.y * fp.y);
|
|
|
|
OutputWriteValue(0, a1max);
|
|
|
|
OutputWriteValue(0, a1max);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (calib_mode == POSCTL_CALIB_MODE_AXIS1_MA) {
|
|
|
|
else if (calib_mode == POSCTL_CALIB_MODE_AXIS1_MA) {
|
|
|
|
OutputWriteValue(0, a2min);
|
|
|
|
calib_axis1max_angle = atan2(fp.x, fp.y) * 180.0 / M_PI;
|
|
|
|
|
|
|
|
while (calib_axis1max_angle < 0.0) calib_axis1max_angle += 360.0;
|
|
|
|
|
|
|
|
calib_axis1max_len = sqrt(fp.x * fp.x + fp.y * fp.y);
|
|
|
|
|
|
|
|
OutputWriteValue(1, a2min);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (calib_mode == POSCTL_CALIB_MODE_AXIS2_MI) {
|
|
|
|
else if (calib_mode == POSCTL_CALIB_MODE_AXIS2_MI) {
|
|
|
|
OutputWriteValue(0, a2max);
|
|
|
|
calib_axis2min_angle = atan2(fp.x, fp.y) * 180.0 / M_PI;
|
|
|
|
|
|
|
|
while (calib_axis2min_angle < 0.0) calib_axis2min_angle += 360.0;
|
|
|
|
|
|
|
|
calib_axis2min_len = sqrt(fp.x * fp.x + fp.y * fp.y);
|
|
|
|
|
|
|
|
OutputWriteValue(1, a2max);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (calib_mode == POSCTL_CALIB_MODE_AXIS2_MA) {
|
|
|
|
else if (calib_mode == POSCTL_CALIB_MODE_AXIS2_MA) {
|
|
|
|
|
|
|
|
calib_axis2max_angle = atan2(fp.x, fp.y) * 180.0 / M_PI;
|
|
|
|
|
|
|
|
while (calib_axis2max_angle < 0.0) calib_axis2max_angle += 360.0;
|
|
|
|
|
|
|
|
calib_axis2max_len = sqrt(fp.x * fp.x + fp.y * fp.y);
|
|
|
|
OutputWriteStart(); // reset speed output to 50%
|
|
|
|
OutputWriteStart(); // reset speed output to 50%
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
calib_mode++;
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -635,8 +660,12 @@ void PosCtl::Loop (int posx, int posy) {
|
|
|
|
|
|
|
|
|
|
|
|
void PosCtl::SetDevice (std::string d) {
|
|
|
|
void PosCtl::SetDevice (std::string d) {
|
|
|
|
printf ("%s:%d %s new device:%s\n", __FILE__, __LINE__, __FUNCTION__, d.c_str());
|
|
|
|
printf ("%s:%d %s new device:%s\n", __FILE__, __LINE__, __FUNCTION__, d.c_str());
|
|
|
|
|
|
|
|
|
|
|
|
OutputClose();
|
|
|
|
OutputClose();
|
|
|
|
device = d;
|
|
|
|
device = d;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (d.compare ("SIMULATION") == 0) device_type = POSCTL_DEVTYPE_SIM;
|
|
|
|
|
|
|
|
else device_type = POSCTL_DEVTYPE_TTY;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -718,6 +747,11 @@ int PosCtl::OutputWriteValue (int axis, double value) {
|
|
|
|
char outbuf[255];
|
|
|
|
char outbuf[255];
|
|
|
|
printf ("%s:%d %s Axis %d Value:%f\n", __FILE__, __LINE__, __FUNCTION__, axis, value);
|
|
|
|
printf ("%s:%d %s Axis %d Value:%f\n", __FILE__, __LINE__, __FUNCTION__, axis, value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (device_type == POSCTL_DEVTYPE_SIM) {
|
|
|
|
|
|
|
|
simulation.AxisSetValue(axis, value);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (device_fd <= 0) if (OutputOpen() != 0) return -1;
|
|
|
|
if (device_fd <= 0) if (OutputOpen() != 0) return -1;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -742,6 +776,11 @@ int PosCtl::OutputWriteStop () {
|
|
|
|
|
|
|
|
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (device_type == POSCTL_DEVTYPE_SIM) {
|
|
|
|
|
|
|
|
simulation.AxisStop();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
snprintf (outbuf, 255, ":Q#");
|
|
|
|
snprintf (outbuf, 255, ":Q#");
|
|
|
|
if (device_fd <= 0) if (OutputOpen() != 0) return -1;
|
|
|
|
if (device_fd <= 0) if (OutputOpen() != 0) return -1;
|
|
|
|
WriteTTY(outbuf);
|
|
|
|
WriteTTY(outbuf);
|
|
|
|