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