{"id":18963909,"url":"https://github.com/JuliaDAQ/NIDAQ.jl","last_synced_at":"2026-04-02T18:30:19.878Z","repository":{"id":20689614,"uuid":"23972892","full_name":"JaneliaSciComp/NIDAQ.jl","owner":"JaneliaSciComp","description":"National Instruments Data Acquisition Interface","archived":false,"fork":false,"pushed_at":"2025-01-29T19:04:30.000Z","size":968,"stargazers_count":47,"open_issues_count":4,"forks_count":16,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-01-29T20:20:20.596Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Julia","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JaneliaSciComp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-09-12T18:57:04.000Z","updated_at":"2025-01-29T19:04:35.000Z","dependencies_parsed_at":"2022-08-05T09:15:32.343Z","dependency_job_id":null,"html_url":"https://github.com/JaneliaSciComp/NIDAQ.jl","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaneliaSciComp%2FNIDAQ.jl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaneliaSciComp%2FNIDAQ.jl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaneliaSciComp%2FNIDAQ.jl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaneliaSciComp%2FNIDAQ.jl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JaneliaSciComp","download_url":"https://codeload.github.com/JaneliaSciComp/NIDAQ.jl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239959786,"owners_count":19725205,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T14:22:26.688Z","updated_at":"2026-04-02T18:30:19.815Z","avatar_url":"https://github.com/JaneliaSciComp.png","language":"Julia","readme":"National Instruments Data Acquisition Interface\n===============================================\n\nThis package provides an interface to NI-DAQmx--- National Instruments' driver\nfor their data acquisition boards.  Their entire C header file was ported\nusing [Clang.jl](https://github.com/JuliaInterop/Clang.jl), and a rudimentary\nhigher-level API is provided for ease of use. Clang v0.13.0 was used \n(old-generator) and functions with VarArg are not ported (see commented \nfunctions in functions_V21.3.0.jl). VarArg functions are supported only \nfrom Clang v0.14.0 on. \n\nSimilar functionality for the Python language is provided by\n[PyDAQmx](https://pythonhosted.org/PyDAQmx).\n\n\nSystem Requirements\n===================\n**General**\n- Supports Windows and Linux\n- NI-DAQmx Base is not supported  \n\n**Linux specific**  \n- Requires the DAQmx 21.3 or 20.1\n- DAQmx on linux does not support USB DAQ devices\n\nInstallation\n============\n**Windows**  \nFirst download and install NI-DAQmx version\n[21.3](https://www.ni.com/de-de/support/downloads/drivers/download.ni-daqmx.html#428058) (or\n[20.1](https://www.ni.com/en-us/support/downloads/drivers/download.ni-daqmx.html#348669), \n[19.6](https://www.ni.com/en-us/support/downloads/drivers/download/packaged.ni-daqmx.333268.html), \n[18.6](http://www.ni.com/en-us/support/downloads/drivers/download/unpackaged.ni-daqmx.291872.html);\nor for Julia 0.6, [17.1.0](http://www.ni.com/download/ni-daqmx-17.1/6836/en/);\nor for Julia 0.5, [16.0.0](http://www.ni.com/download/ni-daqmx-16.0/6120/en/);\nor for Julia 0.4, [15.1.1](http://www.ni.com/download/ni-daqmx-15.1.1/5665/en/);\nor for Julia 0.3, [14.1.0](http://www.ni.com/download/ni-daqmx-14.1/4953/en/),\n[14.0.0](http://www.ni.com/download/ni-daqmx-14.0/4918/en/), or\n[9.6.0](http://www.ni.com/download/ni-daqmx-9.6/3423/en/)) from National\nInstruments.\n\n**Linux**  \nThe package supports DAQmx 21.3 (only First Look for Ubuntu) and DAQmx 20.1 on linux. Follow the instructions from this [support doc](https://www.ni.com/en-us/support/documentation/supplemental/18/downloading-and-installing-ni-driver-software-on-linux-desktop.html).\n\n**Adding `NIDAQ.jl`**  \nThen on the Julia command line:\n```\n]add NIDAQ\n```\n\n\nBasic Usage\n===========\n\nWith no input arguments, the high-level `getproperties` function can\nbe used to query the system:\n\n```\njulia\u003e using NIDAQ\n\njulia\u003e getproperties()\nDict{String,Tuple{Any,Bool}} with 7 entries:\n  \"DevNames\"           =\u003e (SubString{String}[\"Dev1\"],false)\n  \"GlobalChans\"        =\u003e (SubString{String}[\"\"],false)\n  \"NIDAQMajorVersion\"  =\u003e (0x00000010,false)\n  \"NIDAQMinorVersion\"  =\u003e (0x00000000,false)\n  \"NIDAQUpdateVersion\" =\u003e (0x00000000,false)\n  \"Scales\"             =\u003e (SubString{String}[\"\"],false)\n  \"Tasks\"              =\u003e (SubString{String}[\"\"],false)\n```\n\nReturned is a dictionary of tuples, the first member indicating the property value and\nthe second a boolean indicating whether the former is mutable.\n\n`getproperties` can also input a string containing the name of a data acquisition device:\n\n```\njulia\u003e getproperties(\"Dev1\")\nDict{String,Tuple{Any,Bool}} with 61 entries:\n  \"AIBridgeRngs\"                           =\u003e (Float64[],false)\n  \"AICouplings\"                            =\u003e (:Val_Transferred_From_Buffer,false)\n  \"AICurrentIntExcitDiscreteVals\"          =\u003e (Float64[],false)\n  \"AICurrentRngs\"                          =\u003e (Float64[],false)\n  \"AIDigFltrLowpassCutoffFreqDiscreteVals\" =\u003e (Float64[],false)\n  \"AIDigFltrLowpassCutoffFreqRangeVals\"    =\u003e (Float64[],false)\n  \"AIFreqRngs\"                             =\u003e (Float64[],false)\n  \"AIGains\"                                =\u003e (Float64[],false)\n  \"AILowpassCutoffFreqDiscreteVals\"        =\u003e (Float64[],false)\n  \"AILowpassCutoffFreqRangeVals\"           =\u003e (Float64[],false)\n  \"AIMaxMultiChanRate\"                     =\u003e (2.0e6,false)\n  \"AIMaxSingleChanRate\"                    =\u003e (2.0e6,false)\n  \"AIMinRate\"                              =\u003e (0.0232831,false)\n  \"AIPhysicalChans\"                        =\u003e (SubString{String}[\"Dev1/ai0\",\"Dev1/ai1\",\"Dev1/ai2\",\".\n  \"AIResistanceRngs\"                       =\u003e (Float64[],false)\n  \"AISampModes\"                            =\u003e (Symbol[:Val_FiniteSamps,:Val_ContSamps],false)\n  \"AISupportedMeasTypes\"                   =\u003e (Symbol[:Val_Current,:Val_Resistance,:Val_Strain_Gage.\n  \"AITrigUsage\"                            =\u003e (14,false)\n  \"AIVoltageIntExcitDiscreteVals\"          =\u003e (Float64[],false)\n  \"AIVoltageIntExcitRangeVals\"             =\u003e (Float64[],false)\n  \"AIVoltageRngs\"                          =\u003e ([-1.0,1.0,-2.0,2.0,-5.0,5.0,-10.0,10.0],false)\n  \"AOCurrentRngs\"                          =\u003e (Float64[],false)\n  \"AOGains\"                                =\u003e (Float64[],false)\n  \"AOMaxRate\"                              =\u003e (3.33333e6,false)\n  \"AOMinRate\"                              =\u003e (0.0232831,false)\n  \"AOPhysicalChans\"                        =\u003e (SubString{String}[\"Dev1/ao0\",\"Dev1/ao1\"],false)\n  \"AOSampModes\"                            =\u003e (Symbol[:Val_FiniteSamps,:Val_ContSamps],false)\n  \"AOSupportedOutputTypes\"                 =\u003e (Symbol[:Val_Voltage],false)\n  \"AOTrigUsage\"                            =\u003e (10,false)\n  \"AOVoltageRngs\"                          =\u003e ([-5.0,5.0,-10.0,10.0],false)\n  \"AccessoryProductNums\"                   =\u003e (UInt32[0x00000000],false)\n  \"AccessoryProductTypes\"                  =\u003e (SubString{String}[\"\"],false)\n  \"AccessorySerialNums\"                    =\u003e (UInt32[0x00000000],false)\n  \"BusType\"                                =\u003e (:Val_USB,false)\n  \"CIMaxSize\"                              =\u003e (0x00000020,false)\n  \"CIMaxTimebase\"                          =\u003e (1.0e8,false)\n  \"CIPhysicalChans\"                        =\u003e (SubString{String}[\"Dev1/ctr0\",\"Dev1/ctr1\",\"Dev1/ctr2.\n  \"CISampModes\"                            =\u003e (Symbol[:Val_FiniteSamps,:Val_ContSamps],false)\n  \"CISupportedMeasTypes\"                   =\u003e (Symbol[:Val_CountEdges,:Val_Freq,:Val_Period,:Val_Tw.\n  \"CITrigUsage\"                            =\u003e (42,false)\n  \"COMaxSize\"                              =\u003e (0x00000020,false)\n  \"COMaxTimebase\"                          =\u003e (1.0e8,false)\n  \"COPhysicalChans\"                        =\u003e (SubString{String}[\"Dev1/ctr0\",\"Dev1/ctr1\",\"Dev1/ctr2.\n  \"COSampModes\"                            =\u003e (Symbol[:Val_FiniteSamps,:Val_ContSamps],false)\n  \"COSupportedOutputTypes\"                 =\u003e (Symbol[:Val_Pulse_Freq,:Val_Pulse_Ticks,:Val_Pulse_T.\n  \"COTrigUsage\"                            =\u003e (42,false)\n  \"ChassisModuleDevNames\"                  =\u003e (SubString{String}[\"\"],false)\n  \"DILines\"                                =\u003e (SubString{String}[\"Dev1/port0/line0\",\"Dev1/port0/lin.\n  \"DIMaxRate\"                              =\u003e (1.0e7,false)\n  \"DIPorts\"                                =\u003e (SubString{String}[\"Dev1/port0\",\"Dev1/port1\",\"Dev1/po.\n  \"DITrigUsage\"                            =\u003e (14,false)\n  \"DOLines\"                                =\u003e (SubString{String}[\"Dev1/port0/line0\",\"Dev1/port0/lin.\n  \"DOMaxRate\"                              =\u003e (1.0e7,false)\n  \"DOPorts\"                                =\u003e (SubString{String}[\"Dev1/port0\",\"Dev1/port1\",\"Dev1/po.\n  \"DOTrigUsage\"                            =\u003e (10,false)\n  \"NumDMAChans\"                            =\u003e (0x00000000,false)\n  \"ProductCategory\"                        =\u003e (:Val_XSeriesDAQ,false)\n  \"ProductNum\"                             =\u003e (0x000075a1,false)\n  \"ProductType\"                            =\u003e (SubString{String}[\"USB-6366 (64 MS) (Mass Terminatio.\n  \"SerialNum\"                              =\u003e (0x01719e54,false)\n  \"Terminals\"                              =\u003e (SubString{String}[\"/Dev1/PFI0\",\"/Dev1/PFI1\",\"/Dev1/P.\n```\n\nOne can index into the dictionary to get a list of channels:\n\n```\njulia\u003e getproperties(\"Dev1\")[\"AIPhysicalChans\"]\n(SubString{ASCIIString}[\"Dev1/ai0\",\"Dev1/ai1\",\"Dev1/ai2\",\"Dev1/ai3\",\"Dev1/ai4\",\"Dev1/ai5\",\"Dev1/ai6\",\"Dev1/ai7\"],false)\n```\n\nA bit simpler in this case though is to use another high-level function\nwhich returns just the string Array:\n\n```\njulia\u003e analog_input_channels(\"Dev1\")\n8-element Array{String,1}:\n \"Dev1/ai0\"\n \"Dev1/ai1\"\n \"Dev1/ai2\"\n \"Dev1/ai3\"\n \"Dev1/ai4\"\n \"Dev1/ai5\"\n \"Dev1/ai6\"\n \"Dev1/ai7\"\n```\n\nTo add, for example, analog input channels, use the high-level `analog_input` function:\n\n```\njulia\u003e t = analog_input(\"Dev1/ai0:1\")\nNIDAQ.AITask(Ptr{Nothing} @0x0000000025d18600)\n\njulia\u003e typeof(t)\nNIDAQ.AITask (constructor with 3 methods)\n\njulia\u003e supertype(NIDAQ.AITask)\nNIDAQ.Task\n```\n\nTwo channels were added above using the `:` notation.  Additional\nchannels can be added later by inputing the returned `Task`:\n\n```\njulia\u003e analog_input(t, \"Dev1/ai2\")\n```\n\n`getproperties` can also input a `Task`:\n\n```\njulia\u003e getproperties(t)\nDict{String,Tuple{Any,Bool}} with 5 entries:\n  \"Devices\"    =\u003e (SubString{String}[\"Dev1\"],false)\n  \"Channels\"   =\u003e (SubString{String}[\"Dev1/ai0\",\"Dev1/ai1\",\"Dev1/ai2\"],false)\n  \"Name\"       =\u003e (SubString{String}[\"_unnamedTask\u003c0\u003e\"],false)\n  \"NumChans\"   =\u003e (0x00000003,false)\n  \"NumDevices\" =\u003e (0x00000001,false)\n```\n\nas well as a string containing the name of the channel:\n\n```\njulia\u003e getproperties(t, \"Dev1/ai0\")\nDict{String,Tuple{Any,Bool}} with 52 entries:\n  \"AccelUnits\"                        =\u003e (:Val_g,false)\n  \"AutoZeroMode\"                      =\u003e (:Val_None,false)\n  \"BridgeUnits\"                       =\u003e (:Val_VoltsPerVolt,false)\n  \"ChanCalDesc\"                       =\u003e (SubString{String}[\"\"],false)\n  \"ChanCalOperatorName\"               =\u003e (SubString{String}[\"\"],false)\n  \"ChanCalPolyForwardCoeff\"           =\u003e (Float64[],false)\n  \"ChanCalPolyReverseCoeff\"           =\u003e (Float64[],false)\n  \"ChanCalScaleType\"                  =\u003e (:Val_Table,false)\n  \"ChanCalTablePreScaledVals\"         =\u003e (Float64[],false)\n  \"ChanCalTableScaledVals\"            =\u003e (Float64[],false)\n  \"ChanCalVerifAcqVals\"               =\u003e (Float64[],false)\n  \"ChanCalVerifRefVals\"               =\u003e (Float64[],false)\n  \"Coupling\"                          =\u003e (:Val_DC,false)\n  \"CurrentACRMSUnits\"                 =\u003e (:Val_Amps,false)\n  \"CurrentUnits\"                      =\u003e (:Val_Amps,false)\n  \"CustomScaleName\"                   =\u003e (SubString{String}[\"\"],false)\n  \"DataXferMech\"                      =\u003e (:Val_ProgrammedIO,false)\n  \"DataXferReqCond\"                   =\u003e (:Val_OnBrdMemNotEmpty,false)\n  \"DevScalingCoeff\"                   =\u003e ([0.000102924,0.000312673,5.87393e-14,-3.31855e-19],false)\n  \"EddyCurrentProxProbeUnits\"         =\u003e (:Val_Meters,false)\n  \"ForceUnits\"                        =\u003e (:Val_Newtons,false)\n  \"FreqUnits\"                         =\u003e (:Val_Hz,false)\n  \"Gain\"                              =\u003e (1.0,false)\n  \"InputSrc\"                          =\u003e (SubString{String}[\"_external_channel\"],false)\n  \"LVDTUnits\"                         =\u003e (:Val_Meters,false)\n  \"LossyLSBRemovalCompressedSampSize\" =\u003e (0x00000010,false)\n  \"Max\"                               =\u003e (10.0,false)\n  \"MeasType\"                          =\u003e (:Val_Voltage,false)\n  \"Min\"                               =\u003e (-10.0,false)\n  \"PressureUnits\"                     =\u003e (:Val_PoundsPerSquareInch,false)\n  \"RVDTUnits\"                         =\u003e (:Val_Degrees,false)\n  \"RawDataCompressionType\"            =\u003e (:Val_None,false)\n  \"RawSampJustification\"              =\u003e (:Val_RightJustified,false)\n  \"RawSampSize\"                       =\u003e (0x00000010,false)\n  \"ResistanceUnits\"                   =\u003e (:Val_Ohms,false)\n  \"Resolution\"                        =\u003e (16.0,false)\n  \"ResolutionUnits\"                   =\u003e (:Val_Bits,false)\n  \"RngHigh\"                           =\u003e (10.0,false)\n  \"RngLow\"                            =\u003e (-10.0,false)\n  \"SoundPressureUnits\"                =\u003e (:Val_Pascals,false)\n  \"StrainGageCfg\"                     =\u003e (:Val_FullBridgeI,false)\n  \"StrainUnits\"                       =\u003e (:Val_Strain,false)\n  \"TempUnits\"                         =\u003e (:Val_DegC,false)\n  \"TermCfg\"                           =\u003e (:Val_Diff,false)\n  \"ThrmcplCJCVal\"                     =\u003e (25.0,false)\n  \"TorqueUnits\"                       =\u003e (:Val_NewtonMeters,false)\n  \"UsbXferReqCount\"                   =\u003e (0x00000004,false)\n  \"UsbXferReqSize\"                    =\u003e (0x00008000,false)\n  \"VelocityUnits\"                     =\u003e (:Val_MetersPerSecond,false)\n  \"VoltageACRMSUnits\"                 =\u003e (:Val_Volts,false)\n  \"VoltageUnits\"                      =\u003e (:Val_Volts,false)\n  \"VoltagedBRef\"                      =\u003e (1.0,false)\n```\n\nUse `setproperty!` to change a mutable property:\n\n```\njulia\u003e setproperty!(t, \"Dev1/ai0\", \"Max\", 5.0)\n```\n\nOnce everything is configured, get some data using the `read` function:\n\n```\njulia\u003e start(t)\n\njulia\u003e read(t, 10)\n10x3 Array{Float64,2}:\n 1.52407   -0.448835   0.381075\n 1.37546   -0.213537   0.305847\n 1.2363    -0.0268698  0.262826\n 1.109      0.118619   0.243117\n 0.995797   0.2311     0.240073\n 0.896695   0.315782   0.248004\n 0.811452   0.378752   0.262746\n 0.739429   0.424257   0.281893\n 0.679263   0.456223   0.302402\n 0.629672   0.477774   0.323473\n\njulia\u003e stop(t)\n\njulia\u003e clear(t)\n```\n\n`read` can also return `Int16`, `Int32`, `UInt16`, and `UInt32` by specifying\nthose types as an additional argument:\n\n```\njulia\u003e read(t, 10, Int16)\n10×3 Array{Int16,2}:\n -12619  -5351  -13973\n -12618  -5350  -13973\n -12620  -5350  -13973\n -12619  -5350  -13974\n -12618  -5351  -13972\n -12618  -5348  -13974\n -12619  -5350  -13973\n -12619  -5350  -13973\n -12619  -5350  -13972\n -12620  -5350  -13973\n```\n\nSimilar work flows exist for `analog_output`, `digital_input`,\nand `digital_output`.  The high-level API also supports many counter\nfunctions too, including `count_edges` and `generate_pulses`.  For a\nfull list of convenience functions use the `names` function in Julia Base:\n\n```\njulia\u003e names(NIDAQ)\n25-element Array{Symbol,1}:\n  :analog_output_channels \n  :digital_input_channels \n  :setproperty!           \n  :line_to_line           \n  :counter_input_channels \n  :counter_output_channels\n  :NIDAQ                  \n  :analog_voltage_input_ranges    \n  :analog_current_input_ranges    \n  :digital_input          \n  :stop                   \n  :generate_pulses        \n  :count_edges            \n  :digital_output_channels\n  :analog_input           \n  :channel_type           \n  :analog_voltage_output_ranges   \n  :analog_current_output_ranges   \n  :devices                \n  :digital_output         \n  :getproperties          \n  :quadrature_input       \n  :analog_input_channels  \n  :analog_output          \n  :Bool32                 \n  :clear                  \n```\n\nNIDAQmx is a powerful interface, and while NIDAQ.jl provides wrappers\nfor all of it's functions, it only abstracts a few of them.  If these\ndon't suit your needs you'll have to dive deep into `src/functions_V*.jl`\nand `src/constants_V*.jl`.  Complete documentation of this low-level API\nis [here](http://zone.ni.com/reference/en-XX/help/370466V-01/) and\n[here](http://zone.ni.com/reference/en-XX/help/370471W-01/).\n\nOne situation where the low-level API is needed is to specify\ncontinous output of pulses using a counter:\n\n```\njulia\u003e t = generate_pulses(\"Dev1/ctr0\")\nNIDAQ.COTask(Ptr{Nothing} @0x00000000059d8790)\n\njulia\u003e fieldnames(typeof(t))\n(:th,)\n\njulia\u003e NIDAQ.CfgImplicitTiming(t.th, NIDAQ.Val_ContSamps, UInt64(1))\n0\n```\n\nNote that tasks consist of just a single field `th`, and that this \"task\nhandle\" is what must be passed into many low-level routines.\n\nAlso, for brevity NIDAQ.jl strips the \"DAQmx\" prefix to all functions and\nconstants in NI-DAQmx, and converts the latter to 32 bits.  One must still\ntake care to caste the other inputs appropriately though.\n\n\nAdding Support for a Version of NI-DAQmx\n========================================\n\nInstall [Clang.jl](https://github.com/ihnorton/Clang.jl).  If there are\nbuild problems, make sure that `llvm-config` is on your `PATH`, and that\n`libclang` can be found, as described in the Clang.jl README.  Clang\ndefaults to using a system installed version of LLVM.  An alternative is\nto set `BUILD_LLVM_CLANG=1` in Make.user, and compile Julia from source.\n\nFind `NIDAQmx.h`, which usually lives in\n`C:\\Program Files (x86)\\National Instruments\\NI-DAQ\\DAQmx ANSI C Dev\\include`.\n\nEdit this header file as follows:\n\n+ For NI-DAQmx v19.6 in `NIDAQmx.h` change `__int64 int64` to `long long int int64`\nand `unsigned __int64 uInt64` to `unsigned long long uInt64`.\n+ For NI-DAQmx v9.6.0 in `NIDAQmx.h` change \n`defined(__linux__)` to `defined(__linux__) || defined(__APPLE__)`.\n\nThen run Clang to produce the corresponding Julia files:\n\n```\njulia\u003e using Clang\njulia\u003e wc = init(; headers = [\"NIDAQmx.h\"],\n                   output_file = \"NIDAQmx.jl\",\n                   common_file = \"common.jl\",\n                   clang_includes = vcat(CLANG_INCLUDE),\n                   clang_args = map(x-\u003e\"-I\"*x, find_std_headers()),\n                   header_wrapped = (root, current)-\u003eroot == current,\n                   header_library = x-\u003e\"NIDAQmx\",\n                   clang_diagnostics = true)\njulia\u003e run(wc)\n$ mv NIDAQmx.jl src/functions_V\u003cversion\u003e.jl\n$ mv common.jl src/constants_V\u003cversion\u003e.jl\n$ rm LibTemplate.jl ctypes.jl\n```\n\nFinally, the following manual edits are necessary:\n\n+ In `constants_V\u003cversion\u003e.jl`\n  + delete `const CVICALLBACK = CVICDECL`,\n  + in NI-DAQmx v19.6 add `struct CVITime; lsb::uInt64; msb::int64; end`\n  + in NI-DAQmx v17.1.0 comment out `const CVIAbsoluteTime = VOID`\n  + change `const bool32 = uInt32` to `const bool32 = Bool32`.\n  + in NI-DAQmx v15 to v18 comment out `using Compat`\n+ In `functions_V\u003cversion\u003e.jl`\n  + in NI-DAQmx v18 and earlier, globally search for `Ptr` and replace with `Ref`, then globally\nsearch for `CallbackRef` and replace with `CallbackPtr`.\n  + globally search for `Cstring` and replace with `SafeCstring`\n  + for Julia 0.7 support, replace `type` with `_type`\n\n\nAuthor\n======\n\n[Ben Arthur](http://www.janelia.org/people/research-resources-staff/ben-arthur), arthurb@hhmi.org  \n[Scientific Computing](http://www.janelia.org/research-resources/computing-resources)  \n[Janelia Research Campus](http://www.janelia.org)  \n[Howard Hughes Medical Institute](http://www.hhmi.org)\n\n[![Picture](/hhmi_janelia_160px.png)](http://www.janelia.org)\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FJuliaDAQ%2FNIDAQ.jl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FJuliaDAQ%2FNIDAQ.jl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FJuliaDAQ%2FNIDAQ.jl/lists"}