14 #include "networkanalyzer.h"
15 #include "ui_networkanalyzerform.h"
16 #include "xwavengraph.h"
18 #include "graphwidget.h"
20 #include "interface.h"
22 #include "xnodeconnector.h"
24 XNetworkAnalyzer::XNetworkAnalyzer(
const char *name,
bool runtime,
25 Transaction &tr_meas,
const shared_ptr<XMeasure> &meas) :
28 dynamic_pointer_cast<
XDriver>(shared_from_this()))),
30 dynamic_pointer_cast<
XDriver>(shared_from_this()))),
32 dynamic_pointer_cast<
XDriver>(shared_from_this()))),
34 dynamic_pointer_cast<
XDriver>(shared_from_this()))),
35 m_startFreq(create<
XDoubleNode>(
"StartFreq", false)),
37 m_points(create<
XComboNode>(
"Points", false, true)),
38 m_average(create<
XUIntNode>(
"Average", false)),
45 m_form->m_graphwidget, m_form->m_edDump, m_form->m_tbDump, m_form->m_btnDump)) {
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);
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);
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)
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);
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);
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;
117 tr[ *m_waveForm].clearPoints();
123 m_form->showNormal();
130 unsigned int numtr = reader.pop<
unsigned int>();
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>();
140 m_marker1X->value(tr, shot[ *
this].m_markers[0].first);
141 m_marker1Y->value(tr, shot[ *
this].m_markers[0].second);
144 m_marker2X->value(tr, shot[ *
this].m_markers[1].first);
145 m_marker2Y->value(tr, shot[ *
this].m_markers[1].second);
147 convertRaw(reader, tr);
151 if( !shot[ *
this].time()) {
154 const unsigned int length = shot[ *
this].length();
156 tr[ *m_markerPlot->maxCount()] = shot[ *
this].m_markers.size();
157 auto &points(tr[ *m_markerPlot].points());
159 for(std::deque<std::pair<double, double> >::const_iterator it = shot[ *
this].m_markers.begin();
160 it != shot[ *
this].m_markers.end(); it++) {
164 tr[ *m_waveForm].setRowCount(length);
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++) {
174 *mag++ = 20.0 * log10(std::abs( *z));
175 *ph++ = std::arg( *z) * 180.0 / M_PI;
180 m_waveForm->drawGraph(tr);
185 XNetworkAnalyzer::execute(
const atomic<bool> &terminated) {
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);
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);
211 while( !terminated) {
212 XTime time_awared = XTime::now();
213 auto writer = std::make_shared<RawData>();
226 writer->push((
unsigned int)1);
228 unsigned int nummk = 0;
230 for(;nummk < 8;nummk++) {
233 getMarkerPos(nummk, mx[nummk], my[nummk]);
243 writer->push((
unsigned int)nummk);
244 for(
unsigned int i = 0; i < nummk; i++) {
249 acquireTrace(writer, 0);
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);
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();