Skip to content

Commit 5fcdd5c

Browse files
IonutMuthiroot
authored andcommitted
fmcomms5: refactoring
Signed-off-by: IonutMuthi <[email protected]>
1 parent bd41816 commit 5fcdd5c

File tree

10 files changed

+823
-518
lines changed

10 files changed

+823
-518
lines changed

packages/ad936x/plugins/ad936x/include/ad936x/fmcomms5/fmcomms5advanced.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class SCOPY_AD936X_EXPORT Fmcomms5Advanced : public QWidget
7070
ToolTemplate *m_tool;
7171
QVBoxLayout *m_mainLayout;
7272
AnimatedRefreshBtn *m_refreshButton;
73+
7374
EnsmModeClocksWidget *m_ensmModeClocks;
7475
ElnaWidget *m_elna;
7576
RssiWidget *m_rssi;
@@ -80,8 +81,8 @@ class SCOPY_AD936X_EXPORT Fmcomms5Advanced : public QWidget
8081
BistWidget *m_bist;
8182
Fmcomms5Tab *m_fmcomms5;
8283

83-
iio_device *m_plutoDevice = nullptr;
84-
iio_device *m_plutoDeviceB = nullptr;
84+
iio_device *m_mainDevice = nullptr;
85+
iio_device *m_secondDevice = nullptr;
8586
QStackedWidget *m_centralWidget = nullptr;
8687

8788
bool m_isToolInitialized;
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/*
2+
* Copyright (c) 2025 Analog Devices Inc.
3+
*
4+
* This file is part of Scopy
5+
* (see https://www.github.com/analogdevicesinc/scopy).
6+
*
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
19+
*
20+
*/
21+
22+
#ifndef FMCOMMS5CALIBRATION_H
23+
#define FMCOMMS5CALIBRATION_H
24+
25+
#include <QObject>
26+
#include <iio.h>
27+
28+
namespace scopy {
29+
namespace ad936x {
30+
31+
struct MarkerResult
32+
{
33+
double magnitude;
34+
double offset;
35+
int chA;
36+
int chB;
37+
};
38+
39+
// used devices
40+
#define CAP_DEVICE "cf-ad9361-lpc"
41+
#define CAP_DEVICE_ALT "cf-ad9361-A"
42+
#define CAP_SLAVE_DEVICE "cf-ad9361-B"
43+
#define DDS_DEVICE "cf-ad9361-dds-core-lpc"
44+
#define DDS_SLAVE_DEVICE "cf-ad9361-dds-core-B"
45+
46+
/* 1MHZ tone */
47+
#define CAL_TONE 1000000
48+
#define CAL_SCALE 0.12500
49+
#define MARKER_AVG 3
50+
51+
class Fmcomms5Calibration : public QObject
52+
{
53+
Q_OBJECT
54+
public:
55+
explicit Fmcomms5Calibration(iio_context *ctx, QObject *parent = nullptr);
56+
57+
void calibrate();
58+
void resetCalibration();
59+
void callSwitchPortsEnableCb(int val);
60+
61+
Q_SIGNALS:
62+
void calibrationFailed();
63+
void updateCalibrationProgress(double progress);
64+
65+
private:
66+
iio_context *m_ctx;
67+
iio_device *m_mainDevice = nullptr;
68+
iio_device *m_secondDevice = nullptr;
69+
iio_device *m_cf_ad9361_lpc = nullptr;
70+
iio_device *m_cf_ad9361_hpc = nullptr;
71+
iio_device *m_ddsMain = nullptr;
72+
iio_device *m_ddsSecond = nullptr;
73+
74+
const char *ddsChannelNames[8] = {"altvoltage0", "altvoltage1", "altvoltage2", "altvoltage3",
75+
"altvoltage4", "altvoltage5", "altvoltage6", "altvoltage7"};
76+
77+
void calibrationFail(int ret);
78+
79+
double tuneTrxPhaseOffset(iio_device *ldev, int *ret, long long cal_freq, long long cal_tone, double sign,
80+
std::function<void(iio_device *, double)> tune);
81+
82+
void getMarkers(double *offset, double *mag);
83+
std::vector<MarkerResult> getMarkersFromCrossCorrelation();
84+
double calcPhaseOffset(double fsample, double dds_freq, double offset, double mag);
85+
double scalePhase0360(double val);
86+
87+
int defaultDds(long long freq, double scale);
88+
void ddsTxPhaseRotation(struct iio_device *dev, double val);
89+
void trxPhaseRottation(iio_device *dev, double val);
90+
unsigned int getCalTone();
91+
92+
int getCalSamples(long long calTone, long long calFreq);
93+
94+
void nearEndLoopbackCtrl(unsigned channel, bool enable);
95+
};
96+
} // namespace ad936x
97+
} // namespace scopy
98+
#endif // FMCOMMS5CALIBRATION_H

