import otherSupport.SettingsManager;
import comedi.ComediOptions;
import comediJNI.Comedi;
import comediJNI.ComediDef;
import comediJNI.ComediJNIException;
import comediJNI.ComediDef.Range;

	/*
	 * A very small one-shot input demo
	 * Part of Comedilib
	 *
	 * Copyright (c) 1999,2000 David A. Schleef <ds@schleef.org>
	 *
	 * This file may be freely modified, distributed, and combined with
	 * other software, as long as proper attribution is given in the
	 * source code.
	 */
	/*
	   A little input demo
	 */

public class inp {
	static { new SettingsManager("minerva", true); 	}

	public static void main(String[] args) {
	
		int data;
		long dev;
		ComediDef.Range range_info;
		int maxdata;
		double physical_value;
		ComediOptions options = new ComediOptions();
		options.fileName = "/dev/comedi0_subd0";
		options.subdevice = 0;
		options.channel = 1;
		options.physical = true;
		options.verbose = true;
		options.value = 0;

		//init_parsed_options(&options);
		//parse_options(&options, argc, argv);

		dev = Comedi.open(options.fileName);
		if(dev == 0)
			throw new ComediJNIException("open");
		

		if(options.verbose){
			System.out.println("measuring device="+options.fileName+" subdevice="+options.subdevice+" channel="+options.channel+
					" range="+options.range+" analog reference="+options.aref);
		}

		int retArr[] = Comedi.data_read(dev, options.subdevice, options.channel, options.range, options.aref);		
		data = retArr[1];
		if(retArr[0] <  0)
			throw new ComediJNIException("data_read");
		

		if(options.physical) {
			Comedi.set_global_oor_behavior(ComediDef.COMEDI_OOR_NAN);
			range_info = new ComediDef.Range(); 
			Comedi.get_range(dev, options.subdevice, options.channel, options.range, range_info);
			maxdata = Comedi.get_maxdata(dev, options.subdevice, options.channel);
			if(options.verbose) {
				System.out.println("[0,"+maxdata+"] -> ["+range_info.min+","+range_info.max+"]");
			}
			
			physical_value = Comedi.to_phys(data, range_info, maxdata);
			if(Double.isNaN(physical_value)) {
				System.out.println("Out of range ["+range_info.min+", "+range_info.max+"]");
				
			} else {
				System.out.print(physical_value);
				switch(range_info.unit) {
					case ComediDef.UNIT_volt: System.out.print(" V"); break;
					case ComediDef.UNIT_mA: System.out.print(" mA"); break;
					case ComediDef.UNIT_none: break;
					default: System.out.print(" (unknown unit "+range_info.unit+")");
				}
				if(options.verbose) {
					System.out.print(" ("+data+" raw units)");
				}
			}
		} else {
			System.out.print(data);
		}
		System.out.println();
		
	}

}
