Subversion Repositories f9daq

Rev

Rev 229 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
219 f9daq 1
//==============================================================================
2
//
3
// Title:   RedPitaya.c
4
// Purpose:   A short description of the implementation.
5
//
6
// Created on:  27. 01. 2017 at 13:29:33 by Samo Korpar.
7
// Copyright: . All Rights Reserved.
8
//
9
//==============================================================================
10
 
11
//==============================================================================
12
// Include files
13
 
14
//#include "RedPitaya.h"
15
#include "RedPitaya_ui.h"
16
#include <userint.h>
17
#include <ansi_c.h>
18
#include <utility.h>
19
#include <visa.h>
20
#include <cvirte.h>
21
 
22
//==============================================================================
23
// Constants
24
 
25
#define MAX_THREADS 10
26
#define NSAMPLES 2048
27
#define NBEFORE 80
28
#define NGROUP 32
29
#define MAXSAMPLES 16384
30
#define MINTRGDELAY -8192
31
#define MAXTDCCH 0x80
32
 
33
//==============================================================================
34
// Types
35
 
36
//==============================================================================
37
// Static global variables
38
 
39
static int daq_on = 0;
40
static int ntics;
41
static int poolHandle = 0;
42
static int p1h, pID, rID, tfID;
43
static int ph_tdc, ph_wf;
44
static int dtdc[MAXTDCCH];
45
static int debugOut = 0;
222 f9daq 46
static time_t t0;
219 f9daq 47
static ViStatus istat;
48
static ViSession RedPHandle,RMHandle;
49
 
50
//==============================================================================
51
// Static functions
52
 
