Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #define ORO_MEMORY_POOL
00023 #include <rtt/os/tlsf/tlsf.h>
00024
00025 #include <iostream>
00026 #include <rtt/OperationCaller.hpp>
00027 #include <rtt/Service.hpp>
00028 #include <transports/corba/DataFlowI.h>
00029 #include <rtt/transports/corba/RemotePorts.hpp>
00030 #include <transports/corba/ServiceC.h>
00031 #include <transports/corba/corba.h>
00032 #include <rtt/InputPort.hpp>
00033 #include <rtt/OutputPort.hpp>
00034 #include <rtt/TaskContext.hpp>
00035 #include <rtt/plugin/PluginLoader.hpp>
00036 #include <transports/corba/TaskContextServer.hpp>
00037 #include <transports/corba/TaskContextProxy.hpp>
00038 #include <string>
00039 #include <os/main.h>
00040 #include "operations_fixture.hpp"
00041 #include <fstream>
00042
00043 using namespace RTT;
00044 using namespace RTT::detail;
00045 using namespace std;
00046
00047 class TheServer : public TaskContext, public OperationsFixture
00048 {
00049 public:
00050
00051 InputPort<double> mi1;
00052 OutputPort<double> mo1;
00053 bool is_calling, is_sending;
00054 int cbcount;
00055
00056 TheServer(string name) : TaskContext(name), mi1("mi"), mo1("mo"), is_calling(false), is_sending(false), cbcount(0) {
00057 ports()->addEventPort( mi1 );
00058 ports()->addPort( mo1 );
00059 this->createOperationCallerFactories( this );
00060 ts = corba::TaskContextServer::Create( this, true );
00061 this->start();
00062 addOperation("callBackPeer", &TheServer::callBackPeer, this,ClientThread);
00063 addOperation("callBackPeerOwn", &TheServer::callBackPeer, this,OwnThread);
00064 }
00065 ~TheServer() {
00066 this->stop();
00067 }
00068
00069 void updateHook(){
00070 double d = 123456.789;
00071 mi1.read(d);
00072 mo1.write(d);
00073 }
00074
00075 corba::TaskContextServer* ts;
00076
00077 void callBackPeer(TaskContext* peer, string const& opname) {
00078 int count = ++cbcount;
00079 log(Info) << "Server executes callBackPeer():"<< count <<endlog();
00080 OperationCaller<void(TaskContext*, string const&)> op1 (peer->getOperation(opname), this->engine());
00081 if (!is_calling) {
00082 is_calling = true;
00083 log(Info) << "Server calls back peer:" << count << endlog();
00084 op1(this, "callBackPeerOwn");
00085 log(Info) << "Server finishes call back peer:" << count << endlog();
00086 }
00087
00088 if (!is_sending) {
00089 is_sending = true;
00090 log(Info) << "Server sends back peer:" << count << endlog();
00091 SendHandle<void(TaskContext*, string const&)> handle = op1.send(
00092 this, "callBackPeer");
00093 log(Info) << "Server finishes send back peer:" << count << endlog();
00094 }
00095 log(Info) << "Server finishes callBackPeer():" << count << endlog();
00096 }
00097
00098 };
00099
00100 int ORO_main(int argc, char** argv)
00101 {
00102 #ifdef OR_RT_MALLOC
00103 void* rtMem=0;
00104 size_t freeMem=0;
00105
00107 rtMem = malloc(BUILD_TEST_RT_MEM_POOL_SIZE);
00108 assert(0 != rtMem);
00109 freeMem = init_memory_pool(BUILD_TEST_RT_MEM_POOL_SIZE, rtMem);
00110 assert((size_t)-1 != freeMem);
00111 #endif
00112 corba::TaskContextProxy::InitOrb(argc,argv);
00113
00114 PluginLoader::Instance()->loadTypekits("../rtt");
00115
00116 #ifndef WIN32
00117 pid_t pid = getpid();
00118 std::ofstream pidfile("corba-ipc-server.pid");
00119 pidfile << pid << endl;
00120 pidfile.close();
00121 #endif
00122 {
00123 TheServer ctest1("peerRMC");
00124 TheServer ctest2("peerRM");
00125 TheServer ctest3("peerAM");
00126 TheServer ctest4("peerDFI");
00127 TheServer ctest5("peerPC");
00128 TheServer ctest6("peerPP");
00129 TheServer ctest7("peerDH");
00130 TheServer ctest8("peerBH");
00131 TheServer ctest9("peerRMCb");
00132
00133
00134 corba::TaskContextServer::RunOrb();
00135 }
00136
00137 corba::TaskContextProxy::DestroyOrb();
00138
00139 return 0;
00140 }