summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/distrio_helper.cpp35
-rw-r--r--common/distrio_helper.h2
-rw-r--r--devices/simple_dev/simple_dev.cpp3
-rw-r--r--manager/bin/distrio_manager.cpp24
4 files changed, 60 insertions, 4 deletions
diff --git a/common/distrio_helper.cpp b/common/distrio_helper.cpp
index aaf43c1..076719c 100644
--- a/common/distrio_helper.cpp
+++ b/common/distrio_helper.cpp
@@ -96,6 +96,41 @@ int register_digital (std::string _name, Distrio_Digital_i *digital)
return 0;
}
+Distrio::Digital_ptr lookup_digital (std::string _name)
+{
+ CORBA::Object_var obj;
+ Distrio::Digital_var ret;
+ Distrio::Digital_list_var dig_list;
+ Distrio::Error *e;
+
+ if (ref.init != ORB_RUNNING) {
+ std::cerr << "corba not initialized" << std::endl;
+ return NULL;
+ }
+
+ try {
+ e = ref.manager->digital (dig_list);
+ free (e);
+ } catch (CORBA::Exception &_e) {
+ std::cerr << "CORBA lookup digital io "<< _name <<" failed: "
+ << _e << std::endl;
+ return NULL;
+ }
+
+ for (unsigned int i = 0; i < dig_list->length (); i++) {
+ ::CORBA::String_var name;
+ Distrio::Error *e;
+ e = dig_list[i]->name (name);
+ free (e);
+ if (! _name.compare (name)) {
+ Distrio::Digital_ptr ptr = dig_list[i];
+ return ptr;
+ }
+ }
+
+ return NULL;
+}
+
int register_device (std::string _name, Distrio_Device_i *dev)
{
CosNaming::Name name;
diff --git a/common/distrio_helper.h b/common/distrio_helper.h
index e46b42f..3f96d93 100644
--- a/common/distrio_helper.h
+++ b/common/distrio_helper.h
@@ -43,6 +43,8 @@ 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);
+/** lookup a digital io by a common name at the manager */
+Distrio::Digital_ptr lookup_digital (std::string _name);
/** 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 */
diff --git a/devices/simple_dev/simple_dev.cpp b/devices/simple_dev/simple_dev.cpp
index eb2dfdd..8f2072f 100644
--- a/devices/simple_dev/simple_dev.cpp
+++ b/devices/simple_dev/simple_dev.cpp
@@ -23,6 +23,7 @@ int main (int argc, char **argv)
{
int ret = 0;
My_device *dev;
+ Distrio::Digital_ptr digital_io;
if (init_corba (argc, argv))
return -EINVAL;
@@ -39,6 +40,8 @@ int main (int argc, char **argv)
std::cout << "registered id: " << dev->id () << std::endl;
+ digital_io = lookup_digital ("pin huhu");
+
out:
free (dev);
return ret;
diff --git a/manager/bin/distrio_manager.cpp b/manager/bin/distrio_manager.cpp
index 345eff6..d9f2ea9 100644
--- a/manager/bin/distrio_manager.cpp
+++ b/manager/bin/distrio_manager.cpp
@@ -29,19 +29,26 @@ Distrio_Manager_i::~Distrio_Manager_i (void)
::Distrio::Error * Distrio_Manager_i::digital (
::Distrio::Digital_list_out io_list)
{
- io_list = &digital_list;
+ io_list->length (digital_list.length ());
+
+ for (unsigned int i = 0; i < digital_list.length (); i++)
+ io_list[i] = digital_list[i];
+
+ return distrio_success ();
}
::Distrio::Error * Distrio_Manager_i::analog (
::Distrio::Analog_list_out io_list)
{
io_list = &analog_list;
+ return distrio_success ();
}
::Distrio::Error * Distrio_Manager_i::device (
::Distrio::Device_list_out dev_list)
{
dev_list = &device_list;
+ return distrio_success ();
}
/* TODO: think about locking!!! */
@@ -66,9 +73,18 @@ Distrio_Manager_i::~Distrio_Manager_i (void)
::Distrio::Error * Distrio_Manager_i::register_io_analog (
::Distrio::Analog_ptr & io_ana)
{
- io_ana->id (new_id ());
- analog_list.length (digital_list.length () + 1);
- analog_list [analog_list.length () - 1] = io_ana;
+ Distrio::Analog_var analog;
+
+ try {
+ analog = Distrio::Analog::_narrow (io_ana);
+ analog->id (new_id ());
+ } catch (::CORBA::Exception *exc) {
+ std::cerr << "register analog io failed" << std::endl;
+ }
+ analog_list.length (analog_list.length () + 1);
+ analog_list [analog_list.length () - 1] = analog;
+
+ return distrio_success ();
}
::Distrio::Error * Distrio_Manager_i::register_io_device (