You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.2 KiB
135 lines
5.2 KiB
/***************************************************************************************
|
|
*
|
|
* posctl.cc is part of SimpleSkyCam.
|
|
*
|
|
*****************************************************************************************/
|
|
|
|
#include <list>
|
|
#include <string>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <math.h>
|
|
#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);
|
|
};
|
|
|
|
|