preparing the position control. PID settings will be saved into the configuration file. Writing the output is still missing and the PID logic.

master
Steffen Pohle 3 years ago
parent b74fe3af68
commit fa92473951

@ -2,12 +2,14 @@
#include "configuration.h" #include "configuration.h"
#include "video.h" #include "video.h"
#include "gui.h" #include "gui.h"
#include "detect.h"
#include <stdlib.h> #include <stdlib.h>
#include <string> #include <string>
// extern VideoDev *videodev; // extern VideoDev *videodev;
extern GtkBuilder *_builder_; // work around for threads extern GtkBuilder *_builder_; // work around for threads
extern PosCtl posctl;
Configuration::Configuration() { Configuration::Configuration() {
@ -64,6 +66,9 @@ void Configuration::SaveConfig(std::string filename) {
GtkWidget *cb; GtkWidget *cb;
GtkWidget *cbe; GtkWidget *cbe;
std::string s = setlocale(LC_ALL, NULL);
setlocale (LC_ALL, "C");
// //
// Add resolution, format and video device to config json element // Add resolution, format and video device to config json element
cb = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videores")); cb = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videores"));
@ -76,13 +81,32 @@ void Configuration::SaveConfig(std::string filename) {
cbe = gtk_bin_get_child(GTK_BIN(cb)); cbe = gtk_bin_get_child(GTK_BIN(cb));
jp.AddObject("device", (string) gtk_entry_get_text(GTK_ENTRY(cbe))); jp.AddObject("device", (string) gtk_entry_get_text(GTK_ENTRY(cbe)));
//
// save posctl settings
double amin, amax, akp, aki, akd;
JSONParse jaxis;
posctl.LockMutex();
for (i = 0; i < 2; i++) {
posctl.GetAxisParam(i, &amin, &amax, &akp, &aki, &akd);
jaxis.Clear();
jaxis.AddObject("min", amin);
jaxis.AddObject("max", amax);
jaxis.AddObject("kp", akp);
jaxis.AddObject("ki", aki);
jaxis.AddObject("kd", akd);
printf ("%s:%d save config axis %d Out Range: %f - %f kP:%f kI:%f kD:%f\n",
__FILE__, __LINE__, i, amin, amax, akp, aki, akd);
jp.AddObject("posctl_axis" + to_string(i), jaxis);
}
jp.AddObject("posctl_device", posctl.GetDevice());
posctl.UnLockMutex();
// //
// histogram settings and debayer mode // histogram settings and debayer mode
jp.AddObject("histogram_log", histogram_log); jp.AddObject("histogram_log", histogram_log);
jp.AddObject("debayer_mode", debayer_mode); jp.AddObject("debayer_mode", debayer_mode);
// //
// save button config // save button config
for (i = 0; i < BTN_PRESET_MAX; i++) { for (i = 0; i < BTN_PRESET_MAX; i++) {
@ -135,7 +159,6 @@ void Configuration::SaveConfig(std::string filename) {
break; break;
} }
GtkWidget *wnd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), name.c_str())); GtkWidget *wnd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), name.c_str()));
if (wnd) { if (wnd) {
g_object_get (wnd, "visible", &show, NULL); g_object_get (wnd, "visible", &show, NULL);
@ -157,6 +180,8 @@ void Configuration::SaveConfig(std::string filename) {
printf ("%s:%d %s could not save to file [%s] Error: %s\n", __FILE__, __LINE__, __FUNCTION__, printf ("%s:%d %s could not save to file [%s] Error: %s\n", __FILE__, __LINE__, __FUNCTION__,
filename.c_str(), strerror(errno)); filename.c_str(), strerror(errno));
} }
setlocale (LC_ALL, s.c_str());
}; };
@ -166,6 +191,9 @@ void Configuration::LoadConfig(std::string filename) {
int i; int i;
JSONElement je; JSONElement je;
std::string s = setlocale(LC_ALL, NULL);
setlocale (LC_ALL, "C");
if (jp.LoadFromFile(filename)) { if (jp.LoadFromFile(filename)) {
printf ("%s:%d %s could not load from file [%s] Error: %s\n", __FILE__, __LINE__, __FUNCTION__, printf ("%s:%d %s could not load from file [%s] Error: %s\n", __FILE__, __LINE__, __FUNCTION__,
filename.c_str(), strerror(errno)); filename.c_str(), strerror(errno));
@ -187,6 +215,28 @@ void Configuration::LoadConfig(std::string filename) {
gtk_entry_set_text(GTK_ENTRY(cbdevice), vstr.c_str()); gtk_entry_set_text(GTK_ENTRY(cbdevice), vstr.c_str());
} }
//
// load posctl
double amin, amax, akp, aki, akd;
JSONParse jaxis;
posctl.LockMutex();
for (i = 0; i < 2; i++) {
if (jp.GetObject("posctl_axis"+to_string(i), &jaxis)) {
jaxis.GetValueDouble("min", &amin);
jaxis.GetValueDouble("max", &amax);
jaxis.GetValueDouble("kp", &akp);
jaxis.GetValueDouble("ki", &aki);
jaxis.GetValueDouble("kd", &akd);
}
printf ("%s:%d load config axis %d Out Range: %f - %f kP:%f kI:%f kD:%f\n",
__FILE__, __LINE__, i, amin, amax, akp, aki, akd);
posctl.SetAxisParam(i, amin, amax, akp, aki, akd);
}
if (jp.GetValue("posctl_device", &vstr))
posctl.SetDevice(vstr);
posctl.UnLockMutex();
jp.GetValueInt("histogram_log", &i); jp.GetValueInt("histogram_log", &i);
SetHistogramLog(i); SetHistogramLog(i);
@ -295,6 +345,11 @@ void Configuration::LoadConfig(std::string filename) {
} }
} }
} }
setlocale (LC_ALL, s.c_str());
// we need to update the gui so floating numbers will displayed with the correct
// language setting.
gdk_threads_add_idle(cb_thread_posctl, NULL);
}; };

