/* Call me tstIn2mem. I use XLR functions to read from the input * board into memory. I don't test what I read, but I do time the * transfer and complain about errors and count buffer fulls. * Use EndM5 to interrupt. Revised: 2003 August 01, JAB */ #include "Parse5A.h" #include /* For signal() to catch ^C */ #define NUMLOOPS 20000 /* Number of read loops */ #include /* For time() */ #include /* For ftime() */ void signalint(int k); /* To catch signal SIGINT (below) */ SSHANDLE dev; /* xlrDevice */ UINT indx = 1; /* Index */ char * me; /* My name */ int msglev = 0; /* Debug message level */ unsigned long rbuff[4 * BUFFL]; /* Read buffer */ int main(int argc, char * argv[]) { /* tstIn2mem */ int i, j; struct timeb time1, time2, timex, timey; /* From ftime() */ double dt; /* Time difference */ long long tbytes; long long len; S_DEVSTATUS dstat; /* Device status */ /* *** Initialize *** */ me = (me = strrchr(argv[0], '/')) == NULL ? argv[0] : me+1; /* My name */ /* ** Initialize and check XLR ** */ if (XLRDeviceFind() <= 0) { /* StreamStor cards? */ (void) fprintf(stderr, "%s ERROR: \007 XLRDeviceFind() returned none \n", me); /* Error */ (void) errors(); return(-1); /* XLR error */ } if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: XLRDeviceFind() OK \n", me); (void) errors(); if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: Trying to XLROpen() ... \n", me); if (XLROpen(indx, &dev) != XLR_SUCCESS) { /* Open, OK? */ (void) fprintf(stderr, "%s ERROR: \007 XLROpen() returned error \n", me); /* Nope */ (void) errors(); XLRClose(dev); /* See manual notes on XLROpen() */ return(-2); /* XLR error */ } if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLROpen() OK \n", me); /* Yes */ (void) errors(); signal(SIGINT, signalint); /* Catch interrupt signal */ /* * Set SS mode for input board to PCI * */ if (XLRSetMode(dev, SS_MODE_READ_EXT) != XLR_SUCCESS) { /* OK? */ (void) fprintf(stderr, "%s ERROR: \007 XLRSetMode() returned error \n", me); /* Nope */ (void) errors(); XLRClose(dev); /* See manual notes on XLROpen() */ return(-3); /* XLR error */ } (void) errors(); /* * Set FPDP mode * */ if (XLRSetFPDPMode(dev, SS_FPDP_RECVMASTER, SS_OPT_FPDPNRASSERT) != XLR_SUCCESS) { /* (Or SS_OPT_FPDPALL) OK? */ (void) fprintf(stderr, "%s ERROR: \007 XLRSetFPDPMode() returned error \n", me); /* Nope */ (void) errors(); XLRClose(dev); /* See manual notes on XLROpen() */ return(-4); /* XLR error */ } (void) errors(); /* * Record on (sic) * */ if (XLRRecord(dev, FALSE, 1) != XLR_SUCCESS) { /* Record, OK? */ if (msglev < 2) /* No. Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s In2net() WARNING: XLRRecord() returned error \n", me); (void) errors(); return(-5); /* XLR error */ } /* ** Read loop ** */ (void) fprintf(stderr, "%s Doing %d loops each %d bytes \n", me, NUMLOOPS, SOCBUF); (void) fprintf(stderr, "%s Start read loop \n", me); (void) ftime(&time1); /* What time is it? */ for (i = 0; i < NUMLOOPS; i++) { /* Each of NUMLOOPS loops */ j = 0; while ((len = XLRGetLength(dev)) < SOCBUF) { /* Full? */ // if (j == 0) /* Nope. First? */ // (void) fprintf(stderr, /* Yes */ // "%s DEBUG: i %d Length %Ld j %d \n", me, i, len, j); j++; /* Count spin loops */ } // if (j > 0 || i % 100 == 0) /* Log progress? */ // (void) fprintf(stderr, /* Yes */ // "%s DEBUG: i %d Length %Ld j %d \n", me, i, len, j); (void) ftime(&timex); /* What time is it? */ if (XLRReadFifo(dev, rbuff, SOCBUF, FALSE) != XLR_SUCCESS) { /* Read into rbuff, OK? */ if (msglev < 2) /* Nope. Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s ERROR: XLRReadFifo() returned error \n", me); (void) errors(); break; /* Out of for loop; error */ } (void) ftime(&timey); /* Now what time is it? */ dt = timey.time + timey.millitm/1000.0 - timex.time - timex.millitm/1000.0; if (dt > 0.1) /* Long wait? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: XLRReadFifo() took %.3f seconds, j %d, Length %Ld \n", me, dt, j, len); if (i % 100 == 0) { /* Log progress? */ (void) fprintf(stderr, "#"); /* Yes */ if (XLRGetDeviceStatus(dev, &dstat) != XLR_SUCCESS) { /* Device Stats, OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR: \007 XLRGetDeviceStatus() returned error \n", me); (void) errors(); return(-6); /* Error */ } (void) errors(); if (dstat.FifoFull || dstat.Overflow[0]) /* Fifo overflow? */ (void) fprintf(stderr, /* Yes */ "%s WARNING: Fifo overflow \n", me); } /* End of if log progress */ } /* End of for i read loop */ (void) ftime(&time2); /* Now what time is it? */ (void) errors(); dt = time2.time + time2.millitm/1000.0 - time1.time - time1.millitm/1000.0; tbytes = (long long) i * SOCBUF; (void) fprintf(stderr, "\n%s DEBUG: Transferred %Ld bytes " "in %.1f seconds at %.3e baud \n", me, tbytes, dt, 8.0*tbytes/dt); /* ** Done ** */ if (XLRStop(dev) != XLR_SUCCESS) { /* Stop, OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR: \007 XLRStop() returned error \n", me); (void) errors(); /* Error, but we go on */ } else /* XLRStop() OK */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLRStop() done OK \n", me); /* Yes */ if (XLRSetMode(dev, SS_MODE_PCI) != XLR_SUCCESS) { /* Reset mode, OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR: \007 XLRSetMode() returned error \n", me); (void) errors(); /* Error, but we go on */ } else /* XLRSetMode() OK */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: XLRSetMode() done OK \n", me); // if (XLRReset(dev) != XLR_SUCCESS) /* OK? */ // (void) fprintf(stderr, "%s ERROR: XLRReset() returned error \n", me); (void) errors(); XLRClose(dev); /* See manual notes on XLROpen() */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLRClose() done \n", me); /* Yes */ return(0); /* The end */ } /* End of main = tstIn2mem */ int errors() { /* XLR errors? Print XLR error code if so */ extern char * me; /* My name */ extern int msglev; /* Debug print? */ char messg[XLR_ERROR_LENGTH]; /* Error message as a string */ XLR_ERROR_CODE error; /* Return from error request */ if ((error = XLRGetLastError()) != 3) { /* Errors? */ /* Yes, get error message */ if (XLRGetErrorMessage(messg, error) != XLR_SUCCESS) { /* OK? */ if (msglev < 2) /* Nope. Debuggery? */ (void) fprintf(stderr, "%s errors() ERROR: XLR error %ld, " "but XLRGetErrorMessage() failed \n", me, error); } else /* Error message, messg[], OK */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s ERROR: XLR error %ld %s \n", me, error, messg); return(TRUE); /* Yes, XLR error */ } return(FALSE); /* Else no error */ } /* End of errors() */ void signalint(int k) { /* To catch interrupt signal SIGINT */ /* (k is not used) */ extern SSHANDLE dev; /* xlrDevice */ extern char * me; /* My name */ extern int msglev; /* Debug message level */ if (msglev < 2) /* Debuggery? */ (void) fprintf(stderr, "%s INTERRUPT \n", me); /* Yes */ /* An XLRReset() here allows swapping disks after XLRClose() below */ if (XLRReset(dev) != XLR_SUCCESS) { /* OK? */ if (msglev < 2) /* No. Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s WARNING: XLRReset() returned error \n", me); (void) errors(); } else if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLRReset() OK \n", me); XLRClose(dev); /* See manual notes on XLROpen() */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLRClose() done \n", me); /* Yes */ if (msglev < 2) /* Debuggery? */ (void) printf("%s: The End \n", me); exit(0); /* Bye */ } /* End of signalint() */