/*
 * Copyright 1988, 1989, 1990, 1991 Massachusetts Institute of Technology
 */
#include "boa_III.h"
#include "structs.h"

int boa_III_reset(swtr)
     SWTR_ptr swtr;
{
  char cmd[10];
  int default_in;
  if (!swtr)
    return -1;
  if (swtr->fd < 0)
    return -1;
  if (swtr->default_input[1] != -1)
    default_in = swtr->default_input[1];
  else default_in = 1;
  sprintf(cmd, "~!%d",default_in);
  swtr->state[1].LeftSource = 
    swtr->state[1].RightSource = 
      swtr->state[1].VideoSource = default_in;
  ttyutil_write(swtr->fd, cmd, strlen(cmd), 10);
  return(0);
}
/*ARGSUSED*/
int boa_III_set_chan_src(swtr, chan, srcnum, output)
     SWTR_ptr swtr;
     int output;
     int chan;
     int srcnum;
{
  char cmd[10];
  
  if (!swtr || swtr->fd < 0) return -1;

  if (chan != ALL_CHAN) {
    if ((chan & VIDEO_CHAN) && (swtr->state[1].VideoSource == srcnum))
      chan &= (LEFT_CHAN | RIGHT_CHAN);
    if ((chan & LEFT_CHAN) && (swtr->state[1].LeftSource == srcnum))
      chan &= (VIDEO_CHAN | RIGHT_CHAN);
    if ((chan & RIGHT_CHAN) && (swtr->state[1].RightSource == srcnum))
      chan &= (VIDEO_CHAN | LEFT_CHAN);
  }

  /* 
   * RMS mod 1/10/91; if we make a change to the state
   * of the video channel, we should wait until we're sure
   * the switch has been made before returning; this could
   * cause video digitizers (for example) to get a bad frame
   * or a frame from the wrong video source.
   */

  if (srcnum < 1)
    srcnum = 1;
  else if (srcnum > NUM_INPUTS)
    srcnum = NUM_INPUTS;
  switch(chan) {
  case VIDEO_CHAN:
    sprintf(cmd, "~V%d", srcnum);
    ttyutil_write(swtr->fd, cmd, strlen(cmd), 10);
    if(swtr->state[1].VideoSource != srcnum)
      mpause(200);
    swtr->state[1].VideoSource = srcnum;
    break;
  case LEFT_CHAN:
    sprintf(cmd, "~L%d", srcnum);
    ttyutil_write(swtr->fd, cmd, strlen(cmd), 10);
    swtr->state[1].LeftSource = srcnum;
    break;
  case RIGHT_CHAN:
    sprintf(cmd, "~R%d", srcnum);
    ttyutil_write(swtr->fd, cmd, strlen(cmd), 10);
    swtr->state[1].RightSource = srcnum;
    break;
  case ALL_CHAN:
    sprintf(cmd, "~!%d",srcnum);
    ttyutil_write(swtr->fd, cmd, strlen(cmd), 10);
    if(swtr->state[1].VideoSource != srcnum)
      mpause(200);
    swtr->state[1].LeftSource = 
      swtr->state[1].RightSource = 
	swtr->state[1].VideoSource = srcnum;
    break;
  case AUDIO_CHAN:
    sprintf(cmd, "~A%d", srcnum);
    ttyutil_write(swtr->fd, cmd, strlen(cmd), 10);
    swtr->state[1].LeftSource = swtr->state[1].RightSource = srcnum;
    break;
  case (RIGHT_CHAN | VIDEO_CHAN):
    sprintf(cmd, "~R%d~V%d", srcnum, srcnum);
    ttyutil_write(swtr->fd, cmd, strlen(cmd), 10);
    if(swtr->state[1].VideoSource != srcnum)
      mpause(200);
    swtr->state[1].RightSource = swtr->state[1].VideoSource = srcnum;
    break;
  case (LEFT_CHAN | VIDEO_CHAN):
    sprintf(cmd, "~L%d~V%d", srcnum, srcnum);
    ttyutil_write(swtr->fd, cmd, strlen(cmd), 10);
    if(swtr->state[1].VideoSource != srcnum)
      mpause(200);
    swtr->state[1].LeftSource = swtr->state[1].VideoSource = srcnum;
    break;
  default:
    break;
  }
  return(0);
}
/*ARGSUSED*/
int boa_III_inquire(swtr, output, vsrc, lsrc, rsrc)
     SWTR_ptr swtr;
     int output, *vsrc, *lsrc, *rsrc;
{
  if (!swtr)
    return(-1);

  *vsrc = swtr->state[1].VideoSource;
  *lsrc = swtr->state[1].LeftSource;
  *rsrc = swtr->state[1].RightSource;
  return 0;
}


boa_III_setfuncs(swtr)
     SWTR_ptr swtr;
{
  swtr->reset = boa_III_reset;
  swtr->set_chan_src = boa_III_set_chan_src;
  swtr->inquire = boa_III_inquire;
  swtr->inputs = NUM_INPUTS;
  swtr->outputs = NUM_OUTPUTS;
  return;
}
		      
