\documentclass{article}
\usepackage{times}
\usepackage{vmargin}
\usepackage{longtable}
\usepackage[usenames,dvipsnames]{xcolor}
%\usepackage{graphics}

\setpapersize{USletter}
\setmargrb{2.5cm}{2.9cm}{2.7cm}{2.9cm}

\begin{document}

\definecolor{myyellow}{rgb}{0.80,0.80,0.00}

\def\DrvWorking{\color{blue}\textbf{Working}}
\def\DrvRecent{\color{green}\textbf{Recently Working}}
\def\DrvInProgress{\color{green}\textbf{In Progress}}
\def\DrvOld{\textcolor{myyellow}{\textbf{Old}}}
\def\DrvAncient{\color{orange}\textbf{Ancient}}
\def\DrvDeferred{\color{orange}\textbf{Deferred}}
\def\DrvNeverFinished{\color{orange}\textbf{Never Finished}}
\def\DrvPossiblyBroken{\color{orange}\textbf{Possibly Broken?}}
\def\DrvObsolete{\color{red}\textbf{Obsolete?}}
\def\DrvDead{\color{black}\textbf{!Dead!}}
\def\DrvProposed{\color{gray}\textbf{Proposed?}}

\title{Available MX Drivers and Their Status\\
  \textit{\large (as of MX Subversion revision 5093)}}
\author{William Lavender}

\date{June 7, 2022}
\maketitle

This document provides a list of all of the existing MX drivers.
The color coding reflects my judgement of the current status of each driver.
{\color{blue}Blue}, {\color{green}Green}, and {\textcolor{myyellow}{Yellow}}
drivers are either currently in use or can probably be brought back to life
with little trouble.

\begin{longtable}[l]{ll}
  {\DrvWorking}\ &Currenly used or very recently used on an MX-controlled beamline.\\
  {\DrvRecent}\ &Used in the somewhat recent past.\\
  {\DrvInProgress}\ &Currently in development.  Likely to work soon.\\
  {\DrvOld}\ &Used a long time ago.  Probably still works.\\
  {\DrvAncient}\ &Used a \textit{very} long time ago.
	It may be hard to get a working configuration.\\
  {\DrvDeferred}\ &Was requested by someone, but a hold was put on it.\\
  {\DrvNeverFinished}\ &Partially implemented, but ran into some problem.\\
  {\DrvPossiblyBroken}\ &It worked at one time, but is probably broken now.
	Usually due to vendor changes in hardware.\\
  {\DrvObsolete}\ &Nobody I know is currently using it and it is probably
	not worth it to update it.\\
  {\DrvDead}\ &The hardware for this device is gone and will never exist again.
	Will probably be removed soon.\\
  {\DrvProposed}\ &Wishlist items.\\
\end{longtable}

\newpage

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Interface Records}

\subsection{CAMAC Drivers}
\begin{longtable}[l]{lll}
  \textbf{dsp6001}&\DrvAncient&DSP Technology 6001/6002 CAMAC interface for ISA PCs.\\
  \textbf{epics\_camac}&\DrvOld&MX CAMAC driver for the EPICS CAMAC record.\\
  \textbf{esone\_camac}&\DrvOld&CAMAC interface driver that uses an ESONE-standard CAMAC library.\\
  \textbf{soft\_camac}&\DrvRecent&Software emulated CAMAC interface.\\
\end{longtable}

\subsection{Camera Link Interfaces}
\begin{longtable}[l]{lll}
  \textbf{camera\_link\_api}&\DrvRecent&Generic Camera Link interface.\\
  \textbf{epix\_camera\_link}&\DrvWorking&EPIX Camera Link API for serial I/O.\\
  \textbf{soft\_camera\_link}&\DrvRecent&Software emulated Camera Link interface.\\
\end{longtable}

\subsection{GPIB Drivers}
\begin{longtable}[l]{lll}
  \textbf{epics\_gpib}&\DrvOld&MX GPIB driver for the old EPICS GPIB record.\\
  \textbf{network\_gpib}&\DrvWorking&GPIB interface controlled by a remote MX server.\\
  \\
  \textbf{k500serial}&\DrvWorking&Keithley 500 Serial to GPIB interface.\\
  \textbf{linux\_gpib}&\DrvWorking&MX interface driver for the Linux-GPIB package.\\
  \textbf{linux\_usbtmc}&\DrvWorking&(LINUX) USB Test and Measurement Class devices on Linux.\\
  \textbf{micro488ex}&\DrvOld&IOtech Micro488EX Serial to GPIB interface.\\
  \textbf{ni488}&\DrvWorking&MX interface driver for NI488-style GPIB interfaces.\\
  \textbf{prologix}&\DrvWorking&Prologix GPIB-USB and GPIB-Ethernet interfaces.\\
\end{longtable}

\subsection{HTTP Interfaces}
\begin{longtable}[l]{lll}
  \textbf{http\_server}&\DrvWorking&Simple HTTP 1.1 communication with a web server.\\
\end{longtable}

\subsection{Modbus Interfaces}
\begin{longtable}[l]{lll}
  \textbf{modbus\_rtu}&\DrvInProgress&Modbus Serial-RTU interfaces.\\
  \textbf{modbus\_tcp}&\DrvRecent&Modbus TCP-IP interfaces.\\
\end{longtable}

\subsection{Serial Drivers (RS-232 or similar)}
%
\begin{longtable}[l]{lll}
  \textbf{network\_rs232}&\DrvWorking&RS-232 device controlled by a remote MX server.\\
  \textbf{soft\_rs232}&\DrvWorking&Software emulation of an RS-232 interface.\\
  \\
  \textbf{tcp232}&\DrvWorking&TCP-IP socket treated as an RS-232 port.\\
  \textbf{telnet}&\DrvWorking&Telnet socket treated as an RS-232 port.\\
  \\
  \textbf{tty}&\DrvWorking&(POSIX) Posix style termios interface for a serial port.\\
  \\
  \textbf{win32\_com}&\DrvWorking&(WIN32) Windows style interface for a serial port.\\
  \\
  \textbf{dos\_com}&\DrvAncient&(MSDOS) BIOS style interface for a serial port.\\
  \textbf{fossil}&\DrvAncient&(MSDOS) BIOS style interface using old FOSSIL driver.\\
  \\
  \textbf{vms\_terminal}&\DrvOld&(VMS) VMS QIO interface for a serial port.\\
  \\
  \textbf{vxworks\_rs232}&\DrvOld&(VXWORKS) vxWorks style interface for a serial port.\\
  \\
  \textbf{camera\_link\_rs232}&\DrvWorking&Simulates a serial port style connection over a Camera Link cable..\\
  \textbf{edt\_rs232}&\DrvDeferred&Serial port interface for EDT camera boards.\\
  \textbf{epics\_rs232}&\DrvOld&MX RS232 driver for the old EPICS RS232 record.\\
  \textbf{epix\_rs232}&\DrvWorking&Serial port interface for EPIX, Inc. video input boards.\\
  \textbf{file\_rs232}&\DrvRecent&Simulation of a serial port by reading/writing files.\\
  \textbf{ks3344}&\DrvOld&(CAMAC) Kinetic Systems KS3344 serial port.\\
  \textbf{sim900\_port}&\DrvWorking&A serial port in a Stanford Research Systems SIM900 mainframe.\\
  \textbf{spec\_command}&\DrvOld&Sends commands to a remote Spec server.\\
  \textbf{u500\_rs232}&\DrvWorking&Aerotech Unidex 500 driver for sending program lins to the controller.\\
  \textbf{wago750\_serial}&\DrvRecent&Wago 750-65X serial port.\\
\end{longtable}

\subsection{USB Interface Drivers}
\begin{longtable}[l]{lll}
  \textbf{libusb\_01}&\DrvWorking&USB interface driver for the old libusb 0.1.12 library.\\
\end{longtable}

\subsection{VME Bus I/O}
\begin{longtable}[l]{lll}
  \textbf{epics\_vme}&\DrvRecent&MX VME driver for the EPICS VME record.\\
  \textbf{mmap\_vme}&\DrvOld&(LINUX) Linux-based access to VME I/O addresses.\\
  \textbf{rtems\_vme}&\DrvRecent&(RTEMS) RTEMS-based access to VME I/O addresses.\\
  \textbf{sis3100}&\DrvWorking&(LINUX) Struck SIS 1100/3100 PCI/CPCI interface to VME.\\
  \textbf{vxi\_memacc}&\DrvOld&(LINUX) VME access using NI-VISA.\\
  \textbf{vxworks\_vme}&\DrvOld&(VXWORKS) vxWorks-based access to VME I/O addresses.\\
\end{longtable}

\subsection{x86-Style I/O Ports (portio)}
\begin{longtable}[l]{lll}
  \textbf{dos\_portio}&\DrvOld&(MSDOS,WINDOWS 9x) direct access to I/O ports.\\
  \textbf{linux\_ioperm}&\DrvOld&(LINUX) ioperm access to I/O ports.\\
  \textbf{linux\_iopl}&\DrvOld&(LINUX) iopl access to I/O ports.\\
  \textbf{linux\_portio}&\DrvAncient&(LINUX) access to I/O ports via the Linux portio driver.\\
  \textbf{linux\_uio}&\DrvProposed&(LINUX) UIO access to I/O ports.
						(relatively easy)\\
  \textbf{linux\_vfio}&\DrvProposed&(LINUX) VFIO access to I/O ports.
						(not sure)\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Controllers and Devices}

\subsection{ADCMOD2 Electrometer System (from Steve Ross)
					(via VME Bus I/O)}
\begin{longtable}[l]{lll}
  \textbf{aps\_adcmod2}&\DrvPossiblyBroken&Controller driver.\\
  \textbf{aps\_adcmod2\_amplifier}&\DrvPossiblyBroken&APS ADCMOD2 amplifier.\\
  \textbf{aps\_adcmod2\_ainput}&\DrvPossiblyBroken&APS ADCMOD2 input signal.\\
\end{longtable}

\subsection{Advanced Control Systems MCU-2 Motor Controller}
\begin{longtable}[l]{lll}
  \textbf{mcu2}&\DrvWorking&ACS MCU-2 motor axis.\\
\end{longtable}

\subsection{AMD Am9513 Counter/Timer Chips (vio portio)}
\begin{longtable}[l]{lll}
  \textbf{am9513}&\DrvOld&Chip driver.\\
  \textbf{am9513\_motor}&\DrvOld&Uses Am9513 counters to control stepping motors.\\
  \textbf{am9513\_scaler}&\DrvOld&Uses Am9513 counters as scalers.\\
  \textbf{am9513\_timer}&\DrvOld&Uses Am9513 counters as timers.\\
\end{longtable}

\subsection{Amptek DP4 Multichannel Analyzers}
\begin{longtable}[l]{lll}
  \textbf{amptek\_dp4\_mca}&\DrvDeferred&Amptek DP4 multichannel analyzers.\\
\end{longtable}

\subsection{Amptek DP5-protocol Multichannel Analyzers}
\begin{longtable}[l]{lll}
  \textbf{amptek\_dp5}&\DrvWorking&Controller driver.\\
  \textbf{amptek\_dp5\_mca}&\DrvWorking&Amptek DP5 multichannel analyzers.\\
\end{longtable}

