Skip to content

Commit c11cf52

Browse files
iio-widgets: Add empty data strategy
Signed-off-by: Andrei-Fabian-Pop <Andreifabian.Pop@analog.com>
1 parent b47bb78 commit c11cf52

14 files changed

Lines changed: 209 additions & 93 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#ifndef EMPTYDATASTRATEGY_H
2+
#define EMPTYDATASTRATEGY_H
3+
4+
#include <QObject>
5+
#include "datastrategy/datastrategyinterface.h"
6+
#include "scopy-iio-widgets_export.h"
7+
8+
namespace scopy {
9+
class SCOPY_IIO_WIDGETS_EXPORT EmptyDataStrategy : public QObject, public DataStrategyInterface
10+
{
11+
Q_OBJECT
12+
Q_INTERFACES(scopy::DataStrategyInterface)
13+
public:
14+
explicit EmptyDataStrategy(QObject *parent = nullptr);
15+
16+
QString data() override;
17+
QString optionalData() override;
18+
19+
public Q_SLOTS:
20+
int write(QString data) override;
21+
QPair<QString, QString> read() override;
22+
void writeAsync(QString data) override;
23+
void readAsync() override;
24+
25+
Q_SIGNALS:
26+
void sendData(QString data, QString dataOptions) override;
27+
void aboutToWrite(QString oldData, QString newData) override;
28+
void emitStatus(QDateTime timestamp, QString oldData, QString newData, int returnCode, bool isReadOp) override;
29+
30+
private:
31+
QString m_data;
32+
QString m_previousData;
33+
};
34+
} // namespace scopy
35+
36+
#endif // EMPTYDATASTRATEGY_H

iio-widgets/include/iio-widgets/iioconfigurationpopup.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOConfigurationPopup : public QWidget
2525

2626
Q_SIGNALS:
2727
void selectButtonClicked(IIOItem *selected);
28+
void emptyButtonClicked();
2829
void exitButtonClicked();
2930

3031
protected Q_SLOTS:
@@ -39,6 +40,7 @@ protected Q_SLOTS:
3940
IIOWidgetSelector *m_widgetSelector;
4041
QPushButton *m_exitButton;
4142
QPushButton *m_selectButton;
43+
QPushButton *m_emptyButton;
4244
IIOItem *m_root;
4345
};
4446
} // namespace scopy

iio-widgets/include/iio-widgets/iiowidget.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,20 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidget : public QWidget
124124
*/
125125
int lastReturnCode();
126126

127+
/**
128+
* @brief setUItoDataConversion Adds a function that is called before sending the data given as imput by the
129+
* user and modifies this data. The function receives as parameter a QString, converts it and returns the
130+
* converted string that will be sent to the DS after.
131+
* @param func std::function<QString(QString)>
132+
*/
127133
void setUItoDataConversion(std::function<QString(QString)> func);
134+
135+
/**
136+
* @brief setDataToUIConversion Adds a function that is called before sending the data read by the IIOWidget
137+
* and modifies this data. The function receives as parameter a QString, converts it and returns the
138+
* converted string that will be sent to the UI after.
139+
* @param func std::function<QString(QString)>
140+
*/
128141
void setDataToUIConversion(std::function<QString(QString)> func);
129142

130143
/**
@@ -239,12 +252,12 @@ protected Q_SLOTS:
239252
void setLastOperationTimestamp(QDateTime timestamp);
240253
void setLastOperationState(IIOWidget::State state);
241254

242-
// Core variables
255+
/* Core variables */
243256
GuiStrategyInterface *m_uiStrategy;
244257
DataStrategyInterface *m_dataStrategy;
245258
IIOWidgetFactoryRecipe m_recipe;
246259

247-
// Logged data
260+
/* Logged data */
248261
QString m_lastData;
249262
SmallProgressBar *m_progressBar;
250263
QDateTime *m_lastOpTimestamp;
@@ -255,7 +268,7 @@ protected Q_SLOTS:
255268
std::function<QString(QString)> m_UItoDS;
256269
std::function<QString(QString)> m_DStoUI;
257270

