package comediJNI;

public class ComediDef {

	public static final int  AREF_GROUND = 0x00;		/* analog ref = analog ground */
	public static final int  AREF_COMMON = 0x01;		/* analog ref = analog common */
	public static final int  AREF_DIFF = 0x02;		/* analog ref = differential */
	public static final int AREF_OTHER =	0x03;		/* analog ref = other (undefined) */

	public static final int COMEDI_OOR_NUMBER = 0;
	public static final int COMEDI_OOR_NAN = 1;
	
	
	public static final int  TRIG_BOGUS		= 0x0001;		/* do the motions */
	public static final int  TRIG_DITHER		= 0x0002;		/* enable dithering */
	public static final int  TRIG_DEGLITCH	= 0x0004;		/* enable deglitching */
	//public static final int  TRIG_RT			= 0x0008;		/* perform op in real time */
	public static final int  TRIG_CONFIG		= 0x0010;		/* perform configuration, not triggering */
	public static final int  TRIG_WAKE_EOS	= 0x0020;		/* wake up on end-of-scan events */
	//public static final int  TRIG_WRITE		= 0x0040;		/* write to bidirectional devices */
	
	public static final int   UNIT_volt	= 0;
	public static final int   UNIT_mA		= 1;
	public static final int   UNIT_none	= 2;


	public static final int CMDF_PRIORITY		= 0x00000008; /* try to use a real-time interrupt while performing command */

	public static final int TRIG_RT		= CMDF_PRIORITY; /* compatibility definition */

	public static final int CMDF_WRITE		= 0x00000040;
	public static final int TRIG_WRITE	= CMDF_WRITE; /* compatibility definition */

	public static final int CMDF_RAWDATA		= 0x00000080;

	public static final int COMEDI_EV_START		= 0x00040000;
	public static final int COMEDI_EV_SCAN_BEGIN	= 0x00080000;
	public static final int COMEDI_EV_CONVERT	= 0x00100000;
	public static final int COMEDI_EV_SCAN_END	= 0x00200000;
	public static final int COMEDI_EV_STOP		= 0x00400000;

	public static final int TRIG_ROUND_MASK		= 0x00030000;
	public static final int TRIG_ROUND_NEAREST	= 0x00000000;
	public static final int TRIG_ROUND_DOWN		= 0x00010000;
	public static final int TRIG_ROUND_UP		= 0x00020000;
	public static final int TRIG_ROUND_UP_NEXT	= 0x00030000;

	/** trigger sources */
	public static final int TRIG_ANY	= 0xffffffff;
	public static final int TRIG_INVALID	= 0x00000000;

	public static final int TRIG_NONE	= 0x00000001;		/* never trigger */
	public static final int TRIG_NOW	= 0x00000002;		/* trigger now + N ns */
	public static final int TRIG_FOLLOW	= 0x00000004;	/* trigger on next lower level trig */
	public static final int TRIG_TIME	= 0x00000008;		/* trigger at time N ns */
	public static final int TRIG_TIMER	= 0x00000010;	/* trigger at rate N ns */
	public static final int TRIG_COUNT	= 0x00000020;	/* trigger when count reaches N */
	public static final int TRIG_EXT	= 0x00000040;		/* trigger on external signal N */
	public static final int TRIG_INT	= 0x00000080;		/* trigger on comedi-internal signal N */
	public static final int TRIG_OTHER	= 0x00000100;	/* driver defined */
   
	public static final int NI_USUAL_PFI_SELECT(int pfi_channel) {
        if (pfi_channel < 10)
                return 0x1 + pfi_channel;
        else
                return 0xb + pfi_channel;
}

	public static final int NI_USUAL_RTSI_SELECT(int rtsi_channel) {
        if (rtsi_channel < 7)
                return 0xb + rtsi_channel;
        else
                return 0x1b;
}

	/* NI External Trigger lines.  These values are not arbitrary, but are related to
    the bits required to program the board (offset by 1 for historical reasons). */
	public static int NI_EXT_PFI(int pfi_channel) {
            return NI_USUAL_PFI_SELECT(pfi_channel) - 1;
    }
	public static int NI_EXT_RTSI(int rtsi_channel) {
            return NI_USUAL_RTSI_SELECT(rtsi_channel) - 1;
    }


