#include <stdio.h>
 
#include "VmUsbStack_cvi.h"
 
 
 
#define MAXSTACKSIZE 1000
 
long fStack[MAXSTACKSIZE];
 
 
 
 
 
void VmUsbStackInit(){
 
        fStack[0]=1;
 
        fStack[1]=0;
 
}
 
 
 
void VmUsbStackClear(){
 
        VmUsbStackInit();
 
}
 
 
 
int VmUsbStackGet(int maxn, int *stack){
 
  int i;
 
  for (i=0;i< fStack[0]+1;i++){
 
                        if (i<maxn) stack[i]=fStack[i]; else return -1;
 
  }
 
  return fStack[0];
 
}
 
 
 
 
 
void VmUsbStackAppend(int cmd, int addr ){
 
  int i= fStack[0]+1;
 
  fStack[i]   = (cmd & 0xFFFF);
 
  fStack[i+1] = (cmd >> 16);
 
  fStack[i+2] = addr&0xFFFF;
 
  fStack[i+3] = (addr >> 16)& 0xFFFF;
 
  fStack[0]+=4;
 
}
 
 
 
void VmUsbStackAppendData(int cmd, int addr , int data){
 
  int i=0;
 
  VmUsbStackAppend( cmd, addr );
 
  i = fStack[0]+1;
 
  fStack[i]  =  data & 0xFFFF;
 
  fStack[i+1] = (data >> 16)&0xFFFF;
 
  fStack[0]+=2;
 
}
 
 
 
void VmUsbStackConditionalRead(int adr_mod,int d16d32, int addr, int bmask){
 
        VmUsbStackAppend(CMD_READ| CMD_HD | adr_mod ,addr);
 
        VmUsbStackAppendData(CMD_READ| CMD_HD | CMD_HM |adr_mod, d16d32 |addr,bmask);
 
}
 
 
 
void VmUsbStackMultiRead(int adr_mod,int d16d32, int baseaddr, int n, int increment){
 
        int i;
 
        for (i=0;i<n;i++) VmUsbStackAppend( adr_mod | CMD_READ, d16d32 +baseaddr + i*increment);
 
}
 
void VmUsbStackMultiWrite(int adr_mod,int d16d32,int baseaddr, int n, int increment, int data){
 
        int i;
 
        for (i=0;i<n;i++)  VmUsbStackAppendData( adr_mod | CMD_WRITE,d16d32 + baseaddr+i*increment, data);
 
}
 
 
 
void VmUsbStackPrint(){
 
   int i;
 
   for (i
=0; i 
< fStack
[0]+1;i
++) printf("0x%04x\n",fStack
[i
]);  
   printf("size of stack %d __________________________________\n",fStack
[0]+1);  
}
 
 
 
#ifdef MAIN
 
#include "CAENV965_DEF.h"
 
#include <utility.h> 
 
#define CAEN_V965    0x340000
 
 
 
int main(){
 
 
 
int st[1000]; 
 
int nb, i;
 
// INIT stackdata
 
int geo=1,fPedestal=255;
 
VmUsbStackInit();
 
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_CRN, 0x0);
 
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_GEO, geo);
 
VmUsbStackMultiWrite( CMD_A24, CMD_D32, CAEN_V965 + CAENV965_THM, 32, 0x02,0x0); // threshold/kill for 32 channels, 2*i addr increment
 
VmUsbStackWriteA24D32( CAEN_V965 + CAENV965_BS1, 0x80 ); // soft reset
 
VmUsbStackWriteA24D32( CAEN_V965 + CAENV965_BC1, 0x80 ); // soft reset
 
VmUsbStackWriteA24D32( CAEN_V965 + CAENV965_PED, fPedestal ); // pedestal
 
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BS2,0x5000); 
 
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BS2,0x4);  // clear module
 
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BC2,0x4);
 
VmUsbStackPrint(); 
 
 
 
// READOUT stackdata
 
VmUsbStackInit();
 
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BS2,0x4);  // clear module
 
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BC2,0x4);  
 
VmUsbStackConditionalRead(CMD_A24, CMD_D32,CAEN_V965 + CAENV965_SR1,0x1);        // TRG wait : loop until bit 0 is on
 
VmUsbStackConditionalRead(CMD_A24, CMD_D32,CAEN_V965 + CAENV965_OB ,0x4000000) ; // loop until bit 26 is on, read data 
 
VmUsbStackMarker(0xFAFB); 
 
VmUsbStackPrint();
 
 
 
 
 
 nb= VmUsbStackGet(1000,st);
 
 for (i
=0;i
<nb
;i
++) if (st
[i
]!=fStack
[i
]) printf("error i=%d 0x%04x 0x%04x \n",i
,st
[i
],fStack
[i
] );  
Delay(10);
 
 return 0;
 
}
 
#endif