/* UL call demonstrated: ulAInScan() Purpose: Performs a continuous scan of the range of A/D input channels Demonstration: Displays the analog input data for the range of user-specified channels using the first supported range and input mode Steps: 1. Call ulGetDaqDeviceInventory() to get the list of available DAQ devices 2. Call ulCreateDaqDevice() to to get a handle for the first DAQ device 3. Verify the DAQ device has an analog input subsystem 4. Verify the analog input subsystem has a hardware pacer 5. Call ulConnectDaqDevice() to establish a UL connection to the DAQ device 6. Get the first supported analog range 7. Call ulAInScan() to start the scan of A/D input channels 8. Call ulAInScanStatus() to check the status of the background operation 9. Display the data for each channel 10. Call ulAInScanStop() to stop the background operation 11. Call ulDisconnectDaqDevice() and ulReleaseDaqDevice() before exiting the process. */ #include #include #include "uldaq.h" #include "utility.h" #define MAX_DEV_COUNT 100 #define MAX_STR_LENGTH 64 #define MAX_SCAN_OPTIONS_LENGTH 256 int main(void) { int descriptorIndex = 0; DaqDeviceDescriptor devDescriptors[MAX_DEV_COUNT]; DaqDeviceInterface interfaceType = ANY_IFC; DaqDeviceHandle daqDeviceHandle = 0; unsigned int numDevs = MAX_DEV_COUNT; // set some variables that are used to acquire data int lowChan = 0; int highChan = 3; AiInputMode inputMode; Range range; int samplesPerChannel = 10000; double rate = 1000; ScanOption scanOptions = (ScanOption) (SO_DEFAULTIO | SO_CONTINUOUS); AInScanFlag flags = AINSCAN_FF_DEFAULT; int hasAI = 0; int hasPacer = 0; int numberOfChannels = 0; int index = 0; char inputModeStr[MAX_STR_LENGTH]; char rangeStr[MAX_STR_LENGTH]; char scanOptionsStr[MAX_SCAN_OPTIONS_LENGTH]; int chanCount = 0; double* buffer = NULL; UlError err = ERR_NO_ERROR; int i = 0; int __attribute__((unused)) ret; char c; // Get descriptors for all of the available DAQ devices err = ulGetDaqDeviceInventory(interfaceType, devDescriptors, &numDevs); if (err != ERR_NO_ERROR) goto end; // verify at least one DAQ device is detected if (numDevs == 0) { printf("No DAQ device is detected\n"); goto end; } printf("Found %d DAQ device(s)\n", numDevs); for (i = 0; i < (int) numDevs; i++) printf(" %s: (%s)\n", devDescriptors[i].productName, devDescriptors[i].uniqueId); // get a handle to the DAQ device associated with the first descriptor daqDeviceHandle = ulCreateDaqDevice(devDescriptors[descriptorIndex]); if (daqDeviceHandle == 0) { printf ("\nUnable to create a handle to the specified DAQ device\n"); goto end; } // verify the specified device supports analog input err = getDevInfoHasAi(daqDeviceHandle, &hasAI); if (!hasAI) { printf("\nThe specified DAQ device does not support analog input\n"); goto end; } // verify the specified device supports hardware pacing for analog input err = getAiInfoHasPacer(daqDeviceHandle, &hasPacer); if (!hasPacer) { printf("\nThe specified DAQ device does not support hardware paced analog input\n"); goto end; } printf("\nConnecting to device %s - please wait ...\n", devDescriptors[descriptorIndex].devString); // establish a connection to the DAQ device err = ulConnectDaqDevice(daqDeviceHandle); if (err != ERR_NO_ERROR) goto end; // get the first supported analog input mode err = getAiInfoFirstSupportedInputMode(daqDeviceHandle, &numberOfChannels, &inputMode, inputModeStr); if (highChan >= numberOfChannels) highChan = numberOfChannels - 1; chanCount = highChan - lowChan + 1; // allocate a buffer to receive the data buffer = (double*) malloc(chanCount * samplesPerChannel * sizeof(double)); if(buffer == 0) { printf("\nOut of memory, unable to create scan buffer\n"); goto end; } // get the first supported analog input range err = getAiInfoFirstSupportedRange(daqDeviceHandle, inputMode, &range, rangeStr); ConvertScanOptionsToString(scanOptions, scanOptionsStr); printf("\n%s ready\n", devDescriptors[descriptorIndex].devString); printf(" Function demonstrated: ulAInscan()\n"); printf(" Channels: %d - %d\n", lowChan, highChan); printf(" Input mode: %s\n", inputModeStr); printf(" Range: %s\n", rangeStr); printf(" Samples per channel: %d\n", samplesPerChannel); printf(" Rate: %f\n", rate); printf(" Scan options: %s\n", scanOptionsStr); printf("\nHit ENTER to continue\n"); ret = scanf("%c", &c); // clear the display ret = system("clear"); // start the acquisition err = ulAInScan(daqDeviceHandle, lowChan, highChan, inputMode, range, samplesPerChannel, &rate, scanOptions, flags, buffer); if(err == ERR_NO_ERROR) { ScanStatus status; TransferStatus transferStatus; // get the initial status of the acquisition ulAInScanStatus(daqDeviceHandle, &status, &transferStatus); while(status == SS_RUNNING && err == ERR_NO_ERROR && !enter_press()) { // get the current status of the acquisition err = ulAInScanStatus(daqDeviceHandle, &status, &transferStatus); // reset the cursor to the top of the display and // show the termination message resetCursor(); printf("Hit 'Enter' to terminate the process\n\n"); printf("actual scan rate = %f\n\n", rate); index = transferStatus.currentIndex; printf("currentScanCount = %10llu \n", transferStatus.currentScanCount); printf("currentTotalCount = %10llu \n", transferStatus.currentTotalCount); printf("currentIndex = %10d \n\n", index); // display the data for (i = 0; i < chanCount; i++) { printf("chan %d = %10.6f\n", i + lowChan, buffer[index + i]); } usleep(100000); } // stop the acquisition if it is still running if (status == SS_RUNNING && err == ERR_NO_ERROR) { err = ulAInScanStop(daqDeviceHandle); } } // disconnect from the DAQ device ulDisconnectDaqDevice(daqDeviceHandle); end: // release the handle to the DAQ device if(daqDeviceHandle) ulReleaseDaqDevice(daqDeviceHandle); // release the scan buffer if(buffer) free(buffer); if(err != ERR_NO_ERROR) { char errMsg[ERR_MSG_LEN]; ulGetErrMsg(err, errMsg); printf("Error Code: %d \n", err); printf("Error Message: %s \n", errMsg); } return 0; }