diff options
| -rw-r--r-- | common/distrio_helper.cpp | 35 | ||||
| -rw-r--r-- | common/distrio_helper.h | 2 | ||||
| -rw-r--r-- | devices/simple_dev/simple_dev.cpp | 3 | ||||
| -rw-r--r-- | manager/bin/distrio_manager.cpp | 24 |
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 ( |
