File: subscribertest.cpp

package info (click to toggle)
robotraconteur 1.2.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 101,380 kB
  • sloc: cpp: 1,149,268; cs: 87,653; java: 58,127; python: 26,897; ansic: 356; sh: 152; makefile: 90; xml: 51
file content (149 lines) | stat: -rw-r--r-- 5,252 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <RobotRaconteur.h>

#include "robotraconteur_generated.h"

using namespace RobotRaconteur;
using namespace std;
using namespace com::robotraconteur::testing::TestService1;
using namespace com::robotraconteur::testing::TestService2;
using namespace com::robotraconteur::testing::TestService3;

// TODO: Use GTest

void servicesubscription_connected(const RR_SHARED_PTR<ServiceSubscription>& sub,
                                   const ServiceSubscriptionClientID& noden, const RR_SHARED_PTR<RRObject>& obj)
{
    cout << "Subscription Connected: " << noden.NodeID.ToString() << ", " << noden.ServiceName << endl;
}

void servicesubscription_disconnected(const RR_SHARED_PTR<ServiceSubscription>& sub,
                                      const ServiceSubscriptionClientID& noden, const RR_SHARED_PTR<RRObject>& obj)
{
    cout << "Subscription Disconnected: " << noden.NodeID.ToString() << ", " << noden.ServiceName << endl;
}

void subscribertest_waitwire(RR_SHARED_PTR<WireSubscription<RR_INTRUSIVE_PTR<RobotRaconteur::RRArray<double> > > > w1)
{
    w1->WaitInValueValid();
    w1->WaitInValueValid();
}

void subscribertest_wirechanged(
    RR_SHARED_PTR<WireSubscription<RR_INTRUSIVE_PTR<RobotRaconteur::RRArray<double> > > > w1,
    const RR_INTRUSIVE_PTR<RobotRaconteur::RRArray<double> >& val, const TimeSpec& time)
{
    // cout << "Wire value: " << RRArrayToScalar(val) << endl;
}

void subscribertest_pipereceived(RR_SHARED_PTR<PipeSubscription<double> > p1)
{
    static int c = 0;

    double val;
    while (p1->TryReceivePacket(val))
    {
        c++;
        if (c > 10)
        {
            cout << "Pipe value: " << val << endl;
            c = 0;
        }
    }
}

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        cout << "Usage for subscribertest:  subscribertest servicetype" << endl;
        return -1;
    }

    string servicetype = string(argv[1]);
    // vector<string> schemes;
    // boost::split(schemes, argv[3], boost::is_from_range(',', ','));

    RobotRaconteurNode::s()->SetLogLevelFromEnvVariable();

    RR_SHARED_PTR<TcpTransport> t = RR_MAKE_SHARED<TcpTransport>();
    t->EnableNodeDiscoveryListening();
    RobotRaconteurNode::s()->RegisterTransport(t);

    RR_SHARED_PTR<LocalTransport> c2 = RR_MAKE_SHARED<LocalTransport>();
    c2->EnableNodeDiscoveryListening();
    RobotRaconteurNode::s()->RegisterTransport(c2);

    RR_SHARED_PTR<HardwareTransport> c5 = RR_MAKE_SHARED<HardwareTransport>();
    RobotRaconteurNode::s()->RegisterTransport(c5);

    RobotRaconteurNode::s()->RegisterServiceType(RR_MAKE_SHARED<com__robotraconteur__testing__TestService1Factory>());
    RobotRaconteurNode::s()->RegisterServiceType(RR_MAKE_SHARED<com__robotraconteur__testing__TestService2Factory>());

    std::vector<std::string> servicetypes;
    servicetypes.push_back(servicetype);
    RR_SHARED_PTR<ServiceSubscription> subscription = RobotRaconteurNode::s()->SubscribeServiceByType(servicetypes);

    subscription->AddClientConnectListener(servicesubscription_connected);
    subscription->AddClientDisconnectListener(servicesubscription_disconnected);

    RR_SHARED_PTR<WireSubscription<RR_INTRUSIVE_PTR<RobotRaconteur::RRArray<double> > > > broadcastwire =
        subscription->SubscribeWire<RR_INTRUSIVE_PTR<RobotRaconteur::RRArray<double> > >("broadcastwire");
    broadcastwire->AddWireValueChangedListener(subscribertest_wirechanged);

    RR_SHARED_PTR<WireSubscription<RR_INTRUSIVE_PTR<RobotRaconteur::RRArray<double> > > > w1 =
        subscription->SubscribeWire<RR_INTRUSIVE_PTR<RobotRaconteur::RRArray<double> > >("w1");

    RR_SHARED_PTR<PipeSubscription<double> > broadcastpipe =
        subscription->SubscribePipe<double>("broadcastpipe", "", 100);
    broadcastpipe->AddPipePacketReceivedListener(subscribertest_pipereceived);

    boost::thread t1(boost::bind(&subscribertest_waitwire, w1));

    boost::this_thread::sleep(boost::posix_time::seconds(10));

    std::map<ServiceSubscriptionClientID, RR_SHARED_PTR<RRObject> > clients = subscription->GetConnectedClients();
    typedef std::map<ServiceSubscriptionClientID, RR_SHARED_PTR<RRObject> >::value_type e_type;
    BOOST_FOREACH (e_type& e, clients)
    {
        cout << "Subscribed Node: " << e.first.NodeID.ToString() << " " << e.first.ServiceName << endl;
    }

    RR_INTRUSIVE_PTR<RobotRaconteur::RRArray<double> > w1_value;
    TimeSpec w1_time;
    broadcastwire->TryGetInValue(w1_value, &w1_time);
    broadcastwire->TryGetInValue(w1_value);

    broadcastwire->GetInValue(&w1_time);
    broadcastwire->GetInValue();

    double pipe_val;
    while (broadcastpipe->TryReceivePacket(pipe_val))
    {
        cout << "Got pipe value: " << pipe_val << endl;
    }

    if (w1_value)
    {
        cout << "broadcastwire: len=" << w1_value->size() << " [0]=" << (*w1_value)[0] << endl;
    }

    RR_SHARED_PTR<WireConnection<RR_INTRUSIVE_PTR<RRArray<double> > > > c;
    RR_INTRUSIVE_PTR<RRArray<double> > v;
    TimeSpec time;
    if (!broadcastwire->TryGetInValue(v, &time, &c))
    {
        cout << "Value not set" << endl;
    }

    cout << "Press enter to quit" << endl;

    getchar();

    subscription->Close();

    t1.join();

    RobotRaconteurNode::s()->Shutdown();

    return 0;
}