Subversion Repositories f9daq

Rev

Rev 198 | Rev 201 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 198 Rev 200
1
#include <utility.h>
1
#include <utility.h>
2
#include <ansi_c.h>
2
#include <ansi_c.h>
3
#include <cvirte.h>             
3
#include <cvirte.h>             
4
#include <userint.h>
4
#include <userint.h>
5
#include "drs4.h"
5
#include "drs4.h"
6
#include "drsread.h" 
6
#include "drsread.h" 
7
 
7
 
8
static int daq_on;
8
static int daq_on;
9
static int ph, plothandle;
9
static int ph, plothandle[4];
10
static int tfID;
10
static int tfID;
11
static int controlID;
11
static int controlID;
12
 
12
 
13
#define MAX_THREADS 10   
13
#define MAX_THREADS 10   
14
 
14
 
15
static CmtThreadPoolHandle poolHandle = 0;  
15
static CmtThreadPoolHandle poolHandle = 0;  
16
 
16
 
17
int main (int argc, char *argv[]) {
17
int main (int argc, char *argv[]) {
18
  if (InitCVIRTE (0, argv, 0) == 0)
18
  if (InitCVIRTE (0, argv, 0) == 0)
19
    return -1;  /* out of memory */
19
    return -1;  /* out of memory */
20
  if ((ph = LoadPanel (0, "drs4.uir", PANEL)) < 0)
20
  if ((ph = LoadPanel (0, "drs4.uir", PANEL)) < 0)
21
    return -1;
21
    return -1;
22
  SetStdioPort (CVI_STDIO_WINDOW);
22
  SetStdioPort (CVI_STDIO_WINDOW);
23
  SetSleepPolicy(VAL_SLEEP_MORE);
23
  SetSleepPolicy(VAL_SLEEP_MORE);
24
  CmtNewThreadPool (MAX_THREADS,  &poolHandle);
24
  CmtNewThreadPool (MAX_THREADS,  &poolHandle);
25
 
25
 
26
  DisplayPanel (ph);
26
  DisplayPanel (ph);
27
  RunUserInterface ();
27
  RunUserInterface ();
28
  DiscardPanel (ph);
28
  DiscardPanel (ph);
29
   CmtDiscardThreadPool (poolHandle);
29
   CmtDiscardThreadPool (poolHandle);
30
  return 0;
30
  return 0;
31
}
31
}
32
 
32
 
33
 
33
 
34
 
34
 
35
 
35
 
36
 
36
 
37
static void start_timer (double tout) {
37
static void start_timer (double tout) {
38
  SetCtrlAttribute (ph, PANEL_TIMER, ATTR_INTERVAL, tout);
38
  SetCtrlAttribute (ph, PANEL_TIMER, ATTR_INTERVAL, tout);
39
  SetCtrlAttribute (ph, PANEL_TIMER, ATTR_ENABLED, 1);
39
  SetCtrlAttribute (ph, PANEL_TIMER, ATTR_ENABLED, 1);
40
}
40
}
41
 
41
 
42
static void stop_timer ( void ) {
42
static void stop_timer ( void ) {
43
  SetCtrlAttribute (ph, PANEL_TIMER, ATTR_ENABLED, 0);
43
  SetCtrlAttribute (ph, PANEL_TIMER, ATTR_ENABLED, 0);
44
   DRSSetTimeout();      
44
   DRSSetTimeout();      
45
}
45
}
46
 
46
 
47
 
47
 
48
 
48
 
49
 
49
 
50
void CVICALLBACK EndOfThread ( CmtThreadPoolHandle poolhandle,
50
void CVICALLBACK EndOfThread ( CmtThreadPoolHandle poolhandle,
51
                               CmtThreadFunctionID functionID, unsigned int event,
51
                               CmtThreadFunctionID functionID, unsigned int event,
52
                               int value, void *callbackData  ) {
52
                               int value, void *callbackData  ) {
53
 
53
 
54
  daq_on=0;
54
  daq_on=0;
55
  //SetDimming(0);
55
  //SetDimming(0);
56
  printf("End of Thread \n");
56
  printf("End of Thread \n");
57
  return ;
57
  return ;
58
 
58
 
59
}
59
}
60
 
