uldaq/examples/TmrPulseOut.c
Saeid Bazazzadeh f7555d73db Initial commit
2018-05-01 12:02:27 -04:00

194 lines
5.3 KiB
C

/*
UL call demonstrated: ulTmrPulseOutStart()
Purpose: Generate an output pulse using the
specified timer
Demonstration: Outputs user defined pulse on the
specified timer
Steps:digital
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 a timer output subsystem
4. Call ulConnectDaqDevice() to establish a UL connection to the DAQ device
5. Call ulTmrPulseOutStart() to start output pulse for the specified timer
6. Call ulTmrPulseOutStatus(), if it is supported, to monitor the status of the
pulse output
7. Call ulTmrPulseOutStop() to stop the output pulse
8. Call ulDisconnectDaqDevice() and ulReleaseDaqDevice() before exiting the process.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "uldaq.h"
#include "utility.h"
#define MAX_DEV_COUNT 100
int main(void)
{
int descriptorIndex = 0;
DaqDeviceDescriptor devDescriptors[MAX_DEV_COUNT];
DaqDeviceInterface interfaceType = ANY_IFC;
DaqDeviceHandle daqDeviceHandle = 0;
unsigned int numDevs = MAX_DEV_COUNT;
int timerNumber = 0;
double frequency = 1000.0;
double dutyCycle = .5;
unsigned long long pulseCount = 0;
double initialDelay = 0.0;
TmrIdleState idleState = TMRIS_LOW;
PulseOutOption options = PO_DEFAULT;
int hasTMR = 0;
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 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 DAQ device supports timer output
err = getDevInfoHasTmr(daqDeviceHandle, &hasTMR);
if (!hasTMR)
{
printf("\nThe specified DAQ device does not support timer output\n");
goto end;
}
printf("\nConnecting to device %s - please wait ...\n", devDescriptors[descriptorIndex].devString);
// establish a connection to the specified DAQ device
err = ulConnectDaqDevice(daqDeviceHandle);
if (err != ERR_NO_ERROR)
goto end;
printf("\n%s ready\n", devDescriptors[descriptorIndex].devString);
printf(" Function demonstrated: ulTmrPulseOutStart()\n");
printf(" Channel: %d\n", timerNumber);
printf(" Frequency: %f\n", frequency);
printf(" Duty cycle: %f\n", dutyCycle);
printf("\nHit ENTER to continue\n");
ret = scanf("%c", &c);
ret = system("clear");
err = ulTmrPulseOutStart(daqDeviceHandle, timerNumber, &frequency, &dutyCycle, pulseCount, &initialDelay, idleState, options);
if(err == ERR_NO_ERROR)
{
TmrStatus status = TMRS_RUNNING;
err = ulTmrPulseOutStatus(daqDeviceHandle, timerNumber, &status);
if (status == TMRS_RUNNING)
{
// if the status is RUNNING, then this timer does support the ulTmrPulseOutStatus()
// function so we will call the function to determine if the pulse output is stopped
// due to an error
while(status == TMRS_RUNNING && err == ERR_NO_ERROR && !enter_press())
{
// reset the cursor to the top of the display and
// show the termination message
resetCursor();
printf("Status = TMRS_RUNNING\n");
printf("Outputting %f Hz pulse with duty cycle %.3f for timer %d ...\n\n", frequency, dutyCycle, timerNumber);
printf("Hit 'Enter' to terminate the process and stop the timer output\n");
usleep(100000);
err = ulTmrPulseOutStatus(daqDeviceHandle, timerNumber, &status);
}
// stop the output if it is still running
if (status == TMRS_RUNNING && err == ERR_NO_ERROR)
{
err = ulTmrPulseOutStop(daqDeviceHandle, timerNumber);
}
}
else
{
// if the status is IDLE, then this timer does not support the ulTmrPulseOutStatus()
// function so we will wait for user input to stop the pulse output
// reset the cursor to the top of the display and
// show the termination message
resetCursor();
printf("Outputting %f Hz pulse with duty cycle %.3f for timer %d ...\n\n", frequency, dutyCycle, timerNumber);
printf("Hit 'Enter' to terminate the process and stop the timer output\n");
while (!enter_press())
{
usleep(100000);
}
// stop the output if it is still running
err = ulTmrPulseOutStop(daqDeviceHandle, timerNumber);
}
for (i = 0; i < 5; i++)
{
cursorUp();
clearEOL();
}
resetCursor();
printf("Status = TMRS_IDLE\n");
}
// disconnect from the DAQ device
ulDisconnectDaqDevice(daqDeviceHandle);
end:
// release the handle to the DAQ device
ulReleaseDaqDevice(daqDeviceHandle);
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;
}