AlcapDAQ  1
Functions
X742DecodeRoutines.c File Reference

Go to the source code of this file.

Functions

static int32_t getNumberOfBits (uint8_t byte)
 
static int V1742UnpackEventGroup (uint32_t group, uint32_t *datain, CAEN_DGTZ_X742_GROUP_t *dataout)
 
int32_t GetNumEvents (char *buffer, uint32_t buffsize, uint32_t *numEvents)
 
int32_t GetEventPtr (char *buffer, uint32_t buffsize, int32_t numEvent, char **EventPtr)
 
int32_t X742_DecodeEvent (char *evtPtr, void **Evt)
 

Function Documentation

int32_t GetEventPtr ( char *  buffer,
uint32_t  buffsize,
int32_t  numEvent,
char **  EventPtr 
)

Definition at line 117 of file X742DecodeRoutines.c.

References EVENT_HEADER_SIZE, and i.

117  {
118  uint32_t i = 0;
119  int32_t counter = -1;
120  int ret;
121  int evtSize;
122 
123  if ((buffer == NULL) || (buffsize < EVENT_HEADER_SIZE)) return -1;
124  do {
125  counter++;
126  evtSize = *(long *)(buffer+i) & 0x0FFFFFFF;
127  if (counter == numEvent) {
128  if ((i + (uint32_t) evtSize) < buffsize) {
129  *EventPtr =(buffer+i);
130  return 0;
131  }
132  else return -1;
133  }
134  i += (uint32_t) (evtSize *4);
135  } while ((i + EVENT_HEADER_SIZE) < buffsize);
136  return -1;
137 }
static int32_t getNumberOfBits ( uint8_t  byte)
static

Definition at line 2 of file X742DecodeRoutines.c.

References count, and i.

2  {
3  uint32_t i,count;
4  count = 0;
5  for (i=0;i<8;i++) {
6  if ((byte >> i) & 0x1) count++;
7  }
8  return count;
9 }
int32_t GetNumEvents ( char *  buffer,
uint32_t  buffsize,
uint32_t *  numEvents 
)

Definition at line 99 of file X742DecodeRoutines.c.

References EVENT_HEADER_SIZE, and i.

99  {
100  uint32_t i = 0,evtSize;
101  int ret;
102  int32_t counter = -1;
103  if ((buffsize == 0) || (buffer == NULL)){
104  *numEvents = 0;
105  return 0;
106  }
107  if (buffsize < EVENT_HEADER_SIZE) return -1;
108  do {
109  counter++;
110  evtSize = *(long *)(buffer+i) & 0x0FFFFFFF;
111  i += (uint32_t) (evtSize * 4);
112  } while ((i + EVENT_HEADER_SIZE) < buffsize);
113  *numEvents = counter + 1;
114  return 0;
115 }
static int V1742UnpackEventGroup ( uint32_t  group,
uint32_t *  datain,
CAEN_DGTZ_X742_GROUP_t dataout 
)
static

Definition at line 11 of file X742DecodeRoutines.c.

References CAEN_DGTZ_DRS4_1GHz, CAEN_DGTZ_DRS4_2_5GHz, CAEN_DGTZ_X742_GROUP_t::ChSize, CAEN_DGTZ_X742_GROUP_t::DataChannel, for(), i, samples, CAEN_DGTZ_X742_GROUP_t::StartIndexCell, and CAEN_DGTZ_X742_GROUP_t::TriggerTimeTag.

Referenced by X742_DecodeEvent().

