diff options
Diffstat (limited to 'quellcode/versuch2/ESSupplier.cpp')
| -rwxr-xr-x | quellcode/versuch2/ESSupplier.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/quellcode/versuch2/ESSupplier.cpp b/quellcode/versuch2/ESSupplier.cpp new file mode 100755 index 0000000..3099bac --- /dev/null +++ b/quellcode/versuch2/ESSupplier.cpp @@ -0,0 +1,106 @@ + + +#include <orbsvcs/RtecEventCommC.h> +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> + +#include <unistd.h> +#include "cpx.h" + +const RtecEventComm::EventSourceID MY_SOURCE_ID = ACE_ES_EVENT_SOURCE_ANY + 1; +const RtecEventComm::EventType MY_EVENT_TYPE = ACE_ES_EVENT_UNDEFINED + 1; + +CPX cpx; + +RtecEventChannelAdmin::ProxyPushConsumer_var consumer; + +#include "CPXEventSupplier_i.h" + +void sigproc(int signo){ + + signal(SIGRTMIN+29, sigproc); + int eventData = cpx.get(1); + + // Eventset initialisieren + RtecEventComm::EventSet events(1); + events.length(1); + + events[0].header.source = MY_SOURCE_ID; + events[0].header.type = MY_EVENT_TYPE; + + events[0].data.any_value <<= eventData; + consumer->push(events); + + /* + if(eventData>0) events[0].data.any_value <<= 1; + else events[0].data.any_value <<= 255; + + consumer->push(events); + + if(rand() < 1626276121){ + events[0].header.source = MY_SOURCE_ID; + events[0].header.type = MY_EVENT_TYPE+1; + if(eventData>0) events[0].data.any_value <<= 2; + else events[0].data.any_value <<= 255; + consumer->push(events); + } + */ + +} + +int main(int argc, char* argv[]){ + + struct sched_param schedparam; + schedparam.sched_priority = 99; + if (sched_setscheduler(0, SCHED_FIFO, &schedparam) != 0) { + fprintf(stderr, "%s: PID %d: sched_setscheduler() failed errno = %d\n", __FUNCTION__, getpid(), errno); + } + + signal(SIGRTMIN+29, sigproc); + + try{ + // initialize ORB + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "ClientORB"); + std::cout<<"ORB ok"<<std::endl; + + // NamingService + CORBA::Object_var namingObject = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var namingContext = CosNaming::NamingContextExt::_narrow(namingObject.in()); + std::cout<<"NamingService ok"<<std::endl; + + // Get EventService + CORBA::Object_var esObj = namingContext->resolve_str("EventService"); + RtecEventChannelAdmin::EventChannel_var ec = RtecEventChannelAdmin::EventChannel::_narrow(esObj.in()); + if(CORBA::is_nil(ec.in())){ + std::cout<<"couldn't connect to EventService\n"; + return 1; + } + RtecEventChannelAdmin::SupplierAdmin_var admin = ec->for_suppliers(); + consumer = admin->obtain_push_consumer(); + + // Instantiate and register servant + CPXEventSupplier_i servant(orb.in()); + + CORBA::Object_var poaObj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(poaObj.in()); + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var supplierObj = poa->id_to_reference(oid.in()); + RtecEventComm::PushSupplier_var supplier = RtecEventComm::PushSupplier::_narrow(supplierObj.in()); + + ACE_SupplierQOS_Factory qos; + qos.insert(MY_SOURCE_ID, MY_EVENT_TYPE, 0 /*rt_info structure*/, 1 /*number of calls*/); + + // connect as supplier + consumer->connect_push_supplier(supplier.in(), qos.get_SupplierQOS()); + + while(true) pause(); + + }catch(CORBA::Exception &any){ + // std::cout<<"Exception occured: "<<any<<std::endl; + } + return 0; +} |
