#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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 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;
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;
}