Dans le programme principal (main) :
On enregistre le module (QrtiDDShandler) dans le contexte QML.
On charge la fenêtre principale (Main.qml).
...
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QGuiApplication::setApplicationName("rdv.dds");
QGuiApplication::setApplicationDisplayName("rdvDDS");
QGuiApplication::setApplicationVersion("1.0.0");
QGuiApplication::setWindowIcon(QIcon(":/img/logo.png"));
qmlRegisterType<QrtiDDShandler>("org.QrtiDDS", 1, 0, "QrtiDDShandler");
QQmlApplicationEngine engine;
QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreationFailed,
&app,
[]() { QCoreApplication::exit(-1); },
Qt::QueuedConnection);
engine.loadFromModule("rdv.dds", "Main");
return app.exec();
}
...
Dans la déclaration du module (QrtiDDShandler) :
On déclare le module (QrtiDDShandler) en tant que dérivé de la classe (QObject).
On crée la propriété (dataAccess) avec la méthode d'écriture (writeData) avec la méthode de lecture (readData) avec la méthode de notification (newRcvdDataAvailable).
...
class QrtiDDShandler : public QObject
{
Q_OBJECT
Q_PROPERTY(QString dataAccess WRITE writeData READ readData NOTIFY newRcvdDataAvailable)
void setUp_rtiDDS_handler();
public:
explicit QrtiDDShandler(QObject *parent = 0);
~QrtiDDShandler();
QString readData();
signals:
void newRcvdDataAvailable(QString data);
void newSendDataAvailable(QString data);
public slots:
void writeData(QString data);
void readListenerData(QString data);
private:
QrtiDDS * rtiDDS;
QrtiDDSlistener * rtiDDSlistener;
QString rtiDDSrcvBuffer;
};
...
Dans le constructeur (QrtiDDShandler) :
On exécute la méthode (setUp_rtiDDS_handler) du module (QrtiDDShandler).
...
QrtiDDShandler::QrtiDDShandler(QObject *parent)
: QObject(parent)
{
setUp_rtiDDS_handler();
}
...
Dans la méthode (setUp_rtiDDS_handler) :
On construit le module (rtiDDSlistener) de type (QrtiDDSlistener).
On construit le module (rtiDDS) de type (QrtiDDS).
On connecte le signal (newData) du module (QrtiDDSlistener) au slot (readListenerData) du module (QrtiDDShandler).
...
void QrtiDDShandler::setUp_rtiDDS_handler()
{
rtiDDSlistener = new QrtiDDSlistener(this);
rtiDDS = new QrtiDDS(this, rtiDDSlistener);
connect(rtiDDSlistener, SIGNAL(newData(QString)),
this, SLOT(readListenerData(QString)),
Qt::QueuedConnection);
}
...
Dans la méthode (writeData) :
On émet le signal (newSendDataAvailable) du module (QrtiDDShandler).
...
void QrtiDDShandler::writeData(QString data){
emit newSendDataAvailable(data);
}
...
Dans la méthode (readData) :
On exécute la variable (rtiDDSrcvBuffer) du module (QrtiDDShandler).
...
QString QrtiDDShandler::readData(){
return rtiDDSrcvBuffer;
}
...
Dans la méthode (readListenerData) :
On met à jour la variable (rtiDDSrcvBuffer) du module (QrtiDDShandler).
On émet le signal (newSendDataAvailable) du module (QrtiDDShandler).
...
void QrtiDDShandler::readListenerData(QString data) {
qDebug()<<__FUNCTION__<<__LINE__ << this << "recieved: " << data;
rtiDDSrcvBuffer = data;
emit newRcvdDataAvailable(data);
}
...
Dans la déclaration du module (QrtiDDSlistener) :
On déclare le module (QrtiDDSlistener) en tant que dérivé des classe (QObject, DDSDataReaderListener).
...
class QrtiDDSlistener : public QObject, public DDSDataReaderListener
{
Q_OBJECT
public:
explicit QrtiDDSlistener(QObject *parent);
signals:
void newData(QString data);
private:
void on_data_available(DDSDataReader *reader);
};
...
Dans le constructeur (QrtiDDSlistener) :
...
QrtiDDSlistener::QrtiDDSlistener(QObject *parent)
: QObject(parent)
{}
...
Dans la méthode (on_data_available) :
On rentre dans une boucle infinie.
On exécute la méthode (take_next_sample) du module (string_reader) de type (DDSStringDataReader) pour retourner le code (retcode) de type (DDS_ReturnCode_t).
On casse la boucle si le code (retcode) de type (DDS_ReturnCode_t) est égale à (DDS_RETCODE_NO_DATA).
On retourne de la méthode si le code (retcode) de type (DDS_ReturnCode_t) est différent de (DDS_RETCODE_OK).
On émet le signal (newData) du module (QrtiDDSlistener) si la variable (valid_data) de l'objet (info) de type (DDS_SampleInfo) est (Vraie).
...
void QrtiDDSlistener::on_data_available(DDSDataReader *reader) {
DDSStringDataReader * string_reader = NULL;
char sample[MAX_STRING_SIZE];
DDS_SampleInfo info;
DDS_ReturnCode_t retcode;
/* Perform a safe type-cast from a generic data reader into a
* specific data reader for the type "DDS::String"
*/
string_reader = DDSStringDataReader::narrow(reader);
if (string_reader == NULL) {
/* In this specific case, this will never fail */
qDebug()<<__FUNCTION__<<__LINE__ << "DDSStringDataReader::narrow failed.";
return;
}
/* Loop until there are messages available in the queue */
char *ptr_sample = &sample[0];
for(;;) {
retcode = string_reader->take_next_sample(
ptr_sample,
info);
if (retcode == DDS_RETCODE_NO_DATA) {
/* No more samples */
break;
} else if (retcode != DDS_RETCODE_OK) {
qDebug()<<__FUNCTION__<<__LINE__ << "Unable to take data from data reader, error " << retcode;
return;
}
if (info.valid_data) {
// Valid (this isn't just a lifecycle sample): print it
emit newData(sample);
if(strlen(sample) == 0){
shutdown_flag = DDS_BOOLEAN_TRUE;
}
}
}
}
...
Dans la déclaration du module (QrtiDDS) :
On déclare le module (QrtiDDS) en tant que dérivé de la classe (QObject).
...
class QrtiDDS : public QObject
{
Q_OBJECT
public:
explicit QrtiDDS(QObject *parent, QrtiDDSlistener *rtiDDSlistener);
~QrtiDDS();
DDSDomainParticipant * participant;
DDSTopic * topic;
DDSDataWriter * data_writer;
DDSDataReader * data_reader;
DDSStringDataWriter * string_writer;
DDS_ReturnCode_t retcode;
QrtiDDSlistener * rtiDDSlistener;
char sample[MAX_STRING_SIZE];
int main_result;
public slots:
void publishDDS(QString data);
private:
int setupQrtiDDS();
};
...
Dans le constructeur (QrtiDDS) :
On exécute la méthode (setupQrtiDDS) du module (QrtiDDS).
...
QrtiDDS::QrtiDDS(QObject *parent, QrtiDDSlistener *listener)
: QObject(parent)
{
DDSDomainParticipant * participant = NULL;
DDSTopic * topic = NULL;
DDSDataWriter * data_writer = NULL;
DDSDataReader * data_reader = NULL;
DDSStringDataWriter * string_writer = NULL;
rtiDDSlistener = listener;
int success = setupQrtiDDS();
if (success != 0)
{
qDebug()<<__FUNCTION__<<__LINE__ << "Couldn't setup DDS Objects";
}
}
...
Dans la méthode (setupQrtiDDS) :
On exécute la méthode (create_participant) du module (DDSDomainParticipantFactory) pour construire le module (participant) de type (DDSDomainParticipant).
On exécute la méthode (create_topic) du module (participant) de type (DDSDomainParticipant) pour construire le module (topic) de type (DDSTopic).
On exécute la méthode (create_datawriter) du module (participant) de type (DDSDomainParticipant) pour construire le module (data_writer) de type (DDSDataWriter).
On exécute la méthode (create_datareader) du module (participant) de type (DDSDomainParticipant) pour construire le module (data_reader) de type (DDSDataReader).
On exécute la méthode (narrow) du module (DDSStringDataWriter) pour construire le module (string_writer) de type (DDSStringDataWriter).
On connecte le signal (newSendDataAvailable) du module (QrtiDDShandler) au slot (publishDDS) du module (QrtiDDS).
...
int QrtiDDS::setupQrtiDDS()
{
participant = DDSDomainParticipantFactory::get_instance()->
create_participant(
0, /* Domain ID */
DDS_PARTICIPANT_QOS_DEFAULT, /* QoS */
NULL, /* Listener */
DDS_STATUS_MASK_NONE);
if (participant == NULL) {
qDebug()<<__FUNCTION__<<__LINE__ << "Unable to create domain participant.";
return 1;
}
/* Create the topic "Hello, World" for the String type */
topic = participant->create_topic(
"Qt rti DDS", /* Topic name*/
DDSStringTypeSupport::get_type_name(), /* Type name */
DDS_TOPIC_QOS_DEFAULT, /* Topic QoS */
NULL, /* Listener */
DDS_STATUS_MASK_NONE);
if (topic == NULL) {
qDebug()<<__FUNCTION__<<__LINE__ << "Unable to create topic." ;
return 1;
}
/* Create the data writer using the default publisher */
data_writer = participant->create_datawriter(
topic,
DDS_DATAWRITER_QOS_DEFAULT, /* QoS */
NULL, /* Listener */
DDS_STATUS_MASK_NONE);
if (data_writer == NULL) {
qDebug()<<__FUNCTION__<<__LINE__ << "Unable to create data writer.";
return 1;
}
data_reader = participant->create_datareader(
topic,
DDS_DATAREADER_QOS_DEFAULT, /* QoS */
rtiDDSlistener, /* Listener */
DDS_DATA_AVAILABLE_STATUS);
if (data_reader == NULL) {
qDebug()<<__FUNCTION__<<__LINE__ << "Unable to create data reader.";
return 1;
}
string_writer = DDSStringDataWriter::narrow(data_writer);
if (string_writer == NULL) {
/* In this specific case, this will never fail */
qDebug()<<__FUNCTION__<<__LINE__ << "DDS_StringDataWriter_narrow failed.";
}
connect(parent(), SIGNAL(newSendDataAvailable(QString)), this, SLOT(publishDDS(QString)));
return 0;
}
...
Dans la méthode (publishDDS) :
On exécute la méthode (write) du module (string_writer) de type (DDSStringDataWriter).
...
void QrtiDDS::publishDDS(QString data){
string_writer->write(data.toUtf8().constData(), DDS_HANDLE_NIL);
qDebug()<<__FUNCTION__<<__LINE__ << this << "sent: " << data;
}
...