packages/ad936x/plugins/ad936x/include/ad936x/fmcomms5/fmcomms5tab.h

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,9 @@ class Fmcomms5Tab : public QWidget
4444
private:
4545
iio_context *m_ctx;
4646
QVBoxLayout *m_layout;
47-
iio_device *m_device = nullptr;
48-
iio_device *m_deviceB = nullptr;
49-
QCheckBox *m_silentCalibration;
5047
QProgressBar *m_calibProgressBar;
5148
QPushButton *m_calibrateBtn;
52-
53-
void initDevices();
54-
55-
void calibrate();
56-
void trxPhaseRottation(iio_device *dev, double val);
57-
58-
void resetCalibration();
59-
void callSwitchPortsEnableCb(int val);
60-
double tuneTrxPhaseOffset(iio_device *ldev, int *ret, long long cal_freq, long long cal_tone, double sign,
61-
double abort, std::function<void(iio_device *, double)> tune);
62-
63-
// helper functions TODO MOVE TO CLASS
64-
double scalePhase0360(double val);
65-
double calcPhaseOffset(double fsample, double dds_freq, double offset, double mag);
66-
void getMarkers(double *offset, double *mag);
67-
int getCalSamples(long long calTone, long long calFreq);
49+
QPushButton *m_resetCalibrationBtn;
6850
};
6951
} // namespace ad936x
7052
} // namespace scopy
249 KB
Loading

packages/ad936x/plugins/ad936x/resources/resources.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
<file>ad936x-filters/AD936x_LP_256kHz_768kSPS.ftr</file>
66
<file>ad936x-filters/AD936x_LP_333kHz_1MSPS.ftr</file>
77
<file>ad936x-filters/AD936x_LP_666kHz_2MSPS.ftr</file>
8+
<file>AD_FMCOMMS5_EBZ.jpg</file>
89
</qresource>
910
</RCC>

packages/ad936x/plugins/ad936x/src/ad936x/ad936x.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ AD936X::AD936X(iio_context *ctx, QWidget *parent)
120120
controlWidgetLayout->addWidget(
121121
generateRxChainWidget(plutoDevice, "AD9361 / AD9364 Receive Chain", controlsWidget));
122122

123-
/// third is Tx (transimt chain)
123+
/// third is Tx (transmit chain)
124124
controlWidgetLayout->addWidget(
125125
generateTxChainWidget(plutoDevice, "AD9361 / AD9364 Transmit Chain", controlsWidget));
126126

packages/ad936x/plugins/ad936x/src/fmcomms5/fmcomms5.cpp

Lines changed: 59 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,13 @@ FMCOMMS5::FMCOMMS5(iio_context *ctx, QWidget *parent)
9696