	/** subdevice flags */
	public static final int SDF_BUSY		= 0x0001;			/* device is busy */
	public static final int SDF_BUSY_OWNER	= 0x0002;		/* device is busy with your job */
	public static final int SDF_LOCKED	= 0x0004;			/* subdevice is locked */
	public static final int SDF_LOCK_OWNER	= 0x0008;		/* you own lock */
	public static final int SDF_MAXDATA	= 0x0010;			/* maxdata depends on channel */
	public static final int SDF_FLAGS	= 0x0020;				/* flags depend on channel */
	public static final int SDF_RANGETYPE	= 0x0040;			/* range type depends on channel */
	public static final int SDF_MODE0	= 0x0080;				/* can do mode 0 */
	public static final int SDF_MODE1	= 0x0100;				/* can do mode 1 */
	public static final int SDF_MODE2	= 0x0200;				/* can do mode 2 */
	public static final int SDF_MODE3	= 0x0400;				/* can do mode 3 */
	public static final int SDF_MODE4	= 0x0800;				/* can do mode 4 */
	public static final int SDF_CMD		= 0x1000;			/* can do commands (deprecated) */
	public static final int SDF_SOFT_CALIBRATED	= 0x2000;	/* subdevice uses software calibration */
	public static final int SDF_CMD_WRITE		= 0x4000;		/* can do output commands */
	public static final int SDF_CMD_READ		= 0x8000;		/* can do input commands */

	public static final int SDF_READABLE	= 0x00010000;		/* subdevice can be read (e.g. analog input) */
	public static final int SDF_WRITABLE	= 0x00020000;		/* subdevice can be written (e.g. analog output) */
	public static final int SDF_WRITEABLE	 = SDF_WRITABLE;	/* spelling error in API */
	public static final int SDF_INTERNAL	= 0x00040000;		/* subdevice does not have externally visible lines */
	public static final int SDF_RT		= 0x00080000;		/* DEPRECATED: subdevice is RT capable */
	public static final int SDF_GROUND	= 0x00100000;		/* can do aref=ground */
	public static final int SDF_COMMON	= 0x00200000;		/* can do aref=common */
	public static final int SDF_DIFF	= 0x00400000;			/* can do aref=diff */
	public static final int SDF_OTHER	= 0x00800000;			/* can do aref=other */
	public static final int SDF_DITHER	= 0x01000000;		/* can do dithering */
	public static final int SDF_DEGLITCH	= 0x02000000;		/* can do deglitching */
	public static final int SDF_MMAP	= 0x04000000;			/* can do mmap() */
	public static final int SDF_RUNNING	= 0x08000000;		/* subdevice is acquiring data */
	public static final int SDF_LSAMPL	= 0x10000000;		/* subdevice uses 32-bit samples */
	public static final int SDF_PACKED	= 0x20000000;		/* subdevice can do packed DIO */
	
	/** subdevice types */
	public static final int COMEDI_SUBD_UNUSED = 0;	/* unused by driver */
	public static final int COMEDI_SUBD_AI = 1;		/* analog input */
	public static final int COMEDI_SUBD_AO = 2;		/* analog output */
	public static final int COMEDI_SUBD_DI = 3;		/* digital input */
	public static final int COMEDI_SUBD_DO = 4;		/* digital output */
	public static final int COMEDI_SUBD_DIO = 5;		/* digital input/output */
	public static final int COMEDI_SUBD_COUNTER = 6;	/* counter */
	public static final int COMEDI_SUBD_TIMER = 7;	/* timer */
	public static final int COMEDI_SUBD_MEMORY = 8;	/* memory, EEPROM, DPRAM */
	public static final int COMEDI_SUBD_CALIB = 9;	/* calibration DACs */
	public static final int COMEDI_SUBD_PROC = 10;	/* processor, DSP */
	public static final int COMEDI_SUBD_SERIAL = 11;	/* serial IO */	