\subsection{Animatics SmartMotor Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{smartmotor}&\DrvRecent&Smartmotor motor axis.\\
  \textbf{smartmotor\_ain}&\DrvRecent&Smartmotor analog inputs.\\
  \textbf{smartmotor\_aout}&\DrvRecent&Smartmotor analog outputs.\\
  \textbf{smartmotor\_din}&\DrvRecent&Smartmotor digital inputs.\\
  \textbf{smartmotor\_dout}&\DrvRecent&Smartmotor digital outputs.\\
\end{longtable}

\subsection{Bit-wise I/O}
\begin{longtable}[l]{lll}
  \textbf{bit\_in}&\DrvWorking&Read a bit range from another digital input.\\
  \textbf{bit\_out}&\DrvWorking&Write a bit range to another digital output.\\
\end{longtable}

\subsection{BK Precision 912x Programmable Power Supplies}
\begin{longtable}[l]{lll}
  \textbf{bkprecision\_912x}&\DrvRecent&Controller driver.\\
  \textbf{bkprecision\_ain}&\DrvRecent&BK Precision 912x analog inputs.\\
  \textbf{bkprecision\_aout}&\DrvRecent&BK Precision 912x analog outputs.\\
  \textbf{bkprecision\_din}&\DrvRecent&BK Precision 912x digital inputs.\\
  \textbf{bkprecision\_dout}&\DrvRecent&BK Precision 912x digital outputs.\\
  \textbf{bkprecision\_wvout}&\DrvRecent&BK Precision 912x waveform outputs.\\
\end{longtable}

\subsection{Black Cat Systems GM-10, GM-45, GM-50, and GM-90 Radiation Detectors}
\begin{longtable}[l]{lll}
  \textbf{gm10\_scaler}&\DrvOld&Black Cat Systems GM-10 scaler.\\
  \textbf{gm10\_timer}&\DrvOld&Black Cat Systems GM-10 timer.\\
\end{longtable}

\subsection{Blu-Ice Related Drivers}
\begin{longtable}[l]{lll}
  \textbf{bluice\_dcss\_area\_detector}&\DrvOld&Blu-Ice area detector as used by a DCSS client.\\
  \textbf{bluice\_dhs\_area\_detector}&\DrvOld&Blu-Ice area detector as used in a DHS server.\\
  \textbf{bluice\_dcss\_ion\_chamber}&\DrvOld&Blu-Ice ion chamber readout as used by a DCSS client.\\
  \textbf{bluice\_dhs\_ion\_chamber}&\DrvOld&Blu-Ice ion chamber readout as used in a DHS server.\\
  \textbf{bluice\_dcss\_motor}&\DrvOld&Blu-Ice motor as used by a DCSS client.\\
  \textbf{bluice\_dhs\_motor}&\DrvOld&Blu-Ice motor as used in a DHS server.\\
  \textbf{bluice\_dcss\_shutter}&\DrvOld&Blu-Ice shutter as used by a DCSS client.\\
  \textbf{bluice\_dhs\_shutter}&\DrvOld&Blu-Ice shutter as used in a DHS server.\\
  \textbf{bluice\_dcss\_timer}&\DrvOld&Blu-Ice timer as used by a DCSS client.\\
  \textbf{bluice\_dhs\_timer}&\DrvOld&Blu-Ice timer as used in a DHS server.\\
  \textbf{bluice\_dcss\_operation}&\DrvOld&Used by DCSS client to interact with a Blu-Ice operation.\\
  \textbf{bluice\_dhs\_operation}&\DrvOld&Used by DHS server to interact with a Blu-Ice operation.\\
  \textbf{bluice\_self\_operation}&\DrvOld&Used by a Blu-Ice process to interact with itself.\\
  \textbf{bluice\_dcss\_string}&\DrvOld&Used by DCSS client to receive a Blu-Ice variable.\\
  \textbf{bluice\_dhs\_string}&\DrvOld&Used by DHS server to receive a Blu-Ice variable.\\
  \textbf{bluice\_self\_string}&\DrvOld&Used by a Blu-Ice process to receive a variable from itself.\\
  \textbf{bluice\_command}&\DrvOld&Used by DCSS client to send a command to Blu-Ice.\\
  \textbf{bluice\_master}&\DrvOld&Used by DCSS client to become Blu-Ice master.\\
\end{longtable}

\subsection{Bruker D8 Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{d8}&\DrvOld&Controller driver.\\
  \textbf{d8\_motor}&\DrvOld&Bruker D8 motor axis.\\
\end{longtable}

\subsection{Crossbow Technology CXTILT02 Digital Inclinometer}
\begin{longtable}[l]{lll}
  \textbf{cxtilt02}&\DrvRecent&Controller driver.\\
  \textbf{cxtilt02\_angle}&\DrvRecent&Angle measurement driver.\\
\end{longtable}

\subsection{Data Track Tracker I/O Ports}
\begin{longtable}[l]{lll}
  \textbf{tracker\_ain}&\DrvOld&Data Track Tracker analog inputs.\\
  \textbf{tracker\_aout}&\DrvOld&Data Track Tracker analog outputs.\\
  \textbf{tracker\_din}&\DrvOld&Data Track Tracker digital inputs.\\
  \textbf{tracker\_dout}&\DrvOld&Data Track Tracker digital outputs.\\
\end{longtable}

\subsection{Dectris EIGER Area Detectors}
\begin{longtable}[l]{lll}
  \textbf{eiger}&\DrvInProgress&Dectris EIGER area detectors.\\
\end{longtable}

\subsection{Dectris Pilatus Area Detectors}
\begin{longtable}[l]{lll}
  \textbf{pilatus}&\DrvWorking&Dectris Pilatus area detectors.\\
\end{longtable}

\subsection{Delta Tau PMAC and Turbo PMAC Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{pmac}&\DrvWorking&Controller driver.\\
  \textbf{pmac\_ainput}&\DrvWorking&Control PMAC variables as analog inputs.\\
  \textbf{pmac\_aoutput}&\DrvWorking&Control PMAC variables as analog outputs.\\
  \textbf{pmac\_dinput}&\DrvWorking&Control PMAC variables as digital inputs.\\
  \textbf{pmac\_doutput}&\DrvWorking&Control PMAC variables as digital outputs.\\
  \textbf{pmac\_mce}&\DrvOld&Records the position of a PMAC motor in a pair of multichannel scaler channels.\\
  \textbf{pmac\_motor}&\DrvWorking&PMAC motor axis.\\
  \textbf{pmac\_cs\_axis}&\DrvWorking&PMAC coordinate system axis.\\
\end{longtable}

\subsection{DSP E500 CAMAC Motor Controller}
\begin{longtable}[l]{lll}
  \textbf{e500}&\DrvOld&DSP E500 motor axis.\\
\end{longtable}

\subsection{DSP QS450 CAMAC Scaler}
\begin{longtable}[l]{lll}
  \textbf{qs450}&\DrvOld&DSP QS450 scaler.\\
\end{longtable}

\subsection{DSP RTC-018 CAMAC Timer}
\begin{longtable}[l]{lll}
  \textbf{rtc018}&\DrvOld&DSP RTC-018 timer.\\
\end{longtable}

\subsection{Files}
\begin{longtable}[l]{lll}
  \textbf{file\_dinput}&\DrvRecent&Simulation of a digital input by reading from a file.\\
  \textbf{file\_rs232}&\DrvRecent&Simulation of a serial port by reading/writing files.\\
\end{longtable}

\subsection{FLOW-BUS flow controllers}
\begin{longtable}[l]{lll}
  \textbf{flowbus}&\DrvWorking&FLOW-BUS flow controller.\\
  \textbf{flowbus\_capacity}&\DrvWorking&FLOW-BUS capacity parameter.\\
  \textbf{flowbus\_float}&\DrvWorking&FLOW-BUS float parameter.\\
  \textbf{flowbus\_string}&\DrvWorking&FLOW-BUS string parameter.\\
  \textbf{flowbus\_uint8}&\DrvWorking&FLOW-BUS uint8 parameter.\\
  \textbf{flowbus\_ulong}&\DrvWorking&FLOW-BUS ulong parameter.\\
  \textbf{flowbus\_ushort}&\DrvWorking&FLOW-BUS ushort parameter.\\
  \textbf{flowbus\_valve}&\DrvWorking&Relay driver for FLOW-BUS valve.\\
\end{longtable}

\subsection{Hitachi KP-D20A/B Cameras}
\begin{longtable}[l]{lll}
  \textbf{hitachi\_kp\_d20}&\DrvWorking&Hitachi KP-D20A/B pan/tilt/zoom controller.\\
\end{longtable}

\subsection{Intel 8255 Digital I/O Chips (via portio)}
\begin{longtable}[l]{lll}
  \textbf{i8255}&\DrvOld&Controller driver.\\
  \textbf{i8255\_in}&\DrvOld&Intel 8255 8-bit digital input.\\
  \textbf{i8255\_out}&\DrvOld&Intel 8255 8-bit digital output.\\
\end{longtable}

\subsection{Intelligent Motion Systems/Schneider MDrive/MForce Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{mdrive}&\DrvWorking&IMS/Schneider MDrive/MForce motor axes.\\
  \textbf{mdrive\_ain}&\DrvWorking&IMS/Scneider MDrive/MForce analog inputs.\\
  \textbf{mdrive\_din}&\DrvWorking&IMS/Schneider MDrive/MForce digital inputs.\\
  \textbf{mdrive\_dout}&\DrvWorking&IMS/Schneider MDrive/MForce digital outputs.\\
\end{longtable}

\subsection{Intelligent Motion Systems Panther Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{panther\_he}&\DrvOld&IMS Panther HE motor axis.\\
  \textbf{panther\_hi}&\DrvOld&IMS Panther HI motor axis.\\
\end{longtable}

\subsection{Joerger SMC24 CAMAC Motor Controller}
\begin{longtable}[l]{lll}
  \textbf{smc24}&\DrvOld&Joerger SMC24 motor axis.\\
\end{longtable}

\subsection{Joerger VSC16 Counter/Timer Controller (via VME Bus I/O)}
\begin{longtable}[l]{lll}
  \textbf{vsc16}&\DrvOld&Controller driver.\\
  \textbf{vsc16\_scaler}&\DrvOld&Joerger VSC16 scaler channel.\\
  \textbf{vsc16\_timer}&\DrvOld&Joerger VSC16 timer channel.\\
\end{longtable}

\subsection{Keithley 199 Series Multimeters/Scanners}
\begin{longtable}[l]{lll}
  \textbf{keithley199}&\DrvWorking&Controller driver.\\
  \textbf{keithley199\_ainput}&\DrvWorking&Read measurements from a Keithley 199.\\
\end{longtable}

\subsection{Keithley 428 Current Amplifier}
\begin{longtable}[l]{lll}
  \textbf{keithley428}&\DrvWorking&Keithley 428 amplifier.\\
\end{longtable}

\subsection{Keithley 2000 Series Multimeters}
\begin{longtable}[l]{lll}
  \textbf{keithley2000}&\DrvOld&Controller driver.\\
  \textbf{keithley2000\_ainput}&\DrvOld&Keithley 2000 analog inputs.\\
\end{longtable}

\subsection{Keithley 2400 Series Switching Multimeters}
\begin{longtable}[l]{lll}
  \textbf{keithley2400}&\DrvWorking&Controller driver.\\
  \textbf{keithley2400\_amp}&\DrvWorking&Keithley 2400 amplifiers.\\
  \textbf{keithley2400\_ainput}&\DrvWorking&Keithley 2400 analog inputs.\\
  \textbf{keithley2400\_aoutput}&\DrvWorking&Keithley 2400 analog outputs.\\
  \textbf{keithley2400\_doutput}&\DrvWorking&Keithley 2400 digital outputs.\\
\end{longtable}

\subsection{Keithley 2600 Series SourceMeters}
\begin{longtable}[l]{lll}
  \textbf{keithley2600}&\DrvWorking&Controller driver.\\
  \textbf{keithley2600\_ainput}&\DrvWorking&Keithley 2600 analog inputs.\\
  \textbf{keithley2600\_aoutput}&\DrvWorking&Keithley 2600 analog outputs.\\
\end{longtable}

\subsection{Keithley 2700 Series Switching Multimeters}
\begin{longtable}[l]{lll}
  \textbf{keithley2700}&\DrvWorking&Controller driver.\\
  \textbf{keithley2700\_aoutput}&\DrvWorking&Keithley 2700 analog outputs.\\
\end{longtable}

\subsection{Keyboard}
\begin{longtable}[l]{lll}
  \textbf{keyboard\_dinput}&\DrvWorking&Uses keypresses on a keyboard to simulate a digital input.\\
\end{longtable}

\subsection{Kinetic Systems KS3063 16-bit Input Gate/Output Registers (via CAMAC)}
\begin{longtable}[l]{lll}
  \textbf{ks3063\_in}&\DrvOld&Kinetic Systems KS3063 digital input.\\
  \textbf{ks3063\_out}&\DrvOld&Kinetic Systems KS3063 digital output.\\
\end{longtable}

\subsection{Kinetic Systems 3112 12-bit DAC (via CAMAC)}
\begin{longtable}[l]{lll}
  \textbf{ks3112}&\DrvOld&Kinetic Systems KS3112 CAMAC DAC.\\
\end{longtable}

\subsection{Kinetic Systems 3512 12-bit ADC (via CAMAC)}
\begin{longtable}[l]{lll}
  \textbf{ks3512}&\DrvOld&Kinetic Systems KS3512 CAMAC ADC.\\
\end{longtable}

\subsection{Kinetic Systems KS3610 CAMAC Scaler}
\begin{longtable}[l]{lll}
  \textbf{ks3610}&\DrvOld&Kinetic Systems KS3610 scaler.\\
\end{longtable}

\subsection{Kinetic Systems 3640 Up/Down Counter (via CAMAC)}
\begin{longtable}[l]{lll}
  \textbf{ks3640}&\DrvOld&Kinetic Systems KS3640 CAMAC up/down counter as MX encoder.\\
\end{longtable}

\subsection{Kohzu SC-200, SC-400, and SC-800 Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{kohzu\_sc}&\DrvWorking&Controller driver.\\
  \textbf{kohzu\_sc\_motor}&\DrvWorking&Kohzu SC-200/400/800 motor axis.\\
\end{longtable}

\subsection{LakeShore 330 Temperature Controller}
\begin{longtable}[l]{lll}
  \textbf{ls330\_motor}&\DrvWorking&LakeShore 330 temperature as a motor.\\
\end{longtable}

\subsection{Linkam T92, T93, T94, and T95 Temperature Controllers}
\begin{longtable}[l]{lll}
  \textbf{linkam\_t9x}&\DrvOld&Controller for Linkam T9x series cooling system controllers.\\
  \textbf{linkam\_t9x\_motor}&\DrvOld&Motion control part of T9x controllers.\\
  \textbf{linkam\_t9x\_pump}&\DrvOld&Pump control part of T9x controllers.\\
  \textbf{linkam\_t9x\_temp}&\DrvOld&Temperature control part of T9x controllers.\\
\end{longtable}

\subsection{Linux parport Driver for Parallel Ports as Digital I/O}
\begin{longtable}[l]{lll}
  \textbf{linux\_parport}&\DrvWorking&(LINUX) I/O driver.\\
  \textbf{linux\_parport\_in}&\DrvWorking&(LINUX) Parallel port as digital input.\\
  \textbf{linux\_parport\_out}&\DrvWorking&(LINUX) Parallel port as digital output.\\
\end{longtable}

\subsection{LPT Printer Ports (via portio)}
\begin{longtable}[l]{lll}
  \textbf{lpt}&\DrvOld&Controller driver.\\
  \textbf{lpt\_in}&\DrvOld&LPT printer port as an 8-bit digital input.\\
  \textbf{lpt\_out}&\DrvOld&LPT printer port as an 8-bit digital output.\\
\end{longtable}

\subsection{marXperts Mar 345 Image Plate Detectors}
\begin{longtable}[l]{lll}
  \textbf{mar345}&\DrvNeverFinished&Mar345 image plate control.\\
\end{longtable}

\subsection{marXperts Desktop Beamline Goniostat Controller}
\begin{longtable}[l]{lll}
  \textbf{mardtb}&\DrvPossiblyBroken&Controller driver.\\
  \textbf{mardtb\_motor}&\DrvPossiblyBroken&MarDTB motor axis.\\
  \textbf{mardtb\_shutter}&\DrvPossiblyBroken&Controls MarDTB shutter.\\
  \textbf{mardtb\_status}&\DrvPossiblyBroken&Reads out MarDTB parameters.\\
\end{longtable}

\subsection{McLennan PM304 Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{pm304}&\DrvOld&PM304 motor axis.\\
\end{longtable}

\subsection{McLennan PM600 and PM304 Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{mclennan}&\DrvRecent&Mclennan motor axis.\\
  \textbf{mclennan\_ain}&\DrvRecent&Mclennan analog inputs.\\
  \textbf{mclennan\_aout}&\DrvRecent&Mclennan analog outputs.\\
  \textbf{mclennan\_din}&\DrvRecent&Mclennan digital inputs.\\
  \textbf{mclennan\_dout}&\DrvRecent&Mclennan digital outputs.\\
\end{longtable}

\subsection{Miscellaneous Devices}
\begin{longtable}[l]{lll}
  \textbf{ainput\_as\_dinput}&\DrvWorking&Treat an analog input as a digital input.\\
  \textbf{aoutput\_as\_doutput}&\DrvWorking&Use an analog output to generate digital output signals.\\
  \textbf{blind\_relay}&\DrvWorking&Relay using an MX digital output with no feedback.\\
  \textbf{dac\_motor}&\DrvWorking&Control an MX analog output as if it were a motor.\\
  \textbf{digital\_fanin}&\DrvWorking&Compute a logical function of several MX record fields (and, or, xor).\\
  \textbf{digital\_fanout}&\DrvWorking&Forward a digital output value to several MX record fields.\\
  \textbf{digital\_output\_pulser}&\DrvWorking&Pulse generator that uses an MX digital output and operating system (OS) timers.\\
  \textbf{generic\_relay}&\DrvWorking&Relay using an MX digital output with status read from an MX digital I/O.\\
  \textbf{pulsed\_relay}&\DrvWorking&Like a \textit{generic\_relay}, but active only for a requested pulse time.\\
  \textbf{relay\_as\_doutput}&\DrvWorking&Treat a relay as a digital output.\\
  \textbf{relay\_pulser}&\DrvWorking&Treat a relay as a pulse generator.\\
  \textbf{timer\_fanout}&\DrvWorking&Controls multiple MX timers as if they were one timer.\\
\end{longtable}

\subsection{MODBUS Coils, Inputs, and Registers}
\begin{longtable}[l]{lll}
  \textbf{modbus\_ainput}&\DrvRecent&MODBUS analog inputs.\\
  \textbf{modbus\_aoutput}&\DrvRecent&MODBUS analog outputs.\\
  \textbf{modbus\_dinput}&\DrvRecent&MODBUS digital inputs.\\
  \textbf{modbus\_doutput}&\DrvRecent&MODBUS digital outputs.\\
\end{longtable}

\subsection{Motorola MC6821 Digital I/O Chips (via portio)}
\begin{longtable}[l]{lll}
  \textbf{mc6821}&\DrvOld&Controller driver.\\
  \textbf{mc6821\_in}&\DrvOld&Motorola MC6821 8-bit digital input.\\
  \textbf{mc6821\_out}&\DrvOld&Motorola MC6821 8-bit digital output.\\
\end{longtable}

\subsection{MX Network Devices}
\begin{longtable}[l]{lll}
  \textbf{autoscale\_net}&\DrvWorking&Autoscale device controlled by a remote MX server.\\
  \textbf{network\_ainput}&\DrvWorking&Analog input controlled by a remote MX server.\\
  \textbf{network\_amplifier}&\DrvWorking&Amplifier controlled by a remote MX server.\\
  \textbf{network\_aoutput}&\DrvWorking&Analog output controlled by a remote MX server.\\
  \textbf{network\_area\_detector}&\DrvWorking&Area detector controlled by a remote MX server.\\
  \textbf{network\_dinput}&\DrvWorking&Digital input controlled by a remote MX server.\\
  \textbf{network\_doutput}&\DrvWorking&Digital output controlled by a remote MX server.\\
  \textbf{network\_gpib}&\DrvWorking&GPIB interface controlled by a remote MX server.\\
  \textbf{network\_mca}&\DrvWorking&Multichannel analyzer controlled by a remote MX server.\\
  \textbf{network\_mcai}&\DrvWorking&Multichannel analog input controlled by a remote MX server.\\
  \textbf{network\_mce}&\DrvWorking&Multichannel encoder controlled by a remote MX server.\\
  \textbf{network\_mcs}&\DrvWorking&Multichannel scaler controlled by a remote MX server.\\
  \textbf{network\_motor}&\DrvWorking&Motor axis controlled by a remote MX server.\\
  \textbf{network\_operation}&\DrvWorking&An operation controlled by a remote MX server.\\
  \textbf{network\_ptz}&\DrvWorking&Pan/Tilt/Zoom device controlled by a remote MX server.\\
  \textbf{network\_pulser}&\DrvWorking&Pulse generator controlled by a remote MX server.\\
  \textbf{network\_relay}&\DrvWorking&Relay controlled by a remote MX server.\\
  \textbf{network\_rs232}&\DrvWorking&RS-232 device controlled by a remote MX server.\\
  \textbf{network\_sample\_changer}&\DrvWorking&Sample changer controlled by a remote MX server.\\
  \textbf{network\_sca}&\DrvWorking&Single channel analyzer controlled by a remote MX server.\\
  \textbf{network\_scaler}&\DrvWorking&Scaler controlled by a remote MX server.\\
  \textbf{network\_timer}&\DrvWorking&Timer controlled by a remote MX server.\\
  \textbf{network\_vinput}&\DrvWorking&Video input controlled by a remote MX server.\\
  \textbf{network\_wvin}&\DrvWorking&Waveform input controlled by a remote MX server.\\
  \textbf{network\_wvout}&\DrvWorking&Waveform output controlled by a remote MX server.\\
\end{longtable}

\subsection{New Focus Picomotor Controllers}
\begin{longtable}[l]{lll}
  \textbf{picomotor\_controller}&\DrvOld&Controller driver.\\
  \textbf{picomotor}&\DrvOld&Picomotor motor axis.\\
  \textbf{picomotor\_ain}&\DrvOld&Picomotor analog input.\\
  \textbf{picomotor\_din}&\DrvOld&Picomotor digital input.\\
  \textbf{picomotor\_dout}&\DrvOld&Picomotor digital output.\\
\end{longtable}

\subsection{Newport ESP300 and ESP301 Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{esp}&\DrvWorking&Controller driver.\\
  \textbf{esp\_motor}&\DrvWorking&Newport ESP300/ESP301 motor axis.\\
\end{longtable}

\subsection{Newport MM3000 Motor Controller}
\begin{longtable}[l]{lll}
  \textbf{mm3000}&\DrvOld&Controller driver.\\
  \textbf{mm3000\_motor}&\DrvOld&Newport MM3000 motor axis.\\
\end{longtable}

\subsection{Newport MM4000 and MM4005 Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{mm4000}&\DrvOld&Controller driver.\\
  \textbf{mm4000\_motor}&\DrvOld&Newport MM4000/MM4005 motor axis.\\
\end{longtable}

\subsection{Newport Electronics/Omega Counter/Timer}
\begin{longtable}[l]{lll}
  \textbf{p6000a}&\DrvRecent&Newport Electronics counter/timer as an analog input.\\
\end{longtable}

\subsection{Newport Electronics/Omega Temperature and Process Controllers}
\begin{longtable}[l]{lll}
  \textbf{iseries}&\DrvWorking&Controller driver.\\
  \textbf{iseries\_ainput}&\DrvWorking&iSeries analog inputs.\\
  \textbf{iseries\_aoutput}&\DrvWorking&iSeries analog outputs.\\
  \textbf{iseries\_dinput}&\DrvWorking&iSeries digital inputs.\\
  \textbf{iseries\_doutput}&\DrvWorking&iSeries digital outputs.\\
\end{longtable}

\subsection{NSLS MMC32 Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{mmc32}&\DrvOld&NSLS MMC32 motor axis.\\
\end{longtable}

\subsection{nuLogic/National Instruments PC-Step Motor Controllers (via portio)}
\begin{longtable}[l]{lll}
  \textbf{pcstep}&\DrvOld&Controller driver.\\
  \textbf{pcstep\_motor}&\DrvOld&nuLogic/NI PC-Step motor axis..\\
\end{longtable}

\subsection{Numato Lab GPIO Module}
\begin{longtable}[l]{lll}
  \textbf{numato\_gpio}&\DrvWorking&Controller driver.\\
  \textbf{numato\_gpio\_ainput}&\DrvWorking&Numato Lab GPIO analog inputs.\\
  \textbf{numato\_gpio\_dinput}&\DrvWorking&Numato Lab GPIO digital inputs.\\
  \textbf{numato\_gpio\_doutput}&\DrvWorking&Numato Lab GPIO digital outputs.\\
\end{longtable}

\subsection{Oceaneering Space Systems $\mu$-GLIDE Micropositioning Controller}
\begin{longtable}[l]{lll}
  \textbf{uglide}&\DrvWorking&Controller driver.\\
  \textbf{uglide\_motor}&\DrvWorking&OSS $\mu$-GLIDE motor axis.\\
\end{longtable}

\subsection{OMS Motion VME58 Motor Controllers (via VME Bus I/O)}
\begin{longtable}[l]{lll}
  \textbf{vme58}&\DrvNeverFinished&Controller driver.\\
  \textbf{vme58\_motor}&\DrvNeverFinished&OMS VME58 motor axis.\\
\end{longtable}

\subsection{Ortec 974 Counter/Timer NIM Modules}
\begin{longtable}[l]{lll}
  \textbf{ortec974}&\DrvOld&NIM 4 channel counter/timer.\\
  \textbf{ortec974\_scaler}&\DrvOld&Ortec 974 scaler channel.\\
  \textbf{ortec974\_timer}&\DrvOld&Ortec 974 timer channel.\\
\end{longtable}

\subsection{Oxford Cryosystems 600 Cryostream Controllers}
\begin{longtable}[l]{lll}
  \textbf{cryostream600\_motor}&\DrvOld&Controls a Cryostream 600 temperature controller as if it is a motor.\\
  \textbf{cryostream600\_status}&\DrvOld&Reads status values from a Cryostream 600 temperature controller.\\
\end{longtable}

\subsection{Oxford Danfysik Cyberstar X1000 Scintillation Detector System}
\begin{longtable}[l]{lll}
  \textbf{cyberstar\_x1000}&\DrvWorking&Cyberstar X1000 as a single channel analyzer.\\
  \textbf{cyberstar\_x1000\_aout}&\DrvWorking&Cyberstar X1000 analog outputs for high voltage and delay.\\
\end{longtable}

\subsection{Oxford Danfysik IC PLUS Intensity Monitors}
\begin{longtable}[l]{lll}
  \textbf{icplus}&\DrvOld&Controller driver.\\
  \textbf{icplus\_current}&\DrvOld&Oxford Danfysik IC PLUS input current.\\
  \textbf{icplus\_din}&\DrvOld&Oxford Danfysik IC PLUS digital input.\\
  \textbf{icplus\_dout}&\DrvOld&Oxford Danfysik IC PLUS digital output.\\
  \textbf{icplus\_voltage}&\DrvOld&Oxford Danfysik IC PLUS high voltage.\\
\end{longtable}

\subsection{Oxford Danfysik QBPM Intensity Monitors}
\begin{longtable}[l]{lll}
  \textbf{qbpm}&\DrvOld&Controller driver.\\
  \textbf{qbpm\_current}&\DrvOld&Oxford Danfysik QBPM input current.\\
  \textbf{qbpm\_din}&\DrvOld&Oxford Danfysik QBPM digital input.\\
  \textbf{qbpm\_dout}&\DrvOld&Oxford Danfysik QBPM digital output.\\
  \textbf{qbpm\_mcai}&\DrvOld&Oxford Danfysik QBPM reads out all 4 channels.\\
  \textbf{qbpm\_voltage}&\DrvOld&Oxford Danfysik QBPM high voltage.\\
\end{longtable}

\subsection{Oxford Instruments Cryojet Temperature Controllers}
\begin{longtable}[l]{lll}
  \textbf{cryojet}&\DrvOld&Controller driver.\\
  \textbf{cryojet\_ainput}&\DrvOld&Reads analog status values from a Cryojet controller.\\
  \textbf{cryojet\_aoutput}&\DrvOld&Controls analog settings for a Cryojet controller.\\
  \textbf{cryojet\_doutput}&\DrvOld&Controls digital settings for a Cryojet controller.\\
  \textbf{cryojet\_motor}&\DrvOld&Controls a Cryojet temperature controller as if it were a motor.\\
\end{longtable}

\subsection{Oxford Instruments ILM (Intelligent Level Meter) Controllers}
\begin{longtable}[l]{lll}
  \textbf{ilm}&\DrvOld&Controller driver.\\
  \textbf{ilm\_ainput}&\DrvOld&ILM values returned by the READ command.\\
  \textbf{ilm\_sample\_rate}&\DrvOld&Change sample rate of ILM controller.\\
  \textbf{ilm\_status}&\DrvOld&ILM status values from the X command.\\
\end{longtable}

\subsection{Oxford Instruments ISOBUS Devices}
\begin{longtable}[l]{lll}
  \textbf{isobus}&\DrvOld&Controller driver.\\
\end{longtable}

\subsection{Oxford Instruments ITC503 Temperature Controllers}
\begin{longtable}[l]{lll}
  \textbf{itc503}&\DrvOld&Controller driver.\\
  \textbf{itc503\_ainput}&\DrvOld&Reads analog status values from an ITC503 controller.\\
  \textbf{itc503\_aoutput}&\DrvOld&Controls analog settings for an ITC503 controller.\\
  \textbf{itc503\_doutput}&\DrvOld&Controls digital settings for an ITC503 controller.\\
  \textbf{itc503\_motor}&\DrvOld&Controls an ITC503 temperature controller as if it were a motor.\\
\end{longtable}

\subsection{Panasonic KX-DP702 Pan-Tilt-Zoom Cameras}
\begin{longtable}[l]{lll}
  \textbf{panasonic\_kx\_dp702}&\DrvOld&Panasonic VISCA protocol driver.\\
  \textbf{panasonic\_kx\_dp702\_ptz}&\DrvOld&Panasonic KX-DP702 pan/tilt/zoom driver.\\
\end{longtable}

\subsection{Parker Hannifin Compumotor 6000 and 6K Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{compumotor\_int}&\DrvWorking&Controller driver.\\
  \textbf{compumotor}&\DrvWorking&Compumotor 6000/6K motor axis.\\
  \textbf{compumotor\_lin}&\DrvWorking&Compumotor 6000/6K linear interpolation moves of several motors.\\
  \textbf{compumotor\_din}&\DrvWorking&Compumotor 6000/6K digital input.\\
  \textbf{compumotor\_dout}&\DrvWorking&Compumotor 6000/6K digital output.\\
\end{longtable}

\subsection{Pfeiffer TPG 261 and TPG 262 Vacuum Gauge Controllers}
\begin{longtable}[l]{lll}
  \textbf{tpg262}&\DrvOld&Controller driver.\\
  \textbf{tpg262\_pressure}&\DrvOld&Pfeiffer TPG 261/262 pressure reading.\\
\end{longtable}

\subsection{Phidget Stepper Motor Controller (old non-HID)}
\begin{longtable}[l]{lll}
  \textbf{phidget\_old\_stepper\_controller}&\DrvOld&Controller driver.\\
  \textbf{phidget\_old\_stepper}&\DrvOld&Phidget stepper axis (old non-HID).\\
\end{longtable}

\subsection{Physik Instrumente E-662 LVPTZ Servo Controller}
\begin{longtable}[l]{lll}
  \textbf{e662}&\DrvOld&Physik Instrumente E-662 LVPTz motor axis.\\
\end{longtable}

\subsection{Pontech STP100 Motor Controller}
\begin{longtable}[l]{lll}
  \textbf{stp100\_motor}&\DrvOld&Pontech STP100 motor axis.\\
\end{longtable}

\subsection{Portio Digital I/O (via portio)}
\begin{longtable}[l]{lll}
  \textbf{portio\_dinput}&\DrvRecent&Read from an x86 I/O port.\\
  \textbf{portio\_doutput}&\DrvRecent&Write to an x86 I/O port.\\
\end{longtable}

\subsection{Prairie Digital Model 40 Data Acquisition and Control Module}
\begin{longtable}[l]{lll}
  \textbf{pdi40}&\DrvOld&Controller driver.\\
  \textbf{pdi40\_motor}&\DrvOld&PDI 40 motor axis.\\
\end{longtable}

\subsection{Prairie Digital Model 45 Data Acquisition and Control Module}
\begin{longtable}[l]{lll}
  \textbf{pdi45}&\DrvOld&Controller driver.\\
  \textbf{pdi45\_ainput}&\DrvOld&PDI45 analog inputs.\\
  \textbf{pdi45\_aoutput}&\DrvOld&PDI45 analog outputs.\\
  \textbf{pdi45\_dinput}&\DrvOld&PDI45 digital inputs.\\
  \textbf{pdi45\_doutput}&\DrvOld&PDI45 digital outputs.\\
  \textbf{pdi45\_pulser}&\DrvOld&PDI45 pulse generator.\\
  \textbf{pdi45\_scaler}&\DrvNeverFinished&PDI45 digital outputs.\\
  \textbf{pdi45\_timer}&\DrvOld&PDI45 digital outputs.\\
\end{longtable}

\subsection{Pyramid Technical Consultants I404 Digital Electrometer}
\begin{longtable}[l]{lll}
  \textbf{i404}&\DrvWorking&Controller driver.\\
  \textbf{i404\_amp}&\DrvWorking&I404 amplifier channel.\\
  \textbf{i404\_mcai}&\DrvWorking&I404 reads out all 4 channels.\\
\end{longtable}

\subsection{Quantum Detectors Merlin Medipix Area Detectors}
\begin{longtable}[l]{lll}
  \textbf{merlin\_medipix}&\DrvWorking&Merlin Medipix area detectors.\\
\end{longtable}

\subsection{Radix Instruments Databox Motor Controller}
\begin{longtable}[l]{lll}
  \textbf{databox}&\DrvOld&Controller driver.\\
  \textbf{databox\_mce}&\DrvOld&Reports stored Radix Databox motor positions.\\
  \textbf{databox\_mcs}&\DrvOld&Radix Databox MCS.\\
  \textbf{databox\_motor}&\DrvOld&Radix Databox motor axis.\\
  \textbf{databox\_scaler}&\DrvOld&Radix Databox scaler channel.\\
  \textbf{databox\_timer}&\DrvOld&Radix Databox timer.\\
\end{longtable}

\subsection{Rayonix MarCCD}
\begin{longtable}[l]{lll}
  \textbf{marccd}&\DrvWorking&MarCCD area detector interface started from the MarCCD GUI.\\
  \textbf{marccd\_server\_socket}&\DrvWorking&MarCCD area detector control via MarUSA-provided server socket program.\\
  \textbf{marccd\_shutter}&\DrvWorking&Controls MarCCD shutter.\\
\end{longtable}

\subsection{Roentec RCL Multichannel Analyzers}
\begin{longtable}[l]{lll}
  \textbf{roentec\_rcl\_mca}&\DrvWorking&Roentec MCAs using the RCL 2.2 command language.\\
\end{longtable}

\subsection{Scientific Instruments 9650 Temperature Controllers}
\textit{Warning:} The controller owned by MRCAT has a broken remote interface
and the Scientific Instruments company no longer has anyone who can fix
these controllers.  So it is not know whether the drivers below really work
with a controller that is not broken.
\begin{longtable}[l]{lll}
  \textbf{si9650\_motor}&\DrvNeverFinished&Controls a Scientific Instruments 9650 temperature controller as if it were a motor.\\
  \textbf{si9650\_status}&\DrvNeverFinished&Reads status values from a Scientific Instruments 9650 temperature controller.\\
\end{longtable}

\subsection{SCIPE}
\begin{longtable}[l]{lll}
  \textbf{scipe\_server}&\DrvObsolete&SCIPE network server.\\
  \textbf{scipe\_ain}&\DrvObsolete&SCIPE analog inputs.\\
  \textbf{scipe\_amplifier}&\DrvObsolete&SCIPE amplifier.\\
  \textbf{scipe\_aout}&\DrvObsolete&SCIPE analog outputs.\\
  \textbf{scipe\_din}&\DrvObsolete&SCIPE digital inputs.\\
  \textbf{scipe\_dout}&\DrvObsolete&SCIPE digital outputs.\\
  \textbf{scipe\_motor}&\DrvObsolete&SCIPE motor axis.\\
  \textbf{scipe\_scaler}&\DrvObsolete&SCIPE scaler.\\
  \textbf{scipe\_timer}&\DrvObsolete&SCIPE timer.\\
\end{longtable}

\subsection{Software Emulated Devices}
\begin{longtable}[l]{lll}
  \textbf{disabled\_motor}&\DrvWorking&Disabled motor.\\
  \textbf{file\_vinput}&\DrvWorking&Emulated video input that reads from a directory of existing image files.\\
  \textbf{function\_generator\_scaler}&\DrvWorking&Software emulated scaler that acts like a function generator.\\
  \textbf{interval\_timer}&\DrvWorking&Uses an MX OS interval timer as a timer.\\
  \textbf{monte\_carlo\_mca}&\DrvWorking&Software emulated MCA using simple Monte Carlo calculations.\\
  \textbf{soft\_ainput}&\DrvWorking&Software emulated analog input.\\
  \textbf{soft\_amplifier}&\DrvWorking&Software emulated amplifier.\\
  \textbf{soft\_aoutput}&\DrvWorking&Software emulated analog output.\\
  \textbf{soft\_area\_detector}&\DrvWorking&Software-emulated area detector that uses an MX video input to get frames.\\
  \textbf{soft\_camac}&\DrvRecent&Software emulated CAMAC interface.\\
  \textbf{soft\_camera\_link}&\DrvRecent&Software emulated Camera Link interface.\\
  \textbf{soft\_dinput}&\DrvWorking&Software emulated digital input.\\
  \textbf{soft\_doutput}&\DrvWorking&Software emulated digital output.\\
  \textbf{soft\_mca}&\DrvWorking&Software emulated multichannel analyzer.\\
  \textbf{soft\_mce}&\DrvNeverFinished&Uses an OS thread to periodically record motor positions.\\
  \textbf{soft\_mcs}&\DrvWorking&Software emulated multichannel scaler.\\
  \textbf{soft\_motor}&\DrvWorking&Software emulated motor.\\
  \textbf{soft\_rs232}&\DrvWorking&Software emulation of an RS-232 interface.\\
  \textbf{soft\_sample\_changer}&\DrvWorking&Software-emulated sample changer.\\
  \textbf{soft\_sca}&\DrvWorking&Software emulated single channel analyzer.\\
  \textbf{soft\_scaler}&\DrvWorking&Software emulated scaler that reads scaler values from a precomputed table.\\
  \textbf{soft\_timer}&\DrvWorking&Software emulated timer that uses OS timer ticks for timing.\\
  \textbf{soft\_vinput}&\DrvWorking&Software-emulated video input with selectable image patterns.\\
\end{longtable}

\subsection{Sony Network Cameras}
\begin{longtable}[l]{lll}
  \textbf{sony\_snc}&\DrvNeverFinished&Sony network camera.\\
\end{longtable}

\subsection{Sony VISCA Pan-Tilt-Zoom Cameras}
\begin{longtable}[l]{lll}
  \textbf{sony\_visca}&\DrvOld&Sony VISCA protocol driver.\\
  \textbf{sony\_visca\_ptz}&\DrvOld&Sony VISCA-based pan/tilt/zoom controller.\\
\end{longtable}

\subsection{Spec Remote Server Devices}
\begin{longtable}[l]{lll}
  \textbf{spec\_command}&\DrvOld&Sends commands to a remote Spec server.\\
  \textbf{spec\_motor}&\DrvOld&Motor axis controlled by a remote Spec server.\\
  \textbf{spec\_scaler}&\DrvOld&Scaler channel controlled by a remote Spec server.\\
  \textbf{spec\_timer}&\DrvOld&Timer controlled by a remote Spec server.\\
\end{longtable}

\subsection{Spellman DF3/FF3 High Voltage Power Supplies}
\begin{longtable}[l]{lll}
  \textbf{spellman\_df3}&\DrvOld&Controller driver.\\
  \textbf{spellman\_df3\_ain}&\DrvOld&Spellman DF3/FF3 analog inputs.\\
  \textbf{spellman\_df3\_aout}&\DrvOld&Spellman DF3/FF3 analog outputs.\\
  \textbf{spellman\_df3\_din}&\DrvOld&Spellman DF3/FF3 digital inputs.\\
  \textbf{spellman\_df3\_dout}&\DrvOld&Spellman DF3/FF3 digital outputs.\\
\end{longtable}

\subsection{Stanford Research Systems DG645 Digital Delay Generator}
\begin{longtable}[l]{lll}
  \textbf{dg645}&\DrvWorking&Controller driver.\\
  \textbf{dg645\_pulser}&\DrvWorking&SRS DG645 pulse generator.\\
  \textbf{dg645\_burst\_pulser}&\DrvWorking&SRS DG645 pulse generator in burst mode.\\
\end{longtable}

\subsection{Stanford Research Systems SIM900 Mainframes}
\begin{longtable}[l]{lll}
  \textbf{sim900}&\DrvWorking&Controller driver.\\
  \textbf{sim900\_port}&\DrvWorking&SIM900-based serial port.\\
  \textbf{sim960}&\DrvWorking&SIM960 analog PID controller.\\
  \textbf{sim980}&\DrvWorking&SIM980 summing analog input.\\
  \textbf{sim983}&\DrvWorking&SIM983 scaling amplifier.\\
\end{longtable}

\subsection{Stanford Research Systems SR570 Current Amplifier}
\begin{longtable}[l]{lll}
  \textbf{sr570}&\DrvWorking&SR570 current amplifier.\\
\end{longtable}

\subsection{Stanford Research Systems SR630 16 Channel Thermocouple Reader}
\begin{longtable}[l]{lll}
  \textbf{sr630}&\DrvOld&Controller driver.\\
  \textbf{sr630\_ainput}&\DrvOld&SR630 thermocouple input channels.\\
  \textbf{sr630\_aoutput}&\DrvOld&SR630 voltage outputs.\\
\end{longtable}

\subsection{Struck SIS3801 Multichannel Scaler (via VME)}
\begin{longtable}[l]{lll}
  \textbf{sis3801}&\DrvWorking&Struck SIS3801 multichannel scaler.\\
  \textbf{sis3801\_pulser}&\DrvOld&Struck SIS3801 used as a pulse generator.\\
\end{longtable}

\subsection{Struck SIS3807 Multichannel Pulse Generator (via VME)}
\begin{longtable}[l]{lll}
  \textbf{sis3807}&\DrvWorking&Controller driver.\\
  \textbf{sis3807\_pulser}&\DrvWorking&Struck SIS3807 used as a pulse generator.\\
\end{longtable}

\subsection{Struck SIS3820 Multichannel Scaler (via VME)}
\begin{longtable}[l]{lll}
  \textbf{sis3820}&\DrvRecent&Struck SIS3820 multichannel scaler.\\
\end{longtable}

\subsection{Synaccess netBooter Network Power Switch}
\begin{longtable}[l]{lll}
  \textbf{synaccess\_netbooter}&\DrvWorking&Controller driver.\\
  \textbf{synaccess\_netbooter\_ainput}&\DrvWorking&Synaccess netBooter current and temperature measurements.\\
  \textbf{synaccess\_netbooter\_relay}&\DrvWorking&Synaccess netBooter power outlet as MX relay.\\
\end{longtable}

\subsection{Systron-Donner M107 DC Voltage Source.}
\begin{longtable}[l]{lll}
  \textbf{systron\_donner\_m107}&\DrvOld&DC Voltage as analog output.\\
\end{longtable}

\subsection{UDT Instruments TRAMP Current Amplifier}
\begin{longtable}[l]{lll}
  \textbf{udt\_tramp}&\DrvOld&UDT TRAMP current amplifier.\\
\end{longtable}

\subsection{UMX-based Microcontrollers}
Currently implemented: \textit{Arduino Mega 2560 and Arduino Uno}
\begin{longtable}[l]{lll}
  \textbf{umx\_server}&\DrvWorking&UMX-based microcontroller server.\\
  \textbf{umx\_ainput}&\DrvWorking&UMX analog input.\\
  \textbf{umx\_aoutput}&\DrvWorking&UMX analog output.\\
  \textbf{umx\_dinput}&\DrvWorking&UMX digital input.\\
  \textbf{umx\_doutput}&\DrvWorking&UMX digital output.\\
  \textbf{umx\_pulser}&\DrvWorking&UMX pulse generator.\\
  \textbf{umx\_rc\_servo}&\DrvWorking&UMX RC servo motor.\\
\end{longtable}

\subsection{Velmex VP9000 Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{vp9000}&\DrvWorking&Controller driver.\\
  \textbf{vp9000\_motor}&\DrvWorking&Velmex VP9000 motor axis.\\
\end{longtable}

\subsection{VME Bus I/O}
\begin{longtable}[l]{lll}
  \textbf{vme\_dinput}&\DrvRecent&Read from a VME address.\\
  \textbf{vme\_doutput}&\DrvRecent&Write to a VME address.\\
\end{longtable}

\subsection{Wago 750}
Note: Wago 750 series devices support standard MODBUS, but have custom
hardware of their own as well.\newline
\begin{longtable}[l]{lll}
  \textbf{wago750\_modbus\_aout}&\DrvOld&Wago 750 MODBUS analog output.
	Can read back output value.\\
\end{longtable}

\subsection{Western Telematic Network Power Switch}
\begin{longtable}[l]{lll}
  \textbf{wti\_nps}&\DrvOld&Controller driver.\\
  \textbf{wti\_nps\_relay}&\DrvOld&Western Telematic power outlet as an MX relay.\\
\end{longtable}

\subsection{X10 CM17A (Firecracker) Home Automation Controllers}
\begin{longtable}[l]{lll}
  \textbf{cm17a}&\DrvOld&Controller driver.\\
  \textbf{cm17a\_doutput}&\DrvOld&X10 CM17A digital output driver.\\
\end{longtable}

\subsection{XIA HSC-1 Huber Slit Controllers}
\begin{longtable}[l]{lll}
  \textbf{hsc1}&\DrvOld&Controller driver.\\
  \textbf{hsc1\_motor}&\DrvOld&XIA HSC-1 motor axis.\\
\end{longtable}

\subsection{XIA PFCU Filter and Shutter Controllers}
\begin{longtable}[l]{lll}
  \textbf{pfcu}&\DrvWorking&Controller driver.\\
  \textbf{pfcu\_filter}&\DrvWorking&Controls a single PFCU filter as an MX relay.\\
  \textbf{pfcu\_filter\_summary}&\DrvWorking&Controls all PFCU filters in one operation.\\
  \textbf{pfcu\_shutter}&\DrvWorking&Controls a single PFCU shutter as an MX relay.\\
  \textbf{pfcu\_shutter\_timer}&\DrvWorking&Controls the exposure time of a PF252 shutter.\\
\end{longtable}

\subsection{Zaber Motor Controllers}
\begin{longtable}[l]{lll}
  \textbf{zaber}&\DrvProposed&Controller driver.\\
  \textbf{zaber\_motor}&\DrvProposed&Controls a single motor axis.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{MX Dynamically Loaded Modules}

\subsection{aravis.mxo \ \textbf{(Linux)}}
Aravis is a glib/gobject based library for video acquisition using Genicam
cameras.  It currently implements the gigabit ethernet and USB3 protocols 
used by industrial cameras.
\begin{longtable}[l]{lll}
  \textbf{aravis}&\DrvWorking&Aravis protocol interface.\\
  \textbf{aravis\_camera}&\DrvWorking&An MX video input interfaced via Aravis.\\
\end{longtable}

\subsection{aviex\_pccd.mxo \ \textbf{(Linux, Win32)}
\ \textit{(uses epix\_xclib.mxo)} }
Controls Aviex and Dexela area detectors created by Steve Naday.
\begin{longtable}[l]{lll}
  \textbf{pccd\_16080}&\DrvOld& Old BioCAT Aviex detector \textit{(nemesis)}.\\
  \textbf{pccd\_170170}&\DrvWorking& Synchrotron Soleil Aviex detector.\\
  \textbf{pccd\_4824}&\DrvOld& ESRF Aviex detector.\\
  \textbf{pccd\_9785}&\DrvRecent& BioCAT Dexela detector \textit{(staypuft)}.\\
\end{longtable}

\subsection{avt\_vimba.mxo \ \textbf{(Linux.Win32)} }
Allied Vision Technologies cameras using the Vimba C API.
\begin{longtable}[l]{lll}
  \textbf{avt\_vimba}&\DrvDeferred&Vimba C API interface.\\
  \textbf{avt\_vimba\_camera}&\DrvDeferred&MX video input driver using the AVT Vimba C API.\\
\end{longtable}

\subsection{bnc725.mxo \ \textbf{(Win32)} }
BNC725 digital delay generator using the vendor-provided Win32 C++ library.
\begin{longtable}[l]{lll}
  \textbf{bnc725}&\DrvDeferred&Win32 DLL interface.\\
  \textbf{bnc725\_pulser}&\DrvDeferred&BNC725 pulser.\\
\end{longtable}

\subsection{cbflib.mxo \ \textbf{(Implements ``cbflib'' extension)}  \ \textbf{(Linux, Win32)} }
An MX extension module for access to CBFlib.  CBFlib is a library of ANSI-C
functions providing a way to access CBF and imgCIF crystallography image files.

When finished, \textit{cbflib.mxo} will provide a way of saving
MX area detector images in CBF format.  \textit{cbflib.mxo} does not
contain any MX drivers.

\textbf{Status:} {\DrvInProgress}

\subsection{dalsa\_gev.mxo \ \textbf{(Linux)}}
A Linux interface to Teledyne DALSA GigE Vision-based cameras, using the
Linux-specific Dalsa GeV camera API.
\begin{longtable}[l]{lll}
  \textbf{dalsa\_gev}&\DrvWorking&Dalsa GeV API interface.\\
  \textbf{dalsa\_gev\_camera}&\DrvWorking&MX video input driver using the Dalsa GeV API on Linux.\\
\end{longtable}

\subsection{driverlinx\_portio.mxo \ \textbf{(Win32)}}
The DriverLINX port I/O driver for 32-bit Windows written by
Scientific Software Tools, Inc.  64-bit Windows is not supported.
\begin{longtable}[l]{lll}
  \textbf{driverlinx\_portio}&\DrvOld&32-bit Windows port I/O interface.\\
\end{longtable}

\subsection{edt.mxo \ \textbf{(Linux)} }
EDT Camera Link Cameras using the EDTpdv interface.
\begin{longtable}[l]{lll}
  \textbf{edt}&\DrvDeferred&EDTpdv interface.\\
  \textbf{edt\_video\_input}&\DrvDeferred&MX video input driver for EDT Camera Link cameras.\\
  \textbf{edt\_rs232}&\DrvDeferred&Serial port interface for EDT camera boards.\\
\end{longtable}

\subsection{epics.mxo \ \textbf{(Implements ``epics'' extension)}  \ \textbf{(Linux, Win32)} }
EPICS is a control system used widely at a variety of accelerators, telescopes,
and other installations.  \textit{epics.mxo} only depends on facilities
found in EPICS Base.
\begin{longtable}[l]{lll}
  \textbf{epics\_ainput}&\DrvWorking&MX analog input driver that reads from EPICS PVs.\\
  \textbf{epics\_aoutput}&\DrvWorking&MX analog output driver that writes to EPICS PVs.\\
  \textbf{epics\_area\_detector}&\DrvWorking&MX area detector driver for EPICS-controlled area detectors.\\
  \textbf{epics\_ccd}&\DrvObsolete&MX area detector driver for the obsolete EPICS CCD record.\\
  \textbf{epics\_dinput}&\DrvWorking&MX digital input driver that reads from EPICS PVs.\\
  \textbf{epics\_doutput}&\DrvWorking&MX digital output driver that writes to EPICS PVs.\\
  \textbf{epics\_mca}&\DrvWorking&MX MCA driver for the EPICS MCA record.\\
  \textbf{epics\_mcs}&\DrvWorking&MX MCS driver for the EPICS MCA record.\\
  \textbf{epics\_motor}&\DrvWorking&MX motor driver for the EPICS motor record.\\
  \textbf{epics\_scaler}&\DrvWorking&MX scaler driver for the EPICS scaler record.\\
  \textbf{epics\_scaler\_mce}&\DrvWorking&MX MCE driver for ``synchronous'' reads of EPICS motor and scaler values.\\
  \textbf{epics\_scaler\_mcs}&\DrvWorking&MX MCS driver for ``synchronous'' reads of multiple EPICS scaler values.\\
  \textbf{epics\_timer}&\DrvWorking&MX timer driver for the EPICS scaler record.\\
  \\
  \textbf{epics\_camac}&\DrvOld&MX CAMAC driver for the EPICS CAMAC record.\\
  \textbf{epics\_gpib}&\DrvOld&MX GPIB driver for the old EPICS GPIB record.\\
  \textbf{epics\_rs232}&\DrvOld&MX RS232 driver for the old EPICS RS232 record.\\
  \textbf{epics\_vme}&\DrvRecent&MX VME driver for the EPICS VME record.\\
  \\
  \textbf{epics\_char}&\DrvWorking& \\
  \textbf{epics\_short}&\DrvWorking& \\
  \textbf{epics\_long}&\DrvWorking& \\
  \textbf{epics\_float}&\DrvWorking& \\
  \textbf{epics\_double}&\DrvWorking& \\
  \textbf{epics\_string}&\DrvWorking& \\
  \\
  \textbf{epics\_timeout}&\DrvWorking&Provides a way to adjust EPICS timeouts.\\
\end{longtable}

\subsection{epics\_aps.mxo \ \textbf{(Linux, Win32)} \ \textbf{(uses epics.mxo)} }
EPICS PVs used at the Advanced Photon Source.
\begin{longtable}[l]{lll}
  \textbf{aps\_gap}&\DrvWorking&Gap and taper controls for APS insertion devices.\\
  \textbf{aps\_id\_qscan}&\DrvRecent&An MX quick scan that synchronizes with APS insertion device motion.\\
  \textbf{aps\_quadem\_amplifier}&\DrvRecent&APS Quad amplifier used for beam position monitors.\\
  \textbf{aps\_topup\_time}&\DrvRecent&Remaining time until the next APS topup injection.\\
\end{longtable}

\subsection{epics\_mbc.mxo \ \textbf{(Linux, Win32)} \ \textbf{(uses epics.mxo)} }
EPICS PVs used at the ALS 4.2.2 beamline at the Advanced Light Source.
\begin{longtable}[l]{lll}
  \textbf{mbc\_gsc\_trigger}&\DrvOld&ALS 4.2.2 beamline trigger using the Goniosync control.\\
  \textbf{mbc\_noir}&\DrvOld&NOIR area detector for the ALS 4.2.2 beamline.\\
  \textbf{mbc\_noir\_trigger}&\DrvOld&ALS 4.2.2 beamline trigger using the NOIR detector.\\
\end{longtable}

\subsection{epics\_pmac\_biocat.mxo \ \textbf{(Linux, Win32)} \ \textbf{(uses epics.mxo)} }
A version of \textit{epics\_pmac\_tc.mxo} that has been modified for use at the APS 18-ID (BioCAT) beamline.\\
\begin{longtable}[l]{lll}
  \textbf{epics\_pmac\_biocat}&\DrvWorking&VME-based PMAC and Turbo PMAC motors controlled via EPICS at the BioCAT beamline.\\
\end{longtable}

\subsection{epics\_pmac\_tc.mxo \ \textbf{(Linux, Win32)} \ \textbf{(uses epics.mxo)} }
EPICS PVs for VME-based PMAC and Turbo PMAC motors written by Tom Coleman for APS-19ID (SBC-CAT)
\begin{longtable}[l]{lll}
  \textbf{pmac\_tc\_motor}&\DrvWorking&VME-based PMAC and Turbo PMAC motors controlled via EPICS at the SBC-CAT beamline.\\
\end{longtable}

\subsection{epix\_xclib.mxo \ \textbf{(Linux, Win32)}}
\begin{longtable}[l]{lll}
  \textbf{epix\_xclib}&\DrvWorking&Interface for the EPIX, Inc. XCLIB frame grabber API.\\
  \textbf{epix\_camera\_link}&\DrvWorking&EPIX Camera Link API for serial I/O.\\
  \textbf{epix\_rs232}&\DrvWorking&Serial port interface for EPIX, Inc. video input boards.\\
  \textbf{epix\_xclib\_dinput}&\DrvWorking&Controls digital inputs for EPIX, Inc. cameras.\\
  \textbf{epix\_xclib\_doutput}&\DrvWorking&Controls digital outputs for EPIX, Inc. cameras.\\
  \textbf{epix\_xclib\_video\_input}&\DrvWorking&EPIX, Inc. video input.\\
\end{longtable}

\subsection{esone\_camac.mxo \ \textbf{(Linux, Win32)}}
\begin{longtable}[l]{lll}
  \textbf{esone\_camac}&\DrvOld&CAMAC interface driver that uses an ESONE-standard CAMAC library.\\
\end{longtable}

\subsection{fastcam\_pcclib.mxo \ \textbf{(Linux, Win32)} }
Interface for Photron FASTCAM cameras using the PccLib library.
\begin{longtable}[l]{lll}
  \textbf{fastcam\_pcclib}&\DrvNeverFinished&Interface to the Photron FASTCAM PccLib library.\\
  \textbf{fastcam\_pcclib\_camera}&\DrvNeverFinished&Photron FASTCAM camera.\\
\end{longtable}

\subsection{galil\_gclib.mxo \ \textbf{(Linux, Win32)} }
Interface for Galil motors controlled using the Gclib library.
\begin{longtable}[l]{lll}
  \textbf{galil\_gclib}&\DrvWorking&Interface to the Galil Gclib library.\\
  \textbf{galil\_gclib\_motor}&\DrvWorking&Galil Gclib controlled motors.\\
  \textbf{galil\_gclib\_ainput}&\DrvInProgress&Galil Gclib controlled analog inputs.\\
  \textbf{galil\_gclib\_aoutput}&\DrvInProgress&Galil Gclib controlled analog outputs.\\
  \textbf{galil\_gclib\_dinput}&\DrvInProgress&Galil Gclib controlled digital inputs.\\
  \textbf{galil\_gclib\_doutput}&\DrvInProgress&Galil Gclib controlled digital outputs.\\
\end{longtable}

\subsection{k8055.mxo \ \textbf{(Linux, Win32)} }
Controls Velleman K8055 USB experimenter interface boards.  Uses either libk8055 or K8055D.DLL.
\begin{longtable}[l]{lll}
  \textbf{k8055}&\DrvWorking&Interface driver for the Velleman K8055.\\
  \textbf{k8055\_ainput}&\DrvWorking&Analog inputs for the Velleman K8055.\\
  \textbf{k8055\_aoutput}&\DrvWorking&Analog outputs for the Velleman K8055.\\
  \textbf{k8055\_dinput}&\DrvWorking&Digital inputs for the Velleman K8055.\\
  \textbf{k8055\_doutput}&\DrvWorking&Digital outputs for the Velleman K8055.\\
  \textbf{k8055\_scaler}&\DrvWorking&Scaler for Velleman K8055 counters.\\
  \textbf{k8055\_timer}&\DrvWorking&Timer for the Velleman K8055.\\
\end{longtable}

\subsection{labjack\_ux.mxo \ \textbf{(Linux, Win32)} }
Interface for Labjack U3, U6, and U9 USB data acquisition devices.
\begin{longtable}[l]{lll}
  \textbf{labjack\_ux}&\DrvNeverFinished&Interface driver for the Labjack.\\
  \textbf{labjack\_ux\_ainput}&\DrvNeverFinished&Analog input for the Labjack.\\
  \textbf{labjack\_ux\_aoutput}&\DrvNeverFinished&Analog output for the Labjack.\\
  \textbf{labjack\_ux\_dinput}&\DrvNeverFinished&Digital input for the Labjack.\\
  \textbf{labjack\_ux\_doutput}&\DrvNeverFinished&Digital output for the Labjack.\\
  \textbf{labjack\_ux\_scaler}&\DrvNeverFinished&Scaler for the Labjack.\\
  \textbf{labjack\_ux\_timer}&\DrvNeverFinished&Timer for the Labjack.\\
\end{longtable}

%\subsection{libcurl.mxo \ \textbf{(Implements ``libcurl'' extension)}  \ \textbf{(Linux, Win32)} }
%An MX extension module for network access using the libCurl librar.
%\textit{libcurl.mxo} does not contain any MX drivers.

\textbf{Status:} {\DrvInProgress}

\subsection{libtiff.mxo \ \textbf{(Implements ``libtiff'' extension)}  \ \textbf{(Linux, Win32)} }
An MX extension module for network access using the libTIFF librar.

\textit{libtiff.mxo} provides a way of saving MX area detector images
in TIFF format with TIFF headers used to describe the detector parameters used
to take the image.
\textit{libtiff.mxo} does not contain any MX drivers.

\textbf{Status:} {\DrvWorking}

\subsection{libusb-0.1.mxo \ \textbf{(Linux)}}
\begin{longtable}[l]{lll}
  \textbf{libusb\_01}&\DrvWorking&USB interface driver for the old libusb 0.1.12 library.\\
\end{longtable}

\subsection{linux\_portio.mxo} \ \textbf{(Linux)}
A port I/O driver that only works on very old Linux kernels.
\begin{longtable}[l]{lll}
  \textbf{linux\_portio}&\DrvAncient&(LINUX) access to I/O ports via the Linux portio driver.\\
\end{longtable}

\subsection{newport\_xps.mxo}
Drivers for the Newport XPS-C and XPS-Q series of motion controllers.
Uses the source code of a software library provided on Newport's web site.
However, since no license is specified, we cannot bundle the Newport code
with MX.  Instead, the first time this library is built, it automatically
downloads the source code from Newport's web site, patches it, and then
builds it.
\begin{longtable}[l]{lll}
  \textbf{newport\_xps}&\DrvWorking&Interface driver for the Newport XPS-C and XPS-Q.\\
  \textbf{newport\_xps\_motor}&\DrvWorking&Newport XPS-C and XPS-Q motor axes.\\
\end{longtable}

\subsection{ni488.mxo}
MX interface driver for National Instruments GPIB interfaces.  If HAVE\_LINUX\_GPIB is set, then the driver can be compiled for use with the driver from
http://linux-gpib.sourceforge.net/.  The National Instruments module and the
Linux GPIB module cannot both be loaded by the same MX process, since the
names of the symbols collide.
\begin{longtable}[l]{lll}
  \textbf{linux\_gpib}&\DrvWorking&MX interface driver for the Linux-GPIB package.\\
  \textbf{ni488}&\DrvWorking&MX interface driver for NI488-style GPIB interfaces.\\
\end{longtable}

\subsection{ni\_daqmx.mxo}
MX interface driver for devices controlled by the National Instruments
DAQmx package.  On non-Windows platforms, DAQmx Base is used instead.
\begin{longtable}[l]{lll}
  \textbf{ni\_daqmx}&\DrvWorking&Interface driver for NI DAQmx devices.\\
  \textbf{ni\_daqmx\_ainput}&\DrvWorking&Analog input for NI DAQmx.\\
  \textbf{ni\_daqmx\_aoutput}&\DrvWorking&Analog output for NI DAQmx.\\
  \textbf{ni\_daqmx\_dinput}&\DrvWorking&Digital input for NI DAQmx.\\
  \textbf{ni\_daqmx\_doutput}&\DrvWorking&Digital output for NI DAQmx.\\
  \textbf{ni\_daqmx\_thermocouple}&\DrvWorking&Reads temperature for NI DAQmx.\\
\end{longtable}

\subsection{ni\_valuemotion.mxo \ \textbf{(Win32)}}
\begin{longtable}[l]{lll}
  \textbf{pcmotion32}&\DrvOld&Interface driver for National Instruments ValueMotion motor controllers.\\
  \textbf{pcmotion32\_motor}&\DrvOld&National Instruments ValueMotion motor axis.\\
\end{longtable}

\subsection{ortec\_umcbi.mxo \ \textbf{(Win32)}}
MX interface to the Ortec A11-B32 interface for communicating with Ortec MCAs.\\
\begin{longtable}[l]{lll}
  \textbf{umcbi}&\DrvOld&Interface to the Ortec A11-B32 library.\\
  \textbf{trump\_mca}&\DrvAncient&MCA driver for the old EG\&G Ortec Trump MCA.  Only tested with ISA bus.\\
\end{longtable}

\subsection{pleora\_iport.mxo \ \textbf{(Linux, Win32)}}
MX drivers for the Pleora iPORT series of cameras.
\begin{longtable}[l]{lll}
  \textbf{pleora\_iport}&\DrvRecent&Pleora iPORT camera interface.\\
  \textbf{pleora\_iport\_dinput}&\DrvRecent&Pleora iPORT digital input.\\
  \textbf{pleora\_iport\_doutput}&\DrvRecent&Pleora iPORT digital output.\\
  \textbf{pleora\_iport\_vinput}&\DrvRecent&Pleora iPORT camera.\\
\end{longtable}

\subsection{pmc\_mcapi.mxo \ \textbf{(Linux, Win32)}}
Precision Microcontrol Motion Control API for their series of motor controllers.
\begin{longtable}[l]{lll}
  \textbf{pmc\_mcapi}&\DrvRecent&Precision Microcontrol MCAPI interface.\\
  \textbf{pmc\_mcapi\_ainput}&\DrvRecent&Precision Microcontrol MCAPI analog input.\\
  \textbf{pmc\_mcapi\_aoutput}&\DrvRecent&Precision Microcontrol MCAPI analog output.\\
  \textbf{pmc\_mcapi\_dinput}&\DrvRecent&Precision Microcontrol MCAPI digital input.\\
  \textbf{pmc\_mcapi\_doutput}&\DrvRecent&Precision Microcontrol MCAPI digital output.\\
  \textbf{pmc\_mcapi\_motor}&\DrvRecent&Precision Microcontrol MCAPI motor.\\
\end{longtable}

\subsection{powerpmac.mxo \ \textbf{(Linux, Win32)}}
Delta Tau PowerPMAC motor controllers.
\begin{longtable}[l]{lll}
  \textbf{powerpmac}&\DrvWorking&PowerPMAC interface driver.\\
  \textbf{powerpmac\_ainput}&\DrvWorking&PowerPMAC variable as analog input.\\
  \textbf{powerpmac\_aoutput}&\DrvWorking&PowerPMAC variable as analog output.\\
  \textbf{powerpmac\_dinput}&\DrvWorking&PowerPMAC variable as digital input.\\
  \textbf{powerpmac\_doutput}&\DrvWorking&PowerPMAC variable as digital output.\\
  \textbf{powerpmac\_motor}&\DrvWorking&PowerPMAC motor axis.\\
  \\
  \textbf{powerpmac\_long}&\DrvWorking&PowerPMAC variable treated as an MX long variable.\\
  \textbf{powerpmac\_ulong}&\DrvWorking&PowerPMAC variable treated as an MX unsigned long variable.\\
  \textbf{powerpmac\_double}&\DrvWorking&PowerPMAC variable treated as an MX double variable.\\
\end{longtable}

\subsection{radicon\_helios.mxo \ \textbf{(Linux, Win32)}
\ \textit{(uses pleora\_iport.mxo)} }
Teledyne Radicon Helios 25x20 and 10x10 CMOS detectors.
\begin{longtable}[l]{lll}
  \textbf{radicon\_helios}&\DrvOld&Radicon Helios area detector.\\
  \textbf{radicon\_helios\_trigger}&\DrvOld&Generates a trigger for the Radicon Helios area detector.\\
\end{longtable}

\subsection{radicon\_taurus.mxo \ \textbf{(Linux, Win32)}
\ \textit{(uses sapera\_lt.mxo)} }
Teledyne Radicon Taurus-based detectors.
\begin{longtable}[l]{lll}
  \textbf{radicon\_taurus}&\DrvWorking&Radicon Taurus area detector.\\
  \textbf{radicon\_taurus\_rs232}&\DrvWorking&Communicates with the Taurus serial port.\\
\end{longtable}

\subsection{rdi\_mbc.mxo \ \textbf{(Linux, Win32)} }
Custom additions for RDI detectors at the Molecular Biology Consortium beamline (ALS 4.2.2).
\begin{longtable}[l]{lll}
  \textbf{rdi\_mbc\_datafile\_prefix}&\DrvRecent& \\
  \textbf{rdi\_mbc\_filename}&\DrvRecent& \\
  \textbf{rdi\_mbc\_log}&\DrvRecent& \\
  \textbf{rdi\_mbc\_pathname\_builder}&\DrvRecent& \\
  \textbf{rdi\_mbc\_save\_frame}&\DrvRecent& \\
  \textbf{rdi\_mbc\_string}&\DrvRecent& \\
\end{longtable}

\subsection{sapera\_lt.mxo \ \textbf{(Linux, Win32)} }
MX drivers for Teledyne DALSA video capture devices.  Note that ``frame grabbers'' are generally found in PC bus slots, while ``cameras'' are generally connected via gigabit Ethernet (GigE Vision).
\begin{longtable}[l]{lll}
  \textbf{sapera\_lt}&\DrvWorking&MX interface driver for the Sapera LT API.\\
  \textbf{sapera\_lt\_camera}&\DrvWorking&Sapera LT-based GigE Vision camera.\\
  \textbf{sapera\_lt\_frame\_grabber}&\DrvWorking&Sapera LT-based Camera Link (?) frame grabbers..\\
\end{longtable}

\subsection{sis3100.mxo \ \textbf{(Linux, Win32)} }
\begin{longtable}[l]{lll}
  \textbf{sis3100}&\DrvWorking&(LINUX) Struck SIS 1100/3100 PCI/CPCI interface to VME.\\
\end{longtable}

\subsection{site\_biocat\_toast.mxo \ \textbf{(Linux, Win32)} }
Custom features for BioCAT (APS 18-ID).
\begin{longtable}[l]{lll}
  \textbf{biocat\_6k\_toast}&\DrvWorking&MX oscillation driver for BioCAT that oscillates a Compumotor motor until stopped.\\
  \textbf{biocat\_6k\_joystick}&\DrvWorking&Enables or disables BioCAT Compumotor joystick.\\
\end{longtable}

\subsection{u500.mxo \ \textbf{(Win32)} }
MX drivers for the Aerotech Unidex 500 motor controller.
\begin{longtable}[l]{lll}
  \textbf{u500}&\DrvWorking&Interface to the vendor-provided Win32 libraries for the Aerotech Unidex 500.\\
  \textbf{u500\_motor}&\DrvWorking&Aerotech Unidex 500 motor axis.\\
  \textbf{u500\_rs232}&\DrvWorking&Aerotech Unidex 500 driver for sending program lins to the controller.\\
  \textbf{u500\_status}&\DrvWorking&Digital input for reading Aerotech Unidex 500 status.\\
  \textbf{u500\_variable}&\DrvWorking&Support for reading Aerotech Unidex 499 V variables.\\
\end{longtable}

\subsection{v4l2\_input.mxo \ \textbf{(Linux)} }
An MX driver for using the Linux Video4Linux2 video API.
\begin{longtable}[l]{lll}
  \textbf{v4l2\_input}&\DrvRecent&Video4Linux2 based camera.\\
\end{longtable}

\subsection{vxi\_memacc.mxo \ \textbf{(Linux)} }
\begin{longtable}[l]{lll}
  \textbf{vxi\_memacc}&\DrvOld&VME access using NI-VISA.\\
\end{longtable}

\subsection{xglab\_dante.mxo \ \textbf{(Linux, Win32)} }
Module wrapper for XGlab DANTE multichannel analyzers.
\begin{longtable}[l]{lll}
  \textbf{dante}&\DrvWorking&MX interface to the XGlab DANTE library.\\
  \textbf{dante\_mca}&\DrvWorking&MCA driver for a single XGlab DANTE MCA channel in Normal (single spectrum) mode.\\
  \textbf{dante\_mcs}&\DrvInProgress&MCS driver for a single XGlab DANTE MCA channel in Mapping (multiple spectra) mode.\\
\end{longtable}

\subsection{xia\_handel.mxo \ \textbf{(Linux, Win32)} \textit{(Old Version)} }
An MX module wrapper for the XIA-provided Handel library for MCAs.\newline

Note: The \textit{xia\_handel.mxo} module and the \textit{xia\_handel\_map.mxo} 
modules cannot both be loaded at the same time in one MX process.
The \textit{xia\_handel\_map.mxo} is intended to ultimately replace the
existing \textit{xia\_handel.mxo} module.
\begin{longtable}[l]{lll}
  \textbf{handel}&\DrvRecent&MX interface to the XIA Handel library.\\
  \textbf{handel\_mca}&\DrvRecent&Controls a single MCA in an XIA Handel installation.\\
  \textbf{handel\_input}&\DrvRecent&Analog input driver that reads out parameters for XIA Handel-based MCAs.\\
  \textbf{handel\_sum}&\DrvRecent&Analog input driver that computes a weighted sum of XIA Handel readings.\\
  \textbf{handel\_timer}&\DrvRecent&MX timer driver for XIA Handel-controlled MCAs.\\
\end{longtable}

\subsection{xia\_handel\_map.mxo \ \textbf{(Linux, Win32)} }
An MX module wrapper for the XIA-provided Handel library for MCAs.
This version implements support MCS-compatible mapping modes.\newline

Note: The \textit{xia\_handel.mxo} module and the \textit{xia\_handel\_map.mxo} 
modules cannot both be loaded at the same time in one MX process.
The \textit{xia\_handel\_map.mxo} is intended to ultimately replace the
existing \textit{xia\_handel.mxo} module.
\begin{longtable}[l]{lll}
  \textbf{handel}&\DrvWorking&MX interface to the XIA Handel library.\\
  \textbf{handel\_mapping\_pixel\_next}&\DrvWorking&Advances MCS-style acquisition to the next measurement \textit{(pixel)}.\\
  \textbf{handel\_mca}&\DrvWorking&Controls a single MCA in an XIA Handel installation.\\
  \textbf{handel\_mcs}&\DrvInProgress&Controls a single MCA in an MCS-compatible mapping mode.\\
  \textbf{handel\_input}&\DrvWorking&Analog input driver that reads out parameters for XIA Handel-based MCAs.\\
  \textbf{handel\_sum}&\DrvWorking&Analog input driver that computes a weighted sum of XIA Handel readings.\\
  \textbf{handel\_timer}&\DrvWorking&MX timer driver for XIA Handel-controlled MCAs.\\
\end{longtable}

\subsection{xineos\_gige.mxo \ \textbf{(Linux, Win32)} \newline
  \textit{(uses sapera\_lt.mxo on Win32)} \newline
  \textit{(uses dalsa\_gev.mxo on Linux)} }
Module wrapper for the Teledyne DALSA Xineos GigE-based area detectors.
\begin{longtable}[l]{lll}
  \textbf{xineos\_gige}&\DrvWorking&Teledyne DALSA Xineos GigE-based area detectors.\\
\end{longtable}

\subsection{zwo\_efw.mxo \ \textbf{(Linux)}}
Module wrapper for the ZWO Electronic Filter Wheel for astronomical cameras.
\begin{longtable}[l]{lll}
  \textbf{zwo\_efw}&\DrvWorking&Controller driver for the ZWO Electronic Filter Wheel.\\
  \textbf{zwo\_efw\_motor}&\DrvWorking&Motor driver for the ZWO Electronic Filter Wheel.\\
\end{longtable}

\subsection{Other Possibilities}
A few other possibilities for MX modules include:
\begin{itemize}
  \item AVI PVAPI camera module.
  \item InpOutx64 might provide x86-64 port I/O access on Windows.
  \item libusb 1.0 interface driver.
  \item Measurement Computing devices using the Universal Library API.
  \item Portaudio wvin and wvout.
  \item WinUSB interface driver.
\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Amplifiers}

\begin{longtable}[l]{lll}
  \textbf{aps\_adcmod2\_amplifier}&\DrvPossiblyBroken&APS ADCMOD2 amplifier.\\
  \textbf{aps\_quadem\_amplifier}&\DrvRecent&APS Quad amplifier used for beam position monitors.\\
  \textbf{i404\_amp}&\DrvWorking&I404 amplifier channel.\\
  \textbf{keithley428}&\DrvWorking&Keithley 428 amplifier.\\
  \textbf{keithley2400\_amp}&\DrvWorking&Keithley 2400 amplifiers.\\
  \textbf{keithley2700\_amp}&\DrvWorking&Keithley 2700 amplifiers.\\
  \textbf{network\_amplifier}&\DrvWorking&Amplifier controlled by a remote MX server.\\
  \textbf{scipe\_amplifier}&\DrvObsolete&SCIPE amplifier.\\
  \textbf{sim983}&\DrvWorking&SIM983 scaling amplifier.\\
  \textbf{soft\_amplifier}&\DrvWorking&Software emulated amplifier.\\
  \textbf{sr570}&\DrvWorking&SR570 current amplifier.\\
  \textbf{udt\_tramp}&\DrvOld&UDT TRAMP current amplifier.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Analog Inputs}

\begin{longtable}[l]{lll}
  \textbf{aps\_adcmod2\_ainput}&\DrvPossiblyBroken&APS ADCMOD2 input signal.\\
  \textbf{bkprecision\_ain}&\DrvRecent&BK Precision 912x analog inputs.\\
  \textbf{bluice\_dcss\_ion\_chamber}&\DrvOld&Blu-Ice ion chamber readout as used by a DCSS client.\\
  \textbf{bluice\_dhs\_ion\_chamber}&\DrvOld&Blu-Ice ion chamber readout as used in a DHS server.\\
  \textbf{cryojet\_ainput}&\DrvOld&Reads analog status values from a Cryojet controller.\\
  \textbf{cryostream600\_status}&\DrvOld&Reads status values from a Cryostream 600 temperature controller.\\
  \textbf{cxtilt02\_angle}&\DrvRecent&Angle measurement driver.\\
  \textbf{epics\_ainput}&\DrvWorking&MX analog input driver that reads from EPICS PVs.\\
  \textbf{galil\_gclib\_ainput}&\DrvInProgress&Galil Gclib controlled analog inputs.\\
  \textbf{handel\_input}&\DrvWorking&Analog input driver that reads out parameters for XIA Handel-based MCAs.\\
  \textbf{handel\_sum}&\DrvWorking&Analog input driver that computes a weighted sum of XIA Handel readings.\\
  \textbf{icplus\_current}&\DrvOld&Oxford Danfysik IC PLUS input current.\\
  \textbf{ilm\_ainput}&\DrvOld&ILM values returned by the READ command.\\
  \textbf{iseries\_ainput}&\DrvWorking&iSeries analog inputs.\\
  \textbf{itc503\_ainput}&\DrvOld&Reads analog status values from an ITC503 controller.\\
  \textbf{k8055\_ainput}&\DrvWorking&Analog inputs for the Velleman K8055.\\
  \textbf{keithley199\_ainput}&\DrvWorking&Read measurements from a Keithley 199.\\
  \textbf{keithley2000\_ainput}&\DrvOld&Keithley 2000 analog inputs.\\
  \textbf{keithley2400\_ainput}&\DrvWorking&Keithley 2400 analog inputs.\\
  \textbf{keithley2600\_ainput}&\DrvWorking&Keithley 2600 analog inputs.\\
  \textbf{ks3512}&\DrvOld&Kinetic Systems KS3512 CAMAC ADC.\\
  \textbf{mardtb\_status}&\DrvPossiblyBroken&Reads out MarDTB parameters.\\
  \textbf{mca\_value}&\DrvWorking&MCA-derived values such as ROIs and corrected ROIs.\\
  \textbf{mca\_weighted\_sum}&\DrvWorking&Weighted sums of MCA ROIs.\\
  \textbf{mclennan\_ain}&\DrvRecent&Mclennan analog inputs.\\
  \textbf{mdrive\_ain}&\DrvWorking&IMS/Scneider MDrive/MForce analog inputs.\\
  \textbf{modbus\_ainput}&\DrvRecent&MODBUS analog inputs.\\
  \textbf{network\_ainput}&\DrvWorking&Analog input controlled by a remote MX server.\\
  \textbf{ni\_daqmx\_ainput}&\DrvWorking&Analog input for NI DAQmx.\\
  \textbf{ni\_daqmx\_thermocouple}&\DrvWorking&Reads temperature for NI DAQmx.\\
  \textbf{numato\_gpio\_ainput}&\DrvWorking&Numato Lab GPIO analog inputs.\\
  \textbf{p6000a}&\DrvRecent&Newport Electronics counter/timer as an analog input.\\
  \textbf{pdi45\_ainput}&\DrvOld&Prarie Digital Model 45 analog inputs.\\
  \textbf{picomotor\_ain}&\DrvOld&Picomotor analog input.\\
  \textbf{pmac\_ainput}&\DrvWorking&Control PMAC variables as analog inputs.\\
  \textbf{pmc\_mcapi\_ainput}&\DrvRecent&Precision Microcontrol MCAPI analog input.\\
  \textbf{powerpmac\_ainput}&\DrvWorking&PowerPMAC variable as analog input.\\
  \textbf{qbpm\_current}&\DrvOld&Oxford Danfysik QBPM input current.\\
  \textbf{scipe\_ain}&\DrvObsolete&SCIPE analog inputs.\\
  \textbf{si9650\_status}&\DrvNeverFinished&Reads status values from a Scientific Instruments 9650 temperature controller.\\
  \textbf{sim980}&\DrvWorking&SIM980 summing analog input.\\
  \textbf{soft\_ainput}&\DrvWorking&Software emulated analog input.\\
  \textbf{smartmotor\_ain}&\DrvRecent&Smartmotor analog inputs.\\
  \textbf{spellman\_df3\_ain}&\DrvOld&Spellman DF3/FF3 analog inputs.\\
  \textbf{synaccess\_netbooter\_ainput}&\DrvOld&Synaccess netBooter current and temperature measurements.\\
  \textbf{tpg262\_}&\DrvOld&Pfeiffer TPG 261/262 pressure reading.\\
  \textbf{tracker\_ain}&\DrvOld&Data Track Tracker analog inputs.\\
  \textbf{umx\_ainput}&\DrvWorking&UMX analog input.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Analog Outputs}

\begin{longtable}[l]{lll}
  \textbf{bkprecision\_aout}&\DrvRecent&BK Precision 912x analog outputs.\\
  \textbf{cryojet\_aoutput}&\DrvOld&Controls analog settings for a Cryojet controller.\\
  \textbf{cyberstar\_x1000\_aout}&\DrvWorking&Cyberstar X1000 analog outputs for high voltage and delay.\\
  \textbf{epics\_aoutput}&\DrvWorking&MX analog output driver that writes to EPICS PVs.\\
  \textbf{galil\_gclib\_aoutput}&\DrvInProgress&Galil Gclib controlled analog outputs.\\
  \textbf{icplus\_voltage}&\DrvOld&Oxford Danfysik IC PLUS high voltage.\\
  \textbf{ilm\_sample\_rate}&\DrvOld&Change sample rate of ILM controller.\\
  \textbf{iseries\_aoutput}&\DrvWorking&iSeries analog outputs.\\
  \textbf{itc503\_aoutput}&\DrvOld&Controls analog settings for an ITC503 controller.\\
  \textbf{k8055\_aoutput}&\DrvWorking&Analog outputs for the Velleman K8055.\\
  \textbf{keithley2400\_aoutput}&\DrvWorking&Keithley 2400 analog outputs.\\
  \textbf{keithley2600\_aoutput}&\DrvWorking&Keithley 2600 analog outputs.\\
  \textbf{keithley2700\_aoutput}&\DrvWorking&Keithley 2700 analog outputs.\\
  \textbf{ks3112}&\DrvOld&Kinetic Systems KS3112 CAMAC DAC.\\
  \textbf{linkam\_t9x\_pump}&\DrvOld&Pump control part of T9x controllers.\\
  \textbf{mclennan\_aout}&\DrvRecent&Mclennan analog outputs.\\
  \textbf{modbus\_aoutput}&\DrvRecent&MODBUS analog outputs.\\
  \textbf{network\_aoutput}&\DrvWorking&Analog output controlled by a remote MX server.\\
  \textbf{ni\_daqmx\_aoutput}&\DrvWorking&Analog output for NI DAQmx.\\
  \textbf{pdi45\_aoutput}&\DrvOld&Prarie Digital Model 45 analog outputs.\\
  \textbf{pmac\_aoutput}&\DrvWorking&Control PMAC variables as analog outputs.\\
  \textbf{pmc\_mcapi\_aoutput}&\DrvRecent&Precision Microcontrol MCAPI analog output.\\
  \textbf{powerpmac\_aoutput}&\DrvWorking&PowerPMAC variable as analog output.\\
  \textbf{qbpm\_voltage}&\DrvOld&Oxford Danfysik QBPM high voltage.\\
  \textbf{scipe\_aout}&\DrvObsolete&SCIPE analog outputs.\\
  \textbf{smartmotor\_aout}&\DrvRecent&Smartmotor analog outputs.\\
  \textbf{soft\_aoutput}&\DrvWorking&Software emulated analog output.\\
  \textbf{spellman\_df3\_aout}&\DrvOld&Spellman DF3/FF3 analog outputs.\\
  \textbf{systron\_donner\_m107}&\DrvOld&DC Voltage as analog output.\\
  \textbf{tracker\_aout}&\DrvOld&Data Track Tracker analog outputs.\\
  \textbf{umx\_aoutput}&\DrvWorking&UMX analog output.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Area Detectors}

\begin{longtable}[l]{lll}
  \textbf{bluice\_dcss\_area\_detector}&\DrvOld&Blu-Ice area detector as used by a DCSS client.\\
  \textbf{bluice\_dhs\_area\_detector}&\DrvOld&Blu-Ice area detector as used in a DHS server.\\
  \textbf{eiger}&\DrvInProgress&Dectris EIGER area detectors.\\
  \textbf{epics\_area\_detector}&\DrvWorking&MX area detector driver for EPICS-controlled area detectors.\\
  \textbf{epics\_ccd}&\DrvObsolete&MX area detector driver for the obsolete EPICS CCD record.\\
  \textbf{mar345}&\DrvNeverFinished&Mar345 image plate control.\\
  \textbf{marccd}&\DrvWorking&MarCCD area detector interface started from the MarCCD GUI.\\
  \textbf{marccd\_server\_socket}&\DrvWorking&MarCCD area detector control via MarUSA-provided server socket program.\\
  \textbf{mbc\_noir}&\DrvOld&NOIR area detector for the ALS 4.2.2 beamline.\\
  \textbf{merlin\_medipix}&\DrvWorking&Merlin Medipix area detectors.\\
  \textbf{mlfsom}&\DrvObsolete&Intended to use the mlfsom package.\\
  \textbf{network\_area\_detector}&\DrvWorking&Area detector controlled by a remote MX server.\\
  \textbf{pccd\_16080}&\DrvOld& Old BioCAT Aviex detector \textit{(nemesis)}.\\
  \textbf{pccd\_170170}&\DrvWorking& Synchrotron Soleil Aviex detector.\\
  \textbf{pccd\_4824}&\DrvOld& ESRF Aviex detector.\\
  \textbf{pccd\_9785}&\DrvRecent& BioCAT Dexela detector \textit{(staypuft)}.\\
  \textbf{pilatus}&\DrvWorking&Dectris Pilatus area detectors.\\
  \textbf{radicon\_helios}&\DrvOld&Radicon Helios area detector.\\
  \textbf{soft\_area\_detector}&\DrvWorking&Software-emulated area detector that uses an MX video input to get frames.\\
  \textbf{xineos\_gige}&\DrvWorking&Teledyne DALSA Xineos GigE-based area detectors.\\
\end{longtable}

\subsection{Devices usable with all MCSs}
\begin{longtable}[l]{lll}
  \textbf{area\_detector\_timer}&\DrvWorking&Used to control MX area detector timers.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Autoscale Devices}

Autoscale devices are used to manage the acquisition of data from a
signal source that has a wide dynamic range like a powder diffraction peak.
The idea is that the signal detector has a range of signal strengths over
which it works best.  If the input signal goes out of that range, the
autoscale device arranges to change the input signal strength to bring it
back into the ideal range.  This is done by changing an amplifier gain
or inserting/removing filters, and so forth.  The signal reported by the
MX driver is then rescaled to produce gain-independent signal values allowing
you to record the signal (like a powder diffraction peak) with satisfactory
precision over the full dynamic range.

\begin{longtable}[l]{lll}
  \textbf{autoscale\_amp}&\DrvOld&Changes the amplifier gain to adjust the signal strength.\\
  \textbf{autoscale\_filter}&\DrvOld&Inserts/removes filters to adjust the signal strength.\\
  \textbf{autoscale\_filter\_amp}&\DrvOld&This autoscale device can simultaneously use both gain and filter changes.\\
  \textbf{autoscale\_net}&\DrvWorking&Autoscale device controlled by a remote MX server.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Clocks \ \ \ {\it Also known as Time-of-Day Clocks}}

\begin{longtable}[l]{lll}
  \textbf{hrt\_clock}&\DrvWorking&Time-of-day clock using MX HRT clock.\\
  \textbf{os\_clock}&\DrvWorking&Time-of-day clock using OS clock.\\
  \textbf{win32\_system\_time}&\DrvInProgress&Time-of-day clock using Win32 GetSystemTimePreciseAsFileTime().\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Digital Inputs}

\begin{longtable}[l]{lll}
  \textbf{ainput\_as\_dinput}&\DrvWorking&Treat an analog input as a digital input.\\
  \textbf{bkprecision\_din}&\DrvRecent&BK Precision 912x digital inputs.\\
  \textbf{compumotor\_din}&\DrvWorking&Compumotor 6000/6K digital input.\\
  \textbf{digital\_fanin}&\DrvWorking&Compute a logical function of several MX record fields (and, or, xor).\\
  \textbf{epics\_dinput}&\DrvWorking&MX digital input driver that reads from EPICS PVs.\\
  \textbf{epix\_xclib\_dinput}&\DrvWorking&Controls digital inputs for EPIX, Inc. cameras.\\
  \textbf{galil\_gclib\_dinput}&\DrvInProgress&Galil Gclib controlled digital inputs.\\
  \textbf{i8255\_in}&\DrvOld&Intel 8255 8-bit digital input.\\
  \textbf{icplus\_din}&\DrvOld&Oxford Danfysik IC PLUS digital input.\\
  \textbf{ilm\_status}&\DrvOld&ILM status values from the X command.\\
  \textbf{iseries\_dinput}&\DrvWorking&iSeries digital inputs.\\
  \textbf{k8055\_dinput}&\DrvWorking&Digital inputs for the Velleman K8055.\\
  \textbf{ks3063\_in}&\DrvOld&Kinetic Systems KS3063 digital input.\\
  \textbf{linux\_parport\_in}&\DrvWorking&(LINUX) Parallel port as digital input.\\
  \textbf{lpt\_in}&\DrvOld&LPT printer port as an 8-bit digital input.\\
  \textbf{mclennan\_din}&\DrvRecent&Mclennan digital inputs.\\
  \textbf{mdrive\_din}&\DrvWorking&IMS/Schneider MDrive/MForce digital inputs.\\
  \textbf{modbus\_dinput}&\DrvRecent&MODBUS digital inputs.\\
  \textbf{network\_dinput}&\DrvWorking&Digital input controlled by a remote MX server.\\
  \textbf{ni\_daqmx\_dinput}&\DrvWorking&Digital input for NI DAQmx.\\
  \textbf{numato\_gpio\_dinput}&\DrvWorking&Numato Lab GPIO digital inputs.\\
  \textbf{pdi45\_dinput}&\DrvOld&Prarie Digital Model 45 digital inputs.\\
  \textbf{pmac\_dinput}&\DrvWorking&Control PMAC variables as digital inputs.\\
  \textbf{pmc\_mcapi\_dinput}&\DrvRecent&Precision Microcontrol MCAPI digital input.\\
  \textbf{picomotor\_din}&\DrvOld&Picomotor digital intput.\\
  \textbf{pleora\_iport\_dinput}&\DrvRecent&Pleora iPORT digital input.\\
  \textbf{powerpmac\_dinput}&\DrvWorking&PowerPMAC variable as digital input.\\
  \textbf{qbpm\_din}&\DrvOld&Oxford Danfysik QBPM digital input.\\
  \textbf{scipe\_din}&\DrvObsolete&SCIPE digital inputs.\\
  \textbf{smartmotor\_din}&\DrvRecent&Smartmotor digital inputs.\\
  \textbf{soft\_dinput}&\DrvWorking&Software emulated digital input.\\
  \textbf{spellman\_df3\_din}&\DrvOld&Spellman DF3/FF3 digital inputs.\\
  \textbf{tracker\_din}&\DrvOld&Data Track Tracker digital inputs.\\
  \textbf{u500\_status}&\DrvWorking&Digital input for reading Aerotech Unidex 500 status.\\
  \textbf{umx\_dinput}&\DrvWorking&UMX digital input.\\
  \textbf{vme\_dinput}&\DrvWorking&Read from a VME address.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Digital Outputs}

\begin{longtable}[l]{lll}
  \textbf{aoutput\_as\_doutput}&\DrvWorking&Use an analog output to generate digital output signals.\\
  \textbf{bkprecision\_dout}&\DrvRecent&BK Precision 912x digital outputs.\\
  \textbf{cm17a\_doutput}&\DrvOld&X10 CM17A digital output driver.\\
  \textbf{compumotor\_dout}&\DrvWorking&Compumotor 6000/6K digital output.\\
  \textbf{cryojet\_doutput}&\DrvOld&Controls digital settings for a Cryojet controller.\\
  \textbf{digital\_fanout}&\DrvWorking&Forward a digital output value to several MX record fields.\\
  \textbf{epics\_doutput}&\DrvWorking&MX digital output driver that writes to EPICS PVs.\\
  \textbf{epix\_xclib\_doutput}&\DrvWorking&Controls digital outputs for EPIX, Inc. cameras.\\
  \textbf{galil\_gclib\_doutput}&\DrvInProgress&Galil Gclib controlled digital outputs.\\
  \textbf{handel\_mapping\_pixel\_next}&\DrvWorking&Advances MCS-style acquisition to the next measurement \textit{(pixel)}.\\
  \textbf{i8255\_out}&\DrvOld&Intel 8255 8-bit digital output.\\
  \textbf{icplus\_dout}&\DrvOld&Oxford Danfysik IC PLUS digital output.\\
  \textbf{iseries\_doutput}&\DrvWorking&iSeries digital outputs.\\
  \textbf{itc503\_doutput}&\DrvOld&Controls digital settings for an ITC503 controller.\\
  \textbf{k8055\_doutput}&\DrvWorking&Digital outputs for the Velleman K8055.\\
  \textbf{keithley2400\_doutput}&\DrvWorking&Keithley 2400 digital outputs.\\
  \textbf{ks3063\_out}&\DrvOld&Kinetic Systems KS3063 digital output.\\
  \textbf{linux\_parport\_out}&\DrvWorking&(LINUX) Parallel port as digital output.\\
  \textbf{lpt\_out}&\DrvOld&LPT printer port as an 8-bit digital output.\\
  \textbf{mclennan\_dout}&\DrvRecent&Mclennan digital outputs.\\
  \textbf{mdrive\_dout}&\DrvWorking&IMS/Schneider MDrive/MForce digital outputs.\\
  \textbf{modbus\_doutput}&\DrvRecent&MODBUS digital outputs.\\
  \textbf{network\_doutput}&\DrvWorking&Digital output controlled by a remote MX server.\\
  \textbf{ni\_daqmx\_doutput}&\DrvWorking&Digital output for NI DAQmx.\\
  \textbf{numato\_gpio\_doutput}&\DrvWorking&Numato Lab GPIO digital outputs.\\
  \textbf{pdi45\_doutput}&\DrvOld&Prarie Digital Model 45 digital outputs.\\
  \textbf{pmc\_mcapi\_doutput}&\DrvRecent&Precision Microcontrol MCAPI digital output.\\
  \textbf{pfcu\_filter\_summary}&\DrvWorking&Controls all PFCU filters in one operation.\\
  \textbf{picomotor\_dout}&\DrvOld&Picomotor digital output.\\
  \textbf{pleora\_iport\_doutput}&\DrvRecent&Pleora iPORT digital output.\\
  \textbf{pmac\_doutput}&\DrvWorking&Control PMAC variables as digital outputs.\\
  \textbf{powerpmac\_doutput}&\DrvWorking&PowerPMAC variable as digital output.\\
  \textbf{qbpm\_dout}&\DrvOld&Oxford Danfysik QBPM digital output.\\
  \textbf{relay\_as\_doutput}&\DrvWorking&Treat a relay as a digital output.\\
  \textbf{scipe\_dout}&\DrvObsolete&SCIPE digital outputs.\\
  \textbf{smartmotor\_dout}&\DrvRecent&Smartmotor digital outputs.\\
  \textbf{soft\_doutput}&\DrvWorking&Software emulated digital output.\\
  \textbf{spellman\_df3\_dout}&\DrvOld&Spellman DF3/FF3 digital outputs.\\
  \textbf{tracker\_dout}&\DrvOld&Data Track Tracker digital outputs.\\
  \textbf{umx\_doutput}&\DrvWorking&UMX digital output.\\
  \textbf{vme\_doutput}&\DrvWorking&Write to a VME address.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Encoders}

\begin{longtable}[l]{lll}
  \textbf{ks3640}&\DrvOld&Kinetic Systems KS3640 CAMAC up/down counter as MX encoder.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Motors}

\begin{longtable}[l]{lll}
  \textbf{aps\_gap}&\DrvWorking&Gap and taper controls for APS insertion devices.\\
  \textbf{bluice\_dcss\_motor}&\DrvOld&Blu-Ice motor as used by a DCSS client.\\
  \textbf{bluice\_dhs\_motor}&\DrvOld&Blu-Ice motor as used in a DHS server.\\
  \textbf{compumotor}&\DrvWorking&Compumotor 6000/6K motor axis.\\
  \textbf{compumotor\_lin}&\DrvWorking&Compumotor 6000/6K linear interpolation moves of several motors.\\
  \textbf{cryojet\_motor}&\DrvOld&Controls a Cryojet temperature controller as if it were a motor.\\
  \textbf{cryostream600\_motor}&\DrvOld&Controls a Cryostream 600 temperature controller as if it is a motor.\\
  \textbf{d8\_motor}&\DrvOld&Bruker D8 motor axis.\\
  \textbf{dac\_motor}&\DrvWorking&Control an MX analog output as if it were a motor.\\
  \textbf{databox\_motor}&\DrvOld&Radix Databox motor axis.\\
  \textbf{disabled\_motor}&\DrvWorking&Disabled motor.\\
  \textbf{e500}&\DrvOld&DSP E500 motor axis.\\
  \textbf{e662}&\DrvOld&Physik Instrumente E-662 LVPTz motor axis.\\
  \textbf{epics\_motor}&\DrvWorking&MX motor driver for the EPICS motor record.\\
  \textbf{epics\_pmac\_biocat}&\DrvWorking&VME-based PMAC and Turbo PMAC motors controlled via EPICS at the BioCAT beamline.\\
  \textbf{esp\_motor}&\DrvWorking&Newport ESP300/ESP301 motor axis.\\
  \textbf{galil\_gclib\_motor}&\DrvWorking&Galil Gclib controlled motors.\\
  \textbf{hrt\_motor}&\DrvWorking&A ``motor'' that uses MX HRT timers as its ''position''.  Can be used in quick scans.\\
  \textbf{hsc1\_motor}&\DrvOld&XIA HSC-1 motor axis.\\
  \textbf{itc503\_motor}&\DrvOld&Controls an ITC503 temperature controller as if it were a motor.\\
  \textbf{kohzu\_sc\_motor}&\DrvWorking&Kohzu SC-200/400/800 motor axis.\\
  \textbf{linkam\_t9x\_motor}&\DrvOld&Motion control part of T9x controllers.\\
  \textbf{linkam\_t9x\_temp}&\DrvOld&Temperature control part of T9x controllers.\\
  \textbf{ls330\_motor}&\DrvWorking&LakeShore 330 temperature as a motor.\\
  \textbf{mardtb\_motor}&\DrvPossiblyBroken&MarDTB motor axis.\\
  \textbf{mclennan}&\DrvRecent&Mclennan PM600 and PM304 motor axis.\\
  \textbf{mcu2}&\DrvWorking&ACS MCU-2 motor axis.\\
  \textbf{mdrive}&\DrvWorking&IMS/Schneider MDrive/MForce motor axes.\\
  \textbf{mm3000\_motor}&\DrvOld&Newport MM3000 motor axis.\\
  \textbf{mm4000\_motor}&\DrvOld&Newport MM4000/MM4005 motor axis.\\
  \textbf{mmc32}&\DrvOld&NSLS MMC32 motor axis.\\
  \textbf{network\_motor}&\DrvWorking&Motor axis controlled by a remote MX server.\\
  \textbf{panther\_he}&\DrvOld&IMS Panther HE motor axis.\\
  \textbf{panther\_hi}&\DrvOld&IMS Panther HI motor axis.\\
  \textbf{pcstep\_motor}&\DrvOld&nuLogic/NI PC-Step motor axis..\\
  \textbf{pdi40\_motor}&\DrvOld&PDI 40 motor axis.\\
  \textbf{phidget\_old\_stepper}&\DrvOld&Phidget stepper axis (old non-HID).\\
  \textbf{picomotor}&\DrvOld&Picomotor motor axis.\\
  \textbf{pm304}&\DrvOld&PM304 motor axis.\\
  \textbf{pmac\_motor}&\DrvWorking&PMAC motor axis.\\
  \textbf{pmac\_cs\_axis}&\DrvWorking&PMAC coordinate system axis.\\
  \textbf{pmac\_tc\_motor}&\DrvWorking&VME-based PMAC and Turbo PMAC motors controlled via EPICS at the SBC-CAT beamline.\\
  \textbf{pmc\_mcapi\_motor}&\DrvRecent&Precision Microcontrol MCAPI motor.\\
  \textbf{powerpmac\_motor}&\DrvWorking&PowerPMAC motor axis.\\
  \textbf{ptz\_motor}&\DrvRecent&Motor axis for an MX Pan/Tilt/Zoom controller.\\
  \textbf{scipe\_motor}&\DrvObsolete&SCIPE motor axis.\\
  \textbf{si9650\_motor}&\DrvNeverFinished&Controls a Scientific Instruments 9650 temperature controller as if it were a motor.\\
  \textbf{sim960}&\DrvWorking&SIM960 analog PID controller.\\
  \textbf{smartmotor}&\DrvRecent&Smartmotor motor axis.\\
  \textbf{smc24}&\DrvOld&Joerger SMC24 motor axis.\\
  \textbf{soft\_motor}&\DrvWorking&Software emulated motor.\\
  \textbf{spec\_motor}&\DrvOld&Motor axis controlled by a remote Spec server.\\
  \textbf{stp100\_motor}&\DrvOld&Pontech STP100 motor axis.\\
  \textbf{u500\_motor}&\DrvWorking&Aerotech Unidex 500 motor axis.\\
  \textbf{uglide\_motor}&\DrvWorking&OSS $\mu$-GLIDE motor axis.\\
  \textbf{umx\_rc\_servo}&\DrvWorking&UMX RC servo motor.\\
  \textbf{vp9000\_motor}&\DrvWorking&Velmex VP9000 motor axis.\\
  \textbf{vme58\_motor}&\DrvNeverFinished&OMS VME58 motor axis.\\
  \textbf{zwo\_efw\_motor}&\DrvWorking&Motor driver for the ZWO Electronic Filter Wheel.\\
\end{longtable}

\subsection{Pseudomotors}

\begin{longtable}[l]{lll}
  \textbf{adsc\_two\_theta}&\DrvWorking&Controls the $2\theta$ angle of an ADSC Quantum 210 by changing the detector height.\\
  \textbf{aframe\_det\_motor}&\DrvWorking&Pseudomotors for a Rosenbaum-style A-frame area detector mount.\\
  \textbf{als\_dewar\_positioner}&\DrvOld&Used for old ALS sample changing robot.\\
  \textbf{coordinated\_angle}&\DrvWorking&Coordinates the moves of several motors to maintain them all at the same relative angle.\\
  \textbf{cubic\_spline\_motor}&\DrvWorking&Moves a motor to a position that is a cubic spline function of another motor.\\
  \textbf{delta\_motor}&\DrvWorking&Moves one motor relative to another motor or an MX variable.\\
  \textbf{elapsed\_time}&\DrvWorking&A ''motor`` that uses wall clock elapsed time as its ''position``.  Useful for scans.\\
  \textbf{energy\_motor}&\DrvWorking&Energy pseudomotor for n Monochromator.\\
  \textbf{field\_motor}&\DrvWorking&A pseudomotor implemented in terms of other MX record fields.\\
  \textbf{gated\_backlash}&\DrvWorking&A pseudomotor that arranges for a gate signal to be generated when a backlash is in proress.\\
  \textbf{limited\_move}&\DrvWorking&A pseudomotor that limits the magnitude of relative moves.\\
  \textbf{linear\_function}&\DrvWorking&A pseusomotor whose position is a linear function of several real motors.\\
  \textbf{monochromator}&\DrvWorking&Monochromator control that moves groups of motors to positions that depend on X-ray $\theta$.\\
  \textbf{polynomial\_motor}&\DrvWorking&Moves a motor to a position that is a polynomial function of another motor.\\
  \textbf{q\_motor}&\DrvWorking&Pseudomotor for momentum transfer $q = (4 \pi \sin(\theta) / \lambda $.\\
  \textbf{segmented\_move}&\DrvWorking&Breaks up a long move into a series of short moves.\\
  \textbf{sine\_arm}&\DrvWorking&Performs a sine arm rotation.\\
  \textbf{slit\_motor}&\DrvWorking&Slit center and slit width pseudomotors for a slit made using individual slit blades.\\
  \textbf{table\_motor}&\DrvWorking&This pseudomotor performs roll/pitch/yaw moves for an X-ray table support.\\
  \textbf{tangent\_arm}&\DrvWorking&Performs a tangent arm rotation.\\
  \textbf{theta\_2theta}&\DrvWorking&Moves a \ $\theta-2\theta$ pair of motors.\\
  \textbf{translation\_mtr}&\DrvWorking&Moves a group of motors all by the same amount.\\
  \textbf{wavelength\_motor}&\DrvWorking&Wavelength pseudomotor for a Monochromator.\\
  \textbf{wavenumber\_motor}&\DrvWorking&Wavenumber pseudomotor for a Monochromator.\\
  \textbf{xafs\_wavenumber}&\DrvWorking&XAFS electron wavenumber $k$ computed from $E_\gamma = E_{edge} + ( \hbar^2 k^2 ) / ( 2 m_e )$.
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Multichannel Analog Inputs}

\begin{longtable}[l]{lll}
  \textbf{i404\_mcai}&\DrvWorking&I404 reads out all 4 channels.\\
  \textbf{network\_mcai}&\DrvWorking&Multichannel analog input controlled by a remote MX server.\\
  \textbf{qbpm\_mcai}&\DrvOld&Oxford Danfysik QBPM reads out all 4 channels.\\
\end{longtable}

\subsection{Devices usable with all MCAIs}
\begin{longtable}[l]{lll}
  \textbf{mcai\_function}&\DrvWorking&Computes a linear function of the values
		from an MCAI device.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Multichannel Analyzers}

\begin{longtable}[l]{lll}
  \textbf{amptek\_dp4\_mca}&\DrvDeferred&Amptek DP4 multichannel analyzers.\\
  \textbf{amptek\_dp5\_mca}&\DrvWorking&Amptek DP5 multichannel analyzers.\\
  \textbf{dante\_mca}&\DrvWorking&A single XGlab DANTE MCA channel in Normal (single spectrum) mode.\\
  \textbf{epics\_mca}&\DrvWorking&MX MCA driver for the EPICS MCA record.\\
  \textbf{handel\_mca}&\DrvWorking&Controls a single MCA in an XIA Handel installation.\\
  \textbf{monte\_carlo\_mca}&\DrvWorking&Software emulated multichannel analyzer using simple Monte Carlo calculations.\\
  \textbf{network\_mca}&\DrvWorking&Multichannel analyzer controlled by a remote MX server.\\
  \textbf{roentec\_rcl\_mca}&\DrvWorking&Roentec MCAs using the RCL 2.2 command language.\\
  \textbf{soft\_mca}&\DrvWorking&Software emulated multichannel analyzer.\\
  \textbf{trump\_mca}&\DrvAncient&MCA driver for the old EG\&G Ortec Trump MCA.  Only tested with ISA bus.\\
\end{longtable}

\subsection{Devices usable with all MCAs}
\begin{longtable}[l]{lll}
  \textbf{mca\_alt\_time}&\DrvWorking&Reads alternate MCA times (real/live) as a scaler.\\
  \textbf{mca\_channel}&\DrvWorking&Reads an individual MCA channel as a scaler.\\
  \textbf{mca\_roi\_integral}&\DrvWorking&Reads an individual MCA ROI integral as a scaler.\\
  \textbf{mca\_timer}&\DrvWorking&Used to control MX MCA timers.\\
  \textbf{mca\_value}&\DrvWorking&MCA-derived values such as ROIs and corrected ROIs.\\
  \textbf{mca\_weighted\_sum}&\DrvWorking&Weighted sums of MCA ROIs.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Multichannel Encoder}

\begin{longtable}[l]{lll}
  \textbf{databox\_mce}&\DrvOld&Reports stored Radix Databox motor positions.\\
  \textbf{epics\_scaler\_mce}&\DrvWorking&MX MCE driver for ``synchronous'' reads of EPICS motor and scaler values.\\
  \textbf{mcs\_mce}&\DrvWorking&Computes incremental changes in position from differences between two MCS channels.\\
  \textbf{mcs\_time\_mce}&\DrvWorking&Reports the elapsed MCS time as a multichannel encoder array.\\
  \textbf{network\_mce}&\DrvWorking&Multichannel encoder controlled by a remote MX server.\\
  \textbf{pmac\_mce}&\DrvWorking&Records the position of a PMAC motor in a pair of multichannel scaler channels.\\
  \textbf{soft\_mce}&\DrvNeverFinished&Uses an OS thread to periodically record motor positions.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Multichannel Scalers}

