/*************************************************************************************** * * posctl.cc is part of SimpleSkyCam. * *****************************************************************************************/ #include #include #include #include #include #include #include "gui.h" #include "filter.h" #include "detect.h" #include "configuration.h" #include "video.h" #include "videodev.h" #include "histogram.h" extern GtkBuilder *_builder_; // work around for threads GtkWidget *posctl_rot_da = NULL; // GtkWidget *posctl_axis1_da = NULL; // GtkWidget *posctl_axis1_da = NULL; void cb_posctl_show_window (GtkWidget *widget, gpointer data) { printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); GtkWidget *wnd = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "window-posctl")); gtk_widget_show(wnd); } void cb_posctl_btncalib (GtkWidget *widget, gpointer data) { printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); GtkWidget *btn = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_calib")); gtk_widget_set_sensitive(btn, false); } void posctl_draw_angle(cairo_t *cr, int cx, int cy, float angle, float lenmax, float lenmi, float lenma, std::string text) { // // arrow rot double dx = sin(angle); double dy = cos(angle); cairo_move_to(cr, cx, cy); cairo_set_line_width(cr, 1.0); cairo_line_to(cr, cx + dx * cx * 0.8 * lenmi/lenmax, cy - dy * cy * 0.8 * lenmi/lenmax); cairo_stroke(cr); cairo_set_line_width(cr, 4.0); cairo_move_to(cr, cx + dx * cx * 0.8 * lenmi/lenmax, cy - dy * cy * 0.8 * lenmi/lenmax); cairo_line_to(cr, cx + dx * cx * 0.8 * lenma/lenmax, cy - dy * cy * 0.8 * lenma/lenmax); cairo_stroke(cr); cairo_set_line_width(cr, 1.0); cairo_select_font_face (cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size (cr, 11); cairo_move_to (cr, cx + dx * cx * 0.9, cy - dy * cy * 0.9 + 5); cairo_show_text(cr, text.c_str()); cairo_stroke(cr); } void cb_posctl_angles_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer data) { int clientw, clienth; int cx, cy; double linedash1[] = { 1.0, 4.0 }; // char txt[255]; // // rotation da GtkWidget *entry_rot_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_rotangle")); GtkWidget *entry_rot_len = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_rotlen")); GtkWidget *entry_axis1_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1anlge")); GtkWidget *entry_axis1_lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1lenmi")); GtkWidget *entry_axis1_lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1lenma")); GtkWidget *entry_axis2_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2anlge")); GtkWidget *entry_axis2_lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenmi")); GtkWidget *entry_axis2_lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenma")); float rotangle = atof(gtk_entry_get_text(GTK_ENTRY(entry_rot_angle))) * (M_PI / 180); float rotlen = atof(gtk_entry_get_text(GTK_ENTRY(entry_rot_len))); float a1angle = atof(gtk_entry_get_text(GTK_ENTRY(entry_axis1_angle))) * (M_PI / 180); float a1lenmi = atof(gtk_entry_get_text(GTK_ENTRY(entry_axis1_lenmi))); float a1lenma = atof(gtk_entry_get_text(GTK_ENTRY(entry_axis1_lenma))); float a2angle = atof(gtk_entry_get_text(GTK_ENTRY(entry_axis2_angle))) * (M_PI / 180); float a2lenmi = atof(gtk_entry_get_text(GTK_ENTRY(entry_axis2_lenmi))); float a2lenma = atof(gtk_entry_get_text(GTK_ENTRY(entry_axis2_lenma))); float lenmax = max(max(max(a1lenmi, a1lenma),max(a2lenmi, a2lenma)), rotlen); if (posctl_rot_da == NULL) // should only be called once posctl_rot_da = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_da_rotation")); clienth = gtk_widget_get_allocated_height(posctl_rot_da); clientw = gtk_widget_get_allocated_width(posctl_rot_da); cx = clientw >> 1; cy = clienth >> 1; // // draw the background cairo_set_source_rgb(cr, 0.8, 0.8, 0.8); cairo_paint(cr); cairo_fill (cr); cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); cairo_set_dash(cr, linedash1, 2, 0); cairo_move_to(cr, cx, cy - cy * 0.8); cairo_line_to(cr, cx, cy + cy * 0.8); cairo_stroke(cr); cairo_move_to(cr, cx - cx * 0.8, cy); cairo_line_to(cr, cx + cx * 0.8, cy); cairo_stroke(cr); cairo_set_dash(cr, NULL, 0, 0); // draw angles cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); posctl_draw_angle (cr, cx, cy, rotangle, lenmax, 0.0, rotlen, "E"); cairo_set_source_rgb(cr, 0.0, 1.0, 0.5); posctl_draw_angle (cr, cx, cy, a1angle, lenmax, a1lenmi, a1lenma, "1"); cairo_set_source_rgb(cr, 0.0, 0.5, 1.0); posctl_draw_angle (cr, cx, cy, a2angle, lenmax, a2lenmi, a2lenma, "2"); }; void cb_posctl_entryanglelen (GtkWidget *widget, gpointer data) { if (posctl_rot_da == NULL) // should only be called once 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); };