	/** configuration instructions */
	public static final int INSN_CONFIG_DIO_INPUT = 0;
	public static final int INSN_CONFIG_DIO_OUTPUT = 1;
	public static final int INSN_CONFIG_DIO_OPENDRAIN = 2;
	public static final int INSN_CONFIG_ANALOG_TRIG = 16;
	//	public static final int INSN_CONFIG_WAVEFORM = 17;
	//	public static final int INSN_CONFIG_TRIG = 18;
	//	public static final int INSN_CONFIG_COUNTER = 19;
	public static final int INSN_CONFIG_ALT_SOURCE = 20;
	public static final int INSN_CONFIG_DIGITAL_TRIG = 21;
	public static final int INSN_CONFIG_BLOCK_SIZE = 22;
	public static final int INSN_CONFIG_TIMER_1 = 23;
	public static final int INSN_CONFIG_FILTER = 24;
	public static final int INSN_CONFIG_CHANGE_NOTIFY = 25;
	
	/** ALPHA */
	public static final int INSN_CONFIG_SERIAL_CLOCK = 26;
	public static final int INSN_CONFIG_BIDIRECTIONAL_DATA = 27;
	public static final int INSN_CONFIG_DIO_QUERY = 28;
	public static final int INSN_CONFIG_PWM_OUTPUT = 29;
	public static final int INSN_CONFIG_GET_PWM_OUTPUT = 30;
	public static final int INSN_CONFIG_ARM = 31;
	public static final int INSN_CONFIG_DISARM = 32;
	public static final int INSN_CONFIG_GET_COUNTER_STATUS = 33;
	public static final int INSN_CONFIG_RESET = 34;
	public static final int INSN_CONFIG_GPCT_SINGLE_PULSE_GENERATOR = 1001; 	// Use CTR as single pulsegenerator
	public static final int INSN_CONFIG_GPCT_PULSE_TRAIN_GENERATOR = 1002; 	// Use CTR as pulsetraingenerator
	public static final int INSN_CONFIG_GPCT_QUADRATURE_ENCODER = 1003; 		// Use the counter as encoder
	public static final int INSN_CONFIG_SET_GATE_SRC = 2001;					// Set gate source
	public static final int INSN_CONFIG_GET_GATE_SRC = 2002;					// Get gate source
	public static final int INSN_CONFIG_SET_CLOCK_SRC = 2003;					// Set master clock source
	public static final int INSN_CONFIG_GET_CLOCK_SRC = 2004;					// Get master clock source
	public static final int INSN_CONFIG_SET_OTHER_SRC = 2005;       			// Set other source
	//	public static final int INSN_CONFIG_GET_OTHER_SRC = 2006;				// Get other source
	public static final int INSN_CONFIG_SET_COUNTER_MODE = 4097;
	public static final int INSN_CONFIG_8254_SET_MODE = INSN_CONFIG_SET_COUNTER_MODE;	/* deprecated */
	public static final int INSN_CONFIG_8254_READ_STATUS = 4098;
	public static final int INSN_CONFIG_SET_ROUTING = 4099;
	public static final int INSN_CONFIG_GET_ROUTING = 4109;


	/** enum comedi_io_direction */
	public static final int COMEDI_INPUT = 0;
	public static final int COMEDI_OUTPUT = 1;
	public static final int COMEDI_OPENDRAIN = 2;
	

	/** enum ni_m_series_cdio_scan_begin_src 
	 * Clock sources for CDIO subdevice on NI m-series boards.
	Used as the scan_begin_arg for a comedi_command. These
	sources may also be bitwise-or'd with CR_INVERT to change polarity. */
	public static final int NI_CDIO_SCAN_BEGIN_SRC_GROUND = 0;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_AI_START = 18;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_AI_CONVERT = 19;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_PXI_STAR_TRIGGER = 20;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_G0_OUT = 28;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_G1_OUT = 29;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_ANALOG_TRIGGER = 30;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_AO_UPDATE = 31;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_FREQ_OUT = 32;
	public static final int NI_CDIO_SCAN_BEGIN_SRC_DIO_CHANGE_DETECT_IRQ = 33;


	/** start sources for ni general-purpose counters for use with
	INSN_CONFIG_ARM 
	enum ni_gpct_arm_source */
	public static final int NI_GPCT_ARM_IMMEDIATE = 0x0;
	public static final int NI_GPCT_ARM_PAIRED_IMMEDIATE = 0x1;	/* Start both the counter and the adjacent paired counter simultaneously */
		/* NI doesn't document bits for selecting hardware arm triggers.  If
		   the NI_GPCT_ARM_UNKNOWN bit is set, we will pass the least significant
		   bits (3 bits for 660x or 5 bits for m-series) through to the hardware.
		   This will at least allow someone to figure out what the bits do later. */
	public static final int NI_GPCT_ARM_UNKNOWN = 0x1000;
	