\begin{longtable}[l]{lll}
  \textbf{dante\_mcs}&\DrvInProgress&MCS driver for a DANTE MCA channel in Mapping (multiple spectra) mode.\\
  \textbf{databox\_mcs}&\DrvOld&Radix Databox MCS.\\
  \textbf{epics\_mcs}&\DrvWorking&MX MCS driver for the EPICS MCA record.\\
  \textbf{epics\_scaler\_mcs}&\DrvWorking&MX MCS driver for ``synchronous'' reads of multiple EPICS scaler values.\\
  \textbf{handel\_mcs}&\DrvInProgress&Controls a single MCA in an MCS-compatible mapping mode.\\
  \textbf{network\_mcs}&\DrvWorking&Multichannel scaler controlled by a remote MX server.\\
  \textbf{sis3801}&\DrvWorking&Struck SIS3801 multichannel scaler.\\
  \textbf{sis3820}&\DrvRecent&Struck SIS3820 multichannel scaler.\\
  \textbf{soft\_mcs}&\DrvWorking&Software emulated multichannel scaler.\\
\end{longtable}

\subsection{Pseudo MCS}

\begin{longtable}[l]{lll}
  \textbf{scaler\_function\_mcs}&\DrvWorking&MX pseudo MCS for MX scaler function pseudoscalers.\\
