Revision control
Copy as Markdown
// Copyright (C) 2017 Ford Motor Company
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [simpleSwitch_rep]
class SimpleSwitch
{
PROP(bool currState=false);
SLOT(server_slot(bool clientState));
};
//! [simpleSwitch_rep]
//! [simpleSwitch_repsource_example1]
REPC_SOURCE = simpleswitch.rep
//! [simpleSwitch_repsource_example1]
//! [simpleSwitch_remoteobjectsadd_example1]
QT += remoteobjects
//! [simpleSwitch_remoteobjectsadd_example1]
//! [simpleSwitch_serverheader_example1]
#ifndef SIMPLESWITCH_H
#define SIMPLESWITCH_H
#include "rep_simpleswitch_source.h"
class SimpleSwitch : public SimpleSwitchSimpleSource
{
Q_OBJECT
public:
SimpleSwitch(QObject *parent = nullptr);
~SimpleSwitch();
void server_slot(bool clientState) override;
public Q_SLOTS:
void timeout_slot();
private:
QTimer *stateChangeTimer;
};
#endif
//! [simpleSwitch_serverheader_example1]
//! [simpleSwitch_serversource_example1]
#include "simpleswitch.h"
// constructor
SimpleSwitch::SimpleSwitch(QObject *parent) : SimpleSwitchSimpleSource(parent)
{
stateChangeTimer = new QTimer(this); // Initialize timer
QObject::connect(stateChangeTimer, &QTimer::timeout, this, &SimpleSwitch::timeout_slot); // connect timeout() signal from stateChangeTimer to timeout_slot() of simpleSwitch
stateChangeTimer->start(2000); // Start timer and set timout to 2 seconds
qDebug() << "Source Node Started";
}
//destructor
SimpleSwitch::~SimpleSwitch()
{
stateChangeTimer->stop();
}
void SimpleSwitch::server_slot(bool clientState)
{
qDebug() << "Replica state is " << clientState; // print switch state echoed back by client
}
void SimpleSwitch::timeout_slot()
{
// slot called on timer timeout
if (currState()) // check if current state is true, currState() is defined in repc generated rep_simpleswitch_source.h
setCurrState(false); // set state to false
else
setCurrState(true); // set state to true
qDebug() << "Source State is "<<currState();
}
//! [simpleSwitch_serversource_example1]
//! [simpleSwitch_serverhostnode_example1]
QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")));
//! [simpleSwitch_serverhostnode_example1]
//! [simpleSwitch_enableremoting_example1]
SimpleSwitch srcSwitch; // create simple switch
srcNode.enableRemoting(&srcSwitch); // enable remoting
//! [simpleSwitch_enableremoting_example1]
//! [simpleSwitch_servermaincpp_example1]
#include <QCoreApplication>
#include "simpleswitch.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SimpleSwitch srcSwitch; // create simple switch
// Create host node without Registry:
QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")));
srcNode.enableRemoting(&srcSwitch); // enable remoting/sharing
return a.exec();
}
//! [simpleSwitch_servermaincpp_example1]
//! [simpleSwitch_clientrep_example1]
REPC_REPLICA = simpleswitch.rep
//! [simpleSwitch_clientrep_example1]
//! [simpleSwitch_clientremotenode_example1]
QRemoteObjectNode repNode; // create remote object node
repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
//! [simpleSwitch_clientremotenode_example1]
//! [simpleSwitch_clientacquirereplica_example1]
QSharedPointer<SimpleSwitchReplica> ptr;
ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node
//! [simpleSwitch_clientacquirereplica_example1]
//! [simpleSwitch_clientheader_example1]
#ifndef _CLIENT_H
#define _CLIENT_H
#include <QObject>
#include <QSharedPointer>
#include "rep_simpleswitch_replica.h"
class Client : public QObject
{
Q_OBJECT
public:
Client(QSharedPointer<SimpleSwitchReplica> ptr);
~Client() override = default;
void initConnections();// Function to connect signals and slots of source and client
Q_SIGNALS:
void echoSwitchState(bool switchState);// this signal is connected with server_slot(..) on the source object and echoes back switch state received from source
public Q_SLOTS:
void recSwitchState_slot(bool); // slot to receive source state
private:
bool clientSwitchState; // holds received server switch state
QSharedPointer<SimpleSwitchReplica> reptr;// holds reference to replica
};
#endif
//! [simpleSwitch_clientheader_example1]
//! [simpleSwitch_clientcpp_example1]
#include "client.h"
// constructor
Client::Client(QSharedPointer<SimpleSwitchReplica> ptr) :
QObject(nullptr),reptr(ptr)
{
// Connect signal for replica initialized with initialization slot.
initConnections();
// We can connect to SimpleSwitchReplica Signals/Slots
// directly because our Replica was generated by repc.
}
void Client::initConnections()
{
// initialize connections between signals and slots
// connect source replica signal currStateChanged() with client's recSwitchState() slot to receive source's current state
QObject::connect(reptr.data(), &SimpleSwitchReplica::currStateChanged, this, &Client::recSwitchState_slot);
// connect client's echoSwitchState(..) signal with replica's server_slot(..) to echo back received state
QObject::connect(this, &Client::echoSwitchState, reptr.data(), &SimpleSwitchReplica::server_slot);
}
void Client::recSwitchState_slot(bool value)
{
qDebug() << "Received source state "<< value << reptr.data()->currState();
clientSwitchState = reptr.data()->currState();
Q_EMIT echoSwitchState(clientSwitchState); // Emit signal to echo received state back to server
}
//! [simpleSwitch_clientcpp_example1]
//! [simpleSwitch_clientmain_example1]
#include <QCoreApplication>
#include "client.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSharedPointer<SimpleSwitchReplica> ptr; // shared pointer to hold source replica
QRemoteObjectNode repNode; // create remote object node
repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node
Client rswitch(ptr); // create client switch object and pass reference of replica to it
return a.exec();
}
//! [simpleSwitch_clientmain_example1]
//! [simpleSwitch_dynamicclientnode_example2]
QRemoteObjectNode repNode; // create remote object node
repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
//! [simpleSwitch_dynamicclientnode_example2]
//! [simpleSwitch_dynamicclientacquirereplica_example2]
QSharedPointer<QRemoteObjectDynamicReplica> ptr; // shared pointer to hold replica
ptr.reset(repNode.acquire("SimpleSwitch")); // acquire replica of source from host node
//! [simpleSwitch_dynamicclientacquirereplica_example2]
//! [simpleSwitch_dynamicclientheader_example2]
#ifndef _DYNAMICCLIENT_H
#define _DYNAMICCLIENT_H
#include <QObject>
#include <QSharedPointer>
#include <QRemoteObjectNode>
#include <qremoteobjectdynamicreplica.h>
class DynamicClient : public QObject
{
Q_OBJECT
public:
DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr);
~DynamicClient() override = default;
Q_SIGNALS:
void echoSwitchState(bool switchState);// this signal is connected with server_slot(..) slot of source object and echoes back switch state received from source
public Q_SLOTS:
void recSwitchState_slot(bool); // Slot to receive source state
void initConnection_slot(); // Slot to connect signals/slot on replica initialization
private:
bool clientSwitchState; // holds received server switch state
QSharedPointer<QRemoteObjectDynamicReplica> reptr;// holds reference to replica
};
#endif
//! [simpleSwitch_dynamicclientheader_example2]
//! [simpleSwitch_dynamicclientcpp_example2]
#include "dynamicclient.h"
// constructor
DynamicClient::DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr)
: QObject(nullptr), clientSwitchState(false), reptr(ptr)
{
//connect signal for replica valid changed with signal slot initialization
QObject::connect(reptr.data(), &QRemoteObjectDynamicReplica::initialized, this,
&DynamicClient::initConnection_slot);
}
// Function to initialize connections between slots and signals
void DynamicClient::initConnection_slot()
{
// Connect source replica signal currStateChanged() with client's
// recSwitchState() slot to receive source's current state:
QObject::connect(reptr.data(), SIGNAL(currStateChanged(bool)), this,
SLOT(recSwitchState_slot(bool)));
// Connect client's echoSwitchState(..) signal with replica's
// server_slot(..) to echo back received state:
QObject::connect(this, SIGNAL(echoSwitchState(bool)), reptr.data(), SLOT(server_slot(bool)));
}
void DynamicClient::recSwitchState_slot(bool value)
{
// Use replica property to get "currState" from source:
clientSwitchState = reptr->property("currState").toBool();
qDebug() << "Received source state " << value << clientSwitchState;
// Emit signal to echo received state back to server:
Q_EMIT echoSwitchState(clientSwitchState);
}
//! [simpleSwitch_dynamicclientcpp_example2]
//! [simpleSwitch_dynamicclientmaincpp_example2]
#include <QCoreApplication>
#include "dynamicclient.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSharedPointer<QRemoteObjectDynamicReplica> ptr; // shared pointer to hold replica
QRemoteObjectNode repNode;
repNode.connectToNode(QUrl(QStringLiteral("local:replica")));
ptr.reset(repNode.acquireDynamic("SimpleSwitch")); // acquire replica of source from host node
DynamicClient rswitch(ptr); // create client switch object and pass replica reference to it
return a.exec();
}
//! [simpleSwitch_dynamicclientmaincpp_example2]
//! [simpleSwitch_registrymaincpp_example3]
#include <QCoreApplication>
#include "simpleswitch.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SimpleSwitch srcSwitch; // create SimpleSwitch
// Create node that hosts registry:
QRemoteObjectRegistryHost regNode(QUrl(QStringLiteral("local:registry")));
// Create node that will host source and connect to registry:
QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")),
QUrl(QStringLiteral("local:registry")));
// Note, you can add srcSwitch directly to regNode if desired.
// We use two Nodes here, as the regNode could easily be in a third process.
srcNode.enableRemoting(&srcSwitch); // enable remoting of source object
return a.exec();
}
//! [simpleSwitch_registrymaincpp_example3]
//! [simpleSwitch_registrydynamicclientmaincpp_example3]
QRemoteObjectNode repNode(QUrl(QStringLiteral("local:registry")));
//! [simpleSwitch_registrydynamicclientmaincpp_example3]