diff options
| author | Manuel Traut <manut@mecka.net> | 2012-06-03 20:12:26 +0200 |
|---|---|---|
| committer | Manuel Traut <manut@mecka.net> | 2012-06-03 20:12:26 +0200 |
| commit | f79ee1d59423488c3de89e97e3648515a9143b36 (patch) | |
| tree | 93e4922283a5d03c1c559f48970317b8f50056f1 | |
| parent | 796c97ef8d5a437fff1edb5679b82db49806e576 (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-- | Makefile | 2 | ||||
| -rw-r--r-- | common/distrio_helper.cpp | 40 | ||||
| -rw-r--r-- | common/distrio_helper.h | 2 | ||||
| -rw-r--r-- | devices/Makefile | 12 | ||||
| -rw-r--r-- | devices/simple_dev/Makefile | 36 | ||||
| -rwxr-xr-x | devices/simple_dev/distrio_simple_dev | bin | 0 -> 42865 bytes | |||
| -rwxr-xr-x | devices/simple_dev/run.sh | 9 | ||||
| -rw-r--r-- | devices/simple_dev/simple_dev.cpp | 45 | ||||
| -rw-r--r-- | manager/bin/distrio_manager.cpp | 15 |
9 files changed, 157 insertions, 4 deletions
@@ -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 Binary files differnew file mode 100755 index 0000000..2687132 --- /dev/null +++ b/devices/simple_dev/distrio_simple_dev 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 ( |