60
 
61
   
61
   
62
int CVICALLBACK daq(void *functionData) {
62
int CVICALLBACK daq(void *functionData) {
63
 
63
 
64
 
64
 
65
  int neve;
65
  int neve;
66
  char filename[0xff];      
66
  char filename[0xff];      
67
  char smask[0xff];      
67
  char smask[0xff];      
68
  unsigned long mask;
68
  unsigned long mask;
69
  int frequency;
69
  int frequency;
70
  double trgdelay;  
70
  double trgdelay;  
71
  double trglevel;  
71
  double trglevel;  
72
  int trgtype;
72
  int trgtype;
73
  int trgchannel;
73
  int trgchannel;
74
  int trgpolarity;  
74
  int trgpolarity;  
75
  int verbose;  
75
  int verbose;  
76
  double range;
76
  double range;
77
 
77
 
78
 
78
 
79
  GetCtrlVal(ph, PANEL_FILENAME, filename );
79
  GetCtrlVal(ph, PANEL_FILENAME, filename );
80
  GetCtrlVal(ph, PANEL_MASK, smask );      
80
  GetCtrlVal(ph, PANEL_MASK, smask );      
81
  mask = strtoul (smask,NULL,0);
81
  mask = strtoul (smask,NULL,0);
82
  GetCtrlVal(ph,PANEL_NEVE, &neve);
82
  GetCtrlVal(ph,PANEL_NEVE, &neve);
83
 
83
 
84
  GetCtrlVal(ph,PANEL_FREQUENCY, &frequency);
84
  GetCtrlVal(ph,PANEL_FREQUENCY, &frequency);
85
  GetCtrlVal(ph,PANEL_TRGDELAY, &trgdelay);
85
  GetCtrlVal(ph,PANEL_TRGDELAY, &trgdelay);
86
  GetCtrlVal(ph,PANEL_TRGCHANNEL, &trgchannel);
86
  GetCtrlVal(ph,PANEL_TRGCHANNEL, &trgchannel);
87
  GetCtrlVal(ph,PANEL_TRGTYPE, &trgtype);
87
  GetCtrlVal(ph,PANEL_TRGTYPE, &trgtype);
88
  GetCtrlVal(ph,PANEL_TRGLEVEL, &trglevel);
88
  GetCtrlVal(ph,PANEL_TRGLEVEL, &trglevel);
89
  GetCtrlVal(ph,PANEL_TRGPOLARITY, &trgpolarity);
89
  GetCtrlVal(ph,PANEL_TRGPOLARITY, &trgpolarity);
90
  GetCtrlVal(ph,PANEL_RANGE, &range);
90
  GetCtrlVal(ph,PANEL_RANGE, &range);
91
  GetCtrlVal(ph,PANEL_DEBUG, &verbose);
91
  GetCtrlVal(ph,PANEL_DEBUG, &verbose);
92
 
92
 
93
  printf("mask=0x%x\n",mask);
93
  printf("mask=0x%x\n",mask);
94
   
94
   
95
  DRSSetMask( (unsigned char)( mask & 0xF ) );
95
  DRSSetMask( (unsigned char)( mask & 0xF ) );
96
 
96
 
97
  DRSSetFrequency( frequency  );
97
  DRSSetFrequency( frequency  );
98
  DRSSetTriggerPolarity(trgpolarity);
98
  DRSSetTriggerPolarity(trgpolarity);
99
  DRSSetTriggerLevel(trglevel);
99
  DRSSetTriggerLevel(trglevel);
100
  DRSSetRange (  range );
100
  DRSSetRange (  range );
101
  DRSSetTriggerType( trgtype );
101
  DRSSetTriggerType( trgtype );
102
  DRSSetTriggerChannel(trgchannel );
102
  DRSSetTriggerChannel(trgchannel );
103
         
103
         
104
  FILE *fp=fopen(filename,"wb");
104
  FILE *fp=fopen(filename,"wb");
105
 
105
 
106
 
106
 
107
  static unsigned char *buffer;
107
  static unsigned char *buffer;
108
 
108
 
109
  int buffer_size = 0;
109
  int buffer_size = 0;
110
const int nBoards=1;
110
const int nBoards=1;
111
const int waveDepth=1024;
111
const int waveDepth=1024;
112
if (buffer_size == 0) {
112
if (buffer_size == 0) {
113
         buffer_size =  4 +  nBoards * (4 + 4*(4+waveDepth*4));
113
         buffer_size =  4 +  nBoards * (4 + 4*(4+waveDepth*4));
114
         buffer_size += 24 + nBoards * (8 + 4*(4+waveDepth*2));
114
         buffer_size += 24 + nBoards * (8 + 4*(4+waveDepth*2));
115
         buffer = (unsigned char *)malloc(buffer_size);
115
         buffer = (unsigned char *)malloc(buffer_size);
116
}
116
}
117
   
117
   
118
time_t t,told, tstart;
118
time_t t,told, tstart;
119
 
119
 
120
if (!DRSInit()){
120
if (!DRSInit()){
121
  time(&tstart);
121
  time(&tstart);
122
  told=tstart;
122
  told=tstart;
123
  int i=0;
123
  int i=0;
124
  for (i=0; i<neve; i++) {
124
  for (i=0; i<neve; i++) {
125
    start_timer(1);// 1 s timeout  
125
    start_timer(1);// 1 s timeout  
126
    int retval = DRSRead(0);
126
    int retval = DRSRead(0);
127
    stop_timer();
127
    stop_timer();
128
    int nb =  ( retval == 0 && fp ) ? DRSToBuffer( buffer , i ) : 0;
128
    int nb =  ( retval == 0 && fp ) ? DRSToBuffer( buffer , i ) : 0;
129
    SetCtrlVal(ph,PANEL_CEVE,i);       
129
    SetCtrlVal(ph,PANEL_CEVE,i);       
130
        if (retval) i--;
130
        if (retval) i--;
131
    if (!daq_on) break;
131
    if (!daq_on) break;
132
    time(&t);
132
    time(&t);
133
    if (t!=told ) {
133
    if (t!=told ) {
134
                printf("%d events in %2.2f min (%d s) %s",i+1, (double)(t-tstart)/60.,(t-tstart), ctime(&t));
134
                  printf("%d events in %2.2f min (%d s) %s",i+1, (double)(t-tstart)/60.,(t-tstart), ctime(&t));
135
               
-
 
136
        }      
135
          }    
137
    told=t;
136
    told=t;
138
// Save data    
137
// Save data    
139
        if (nb>0 && fp) fwrite(buffer, 1,nb ,fp);
138
        if (nb>0 && fp) fwrite(buffer, 1,nb ,fp);
140
// Plot Data
139
// Plot Data
141
        for (int k=0;k<4;k++){
140
        for (int k=0;k<4;k++){
142
        if (! (mask & ( 0x1<<k ))  ) continue;
141
        if (! (mask & ( 0x1<<k ))  ) continue;
143
        float *t=DRSGetTime(k);
142
        float *t=DRSGetTime(k);
144
        float *x=DRSGetWave(k);        
143
        float *x=DRSGetWave(k);        
145
       
144
       
146
        if (!k){
145
        const int col[4]={VAL_BLACK,VAL_RED,VAL_GREEN,VAL_BLUE};
147
      if (plothandle)  DeleteGraphPlot (ph, PANEL_GRAPH, plothandle, VAL_DELAYED_DRAW);
146
        if (plothandle[k])  DeleteGraphPlot (ph, PANEL_GRAPH, plothandle[k], VAL_DELAYED_DRAW);
148
      plothandle = PlotXY (ph, PANEL_GRAPH, t, x, 1024, VAL_FLOAT, VAL_FLOAT, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1, VAL_BLUE);
147
        plothandle[k] = PlotXY (ph, PANEL_GRAPH, t, x, 1024, VAL_FLOAT, VAL_FLOAT, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1, col[k]);
149
        }  
148
         
150
       
-
 
151
       
-
 
152
            for (int i=0 ; i<1024 ; i++) {
149
              for (int i=0 ; i<1024 ; i++) {
153
           if (verbose) printf("[%d] %d. x= %3.2f  y=%3.2f\n", k, i, t[i], x[i] );
150
           if (verbose) printf("[%d] %d. x= %3.2f  y=%3.2f\n", k, i, t[i], x[i] );
154
           //h[k]->Fill( t[i], x[i]*1e-3);
151
           //h[k]->Fill( t[i], x[i]*1e-3);
155
        }
152
        }
156
        }
-
 
157
  }
153
  }
158
  time(&t);
154
  time(&t);
159
  printf("%d events in %2.2f min (%d s) %s",i+1, (double)(t-tstart)/60.,t-tstart, ctime(&t));
155
  printf("%d events in %2.2f min (%d s) %s",i+1, (double)(t-tstart)/60.,t-tstart, ctime(&t));
160
 
156
        }
161
  DRSEnd();
157
  DRSEnd();
162
}
158
}
163
 
159
 
164
if (fp) fclose(fp);
160
if (fp) fclose(fp);
165
 
161
 
166
free(buffer);
162
free(buffer);
167
 
163
 
168
  return 0;
164
  return 0;
169
 
165
 
170
}
166
}
171
 