\end{longtable}

\subsection{Devices usable with all MCSs}
\begin{longtable}[l]{lll}
  \textbf{mcs\_mce}&\DrvWorking&Computes incremental changes in position from differences between two MCS channels.\\
  \textbf{mcs\_scaler}&\DrvWorking&Reads an individual MCS channel as a scaler.\\
  \textbf{mcs\_time\_mce}&\DrvWorking&Reports the elapsed MCS time as a multichannel encoder array.\\
  \textbf{mcs\_timer}&\DrvWorking&Used to control MX MCS timers.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Pan/Tilt/Zoom Controllers}

\begin{longtable}[l]{lll}
  \textbf{hitachi\_kp\_d20}&\DrvWorking&Hitachi KP-D20A/B pan/tilt/zoom controller.\\
  \textbf{network\_ptz}&\DrvWorking&Pan/Tilt/Zoom device controlled by a remote MX server.\\
  \textbf{panasonic\_kx\_dp702\_ptz}&\DrvOld&Panasonic KX-DP702 pan/tilt/zoom driver.\\
  \textbf{sony\_visca\_ptz}&\DrvOld&Sony VISCA-based pan/tilt/zoom controller.\\
\end{longtable}

\subsection{Devices usable with all PTZs}
\begin{longtable}[l]{lll}
  \textbf{ptz\_motor}&\DrvRecent&Motor axis for an MX Pan/Tilt/Zoom controller.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Pulse Generators}