11  {
12 
13  int i, j,rpnt = 0, wpnt = 0, size1, size2,trg = 0,k;
14  long samples;
15  float Time[1024],t0;
16  float Tsamp;
17  float vcorr;
18  uint16_t st_ind=0;
19  uint32_t freq;
20  float wave_tmp[1024];
21 
22  freq = (datain[0] >> 16 ) & 0x3;
23  switch(freq) {
25  Tsamp =(float)((1.0/2500.0)*1000.0);
26  break;
28  Tsamp =(float)((1.0/1000.0)*1000.0);
29  break;
30  default:
31  Tsamp =(float)((1.0/5000.0)*1000.0);
32  break;
33  }
34 
35  st_ind =(uint16_t)((datain[0]>>20)& 0x3FF);
36  size1 = datain[0]& 0xFFF;
37  if ((trg = (datain[0]>>12)& 0x1) == 1)
38  size2 =(datain[0]>>3)& 0x1FF;
39  else
40  size2=0;
41 
42  dataout->TriggerTimeTag =datain[size1+size2+1] & 0x3FFFFFFF;
43 
44  samples = ((long) (size1 /3));
45 
46  while (rpnt < size1) {
47 
48  switch (rpnt % 3) {
49  case 0 :
50  dataout->DataChannel[0][wpnt] = (float) (datain[rpnt+1] & 0x00000FFF); /* S0[11:0] - CH0 */
51  dataout->DataChannel[1][wpnt] = (float) ((datain[rpnt+1] & 0x00FFF000) >> 12); /* S0[11:0] - CH1 */
52  dataout->DataChannel[2][wpnt] = (float) ((datain[rpnt+1] & 0xFF000000) >> 24); /* S0[ 7:0] - CH2 */
53  break;
54  case 1 :
55  dataout->DataChannel[2][wpnt] += (float) ((datain[rpnt+1] & 0x0000000F) << 8);
56  dataout->DataChannel[3][wpnt] = (float) ((datain[rpnt+1] & 0x0000FFF0) >> 4); /* S0[11:0] - CH3 */
57  dataout->DataChannel[4][wpnt] = (float) ((datain[rpnt+1] & 0x0FFF0000) >> 16); /* S0[11:0] - CH4 */
58  dataout->DataChannel[5][wpnt] = (float) ((datain[rpnt+1] & 0xF0000000) >> 28); /* S0[3:0] - CH5 */
59  break;
60  case 2 :
61  dataout->DataChannel[5][wpnt] += (float) ((datain[rpnt+1] & 0x000000FF) << 4);
62  dataout->DataChannel[6][wpnt] = (float) ((datain[rpnt+1] & 0x000FFF00) >> 8) ; /* S0[11:0] - CH6 */
63  dataout->DataChannel[7][wpnt] = (float) ((datain[rpnt+1] & 0xFFF00000) >> 20); /* S0[11:0] - CH7 */
64  wpnt++;
65  break;
66  }
67  rpnt++;
68  }
69  rpnt++;
70  for (k=0;k<8;k++) dataout->ChSize[k] = wpnt;
71  wpnt=0;
72 
73  for (i=0; i < size2; i++) {
74  switch (i % 3) {
75  case 0 :
76  dataout->DataChannel[8][wpnt] = (float) ( datain[rpnt+i] & 0x00000FFF); /* S0 - CH8 */
77  dataout->DataChannel[8][++wpnt] = (float) ((datain[rpnt+i] & 0x00FFF000) >> 12) ; /* S1 - CH8 */
78  dataout->DataChannel[8][++wpnt] = (float) ((datain[rpnt+i] & 0xFF000000) >> 24); /* S2[ 7:0] - CH8 */
79  break;
80  case 1 :
81  dataout->DataChannel[8][wpnt] += (float) ((datain[rpnt+i] & 0x0000000F) << 8);
82  dataout->DataChannel[8][++wpnt] = (float) ((datain[rpnt+i] & 0x0000FFF0) >> 4); /* S3 - CH8*/
83  dataout->DataChannel[8][++wpnt] = (float) ((datain[rpnt+i] & 0x0FFF0000) >> 16); /* S4 - CH8 */
84  dataout->DataChannel[8][++wpnt] = (float) ((datain[rpnt+i] & 0xF0000000) >> 28); /* S5[3:0] - CH8 */
85  break;
86  case 2 :
87  dataout->DataChannel[8][wpnt] += (float) ((datain[rpnt+i] & 0x000000FF) << 4); /* S5[11:4] - CH8 */
88  dataout->DataChannel[8][++wpnt] = (float) ((datain[rpnt+i] & 0x000FFF00) >> 8); /* S6[11:0] - CH8 */
89  dataout->DataChannel[8][++wpnt] = (float) ((datain[rpnt+i] & 0xFFF00000) >> 20); /* S7[11:0] - CH8 */
90  wpnt++;
91  break;
92  }
93  }
94  dataout->ChSize[8] = wpnt;
95  dataout->StartIndexCell = (uint16_t)st_ind;
96  return (size1+size2+2);
97 }
int32_t X742_DecodeEvent ( char *  evtPtr,
void **  Evt 
)

Definition at line 139 of file X742DecodeRoutines.c.

References CAEN_DGTZ_X742_GROUP_t::DataChannel, CAEN_DGTZ_X742_EVENT_t::DataGroup, EVENT_HEADER_SIZE, CAEN_DGTZ_X742_EVENT_t::GrPresent, h, MAX_X742_CHANNEL_SIZE, size, V1742UnpackEventGroup(), X742_FIXED_SIZE, and X742_MAX_GROUPS.

139  {
140  CAEN_DGTZ_X742_EVENT_t *Event;
141  uint32_t *buffer;
142  char chanMask;
143  uint32_t j,g,size;
144  uint32_t *pbuffer;
145  uint32_t eventSize;
146  int evtSize,h;
147 
148  evtSize = *(long *)evtPtr & 0x0FFFFFFF;
149  chanMask = *(long *)(evtPtr+4) & 0x0000000F;
150  evtPtr += EVENT_HEADER_SIZE;
151  buffer = (uint32_t *) evtPtr;
152  pbuffer = (uint32_t *) evtPtr;
153  eventSize = (evtSize * 4) - EVENT_HEADER_SIZE;
154  if (eventSize == 0) return -1;
155  Event = (CAEN_DGTZ_X742_EVENT_t *) malloc(sizeof(CAEN_DGTZ_X742_EVENT_t));
156  if (Event == NULL) return -1;
157  memset( Event, 0, sizeof(CAEN_DGTZ_X742_EVENT_t));
158  for (g=0; g<X742_MAX_GROUPS; g++) {
159  if ((chanMask >> g) & 0x1) {
160  for (j=0; j<MAX_X742_CHANNEL_SIZE; j++) {
161  Event->DataGroup[g].DataChannel[j]= malloc(X742_FIXED_SIZE * sizeof (float));
162  if (Event->DataGroup[g].DataChannel[j] == NULL) {
163  for (h=j-1;h>-1;h++) free(Event->DataGroup[g].DataChannel[h]);
164  return -1;
165  }
166  }
167  size=V1742UnpackEventGroup(g,pbuffer,&(Event->DataGroup[g]));
168  pbuffer+=size;
169  Event->GrPresent[g] = 1;
170  }
171  else {
172  Event->GrPresent[g] = 0;
173  for (j=0; j<MAX_X742_CHANNEL_SIZE; j++) {
174  Event->DataGroup[g].DataChannel[j] = NULL;
175  }
176  }
177  }
178  *Evt = Event;
179  return 0;
180 }