#include <stdio.h>
#include <stdlib.h>
#include <spy.h>
#include <rockmfarm.h>
#include <farmbuffer.h>
#include <farmyboslocate.h>

#ifndef TRUE
#define TRUE  1
#define FALSE 0
#endif

char *circname = (char *) NULL;
int nrevents = 10;
char bank[] = "CALR";  /* DCHR  TRGR  QUAR */
int mask = 0x1f;

int spydump_opt (int n, char *argv[])
{
    int help = FALSE;
    register int i;

    for (i=1 ; i < n ; ++i)
        if (argv[i][0] == '-')
            switch (argv[i][1])
	    {
	        case 'c':
                    circname = argv[++i];
                    break;
	        case 'd':
                    strcpy (bank, argv[++i]);
                    if(strcmp(bank,"DCHR")==0) mask=0x7f; 
                    break;
	        case 'n':
		    nrevents = atoi(argv[++i]);
                    break;
	        case 'h':
                    help = TRUE;
                    break;
	        default:
                    break;
            }

    if (help)
    {
        printf ("\nUsage : spydump [options]\n\n\tOptions:\n"
                "\t  -c\t<circname> (default = /tmp/B_1_1)\n"
                "\t  -d\t<bank>     (default = CALR)\n"
                "\t  -n\t<nrevents> (default = 10)\n"
                "\t  -h\t           (help)\n");

        exit (0);
    }

    if (circname == (char *) NULL)
    {
        circname = malloc (strlen ("/tmp/B_1_1") + 1);
        strcpy (circname, "/tmp/B_1_1");
    }

    return TRUE;
}

int main(int argc, char *argv[])
{
  int err;
  char buf[100000];
  int buflen;
  int i;
  SPY_id spy_id;

  spydump_opt (argc, argv);

  if ((err=spy_open(circname,&spy_id))!=SPY_ERROR_OK)
    {
      puts("Error in opening spy.\n");
      return -1;
    }

  for (i=0; i<nrevents; i++)
    {
      buflen = 100000;
      err = spy_get(spy_id,buf,&buflen);

      if (err==SPY_ERROR_OK)
	{
	  int banklen;
          register int j;
	  int *bankptr;

	  farm_yboslocateinit_( (int *) buf);
	  farm_yboslocate_((int *) buf,bank,
			   &banklen,&bankptr);

	  printf("- %3i %3x ---------------  banklen: %i  -----------\n",
		 i,i,banklen);

	  for (j=0; j<banklen; j++)
	    {
	      rockm_farm farm;

	      rockm_farm_raw2farm(bankptr[j],farm);

	      printf("%3i: Chain: %i Crate: %i Slot: %i Chan: %i"
                     " Res: %i Data: %i\n",
		     j,farm.chain,farm.crate,farm.slot,
                     (farm.chan&mask),farm.res,farm.data);
	    }
	}
    }

  spy_close(spy_id);

  return 0;
}