\begin{longtable}[l]{lll}
  \textbf{bnc725\_pulser}&\DrvDeferred&BNC725 pulser.\\
  \textbf{dg645\_pulser}&\DrvWorking&SRS DG645 pulse generator.\\
  \textbf{dg645\_burst\_pulser}&\DrvWorking&SRS DG645 pulse generator in burst mode.\\
  \textbf{digital\_output\_pulser}&\DrvWorking&Pulse generator that uses an MX digital output and operating system (OS) timers.\\
  \textbf{gittelsohn\_pulser}&\DrvWorking&Arduino Teensy-based pulse generator from Mark Gittelsohn.\\
  \textbf{mbc\_gsc\_trigger}&\DrvOld&ALS 4.2.2 beamline trigger using the Goniosync control.\\
  \textbf{mbc\_noir\_trigger}&\DrvOld&ALS 4.2.2 beamline trigger using the NOIR detector.\\
  \textbf{network\_pulser}&\DrvWorking&Pulse generator controlled by a remote MX server.\\
  \textbf{pdi45\_pulser}&\DrvOld&PDI45 pulse generator.\\
  \textbf{radicon\_helios\_trigger}&\DrvOld&Generates a trigger for the Radicon Helios area detector.\\
  \textbf{relay\_pulser}&\DrvWorking&Treat a relay as a pulse generator.\\
  \textbf{sis3801\_pulser}&\DrvOld&Struck SIS3801 used as a pulse generator.\\
  \textbf{sis3807\_pulser}&\DrvWorking&Struck SIS3807 used as a pulse generator.\\
  \textbf{umx\_pulser}&\DrvWorking&UMX pulse generator.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Relays}

