package comediJNI;

import java.io.FileDescriptor;

import otherSupport.SettingsManager;

public class Comedi {
	static{
		System.load(SettingsManager.defaultGlobal().getPathProperty("comedi.jniLibPath", "/usr/lib/comediJNI.so"));
	}
	
	/** Object to syncronise against for using the library */
	public static String syncObj = "ComediSyncObj";
	
	public static native long open(String fn);
	public static native int close(long it);
	
	public static native String strerror(int errnum);
	public static native int errorno();
	
	public static native int[] data_read(long it, int subd, int chan, int range, int aref);
	
	public static native int set_global_oor_behavior(int behavior);
	
	public static native void get_range(long it, int subdevice, int chan, int range, ComediDef.Range ret);
	
	public static native int get_maxdata(long it, int subdevice, int chan);
	public static native int command_test(long it, ComediDef.Cmd cmd);
	public static native int cancel(long it, int subdevice);
	public static native int command(long it, ComediDef.Cmd cmd);
	public static native int get_subdevice_flags(long it, int subdevice);
	public static native int fileno(long it);
	
	public static native int internal_trigger(long dev, int subd, int trignum);
	public static native int find_subdevice_by_type(long it, int type, int subdev);	
	public static native int get_subdevice_type(long it, int subdev);
	
	public static native int dio_config(long it, int subdev, int chan, int dir);


	public static native int reset(long ite, int subdevice);
	public static native int arm(long it, int subdevice, int source);
	public static native int data_write(long it, int subd, int chan, int range, int aref, int data);
	public static native int set_counter_mode(long it, int subdevice, int channel, int mode_bits);
	public static native int set_gate_source(long it, int subdevice, int channel, int gate_index, int gate_source);
	public static native int set_clock_source(long it, int subdevice, int channel, int clock, int period_ns);
	

	public static native int get_buffer_size(long it, int subdevice);
	public static native int get_buffer_contents(long it, int subdev);

	/**
	 * Some knarly JNI foo curtesy of:
	 *    ['Sharing file descriptors between Java and Native code' http://www.kfu.com/~nsayer/Java/jni-filedesc.html]
	 *
	 * Creates a java file descriptor object with one that will read the
	 * comedi file descriptor given by comedi_fileno(). 
	 **/
	public static native FileDescriptor getFileDesc(long it);

	public static native int get_cmd_generic_timed(long dev, int subdevice, ComediDef.Cmd cmd, int chanlist_len, int scan_period_ns);

	public static native double to_phys(int data, ComediDef.Range rng, int maxdata);

	/** This is actually the standard c read, since Comedi gives us a file handle */
	public static native int read(long dev, byte[] buf, int bufsz);
	
}
