//Author: LabJack //April 8, 2016 //Header for U3 example helper functions. // //History //-added easy functions //-added I2C function and LJTDAC functions and structure (09/04/2007) //-fixed memory leak in ehFeedback and I2C functions (09/27/2007) //-fixed some bugs in "easy" functions (09/27/2007) //-added U3-LV/HV support (04/07/2008) //-fixed bug in eAIN for positive channel 30 - temp sensor (04/25/2008) //-Modified calibration constants structs. Modified the names and code of the // functions that apply the calibration constants. (06/25/2009) //-Replaced LJUSB_BulkWrite/Read with LJUSB_write/Read calls. Added serial // number support to openUSBConnection. (12/27/2011) //-Updated functions to have C bindings. (04/08/2016) #ifndef U3_H_ #define U3_H_ #include #include #include #include #include "labjackusb.h" #ifdef __cplusplus extern "C"{ #endif typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; //Structure for storing calibration constants struct U3_CALIBRATION_INFORMATION { uint8 prodID; double hardwareVersion; //helps to determine which calibration calculations //to use int highVoltage; //indicates if the device is U3-HV double ccConstants[20]; /* Calibration constants order 0 - LV AIN SE Slope 1 - LV AIN SE Offset 2 - LV AIN Diff Slope 3 - LV AIN Diff Offset 4 - DAC0 Slope 5 - DAC0 Offset 6 - DAC1 Slope 7 - DAC1 Offset 8 - Temp Slope 9 - Vref @Cal 10 - Vref*1.5 @Cal 11 - Vreg @Cal 12 - HV AIN0 Slope 13 - HV AIN1 Slope 14 - HV AIN2 Slope 15 - HV AIN3 Slope 16 - HV AIN0 Offset 17 - HV AIN1 Offset 18 - HV AIN2 Offset 19 - HV AIN3 Offset */ }; typedef struct U3_CALIBRATION_INFORMATION u3CalibrationInfo; //Structure for storing LJTDAC calibration constants struct U3_TDAC_CALIBRATION_INFORMATION { uint8 prodID; double ccConstants[4]; /* DAC Calibration constants order 0 - SlopeA; 1 - OffsetA; 2 - SlopeB; 3 - OffsetB; */ }; typedef struct U3_TDAC_CALIBRATION_INFORMATION u3TdacCalibrationInfo; /* Functions */ void normalChecksum( uint8 *b, int n); //Adds checksum to a data packet for normal command format. //b = data packet for normal command //n = size of data packet void extendedChecksum( uint8 *b, int n); //Adds checksum to a data packet for extended command format. //b = data packet for extended command //n = size of data packet uint8 normalChecksum8( uint8 *b, int n); //Returns the Checksum8 for a normal command data packet. //b = data packet for normal command //n = size of data packet uint16 extendedChecksum16( uint8 *b, int n); //Returns the Checksum16 for a extended command data packet. //b = data packet for extended command //n = size of data packet uint8 extendedChecksum8( uint8 *b); //Returns the Checksum8 for a extended command data packet. //b = data packet for extended command HANDLE openUSBConnection( int localID); //Opens a U3 connection over USB. Returns NULL on failure, or a HANDLE on //success. //localID = the local ID or serial number of the U3 you want to open void closeUSBConnection( HANDLE hDevice); //Closes a HANDLE to a U3 device. long getTickCount( void); //Returns the number of milliseconds that has elasped since the system was //started. long getCalibrationInfo( HANDLE hDevice, u3CalibrationInfo *caliInfo); //Gets calibration information from memory blocks 0-4 of a U3. Returns the //calibration information in a calibrationInfo structure. //hDevice = handle to a U3 device //caliInfo = structure where calibrarion information will be stored long getTdacCalibrationInfo( HANDLE hDevice, u3TdacCalibrationInfo *caliInfo, uint8 DIOAPinNum); //Gets calibration information from the EEPROM of a LJTick-DAC (LJTDAC). //Returns the calibration information in a u3TdacCalibrationInfo structure. //hDevice = handle to a U3 device //caliInfo = structure where LJTDAC calibration information will be stored //DIOAPinNum = The U3 digital IO line where the LJTDAC DIOA pin is connected. // The DIOB pin is assumed to be the next digital IO line. double FPuint8ArrayToFPDouble( uint8 *buffer, int startIndex); //Converts a fixed point byte array (starting a startIndex) to a floating point //double value. This function is used primarily by getCalibrationInfo. long isCalibrationInfoValid(u3CalibrationInfo *caliInfo); //Performs a simple check to determine if the caliInfo struct was set up by //getCalibrationInfo. Returns 0 if caliInfo is not valid, or 1 if it is. //caliInfo = structure where calibrarion information is stored long isTdacCalibrationInfoValid(u3TdacCalibrationInfo *caliInfo); //Performs a simple check to determine if the caliInfo struct was set up by //getLJTDACCalibrationInfo. Returns 0 if caliInfo is not valid, or 1 if it is. //caliInfo = structure where LJTDAC calibration information is stored long getAinVoltCalibrated( u3CalibrationInfo *caliInfo, int dac1Enabled, uint8 negChannel, uint16 bytesVolt, double *analogVolt); //Translates the binary AIN reading from the U3, to a voltage value //(calibrated) in Volts. Call getCalibrationInfo first to set up caliInfo. //Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.20 and 1.21. Function will also //work for hardware version 1.30 U3-LV, but not U3-HV. //caliInfo = structure where calibrarion information is stored //dac1Enabled = If this is nonzero (True), then it is indicated that DAC1 is // enabled and analog voltage will be calculated with Vreg. If // this is 0 (False), then it is indicated that DAC1 is disabled // and the analog voltage will be calculated with the AIN slopes // and offsets. //negChannel = the negative channel of the differential analog reading //bytesVolt = the 2 byte voltage that will be converted //analogVolt = the converted analog voltage long getAinVoltCalibrated_hw130( u3CalibrationInfo *caliInfo, uint8 positiveChannel, uint8 negChannel, uint16 bytesVolt, double *analogVolt); //Translates the binary AIN reading from the U3, to a voltage value //(calibrated) in Volts. Call getCalibrationInfo first to set up caliInfo. //Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.30 (U3-LV/HV). //caliInfo = structure where calibrarion information is stored //positiveChannel = the positive channel of the differential analog reading //negChannel = the negative channel of the differential analog reading //bytesVolt = the 2 byte voltage that will be converted //analogVolt = the converted analog voltage long getDacBinVoltCalibrated( u3CalibrationInfo *caliInfo, int dacNumber, double analogVolt, uint8 *bytesVolt); //Translates a analog output voltage value (Volts) to a binary 8 bit value //(calibrated) that can be sent to a U3. Call getCalibrationInfo first to set //up caliInfo. Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.20, 1.21 and 1.30, and does the //same thing as the analogToCalibratedBinary8BitVoltage function. //caliInfo = structure where calibrarion information is stored //DACNumber - channel number of the DAC //analogVolt = the analog voltage that will be converted //bytesVolt = the converted binary 8 bit value long getDacBinVoltCalibrated8Bit( u3CalibrationInfo *caliInfo, int dacNumber, double analogVolt, uint8 *bytesVolt8); //Translates a analog output voltage value (Volts) to a binary 8 bit value //(calibrated) that can be sent to a U3. Call getCalibrationInfo first to set //up caliInfo. Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.20, 1.21 and 1.30. //caliInfo = structure where calibrarion information is stored //dacNumber - channel number of the DAC //analogVolt = the analog voltage that will be converted //bytesVolt8 = the converted binary 8 bit value long getDacBinVoltCalibrated16Bit( u3CalibrationInfo *caliInfo, int dacNumber, double analogVolt, uint16 *bytesVolt16); //Translates a analog output voltage value (Volts) to a binary 16 bit value //(calibrated) that can be sent to a U3. Call getCalibrationInfo first to set //up caliInfo. Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.30 (U3-LV/HV). //caliInfo = structure where calibrarion information is stored //dacNumber - channel number of the DAC //analogVolt = the analog voltage that will be converted //bytesVolt16 = the converted binary 16 bit value long getTdacBinVoltCalibrated( u3TdacCalibrationInfo *caliInfo, int dacNumber, double analogVolt, uint16 *bytesVolt); //Translates a voltage value (Volts) to binary analog input bytes (calibrated) //that can be sent to a LJTick-DAC (LJTDAC). Call getTdacCalibrationInfo //first to set up caliInfo. Returns -1 on error, 0 on success. //caliInfo = structure where LJTDAC calibrarion information is stored //dacNumber - channel number of the DAC (0 = DACA, 1 = DACB) //analogVolt = the analog voltage that will be converted //bytesVolt = the converted 2 byte voltage long getTempKCalibrated( u3CalibrationInfo *caliInfo, uint32 bytesTemp, double *kelvinTemp); //Translates the binary reading from the U3, to a temperature value //(calibrated) in Kelvins. Call getCalibrationInfo first to set up caliInfo. //Returns -1 on error, 0 on success. //caliInfo = structure where calibrarion information is stored //bytesTemp = the 2 byte binary temperature that will be converted //kelvinTemp = the converted Kelvin temperature long getAinVoltUncalibrated( int dac1Enabled, uint8 negChannel, uint16 bytesVolt, double *analogVolt); //Translates the binary AIN reading from the U3, to a voltage value //(uncalibrated) in Volts. Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.20 and 1.21. //dac1Enabled = If this is nonzero (True), then it is indicated that DAC1 is // enabled and analog voltage will be calculated with Vreg. If // this is 0 (False), then it is indicated that DAC1 is disabled // and the analog voltage will be calculated with the AIN slopes // and offsets. //negChannel = the negative channel of the differential analog reading //bytesVolt = the 2 byte voltage that will be converted //analogVolt = the converted analog voltage long getAinVoltUncalibrated_hw130( int highVoltage, uint8 positiveChannel, uint8 negChannel, uint16 bytesVolt, double *analogVolt); //Translates the binary AIN reading from the U3, to a voltage value //(uncalibrated) in Volts. Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.30 (U3-LV/HV). //highVoltage = Set to 1 to indicate that U3-HV calculations should be used // for the binary to voltage conversion, otherwise U3-LV voltage // calculations will be used. //positiveChannel = the positive channel of the differential analog reading //negChannel = the negative channel of the differential analog reading //bytesVolt = the 2 byte voltage that will be converted //analogVolt = the converted analog voltage long getDacBinVoltUncalibrated( int dacNumber, double analogVolt, uint8 *bytesVolt); //Translates a DAC voltage value (Volts) to a binary 8 bit value (uncalibrated) //that can be sent to a U3. Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.20 and 1.21, and does the same //thing as the analogToUncalibratedBinary8BitVoltage function. //dacNumber - channel number of the DAC //analogVolt = the analog voltage that will be converted //bytesVolt = the converted binary 8 bit value long getDacBinVoltUncalibrated8Bit( int dacNumber, double analogVolt, uint8 *bytesVolt8); //Translates a DAC voltage value (Volts) to a binary 8 bit value (uncalibrated) //that can be sent to a U3. Returns -1 on error, 0 on success. //This function is for U3 hardware versions 1.20 and 1.21. //dacNumber - channel number of the DAC //analogVoltage = the analog voltage that will be converted //bytesVoltage = the converted binary 8 bit value long getDacBinVoltUncalibrated16Bit( int dacNumber, double analogVolt, uint16 *bytesVolt16); //Translates a DAC voltage value (Volts) to a binary 16 bit value //(uncalibrated) that can be sent to a U3-LV/HV. Returns -1 on error, 0 on //success. //This function is for U3 hardware versions 1.30 (U3-LV/HV). //dacNumber - channel number of the DAC //analogVoltage = the analog voltage that will be converted //bytesVoltage = the converted binary 16 bit value long getTempKUncalibrated( uint16 bytesTemp, double *kelvinTemp); //Translates the binary analog bytes read from the U3, to a temperature value //(uncalibrated) in Kelvins. Call getCalibrationInfo first to set up caliInfo. //Returns -1 on error, 0 on success. //bytesTemp = the 2 byte binary temperature that will be converted //kelvinTemp = the converted Kelvin temperature long I2C( HANDLE hDevice, uint8 I2COptions, uint8 SpeedAdjust, uint8 SDAPinNum, uint8 SCLPinNum, uint8 Address, uint8 NumI2CBytesToSend, uint8 NumI2CBytesToReceive, uint8 *I2CBytesCommand, uint8 *Errorcode, uint8 *AckArray, uint8 *I2CBytesResponse); //This function will perform the I2C low-level function call. Please refer to //section 5.3.19 of the U3 User's Guide for parameter documentation. Returns //-1 on error, 0 on success. //hDevice = handle to a U3 device //I2COptions = byte 6 of the command //SpeedAdjust = byte 7 of the command //SDAPinNum = byte 8 of the command //SCLPinNum = byte 9 of the command //Address = byte 10 of the command //NumI2CBytesToSend = byte 12 of the command //NumI2CBytesToReceive = byte 13 of the command //*I2CBytesCommand = Array that holds bytes 14 and above of the command. Needs // to be at least NumI2CBytesToSend elements in size. //*Errorcode = returns byte 6 of the response //*AckArray = Array that returns bytes 8 - 11 of the response. Needs to be at // least 4 elements in size. //*I2CBytesResponse = Array that returns bytes 12 and above of the response. // Needs to be at least NumI2CBytesToReceive elements in // size. /* Easy Functions (Similar to the easy functions in the Windows UD driver) */ long eAIN( HANDLE Handle, u3CalibrationInfo *CalibrationInfo, long ConfigIO, long *DAC1Enable, long ChannelP, long ChannelN, double *Voltage, long Range, long Resolution, long Settling, long Binary, long Reserved1, long Reserved2); //An "easy" function that returns a reading from one analog input. This //function does not automatically configure the specified channels as analog //input, unless ConfigIO is set as True. Returns 0 for no error, or -1 or >0 //value (low-level errorcode) on error. //Call getCalibrationInfo first to set up CalibrationInfo. //Handle = Handle to a U3 device. //CalibrationInfo = Structure where calibration information is stored. //ConfigIO = If this is nonzero (True), then 1 or 2 ConfigIO low-level function // calls will be made in addition to the 1 Feedback call to set the // specified Channels to analog inputs. If this is 0 (False), then // only a Feedback low-level call will be made, and an error will be // returned if the specified Channels are not already set to analog // inputs. //DAC1Enable = This parameter helps to determine the appropriate equation to // use when calculating Voltage. If the long variable that is // being pointed to is nonzero (True), then it is indicated that // DAC1 is enabled. If it is 0 (False), then it is indicated that // DAC1 is disabled. For both case, if ConfigIO is set to True, // then input value will be ignored and the output value will be // set to the current DAC1Enable value in the ConfigIO low-level // response. //ChannelP = The positive AIN channel to acquire. //ChannelN = The negative AIN channel to acquire. For single-ended channels on // the U3, this parameter should be 31 (see Section 2.6.1). //Voltage = Returns the analog input reading, which is generally a voltage. //Range = Ignored on the U3. //Resolution = Pass a nonzero value to enable QuickSample. //Settling = Pass a nonzero value to enable LongSettling. //Binary = If this is nonzero (True), the Voltage parameter will return the raw // binary value. //Reserved (1&2) = Pass 0. long eDAC( HANDLE Handle, u3CalibrationInfo *CalibrationInfo, long ConfigIO, long Channel, double Voltage, long Binary, long Reserved1, long Reserved2); //An "easy" function that writes a value to one analog output. This function //does not automatically enable the specified analog output, unless ConfigIO is //set as True. Returns 0 for no error, or -1 or >0 value (low-level errorcode) //on error. //Call getCalibrationInfo first to set up CalibrationInfo. //Handle = Handle to a U3 device. //CalibrationInfo = structure where calibrarion information is stored //ConfigIO = If this is nonzero (True) and Channel is 1, then 1 ConfigIO // low-level function call will be made in addition to the 1 Feedback // call to enable DAC1. If this is 0 (False), then only a Feedback // low-level call will be made, and an error will be returned if DAC1 // is not already enabled. //Channel = The analog output channel to write to. //Voltage = The voltage to write to the analog output. //Binary = If this is nonzero (True), the value passed for Voltage should be // binary. //Reserved (1&2) = Pass 0. long eDI( HANDLE Handle, long ConfigIO, long Channel, long *State); //An "easy" function that reads the state of one digital input. This function //does not automatically configure the specified channel as digital, unless //ConfigIO is set as True. Returns 0 for no error, or -1 or >0 value //(low-level errorcode) on error. //Handle = Handle to a U3 device. //ConfigIO = If this is nonzero (True), then 2 ConfigIO low-level functions // calls will be made in addition to the 1 Feedback call to set // Channel as digital. If this is 0 (False), then only a Feedback // low-level call will be made, and an error will be returned if // Channel is not already set as digital. //Channel = The channel to read. 0-19 corresponds to FIO0-CIO3. // For U3 hardware versions 1.30, HV model, Channel needs to be 4-19, //State = Returns the state of the digital input. 0=False=Low and 1=True=High. long eDO( HANDLE Handle, long ConfigIO, long Channel, long State); //An "easy" function that writes the state of one digital output. This //function does not automatically configure the specified channel as digital, //unless ConfigIO is set as True. Returns 0 for no error, or -1 or >0 value //(low-level errorcode) on error. //Handle = Handle to a U3 device. //ConfigIO = If this is nonzero (True), then 2 ConfigIO low-level functions // calls will be made in addition to the 1 Feedback call to set // Channel as digital. If this is 0 (False), then only a Feedback // low-level call will be made, and an error will be returned if // Channel is not already set as digital. //Channel = The channel to write to. 0-19 corresponds to FIO0-CIO3. // For U3 hardware versions 1.30, HV model, Channel needs to be 4-19, //State = The state to write to the digital output. 0=False=Low and // 1=True=High. long eTCConfig( HANDLE Handle, long *aEnableTimers, long *aEnableCounters, long TCPinOffset, long TimerClockBaseIndex, long TimerClockDivisor, long *aTimerModes, double *aTimerValues, long Reserved1, long Reserved2); //An "easy" function that configures and initializes all the timers and //counters. When needed, this function automatically configures the needed //lines as digital. Returns 0 for no error, or -1 or >0 value (low-level //errorcode) on error. //Handle = Handle to a U3 device. //aEnableTimers = An array where each element specifies whether that timer is // enabled. Timers must be enabled in order starting from 0, so // for instance, Timer1 cannot be enabled without enabling Timer // 0 also. A nonzero for an array element specifies to enable // that timer. For the U3, this array must always have at least // 2 elements. //aEnableCounters = An array where each element specifies whether that counter // is enabled. Counters do not have to be enabled in order // starting from 0, so Counter1 can be enabled when Counter0 // is disabled. A nonzero value for an array element // specifies to enable that counter. For the U3, this array // must always have at least 2 elements. //TCPinOffset = Value from 0-8 specifies where to start assigning timers and // counters. // For U3 hardware version 1.30 (LV/HV), the value needs to be 4-8. //TimerClockBaseIndex = Pass a constant to set the timer base clock. The // default is LJ_tc48MHZ. //TimerClockDivisor = Pass a divisor from 0-255 where 0 is a divisor of 256. //aTimerModes = An array where each element is a constant specifying the mode // for that timer. For the U3, this array must always have at // least 2 elements. //aTimerValues = An array where each element specifies the initial value for // that timer. For the U3, this array must always have at least // 2 elements. //Reserved (1&2) = Pass 0. long eTCValues( HANDLE Handle, long *aReadTimers, long *aUpdateResetTimers, long *aReadCounters, long *aResetCounters, double *aTimerValues, double *aCounterValues, long Reserved1, long Reserved2); //An "easy" function that updates and reads all the timers and counters. //Returns 0 for no error, or -1 or >0 value (low-level errorcode) on error. //Handle = Handle to a U3 device. //aReadTimers = An array where each element specifies whether to read that // timer. A nonzero value for an array element specifies to read // that timer. For the U3, this array must always have at least 2 // elements. //aUpdateResetTimers = An array where each element specifies whether to // update/reset that timers. A nonzero value for an array // element specifies to update/reset that timer. For the // U3, this array must always have at least 2 elements. //aReadCounters = An array where each element specifies whether to read that // counter. A nonzero value for an array element specifies to // read that counter. For the U3, this array must always have // at least 2 elements. //aResetCounters = An array where each element specifies whether to reset that // counter. A nonzero value for an array element specifies to // reset that counter. For the U3, this array must always have // at least 2 elements. //aTimerValues = Input: An array where each element is the new value for that // timer. Each value is only updated if the appropriate element // is set in the aUpdateResetTimers array. // Output: An array where each element is the value read from // that timer if the appropriate element is set in the // aReadTimers array. If the timer mode set for the timer is // Quadrature Input, the value needs to be converted from an // unsigned 32-bit integer to a signed 32-bit integer (2’s // complement). For the U3, this array must always have at least // 2 elements. //aCounterValues = An array where each element is the value read from that // counter if the appropriate element is set in the aReadTimers // array. For the U3, this array must always have at least 2 // elements. //Reserved (1&2) = Pass 0. /* Easy Function Helpers */ long ehConfigIO( HANDLE hDevice, uint8 inWriteMask, uint8 inTimerCounterConfig, uint8 inDAC1Enable, uint8 inFIOAnalog, uint8 inEIOAnalog, uint8 *outTimerCounterConfig, uint8 *outDAC1Enable, uint8 *outFIOAnalog, uint8 *outEIOAnalog); //Used by the eAIN, eDAC, eDI, eDO and eTCConfig easy functions. This function //takes the ConfigIO low-level command and response bytes (not including //checksum and command bytes) as its parameter and performs a ConfigIO call //with the U3. Returns -1 or errorcode (>1 value) on error, 0 on success. long ehConfigTimerClock( HANDLE hDevice, uint8 inTimerClockConfig, uint8 inTimerClockDivisor, uint8 *outTimerClockConfig, uint8 *outTimerClockDivisor); //Used by the eTCConfig easy function. This function takes the //ConfigTimerClock low-level command and response bytes (not including checksum //and command bytes) as its parameter and performs a ConfigTimerClock call with //the U3. Returns -1 or errorcode (>1 value) on error, 0 on success. long ehFeedback( HANDLE hDevice, uint8 *inIOTypesDataBuff, long inIOTypesDataSize, uint8 *outErrorcode, uint8 *outErrorFrame, uint8 *outDataBuff, long outDataSize); //Used by the all of the easy functions. This function takes the Feedback //low-level command and response bytes (not including checksum and command //bytes) as its parameter and performs a Feedback call with the U3. Returns -1 //or errorcode (>1 value) on error, 0 on success. /* Easy function constants */ /* Timer clocks for Hardware Version 1.20 or lower */ // 2 MHz #define LJ_tc2MHZ 10 // 6 MHz #define LJ_tc6MHZ 11 // 24 MHz #define LJ_tc24MHZ 12 // 500/Divisor KHz #define LJ_tc500KHZ_DIV 13 // 2/Divisor MHz #define LJ_tc2MHZ_DIV 14 // 6/Divisor MHz #define LJ_tc6MHZ_DIV 15 // 24/Divisor MHz #define LJ_tc24MHZ_DIV 16 /* Timer clocks for Hardware Version 1.21 or higher */ // 4 MHz #define LJ_tc4MHZ 20 // 12 MHz #define LJ_tc12MHZ 21 // 48 MHz #define LJ_tc48MHZ 22 // 1/Divisor MHz #define LJ_tc1MHZ_DIV 23 // 4/Divisor MHz #define LJ_tc4MHZ_DIV 24 // 12/Divisor MHz #define LJ_tc12MHZ_DIV 25 // 48/Divisor MHz #define LJ_tc48MHZ_DIV 26 /* Timer modes */ // 16 bit PWM #define LJ_tmPWM16 0 // 8 bit PWM #define LJ_tmPWM8 1 // 32-bit rising to rising edge measurement #define LJ_tmRISINGEDGES32 2 // 32-bit falling to falling edge measurement #define LJ_tmFALLINGEDGES32 3 // duty cycle measurement #define LJ_tmDUTYCYCLE 4 // firmware based rising edge counter #define LJ_tmFIRMCOUNTER 5 // firmware counter with debounce #define LJ_tmFIRMCOUNTERDEBOUNCE 6 // frequency output #define LJ_tmFREQOUT 7 // Quadrature #define LJ_tmQUAD 8 // stops another timer after n pulses #define LJ_tmTIMERSTOP 9 // read lower 32-bits of system timer #define LJ_tmSYSTIMERLOW 10 // read upper 32-bits of system timer #define LJ_tmSYSTIMERHIGH 11 // 16-bit rising to rising edge measurement #define LJ_tmRISINGEDGES16 12 // 16-bit falling to falling edge measurement #define LJ_tmFALLINGEDGES16 13 #ifdef __cplusplus } #endif #endif