summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Traut <manut@mecka.net>2012-06-03 20:12:26 +0200
committerManuel Traut <manut@mecka.net>2012-06-03 20:12:26 +0200
commitf79ee1d59423488c3de89e97e3648515a9143b36 (patch)
tree93e4922283a5d03c1c559f48970317b8f50056f1
parent796c97ef8d5a437fff1edb5679b82db49806e576 (diff)
add simple_dev example
- registers device at the manager - fixup manager to enable device registration - extend distrio_helper to support device registration Signed-off-by: Manuel Traut <manut@mecka.net>
-rw-r--r--Makefile2
-rw-r--r--common/distrio_helper.cpp40
-rw-r--r--common/distrio_helper.h2
-rw-r--r--devices/Makefile12
-rw-r--r--devices/simple_dev/Makefile36
-rwxr-xr-xdevices/simple_dev/distrio_simple_devbin0 -> 42865 bytes
-rwxr-xr-xdevices/simple_dev/run.sh9
-rw-r--r--devices/simple_dev/simple_dev.cpp45
-rw-r--r--manager/bin/distrio_manager.cpp15
9 files changed, 157 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index 633f8a0..f86b6fc 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-MAKE_DIRECTORIES = common io manager generic_gpio
+MAKE_DIRECTORIES = common io manager generic_gpio devices
.PHONY: all
idl: $(MAKE_DIRECTORIES)
diff --git a/common/distrio_helper.cpp b/common/distrio_helper.cpp
index 2f49941..aaf43c1 100644
--- a/common/distrio_helper.cpp
+++ b/common/distrio_helper.cpp
@@ -96,6 +96,46 @@ int register_digital (std::string _name, Distrio_Digital_i *digital)
return 0;
}
+int register_device (std::string _name, Distrio_Device_i *dev)
+{
+ CosNaming::Name name;
+ CORBA::Object_var obj, manager_obj;
+ PortableServer::ObjectId_var oid;
+ Distrio::Device_ptr ptr;
+ Distrio::Error *e;
+
+ if (ref.init != ORB_RUNNING) {
+ std::cerr << "corba not initialized" << std::endl;
+ return -1;
+ }
+
+ try {
+ oid = ref.poa->activate_object (dev);
+ obj = dev->_this ();
+ name.length (1);
+ name[0].id = CORBA::string_dup (_name.c_str ());
+ name[0].kind = CORBA::string_dup ("devices");
+ ref.nc->rebind (name, obj.in ());
+ } catch (CORBA::Exception &e) {
+ std::cerr << "CORBA bind digital io at naming service failed: "
+ << e << std::endl;
+ return -1;
+ }
+
+ try {
+ ptr = Distrio::Device::_narrow (obj);
+ e = ref.manager->register_io_device (ptr);
+ std::cout << e->description << std::endl;
+ free (e);
+ } catch (CORBA::Exception &_e) {
+ std::cerr << "CORBA register device at distrio manager failed: "
+ << _e << std::endl;
+ return -1;
+ }
+
+ return 0;
+}
+
pthread_t orb_thread;
void *orb_runner (void *args)
diff --git a/common/distrio_helper.h b/common/distrio_helper.h
index da1e290..e46b42f 100644
--- a/common/distrio_helper.h
+++ b/common/distrio_helper.h
@@ -43,5 +43,7 @@ static corba_ref ref = {
int init_corba (int argc, char **argv);
/** register a digital io with a common name at the naming service */
int register_digital (std::string _name, Distrio_Digital_i *digital);
+/** register a device with a common name at the naming service */
+int register_device (std::string _name, Distrio_Device_i *dev);
/** run the orb - function blocks until orb shutdown */
int run_orb (void);
diff --git a/devices/Makefile b/devices/Makefile
new file mode 100644
index 0000000..9a8528b
--- /dev/null
+++ b/devices/Makefile
@@ -0,0 +1,12 @@
+MAKE_DIRECTORIES = simple_dev
+
+.PHONY: all
+idl: $(MAKE_DIRECTORIES)
+all: $(MAKE_DIRECTORIES)
+
+.PHONY: $(MAKE_DIRECTORIES)
+$(MAKE_DIRECTORIES):
+ @$(MAKE) --keep-going --directory=$@ $(MAKECMDGOALS)
+
+.PHONY: $(MAKECMDGOALS)
+$(MAKECMDGOALS): $(MAKE_DIRECTORIES)
diff --git a/devices/simple_dev/Makefile b/devices/simple_dev/Makefile
new file mode 100644
index 0000000..0d6e728
--- /dev/null
+++ b/devices/simple_dev/Makefile
@@ -0,0 +1,36 @@
+CC := $(CROSS_COMPILE)gcc
+CXX := $(CROSS_COMPILE)g++
+LD := $(CROSS_COMPILE)g++
+
+DISTRIO_MANAGER := ../../manager/lib
+DISTRIO_COMMON := ../../common
+DISTRIO_IO := ../../io
+
+LDFLAGS += -L$(DISTRIO_COMMON) -ldistrio_common \
+ -L$(DISTRIO_IO) -ldistrio_io \
+ -L$(DISTRIO_MANAGER) -ldistrio_manager \
+ -lrt -lACE -lTAO -lTAO_AnyTypeCode -lTAO_CosNaming -lTAO_PortableServer
+CFLAGS += -fPIC -I$(DISTRIO_COMMON) -I$(DISTRIO_IO) -I$(DISTRIO_MANAGER)
+CXXFLAGS += $(CFLAGS)
+
+DESTDIR := /usr
+
+COMPONENT = distrio_simple_dev
+EXEC = $(COMPONENT)
+OBJ = simple_dev.o
+
+all: $(OBJ)
+ $(LD) $(LDFLAGS) -o $(EXEC) $(OBJ)
+
+clean:
+ rm -f *.o
+ rm -f $(EXEC)
+
+install: all
+ cp -a $(EXEC) $(DESTDIR)/bin
+
+uninstall:
+ rm -f $(DESTDIR)/bin/$(EXEC)
+
+idl:
+ /bin/true
diff --git a/devices/simple_dev/distrio_simple_dev b/devices/simple_dev/distrio_simple_dev
new file mode 100755
index 0000000..2687132
--- /dev/null
+++ b/devices/simple_dev/distrio_simple_dev
Binary files differ
diff --git a/devices/simple_dev/run.sh b/devices/simple_dev/run.sh
new file mode 100755
index 0000000..6d38011
--- /dev/null
+++ b/devices/simple_dev/run.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+#
+# startup script for distrio simple device
+#
+# author: Manuel Traut <manut@mecka.net>
+
+LD_LIBRARY_PATH=../../io:../../common:../../manager/lib ./distrio_simple_dev \
+ -ORBInitRef NameService=corbaloc:iiop:localhost:12345/NameService \
+ $@
diff --git a/devices/simple_dev/simple_dev.cpp b/devices/simple_dev/simple_dev.cpp
new file mode 100644
index 0000000..eb2dfdd
--- /dev/null
+++ b/devices/simple_dev/simple_dev.cpp
@@ -0,0 +1,45 @@
+#include <distrio_helper.h>
+#include <distrio_error.h>
+
+#include <distrio_ioI.h>
+
+#include <iostream>
+
+class My_device : public Distrio_Device_i {
+ public:
+ ::CORBA::Long id (void)
+ {
+ return my_id;
+ }
+ void id (::CORBA::Long id)
+ {
+ my_id = id;
+ }
+ private:
+ ::CORBA::Long my_id;
+};
+
+int main (int argc, char **argv)
+{
+ int ret = 0;
+ My_device *dev;
+
+ if (init_corba (argc, argv))
+ return -EINVAL;
+
+ if (run_orb ())
+ return -EINVAL;
+
+ dev = new My_device ();
+
+ if (register_device ("simpele device", dev)) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ std::cout << "registered id: " << dev->id () << std::endl;
+
+out:
+ free (dev);
+ return ret;
+}
diff --git a/manager/bin/distrio_manager.cpp b/manager/bin/distrio_manager.cpp
index b808d89..345eff6 100644
--- a/manager/bin/distrio_manager.cpp
+++ b/manager/bin/distrio_manager.cpp
@@ -55,7 +55,7 @@ Distrio_Manager_i::~Distrio_Manager_i (void)
dig = Distrio::Digital::_narrow (io_digi);
dig->id (new_id ());
} catch (::CORBA::Exception *exc) {
- std::cerr << "register io failed" << std::endl;
+ std::cerr << "register digital io failed" << std::endl;
}
digital_list.length (digital_list.length () + 1);
digital_list [digital_list.length () - 1] = dig;
@@ -74,9 +74,18 @@ Distrio_Manager_i::~Distrio_Manager_i (void)
::Distrio::Error * Distrio_Manager_i::register_io_device (
::Distrio::Device_ptr & io_dev)
{
- io_dev->id (new_id ());
+ Distrio::Device_var dev;
+
+ try {
+ dev = Distrio::Device::_narrow (io_dev);
+ dev->id (new_id ());
+ } catch (::CORBA::Exception *exc) {
+ std::cerr << "register device failed" << std::endl;
+ }
device_list.length (device_list.length () + 1);
- device_list [device_list.length () - 1] = io_dev;
+ device_list [device_list.length () - 1] = dev;
+
+ return distrio_success ();
}
::Distrio::Error * Distrio_Manager_i::unregister_io_digital (