From: Dominic L. <ma...@us...> - 2005-11-18 14:59:10
|
Update of /cvsroot/robotflow/RobotFlow/Probes/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23805/src Added Files: SoundSourceDisplay.cc Log Message: include/SoundSourceDisplay.h --- NEW FILE: SoundSourceDisplay.cc --- // Copyright (C) 2002 Dominic Letourneau #include "SoundSourceDisplay.h" #include "net_types.h" #include "Object.h" #include <gnome.h> #include "Vector.h" #ifdef HAVE_CONFIG_H # include <config.h> #endif using namespace std; using namespace FD; namespace RobotFlow { DECLARE_NODE(SoundSourceDisplay) /*Node * * @name SoundSourceDisplay * @category RobotFlow:Probes * @description Virtual joystick with 2 standard buttons and 2 toggle buttons * * @parameter_name BUTTONS_VISIBLE * @parameter_type bool * @parameter_value true * @parameter_description True if you want to use buttons. * * @output_name OUTPUT * @output_type Vector<float> * @output_description x, y, button1, button2 of the joystick * END*/ static gboolean ignore_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data) { return TRUE; } static void button1_click (GtkButton *button, SoundSourceDisplay* self) { //cout<<"Button 1 clicked"<<endl; self->change_button_status(1); } static void button2_click (GtkButton *button, SoundSourceDisplay* self) { //cout<<"Button 2 clicked"<<endl; self->change_button_status(2); } static gint handle_event_handler (GnomeCanvasItem *item, GdkEvent *event, SoundSourceDisplay *self) { return self->event(event); } SoundSourceDisplay::SoundSourceDisplay(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) { m_button1_on = false; m_button2_on = false; m_toggleButton3_on = false; m_toggleButton4_on = false; //get parameters m_buttonsVisible = dereference_cast<bool>(parameters.get("BUTTONS_VISIBLE")); m_pWindow1 = NULL; m_pVbox2 = NULL; m_pToolbar2 = NULL; m_pButton1 = NULL; m_pButton2 = NULL; m_pButton3 = NULL; m_pButton4 = NULL; m_pCanvas = NULL; m_pGroup = NULL; m_pHandle = NULL; m_pBorder = NULL; m_outputID = addOutput("OUTPUT"); } SoundSourceDisplay::~SoundSourceDisplay() { //destroy object cerr<<"destruct"<<endl; gdk_threads_enter(); if (m_pWindow1) { gtk_widget_destroy (m_pWindow1); } gdk_threads_leave(); } void SoundSourceDisplay::initialize() { BufferedNode::initialize(); gdk_threads_enter(); // Add buttons & canvas try { GtkWidget *handlebox; GtkWidget *tmp_toolbar_icon; //create window m_pWindow1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (m_pWindow1), "m_pWindow1", m_pWindow1); gtk_window_set_title (GTK_WINDOW (m_pWindow1), getName().c_str()); gtk_signal_connect (GTK_OBJECT (m_pWindow1), "delete-event", GTK_SIGNAL_FUNC (ignore_delete), NULL); //create vbox m_pVbox2 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (m_pVbox2); gtk_object_set_data_full (GTK_OBJECT (m_pWindow1), "m_pVbox2", m_pVbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (m_pVbox2); gtk_container_add (GTK_CONTAINER (m_pWindow1), m_pVbox2); //create toolbar if user wants to display buttons if (m_buttonsVisible) { //create handlebox handlebox = gtk_handle_box_new (); gtk_widget_ref (handlebox); gtk_object_set_data_full (GTK_OBJECT (m_pWindow1), "handlebox", handlebox,(GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (handlebox); gtk_box_pack_start (GTK_BOX (m_pVbox2), handlebox, FALSE, FALSE, 0); gtk_handle_box_set_snap_edge (GTK_HANDLE_BOX (handlebox), GTK_POS_LEFT); m_pToolbar2 = gtk_toolbar_new (); gtk_widget_ref (m_pToolbar2); gtk_object_set_data_full (GTK_OBJECT (m_pWindow1), "m_pToolbar2", m_pToolbar2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (m_pToolbar2); gtk_container_add (GTK_CONTAINER (handlebox), m_pToolbar2); // Joystick button 1 //tmp_toolbar_icon = gnome_stock_pixmap_widget (m_pWindow1, GNOME_STOCK_PIXMAP_DOWN); tmp_toolbar_icon = gtk_button_new_from_stock ("gtk-go-down"); m_pButton1 = gtk_toolbar_append_element (GTK_TOOLBAR (m_pToolbar2), GTK_TOOLBAR_CHILD_BUTTON,NULL, _("STOP"), NULL, NULL,tmp_toolbar_icon, NULL, NULL); gtk_widget_ref (m_pButton1); gtk_object_set_data_full (GTK_OBJECT (m_pWindow1), "m_pButton1", m_pButton1,(GtkDestroyNotify) gtk_widget_unref); gtk_button_set_relief(GTK_BUTTON(m_pButton1), GTK_RELIEF_NONE); gtk_widget_show (m_pButton1); gtk_signal_connect (GTK_OBJECT (m_pButton1), "pressed",GTK_SIGNAL_FUNC (button1_click),this); gtk_signal_connect (GTK_OBJECT (m_pButton1), "released",GTK_SIGNAL_FUNC (button1_click),this); // Joystick button 2 //tmp_toolbar_icon = gnome_stock_pixmap_widget (m_pWindow1, GNOME_STOCK_PIXMAP_DOWN); tmp_toolbar_icon = gtk_button_new_from_stock ("gtk-go-down"); m_pButton2 = gtk_toolbar_append_element (GTK_TOOLBAR (m_pToolbar2), GTK_TOOLBAR_CHILD_BUTTON,NULL, _("START"), NULL, NULL,tmp_toolbar_icon, NULL, NULL); gtk_widget_ref (m_pButton2); gtk_object_set_data_full (GTK_OBJECT (m_pWindow1), "m_pButton2", m_pButton2,(GtkDestroyNotify) gtk_widget_unref); gtk_button_set_relief(GTK_BUTTON(m_pButton2), GTK_RELIEF_NONE); gtk_widget_show (m_pButton2); gtk_signal_connect (GTK_OBJECT (m_pButton2), "pressed",GTK_SIGNAL_FUNC (button2_click),this); gtk_signal_connect (GTK_OBJECT (m_pButton2), "released",GTK_SIGNAL_FUNC (button2_click),this); /* // Joystick toggle button 3 tmp_toolbar_icon = gtk_button_new_with_label("T1"); m_pButton3 = gtk_toolbar_append_element (GTK_TOOLBAR (m_pToolbar2), GTK_TOOLBAR_CHILD_TOGGLEBUTTON,NULL, _("WANDER"), NULL, NULL,tmp_toolbar_icon, NULL, NULL); gtk_widget_ref (m_pButton3); gtk_object_set_data_full (GTK_OBJECT (m_pWindow1), "m_pButton3", m_pButton3,(GtkDestroyNotify) gtk_widget_unref); //show button 3 gtk_widget_show (m_pButton3); // Joystick toggle button 4 tmp_toolbar_icon = gtk_button_new_with_label("T2"); m_pButton4 = gtk_toolbar_append_element (GTK_TOOLBAR (m_pToolbar2), GTK_TOOLBAR_CHILD_TOGGLEBUTTON,NULL, _("AVOID"), NULL, NULL,tmp_toolbar_icon, NULL, NULL); gtk_widget_ref (m_pButton4); gtk_object_set_data_full (GTK_OBJECT (m_pWindow1), "m_pButton4", m_pButton4,(GtkDestroyNotify) gtk_widget_unref); //show button 4 gtk_widget_show (m_pButton4); */ } //create buttons widgets if required //canvas GtkWidget* canvas1 = gnome_canvas_new(); gtk_widget_pop_colormap (); gtk_widget_pop_visual (); if (m_buttonsVisible) { gtk_window_set_default_size(GTK_WINDOW(m_pWindow1), 450,500); } else { gtk_window_set_default_size(GTK_WINDOW(m_pWindow1), 350,350); } gtk_widget_ref (canvas1); gtk_object_set_data_full (GTK_OBJECT (m_pWindow1), "canvas1", canvas1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (canvas1); gtk_box_pack_start (GTK_BOX (m_pVbox2), canvas1, TRUE, TRUE, 0); m_pCanvas = GNOME_CANVAS(canvas1); gnome_canvas_set_scroll_region(m_pCanvas, 0.0, 0.0, 320.0, 320.0); //canvas group m_pGroup = GNOME_CANVAS_GROUP (gnome_canvas_item_new (gnome_canvas_root(m_pCanvas), gnome_canvas_group_get_type(), "x",0.0, "y",0.0, NULL)); //create joystick border m_pBorder = gnome_canvas_item_new(gnome_canvas_root(m_pCanvas), gnome_canvas_ellipse_get_type(), "x1",0.0, "y1",0.0, "x2",320.0, "y2",320.0, "fill_color_rgba", 0xFF0000FF, "outline_color", "black", NULL); //create joystick handle m_pHandle = gnome_canvas_item_new(gnome_canvas_root(m_pCanvas), gnome_canvas_ellipse_get_type(), "x1",140.0, "y1",140.0, "x2",180.0, "y2",180.0, "fill_color_rgba", 0x000000FF, "outline_color", "black", NULL); gtk_signal_connect(GTK_OBJECT(m_pHandle), "event", (GtkSignalFunc) handle_event_handler, this); //display window gtk_widget_show(m_pWindow1); } catch (BaseException *e) { gdk_threads_leave(); throw e->add(new NodeException(this, "Exception caught in SoundSourceDisplay::initialize", __FILE__, __LINE__)); } gdk_threads_leave(); } gint SoundSourceDisplay::event(GdkEvent *event) { double item_x, item_y; static double item_old_x = 0; static double item_old_y = 0; item_x = event->button.x; item_y = event->button.y; //gnome_canvas_item_w2i(item->parent, &item_x, &item_y); switch (event->type) { case GDK_BUTTON_PRESS: switch(event->button.button) { case 1: //printf("button1 clicked for virtual joystick : (%f, %f)\n",item_x,item_y); item_old_x = item_x; item_old_y = item_y; break; default: break; } break; case GDK_MOTION_NOTIFY: if (event->motion.state & GDK_BUTTON1_MASK) { //gnome_canvas_item_move (m_pHandle, item_x - item_old_x, item_y - item_old_y); if (sqrt(pow(item_x - 160.0,2) + pow(item_y - 160.0,2)) <= 160.0) { //inside circle gnome_canvas_item_set (m_pHandle, "x1",item_x - 20.0, "y1",item_y - 20.0, "x2",item_x + 20.0, "y2",item_y + 20.0, NULL); } else { //outside circle double dx = 160.0 - item_x; double dy = 160.0 - item_y; double m = dy / dx; double b = (item_y) - (m * item_x); //printf("(dx %f) (dy %f) (m %f) (b %f)\n", dx, dy,m,b); double x_pos = sqrt((25600 - b * b) / (1 + m * m)); double x_neg = - x_pos; //printf("(xpos : %f) (xneg : %f)\n",x_pos,x_neg); } gnome_canvas_item_request_update(m_pHandle); } break; case GDK_BUTTON_RELEASE: switch(event->button.button) { case 1: gnome_canvas_item_set (m_pHandle, "x1",140.0, "y1",140.0, "x2",180.0, "y2",180.0, NULL); gnome_canvas_item_request_update(m_pHandle); break; default: break; } break; default: break; } item_old_x = item_x; item_old_y = item_y; return FALSE; } void SoundSourceDisplay::calculate(int output_id, int count, Buffer &out) { gdk_threads_enter(); double x1,y1,x2,y2; gnome_canvas_item_get_bounds(m_pHandle,&x1,&y1,&x2,&y2); int size = 0; if (m_buttonsVisible) { size = 4; } else { size = 2; } Vector<float> *data = Vector<float>::alloc(size); (*data)[0] = ((x2 + x1) / 2.0) - 160.0; (*data)[1] = 160.0 - ((y2 + y1) / 2.0); if (m_buttonsVisible) { (*data)[2] = (float) m_button1_on; (*data)[3] = (float) m_button2_on; //(*data)[4] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_pButton3)); //(*data)[5] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_pButton4)); } out[count] = ObjectRef(data); gdk_threads_leave(); } bool SoundSourceDisplay::change_button_status(int button_id) { switch (button_id) { case 1: m_button1_on = !m_button1_on; return m_button1_on; break; case 2: m_button2_on = !m_button2_on; return m_button2_on; break; default: throw new GeneralException("Unknown button id",__FILE__,__LINE__); return false; break; } return false; } }//namespace RobotFlow |