#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/time.h> #include <string.h> #include <time.h> #include <chplot.h> #include <gtk/gtk.h> #include <wand/magick-wand.h> #include "DIO96.h" #include "control.h" #define DATABUF 2 #define DEFAULT_PNG_WIDTH 640 #define DEFAULT_PNG_HEIGHT 480 static GdkPixmap *pixmap = NULL; GtkWidget *entry1, *entry2; int PLOTCREATED = 0; int createPlot(char *Points, char *Signal) { unsigned char buf[DATABUF], data_ready; struct timeval tv; fd_set rfds; int retval, fd0, fd1, ctl, sem, n, i, NumPoints = atoi(Points), ViewSignal = atoi(Signal); struct msg_struct msg; class CPlot plot; /* OPEN THE FIFOS */ if ((fd0 = open("/dev/rtf0", O_RDONLY)) == NULL) { fprintf(stderr, "Error opening /dev/rtf0\n"); exit(-1); } if ((fd1 = open("/dev/rtf1", O_RDONLY)) == NULL) { fprintf(stderr, "Error opening /dev/rtf1\n"); close(fd0); exit(-1); } if ((ctl = open("/dev/rtf2", O_WRONLY)) == NULL) { fprintf(stderr, "Error opening /dev/rtf2\n"); close(fd0); close(fd1); exit(-1); } if ((sem = open("/dev/rtf4", O_RDONLY)) == NULL) { fprintf(stderr, "Error opening /dev/rtf4\n"); close(fd0); close(fd1); close(ctl); exit(-1); } /* SETUP THE START MESSAGE */ msg.command = START_TASK; msg.period = TICK_RESOLUTION; /* 1ns per tick */ msg.conf = DIO96_CONF; msg.buffer_size = DATABUF; msg.dataPts = NumPoints; /* SEND THE MESSAGE */ if (write(ctl, &msg, sizeof(msg)) < 0) { fprintf(stderr, "Can't send a command to RT-task\n"); close(fd0); close(fd1); close(ctl); close(sem); exit(-1); } /* CREATE BUFFER TO STORE THE DATA */ unsigned char Signal[NumPoints]; int x[NumPoints]; for(i=0; i<NumPoints; i++) { Signal[i]=0; x[i]=0; } /* ACQUIRE THE DATA */ for(i=0; i<NumPoints; i++) { FD_ZERO(&rfds); FD_SET(sem, &rfds); tv.tv_sec = 2; tv.tv_usec = 0; retval = select(sem+1, &rfds, NULL, NULL, &tv); if (retval > 0) { n = read(sem, &data_ready, 1); if(data_ready==0x00) read(fd0, buf, DATABUF); if(data_ready==0x01) read(fd1, buf, DATABUF); if(ViewSignal > 7) Signal[i] = (buf[1] & 1<<(ViewSignal-8)) >> (ViewSignal-8); else Signal[i] = (buf[0] & 1<<ViewSignal) >> ViewSignal; x[i] = i; } } /* PLOT INFO TO TEMPORARY FILE */ plot.data2D(x, Signal); plot.plotType(PLOT_PLOTTYPE_STEPS, 0, 1, 1); plot.outputType(PLOT_OUTPUTTYPE_FILE, "png color", "junk1.png"); plot.title("Signal Output"); plot.label(PLOT_AXIS_Y, "Signal"); plot.label(PLOT_AXIS_X, "Data Point"); plot.axisRange(PLOT_AXIS_Y, -0.1, 1.1); plot.plotting(); /* CLOSE THE OPENED FIFOS */ close(fd0); close(fd1); close(ctl); close(sem); return 0; } void plotpixmap( GtkWidget *widget) { GdkBitmap *mask; gchar *DataPoints; gchar *ViewSignal; /* For ImageMagick wand */ MagickBooleanType status; MagickWand *magick_wand; DataPoints = gtk_entry_get_text(GTK_ENTRY(entry1)); ViewSignal = gtk_entry_get_text(GTK_ENTRY(entry2)); createPlot(DataPoints, ViewSignal); PLOTCREATED = 1; /* For ImageMagick wand */ magick_wand = NewMagickWand(); status = MagickReadImage(magick_wand,"junk1.png"); if(status == MagickFalse) printf("Error while reading image\n"); status = MagickWriteImages(magick_wand,"junk1.xpm", MagickTrue); if (status == MagickFalse) printf("Error while writing image\n"); magick_wand = DestroyMagickWand(magick_wand); pixmap = gdk_pixmap_create_from_xpm (widget->window, &mask, NULL, "junk1.xpm"); gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap, 0, 0, 0, 0, -1, -1); remove("junk1.xpm"); remove("junk1.png"); } static gint expose_event( GtkWidget *widget, GdkEventExpose *event ) { if(PLOTCREATED) gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE; } int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *drawing_area; GtkWidget *vbox, *hbox; GtkWidget *button; GtkWidget *label; /* Initiate GTK */ gtk_init (&argc, &argv); /* Create the main window for the application */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_exit), NULL); /* Create vertical box to hold all of the inputs and plot */ vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); /* Create the drawing area */ drawing_area = gtk_drawing_area_new (); gtk_drawing_area_size (GTK_DRAWING_AREA (drawing_area), DEFAULT_PNG_WIDTH, DEFAULT_PNG_HEIGHT); gtk_box_pack_end (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0); gtk_widget_show (drawing_area); gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event", (GtkSignalFunc) expose_event, NULL); /* Create 'Go' button to initiate data acquisition */ button = gtk_button_new_with_label ("Go"); gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (plotpixmap), GTK_OBJECT (drawing_area)); gtk_widget_show (button); /* Create horizontal box to hold data points label and entry box */ hbox = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (vbox), hbox); gtk_widget_show (hbox); /* Create data points label */ label = gtk_label_new (" Number of data points: "); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); /* Create data points entry box */ entry1 = gtk_entry_new_with_max_length (5); gtk_entry_set_text (GTK_ENTRY (entry1), "500"); gtk_entry_select_region (GTK_ENTRY (entry1), 0, GTK_ENTRY(entry1)->text_length); gtk_box_pack_start (GTK_BOX (hbox), entry1, TRUE, TRUE, 0); gtk_widget_show (entry1); /* Create horizontal box to hold signal to view label and entry box */ hbox = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (vbox), hbox); gtk_widget_show (hbox); /* Create signal to view label */ label = gtk_label_new (" Signal to view: "); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); /* Create signal to view entry box */ entry2 = gtk_entry_new_with_max_length (2); gtk_entry_set_text (GTK_ENTRY (entry2), "0"); gtk_entry_select_region (GTK_ENTRY (entry2), 0, GTK_ENTRY(entry2)->text_length); gtk_box_pack_start (GTK_BOX (hbox), entry2, TRUE, TRUE, 0); gtk_widget_show (entry2); /* Show the main window */ gtk_widget_show (window); /* Start GTK main loop */ gtk_main (); return 0; }