
#include <stdio.h>

#include "videoserver.h"
#include "video_conf.h"

static RPD_ptr		rpd;
static VCONF_DEVTABLE	vdt;

main(argc,argv)

	int	argc;
	char	*argv[];
{
	int	i, rpd_index;
	int	reqtype;
	int	reqp1, reqp2, reqp3, reqp4;
	int	repcode, repval, reperr;
	char	line[256];
	char	cmd[32];
	int	res;
	char *	name;

	if( argc != 2 )
	{
		fprintf(stderr,"usage: %s <device-name>>\n",
			argv[0]);
		printf("-1 -1 -1\n");	/* let user know we died */
		fflush(stdout);
		exit(1);
	}

	name = argv[1];
	
	/* the following gets the ENTIRE video.conf table; this
	   is okay, because we are guaranteed not to have name clashes */

	if( vconf_get_table( "", VCONF_FILENAME, &vdt ) != VCONF_AOK )
	{
		printf("-1 -1 -1\n");	/* let user know we died */
		fflush(stdout);
		exit(1);
	}

	vconf_mkupper( name );

	rpd_index = -1;	
	for( i=0; i<vdt.ndevs; i++ )
	{
		vconf_mkupper( vdt.dev[i].name );

		if( !strcmp(vdt.dev[i].name,name) )
		{
			rpd_index = i;
			break;
		}
	}

	if( rpd_index < 0 )
	{
		fprintf(stderr,"unable to find rpd device '%s'\n",name);
		printf("-1 -1 -1\n");	/* let user know we died */
		fflush(stdout);
		exit(1);
	}

	if( (rpd = rpdutil_open( &vdt, rpd_index )) == NULL )
	{
		fprintf(stderr,"unable to open rpd %s on %s\n",
			name, vdt.dev[rpd_index].tty );
		printf("-1 -1 -1\n");	/* let user know we died */
		fflush(stdout);
		exit(1);
	}
	
	printf("0 0 0\n");	/* let user know we're ready */
	fflush(stdout);
	
	while(!feof(stdin))
	{
		fgets(line,255,stdin);

		reqp1 = reqp2 = reqp3 = reqp4 = 0;
		repcode = repval = reperr = 0;
		sscanf(line,"%d %d %d %d %d\n",&reqtype,&reqp1,&reqp2,&reqp3,&reqp4);


		switch( reqtype )
		{
		case	VIDSERVE_RESET:
			if( (*rpd->reset)(rpd) < 0 )
			{
				fprintf(stderr,"%s: error in reset\n",rpd->devname);
				repcode = VIDSERVE_REQ_FAILURE;;
			}
			break;
		case	VIDSERVE_CMD:
			if( (*rpd->cmd)(rpd,reqp1) < 0 )
			{
				fprintf(stderr,"%s: error in cmd\n",rpd->devname);
				repcode = VIDSERVE_REQ_FAILURE;
			}
			break;
		case	VIDSERVE_SEARCH:
			if( (*rpd->search)(rpd,reqp1,reqp2) < 0 )
			{
				fprintf(stderr,"%s: error in search\n",rpd->devname);
				repcode = VIDSERVE_REQ_FAILURE;
			}
			break;
		case	VIDSERVE_SEGPLAY:
			if( (*rpd->segplay)(rpd,reqp1,reqp2,reqp3) < 0 )
			{
				fprintf(stderr,"%s: error in segplay\n",rpd->devname);
				repcode = VIDSERVE_REQ_FAILURE;
			}
			mpause(20);
			break;
		case	VIDSERVE_GETFRAME:
			if( (res = (*rpd->getframe)(rpd)) < 0 )
			{
				fprintf(stderr,"%s: error in getframe\n",rpd->devname);
				repcode = VIDSERVE_REQ_FAILURE;
			}
			else
				repval = res;
			break;
		case	VIDSERVE_VARSPEED:
			if( (*rpd->varspeed)(rpd,reqp1) < 0 )
			{
				fprintf(stderr,"%s: error in varspeed\n",rpd->devname);
				repcode = VIDSERVE_REQ_FAILURE;
			}
			break;
		case	VIDSERVE_JOG:
			if( (*rpd->jog)(rpd,reqp1) < 0 )
			{
				fprintf(stderr,"%s: error in jog\n",rpd->devname);
				repcode = VIDSERVE_REQ_FAILURE;
			}
			break;
		case	VIDSERVE_RECORD:
			fprintf(stderr,"%s: unable to record\n",rpd->devname);
			repcode = VIDSERVE_REQ_FAILURE;
			break;
		default:
			repcode = VIDSERVE_REQ_FAILURE;
			reperr = -1;
			fprintf(stderr,"%s: unknown request id #%d\n",
				rpd->devname,reqtype);
			break;
		}
		
		printf("%d %d %d\n",repcode,repval,reperr);
		fflush(stdout);
	}
	
}


