#!/usr/bin/env ruby

require 'comedi'
require 'getoptlong'
require 'common'

include Comedi

cmdtest_messages = [ "success", "invalid source", "source conflict",
		    "invalid argument", "argument conflict",
		    "invalid chanlist" ]

class SWIG::TYPE_p_comedi_t_struct

    def prepare_cmd_lib(subdevice, freq, cmd)
	begin
	    cmd = get_cmd_generic_timed(subdevice, cmd, $n_chan,
		(1000000000.0 / freq).truncate)
	rescue ComediError
	    printf("comedi_get_cmd_generic_timed failed\n")
	    return cmd
	end

	cmd.chanlist = $chanlist
	cmd.chanlist_len = $n_chan

	cmd.scan_end_arg = $n_chan
	cmd.stop_arg = $n_scan if cmd.stop_src == TRIG_COUNT

	return cmd
    end

end

parse_options

begin
    dev = Comedi::open($filename)
rescue
    comedi_perror($filename)
    exit 1
end

$chanlist = Chanlist.new($n_chan)
0.upto($n_chan - 1) do |i|
    $chanlist[i] = cr_pack($channel + i, $range, $aref)
end

cmd = dev.prepare_cmd_lib($subdevice, $freq, Comedi_cmd_struct.new)

$stderr.printf("command before testing:\n")
dump_cmd($stderr, cmd)

begin
    ret, cmd = dev.command_test(cmd)
rescue
    comedi_perror("comedi_command_test")
    exit 1
end
$stderr.printf("first test returned %d (%s)\n", ret, cmdtest_messages[ret])
dump_cmd($stderr, cmd)

begin
    ret, cmd = dev.command_test(cmd)
rescue
    comedi_perror("comedi_command_test")
    exit 1
end
$stderr.printf("second test returned %d (%s)\n", ret, cmdtest_messages[ret])
dump_cmd($stderr, cmd)

tstart = Time.new
$stderr.printf("start time: %d.%06d\n", tstart.tv_sec, tstart.tv_usec)

begin
    ret = dev.command(cmd)
rescue
    comedi_perror("comedi_command")
    exit 1
end

while line = dev.ios.read(2 * $n_chan)
    data = line.unpack('S*')
    data.each do |d|
	printf("%d ", d)
    end
    puts
end

tend = Time.new
$stderr.printf("end time: %d.%06d\n", tend.tv_sec, tend.tv_usec)

tdiff = tend - tstart
$stderr.printf("time: %.6f\n", tdiff)