	/** Possibilities for setting a gate source with
	INSN_CONFIG_SET_GATE_SRC when using NI general-purpose counters.
	May be bitwise-or'd with CR_EDGE or CR_INVERT. 
	enum ni_gpct_gate_select */
	/* m-series gates */
	public static final int NI_GPCT_TIMESTAMP_MUX_GATE_SELECT = 0x0;
	public static final int NI_GPCT_AI_START2_GATE_SELECT = 0x12;
	public static final int NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT = 0x13;
	public static final int NI_GPCT_NEXT_OUT_GATE_SELECT = 0x14;
	public static final int NI_GPCT_AI_START1_GATE_SELECT = 0x1c;
	public static final int NI_GPCT_NEXT_SOURCE_GATE_SELECT = 0x1d;
	public static final int NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT = 0x1e;
	public static final int NI_GPCT_LOGIC_LOW_GATE_SELECT = 0x1f;
	/* more gates for 660x */
	public static final int NI_GPCT_SOURCE_PIN_i_GATE_SELECT = 0x100;
	public static final int NI_GPCT_GATE_PIN_i_GATE_SELECT = 0x101;
	/* more gates for 660x "second gate" */
	public static final int NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT = 0x201;
	public static final int NI_GPCT_SELECTED_GATE_GATE_SELECT = 0x21e;
	/* m-series "second gate" sources are unknown,
	   we should add them here with an offset of 0x300 when known. */
	public static final int NI_GPCT_DISABLED_GATE_SELECT = 0x8000;

	public static final int NI_GPCT_GATE_PIN_GATE_SELECT(int n) { return 0x102 + n;	}
	public static final int NI_GPCT_RTSI_GATE_SELECT(int n) { return NI_USUAL_RTSI_SELECT(n);	}
	public static final int NI_GPCT_PFI_GATE_SELECT(int n) { return NI_USUAL_PFI_SELECT(n);	}
	public static final int NI_GPCT_UP_DOWN_PIN_GATE_SELECT(int n) { return 0x202 + n; 	}