167
 
172
int CVICALLBACK StartCB (int panel, int control, int event,
168
int CVICALLBACK StartCB (int panel, int control, int event,
173
                         void *callbackData, int eventData1, int eventData2) {
169
                         void *callbackData, int eventData1, int eventData2) {
174
  ThreadFunctionPtr mythread = NULL;  
170
  ThreadFunctionPtr mythread = NULL;  
175
  switch (event) {
171
  switch (event) {
176
     
172
     
177
    case EVENT_COMMIT:
173
    case EVENT_COMMIT:
178
     
174
     
179
      mythread = daq;
175
      mythread = daq;
180
      if (mythread!=NULL) {
176
      if (mythread!=NULL) {
181
      printf("New Thread panel=%d button=%d\n", panel, control);
177
      printf("New Thread panel=%d button=%d\n", panel, control);
182
     
178
     
183
     // SetDimming(1); 
179
     // SetDimming(1); 
184
      controlID= control;
180
      controlID= control;
185
      daq_on=1;
181
      daq_on=1;
186
        CmtScheduleThreadPoolFunctionAdv (poolHandle, mythread, &controlID,
182
        CmtScheduleThreadPoolFunctionAdv (poolHandle, mythread, &controlID,
187
                                        DEFAULT_THREAD_PRIORITY,
183
                                        DEFAULT_THREAD_PRIORITY,
188
                                        EndOfThread,
184
                                        EndOfThread,
189
                                        EVENT_TP_THREAD_FUNCTION_END,
185
                                        EVENT_TP_THREAD_FUNCTION_END,
190
                                        NULL, RUN_IN_SCHEDULED_THREAD,
186
                                        NULL, RUN_IN_SCHEDULED_THREAD,
191
                                        &tfID);
187
                                        &tfID);
192
    }
188
    }
193
      break;
189
      break;
194
  }
190
  }
195
  return 0;
191
  return 0;
196
}
192
}
197
 
193
 
198
int CVICALLBACK StopCB (int panel, int control, int event,
194
int CVICALLBACK StopCB (int panel, int control, int event,
199
                        void *callbackData, int eventData1, int eventData2) {
195
                        void *callbackData, int eventData1, int eventData2) {
200
  switch (event) {
196
  switch (event) {
201
    case EVENT_COMMIT:
197
    case EVENT_COMMIT:
202
      daq_on=0;        
198
      daq_on=0;        
203
      break;
199
      break;
204
  }
200
  }
205
  return 0;
201
  return 0;
206
}
202
}
207
 
203
 
208
int CVICALLBACK ExitCB (int panel, int control, int event,
204
int CVICALLBACK ExitCB (int panel, int control, int event,
209
                        void *callbackData, int eventData1, int eventData2) {
205
                        void *callbackData, int eventData1, int eventData2) {
210
  switch (event) {
206
  switch (event) {
211
    case EVENT_COMMIT:
207
    case EVENT_COMMIT:
212
      QuitUserInterface (0);
208
      QuitUserInterface (0);
213
      break;
209
      break;
214
  }
210
  }
215
  return 0;
211
  return 0;
216
}
212
}
217
 
213