\begin{longtable}[l]{lll}
  \textbf{blind\_relay}&\DrvWorking&Relay using an MX digital output with no feedback.\\
  \textbf{field\_relay}&\DrvWorking&Relay using MX record fields for status and command.\\
  \textbf{flowbus\_valve}&\DrvWorking&Relay driver for FLOW-BUS valve.\\
  \textbf{generic\_relay}&\DrvWorking&Relay using an MX digital output with status read from an MX digital I/O.\\
  \textbf{marccd\_shutter}&\DrvWorking&Controls MarCCD shutter.\\
  \textbf{mardtb\_shutter}&\DrvPossiblyBroken&Controls MarDTB shutter.\\
  \textbf{motor\_relay}&\DrvWorking&Uses an MX motor to drive a mechanical relay.\\
  \textbf{network\_relay}&\DrvWorking&Relay controlled by a remote MX server.\\
  \textbf{pfcu\_filter}&\DrvWorking&Controls a single PFCU filter as an MX relay.\\
  \textbf{pfcu\_shutter}&\DrvWorking&Controls a single PFCU shutter as an MX relay.\\
  \textbf{pulsed\_relay}&\DrvWorking&Like a \textit{generic\_relay}, but active only for a requested pulse time.\\
  \textbf{synaccess\_netbooter\_relay}&\DrvOld&Synaccess netBooter power outlet as MX relay.\\
  \textbf{wti\_nps\_relay}&\DrvOld&Western Telematic power outlet as an MX relay.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Sample Changers}