	/** mode bits for NI general-purpose counters, set with INSN_CONFIG_SET_COUNTER_MODE */ 
	public static final int NI_GPCT_COUNTING_MODE_SHIFT = 16;
	public static final int NI_GPCT_INDEX_PHASE_BITSHIFT = 20;
	public static final int NI_GPCT_COUNTING_DIRECTION_SHIFT = 24;
	/* enum ni_gpct_mode_bits { */
	public static final int NI_GPCT_GATE_ON_BOTH_EDGES_BIT = 0x4;
	public static final int NI_GPCT_EDGE_GATE_MODE_MASK = 0x18;
	public static final int NI_GPCT_EDGE_GATE_STARTS_STOPS_BITS = 0x0;
	public static final int NI_GPCT_EDGE_GATE_STOPS_STARTS_BITS = 0x8;
	public static final int NI_GPCT_EDGE_GATE_STARTS_BITS = 0x10;
	public static final int NI_GPCT_EDGE_GATE_NO_STARTS_NO_STOPS_BITS = 0x18;
	public static final int NI_GPCT_STOP_MODE_MASK = 0x60;
	public static final int NI_GPCT_STOP_ON_GATE_BITS = 0x00;
	public static final int NI_GPCT_STOP_ON_GATE_OR_TC_BITS = 0x20;
	public static final int NI_GPCT_STOP_ON_GATE_OR_SECOND_TC_BITS = 0x40;
	public static final int NI_GPCT_LOAD_B_SELECT_BIT = 0x80;
	public static final int NI_GPCT_OUTPUT_MODE_MASK = 0x300;
	public static final int NI_GPCT_OUTPUT_TC_PULSE_BITS = 0x100;
	public static final int NI_GPCT_OUTPUT_TC_TOGGLE_BITS = 0x200;
	public static final int NI_GPCT_OUTPUT_TC_OR_GATE_TOGGLE_BITS = 0x300;
	public static final int NI_GPCT_HARDWARE_DISARM_MASK = 0xc00;
	public static final int NI_GPCT_NO_HARDWARE_DISARM_BITS = 0x000;
	public static final int NI_GPCT_DISARM_AT_TC_BITS = 0x400;
	public static final int NI_GPCT_DISARM_AT_GATE_BITS = 0x800;
	public static final int NI_GPCT_DISARM_AT_TC_OR_GATE_BITS = 0xc00;
	public static final int NI_GPCT_LOADING_ON_TC_BIT = 0x1000;
	public static final int NI_GPCT_LOADING_ON_GATE_BIT = 0x4000;
	public static final int NI_GPCT_COUNTING_MODE_MASK = 0x7 << NI_GPCT_COUNTING_MODE_SHIFT;
	public static final int NI_GPCT_COUNTING_MODE_NORMAL_BITS =		0x0 << NI_GPCT_COUNTING_MODE_SHIFT;
	public static final int NI_GPCT_COUNTING_MODE_QUADRATURE_X1_BITS =	0x1 << NI_GPCT_COUNTING_MODE_SHIFT;
	public static final int NI_GPCT_COUNTING_MODE_QUADRATURE_X2_BITS =	0x2 << NI_GPCT_COUNTING_MODE_SHIFT;
	public static final int NI_GPCT_COUNTING_MODE_QUADRATURE_X4_BITS = 0x3 << NI_GPCT_COUNTING_MODE_SHIFT;
	public static final int NI_GPCT_COUNTING_MODE_TWO_PULSE_BITS = 0x4 << NI_GPCT_COUNTING_MODE_SHIFT;
	public static final int NI_GPCT_COUNTING_MODE_SYNC_SOURCE_BITS = 0x6 << NI_GPCT_COUNTING_MODE_SHIFT;
	public static final int NI_GPCT_INDEX_PHASE_MASK = 0x3 << NI_GPCT_INDEX_PHASE_BITSHIFT;
	public static final int NI_GPCT_INDEX_PHASE_LOW_A_LOW_B_BITS = 0x0 << NI_GPCT_INDEX_PHASE_BITSHIFT;
	public static final int NI_GPCT_INDEX_PHASE_LOW_A_HIGH_B_BITS = 0x1 << NI_GPCT_INDEX_PHASE_BITSHIFT;
	public static final int NI_GPCT_INDEX_PHASE_HIGH_A_LOW_B_BITS = 0x2 << NI_GPCT_INDEX_PHASE_BITSHIFT;
	public static final int NI_GPCT_INDEX_PHASE_HIGH_A_HIGH_B_BITS = 0x3 << NI_GPCT_INDEX_PHASE_BITSHIFT;
	public static final int NI_GPCT_INDEX_ENABLE_BIT = 0x400000;
	public static final int NI_GPCT_COUNTING_DIRECTION_MASK = 0x3 << NI_GPCT_COUNTING_DIRECTION_SHIFT;
	public static final int NI_GPCT_COUNTING_DIRECTION_DOWN_BITS = 0x00 << NI_GPCT_COUNTING_DIRECTION_SHIFT;
	public static final int NI_GPCT_COUNTING_DIRECTION_UP_BITS = 0x1 << NI_GPCT_COUNTING_DIRECTION_SHIFT;
	public static final int NI_GPCT_COUNTING_DIRECTION_HW_UP_DOWN_BITS = 0x2 << NI_GPCT_COUNTING_DIRECTION_SHIFT;
	public static final int NI_GPCT_COUNTING_DIRECTION_HW_GATE_BITS = 0x3 << NI_GPCT_COUNTING_DIRECTION_SHIFT;
	public static final int NI_GPCT_RELOAD_SOURCE_MASK = 0xc000000;
	public static final int NI_GPCT_RELOAD_SOURCE_FIXED_BITS = 0x0;
	public static final int NI_GPCT_RELOAD_SOURCE_SWITCHING_BITS = 0x4000000;
	public static final int NI_GPCT_RELOAD_SOURCE_GATE_SELECT_BITS = 0x8000000;
	public static final int NI_GPCT_OR_GATE_BIT = 0x10000000;
	public static final int NI_GPCT_INVERT_OUTPUT_BIT = 0x20000000;
	

