Skip to content
This repository was archived by the owner on Jan 21, 2022. It is now read-only.

Commit 055df99

Browse files
nreischlvkresch
authored andcommitted
Updated osi-visualizer to handle ZMQ Push/Pull configuration in LiME (#34)
* Updated README with FMI dependency. * Updated OsiReader and TCPReceiver for ZMQ Push/Pull. * Updated MainWindow to handle different ZMQ communication types. * Improved shutdown and pause handling.
1 parent df39bce commit 055df99

7 files changed

Lines changed: 941 additions & 789 deletions

File tree

include/mainwindow.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,11 @@ class MainWindow : public QMainWindow
155155
void ShowFOV();
156156
void ShowFOV2();
157157

158+
void CBZmqTypeChangeConnect1(const QString&);
159+
void CBZmqTypeChangePlayback1(const QString&);
160+
161+
void CBZmqTypeChangeConnect2(const QString&);
162+
void CBZmqTypeChangePlayback2(const QString&);
158163

159164
private:
160165

@@ -230,7 +235,6 @@ class MainWindow : public QMainWindow
230235
void EnableShowFOV(const bool enable);
231236
void EnableShowFOV2(const bool enable);
232237

233-
234238
// Configurations
235239
AppConfig config_;
236240

@@ -277,5 +281,8 @@ class MainWindow : public QMainWindow
277281

278282
DisplayObjectDialog* displayObjectDlg_;
279283
DisplayObjectDialog* displayObjectDlg2_;
284+
285+
const QString zmqPushPull_{"Push/Pull"};
286+
const QString zmqPubSub_{"Pub/Sub"};
280287
};
281288

include/osireader.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class OsiReader: public QObject, public IMessageSource
5555
const bool& enableSendOut,
5656
const std::string& pubPortNum,
5757
const bool &enalbeFMU,
58+
int socketType,
5859
const std::string &fmuPath = "");
5960

6061
QString SetupConnection(bool enable);
@@ -124,6 +125,7 @@ class OsiReader: public QObject, public IMessageSource
124125
std::string currentBuffer_;
125126

126127
// ZMQ
128+
int socketType_;
127129
zmq::context_t zmqContext_;
128130
zmq::socket_t zmqPublisher_;
129131

include/tcpreceiver.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class TCPReceiver : public QObject, public IMessageSource
2121

2222
public:
2323

24-
TCPReceiver();
24+
TCPReceiver(int type);
2525

2626
signals:
2727
void Connected(DataType dataType);
@@ -43,6 +43,7 @@ class TCPReceiver : public QObject, public IMessageSource
4343
bool isRunning_;
4444
bool isThreadTerminated_;
4545

46+
int socketType_;
4647
std::string currentPort_;
4748
std::string currentEndpoint_;
4849
zmq::context_t context_;

src/mainwindow.cpp

Lines changed: 157 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,27 @@
2525
#include <sstream>
2626
#include <iomanip>
2727

