// This code uses MOTIF for GUI. only for test purpose. to be rewritten #include #include #include #include #include #include #include #include // defined only to save some typing later #define FALSE 0 #define TRUE 1 #define Fix_L XmNleftAttachment, XmATTACH_FORM #define Fix_T XmNtopAttachment, XmATTACH_FORM #define Fix_R XmNrightAttachment, XmATTACH_FORM #define Fix_B XmNbottomAttachment, XmATTACH_FORM #define Fix_LTRB Fix_L, Fix_T, Fix_R, Fix_B #define Border 10 #define OFFSET 2 #define XTIMER 10 // 10 msec char *prog_name = "CRO"; XtAppContext apc; Widget top, mainForm, plotForm, commandForm; Widget draw, start, stop, save, tval, quit; Window dispwin; GC gc; Colormap cm; Display *dpy; Pixel fgcol, bgcol; #define NP 800 // 800 double ts[NP], ad[NP]; // arrays to store adc data int delay = 0; unsigned char running; // digitization in progress double xscale, yscale; XPoint coords[NP]; void set_label_string(Widget w, char* p) { XmString s; s = XmStringCreateLocalized (p); XtVaSetValues (w, XmNlabelString, s, NULL); XmStringFree (s); } void timer(void) { Dimension w, h; int k; double tmp1, tmp2; char ss[50]; if(!running) { XtAppAddTimeOut (apc, XTIMER, (XtTimerCallbackProc) timer, (XtPointer) NULL); return; } XClearWindow (dpy, dispwin); XSetFunction (dpy, gc, GXcopy); XSetForeground (dpy, gc, fgcol); XtVaGetValues (draw, XmNwidth, &w, XmNheight, &h, NULL); for(k=0; k < NP; ++k) { tmp1 = minus5000To5000(); tmp2 = minus5000To5000(); if( (fabs(tmp1) < 100) && (tmp2 > tmp1) ) break; } readBlock(NP, ts, ad, delay, 1); xscale = (double)w/ ts[NP-1]; yscale = (double) h /10000.0; // -5000mV to 5000mV for(k = 0; k < NP; ++k) { coords[k].x = (int) (ts[k] * xscale); coords[k].y = (int) ((5000.0 + ad[k]) * yscale); } XDrawLines(dpy, dispwin, gc, coords, NP, CoordModeOrigin); sprintf(ss," %7.5lf sec", ts[NP-1]-ts[0]); set_label_string(tval,ss); XtAppAddTimeOut (apc, XTIMER, (XtTimerCallbackProc) timer, (XtPointer) NULL); } void startCollect(Widget wig, XtPointer client_data, XtPointer call_data) { printf("Started..\n"); selectADC(0); running = TRUE; } void saveData(Widget w, XtPointer client_data, XtPointer call_data) { int k; FILE *fp; fp = fopen("cro.dat","wt"); for(k = 0; k < NP; ++k) fprintf(fp,"%8.6f %6.1f\n", ts[k] , ad[k]); fclose(fp); fprintf(stderr,"file saved.\n\a"); } void stopCollect(Widget w, XtPointer client_data, XtPointer call_data) { running = FALSE; } void bye (Widget w, XtPointer client_data, XtPointer call_data) { printf("bye bye\n"); exit(0); } //---------------------------Initialization------------------------------- void initGraphics() // get all the Drawing Stuff for draw widget { XGCValues gcv; unsigned long value_mask = GCForeground | GCBackground; XColor screen, exact; dispwin = XtWindow (draw); gc = XtGetGC (draw, value_mask, &gcv); dpy = XtDisplay(top); cm = DefaultColormap(dpy, 0); if(XAllocNamedColor(dpy, cm, "SteelBlue", &screen, &exact) == 0) exit(0); bgcol = screen.pixel; if(XAllocNamedColor(dpy, cm, "blue", &screen, &exact) == 0) exit(0); fgcol = screen.pixel; } Widget form2; void createWidgets(void) { mainForm = XtVaCreateManagedWidget( "mainForm", xmFormWidgetClass, top, Fix_LTRB, NULL); plotForm = XtVaCreateManagedWidget("plotForm", xmFormWidgetClass, mainForm, Fix_L, Fix_R, Fix_T, NULL); commandForm = XtVaCreateManagedWidget("commandForm", xmFormWidgetClass, mainForm, Fix_L,Fix_R,Fix_B, XmNtopWidget, plotForm, XmNtopAttachment, XmATTACH_WIDGET, NULL); form2 = XtVaCreateManagedWidget("form2", xmFormWidgetClass, plotForm, Fix_L, Fix_B, Fix_R,Fix_T, XmNleftOffset, Border, XmNrightOffset, Border, XmNbottomOffset, Border, XmNtopOffset, Border, XmNshadowThickness, 4, XmNshadowType, XmSHADOW_IN, NULL); draw = XtVaCreateManagedWidget("draw", xmDrawingAreaWidgetClass, form2, XmNheight, 400, XmNwidth, 600, Fix_LTRB, NULL); start = XtVaCreateManagedWidget("START", xmPushButtonWidgetClass, commandForm, Fix_L, Fix_T, Fix_B, NULL); stop = XtVaCreateManagedWidget("STOP", xmPushButtonWidgetClass, commandForm, Fix_T, Fix_B, XmNleftWidget, start, XmNleftAttachment, XmATTACH_WIDGET, NULL); save = XtVaCreateManagedWidget("SAVE", xmPushButtonWidgetClass, commandForm, Fix_T, Fix_B, XmNleftWidget, stop, XmNleftAttachment, XmATTACH_WIDGET, NULL); tval = XtVaCreateManagedWidget("Time ->", xmLabelWidgetClass, commandForm, Fix_T, Fix_B, XmNleftWidget, save , XmNleftAttachment, XmATTACH_WIDGET, XmNwidth, 150, NULL); quit = XtVaCreateManagedWidget("EXIT", xmPushButtonWidgetClass, commandForm, Fix_T, Fix_B, Fix_R, NULL); //XtAddCallback (draw, XmNexposeCallback, redraw, (XtPointer) NULL); XtAddCallback (start, XmNactivateCallback, startCollect, NULL); XtAddCallback (stop, XmNactivateCallback, stopCollect, NULL); XtAddCallback (save, XmNactivateCallback, saveData, NULL); XtAddCallback (quit, XmNactivateCallback, bye, NULL); XtAppAddTimeOut(apc, XTIMER, (XtTimerCallbackProc) timer, (XtPointer) NULL); } int main(int argc, char **argv) { openPhoenix(); top = XtVaAppInitialize( &apc, "CRO", NULL, 0, /* command line option list */ &argc, argv, /* command line args */ NULL, /* for missing app-defaults file */ NULL); /* terminate varargs list */ createWidgets(); XtRealizeWidget(top); initGraphics(); XtAppMainLoop(apc); return 0; }