networkanalyzer.cpp
1 /***************************************************************************
2  Copyright (C) 2002-2015 Kentaro Kitagawa
3  kitagawa@phys.s.u-tokyo.ac.jp
4 
5  This program is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License as published by the Free Software Foundation; either
8  version 2 of the License, or (at your option) any later version.
9 
10  You should have received a copy of the GNU Library General
11  Public License and a list of authors along with this program;
12  see the files COPYING and AUTHORS.
13 ***************************************************************************/
14 #include "networkanalyzer.h"
15 #include "ui_networkanalyzerform.h"
16 #include "xwavengraph.h"
17 #include "graph.h"
18 #include "graphwidget.h"
19 
20 #include "interface.h"
21 #include "analyzer.h"
22 #include "xnodeconnector.h"
23 
24 XNetworkAnalyzer::XNetworkAnalyzer(const char *name, bool runtime,
25  Transaction &tr_meas, const shared_ptr<XMeasure> &meas) :
26  XPrimaryDriverWithThread(name, runtime, ref(tr_meas), meas),
27  m_marker1X(create<XScalarEntry>("Marker1X", false,
28  dynamic_pointer_cast<XDriver>(shared_from_this()))),
29  m_marker1Y(create<XScalarEntry>("Marker1Y", false,
30  dynamic_pointer_cast<XDriver>(shared_from_this()))),
31  m_marker2X(create<XScalarEntry>("Marker2X", false,
32  dynamic_pointer_cast<XDriver>(shared_from_this()))),
33  m_marker2Y(create<XScalarEntry>("Marker2Y", false,
34  dynamic_pointer_cast<XDriver>(shared_from_this()))),
35  m_startFreq(create<XDoubleNode>("StartFreq", false)),
36  m_stopFreq(create<XDoubleNode>("StopFreq", false)),
37  m_points(create<XComboNode>("Points", false, true)),
38  m_average(create<XUIntNode>("Average", false)),
39  m_calOpen(create<XTouchableNode>("CalOpen", true)),
40  m_calShort(create<XTouchableNode>("CalShort", true)),
41  m_calTerm(create<XTouchableNode>("CalTerm", true)),
42  m_calThru(create<XTouchableNode>("CalThru", true)),
43  m_form(new FrmNetworkAnalyzer),
44  m_waveForm(create<XWaveNGraph>("WaveForm", false,
45  m_form->m_graphwidget, m_form->m_edDump, m_form->m_tbDump, m_form->m_btnDump)) {
46 
47  meas->scalarEntries()->insert(tr_meas, m_marker1X);
48  meas->scalarEntries()->insert(tr_meas, m_marker1Y);
49  meas->scalarEntries()->insert(tr_meas, m_marker2X);
50  meas->scalarEntries()->insert(tr_meas, m_marker2Y);
51 
52  startFreq()->setUIEnabled(false);
53  stopFreq()->setUIEnabled(false);
54  points()->setUIEnabled(false);
55  average()->setUIEnabled(false);
56  calOpen()->setUIEnabled(false);
57  calShort()->setUIEnabled(false);
58  calTerm()->setUIEnabled(false);
59  calThru()->setUIEnabled(false);
60 
61  m_conUIs = {
62  xqcon_create<XQLineEditConnector>(startFreq(), m_form->m_edStart),
63  xqcon_create<XQLineEditConnector>(stopFreq(), m_form->m_edStop),
64  xqcon_create<XQComboBoxConnector>(points(), m_form->m_cmbPoints, Snapshot( *points())),
65  xqcon_create<XQLineEditConnector>(average(), m_form->m_edAverage),
66  xqcon_create<XQButtonConnector>(m_calOpen, m_form->m_btnCalOpen),
67  xqcon_create<XQButtonConnector>(m_calShort, m_form->m_btnCalShort),
68  xqcon_create<XQButtonConnector>(m_calTerm, m_form->m_btnCalTerm),
69  xqcon_create<XQButtonConnector>(m_calThru, m_form->m_btnCalThru)
70  };
71 
72  m_waveForm->iterate_commit([=](Transaction &tr){
73  const char *labels[] = {"Freq [MHz]", "Level [dB]", "Phase [deg.]"};
74  tr[ *m_waveForm].setColCount(3, labels);
75  tr[ *m_waveForm].insertPlot(labels[1], 0, 1);
76  tr[ *m_waveForm].insertPlot(labels[2], 0, -1, 2);
77 
78  m_graph = m_waveForm->graph();
79  tr[ *m_graph->backGround()] = QColor(0x0A, 0x05, 0x34).rgb();
80  tr[ *m_graph->titleColor()] = clWhite;
81  shared_ptr<XAxis> axisx = tr[ *m_waveForm].axisx();
82  shared_ptr<XAxis> axisy = tr[ *m_waveForm].axisy();
83  shared_ptr<XAxis> axisy2 = tr[ *m_waveForm].axisy2();
84  tr[ *axisx->ticColor()] = clWhite;
85  tr[ *axisx->labelColor()] = clWhite;
86  tr[ *axisx->ticLabelColor()] = clWhite;
87  tr[ *axisy->ticColor()] = clWhite;
88  tr[ *axisy->labelColor()] = clWhite;
89  tr[ *axisy->ticLabelColor()] = clWhite;
90  tr[ *axisy->autoScale()] = false;
91  tr[ *axisy->maxValue()] = 13.0;
92  tr[ *axisy->minValue()] = -70.0;
93  tr[ *axisy2->ticColor()] = clWhite;
94  tr[ *axisy2->labelColor()] = clWhite;
95  tr[ *axisy2->ticLabelColor()] = clWhite;
96  tr[ *tr[ *m_waveForm].plot(0)->drawPoints()] = false;
97  tr[ *tr[ *m_waveForm].plot(0)->lineColor()] = clGreen;
98  tr[ *tr[ *m_waveForm].plot(0)->pointColor()] = clGreen;
99  tr[ *tr[ *m_waveForm].plot(0)->intensity()] = 2.0;
100  tr[ *tr[ *m_waveForm].plot(1)->drawPoints()] = false;
101  tr[ *tr[ *m_waveForm].plot(1)->lineColor()] = clBlue;
102  tr[ *tr[ *m_waveForm].plot(1)->pointColor()] = clBlue;
103  tr[ *tr[ *m_waveForm].plot(1)->intensity()] = 0.5;
104  shared_ptr<XXYPlot> plot = m_graph->plots()->create<XXYPlot>(
105  tr, "Markers", true, ref(tr), m_graph);
106  m_markerPlot = plot;
107  tr[ *plot->label()] = i18n("Markers");
108  tr[ *plot->axisX()] = axisx;
109  tr[ *plot->axisY()] = axisy;
110  tr[ *plot->drawLines()] = false;
111  tr[ *plot->drawBars()] = true;
112  tr[ *plot->pointColor()] = clRed;
113  tr[ *plot->barColor()] = clRed;
114  tr[ *plot->intensity()] = 2.0;
115  tr[ *plot->clearPoints()].setUIEnabled(false);
116  tr[ *plot->maxCount()].setUIEnabled(false);
117  tr[ *m_waveForm].clearPoints();
118  });
119 }
120 void
122 // impliment form->show() here
123  m_form->showNormal();
124  m_form->raise();
125 }
126 
127 void
129  const Snapshot &shot(tr);
130  unsigned int numtr = reader.pop<unsigned int>();
131  if(numtr != 1)
132  return;
133  unsigned int nummk = reader.pop<unsigned int>();
134  tr[ *this].m_markers.resize(nummk);
135  for(unsigned int i = 0; i < nummk; i++) {
136  tr[ *this].m_markers[i].first = reader.pop<double>();
137  tr[ *this].m_markers[i].second = reader.pop<double>();
138  }
139  if(nummk >= 1) {
140  m_marker1X->value(tr, shot[ *this].m_markers[0].first);
141  m_marker1Y->value(tr, shot[ *this].m_markers[0].second);
142  }
143  if(nummk >= 2) {
144  m_marker2X->value(tr, shot[ *this].m_markers[1].first);
145  m_marker2Y->value(tr, shot[ *this].m_markers[1].second);
146  }
147  convertRaw(reader, tr);
148 }
149 void
151  if( !shot[ *this].time()) {
152  return;
153  }
154  const unsigned int length = shot[ *this].length();
155  m_waveForm->iterate_commit([=](Transaction &tr){
156  tr[ *m_markerPlot->maxCount()] = shot[ *this].m_markers.size();
157  auto &points(tr[ *m_markerPlot].points());
158  points.clear();
159  for(std::deque<std::pair<double, double> >::const_iterator it = shot[ *this].m_markers.begin();
160  it != shot[ *this].m_markers.end(); it++) {
161  points.push_back(XGraph::ValPoint(it->first, it->second));
162  }
163 
164  tr[ *m_waveForm].setRowCount(length);
165 
166  double *freqs = tr[ *m_waveForm].cols(0);
167  double *mag = tr[ *m_waveForm].cols(1);
168  double *ph = tr[ *m_waveForm].cols(2);
169  const std::complex<double> *z = shot[ *this].trace();
170  double fint = shot[ *this].freqInterval();
171  double f = shot[ *this].startFreq();
172  for(unsigned int i = 0; i < length; i++) {
173  *freqs++ = f;
174  *mag++ = 20.0 * log10(std::abs( *z));
175  *ph++ = std::arg( *z) * 180.0 / M_PI;
176  z++;
177  f += fint;
178  }
179 
180  m_waveForm->drawGraph(tr);
181  });
182 }
183 
184 void *
185 XNetworkAnalyzer::execute(const atomic<bool> &terminated) {
186 
187  startFreq()->setUIEnabled(true);
188  stopFreq()->setUIEnabled(true);
189  points()->setUIEnabled(true);
190  average()->setUIEnabled(true);
191  calOpen()->setUIEnabled(true);
192  calShort()->setUIEnabled(true);
193  calTerm()->setUIEnabled(true);
194  calThru()->setUIEnabled(true);
195 
196  iterate_commit([=](Transaction &tr){
197  m_lsnOnStartFreqChanged = tr[ *startFreq()].onValueChanged().connectWeakly(
198  shared_from_this(), &XNetworkAnalyzer::onStartFreqChanged);
199  m_lsnOnStopFreqChanged = tr[ *stopFreq()].onValueChanged().connectWeakly(
200  shared_from_this(), &XNetworkAnalyzer::onStopFreqChanged);
201  m_lsnOnPointsChanged = tr[ *points()].onValueChanged().connectWeakly(
202  shared_from_this(), &XNetworkAnalyzer::onPointsChanged);
203  m_lsnOnAverageChanged = tr[ *average()].onValueChanged().connectWeakly(
204  shared_from_this(), &XNetworkAnalyzer::onAverageChanged);
205  m_lsnCalOpen = tr[ *m_calOpen].onTouch().connectWeakly(shared_from_this(), &XNetworkAnalyzer::onCalOpenTouched);
206  m_lsnCalShort = tr[ *m_calShort].onTouch().connectWeakly(shared_from_this(), &XNetworkAnalyzer::onCalShortTouched);
207  m_lsnCalTerm = tr[ *m_calTerm].onTouch().connectWeakly(shared_from_this(), &XNetworkAnalyzer::onCalTermTouched);
208  m_lsnCalThru = tr[ *m_calThru].onTouch().connectWeakly(shared_from_this(), &XNetworkAnalyzer::onCalThruTouched);
209  });
210 
211  while( !terminated) {
212  XTime time_awared = XTime::now();
213  auto writer = std::make_shared<RawData>();
214  // try/catch exception of communication errors
215  try {
216  oneSweep();
217  }
219  msecsleep(100);
220  continue;
221  }
222  catch (XKameError &e) {
223  e.print(getLabel());
224  continue;
225  }
226  writer->push((unsigned int)1); //# of traces.
227  double mx[8], my[8];
228  unsigned int nummk = 0;
229  try {
230  for(;nummk < 8;nummk++) {
231  mx[nummk] = 0.0;
232  my[nummk] = 0.0;
233  getMarkerPos(nummk, mx[nummk], my[nummk]);
234  }
235  }
237  msecsleep(10);
238  }
239  catch (XKameError &e) {
240  e.print(getLabel());
241  continue;
242  }
243  writer->push((unsigned int)nummk); //# of markers.
244  for(unsigned int i = 0; i < nummk; i++) {
245  writer->push(mx[i]);
246  writer->push(my[i]);
247  }
248  try {
249  acquireTrace(writer, 0);
250  }
252  msecsleep(10);
253  continue;
254  }
255  catch (XKameError &e) {
256  e.print(getLabel());
257  continue;
258  }
259  finishWritingRaw(writer, time_awared, XTime::now());
260  }
261  try {
262  startContSweep();
263  }
264  catch (XKameError &e) {
265  e.print(getLabel());
266  }
267  startFreq()->setUIEnabled(false);
268  stopFreq()->setUIEnabled(false);
269  points()->setUIEnabled(false);
270  average()->setUIEnabled(false);
271  calOpen()->setUIEnabled(false);
272  calShort()->setUIEnabled(false);
273  calTerm()->setUIEnabled(false);
274  calThru()->setUIEnabled(false);
275 
276  m_lsnOnStartFreqChanged.reset();
277  m_lsnOnStopFreqChanged.reset();
278  m_lsnOnPointsChanged.reset();
279  m_lsnOnAverageChanged.reset();
280  m_lsnCalOpen.reset();
281  m_lsnCalShort.reset();
282  m_lsnCalTerm.reset();
283  m_lsnCalThru.reset();
284  return NULL;
285 }

Generated for KAME4 by  doxygen 1.8.3