	/** Bits for setting a clock source with
	 * INSN_CONFIG_SET_CLOCK_SRC when using NI general-purpose counters. 
	enum ni_gpct_clock_source_bits */
	public static final int NI_GPCT_CLOCK_SRC_SELECT_MASK = 0x3f;
	public static final int NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS = 0x0;
	public static final int NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS = 0x1;
	public static final int NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS = 0x2;
	public static final int NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS = 0x3;
	public static final int NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS = 0x4;
	public static final int NI_GPCT_NEXT_TC_CLOCK_SRC_BITS = 0x5;
	public static final int NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS = 0x6;	/* NI 660x-specific */
	public static final int NI_GPCT_PXI10_CLOCK_SRC_BITS = 0x7;
	public static final int NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS = 0x8;
	public static final int NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS = 0x9;
	public static final int NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK = 0x30000000;
	public static final int NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS = 0x0;
	public static final int NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS = 0x10000000;	/* divide source by 2 */
	public static final int NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS = 0x20000000;	/* divide source by 8 */
	public static final int NI_GPCT_INVERT_CLOCK_SRC_BIT = 0x80000000;
	

	public static final int CR_FLAGS_MASK	 = 0xfc000000;
	public static final int CR_ALT_FILTER	 = (1<<26);
	public static final int  CR_DITHER = CR_ALT_FILTER;
	public static final int  CR_DEGLITCH = CR_ALT_FILTER;
	public static final int  CR_ALT_SOURCE = (1<<27);
	public static final int  CR_EDGE = (1<<30);
	public static final int  CR_INVERT = (1<<31);

	public static class Range {
		public double min;
		public double max;
		public int unit;
	}
	

	public static class Cmd {
		public int subdev;
		public int flags;

		public  int start_src;
		public  int start_arg;

		public int scan_begin_src;
		public  int scan_begin_arg;

		public int convert_src;
		public int convert_arg;

		public  int scan_end_src;
		public  int scan_end_arg;

		public int stop_src;
		public int stop_arg;

		public int chanlist[]; 	/* channel/range list */
		public int chanlist_len;

		public short data[];			/* data list, size depends on subd flags */
		public int data_len;
		

		private String src(int src){
			StringBuffer str = new StringBuffer();
				
			if((src & ComediDef.TRIG_NONE) != 0) str.append("none");
			if((src & ComediDef.TRIG_NOW) != 0) str.append("now");
			if((src & ComediDef.TRIG_FOLLOW) != 0) str.append("follow");
			if((src & ComediDef.TRIG_TIME) != 0) str.append("time");
			if((src & ComediDef.TRIG_TIMER) != 0) str.append("timer");
			if((src & ComediDef.TRIG_COUNT) != 0) str.append("count");
			if((src & ComediDef.TRIG_EXT) != 0) str.append("ext");
			if((src & ComediDef.TRIG_INT) != 0) str.append("int");
			if((src & ComediDef.TRIG_OTHER) != 0) str.append("other");
		
			if(str.length() == 0)
				return "unknown(" + src + ")";
			
			return str.toString();
		}
			
		public void dump(){
			System.out.println(
					"  subdevice =\t" + subdev +
					"\n  start =\t" + src(start_src) + "\t" +  start_arg +
					"\n  scan_begin =\t" + src(scan_begin_src) + "\t" +  scan_begin_arg +
					"\n  convert =\t" + src(convert_src) + "\t" +  convert_arg +
					"\n  scan_end =\t" + src(scan_end_src) + "\t" +  scan_end_arg +
					"\n  stop =\t" + src(stop_src) + "\t" + stop_arg);
					
		}
	}

	public static final int CR_PACK(int chan, int rng, int aref){
		return ( (((aref)&0x3)<<24) | (((rng)&0xff)<<16) | (chan) );
	}
	
	public static final int CR_PACK_FLAGS(int chan, int range, int aref, int flags){
		return (CR_PACK(chan, range, aref) | ((flags) & CR_FLAGS_MASK));
		
	}
	
	public static String cmdtest_messages[] = {
		"success",
		"invalid source",
		"source conflict",
		"invalid argument",
		"argument conflict",
		"invalid chanlist",
	};
}