222 f9daq 53
static int update_plots (void) {
219 f9daq 54
  if (ph_tdc>0) DeleteGraphPlot (p1h, P1_TDC_G, ph_tdc, VAL_DELAYED_DRAW);
55
  ph_tdc = PlotY (p1h, P1_TDC_G, &dtdc[0], MAXTDCCH, VAL_INTEGER,
56
                  VAL_VERTICAL_BAR, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
57
  return (0);
58
}
59
 
222 f9daq 60
 
61
 
62
static int export_data (void) {
63
  char filename[0xFF],rootcmd[0xFF];
64
  int type=0;
65
  int neve;
66
  GetCtrlVal(p1h,P1_FILENAME_EN,filename);
67
  GetCtrlVal(p1h,P1_FILETYPE,&type);
68
  unsigned int hdr[10];
69
  time_t t;
70
  hdr[0] = 0x1;
71
  hdr[1] = sizeof(int) * MAXTDCCH;
72
  hdr[2] = t0;
73
  GetCtrlVal (p1h, P1_CEVE_N, &neve);
74
  hdr[3] = neve;
75
  hdr[4] = (unsigned int)( time(&t)-t0);
76
  FILE *fp;
77
  switch (type) {
78
    case 0:
79
    case 1:
80
      fp  =fopen(filename,"wb");
81
      if (fp) {
82
        fwrite(hdr,sizeof(unsigned int),5,fp);
83
        fwrite(dtdc,sizeof(int),MAXTDCCH,fp);
84
        fclose(fp);
85
        if (type) {
86
          sprintf(rootcmd ,"root.exe plottdc.cxx(\\\"%s\\\")", filename);
87
          LaunchExecutable(rootcmd);
88
 
89
        }
90
      }
91
      break;
92
    case 2:
93
      fp=fopen(filename,"w");
94
      if (fp) {
95
        for (int i=0; i<MAXTDCCH; i++) fprintf(fp,"%d\n", dtdc[i]);
96
        fclose(fp);
97
      }
98
      break;
99
 
100
  }
101
 
102
 
103
  return (0);
104
}
105
static int CVICALLBACK daq_run(void *functionData) {
106
  int trgdly,neve,ieve,ndata;
219 f9daq 107
  float data[10000];
108
  char datac[100000];
109
  char *ctoken_p;
110
  char response[80];
222 f9daq 111
  time_t t;
112
  response[0] = 0;
113
  t0 = time(&t);
114
  if (RedPHandle) {
115
    istat = viPrintf (RedPHandle, "ACQ:RST\r\n");
116
    istat = viPrintf (RedPHandle, "ACQ:AVG OFF\r\n");
117
    istat = viPrintf (RedPHandle, "ACQ:DEC 1\r\n");
118
    istat = viPrintf (RedPHandle, "ACQ:TRIG:LEV -0.03\r\n");
119
    trgdly = MINTRGDELAY + NSAMPLES - NBEFORE + 1;
120
    istat = viPrintf (RedPHandle, "ACQ:TRIG:DLY %0d\r\n", trgdly);
121
    istat = viPrintf (RedPHandle, "ACQ:START\r\n");
122
    Delay(0.01);
123
    istat = viPrintf (RedPHandle, "ACQ:TRIG CH1_NE\r\n");
219 f9daq 124
//  istat = viPrintf (RedPHandle, "ACQ:TRIG NOW\r\n");
222 f9daq 125
  }
126
  GetCtrlVal (p1h, P1_NEVE_N, &neve);
219 f9daq 127
  ieve=0;
128
  do {
129
    while (VI_TRUE) {
222 f9daq 130
      if (RedPHandle) istat = viQueryf (RedPHandle, "ACQ:TRIG:STAT?\r\n", "%s",response);
219 f9daq 131
      if (response[0]=='T') break;
132
      if (!daq_on) break;
133
    }
134
    if (!daq_on) break;
222 f9daq 135
    if (RedPHandle) {
136
      istat = viQueryf (RedPHandle, "ACQ:SOUR1:DATA:LAT:N? %0d\r\n", "%s", NSAMPLES, datac);
137
      istat = viPrintf (RedPHandle, "ACQ:START\r\n");
138
      Delay(0.001);
139
      istat = viPrintf (RedPHandle, "ACQ:TRIG CH1_NE\r\n");
219 f9daq 140
//    istat = viPrintf (RedPHandle, "ACQ:TRIG NOW\r\n");
141
//    Delay(0.01);
222 f9daq 142
    }
219 f9daq 143
    ndata=0;
144
    ctoken_p = strtok (datac, "{,}\r");
145
    while (ctoken_p) {
146
      sscanf(ctoken_p,"%f",&data[ndata]);
147
      if ((ndata)&&(data[ndata]<-0.015)&&(data[ndata-1]>=-0.015)) dtdc[ndata/NGROUP]++;
148
      ctoken_p = strtok (NULL, "{,}\r");
149
      ndata++;
150
    }
151
    ph_wf = PlotY (p1h, P1_WF_G, data, ndata, VAL_FLOAT, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1, VAL_BLUE);
222 f9daq 152
    SetCtrlVal (p1h, P1_CEVE_N, ++ieve);
219 f9daq 153
    if (debugOut) {
154
      sprintf(response,"%d, %d",ieve,ndata);
155
      istat = InsertTextBoxLine (p1h, P1_IO_TB, -1, response);
156
      debugOut=0;
157
    }
158
  } while (ieve<neve);
222 f9daq 159
  daq_on=0;
160
  SetCtrlVal (p1h, P1_DAQ_S, daq_on);
161
  SetCtrlVal (p1h, P1_CEVE_N, ieve);
162
  return 0;
219 f9daq 163
}
222 f9daq 164
 
219 f9daq 165
//==============================================================================
166
// Global variables
167
 
168
//==============================================================================
169
// Global functions
170
 
171
/// HIFN  What does your function do?
172
/// HIPAR x/What inputs does your function expect?
173
/// HIRET What does your function return?
174
 
175
int CVICALLBACK cb_timer (int panel, int control, int event, void *callbackData,
222 f9daq 176
                          int eventData1, int eventData2) {
219 f9daq 177
  QueueUserEvent (9000, p1h, P1_TIMER_T);
178
  return (0);
179
}
180
 
181
int CVICALLBACK debug_pressed (int panel, int control, int event,
182
                               void *callbackData, int eventData1, int eventData2) {
183
  switch (event) {
184
    case EVENT_COMMIT:
185
      debugOut=1;
186
      break;
187
  }
188
  return 0;
189
}
190
 
191
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
192
                       LPSTR lpszCmdLine, int nCmdShow) {
193
  int i,refon,dummy;
194
  char response[80];
222 f9daq 195
 
219 f9daq 196
  if (InitCVIRTE (hInstance, 0, 0) == 0)
197
    return -1;    /* out of memory */
198
 
199
  SetSleepPolicy(VAL_SLEEP_MORE);
200
  CmtNewThreadPool (MAX_THREADS, &poolHandle);
201
 
202
  SetStdioWindowOptions (1000, 0, 0);
203
  SetStdioWindowSize (150, 600);
204
  SetStdioWindowPosition (825, 20);
205
 
206
  istat = viOpenDefaultRM (&RMHandle);
229 f9daq 207
  if (RMHandle) istat = viOpen (RMHandle, "TCPIP0::178.172.43.91::5000::SOCKET", VI_NULL, VI_NULL, &RedPHandle);
222 f9daq 208
  if (RedPHandle){
219 f9daq 209
  istat = viSetAttribute (RedPHandle, VI_ATTR_TCPIP_KEEPALIVE, VI_TRUE);
210
  istat = viSetAttribute (RedPHandle, VI_ATTR_TCPIP_NODELAY, VI_TRUE);
211
  istat = viSetAttribute (RedPHandle, VI_ATTR_TERMCHAR, '\n');
212
  istat = viSetAttribute (RedPHandle, VI_ATTR_TERMCHAR_EN, VI_TRUE);
213
  istat = viSetAttribute (RedPHandle, VI_ATTR_TMO_VALUE, 1000);
222 f9daq 214
  }
219 f9daq 215
  if ((p1h = LoadPanel (0, "RedPitaya_ui.uir", P1)) < 0) return -1;
216
  DisplayPanel (p1h);
217
  istat = SetCtrlAttribute (p1h, P1_WF_G, ATTR_DATA_MODE, VAL_DISCARD);
218
 
222 f9daq 219
  if (RedPHandle) istat = viQueryf (RedPHandle, "*IDN?\r\n", "%s",response);
220
  else sprintf(response,"Connection to RedPitaya is missing");
219 f9daq 221
  istat = InsertTextBoxLine (p1h, P1_IO_TB, -1,response);
222
  istat = ProcessDrawEvents ();
223
 
224
  QueueUserEvent (1000, p1h, P1_RESET_PB);
225
 
226
  do {
227
    GetUserEvent (1, &pID, &rID);
228
    switch (rID) {
229
      case P1_TIMER_T:
230
        ntics+=1;
231
        GetCtrlVal (p1h, P1_REFON_CB, &refon);
232
        if (refon) update_plots();
233
        break;
234
      case P1_REFRESH_PB:
235
        update_plots();
236
        break;
237
      case P1_DAQ_S:
238
        GetCtrlVal (p1h, P1_DAQ_S, &daq_on);
239
        if (daq_on) {
240
          CmtScheduleThreadPoolFunction (poolHandle, daq_run, (void *)&dummy, &tfID);
222 f9daq 241
        } else {
219 f9daq 242
          CmtWaitForThreadPoolFunctionCompletion (poolHandle, tfID,
243
                                                  OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
244
          CmtReleaseThreadPoolFunctionID (poolHandle, tfID);
245
        }
246
        break;
247
      case P1_RESET_PB:
248
        for (i=0; i<MAXTDCCH; i++) {
249
          dtdc[i]=0;
250
        }
251
        update_plots();
252
      case P1_CLEAR_PB:
253
        DeleteGraphPlot (p1h, P1_WF_G, -1, VAL_IMMEDIATE_DRAW);
254
        break;
222 f9daq 255
 
256
      case P1_EXPORT_PB:
257
        export_data();
258
        break;
219 f9daq 259
      case P1_TDCLOG_S:
260
        GetCtrlVal (p1h, P1_TDCLOG_S, &istat);
261
        SetCtrlAttribute (p1h, P1_TDC_G, ATTR_YMAP_MODE, istat);
262
        update_plots();
263
        break;
264
      default:
265
        Delay(1.);
266
    }
222 f9daq 267
  } while ((rID != P1_EXIT_PB)||daq_on);
219 f9daq 268
 
269
  CmtDiscardThreadPool (poolHandle);
270
  DiscardPanel (p1h);
271
 
222 f9daq 272
  if (RedPHandle) istat = viClose (RedPHandle);
273
  if (RMHandle) istat = viClose (RMHandle);
219 f9daq 274
 
275
  return 0;
276
}
277