9797
if(m_ctx != nullptr) {
9898

99-
iio_device *plutoDevice = nullptr;
99+
iio_device *mainDevice = nullptr;
100100
int device_count = iio_context_get_devices_count(m_ctx);
101101
for(int i = 0; i < device_count; ++i) {
102102
iio_device *dev = iio_context_get_device(m_ctx, i);
103103
const char *dev_name = iio_device_get_name(dev);
104-
if(dev_name && QString(dev_name).contains("ad936", Qt::CaseInsensitive)) {
105-
plutoDevice = dev;
104+
if(dev_name && QString(dev_name).compare("ad9361-phy", Qt::CaseInsensitive) == 0) {
105+
mainDevice = dev;
106106
break;
107107
}
108108
}
@@ -111,67 +111,87 @@ FMCOMMS5::FMCOMMS5(iio_context *ctx, QWidget *parent)
111111
connect(this, &FMCOMMS5::readRequested, m_helper, &AD936xHelper::readRequested);
112112

113113
/// first widget the global settings can be created with iiowigets only
114-
controlWidgetLayout->addWidget(m_helper->generateGlobalSettingsWidget(
115-
plutoDevice, "FMCOMMS5 Global Settings", controlsWidget));
114+
controlWidgetLayout->addWidget(
115+
m_helper->generateGlobalSettingsWidget(mainDevice, "FMCOMMS5 Global Settings", controlsWidget));
116116

117117
/// second is Rx ( receive chain)
118118
controlWidgetLayout->addWidget(
119-
generateRxChainWidget(plutoDevice, "FMCOMMS5 Receive Chain", controlsWidget));
119+
generateRxChainWidget(mainDevice, "FMCOMMS5 Receive Chain", controlsWidget));
120120

121-
/// third is Tx (transimt chain)
121+
/// third is Tx (transmit chain)
122122
controlWidgetLayout->addWidget(
123-
generateTxChainWidget(plutoDevice, "FMCOMMS5 Transmit Chain", controlsWidget));
123+
generateTxChainWidget(mainDevice, "FMCOMMS5 Transmit Chain", controlsWidget));
124124

125125
controlWidgetLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Preferred, QSizePolicy::Expanding));
126126
}
127127

128-
m_blockDiagramWidget = new QWidget(this);
129-
Style::setBackgroundColor(m_blockDiagramWidget, json::theme::background_primary);
130-
QVBoxLayout *blockDiagramLayout = new QVBoxLayout(m_blockDiagramWidget);
131-
m_blockDiagramWidget->setLayout(blockDiagramLayout);
132-
133-
QWidget *blockDiagramWidget = new QWidget(this);
134-
QVBoxLayout *blockDiagramWidgetLayout = new QVBoxLayout(blockDiagramWidget);
135-
blockDiagramWidget->setLayout(blockDiagramWidgetLayout);
136-
137-
QScrollArea *blockDiagramWidgetScrollArea = new QScrollArea(this);
138-
blockDiagramWidgetScrollArea->setWidgetResizable(true);
139-
blockDiagramWidgetScrollArea->setWidget(blockDiagramWidget);
140-
141-
blockDiagramLayout->addWidget(blockDiagramWidgetScrollArea);
142-
143-
QLabel *blockDiagram = new QLabel(m_blockDiagramWidget);
144-
blockDiagramWidgetLayout->addWidget(blockDiagram);
145-
blockDiagram->setAlignment(Qt::AlignCenter);
146-
// todo replace
147-
QPixmap pixmap(":/pluto/ad936x.svg");
148-
blockDiagram->setPixmap(pixmap);
128+
// Block Diagram Stack Widget with Next/Prev buttons
129+
QWidget *blockDiagramStackWidget = new QWidget(this);
130+
Style::setBackgroundColor(blockDiagramStackWidget, json::theme::background_primary);
131+
QVBoxLayout *blockDiagramStackLayout = new QVBoxLayout(blockDiagramStackWidget);
132+
blockDiagramStackWidget->setLayout(blockDiagramStackLayout);
133+
134+
QStackedWidget *imageStack = new QStackedWidget(blockDiagramStackWidget);
135+
136+
// Add images as QLabel widgets
137+
QLabel *imageLabel1 = new QLabel(blockDiagramStackWidget);
138+
imageLabel1->setAlignment(Qt::AlignCenter);
139+
imageLabel1->setPixmap(QPixmap(":/pluto/ad936x.svg"));
140+
imageStack->addWidget(imageLabel1);
141+
142+
QLabel *imageLabel2 = new QLabel(blockDiagramStackWidget);
143+
imageLabel2->setAlignment(Qt::AlignCenter);
144+
imageLabel2->setPixmap(QPixmap(":/pluto/AD_FMCOMMS5_EBZ.jpg"));
145+
imageStack->addWidget(imageLabel2);
146+
147+
blockDiagramStackLayout->addWidget(imageStack);
148+
149+
QHBoxLayout *buttonLayout = new QHBoxLayout();
150+
QPushButton *prevBtn = new QPushButton("Prev", blockDiagramStackWidget);
151+
Style::setStyle(prevBtn, style::properties::button::basicButton);
152+
QPushButton *nextBtn = new QPushButton("Next", blockDiagramStackWidget);
153+
Style::setStyle(nextBtn, style::properties::button::basicButton);
154+
buttonLayout->addWidget(prevBtn);
155+
buttonLayout->addWidget(nextBtn);
156+
blockDiagramStackLayout->addLayout(buttonLayout);
157+
158+
// Navigation logic
159+
connect(prevBtn, &QPushButton::clicked, this, [imageStack]() {
160+
int idx = imageStack->currentIndex();
161+
if(idx > 0)
162+
imageStack->setCurrentIndex(idx - 1);
163+
});
164+
connect(nextBtn, &QPushButton::clicked, this, [imageStack]() {
165+
int idx = imageStack->currentIndex();
166+
if(idx < imageStack->count() - 1)
167+
imageStack->setCurrentIndex(idx + 1);
168+
});
149169