258-
// Optional configuration
271+
/* Optional configuration */
259272
QPushButton *m_configBtn;
260273
IIOConfigurationPopup *m_configPopup;
261274
bool m_isConfigurable;

iio-widgets/include/iio-widgets/iiowidgetbuilder.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
4242
TriggerData,
4343
DeviceAttrData,
4444
ContextAttrData,
45+
EmptyData,
4546
};
4647

4748
enum UIS
@@ -53,7 +54,7 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
5354
RangeUi,
5455
};
5556

56-
explicit IIOWidgetBuilder(QObject *parent = nullptr);
57+
explicit IIOWidgetBuilder(QWidget *parent = nullptr);
5758
~IIOWidgetBuilder();
5859

5960
/**
@@ -109,6 +110,13 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
109110
*/
110111
IIOWidgetBuilder &configMode(bool isConfigurable);
111112

113+
/**
114+
* @brief title Sets the title of the IIOWidget
115+
* @param title QString
116+
* @return
117+
*/
118+
IIOWidgetBuilder &title(QString title);
119+
112120
/**
113121
* @brief Sets the context that will be used, if no iio_device or iio_channel
114122
* is set, the build functions will work with the context.
@@ -168,12 +176,6 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
168176
*/
169177
IIOWidgetBuilder &uiStrategy(IIOWidgetBuilder::UIS uiStrategy);
170178

171-
/**
172-
* @brief Sets the parent of the IIOWidget that will be built.
173-
* @param parent
174-
*/
175-
IIOWidgetBuilder &parent(QWidget *parent);
176-
177179
private:
178180
DataStrategyInterface *createDS();
179181
GuiStrategyInterface *createUIS();
@@ -188,6 +190,7 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
188190
QString m_attribute;
189191
QString m_optionsAttribute;
190192
QString m_optionsValues;
193+
QString m_title;
191194
IIOWidgetBuilder::DS m_dataStrategy;
192195
IIOWidgetBuilder::UIS m_uiStrategy;
193196
QWidget *m_widgetParent;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include "emptydatastrategy.h"
2+
3+
using namespace scopy;
4+
5+
EmptyDataStrategy::EmptyDataStrategy(QObject *parent)
6+
: QObject{parent}
7+
, m_data("")
8+
, m_previousData("")
9+
{}
10+
11+
QString EmptyDataStrategy::data() { return m_data; }
12+
13+
QString EmptyDataStrategy::optionalData() { return ""; }
14+
15+
int EmptyDataStrategy::write(QString data)
16+
{
17+
m_previousData = data;
18+
m_data = data;
19+
return 0;
20+
}
21+
22+
QPair<QString, QString> EmptyDataStrategy::read() { return {m_data, ""}; }
23+
24+
void EmptyDataStrategy::writeAsync(QString data)
25+
{
26+
int res = write(data);
27+
Q_EMIT emitStatus(QDateTime::currentDateTime(), m_data, data, (int)(res), false);
28+
readAsync();
29+
}
30+
31+
void EmptyDataStrategy::readAsync()
32+
{
33+
QPair<QString, QString> res = read();
34+
Q_EMIT emitStatus(QDateTime::currentDateTime(), m_previousData, m_data, 0, true);
35+
Q_EMIT sendData(res.first, res.second);
36+
}
37+
38+
#include "moc_emptydatastrategy.cpp"

iio-widgets/src/iioconfigurationpopup.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ void IIOConfigurationPopup::init()
134134

135135
Q_EMIT selectButtonClicked(iioItem);
136136
});
137+
QObject::connect(m_emptyButton, &QPushButton::clicked, this, &IIOConfigurationPopup::emptyButtonClicked);
137138
QObject::connect(m_exitButton, &QPushButton::clicked, this, &IIOConfigurationPopup::exitButtonClicked);
138139
m_selectButton->setDisabled(true);
139140
}
@@ -161,12 +162,11 @@ void IIOConfigurationPopup::initUI()
161162
buttonGroupLayout->setSpacing(10);
162163

