///================================================= FUNCTION HEADER================================================== /// Name : Q8TimerStart /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory /// Output : None /// Return : None /// Description : Deacctivates the timer to stop counting ///=================================================================================================================== void Q8TimerStop(int cardNum) { struct_Q8_Config q8Str; q8Str.uiFuncIndex=41; if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); }
///============================================FUNCTION HEADER========================================================= /// Name : Q8WatchdogTimer /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory /// fInterval - Timeout interval needed analog output channnels to be set /// Output : None /// Return : None /// Description : Configures and enables Watchdog timer /// ///===================================================================================================================== void Q8WatchdogTimer(int iCardNum,float fInterval) { struct_Q8_Config q8Str; q8Str.uiFuncIndex=28; if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } q8Str.udwPeriod=(uint32_t)(fInterval/ 60e-9)-1; rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); }
///================================================= FUNCTION HEADER==================================================== /// Name : Q8TimerSet /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory /// fPeriod - Timer set period in seconds /// Output : None /// Return : None /// Description : Configures 32 bit counter as timer interrupt source /// ///===================================================================================================================== void Q8TimerSet(int cardNum,float fPeriod) { struct_Q8_Config q8Str; q8Str.udwPeriod=(uint32_t)(fPeriod / 60e-9)-1; q8Str.uiFuncIndex=39; if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); }
void Q8EncoderReset(int iCardNum,int iChannelNum) { if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } struct_Q8_Config q8Str; q8Str.iCardNum=iCardNum; q8Str.uiFuncIndex=iChannelNum+31; rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); }
///============================================ FUNCTION HEADER========================================================= /// Name : Q8AnalogOutput /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory /// iChannelNum - D/A Output channel number /// fValue - User defined voltage which is wanted to see at output of the specified channel /// Output : None /// Return : None /// Description : Writes user defined voltage value to the specified channel. /// ///===================================================================================================================== void Q8AnalogOutput(int iCardNum,int iChannelNum,real_T dacValue) { if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } struct_Q8_Config q8Str; q8Str.iCardNum=iCardNum; q8Str.uiFuncIndex=iChannelNum; if (dacValue <=0) { if(dacCon[iChannelNum]==BIPOLAR_10V) { q8Str.uwValueUnsigned=(DAC_BIPOLAR_ZERO-(uint16_t)((-dacValue)*4096/20)); rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); return; } else if(dacCon[iChannelNum]==BIPOLAR_5V) { q8Str.uwValueUnsigned=(DAC_BIPOLAR_ZERO-(uint16_t)((-dacValue)*4096/10)); rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); return; } else return; }//if if(dacCon[iChannelNum]==BIPOLAR_10V) { q8Str.uwValueUnsigned=(DAC_BIPOLAR_ZERO+(uint16_t)(dacValue*4096/20)); rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); return; } else if(dacCon[iChannelNum]==BIPOLAR_5V) { q8Str.uwValueUnsigned=(DAC_BIPOLAR_ZERO+(uint16_t)(dacValue*4096/10)); rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); return; } else if(dacCon[iChannelNum]==UNIPOLAR_10V) { q8Str.uwValueUnsigned=(uint16_t)(dacValue*4096/10); rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); return; } } // end of function
///=============================================== FUNCTION HEADER ===================================================== /// Name : Q8PwmOutput /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory /// iClockSource - ClockSource selection,WATCHDOG or COUNTER /// fPeriod - PWM period /// iCntrlEn - Not used /// fPulseWidth - PWM pulse width,0...100 /// Output : None /// Return : None /// Description : Configures counter output and generates PWM based periodic wave. /// ///===================================================================================================================== void Q8PwmOutput(int iCardNum,int iClockSource, float fPeriod,float fPulseWidth,int iCntrlEn) { if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } struct_Q8_Config q8Str; q8Str.uiFuncIndex=27; q8Str.iClockSource=iClockSource; q8Str.udwLow=(uint32_t)( ((100-fPulseWidth)*fPeriod/100) / 30e-9) -1; q8Str.udwHigh=(uint32_t)( ((fPulseWidth)*fPeriod/100) / 30e-9)-1; q8Str.iCntrlEn=iCntrlEn; rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); }
///=============================================== FUNCTION HEADER ===================================================== /// Name : Q8CounterOutput /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory /// iClockSource - ClockSource selection,WATCHDOG or COUNTER /// fPeriod - Square wave period /// iCntrlEn - Not used /// Output : None /// Return : None /// Description : Configures counter output and generates periodic square wave /// ///===================================================================================================================== void Q8CounterOutput(int iCardNum,int iClockSource, float fPeriod,int iCntrlEn ) { if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } struct_Q8_Config q8Str; q8Str.uiFuncIndex=26; q8Str.iClockSource=iClockSource; q8Str.udwPeriod=(uint32_t)(fPeriod / 60e-9)-1; q8Str.iCntrlEn=iCntrlEn; rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); }
///================================================= FUNCTION HEADER==================================================== /// Name : Q8AnalogConfig /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory /// iChannelNum - D/A Output channel number /// iMode - Output voltage range selection /// Output : None /// Return : None /// Description : Configures the specified analog output channel /// ///===================================================================================================================== void Q8AnalogConfig(int iCardNum,int iChannelNum,int iMode) { //update process of configuration of analogoutput mode dacCon[iChannelNum]=iMode; struct_Q8_Config q8Str; q8Str.iCardNum=iCardNum; q8Str.uiFuncIndex=iChannelNum; q8Str.ubDacMode=iMode; q8Str.iChannelNum=iChannelNum; q8Str.uiFuncIndex=30; if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); }
///============================================== FUNCTION HEADER======================================================= /// Name : Q8DigitalOutput /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory. /// iPtrChannelNums - Array address.In this array numbers of channels written are defined and stored. /// iArraySİze - Array size. /// Output : None /// Return : None /// Description : Configures the specified channel(s) as output(s) and writes the specified channel(s) ///===================================================================================================================== void Q8DigitalOutput(int iCardNum,uint32_t channel,uint32_t data,int writeOnly) { if(fd==-1) { fd = rt_dev_open(DEV_NAME, O_RDWR); } struct_Q8_Config q8Str; q8Str.uiFuncIndex=24; q8Str.onlyDigitalData=writeOnly; q8Str.udwDataDirection=0; q8Str.udwDataDirection|=channel; q8Str.udwDataRegister=data; q8Str.iCardNum=iCardNum; rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); }
int main(int argc, char *argv[]) { char buf[1024]; ssize_t size; int device; int ret; /* open the device */ device = rt_dev_open(DEVICE_NAME, 0); if (device < 0) { printf("ERROR : can't open device %s (%s)\n", DEVICE_NAME, strerror(-device)); fflush(stdout); exit(1); } /* first read */ size = rt_dev_read (device, (void *)buf, 1024); printf("Read in device %s\t: %d bytes\n", DEVICE_NAME, size); /* first write */ sprintf(buf, "HelloWorld!"); size = rt_dev_write (device, (const void *)buf, strlen(buf) + 1); printf("Write from device %s\t: %d bytes\n", DEVICE_NAME, size); /* second read */ size = rt_dev_read (device, (void *)buf, 1024); printf("Read in device %s\t: %s\n", DEVICE_NAME, buf); /* third read */ size = rt_dev_read (device, (void *)buf, 1024); printf("Read in device %s\t: %d bytes\n", DEVICE_NAME, size); /* close the device */ ret = rt_dev_close(device); if (ret < 0) { printf("ERROR : can't close device %s (%s)\n", DEVICE_NAME, strerror(-ret)); fflush(stdout); exit(1); } return 0; }
///================================================FUNCTION HEADER===================================================== /// Name : Q8EncoderConfig /// Input : iCardNum - PCI memory region that is mapped to Q8 card memory /// iChannelNum - Encoder channel number /// iCountMode - Count mode to use /// iBcd - Bcd or binary counting /// iQuadrature - Quadrature type selection /// iIndexEn - Enable or disable index feature /// iIndexPol - Select index polarity /// Output : None /// Return : None /// Description : Configures the encoder channel /// ///===================================================================================================================== int Q8EncoderConfig(int iCardNum, int iChannelNum,int iCountMode, int iBcd, int iQuadrature, int iIndexEn, int iIndexPol) { struct_Q8_Config q8Str; q8Str.uiFuncIndex=29; q8Str.iCardNum=iCardNum; q8Str.iChannelNum=iChannelNum; q8Str.ubEcountMode=iCountMode; q8Str.ubEbcdMode=iBcd; q8Str.ubEquadratureMode=iQuadrature; q8Str.ubIndexEnable=iIndexEn; q8Str.ubIndexPolarity=iIndexPol; if(fd < 0) { fd = rt_dev_open(DEV_NAME, O_RDWR); } rt_dev_write(fd,&q8Str,sizeof(struct_Q8_Config)); return fd; }
int main (int argc, char * argv[]) { int fd; int i; if (argc < 2) { fprintf(stderr, "usage: %s rtdm_device\n", argv[0]); exit(EXIT_FAILURE); } fd = rt_dev_open(argv[1], O_WRONLY); if (fd < 0) { fprintf(stderr, "%s: %s\n", argv[1], strerror(-fd)); exit(EXIT_FAILURE); } for (i = 2; i < argc; i ++) rt_dev_write(fd, argv[i], strlen(argv[i])); rt_dev_close(fd); exit(EXIT_SUCCESS); }
/*!***************************************************************************** ******************************************************************************* \note write_serial \date Oct 2000 \remarks write to the serial port ******************************************************************************* Function Parameters: [in]=input,[out]=output \param[in] fd : file descriptor \param[in] n_bytes: number of bytes to write \param[in] buffer: buffer with bytes to write returns the number of bytes actually written ******************************************************************************/ int write_serial(int fd,int n_bytes, char *buffer) { return rt_dev_write(fd, buffer, (size_t) n_bytes); }