/*******************************************************************************
 *	Comedi_test4.c		Simple COMEDI tests
 *				T.Barnaby,	Beam Ltd,	2006-02-02
 *******************************************************************************
 *
 *	This test program reads a large set (2048) samples from 4 channels.
 *	The DAQ hardware sets the sample rate and the sample sequence starts
 *	under program control.
 */ 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <comedilib.h>

#define	BUFSZ	256

char *cmd_src(int src,char *buf)
{
	buf[0]=0;

	if(src&TRIG_NONE)strcat(buf,"none|");
	if(src&TRIG_NOW)strcat(buf,"now|");
	if(src&TRIG_FOLLOW)strcat(buf, "follow|");
	if(src&TRIG_TIME)strcat(buf, "time|");
	if(src&TRIG_TIMER)strcat(buf, "timer|");
	if(src&TRIG_COUNT)strcat(buf, "count|");
	if(src&TRIG_EXT)strcat(buf, "ext|");
	if(src&TRIG_INT)strcat(buf, "int|");
#ifdef TRIG_OTHER
	if(src&TRIG_OTHER)strcat(buf, "other|");
#endif

	if(strlen(buf)==0){
		sprintf(buf,"unknown(0x%08x)",src);
	}else{
		buf[strlen(buf)-1]=0;
	}

	return buf;
}

void dump_cmd(FILE *out,comedi_cmd *cmd)
{
	char buf[100];

	fprintf(out,"start:      %-8s %d\n",
		cmd_src(cmd->start_src,buf),
		cmd->start_arg);

	fprintf(out,"scan_begin: %-8s %d\n",
		cmd_src(cmd->scan_begin_src,buf),
		cmd->scan_begin_arg);

	fprintf(out,"convert:    %-8s %d\n",
		cmd_src(cmd->convert_src,buf),
		cmd->convert_arg);

	fprintf(out,"scan_end:   %-8s %d\n",
		cmd_src(cmd->scan_end_src,buf),
		cmd->scan_end_arg);

	fprintf(out,"stop:       %-8s %d\n",
		cmd_src(cmd->stop_src,buf),
		cmd->stop_arg);
}

int main(int argc,char *argv[])
{
	comedi_t*	dev;
	lsampl_t	data = 0;
	unsigned int	chanList[24];

	double		dataf;
	int		ret;
	int		subdevice = 0;
	int		channel = 0;
	int		aref = AREF_GROUND;
	int		range = 0;
	comedi_cmd	cmd;
	int		i;
	sampl_t		buf[BUFSZ];
	int		subdev_flags;
	int		bytes_per_sample;
	
	dev = comedi_open("/dev/comedi0");
	if(!dev){
		fprintf(stderr,"cannot open %s\n", "/dev/comedi0");
		exit(0);
	}

	printf("Info:\n");
	printf("Version code: 0x%06x\n", comedi_get_version_code(dev));
	printf("Driver name: %s\n", comedi_get_driver_name(dev));
	printf("Board name: %s\n", comedi_get_board_name(dev));
	printf("Number of subdevices: %d\n", comedi_get_n_subdevices(dev));

	// Setup chan list
	for(i = 0; i < 4; i++){
		chanList[i] = CR_PACK(i, range, aref);
	}
	
	// Set up command
	memset(&cmd, 0, sizeof(cmd));
	ret = comedi_get_cmd_generic_timed(dev, subdevice, &cmd, int(1e9/100));
	if(ret<0){
		printf("comedi_get_cmd_generic_timed failed\n");
		return ret;
	}
	cmd.chanlist		= chanList;
	cmd.chanlist_len	= 4;
	cmd.scan_end_arg	= 4;

#ifndef ZAP
	cmd.stop_src = TRIG_COUNT;
	cmd.stop_arg = 2048;
#else
	cmd.stop_src		= TRIG_NONE;
#endif
		
	dump_cmd(stderr, &cmd);

	// Test command
	ret = comedi_command_test(dev, &cmd);
	if(ret < 0){
		comedi_perror("CmdTest1");
		exit(0);
	}
	ret = comedi_command_test(dev, &cmd);
	if(ret < 0){
		comedi_perror("CmdTest1");
		exit(0);
	}
	
	/* Start the command */
	ret = comedi_command(dev, &cmd);
	if(ret < 0){
		comedi_perror("comedi_command");
		exit(1);
	}
	subdev_flags = comedi_get_subdevice_flags(dev, subdevice);
	if(subdev_flags & SDF_LSAMPL)
		bytes_per_sample = sizeof(lsampl_t);
	else
		bytes_per_sample = sizeof(sampl_t);
	printf("SampleSize: %d\n", bytes_per_sample);

	while(1){
		ret = read(comedi_fileno(dev), buf, BUFSZ);
		printf("Read retuns: %d\n", ret);
		if(ret < 0){
			perror("read");
			exit(1);
		}
		if(ret == 0)
			break;
		for(i = 0; i < 4; i++){
			dataf = (5.0 * (buf[i] - 32768.0)) / 32768.0;
			printf("%x %f\n", data, dataf);
		}
	}

	return 0;
}