@ -52,6 +52,8 @@ class PosCtl {
GMutex mutex; GMutex mutex;
int mode; int mode;
PID pid_axis[2]; PID pid_axis[2];
std::string device;
int device_fd;
struct timeval calib_timestamp; struct timeval calib_timestamp;
int calib_mode; int calib_mode;
position_2d calib_pos; position_2d calib_pos;
@ -61,6 +63,8 @@ class PosCtl {
void CalibModeAxis(int x, int y); void CalibModeAxis(int x, int y);
void CalibModeFinish(); void CalibModeFinish();
void OutputClose();
void OutputOpen();
public: public:
PosCtl(); PosCtl();
~PosCtl() {}; ~PosCtl() {};
@ -76,6 +80,8 @@ class PosCtl {
double calib_axis2_lenmi; double calib_axis2_lenmi;
double calib_axis2_lenma; double calib_axis2_lenma;
double out[2];
void LockMutex() { g_mutex_lock(&mutex); }; void LockMutex() { g_mutex_lock(&mutex); };
void UnLockMutex() { g_mutex_unlock(&mutex); }; void UnLockMutex() { g_mutex_unlock(&mutex); };
@ -85,7 +91,13 @@ class PosCtl {
int GetMode () { return mode; }; int GetMode () { return mode; };
void SetAxisParam (int axis, double min, double max, double k, double i, double d); void SetAxisParam (int axis, double min, double max, double k, double i, double d);
void GetAxisParam (int axis, double *min, double *max, double *k, double *i, double *d); void GetAxisParam (int axis, double *min, double *max, double *k, double *i, double *d);
void SetDevice(std::string d);
std::string GetDevice() { return device; };
void Loop (int posx, int posy); void Loop (int posx, int posy);
void OutputWriteValue (int axis, double value);
void OutputWriteStop (int axis);
void OutputWriteStart (int axis);
}; };

@ -125,11 +125,16 @@ G_MODULE_EXPORT void cb_histogram_show_window (GtkWidget *widget, gpointer data)
// //
// position control elements // position control elements
G_MODULE_EXPORT void cb_posctl_show (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_posctl_show_window (GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cb_posctl_show_window (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_posctl_btncalib (GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cb_posctl_btncalib (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_posctl_angles_draw (GtkWidget *area, cairo_t *cr, int w, int h, gpointer data); G_MODULE_EXPORT void cb_posctl_angles_draw (GtkWidget *area, cairo_t *cr, int w, int h, gpointer data);
G_MODULE_EXPORT void cb_posctl_entryanglelen (GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cb_posctl_entryanglelen (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_posctl_axis_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer data); G_MODULE_EXPORT void cb_posctl_axis_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer data);
G_MODULE_EXPORT void cb_posctl_change_entry (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_posctl_btn_axismove (GtkWidget *widget, gpointer data);
// //
// menu elements // menu elements

@ -210,6 +210,17 @@ int JSONParse::GetValueInt(string varname, int *dest) {
}; };
int JSONParse::GetValueDouble(string varname, double *dest) {
string s;
int res = GetValue(varname, &s);
if (res) {
*dest = atof (s.c_str());
return 1;
}
return 0;
};
int JSONParse::GetValueInt64(string varname, int64_t *dest) { int JSONParse::GetValueInt64(string varname, int64_t *dest) {
string s; string s;
int res = GetValue(varname, &s); int res = GetValue(varname, &s);
@ -521,4 +532,3 @@ string JSONElement::GetString () {
return output; return output;
}; };

@ -54,6 +54,7 @@ public:
int GetValue(string varname, string *dest); int GetValue(string varname, string *dest);
int GetValueInt(string varname, int *dest); int GetValueInt(string varname, int *dest);
int GetValueDouble(string varname, double *dest);
int GetValueInt64(string varname, int64_t *dest); int GetValueInt64(string varname, int64_t *dest);
int GetObject(string varname, JSONParse *dest); int GetObject(string varname, JSONParse *dest);

@ -134,11 +134,11 @@ void PID::SetParam (double mi, double ma, double p, double i, double d) {
void PID::GetParam (double *mi, double *ma, double *p, double *i, double *d) { void PID::GetParam (double *mi, double *ma, double *p, double *i, double *d) {
*p = Kp; if (p != NULL) *p = Kp;
*i = Ki; if (i != NULL) *i = Ki;
*d = Kd; if (d != NULL) *d = Kd;
*mi = Min; if (mi != NULL) *mi = Min;
*ma = Max; if (ma != NULL) *ma = Max;
}; };

@ -5,9 +5,9 @@ class PID {
private: private:
double Min, Max; double Min, Max;
double Kp; // proportional factor double Kp; // proportional factor
double Ki; // integral factor double Ki; // integral factor
double Kd; // derivative factor double Kd; // derivative factor
double Integral; double Integral;
double PreviousError; double PreviousError;
int64_t PreviousTime; int64_t PreviousTime;

@ -34,6 +34,7 @@ void cb_posctl_show_window (GtkWidget *widget, gpointer data) {
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
GtkWidget *wnd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "window-posctl")); GtkWidget *wnd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "window-posctl"));
gtk_widget_show(wnd); gtk_widget_show(wnd);
} }
@ -48,6 +49,81 @@ void cb_posctl_btncalib (GtkWidget *widget, gpointer data) {
posctl_gui_update(); posctl_gui_update();
} }
void cb_posctl_show (GtkWidget *widget, gpointer data) {
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
posctl_gui_update();
}
void cb_posctl_btn_axismove (GtkWidget *widget, gpointer data) {
GtkWidget *btn_a1min = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a1_min"));
GtkWidget *btn_a1center = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a1_center"));
GtkWidget *btn_a1max = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a1_max"));
GtkWidget *btn_a2min = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a2_min"));
GtkWidget *btn_a2center = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a2_center"));
GtkWidget *btn_a2max = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a2_max"));
double a1min, a2min, a1max, a2max;
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
posctl.GetAxisParam(0, &a1min, &a1max, NULL, NULL, NULL);
posctl.GetAxisParam(1, &a2min, &a2max, NULL, NULL, NULL);
if (widget == btn_a1min) posctl.OutputWriteValue(0, a1min);
else if (widget == btn_a1center) posctl.OutputWriteValue(0, (a1max-a1min)/2.0+a1min);
else if (widget == btn_a1max) posctl.OutputWriteValue(0, a1max);
else if (widget == btn_a2min) posctl.OutputWriteValue(1, a1min);
else if (widget == btn_a2center) posctl.OutputWriteValue(1, (a1max-a1min)/2.0+a1min);
else if (widget == btn_a2max) posctl.OutputWriteValue(1, a1max);
posctl_gui_update();
}
void cb_posctl_change_entry (GtkWidget *widget, gpointer data) {
double a1min, a1max, a1p, a1i, a1d;
double a2min, a2max, a2p, a2i, a2d;
GtkWidget *e_posdevice = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_device"));
GtkWidget *a1_min = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_min"));
GtkWidget *a1_max = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_max"));
GtkWidget *a1_kp = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_kp"));
GtkWidget *a1_ki = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_ki"));
GtkWidget *a1_kd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_kd"));
GtkWidget *a2_min = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_min"));
GtkWidget *a2_max = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_max"));
GtkWidget *a2_kp = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_kp"));
GtkWidget *a2_ki = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_ki"));
GtkWidget *a2_kd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_kd"));
const char *s;
posctl.GetAxisParam(0, &a1min, &a1max, &a1p, &a1i, &a1d);
posctl.GetAxisParam(1, &a2min, &a2max, &a2p, &a2i, &a2d);
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
s = gtk_entry_get_text(GTK_ENTRY(widget));
posctl.LockMutex();
if (e_posdevice == widget) posctl.SetDevice(s);
else if (a1_min == widget) a1min = atof(s);
else if (a1_max == widget) a1max = atof(s);
else if (a1_kp == widget) a1p = atof(s);
else if (a1_ki == widget) a1i = atof(s);
else if (a1_kd == widget) a1d = atof(s);
else if (a2_min == widget) a2min = atof(s);
else if (a2_max == widget) a2max = atof(s);
else if (a2_kp == widget) a2p = atof(s);
else if (a2_ki == widget) a2i = atof(s);
else if (a2_kd == widget) a2d = atof(s);
posctl.SetAxisParam(0, a1min, a1max, a1p, a1i, a1d);
posctl.SetAxisParam(1, a2min, a2max, a2p, a2i, a2d);
posctl.UnLockMutex();
}
void cb_posctl_angles_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer data) { void cb_posctl_angles_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer data) {
int clientw, clienth; int clientw, clienth;
@ -218,6 +294,7 @@ void cb_posctl_axis_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer da
*/ */
void posctl_gui_update() { void posctl_gui_update() {
char txt[255]; char txt[255];
double kp, ki, kd, mi, ma;
GtkWidget *caliblabel = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_calib_label")); GtkWidget *caliblabel = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_calib_label"));
@ -235,12 +312,40 @@ void posctl_gui_update() {
GtkWidget *e_cal_a2lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenmi")); GtkWidget *e_cal_a2lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenmi"));
GtkWidget *e_cal_a2lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenma")); GtkWidget *e_cal_a2lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenma"));
GtkWidget *e_posdevice = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_device"));
GtkWidget *btn_a1min = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a1_min"));
GtkWidget *btn_a1center = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a1_center"));
GtkWidget *btn_a1max = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a1_max"));
GtkWidget *btn_a2min = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a2_min"));
GtkWidget *btn_a2center = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a2_center"));
GtkWidget *btn_a2max = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_a2_max"));
GtkWidget *a1_min = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_min"));
GtkWidget *a1_max = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_max"));
GtkWidget *a1_kp = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_kp"));
GtkWidget *a1_ki = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_ki"));
GtkWidget *a1_kd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1_kd"));
GtkWidget *a1_out = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_lb_outx"));
GtkWidget *a2_min = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_min"));
GtkWidget *a2_max = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_max"));
GtkWidget *a2_kp = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_kp"));
GtkWidget *a2_ki = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_ki"));
GtkWidget *a2_kd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2_kd"));
GtkWidget *a2_out = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_lb_outy"));
posctl.LockMutex(); posctl.LockMutex();
int m = posctl.GetMode(); int m = posctl.GetMode();
if (m == POSCTL_MODE_OFF) { if (m == POSCTL_MODE_OFF) {
gtk_widget_set_sensitive(btnclib, true); gtk_widget_set_sensitive(btnclib, true);
gtk_widget_set_sensitive(btn_a1min, true);
gtk_widget_set_sensitive(btn_a1center, true);
gtk_widget_set_sensitive(btn_a1max, true);
gtk_widget_set_sensitive(btn_a2min, true);
gtk_widget_set_sensitive(btn_a2center, true);
gtk_widget_set_sensitive(btn_a2max, true);
gtk_widget_set_sensitive(cbenable, true); gtk_widget_set_sensitive(cbenable, true);
gtk_widget_set_sensitive(e_posdevice, true);
gtk_label_set_label(GTK_LABEL(caliblabel), (char *) ""); gtk_label_set_label(GTK_LABEL(caliblabel), (char *) "");
} }
else { else {
@ -249,6 +354,13 @@ void posctl_gui_update() {
} }
gtk_widget_set_sensitive(btnclib, false); gtk_widget_set_sensitive(btnclib, false);
gtk_widget_set_sensitive(cbenable, false); gtk_widget_set_sensitive(cbenable, false);
gtk_widget_set_sensitive(btn_a1min, false);
gtk_widget_set_sensitive(btn_a1center, false);
gtk_widget_set_sensitive(btn_a1max, false);
gtk_widget_set_sensitive(btn_a2min, false);
gtk_widget_set_sensitive(btn_a2center, false);
gtk_widget_set_sensitive(btn_a2max, false);
gtk_widget_set_sensitive(e_posdevice, false);
} }
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_rot_angle); strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_rot_angle);
@ -270,6 +382,35 @@ void posctl_gui_update() {
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_axis2_lenma); strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_axis2_lenma);
gtk_entry_set_text (GTK_ENTRY(e_cal_a2lenma), txt); gtk_entry_set_text (GTK_ENTRY(e_cal_a2lenma), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.out[0]);
gtk_label_set_text(GTK_LABEL(a1_out), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.out[1]);
gtk_label_set_text(GTK_LABEL(a2_out), txt);
posctl.GetAxisParam(0, &mi, &ma, &kp, &ki, &kd);
strfromd (txt, sizeof(txt-1), (const char *)"%f", mi);
gtk_entry_set_text (GTK_ENTRY(a1_min), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", ma);
gtk_entry_set_text (GTK_ENTRY(a1_max), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", kp);
gtk_entry_set_text (GTK_ENTRY(a1_kp), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", ki);
gtk_entry_set_text (GTK_ENTRY(a1_ki), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", kd);
gtk_entry_set_text (GTK_ENTRY(a1_kd), txt);
posctl.GetAxisParam(1, &mi, &ma, &kp, &ki, &kd);
strfromd (txt, sizeof(txt-1), (const char *)"%f", mi);
gtk_entry_set_text (GTK_ENTRY(a2_min), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", ma);
gtk_entry_set_text (GTK_ENTRY(a2_max), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", kp);
gtk_entry_set_text (GTK_ENTRY(a2_kp), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", ki);
gtk_entry_set_text (GTK_ENTRY(a2_ki), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", kd);
gtk_entry_set_text (GTK_ENTRY(a2_kd), txt);
posctl.UnLockMutex(); posctl.UnLockMutex();
} }
@ -296,9 +437,10 @@ PosCtl::PosCtl() {
calib_axis2_angle = 0.0; calib_axis2_angle = 0.0;
calib_axis2_lenmi = 0.0; calib_axis2_lenmi = 0.0;
calib_axis2_lenma = 0.0; calib_axis2_lenma = 0.0;
device_fd = -1;
device = "";
}; };
/* /*
* stop the control or the calibration * stop the control or the calibration
*/ */
@ -345,6 +487,7 @@ void PosCtl::SetAxisParam ( int axis, double min, double max,
pid_axis[axis].SetParam(min, max, k, i, d); pid_axis[axis].SetParam(min, max, k, i, d);
}; };
void PosCtl::GetAxisParam ( int axis, double *min, double *max, void PosCtl::GetAxisParam ( int axis, double *min, double *max,
double *k, double *i, double *d) { double *k, double *i, double *d) {
@ -453,3 +596,37 @@ void PosCtl::Loop (int posx, int posy) {
} }
}; };
void PosCtl::SetDevice (std::string d) {
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
OutputClose();
device = d;
};
void PosCtl::OutputClose() {
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
if (device_fd > 0) close(device_fd);
device_fd = -1;
};
void PosCtl::OutputOpen() {
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
};
void PosCtl::OutputWriteValue (int axis, double value) {
printf ("%s:%d %s Axis %d Value:%f\n", __FILE__, __LINE__, __FUNCTION__, axis, value);
}
void PosCtl::OutputWriteStop (int axis) {
printf ("%s:%d %s Axis %d\n", __FILE__, __LINE__, __FUNCTION__, axis);
}
void PosCtl::OutputWriteStart (int axis) {
printf ("%s:%d %s Axis %d\n", __FILE__, __LINE__, __FUNCTION__, axis);
}

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save