163164
m_selectButton = new QPushButton("Select", buttonGroup);
164-
m_selectButton->setObjectName("selectButton");
165-
165+
m_emptyButton = new QPushButton("No Data", buttonGroup);
166166
m_exitButton = new QPushButton("Exit", buttonGroup);
167-
m_exitButton->setObjectName("exitButton");
168167

169168
buttonGroupLayout->addWidget(m_exitButton);
169+
buttonGroupLayout->addWidget(m_emptyButton);
170170
buttonGroupLayout->addWidget(m_selectButton);
171171

172172
backgroundLayout->addWidget(m_titleLabel);
@@ -175,9 +175,10 @@ void IIOConfigurationPopup::initUI()
175175

176176
backgroundWidget->setLayout(backgroundLayout);
177177

178-
StyleHelper::TutorialChapterTitleLabel(m_titleLabel, "titleLabel");
179-
StyleHelper::BlueButton(m_selectButton, "selectButton");
180-
StyleHelper::BlueButton(m_exitButton, "exitButton");
178+
StyleHelper::TutorialChapterTitleLabel(m_titleLabel, "TitleLabel");
179+
StyleHelper::BlueButton(m_selectButton, "SelectButton");
180+
StyleHelper::BlueButton(m_emptyButton, "EmptyButton");
181+
StyleHelper::BlueButton(m_exitButton, "ExitButton");
181182
StyleHelper::OverlayMenu(this, "IIOConfigurationPopupOverlay");
182183
}
183184

iio-widgets/src/iiowidget.cpp

Lines changed: 59 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,18 @@
1919
*/
2020

2121
#include "iiowidget.h"
22-
#include "channelattrdatastrategy.h"
23-
#include "contextattrdatastrategy.h"
24-
#include "deviceattrdatastrategy.h"
25-
#include "iiowidgetselector.h"
22+
#include "datastrategy/channelattrdatastrategy.h"
23+
#include "datastrategy/contextattrdatastrategy.h"
24+
#include "datastrategy/deviceattrdatastrategy.h"
25+
#include "datastrategy/emptydatastrategy.h"
26+
2627
#include <iioutil/connectionprovider.h>
27-
#include <QDateTime>
28-
#include <QApplication>
2928
#include <pluginbase/preferences.h>
3029
#include <gui/utils.h>
3130

31+
#include <QDateTime>
32+
#include <QApplication>
33+
3234
using namespace scopy;
3335