\begin{longtable}[l]{lll}
  \textbf{network\_sample\_changer}&\DrvWorking&Sample changer controlled by a remote MX server.\\
  \textbf{sercat\_als\_robot}&\DrvOld&Old SERCAT sample changing robot.\\
  \textbf{soft\_sample\_changer}&\DrvWorking&Software-emulated sample changer.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Scalers}

\begin{longtable}[l]{lll}
  \textbf{databox\_scaler}&\DrvOld&Radix Databox scaler channel.\\
  \textbf{epics\_scaler}&\DrvWorking&MX scaler driver for the EPICS scaler record.\\
  \textbf{function\_generator\_scaler}&\DrvWorking&Software emulated scaler that acts like a function generator.\\
  \textbf{gm10\_scaler}&\DrvOld&Black Cat Systems GM-10 scaler.\\
  \textbf{k8055\_scaler}&\DrvWorking&Scaler for Velleman K8055 counters.\\
  \textbf{ks3610}&\DrvOld&Kinetic Systems KS3610 scaler.\\
  \textbf{mca\_alt\_time}&\DrvWorking&Reads alternate MCA times (real/live) as a scaler.\\
  \textbf{mca\_channel}&\DrvWorking&Reads an individual MCA channel as a scaler.\\
  \textbf{mca\_roi\_integral}&\DrvWorking&Reads an individual MCA ROI integral as a scaler.\\
  \textbf{mcs\_scaler}&\DrvWorking&Reads an individual MCS channel as a scaler.\\
  \textbf{network\_scaler}&\DrvWorking&Scaler controlled by a remote MX server.\\
  \textbf{ortec974\_scaler}&\DrvOld&Ortec 974 scaler channel.\\
  \textbf{pdi45\_scaler}&\DrvNeverFinished&PDI45 digital outputs.\\
  \textbf{qs450}&\DrvOld&DSP QS450 scaler.\\
  \textbf{scipe\_scaler}&\DrvObsolete&SCIPE scaler.\\
  \textbf{soft\_scaler}&\DrvWorking&Software emulated scaler that reads scaler values from a precomputed table.\\
  \textbf{spec\_scaler}&\DrvOld&Scaler channel controlled by a remote Spec server.\\
  \textbf{vsc16\_scaler}&\DrvOld&Joerger VSC16 scaler channel.\\
