Connecting an output port of one component with an input port of another component, where both components are distributed using the CORBA deployer application, deployer-corba.
This is your first XML file for component A. We tell that it runs as a Server and that it registers its name in the Naming Service. (See also Using CORBA and the CORBA transport reference manual for setting up naming services)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "cpf.dtd"> <properties> <struct name="ComponentA" type="HMI"> <simple name="Server" type="boolean"><value>1</value></simple> <simple name="UseNamingService" type="boolean"><value>1</value></simple> </struct> </properties>
Save this in component-a.xml and start it with: deployer-corba -s component-a.xml
This is your second XML file for component B. It has one port, cartesianPosition_desi. We add it to a connection, named cartesianPosition_desi_conn. Next, we declare a 'proxy' to Component A we created above, and we do the same for it's port, add it to the connection named cartesianPosition_desi_conn.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "cpf.dtd"> <properties> <struct name="ComponentB" type="Controller"> <struct name="Ports" type="PropertyBag"> <simple name="cartesianPosition_desi" type="string"> <value>cartesianPosition_desi_conn</value></simple> </struct> </struct> <!-- ComponentA is looked up using the 'CORBA' naming service --> <struct name="ComponentA" type="CORBA"> <!-- We add ports of A to the connection --> <struct name="Ports" type="PropertyBag"> <simple name="cartesianPosition" type="string"> <value>cartesianPosition_desi_conn</value></simple> </struct> </struct> </properties>
Save this file as component-b.xml and start it with deployer-corba -s component-b.xml
When component-b.xml is started, the port connections will be created. When ComponentA exits and re-starts, ComponentB will not notice this, and you'll need to restart the component-b xml file as well. Use a streaming based protocol (ROS, POSIX MQueue) in case you want to be more robust against such situations.
You can also form the connections in a third xml file, and make both components servers like this:
Starting ComponentA:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "cpf.dtd"> <properties> <struct name="ComponentA" type="HMI"> <simple name="Server" type="boolean"><value>1</value></simple> <simple name="UseNamingService" type="boolean"><value>1</value></simple> </struct> </properties>
Save this in component-a.xml and start it with: cdeployer -s component-a.xml
Starting ComponentB:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "cpf.dtd"> <properties> <struct name="ComponentB" type="Controller"> <simple name="Server" type="boolean"><value>1</value></simple> <simple name="UseNamingService" type="boolean"><value>1</value></simple> </struct> </properties>
Save this in component-b.xml and start it with: cdeployer -s component-b.xml
Creating two proxies, and the connection:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "cpf.dtd"> <properties> <!-- ComponentA is looked up using the 'CORBA' naming service --> <struct name="ComponentA" type="CORBA"> <!-- We add ports of A to the connection --> <struct name="Ports" type="PropertyBag"> <simple name="cartesianPosition" type="string"> <value>cartesianPosition_desi_conn</value></simple> </struct> </struct> <!-- ComponentB is looked up using the 'CORBA' naming service --> <struct name="ComponentB" type="CORBA"> <!-- We add ports of B to the connection --> <struct name="Ports" type="PropertyBag"> <simple name="cartesianPosition_desi" type="string"> <value>cartesianPosition_desi_conn</value></simple> </struct> </struct> </properties>
Save this in connect-components.xml and start it with: deployer-corba -s connect-components.xml
See deployer and CORBA related Toolchain Reference Manuals.