150170
centralWidget->addWidget(m_controlsWidget);
151-
centralWidget->addWidget(m_blockDiagramWidget);
171+
centralWidget->addWidget(blockDiagramStackWidget);
152172

153173
m_tool->addWidgetToCentralContainerHelper(centralWidget);
154174

155175
QButtonGroup *centralWidgetButtons = new QButtonGroup(this);
156176
centralWidgetButtons->setExclusive(true);
157177

158-
QPushButton *ad963xBtn = new QPushButton("Controls", this);
159-
ad963xBtn->setCheckable(true);
160-
ad963xBtn->setChecked(true);
161-
Style::setStyle(ad963xBtn, style::properties::button::blueGrayButton);
162-
connect(ad963xBtn, &QPushButton::clicked, this,
178+
QPushButton *controlsBtn = new QPushButton("Controls", this);
179+
controlsBtn->setCheckable(true);
180+
controlsBtn->setChecked(true);
181+
Style::setStyle(controlsBtn, style::properties::button::blueGrayButton);
182+
connect(controlsBtn, &QPushButton::clicked, this,
163183
[=, this]() { centralWidget->setCurrentWidget(m_controlsWidget); });
164184

165185
QPushButton *blockDiagramBtn = new QPushButton("Block Diagram", this);
166186
blockDiagramBtn->setCheckable(true);
167187
Style::setStyle(blockDiagramBtn, style::properties::button::blueGrayButton);
168188
connect(blockDiagramBtn, &QPushButton::clicked, this,
169-
[=, this]() { centralWidget->setCurrentWidget(m_blockDiagramWidget); });
189+
[=, this]() { centralWidget->setCurrentWidget(blockDiagramStackWidget); });
170190

171-
centralWidgetButtons->addButton(ad963xBtn);
191+
centralWidgetButtons->addButton(controlsBtn);
172192
centralWidgetButtons->addButton(blockDiagramBtn);
173193

174-
m_tool->addWidgetToTopContainerHelper(ad963xBtn, TTA_LEFT);
194+
m_tool->addWidgetToTopContainerHelper(controlsBtn, TTA_LEFT);
175195
m_tool->addWidgetToTopContainerHelper(blockDiagramBtn, TTA_LEFT);
176196
}
177197

@@ -289,7 +309,7 @@ QWidget *FMCOMMS5::generateRxChainWidget(iio_device *dev, QString title, QWidget
289309
for(int i = 0; i < device_count; ++i) {
290310
iio_device *aux = iio_context_get_device(m_ctx, i);
291311
const char *dev_name = iio_device_get_name(aux);
292-
if(dev_name && QString(dev_name).contains("ad9361-phy-b", Qt::CaseInsensitive)) {
312+
if(dev_name && QString(dev_name).contains("ad9361-phy-B", Qt::CaseInsensitive)) {
293313
dev2 = aux;
294314
break;
295315
}

0 commit comments

Comments
 (0)