3436
Q_LOGGING_CATEGORY(CAT_IIOWIDGET, "iioWidget")
@@ -46,15 +48,27 @@ IIOWidget::IIOWidget(GuiStrategyInterface *uiStrategy, DataStrategyInterface *da
4648
, m_DStoUI(nullptr)
4749
, m_isConfigurable(false)
4850
{
51+
// Config button
52+
m_configBtn->setStyleSheet("border-image: url(\":/gui/icons/scopy-default/icons/gear_wheel.svg\");");
53+
m_configBtn->setVisible(m_isConfigurable);
54+
55+
// General layout
4956
setLayout(new QVBoxLayout(this));
5057
layout()->setContentsMargins(0, 0, 0, 0);
5158
layout()->setSpacing(0);
5259
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
5360

61+
QWidget *topWidget = new QWidget(this);
62+
topWidget->setLayout(new QHBoxLayout(topWidget));
63+
topWidget->layout()->setContentsMargins(0, 0, 0, 0);
64+
5465
QWidget *ui = m_uiStrategy->ui();
5566
if(ui) {
56-
layout()->addWidget(ui);
67+
topWidget->layout()->addWidget(ui);
5768
}
69+
topWidget->layout()->addWidget(m_configBtn);
70+
71+
layout()->addWidget(topWidget);
5872
layout()->addWidget(m_progressBar);
5973

6074
QObject *uiStrategyObject = dynamic_cast<QObject *>(m_uiStrategy);
@@ -65,23 +79,31 @@ IIOWidget::IIOWidget(GuiStrategyInterface *uiStrategy, DataStrategyInterface *da
6579

6680
connect(m_progressBar, &SmallProgressBar::progressFinished, this,
6781
[this]() { this->convertUItoDS(m_lastData); });
82+
connect(m_configBtn, &QPushButton::clicked, this, &IIOWidget::reconfigure);
6883

6984
connect(uiStrategyObject, SIGNAL(emitData(QString)), this, SLOT(startTimer(QString)));
85+
connect(uiStrategyObject, SIGNAL(emitData(QString)), this, SIGNAL(emitData(QString)));
86+
connect(uiStrategyObject, SIGNAL(displayedNewData(QString, QString)), this,
87+
SIGNAL(displayedNewData(QString, QString)));
7088

7189
connect(dataStrategyObject, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
7290
SLOT(emitDataStatus(QDateTime, QString, QString, int, bool)));
7391

7492
// forward data request from ui strategy to data strategy
7593
connect(uiStrategyObject, SIGNAL(requestData()), dataStrategyObject, SLOT(readAsync()));
94+
connect(dataStrategyObject, SIGNAL(sendData(QString, QString)), this, SIGNAL(sendData(QString, QString)));
95+
connect(dataStrategyObject, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
96+
SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)));
7697

7798
// forward data from data strategy to ui strategy
7899
connect(dataStrategyObject, SIGNAL(sendData(QString, QString)), this, SLOT(convertDStoUI(QString, QString)));
100+
connect(dataStrategyObject, SIGNAL(aboutToWrite(QString, QString)), this,
101+
SIGNAL(aboutToWrite(QString, QString)));
79102

80103
// intercept the sendData from dataStrategy to collect information
81104
connect(dataStrategyObject, SIGNAL(sendData(QString, QString)), this, SLOT(storeReadInfo(QString, QString)));
82105

83-
// The data will be populated here
84-
bool useLazyLoading = Preferences::GetInstance()->get("iiowidgets_use_lazy_loading").toBool();
106+
bool useLazyLoading = Preferences::get("iiowidgets_use_lazy_loading").toBool();
85107
if(!useLazyLoading) { // force skip lazy load
86108
LAZY_LOAD(initialize);
87109
}
@@ -97,41 +119,41 @@ void IIOWidget::writeAsync(QString data) { m_dataStrategy->writeAsync(data); }
97119

98120
DataStrategyInterface *IIOWidget::swapDataStrategy(DataStrategyInterface *dataStrategy)
99121
{
100-
QWidget *dataStrategyWidget = dynamic_cast<QWidget *>(m_dataStrategy);
101-
QWidget *uiStrategyWidget = dynamic_cast<QWidget *>(m_uiStrategy);
102-
QWidget *newDataStrategyWidget = dynamic_cast<QWidget *>(dataStrategy);
122+
QObject *dataStrategyObject = dynamic_cast<QObject *>(m_dataStrategy);
123+
QObject *uiStrategyObject = dynamic_cast<QObject *>(m_uiStrategy);
124+
QObject *newDataStrategyObject = dynamic_cast<QObject *>(dataStrategy);
103125

104126
// disconnect old data strategy
105-
disconnect(dataStrategyWidget, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
127+
disconnect(dataStrategyObject, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
106128
SLOT(emitDataStatus(QDateTime, QString, QString, int, bool)));
107-
disconnect(uiStrategyWidget, SIGNAL(requestData()), dataStrategyWidget, SLOT(readAsync()));
108-
disconnect(dataStrategyWidget, SIGNAL(sendData(QString, QString)), uiStrategyWidget,
129+
disconnect(uiStrategyObject, SIGNAL(requestData()), dataStrategyObject, SLOT(readAsync()));
130+
disconnect(dataStrategyObject, SIGNAL(sendData(QString, QString)), uiStrategyObject,
109131
SLOT(receiveData(QString, QString)));
110-
disconnect(dataStrategyWidget, SIGNAL(sendData(QString, QString)), this,
132+
disconnect(dataStrategyObject, SIGNAL(sendData(QString, QString)), this,
111133
SLOT(storeReadInfo(QString, QString))); // TODO: maybe do something with this slot..
112-
disconnect(dataStrategyWidget, SIGNAL(sendData(QString, QString)), this, SIGNAL(sendData(QString, QString)));
113-
disconnect(dataStrategyWidget, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
134+
disconnect(dataStrategyObject, SIGNAL(sendData(QString, QString)), this, SIGNAL(sendData(QString, QString)));
135+
disconnect(dataStrategyObject, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
114136
SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)));
115-
disconnect(dataStrategyWidget, SIGNAL(aboutToWrite(QString, QString)), this,
137+
disconnect(dataStrategyObject, SIGNAL(aboutToWrite(QString, QString)), this,
116138
SIGNAL(aboutToWrite(QString, QString)));
117-
disconnect(uiStrategyWidget, SIGNAL(emitData(QString)), this, SIGNAL(emitData(QString)));
118-
disconnect(uiStrategyWidget, SIGNAL(displayedNewData(QString, QString)), this,
139+
disconnect(uiStrategyObject, SIGNAL(emitData(QString)), this, SIGNAL(emitData(QString)));
140+
disconnect(uiStrategyObject, SIGNAL(displayedNewData(QString, QString)), this,
119141
SIGNAL(displayedNewData(QString, QString)));
120142

121143
// connect new data strategy
122-
connect(newDataStrategyWidget, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
144+
connect(newDataStrategyObject, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
123145
SLOT(emitDataStatus(QDateTime, QString, QString, int, bool)));
124-
connect(uiStrategyWidget, SIGNAL(requestData()), newDataStrategyWidget, SLOT(readAsync()));
125-
connect(newDataStrategyWidget, SIGNAL(sendData(QString, QString)), uiStrategyWidget,
146+
connect(uiStrategyObject, SIGNAL(requestData()), newDataStrategyObject, SLOT(readAsync()));
147+
connect(newDataStrategyObject, SIGNAL(sendData(QString, QString)), uiStrategyObject,
126148
SLOT(receiveData(QString, QString)));
127-
connect(newDataStrategyWidget, SIGNAL(sendData(QString, QString)), this, SLOT(storeReadInfo(QString, QString)));
128-
connect(dataStrategyWidget, SIGNAL(sendData(QString, QString)), this, SIGNAL(sendData(QString, QString)));
129-
connect(dataStrategyWidget, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
149+
connect(newDataStrategyObject, SIGNAL(sendData(QString, QString)), this, SLOT(storeReadInfo(QString, QString)));
150+
connect(dataStrategyObject, SIGNAL(sendData(QString, QString)), this, SLOT(convertDStoUI(QString, QString)));
151+
connect(dataStrategyObject, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
130152
SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)));
131-
connect(dataStrategyWidget, SIGNAL(aboutToWrite(QString, QString)), this,
153+
connect(dataStrategyObject, SIGNAL(aboutToWrite(QString, QString)), this,
132154
SIGNAL(aboutToWrite(QString, QString)));
133-
connect(uiStrategyWidget, SIGNAL(emitData(QString)), this, SIGNAL(emitData(QString)));
134-
connect(uiStrategyWidget, SIGNAL(displayedNewData(QString, QString)), this,
155+
connect(uiStrategyObject, SIGNAL(emitData(QString)), this, SIGNAL(emitData(QString)));
156+
connect(uiStrategyObject, SIGNAL(displayedNewData(QString, QString)), this,
135157
SIGNAL(displayedNewData(QString, QString)));
136158

137159
// save the new data strategy and return the old one
@@ -263,6 +285,13 @@ void IIOWidget::reconfigure()
263285

264286
connect(m_configPopup, &IIOConfigurationPopup::exitButtonClicked, this,
265287
[&]() { m_configPopup->deleteLater(); });
288+
connect(m_configPopup, &IIOConfigurationPopup::emptyButtonClicked, this, [&]() {
289+
DataStrategyInterface *ds = new EmptyDataStrategy(this);
290+
DataStrategyInterface *oldDS = swapDataStrategy(ds);
291+
delete oldDS;
292+
delete m_configPopup;
293+
m_uiStrategy->changeName("Empty");
294+
});
266295
connect(m_configPopup, &IIOConfigurationPopup::selectButtonClicked, this, [&](IIOItem *item) {
267296
DataStrategyInterface *dsCreated = nullptr;
268297
switch(item->type()) {

0 commit comments

Comments
 (0)