Rev 5 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5 | f9daq | 1 | #include <stdio.h> |
2 | #include <vector> |
||
3 | #include "VmUsbStack.h" |
||
4 | |||
5 | VmUsbStack::VmUsbStack(){ |
||
6 | fStack.push_back(0x1); |
||
7 | fStack.push_back(0x0); |
||
8 | } |
||
9 | |||
10 | VmUsbStack::~VmUsbStack(){ |
||
11 | fStack.clear(); |
||
12 | } |
||
13 | |||
14 | int VmUsbStack::Get(int maxn, int *stack){ |
||
15 | for (int i=0;i<fStack.size();i++){ |
||
16 | if (i<maxn) stack[i]=fStack[i]; else return -1; |
||
17 | } |
||
18 | return fStack[0]; |
||
19 | } |
||
20 | |||
21 | |||
22 | void VmUsbStack::Append(int cmd, int addr ){ |
||
23 | fStack.push_back(cmd & 0xFFFF); |
||
24 | fStack.push_back(cmd >> 16); |
||
25 | fStack.push_back(addr&0xFFFF); |
||
26 | fStack.push_back((addr >> 16)& 0xFFFF); |
||
27 | fStack[0]=fStack.size()-1; |
||
28 | } |
||
29 | |||
30 | void VmUsbStack::Append(int cmd, int addr , int data){ |
||
31 | Append( cmd, addr ); |
||
32 | fStack.push_back(data&0xFFFF); |
||
33 | fStack.push_back((data >> 16)&0xFFFF); |
||
34 | fStack[0] = fStack.size()-1; |
||
35 | } |
||
36 | |||
37 | void VmUsbStack::ReadA24D16(int addr ){ |
||
38 | Append(CMD_READ | CMD_A24 , CMD_D16 | addr); |
||
39 | } |
||
40 | |||
41 | void VmUsbStack::WriteA24D16(int addr, int data){ |
||
42 | return Append(CMD_WRITE | CMD_A24,CMD_D16 | addr, data); |
||
43 | } |
||
44 | |||
45 | void VmUsbStack::ReadA24D32(int addr ){ |
||
46 | Append(CMD_READ | CMD_A24 , CMD_D32 | addr); |
||
47 | } |
||
48 | |||
49 | void VmUsbStack::WriteA24D32(int addr, int data){ |
||
50 | return Append(CMD_WRITE | CMD_A24 , CMD_D32 | addr, data); |
||
51 | } |
||
52 | |||
53 | void VmUsbStack::ReadA32D16(int addr ){ |
||
54 | Append(CMD_READ | CMD_A32 , CMD_D16| addr); |
||
55 | } |
||
56 | |||
57 | void VmUsbStack::WriteA32D16(int addr, int data){ |
||
58 | return Append(CMD_WRITE | CMD_A32 , CMD_D16 | addr, data); |
||
59 | } |
||
60 | |||
61 | void VmUsbStack::ReadA32D32(int addr ){ |
||
62 | Append(CMD_READ | CMD_A32 , CMD_D32 | addr); |
||
63 | } |
||
64 | |||
65 | void VmUsbStack::WriteA32D32(int addr, int data){ |
||
66 | return Append(CMD_WRITE | CMD_A32 , CMD_D32| addr, data); |
||
67 | } |
||
68 | |||
69 | |||
70 | void VmUsbStack::Marker(int marker){ |
||
71 | return Append(CMD_MRK, marker); |
||
72 | } |
||
73 | |||
74 | void VmUsbStack::ConditionalRead(int adr_mod,int d16d32, int addr, int bmask){ |
||
75 | Append(CMD_READ| CMD_HD | adr_mod ,addr); |
||
76 | Append(CMD_READ| CMD_HD | CMD_HM |adr_mod, d16d32 |addr,bmask); |
||
77 | } |
||
78 | |||
79 | void VmUsbStack::RepeatRead(int adr_mod,int d16d32, int baseaddr, int n, int increment){ |
||
80 | for (int i=0;i<n;i++) Append( adr_mod | CMD_READ, d16d32 +baseaddr + i*increment); |
||
81 | } |
||
82 | void VmUsbStack::RepeatWrite(int adr_mod,int d16d32,int baseaddr, int n, int increment, int data){ |
||
83 | for (int i=0;i<n;i++) Append( adr_mod | CMD_WRITE,d16d32 + baseaddr+i*increment, data); |
||
84 | } |
||
85 | |||
86 | void VmUsbStack::Print(){ |
||
87 | for (int i=0; i < fStack.size();i++) printf("0x%04x\n",fStack[i]); |
||
88 | printf("%d %d __________________________________\n",fStack.size(),fStack[0]); |
||
89 | } |
||
90 | |||
91 | #ifdef MAIN |
||
92 | #include "CAENV965_DEF.h" |
||
93 | #define CAEN_V965 0x340000 |
||
94 | |||
95 | int main(){ |
||
96 | // INIT stackdata |
||
97 | int geo=1,fPedestal=255; |
||
98 | VmUsbStack *init=new VmUsbStack(); |
||
99 | init->Write(CAEN_V965 + CAENV965_CRN, 0x0); |
||
100 | init->Write(CAEN_V965 + CAENV965_GEO, geo); |
||
101 | init->RepeatWrite( CAEN_V965 + CAENV965_THM, 32, 0x02,0x0); // threshold/kill for 32 channels, 2*i addr increment |
||
102 | init->Write( CAEN_V965 + CAENV965_BS1, 0x80 ); // soft reset |
||
103 | init->Write( CAEN_V965 + CAENV965_BC1, 0x80 ); // soft reset |
||
104 | init->Write( CAEN_V965 + CAENV965_PED, fPedestal ); // pedestal |
||
105 | init->Write(CAEN_V965 + CAENV965_BS2,0x5000); |
||
106 | init->Write(CAEN_V965 + CAENV965_BS2,0x4); // clear module |
||
107 | init->Write(CAEN_V965 + CAENV965_BC2,0x4); |
||
108 | init->Print(); |
||
109 | |||
110 | // READOUT stackdata |
||
111 | VmUsbStack *stack=new VmUsbStack(); |
||
112 | stack->Write(CAEN_V965 + CAENV965_BS2,0x4); // clear module |
||
113 | stack->Write(CAEN_V965 + CAENV965_BC2,0x4); |
||
114 | stack->ConditionalRead(CAEN_V965 + CAENV965_SR1,0x1); // TRG wait : loop until bit 0 is on |
||
115 | stack->ConditionalRead(CAEN_V965 + CAENV965_OB ,0x4000000) ; // loop until bit 26 is on, read data |
||
116 | stack->Marker(0xFAFB); |
||
117 | stack->Print(); |
||
118 | |||
119 | int st[1000]; |
||
120 | int nb= stack->Get(1000,st); |
||
121 | for (int i=0;i<nb;i++) if (st[i]!=stack->fStack[i]) printf("error i=%d 0x%04x 0x%04x \n",i,st[i],stack->fStack[i] ); |
||
122 | return 0; |
||
123 | } |
||
124 | #endif |