28+
#define CONNECT_OSIREADER(number) \
29+
connect(this, &MainWindow::StartPlaybackRequested##number, reader##number##_, &OsiReader::StartReadFile, Qt::QueuedConnection); \
30+
connect(reader##number##_, &OsiReader::Connected, this, &MainWindow::Connected##number); \
31+
connect(reader##number##_, &OsiReader::Disconnected, this, &MainWindow::Disconnected##number); \
32+
connect(reader##number##_, &OsiReader::Connected, glWidget##number##_, &GLWidget::Connected, Qt::DirectConnection); \
33+
connect(reader##number##_, &OsiReader::Disconnected, glWidget##number##_, &GLWidget::Disconnected, Qt::DirectConnection); \
34+
connect(reader##number##_, &OsiReader::UpdateSliderRange, this, &MainWindow::UpdateSliderRange##number); \
35+
connect(reader##number##_, &OsiReader::UpdateSliderValue, this, &MainWindow::UpdateSliderValue##number); \
36+
connect(reader##number##_, &OsiReader::MessageSDSendout, osiparser##number##_, &OsiParser::ParseReceivedSDMessage, Qt::QueuedConnection); \
37+
connect(reader##number##_, &OsiReader::MessageSVSendout, osiparser##number##_, &OsiParser::ParseReceivedSVMessage, Qt::QueuedConnection);\
38+
connect(ui_->hSlider_##number, &QSlider::valueChanged, reader##number##_, &OsiReader::SliderValueChanged);
39+
40+
#define CONNECT_TCP_RECEIVER(number) \
41+
connect(this, &MainWindow::ConnectRequested##number, tcpReceiver##number##_, &TCPReceiver::ConnectRequested, Qt::QueuedConnection); \
42+
connect(tcpReceiver##number##_, &TCPReceiver::Connected, this, &MainWindow::Connected##number); \
43+
connect(tcpReceiver##number##_, &TCPReceiver::Disconnected, this, &MainWindow::Disconnected##number); \
44+
connect(tcpReceiver##number##_, &TCPReceiver::Connected, glWidget##number##_, &GLWidget::Connected, Qt::DirectConnection); \
45+
connect(tcpReceiver##number##_, &TCPReceiver::Disconnected, glWidget##number##_, &GLWidget::Disconnected, Qt::DirectConnection); \
46+
connect(tcpReceiver##number##_, &TCPReceiver::UpdateSliderTime, this, &MainWindow::UpdateSliderTime##number); \
47+
connect(tcpReceiver##number##_, &TCPReceiver::MessageSDReceived, osiparser##number##_, &OsiParser::ParseReceivedSDMessage, Qt::QueuedConnection); \
48+
connect(tcpReceiver##number##_, &TCPReceiver::MessageSVReceived, osiparser##number##_, &OsiParser::ParseReceivedSVMessage, Qt::QueuedConnection);
2849

2950

3051
MainWindow::MainWindow(QWidget *parent)
@@ -47,15 +68,15 @@ MainWindow::MainWindow(QWidget *parent)
4768
, ui_(new Ui::MainWindow)
4869

4970
, glWidget_(nullptr)
50-
, tcpReceiver_(new TCPReceiver())
71+
, tcpReceiver_(nullptr)
5172
, fmuReceiver_(new FMUReceiver())
52-
, reader_(new OsiReader(&config_.ch1DeltaDelay_, config_.ch1EnableSendOut_, config_.ch1SendOutPortNum_.toStdString(), config_.ch1FMUTxCheck_, config_.ch1LoadFMUTx_.toStdString()))
73+
, reader_(nullptr)
5374
, osiparser_(new OsiParser(config_))
5475

5576
, glWidget2_(nullptr)
56-
, tcpReceiver2_(new TCPReceiver())
77+
, tcpReceiver2_(nullptr)
5778
, fmuReceiver2_(new FMUReceiver())
58-
, reader2_(new OsiReader(&config_.ch2DeltaDelay_, config_.ch2EnableSendOut_, config_.ch2SendOutPortNum_.toStdString(), config_.ch2FMUTxCheck_, config_.ch2LoadFMUTx_.toStdString()))
79+
, reader2_(nullptr)
5980
, osiparser2_(new OsiParser(config_))
6081

6182
, colorWidgets_()
@@ -126,6 +147,22 @@ MainWindow::LocalUpdate()
126147

127148
MainWindow::~MainWindow()
128149
{
150+
if (isConnected2_)
151+
{
152+
tcpReceiver2_->DisconnectRequested();
153+
}
154+
if (isConnected_)
155+
{
156+
tcpReceiver_->DisconnectRequested();
157+
}
158+
if (isPlayed_)
159+
{
160+
reader_->StopReadFile();
161+
}
162+
if (isPlayed2_)
163+
{
164+
reader2_->StopReadFile();
165+
}
129166
// Call all deletes in reversed order!
130167
delete glWidget_;
131168
delete glWidget2_;
@@ -464,6 +501,8 @@ MainWindow::PlayPauseButtonClicked()
464501
LocalPlayPause2();
465502

466503
UpdateCombineChannelMenu();
504+
ui_->zmq_type_connect_1->setEnabled(false);
505+
ui_->zmq_type_playback_1->setEnabled(false);
467506
}
468507

469508
void
@@ -499,9 +538,9 @@ MainWindow::LocalPlayPause()
499538
Stop();
500539
Play();
501540

502-
ui_->hSlider->blockSignals(true);
503-
ui_->hSlider->setValue(0);
504-
ui_->hSlider->blockSignals(false);
541+
ui_->hSlider_->blockSignals(true);
542+
ui_->hSlider_->setValue(0);
543+
ui_->hSlider_->blockSignals(false);
505544
}
506545
else
507546
{
@@ -521,6 +560,8 @@ MainWindow::PlayPauseButtonClicked2()
521560
LocalPlayPause();
522561

523562
UpdateCombineChannelMenu();
563+
ui_->zmq_type_connect_2->setEnabled(false);
564+
ui_->zmq_type_playback_2->setEnabled(false);
524565
}
525566

526567
void
@@ -745,24 +786,7 @@ MainWindow::ConnectSignalsToSlots()
745786
connect(ui_->playPauseButton, &QToolButton::clicked, this, &MainWindow::PlayPauseButtonClicked);
746787
connect(ui_->playPauseButton_2, &QToolButton::clicked, this, &MainWindow::PlayPauseButtonClicked2);
747788

748-
// signals and slots related to connection status
749-
// If not queued, this signal will block the GUI. Same applies for Connect/Disconnect in TCPReceiver.
750-
connect(this, &MainWindow::ConnectRequested, tcpReceiver_, &TCPReceiver::ConnectRequested, Qt::QueuedConnection);
751-
connect(tcpReceiver_, &TCPReceiver::Connected, this, &MainWindow::Connected);
752-
connect(tcpReceiver_, &TCPReceiver::Disconnected, this, &MainWindow::Disconnected);
753-
connect(tcpReceiver_, &TCPReceiver::Connected, glWidget_, &GLWidget::Connected, Qt::DirectConnection);
754-
connect(tcpReceiver_, &TCPReceiver::Disconnected, glWidget_, &GLWidget::Disconnected, Qt::DirectConnection);
755-
756-
connect(tcpReceiver_, &TCPReceiver::UpdateSliderTime, this, &MainWindow::UpdateSliderTime);
757-
758-
connect(this, &MainWindow::ConnectRequested2, tcpReceiver2_, &TCPReceiver::ConnectRequested, Qt::QueuedConnection);
759-
connect(tcpReceiver2_, &TCPReceiver::Connected, this, &MainWindow::Connected2);
760-
connect(tcpReceiver2_, &TCPReceiver::Disconnected, this, &MainWindow::Disconnected2);
761-
connect(tcpReceiver2_, &TCPReceiver::Connected, glWidget2_, &GLWidget::Connected, Qt::DirectConnection);
762-
connect(tcpReceiver2_, &TCPReceiver::Disconnected, glWidget2_, &GLWidget::Disconnected, Qt::DirectConnection);
763-
764-
connect(tcpReceiver2_, &TCPReceiver::UpdateSliderTime, this, &MainWindow::UpdateSliderTime2);
765-
789+
// Signals and slots related to connection status of FMU
766790
connect(this, &MainWindow::FMUConnectRequested, fmuReceiver_, &FMUReceiver::ConnectRequested, Qt::QueuedConnection);
767791
connect(fmuReceiver_, &FMUReceiver::Connected, this, &MainWindow::Connected);
768792
connect(fmuReceiver_, &FMUReceiver::Disconnected, this, &MainWindow::Disconnected);
@@ -776,43 +800,13 @@ MainWindow::ConnectSignalsToSlots()
776800
connect(fmuReceiver2_, &FMUReceiver::Disconnected, this, &MainWindow::Disconnected2);
777801
connect(fmuReceiver2_, &FMUReceiver::Connected, glWidget2_, &GLWidget::Connected, Qt::DirectConnection);
778802
connect(fmuReceiver2_, &FMUReceiver::Disconnected, glWidget2_, &GLWidget::Disconnected, Qt::DirectConnection);
779-
780803
connect(fmuReceiver2_, &FMUReceiver::UpdateSliderTime, this, &MainWindow::UpdateSliderTime2);
781804

782-
connect(this, &MainWindow::StartPlaybackRequested, reader_, &OsiReader::StartReadFile, Qt::QueuedConnection);
783-
connect(reader_, &OsiReader::Connected, this, &MainWindow::Connected);
784-
connect(reader_, &OsiReader::Disconnected, this, &MainWindow::Disconnected);
785-
connect(reader_, &OsiReader::Connected, glWidget_, &GLWidget::Connected, Qt::DirectConnection);
786-
connect(reader_, &OsiReader::Disconnected, glWidget_, &GLWidget::Disconnected, Qt::DirectConnection);
787-
788-
connect(reader_, &OsiReader::UpdateSliderRange, this, &MainWindow::UpdateSliderRange);
789-
connect(reader_, &OsiReader::UpdateSliderValue, this, &MainWindow::UpdateSliderValue);
790-
791-
connect(this, &MainWindow::StartPlaybackRequested2, reader2_, &OsiReader::StartReadFile, Qt::QueuedConnection);
792-
connect(reader2_, &OsiReader::Connected, this, &MainWindow::Connected2);
793-
connect(reader2_, &OsiReader::Disconnected, this, &MainWindow::Disconnected2);
794-
connect(reader2_, &OsiReader::Connected, glWidget2_, &GLWidget::Connected, Qt::DirectConnection);
795-
connect(reader2_, &OsiReader::Disconnected, glWidget2_, &GLWidget::Disconnected, Qt::DirectConnection);
796-
797-
connect(reader2_, &OsiReader::UpdateSliderRange, this, &MainWindow::UpdateSliderRange2);
798-
connect(reader2_, &OsiReader::UpdateSliderValue, this, &MainWindow::UpdateSliderValue2);
799-
800-
//Main loop: receive(read) -> parse -> update objects
801-
connect(tcpReceiver_, &TCPReceiver::MessageSDReceived, osiparser_, &OsiParser::ParseReceivedSDMessage, Qt::QueuedConnection);
802-
connect(tcpReceiver_, &TCPReceiver::MessageSVReceived, osiparser_, &OsiParser::ParseReceivedSVMessage, Qt::QueuedConnection);
803-
connect(tcpReceiver2_, &TCPReceiver::MessageSDReceived, osiparser2_, &OsiParser::ParseReceivedSDMessage, Qt::QueuedConnection);
804-
connect(tcpReceiver2_, &TCPReceiver::MessageSVReceived, osiparser2_, &OsiParser::ParseReceivedSVMessage, Qt::QueuedConnection);
805-
806805
connect(fmuReceiver_, &FMUReceiver::MessageSDReceived, osiparser_, &OsiParser::ParseReceivedSDMessage, Qt::QueuedConnection);
807806
connect(fmuReceiver_, &FMUReceiver::MessageSVReceived, osiparser_, &OsiParser::ParseReceivedSVMessage, Qt::QueuedConnection);
808807
connect(fmuReceiver2_, &FMUReceiver::MessageSDReceived, osiparser2_, &OsiParser::ParseReceivedSDMessage, Qt::QueuedConnection);
809808
connect(fmuReceiver2_, &FMUReceiver::MessageSVReceived, osiparser2_, &OsiParser::ParseReceivedSVMessage, Qt::QueuedConnection);
810809

811-
connect(reader_, &OsiReader::MessageSDSendout, osiparser_, &OsiParser::ParseReceivedSDMessage, Qt::QueuedConnection);
812-
connect(reader_, &OsiReader::MessageSVSendout, osiparser_, &OsiParser::ParseReceivedSVMessage, Qt::QueuedConnection);
813-
connect(reader2_, &OsiReader::MessageSDSendout, osiparser2_, &OsiParser::ParseReceivedSDMessage, Qt::QueuedConnection);
814-
connect(reader2_, &OsiReader::MessageSVSendout, osiparser2_, &OsiParser::ParseReceivedSVMessage, Qt::QueuedConnection);
815-
816810
connect(osiparser_, &OsiParser::MessageParsed, glWidget_, &GLWidget::MessageParsed, Qt::QueuedConnection);
817811
connect(osiparser2_, &OsiParser::MessageParsed, glWidget2_, &GLWidget::MessageParsed, Qt::QueuedConnection);
818812

@@ -837,10 +831,6 @@ MainWindow::ConnectSignalsToSlots()
837831
connect(ui_->objectTree_2, &QTreeWidget::itemChanged, glWidget2_, &GLWidget::TreeItemChanged);
838832
connect(ui_->objectTree_2, &QTreeWidget::itemClicked, this, &MainWindow::ConnectDisplayObjectInformation2);
839833

840-
// slider
841-
connect(ui_->hSlider, &QSlider::valueChanged, reader_, &OsiReader::SliderValueChanged);
842-
connect(ui_->hSlider_2, &QSlider::valueChanged, reader2_, &OsiReader::SliderValueChanged);
843-
844834
//Tracking
845835
connect(glWidget_, &GLWidget::SetTrackingEnabled, this, &MainWindow::SetTrackingEnabled);
846836
connect(ui_->startStopTrackingButton, &QPushButton::clicked, glWidget_, &GLWidget::StartTracking);
@@ -882,6 +872,97 @@ MainWindow::ConnectSignalsToSlots()
882872
connect(ui_->dataType_2, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &MainWindow::CBDataTypeCon2);
883873
connect(ui_->playbackDataType_2, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &MainWindow::CBDataTypePlay2);
884874

875+
// ZMQ communication type (push/pull or pub/sub) connection
876+
connect(ui_->zmq_type_connect_1, static_cast<void (QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged), this, &MainWindow::CBZmqTypeChangeConnect1);
877+
connect(ui_->zmq_type_playback_1, static_cast<void (QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged), this, &MainWindow::CBZmqTypeChangePlayback1);
878+
879+
connect(ui_->zmq_type_connect_2, static_cast<void (QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged), this, &MainWindow::CBZmqTypeChangeConnect2);
880+
connect(ui_->zmq_type_playback_2, static_cast<void (QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged), this, &MainWindow::CBZmqTypeChangePlayback2);
881+
}
882+
883+
void
884+
MainWindow::CBZmqTypeChangeConnect1(const QString& type)
885+
{
886+
if (tcpReceiver_ != nullptr)
887+
{
888+
delete tcpReceiver_;
889+
}
890+
891+
if (type == "Push/Pull")
892+
{
893+
tcpReceiver_ = new TCPReceiver{ZMQ_PULL};
894+
}
895+
else if (type == "Pub/Sub")
896+
{
897+
tcpReceiver_ = new TCPReceiver{ZMQ_SUB};
898+
}
899+
900+
CONNECT_TCP_RECEIVER();
901+
UpdateGLWidgetMessageSource();
902+
}
903+
904+
void
905+
MainWindow::CBZmqTypeChangePlayback1(const QString& type)
906+
{
907+
if (reader_ != nullptr)
908+
{
909+
delete reader_;
910+
reader_ = nullptr;
911+
}
912+
913+
if (type == "Push/Pull")
914+
{
915+
reader_ = new OsiReader(&config_.ch1DeltaDelay_, config_.ch1EnableSendOut_, config_.ch1SendOutPortNum_.toStdString(), config_.ch1FMUTxCheck_, ZMQ_PUSH, config_.ch1LoadFMUTx_.toStdString());
916+
}
917+
else if (type == "Pub/Sub")
918+
{
919+
reader_ = new OsiReader(&config_.ch1DeltaDelay_, config_.ch1EnableSendOut_, config_.ch1SendOutPortNum_.toStdString(), config_.ch1FMUTxCheck_, ZMQ_PUB, config_.ch1LoadFMUTx_.toStdString());
920+
}
921+
922+
CONNECT_OSIREADER();
923+
UpdateGLWidgetMessageSource();
924+
}
925+
926+
void
927+
MainWindow::CBZmqTypeChangeConnect2(const QString& type)
928+
{
929+
if (tcpReceiver2_ != nullptr)
930+
{
931+
delete tcpReceiver2_;
932+
}
933+
934+
if (type == "Push/Pull")
935+
{
936+
tcpReceiver2_ = new TCPReceiver{ZMQ_PULL};
937+
}
938+
else if (type == "Pub/Sub")
939+
{
940+
tcpReceiver2_ = new TCPReceiver{ZMQ_SUB};
941+
}
942+
943+
CONNECT_TCP_RECEIVER(2);
944+
UpdateGLWidgetMessageSource2();
945+
}
946+
947+
void
948+
MainWindow::CBZmqTypeChangePlayback2(const QString& type)
949+
{
950+
if (reader2_ != nullptr)
951+
{
952+
delete reader2_;
953+
reader2_ = nullptr;
954+
}
955+
if (type == "Push/Pull")
956+
{
957+
reader2_ = new OsiReader(&config_.ch2DeltaDelay_, config_.ch2EnableSendOut_, config_.ch2SendOutPortNum_.toStdString(), config_.ch2FMUTxCheck_, ZMQ_PUSH, config_.ch2LoadFMUTx_.toStdString());
958+
}
959+
else if (type == "Pub/Sub")
960+
{
961+
reader2_ = new OsiReader(&config_.ch2DeltaDelay_, config_.ch2EnableSendOut_, config_.ch2SendOutPortNum_.toStdString(), config_.ch2FMUTxCheck_, ZMQ_PUB, config_.ch2LoadFMUTx_.toStdString());
962+
}
963+
964+
CONNECT_OSIREADER(2);
965+
UpdateGLWidgetMessageSource2();
885966
}
886967

887968
void
@@ -1013,7 +1094,7 @@ MainWindow::EnablePlaybackGroup2(bool enable)
10131094
void
10141095
MainWindow::EnableSlider(bool enable)
10151096
{
1016-
ui_->hSlider->setEnabled(enable);
1097+
ui_->hSlider_->setEnabled(enable);
10171098
}
10181099

10191100
void
@@ -1435,6 +1516,18 @@ MainWindow::InitComboBoxes()
14351516
ui_->playbackDataType->addItem("SensorData");
14361517
ui_->playbackDataType_2->addItem("SensorView");
14371518
ui_->playbackDataType_2->addItem("SensorData");
1519+
1520+
ui_->zmq_type_connect_1->addItem(zmqPushPull_);
1521+
ui_->zmq_type_connect_1->addItem("Pub/Sub");
1522+
1523+
ui_->zmq_type_playback_1->addItem(zmqPushPull_);
1524+
ui_->zmq_type_playback_1->addItem("Pub/Sub");
1525+
1526+
ui_->zmq_type_connect_2->addItem(zmqPushPull_);
1527+
ui_->zmq_type_connect_2->addItem("Pub/Sub");
1528+
1529+
ui_->zmq_type_playback_2->addItem(zmqPushPull_);
1530+
ui_->zmq_type_playback_2->addItem("Pub/Sub");
14381531
}
14391532

14401533
void
@@ -2026,7 +2119,7 @@ MainWindow::GetStringFromMilliSecond(int milliSec)
20262119
void
20272120
MainWindow::UpdateSliderRange(int sliderRange)
20282121
{
2029-
ui_->hSlider->setRange(0, sliderRange);
2122+
ui_->hSlider_->setRange(0, sliderRange);
20302123
ui_->hSliderTimeRange->setText(GetStringFromMilliSecond(sliderRange));
20312124
}
20322125

@@ -2040,9 +2133,9 @@ MainWindow::UpdateSliderRange2(int sliderRange)
20402133
void
20412134
MainWindow::UpdateSliderValue(int sliderValue)
20422135
{
2043-
ui_->hSlider->blockSignals(true);
2044-
ui_->hSlider->setValue(sliderValue);
2045-
ui_->hSlider->blockSignals(false);
2136+
ui_->hSlider_->blockSignals(true);
2137+
ui_->hSlider_->setValue(sliderValue);
2138+
ui_->hSlider_->blockSignals(false);
20462139
UpdateSliderTime(sliderValue);
20472140
}
20482141

0 commit comments

Comments
 (0)