QXRD  0.11.16
qxrdacquisitionextrainputschannel.cpp
Go to the documentation of this file.
3 #include "qcepmutexlocker.h"
5 #include "qcepsettingssaver.h"
6 
9  QcepObject(tr("extraChannel(%1)").arg(chnum), NULL),
10  m_ChannelNumber(QcepSettingsSaverPtr(), this, "channelNumber", chnum, "Extra Input Channel Number"),
11  m_Enabled(saver, this, "enabled", 1, "Enabled?"),
12  m_Plotted(saver, this, "plotted", 1, "Plotted?"),
13  m_ChannelName(saver, this, "channelName", "", "NIDAQ name of channel"),
14 // m_Kind(saver, this, "kind", 0, "Channel Kind (0 = none, 1 = Analog In, 2 = Counter In)"),
15  m_Mode(saver, this, "mode", 0, "Channel Mode (0 = summed, 1 = averaged, 2 = maximum, 3 = minimum)"),
16  m_SaveWave(saver, this, "saveWave", 0, "Save entire waveform (0 = no, 1 = yes)"),
17  m_Min(saver, this, "min", -10.0, "Minimum Input value for Analog Channel (in Volts)"),
18  m_Max(saver, this, "max", 10.0, "Maximum Input Value for Analog Channel (in Volts)"),
19  m_Start(saver, this, "start", 0.0, "Start Offset for Channel (in sec after notional exposure start)\n"
20  "i.e. Negative values mean times before start of exposure"),
21  m_End(saver, this, "end", 0.0, "End Offset for Channel (in sec before notional exposure end)\n"
22  "i.e. Negative values mean times after end of exposure"),
23  m_TriggerMode(saver, this, "triggerMode", 0, "Trigger Mode (0 = None, 1 = +Edge, 2 = -Edge, 3 = +Level, 4 = -Level)"),
24  m_TriggerLevel(saver, this, "triggerLevel", 0.0, "Trigger Level (in Volts)"),
25  m_TriggerHysteresis(saver, this, "triggerHysteresis", 0.0, "Trigger Hysteresis (in Volts)"),
26  m_PhysicalChannel(QcepSettingsSaverPtr(), this, "physicalChannel", 0, "Physical Channel Number"),
27  m_Value(QcepSettingsSaverWPtr(), this, "value", 0.0, "Current Value of Channel"),
28  m_Triggered(QcepSettingsSaverWPtr(), this, "triggered", 0, "Was channel triggered?"),
29  m_NLow(QcepSettingsSaverWPtr(), this, "nLow", 0, "Number of untriggered data points"),
30  m_NHigh(QcepSettingsSaverWPtr(), this, "nHigh", 0, "Number of triggered data points"),
31  m_Waveform(QcepSettingsSaverWPtr(), this, "waveform", QcepDoubleVector(), "Waveform on Channel"),
32  m_Experiment(doc),
33  m_ExtraInputs(xtra)
34 {
35  connect(prop_ChannelName(), &QcepStringProperty::valueChanged,
37 
38  connect(prop_Min(), &QcepDoubleProperty::valueChanged,
40 
41  connect(prop_Max(), &QcepDoubleProperty::valueChanged,
43 
44  connect(prop_Enabled(), &QcepBoolProperty::valueChanged,
46 }
47 
48 void QxrdAcquisitionExtraInputsChannel::readSettings(QSettings *settings, QString section)
49 {
50  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
51 
52  QcepObject::readSettings(settings, section);
53 }
54 
55 void QxrdAcquisitionExtraInputsChannel::writeSettings(QSettings *settings, QString section)
56 {
57  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
58 
59  QcepObject::writeSettings(settings, section);
60 }
61 
63 {
65 
66  if (xtra) {
67  QxrdNIDAQPluginInterfacePtr nidaq = xtra->nidaqPlugin();
68 
69  if (nidaq) {
70  return nidaq->readContinuousInputChannel(get_PhysicalChannel());
71  }
72  }
73 
74  return QVector<double>();
75 }
76 
78 {
79  int res = 0;
80 
82 
83  if (xtra) {
84  QxrdNIDAQPluginInterfacePtr nidaq = xtra->nidaqPlugin();
85 
86  if (nidaq) {
87  int nSamples = nidaq->countContinuousInput();
88  int startOffset = xtra->get_SampleRate()*(0.1 + get_Start());
89 
90  if (startOffset > nSamples) {
91  res = nSamples;
92  } else if (startOffset > 0) {
93  res = startOffset;
94  }
95  }
96  }
97 
98  return res;
99 }
100 
102 {
103  int res = 0;
104 
106 
107  if (xtra) {
108  QxrdNIDAQPluginInterfacePtr nidaq = xtra->nidaqPlugin();
109 
110  if (nidaq) {
111  int nSamples = nidaq->countContinuousInput();
112  int endOffset = xtra->get_SampleRate()*(0.1 + xtra->get_ExposureTime() - get_End());
113 
114  if (endOffset > nSamples) {
115  res = nSamples;
116  } else if (endOffset > 0) {
117  res = endOffset;
118  }
119  }
120  }
121 
122  return res;
123 }
124 
126 {
127  evaluateTrigger();
128 
129  int mode = get_Mode();
130 
131  switch (mode) {
132  case ModeSummed:
133  default:
134  return sumChannel();
135 
136  case ModeAveraged:
137  return averageChannel();
138 
139  case ModeMaximum:
140  return maximumChannel();
141 
142  case ModeMinimum:
143  return minimumChannel();
144  }
145 }
146 
148 {
149  QVector<double> res = readChannel();
150 
151  double sum=0;
152 
153  int i0 = startIndex();
154  int i1 = endIndex();
155 
156  for(int i=i0; i<i1; i++) {
157  sum += res[i];
158  }
159 
160  return sum;
161 }
162 
164 {
165  QVector<double> res = readChannel();
166 
167  double n=0;
168  double sum=0;
169 
170  int i0 = startIndex();
171  int i1 = endIndex();
172 
173  for(int i=i0; i<i1; i++) {
174  sum += res[i];
175  n += 1;
176  }
177 
178  return (n>0 ? sum/n : 0);
179 }
180 
182 {
183  QVector<double> res = readChannel();
184 
185  double max=0;
186 
187  int i0 = startIndex();
188  int i1 = endIndex();
189 
190  for(int i=i0; i<i1; i++) {
191  double v=res[i];
192 
193  if (i == i0) {
194  max = v;
195  } else {
196  if (v > max) {
197  max = v;
198  }
199  }
200  }
201 
202  return max;
203 }
204 
206 {
207  QVector<double> res = readChannel();
208 
209  double min=0;
210 
211  int i0 = startIndex();
212  int i1 = endIndex();
213 
214  for(int i=i0; i<i1; i++) {
215  double v=res[i];
216 
217  if (i == i0) {
218  min = v;
219  } else {
220  if (v < min) {
221  min = v;
222  }
223  }
224  }
225 
226  return min;
227 }
228 
230 {
231  int trigMode = get_TriggerMode();
232  bool res;
233 
234  switch (trigMode) {
235  case TriggerModeNone:
236  default:
237  res = false;
238  break;
239 
240  case TriggerModeEdgePos:
241  res = evalTrig(+1, true);
242  break;
243 
244  case TriggerModeEdgeNeg:
245  res = evalTrig(-1, true);
246  break;
247 
248  case TriggerModeLevelPos:
249  res = evalTrig(+1, false);
250  break;
251 
252  case TriggerModeLevelNeg:
253  res = evalTrig(-1, false);
254  break;
255  }
256 
257  set_Triggered(res);
258 
259  return res;
260 }
261 
262 bool QxrdAcquisitionExtraInputsChannel::evalTrig(int polarity, bool edgeTrig)
263 {
264  double level = get_TriggerLevel();
265  double hyst = get_TriggerHysteresis();
266  bool tres;
267 
268  QVector<double> res = readChannel();
269 
270  int nlow=0, nhigh=0;
271  double tlevel = level*polarity;
272  double lowlevel = tlevel-fabs(hyst);
273  double highlevel = tlevel+fabs(hyst);
274 
275  int i0 = startIndex();
276  int i1 = endIndex();
277 
278  for(int i=i0; i<i1; i++) {
279  double v=res[i]*polarity;
280 
281  if (v < lowlevel) nlow += 1;
282 
283  if (edgeTrig) {
284  if (nlow && (v > highlevel)) nhigh += 1;
285  } else {
286  if (v > highlevel) nhigh += 1;
287  }
288  }
289 
290  set_NLow(nlow);
291  set_NHigh(nhigh);
292 
293  if (edgeTrig) {
294  tres = ((nlow > 0) && (nhigh > 0));
295  } else {
296  tres = (nhigh > 0);
297  }
298 
299  return tres;
300 }
void writeSettings(QSettings *settings, QString section)
void valueChanged(QString val, int index)
virtual void readSettings(QSettings *set, QString section)
Definition: qcepobject.cpp:119
QxrdAcquisitionExtraInputsChannel(int chnum, QcepSettingsSaverWPtr saver, QxrdExperimentWPtr doc, QxrdAcquisitionExtraInputsWPtr xtra)
QWeakPointer< QxrdExperiment > QxrdExperimentWPtr
QVector< double > QcepDoubleVector
Definition: qcepmacros.h:19
QSharedPointer< QxrdAcquisitionExtraInputs > QxrdAcquisitionExtraInputsPtr
QWeakPointer< QxrdAcquisitionExtraInputs > QxrdAcquisitionExtraInputsWPtr
QSharedPointer< QcepSettingsSaver > QcepSettingsSaverPtr
QSharedPointer< QxrdNIDAQPluginInterface > QxrdNIDAQPluginInterfacePtr
virtual void writeSettings(QSettings *set, QString section)
Definition: qcepobject.cpp:114
void valueChanged(double val, int index)
void readSettings(QSettings *settings, QString section)
void valueChanged(bool val, int index)
QWeakPointer< QcepSettingsSaver > QcepSettingsSaverWPtr