// 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 "< #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 ptr; ptr.reset(repNode.acquire()); // acquire replica of source from host node //! [simpleSwitch_clientacquirereplica_example1] //! [simpleSwitch_clientheader_example1] #ifndef _CLIENT_H #define _CLIENT_H #include #include #include "rep_simpleswitch_replica.h" class Client : public QObject { Q_OBJECT public: Client(QSharedPointer 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 reptr;// holds reference to replica }; #endif //! [simpleSwitch_clientheader_example1] //! [simpleSwitch_clientcpp_example1] #include "client.h" // constructor Client::Client(QSharedPointer 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 #include "client.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSharedPointer 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()); // 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 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 #include #include #include class DynamicClient : public QObject { Q_OBJECT public: DynamicClient(QSharedPointer 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 reptr;// holds reference to replica }; #endif //! [simpleSwitch_dynamicclientheader_example2] //! [simpleSwitch_dynamicclientcpp_example2] #include "dynamicclient.h" // constructor DynamicClient::DynamicClient(QSharedPointer 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 #include "dynamicclient.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSharedPointer 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 #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]