int main (int argc, char **argv) { GtkWidget *window = NULL; GdkColor col = { 0,100,200,300}; gint i = 0; gfloat j = 0.0; gint trace1 = 0; gint trace2 = 0; gint trace3 = 0; gfloat data[3] = {0.1,1.1,2.2}; gint timeout = 0; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request(GTK_WIDGET(window),320,320); chart = mtx_stripchart_new (); gtk_container_add (GTK_CONTAINER (window), chart); gtk_widget_realize(chart); trace1 = mtx_stripchart_add_trace(MTX_STRIPCHART(chart),-512.0,1536.0,0,"Trace 1", NULL); printf("trace 1's ID %i\n",trace1); trace2 = mtx_stripchart_add_trace(MTX_STRIPCHART(chart),-100.0,512.0,0,"Trace 2", NULL); printf("trace 2's ID %i\n",trace2); trace3 = mtx_stripchart_add_trace(MTX_STRIPCHART(chart),512.0,1024.0,1,"Trace 3", NULL); printf("trace 3's ID %i\n",trace3); for (j=0;j<1024;j+=2.5) { for (i=0;i<3;i++) data[i] = j; /*printf("setting values to %f, %f, %f\n",data[0],data[1],data[2]); */ mtx_stripchart_set_values(MTX_STRIPCHART(chart),data); } mtx_stripchart_get_latest_values(MTX_STRIPCHART(chart),data); /* printf("latest values are %f, %f, %f\n",data[0],data[1],data[2]);*/ /*mtx_stripchart_delete_trace(MTX_STRIPCHART(chart),trace2);*/ timeout = g_timeout_add(40,(GSourceFunc)update_stripchart,(gpointer)chart); /* g_timeout_add(4000,(GSourceFunc)remove_trace,GINT_TO_POINTER(trace2));*/ gtk_widget_show_all (window); g_signal_connect (window, "delete_event", G_CALLBACK (close_demo), GINT_TO_POINTER(timeout)); g_signal_connect (window, "destroy_event", G_CALLBACK (close_demo), GINT_TO_POINTER(timeout)); gtk_main (); return 0; }
/*! \brief updates a stripchart widget with new values \param watch is the pointer to the watch containing the new data */ G_MODULE_EXPORT void update_stripchart_data(RtvWatch* watch) { ENTER(); mtx_stripchart_set_n_values(MTX_STRIPCHART(watch->user_data),watch->count,watch->hist_vals); EXIT(); return; }
/*! \brief handles exposure events when the screen is covered and then exposed. Works by copying from a backing pixmap to screen, \param widget (GtkWidget *) pointer to the chart object \param event (GdkEventExpose *) pointer to GDK event datastructure that encodes important info like window dimensions and depth. */ gboolean mtx_stripchart_expose (GtkWidget *widget, GdkEventExpose *event) { MtxStripChart * chart = MTX_STRIPCHART(widget); MtxStripChartPrivate *priv = MTX_STRIPCHART_GET_PRIVATE(chart); cairo_t *cr = NULL; #if GTK_MINOR_VERSION >= 18 if (gtk_widget_is_sensitive(GTK_WIDGET(widget))) #else if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(widget))) #endif { cr = gdk_cairo_create(widget->window); gdk_cairo_set_source_pixmap(cr,priv->bg_pixmap,0,0); cairo_rectangle(cr,event->area.x, event->area.y,event->area.width, event->area.height); cairo_fill(cr); cairo_destroy(cr); } else { cr = gdk_cairo_create(widget->window); gdk_cairo_set_source_pixmap(cr,priv->bg_pixmap,0,0); cairo_rectangle(cr,event->area.x, event->area.y,event->area.width, event->area.height); cairo_fill(cr); cairo_set_source_rgba (cr, 0.3,0.3,0.3,0.5); cairo_paint(cr); /* cairo_rectangle (cr, 0,0,priv->w,priv->h); cairo_fill(cr); */ cairo_destroy(cr); } return FALSE; }
gboolean mtx_stripchart_motion_event (GtkWidget *chart,GdkEventMotion *event) { /* We don't care, but return FALSE to propogate properly */ MtxStripChartPrivate *priv = MTX_STRIPCHART_GET_PRIVATE(MTX_STRIPCHART(chart)); priv->mouse_x = event->x; priv->mouse_y = event->y; return FALSE; }
gboolean mtx_stripchart_enter_leave_event(GtkWidget *widget, GdkEventCrossing *event) { MtxStripChartPrivate *priv = MTX_STRIPCHART_GET_PRIVATE(MTX_STRIPCHART(widget)); if (event->type == GDK_ENTER_NOTIFY) priv->mouse_tracking = TRUE; else priv->mouse_tracking = FALSE; return TRUE; }
/*! \brief Creates a stripchart widget (i.e. accel wizard) \param parent is the container for stripchart widget */ G_MODULE_EXPORT void create_stripchart(GtkWidget *parent) { GtkWidget *chart = NULL; gchar ** sources = NULL; gchar * tmpbuf = NULL; guint i = 0; gconstpointer *object = NULL; gint min = 0; gint max = 0; gint precision = 0; gchar * name = NULL; DataSize size = MTX_U08; Rtv_Map *rtv_map; ENTER(); rtv_map = (Rtv_Map *)DATA_GET(global_data,"rtv_map"); tmpbuf = (gchar *)OBJ_GET(parent,"sources"); if (tmpbuf); sources = g_strsplit(tmpbuf,",",-1); chart = mtx_stripchart_new(); gtk_container_add(GTK_CONTAINER(parent), chart); //gtk_widget_realize(chart); for (i=0;i<g_strv_length(sources);i++) { if (!rtv_map) continue; object = (gconstpointer *)g_hash_table_lookup(rtv_map->rtv_hash,sources[i]); if (!object) continue; if ((gchar *)DATA_GET(object,"dlog_gui_name")) name = (gchar *)DATA_GET(object,"dlog_gui_name"); else name = g_strdup("undefined!\n"); if (DATA_GET(object,"real_lower")) min = (GINT)strtol((gchar *)DATA_GET(object,"real_lower"),NULL,10); else min = get_extreme_from_size(size,LOWER); if (DATA_GET(object,"real_upper")) max = (GINT)strtol((gchar *)DATA_GET(object,"real_upper"),NULL,10); else max = get_extreme_from_size(size,UPPER); if (DATA_GET(object,"precision")) precision = (GINT)DATA_GET(object,"precision"); else precision = 0; mtx_stripchart_add_trace(MTX_STRIPCHART(chart),(gfloat)min,(gfloat)max,precision,name,NULL); } create_rtv_multi_value_historical_watch(sources,FALSE,"update_stripchart_data",chart); g_strfreev(sources); gtk_widget_show_all(parent); EXIT(); return; }
/*! \brief handles configure events when the chart gets created or resized. Takes care of creating/destroying graphics contexts, backing pixmaps (two levels are used to split the rendering for speed reasons) colormaps are also created here as well \param widget (GtkWidget *) pointer to the chart object \param event (GdkEventConfigure *) pointer to GDK event datastructure that encodes important info like window dimensions and depth. */ gboolean mtx_stripchart_configure (GtkWidget *widget, GdkEventConfigure *event) { MtxStripChart * chart = MTX_STRIPCHART(widget); MtxStripChartPrivate *priv = MTX_STRIPCHART_GET_PRIVATE(chart); cairo_t *cr = NULL; priv->w = widget->allocation.width; priv->h = widget->allocation.height; /* Backing pixmap (copy of window) */ if (priv->bg_pixmap) g_object_unref(priv->bg_pixmap); priv->bg_pixmap=gdk_pixmap_new(widget->window, priv->w,priv->h, gtk_widget_get_visual(widget)->depth); cr = gdk_cairo_create(priv->bg_pixmap); cairo_set_operator(cr,CAIRO_OPERATOR_DEST_OUT); cairo_paint(cr); cairo_destroy(cr); /* Trace pixmap */ if (priv->trace_pixmap) g_object_unref(priv->trace_pixmap); priv->trace_pixmap=gdk_pixmap_new(widget->window, priv->w,priv->h, gtk_widget_get_visual(widget)->depth); cr = gdk_cairo_create(priv->trace_pixmap); cairo_set_operator(cr,CAIRO_OPERATOR_DEST_OUT); cairo_paint(cr); cairo_destroy(cr); /* Grat pixmap */ if (priv->grat_pixmap) g_object_unref(priv->grat_pixmap); priv->grat_pixmap=gdk_pixmap_new(widget->window, priv->w,priv->h, gtk_widget_get_visual(widget)->depth); cr = gdk_cairo_create(priv->grat_pixmap); cairo_set_operator(cr,CAIRO_OPERATOR_DEST_OUT); cairo_paint(cr); cairo_destroy(cr); gdk_window_set_back_pixmap(widget->window,priv->bg_pixmap,0); if (priv->font_options) cairo_font_options_destroy(priv->font_options); priv->font_options = cairo_font_options_create(); cairo_font_options_set_antialias(priv->font_options, CAIRO_ANTIALIAS_GRAY); generate_stripchart_static_traces(chart); render_marker (chart); return TRUE; }
hist_vals[i] = g_new0(gfloat, 3); } /* Simple one at a time */ vals[0]++; vals[1]+=1.25; vals[2]+=2.125; hist_vals[0][0]++; hist_vals[0][1]++; hist_vals[0][2]++; hist_vals[1][0]+=1.25; hist_vals[1][1]+=1.25; hist_vals[1][2]+=1.25; hist_vals[2][0]+=2.125; hist_vals[2][1]+=2.125; hist_vals[2][2]+=2.125; mtx_stripchart_set_n_values(MTX_STRIPCHART(chart),3,hist_vals); /* printf("This should scroll stripchart \n"); */ return FALSE; } gboolean remove_trace(gpointer data) { mtx_stripchart_delete_trace(MTX_STRIPCHART(chart),(GINT)data); return FALSE; } gboolean close_demo(GtkWidget *widget, gpointer data) { g_source_remove((guint)data);
G_MODULE_EXPORT void update_stripchart_data(DataWatch* watch) { mtx_stripchart_set_values(MTX_STRIPCHART(watch->user_data),watch->vals); }