QXRD  0.11.16
qxrdsynchronizedacquisition.cpp
Go to the documentation of this file.
3 #include "qcepmutexlocker.h"
4 #include "qxrdacquisition.h"
5 #include "qwt_math.h"
6 #include "qcepsettingssaver.h"
8 
10  QcepObject("synchronization", NULL),
11  m_SyncAcquisitionMode(saver, this,"syncAcquisitionMode", 0, "Synchronized Acquisition Mode (0 = None, 1 = Stepped, 2 = Continuous)"),
12  m_SyncAcquisitionWaveform(saver, this,"syncAcquisitionWaveform", 0,
13  "Synchronized Acquisition Waveform (0 = Square, 1 = Sine, 2 = Triangle, 3 = Sawtooth, 4 = Bipolar Triangle)"),
14  m_SyncAcquisitionOutputDevice(saver, this,"syncAcquisitionOutputDevice", "", "Synchronized Acquisition Output Device"),
15  m_SyncAcquisitionOutputChannel(saver, this,"syncAcquisitionOutputChannel", "", "Synchronized Acquisition Output Channel"),
16 // m_SyncAcquisitionFlagChannel(saver, this,"syncAcquisitionFlagChannel", 0, "Synchronized Acquisition Flags"),
17  m_SyncAcquisitionMinimum(saver, this,"syncAcquisitionMinimum", 0.0, "Synchronized Acquisition Minimum (in Volts)"),
18  m_SyncAcquisitionMaximum(saver, this,"syncAcquisitionMaximum", 5.0, "Synchronized Acquisition Maximum (in Volts)"),
19  m_SyncAcquisitionSymmetry(saver, this,"syncAcquisitionSymmetry", 0.0, "Synchronized Acquisition Symmetry (0 = symmetric)"),
20  m_SyncAcquisitionPhaseShift(saver, this,"syncAcquisitionPhaseShift", 0.0, "Synchronized Acquisition Phase Shift (deg)"),
21  m_SyncAcquisitionManualValue(saver, this,"syncAcquisitionManualValue", 0.0, "Manual Output Voltage (in Volts)"),
22  m_Acquisition(acq),
23  m_SyncMode(0)
24 {
25 }
26 
28 {
29 #ifndef QT_NO_DEBUG
30  printf("Deleting synchronized acquisition\n");
31 #endif
32 }
33 
35 {
37 }
38 
40 {
41  return m_NIDAQPlugin;
42 }
43 
45 {
46  return m_AcquisitionParms;
47 }
48 
50 {
52  m_SyncMode = 0;
53 }
54 
56 {
57  m_SyncMode = 0;
58 }
59 
61 {
63 
64  QxrdAcquisitionParameterPackPtr parmsp(parms);
65 
66  if (parmsp) {
67  m_SyncMode = 0;
69 
70  double exposureTime = parmsp->exposure();
71  int nphases = parmsp->nphases();
72  double cycleTime = exposureTime*nphases;
73  double sampleRate = 1000;
74  double nSamples = cycleTime*sampleRate;
75  double minVal = get_SyncAcquisitionMinimum();
76  double maxVal = get_SyncAcquisitionMaximum();
77  QString chan = get_SyncAcquisitionOutputChannel();
78  int wfm = get_SyncAcquisitionWaveform();
79  m_SyncMode = get_SyncAcquisitionMode();
80  double symm = get_SyncAcquisitionSymmetry();
81  double phase = get_SyncAcquisitionPhaseShift();
82 
83  if (symm > 1.0) {
84  symm = 1.0;
85  } else if (symm < -1.0) {
86  symm = -1.0;
87  }
88 
89  if (nphases <= 0) {
90  m_SyncMode = 0;
91  } else if (m_SyncMode) {
92 
93  while (nSamples > 10000) {
94  sampleRate /= 10;
95  nSamples = cycleTime*sampleRate;
96  }
97 
98  int iSamples = (int) nSamples;
99  double divide = iSamples * (0.5 + symm/2.0);
100  double divideBy2 = divide/2;
101  int shift = (int)((double) phase*iSamples/360.0 + nphases) % iSamples;
102 
103  QVector<double> outputTimes(iSamples+1);
104  QVector<double> outputVoltage(iSamples+1);
105 
106  for (int i=0; i<=iSamples; i++) {
107  outputTimes[i] = ((double)i)/((double) sampleRate);
108  }
109 
110  switch (wfm) {
112  for (int ii=0; ii<iSamples; ii++) {
113  int i = (ii+iSamples-shift) % iSamples;
114  if (i<divide) {
115  outputVoltage[ii] = minVal;
116  } else {
117  outputVoltage[ii] = maxVal;
118  }
119  }
120  break;
121 
123  for (int ii=0; ii<iSamples; ii++) {
124  int i = (ii+iSamples-shift) % iSamples;
125  double x;
126  if (i<divide) {
127  x = M_PI*i/divide;
128  } else {
129  x = M_PI+M_PI*(i-divide)/(iSamples-divide);
130  }
131  outputVoltage[ii] = minVal + (maxVal-minVal)*(1.0 - cos(x))/2.0;
132  }
133  break;
134 
136  for (int ii=0; ii<iSamples; ii++) {
137  int i = (ii+iSamples-shift) % iSamples;
138  if (i<divide) {
139  outputVoltage[ii] = minVal + i*(maxVal-minVal)/divide;
140  } else {
141  outputVoltage[ii] = maxVal - (i-divide)*(maxVal-minVal)/(iSamples-divide);
142  }
143  }
144  break;
145 
147  for (int ii=0; ii<iSamples; ii++) {
148  int i = (ii+iSamples-shift) % iSamples;
149  if (i < divideBy2) {
150  outputVoltage[ii] = minVal + i*(maxVal-minVal)/divideBy2;
151  } else if (i < (iSamples-divideBy2)) {
152  outputVoltage[ii] = maxVal - (i-divideBy2)*(maxVal-minVal)/((iSamples-divide)/2);
153  } else {
154  outputVoltage[ii] = minVal - (iSamples-i)*(maxVal-minVal)/divideBy2;
155  }
156  }
157  break;
158 
160  default:
161  for (int ii=0; ii<iSamples; ii++) {
162  int i = (ii+iSamples-shift) % iSamples;
163  outputVoltage[ii] = minVal + i*(maxVal-minVal)/iSamples;
164  }
165  break;
166  }
167 
168  outputVoltage[iSamples] = outputVoltage[0]; // Return output voltage to starting value at the end of the waveform
169 
171 
172  if (nidaq) {
173  nidaq->setAnalogWaveform(chan, sampleRate, outputVoltage.data(), iSamples+1);
174  }
175 
176  {
177  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
178 
181  }
182  }
183  }
184 }
185 
186 //static QTime tick;
187 
189 {
191 
192  if (nidaq) {
193  nidaq->pulseOutput();
194  }
195 
198 
199  if (m_SyncMode && acq && parms) {
200  if (acq->acquisitionStatus(0.0) == 0) {
201 // printf("QxrdSynchronizedAcquisition::acquiredFrameAvailable(%d)\n", frameNumber);
202 
203  int skipBefore = parms->skipBefore();
204  int skipBetween = parms->skipBetween();
205  int nPhases = parms->nphases();
206  int nSummed = parms->nsummed();
207  int nGroups = parms->postTrigger();
208  int perGroup = nPhases*nSummed+skipBetween;
209  int inGroup = (frameNumber-skipBefore) % perGroup;
210  int phase = inGroup % nPhases;
211 
212  if (nPhases > 0) {
213  if ((frameNumber >= skipBefore) && (frameNumber < (nGroups*perGroup-skipBetween+skipBefore))) {
214  if (inGroup < nPhases*nSummed) {
215  if (phase == 0) {
216  if (nidaq) {
217 // printf("Triggered on frame %d\n", frameNumber);
218  nidaq->triggerAnalogWaveform();
219  }
220  }
221  }
222  }
223  }
224 // printf("elapsed[%d] %d msec\n", currentPhase, tick.restart());
225  }
226  }
227 }
228 
230 {
233 
234  if (acq && nidaq) {
235  QString fullChannel = get_SyncAcquisitionOutputChannel();
236 
237  acq->printMessage(tr("Manually Setting %1 to %2 V")
238  .arg(fullChannel)
239  .arg(get_SyncAcquisitionManualValue()));
240 
241  nidaq->setAnalogOutput(fullChannel, get_SyncAcquisitionManualValue());
242  }
243 }
244 
246 {
250 
251  if (acq && nidaq && parms) {
252  prepareForAcquisition(parms);
253  nidaq->triggerAnalogWaveform();
254  }
255 }
256 
258 {
259  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
260 
261  return m_OutputTimes;
262 }
263 
265 {
266  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
267 
268  return m_OutputVoltage;
269 }
QWeakPointer< QxrdNIDAQPluginInterface > QxrdNIDAQPluginInterfaceWPtr
QxrdNIDAQPluginInterfaceWPtr m_NIDAQPlugin
QSharedPointer< QxrdAcquisition > QxrdAcquisitionPtr
QxrdSynchronizedAcquisition(QcepSettingsSaverWPtr saver, QxrdAcquisitionWPtr acq)
QxrdNIDAQPluginInterfaceWPtr nidaqPlugin() const
QxrdAcquisitionParameterPackWPtr m_AcquisitionParms
QWeakPointer< QxrdDarkAcquisitionParameterPack > QxrdDarkAcquisitionParameterPackWPtr
void prepareForDarkAcquisition(QxrdDarkAcquisitionParameterPackWPtr parms)
void setNIDAQPlugin(QxrdNIDAQPluginInterfaceWPtr nidaqPlugin)
QSharedPointer< QxrdNIDAQPluginInterface > QxrdNIDAQPluginInterfacePtr
QxrdAcquisitionParameterPackWPtr parms()
void prepareForAcquisition(QxrdAcquisitionParameterPackWPtr parms)
QWeakPointer< QxrdAcquisition > QxrdAcquisitionWPtr
QWeakPointer< QxrdAcquisitionParameterPack > QxrdAcquisitionParameterPackWPtr
QSharedPointer< QxrdAcquisitionParameterPack > QxrdAcquisitionParameterPackPtr
QWeakPointer< QcepSettingsSaver > QcepSettingsSaverWPtr