\end{longtable}

\subsection{Pseudoscalers}

\begin{longtable}[l]{lll}
  \textbf{autoscale\_scaler}&\DrvWorking&Scaler that changes the amplifier's gain if the signal exceeds limits.\\
  \textbf{gain\_tracking\_scaler}&\DrvWorking&Scaler whose gain tracks changes made by the \textbf{autoscale\_scaler}.\\
  \textbf{scaler\_function}&\DrvWorking&Returns a value that is a linear function of several real scalers and variables.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Single Channel Analyzers}

\begin{longtable}[l]{lll}
  \textbf{cyberstar\_x1000}&\DrvWorking&Cyberstar X1000 as a single channel analyzer.\\
  \textbf{network\_sca}&\DrvWorking&Single channel analyzer controlled by a remote MX server.\\
  \textbf{soft\_sca}&\DrvWorking&Software emulated single channel analyzer.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Tables}

\begin{longtable}[l]{lll}
  \textbf{adc\_table}&\DrvOld&Originally used for an ADC diffractometer support table at APS Sector 17.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Timers}

\begin{longtable}[l]{lll}
  \textbf{area\_detector\_timer}&\DrvWorking&Used to control MX area detector timers.\\
  \textbf{bluice\_dcss\_timer}&\DrvOld&Blu-Ice timer as used by a DCSS client.\\
  \textbf{bluice\_dhs\_timer}&\DrvOld&Blu-Ice timer as used in a DHS server.\\
  \textbf{databox\_timer}&\DrvOld&Radix Databox timer.\\
  \textbf{epics\_timer}&\DrvWorking&MX timer driver for the EPICS scaler record.\\
  \textbf{gm10\_timer}&\DrvOld&Black Cat Systems GM-10 timer.\\
  \textbf{handel\_timer}&\DrvWorking&MX timer driver for XIA Handel-controlled MCAs.\\
  \textbf{interval\_timer}&\DrvWorking&Uses an MX OS interval timer as a timer.\\
  \textbf{k8055\_timer}&\DrvWorking&Timer for the Velleman K8055.\\
  \textbf{mca\_timer}&\DrvWorking&Used to control MX MCA timers.\\
  \textbf{mcs\_timer}&\DrvWorking&Used to control MX MCS timers.\\
  \textbf{network\_timer}&\DrvWorking&Timer controlled by a remote MX server.\\
  \textbf{ortec974\_timer}&\DrvOld&Ortec 974 timer channel.\\
  \textbf{pdi45\_timer}&\DrvOld&PDI45 digital outputs.\\
  \textbf{pfcu\_shutter\_timer}&\DrvWorking&Controls the exposure time of a PF252 shutter.\\
  \textbf{rtc018}&\DrvOld&DSP RTC-018 timer.\\
  \textbf{scipe\_timer}&\DrvObsolete&SCIPE timer.\\
  \textbf{soft\_timer}&\DrvWorking&Software emulated timer that uses OS timer ticks for timing.\\
  \textbf{spec\_timer}&\DrvOld&Timer controlled by a remote Spec server.\\
  \textbf{timer\_fanout}&\DrvWorking&Controls multiple MX timers as if they were one timer.\\
  \textbf{vsc16\_timer}&\DrvOld&Joerger VSC16 timer channel.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Video Inputs}

\begin{longtable}[l]{lll}
  \textbf{aravis\_camera}&\DrvWorking&An MX video input interfaced via Aravis.\\
  \textbf{avt\_vimba\_camera}&\DrvDeferred&MX video input driver using the AVT Vimba C API.\\
  \textbf{dalsa\_gev\_camera}&\DrvWorking&MX video input driver using the Dalsa GeV API on Linux.\\
  \textbf{edt\_video\_input}&\DrvDeferred&MX video input driver for EDT Camera Link cameras.\\
  \textbf{epix\_xclib\_video\_input}&\DrvWorking&EPIX, Inc. video input.\\
  \textbf{fastcam\_pcclib\_camera}&\DrvNeverFinished&Photron FASTCAM camera.\\
  \textbf{file\_vinput}&\DrvWorking&Emulated video input that reads image frames from a directory of existing image files.\\
  \textbf{network\_vinput}&\DrvWorking&Video input controlled by a remote MX server.\\
  \textbf{pleora\_iport\_vinput}&\DrvRecent&Pleora iPORT camera.\\
  \textbf{sapera\_lt\_camera}&\DrvWorking&Sapera LT-based GigE Vision camera.\\
  \textbf{sapera\_lt\_frame\_grabber}&\DrvWorking&Sapera LT-based Camera Link (?) frame grabbers..\\
  \textbf{soft\_vinput}&\DrvWorking&Software-emulated video input with selectable image patterns.\\
  \textbf{sony\_snc}&\DrvNeverFinished&Sony network camera.\\
  \textbf{v4l2\_input}&\DrvRecent&Video4Linux2 based camera.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Waveform Input}

\begin{longtable}[l]{lll}
  \textbf{network\_wvin}&\DrvWorking&Waveform input controlled by a remote MX server.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Waveform Outputs}

\begin{longtable}[l]{lll}
  \textbf{bkprecision\_wvout}&\DrvRecent&BK Precision 912x waveform outputs.\\
  \textbf{network\_wvout}&\DrvWorking&Waveform output controlled by a remote MX server.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Variables}

\subsection{Aerotech U500 Variables}
Controls V variables in a U500 controller.
\begin{longtable}[l]{lll}
  \textbf{u500\_variable}&\DrvWorking&Support for reading Aerotech Unidex 500 V variables.\\
\end{longtable}

\subsection{Blu-Ice Specific Variables}
\begin{longtable}[l]{lll}
  \textbf{bluice\_dcss\_operation}&\DrvOld&Used by DCSS client to interact with a Blu-Ice operation.\\
  \textbf{bluice\_dhs\_operation}&\DrvOld&Used by DHS server to interact with a Blu-Ice operation.\\
  \textbf{bluice\_self\_operation}&\DrvOld&Used by a Blu-Ice process to interact with itself.\\
  \textbf{bluice\_dcss\_string}&\DrvOld&Used by DCSS client to receive a Blu-Ice variable.\\
  \textbf{bluice\_dhs\_string}&\DrvOld&Used by DHS server to receive a Blu-Ice variable.\\
  \textbf{bluice\_self\_string}&\DrvOld&Used by a Blu-Ice process to receive a variable from itself.\\
  \textbf{bluice\_command}&\DrvOld&Used by DCSS client to send a command to Blu-Ice.\\
  \textbf{bluice\_master}&\DrvOld&Used by DCSS client to become Blu-Ice master.\\
\end{longtable}

\subsection{Calculation Variables}
\begin{longtable}[l]{lll}
  \textbf{indirect\_string}&\DrvWorking&Constructs a string containing values read from several MX record fields.\\
  \textbf{mathop}&\DrvWorking&A method for calculating values read from several MX record fields.\\
  \textbf{position\_select}&\DrvWorking&Selects from a list of motor positions.  Used to switch between Pt and Rh mirror stripes.\\
\end{longtable}

\subsection{Field Variables}
Variables belonging to another MX record field in the same process.
\begin{longtable}[l]{lll}
  \textbf{field\_bool}&\DrvWorking& \\
  \textbf{field\_char}&\DrvWorking& \\
  \textbf{field\_uchar}&\DrvWorking& \\
  \textbf{field\_short}&\DrvWorking& \\
  \textbf{field\_ushort}&\DrvWorking& \\
  \textbf{field\_long}&\DrvWorking& \\
  \textbf{field\_ulong}&\DrvWorking& \\
  \textbf{field\_hex}&\DrvWorking& \\
  \textbf{field\_int8}&\DrvWorking& \\
  \textbf{field\_uint8}&\DrvWorking& \\
  \textbf{field\_int16}&\DrvWorking& \\
  \textbf{field\_uint16}&\DrvWorking& \\
  \textbf{field\_int32}&\DrvWorking& \\
  \textbf{field\_uint32}&\DrvWorking& \\
  \textbf{field\_int64}&\DrvWorking& \\
  \textbf{field\_uint64}&\DrvWorking& \\
  \textbf{field\_float}&\DrvWorking& \\
  \textbf{field\_double}&\DrvWorking& \\
  \textbf{field\_string}&\DrvWorking& \\
  \textbf{field\_record}&\DrvWorking&A reference to a record in another MX record.\\
\end{longtable}

\subsection{EPICS Variables \ \textit{(from epics.mxo)}}
Read/write EPICS PVs.
\begin{longtable}[l]{lll}
  \textbf{aps\_topup\_time}&\DrvRecent&Remaining time until the next APS topup injection.\\
  \textbf{epics\_char}&\DrvWorking& \\
  \textbf{epics\_short}&\DrvWorking& \\
  \textbf{epics\_long}&\DrvWorking& \\
  \textbf{epics\_float}&\DrvWorking& \\
  \textbf{epics\_double}&\DrvWorking& \\
  \textbf{epics\_string}&\DrvWorking& \\
\end{longtable}

\subsection{File Variables}
Variables used to read or write named pipes or Linux /proc, /sys, etc. variables.
\begin{longtable}[l]{lll}
  \textbf{file\_double}&\DrvOld& \\
  \textbf{file\_long}&\DrvOld& \\
  \textbf{file\_ulong}&\DrvOld& \\
  \textbf{file\_string}&\DrvOld& \\
\end{longtable}

\subsection{FLOW-BUS flow controller parameters}
\begin{longtable}[l]{lll}
  \textbf{flowbus\_capacity}&\DrvWorking&FLOW-BUS capacity parameter.\\
  \textbf{flowbus\_float}&\DrvWorking&FLOW-BUS float parameter.\\
  \textbf{flowbus\_string}&\DrvWorking&FLOW-BUS string parameter.\\
  \textbf{flowbus\_uint8}&\DrvWorking&FLOW-BUS uint8 parameter.\\
  \textbf{flowbus\_ulong}&\DrvWorking&FLOW-BUS ulong parameter.\\
  \textbf{flowbus\_ushort}&\DrvWorking&FLOW-BUS ushort parameter.\\
\end{longtable}

\subsection{Inline Variables}
Variables that are local to your process.
\begin{longtable}[l]{lll}
  \textbf{bool}&\DrvWorking& \\
  \textbf{char}&\DrvWorking& \\
  \textbf{uchar}&\DrvWorking& \\
  \textbf{short}&\DrvWorking& \\
  \textbf{ushort}&\DrvWorking& \\
  \textbf{long}&\DrvWorking& \\
  \textbf{ulong}&\DrvWorking& \\
  \textbf{int8}&\DrvWorking& \\
  \textbf{uint8}&\DrvWorking& \\
  \textbf{int16}&\DrvWorking& \\
  \textbf{uint16}&\DrvWorking& \\
  \textbf{int32}&\DrvWorking& \\
  \textbf{uint32}&\DrvWorking& \\
  \textbf{int64}&\DrvWorking& \\
  \textbf{uint64}&\DrvWorking& \\
  \textbf{float}&\DrvWorking& \\
  \textbf{double}&\DrvWorking& \\
  \textbf{string}&\DrvWorking& \\
  \textbf{record}&\DrvWorking&A reference to another record in the process.\\
\end{longtable}

\subsection{Network Variables}
Variables controlled by a remote MX server.
\begin{longtable}[l]{lll}
  \textbf{net\_bool}&\DrvWorking& \\
  \textbf{net\_char}&\DrvWorking& \\
  \textbf{net\_uchar}&\DrvWorking& \\
  \textbf{net\_short}&\DrvWorking& \\
  \textbf{net\_ushort}&\DrvWorking& \\
  \textbf{net\_long}&\DrvWorking& \\
  \textbf{net\_ulong}&\DrvWorking& \\
  \textbf{net\_int8}&\DrvWorking& \\
  \textbf{net\_uint8}&\DrvWorking& \\
  \textbf{net\_int16}&\DrvWorking& \\
  \textbf{net\_uint16}&\DrvWorking& \\
  \textbf{net\_int32}&\DrvWorking& \\
  \textbf{net\_uint32}&\DrvWorking& \\
  \textbf{net\_int64}&\DrvWorking& \\
  \textbf{net\_uint64}&\DrvWorking& \\
  \textbf{net\_float}&\DrvWorking& \\
  \textbf{net\_double}&\DrvWorking& \\
  \textbf{net\_string}&\DrvWorking& \\
  \textbf{net\_record}&\DrvWorking&A reference to a record in a remote MX server.\\
\end{longtable}

\subsection{PMAC Variables}
Variables controlled by a PMAC or Turbo PMAC motor controller.
\begin{longtable}[l]{lll}
  \textbf{pmac\_double}&\DrvWorking& \\
  \textbf{pmac\_long}&\DrvWorking& \\
  \textbf{pmac\_ulong}&\DrvWorking& \\
\end{longtable}

\subsection{PowerPMAC Variables}
Variables controlled by a PMAC or Turbo PMAC motor controller.
\begin{longtable}[l]{lll}
  \textbf{powerpmac\_long}&\DrvWorking&PowerPMAC variable treated as an MX long variable.\\
  \textbf{powerpmac\_ulong}&\DrvWorking&PowerPMAC variable treated as an MX unsigned long variable.\\
  \textbf{powerpmac\_double}&\DrvWorking&PowerPMAC variable treated as an MX double variable.\\
\end{longtable}

\subsection{Spec Variables}
Variables controlled by a remote Spec server.
\begin{longtable}[l]{lll}
  \textbf{spec\_char}&\DrvOld& \\
  \textbf{spec\_uchar}&\DrvOld& \\
  \textbf{spec\_short}&\DrvOld& \\
  \textbf{spec\_ushort}&\DrvOld& \\
  \textbf{spec\_long}&\DrvOld& \\
  \textbf{spec\_ulong}&\DrvOld& \\
  \textbf{spec\_int64}&\DrvOld& \\
  \textbf{spec\_uint64}&\DrvOld& \\
  \textbf{spec\_float}&\DrvOld& \\
  \textbf{spec\_double}&\DrvOld& \\
  \textbf{spec\_string}&\DrvOld& \\
\end{longtable}

\subsection{Special Variables}
Special purpose variables.
\begin{longtable}[l]{lll}
  \textbf{fix\_regions}&\DrvWorking&Used to perform simple image corrections to area detector or video input images.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Scans}

\subsection{Linear Scans}
\begin{longtable}[l]{lll}
  \textbf{input\_scan}&\DrvWorking&A scan that periodically reads input devices without moving anything.\\
  \textbf{motor\_scan}&\DrvWorking&Motor step scans that can be multidimensional.\\
  \textbf{relative\_scan}&\DrvWorking&Motor step scans specified relative to the current motor position(s).\\
  \textbf{pseudomotor\_scan}&\DrvWorking&Step scans various pseudomotor types while correcting for move errors.\\
  \textbf{2theta\_scan}&\DrvOld&A $\theta-2\theta$ scan.\\
  \textbf{slit\_scan}&\DrvOld&Step scans slit pseudomotors. \textit{(Replaced by pseudomotor\_scan)}\\
\end{longtable}

\subsection{List Scans}
\begin{longtable}[l]{lll}
  \textbf{file\_list\_scan}&\DrvOld&Reads requested measurement times and motor positions from a file.\\
\end{longtable}

\subsection{XAFS Scans}
\begin{longtable}[l]{lll}
  \textbf{xafs\_scan}&\DrvWorking&Multiregion XAFS scans with different measurement times in different regions.\\
  \textbf{xafs\_k\_power\_law\_scans}&\DrvWorking&Like an \textit{xafs\_scan} but with $k$ power law measurement times.\\
\end{longtable}

\subsection{Quick Scans \textit{(Slew, Fly, ...)}}
\begin{longtable}[l]{lll}
  \textbf{aps\_id\_qscan}&\DrvRecent&An MX quick scan that synchronizes with APS insertion device motion.\\
  \textbf{mcs\_qscan}&\DrvWorking&Multichannel scaler-based quick scans.\\
  \textbf{energy\_mcs\_qscan}&\DrvWorking&Multichannel scaler-based quick scans of the \textit{energy} pseudomotor.\\
\end{longtable}

\subsection{Area Detector Scans}
\begin{longtable}[l]{lll}
  \textbf{wedge\_scan}&\DrvOld&An area detector step scan with wedges 180 degrees apart to do wear leveling of crystal X-ray damage.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Servers}

\subsection{MX Network Servers}
\begin{longtable}[l]{lll}
  \textbf{tcp\_server}&\DrvWorking&TCP/IP connection to an MX server.\\
  \textbf{tcpip\_server}&\DrvWorking&An alias for \textit{tcp\_server}.\\
  \textbf{unix\_server}&\DrvWorking&Unix domain socket connection to an MX server.\\
  \textbf{umx\_server}&\DrvInProgress&RS-232 style connection to a UMX microcontroller or the ASCII port of an MX server.\\
\end{longtable}

\subsection{Blu-Ice Servers}
\begin{longtable}[l]{lll}
  \textbf{bluice\_dcss\_server}&\DrvOld&Client connection to a Blu-Ice DCSS server.\\
  \textbf{bluice\_dhs\_server}&\DrvOld&Client connection of an MX process pretending to be DCSS to a Blu-Ice DHS server.\\
  \textbf{bluice\_dhs\_manager}&\DrvOld&Manages connection attempts by DHS servers to an MX process pretending to be DCSS.\\
\end{longtable}

\subsection{Spec Servers}
\begin{longtable}[l]{lll}
  \textbf{spec\_server}&\DrvOld&Client connection to a remote Spec server.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Operations}

Operations refer to long running sequences of events that can be started
or stopped.

\begin{longtable}[l]{lll}
  \textbf{network\_operation}&\DrvWorking&An operation controlled by a remote MX server.\\
  \textbf{toast}&\DrvWorking&Oscillate a motor back and forth to evenly distribute X-ray dose for a sample.\\
\end{longtable}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{``Special'' Drivers}

Drivers that do not fit anywhere else.

\begin{longtable}[l]{lll}
  \textbf{dictionary}&\DrvInProgress&A place to store dictionaries of text data, such as area detector headers.\\
  \textbf{external\_command}&\DrvWorking&Runs an external process from a database entry for things like special initialization steps.\\
\end{longtable}

\end{document}
