diff options
| author | Manuel Traut <manut@mecka.net> | 2012-06-08 00:26:15 +0200 |
|---|---|---|
| committer | Manuel Traut <manut@mecka.net> | 2012-06-08 00:26:15 +0200 |
| commit | 8f2ec041aafd8504c54f60ddc2ef1b0908dd7630 (patch) | |
| tree | fb873037b3d78169f29b5a240d79b2dde6824300 | |
| parent | 297e389057b702bbeb99139a8c248cfccfc0724e (diff) | |
libdistrio_common: add helper for all lists
- get_list
- lookup_*
Signed-off-by: Manuel Traut <manut@mecka.net>
| -rw-r--r-- | common/distrio_helper.cpp | 176 | ||||
| -rw-r--r-- | common/distrio_helper.h | 21 | ||||
| -rw-r--r-- | devices/simple_dev/simple_dev.cpp | 28 |
3 files changed, 159 insertions, 66 deletions
diff --git a/common/distrio_helper.cpp b/common/distrio_helper.cpp index 362217d..1efa79f 100644 --- a/common/distrio_helper.cpp +++ b/common/distrio_helper.cpp @@ -6,6 +6,8 @@ #include <iostream> #include "distrio_helper.h" +static pthread_t orb_thread; + int init_corba (int argc, char **argv) { int ret = 0; @@ -56,6 +58,35 @@ out: return ret; } +void *orb_runner (void *args) +{ + try { + ref.poa_mgr = ref.poa->the_POAManager (); + ref.poa_mgr->activate (); + ref.orb->run (); + ref.orb->destroy (); + } catch (CORBA::Exception &e) { + std::cerr << "run CORBA orb failed: " << e << std::endl; + } +} + +int run_orb () +{ + if (ref.init != ORB_INIT) { + std::cerr << "corba not initialized or orb already running" << std::endl; + return -1; + } + + if (pthread_create (&orb_thread, NULL, orb_runner, NULL)) { + std::cerr << "create thread for corba orb failed" << std::endl; + return -1; + } + + ref.init = ORB_RUNNING; + + return 0; +} + int register_digital (Distrio_Digital_i *digital) { CosNaming::Name name; @@ -97,50 +128,48 @@ int register_digital (Distrio_Digital_i *digital) return 0; } -void get_digital_list (Distrio::Digital_list_var *dig_list) +int register_analog (Distrio_Analog_i *analog) { - CORBA::Object_var obj; + CosNaming::Name name; + CORBA::Object_var obj, manager_obj; + PortableServer::ObjectId_var oid; + Distrio::Analog_ptr ptr; Distrio::Error *e; if (ref.init != ORB_RUNNING) { std::cerr << "corba not initialized" << std::endl; - return; + return -1; } try { - e = ref.manager->digital (*dig_list); + oid = ref.poa->activate_object (analog); + obj = analog->_this (); + name.length (1); + e = analog->name (name[0].id); free (e); - } catch (CORBA::Exception &_e) { - std::cerr << "CORBA get digital list failed: " - << _e << std::endl; - } -} - -void lookup_digital (std::string _name, Distrio::Digital_list_var dig_list, - Distrio::Digital **ptr) -{ - if (ref.init != ORB_RUNNING) { - std::cerr << "corba not initialized" << std::endl; - return; + name[0].kind = CORBA::string_dup ("analog_io"); + ref.nc->rebind (name, obj.in ()); + } catch (CORBA::Exception &exc) { + std::cerr << "CORBA bind analog io at naming service failed: " + << exc << std::endl; + return -1; } - for (unsigned int i = 0; i < dig_list->length (); i++) { - ::CORBA::String_var name; - Distrio::Error *e; - - e = dig_list[i]->name (name); + try { + ptr = Distrio::Analog::_narrow (obj); + e = ref.manager->register_io_analog (ptr); + std::cout << e->description << std::endl; free (e); - - if (! _name.compare (name.in ())) { - *ptr = dig_list[i]; - (*ptr)->reset (); - std::cout << "yeah: " << *ptr << std::endl; - return; - } + } catch (CORBA::Exception &_e) { + std::cerr << "CORBA register analog io at distrio manager failed: " + << _e << std::endl; + return -1; } + + return 0; } -int register_device (std::string _name, Distrio_Device_i *dev) +int register_device (Distrio_Device_i *dev) { CosNaming::Name name; CORBA::Object_var obj, manager_obj; @@ -157,11 +186,12 @@ int register_device (std::string _name, Distrio_Device_i *dev) oid = ref.poa->activate_object (dev); obj = dev->_this (); name.length (1); - name[0].id = CORBA::string_dup (_name.c_str ()); + e = dev->name (name[0].id); + free (e); 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: " + std::cerr << "CORBA bind device at naming service failed: " << e << std::endl; return -1; } @@ -180,33 +210,83 @@ int register_device (std::string _name, Distrio_Device_i *dev) return 0; } -pthread_t orb_thread; +void get_analog_list (Distrio::Analog_list_var *ana_list) +{ + CORBA::Object_var obj; + Distrio::Error *e; + + if (ref.init != ORB_RUNNING) { + std::cerr << "corba not initialized" << std::endl; + return; + } -void *orb_runner (void *args) + try { + e = ref.manager->analog (*ana_list); + free (e); + } catch (CORBA::Exception &_e) { + std::cerr << "CORBA get digital list failed: " + << _e << std::endl; + } +} + +void get_digital_list (Distrio::Digital_list_var *dig_list) { + CORBA::Object_var obj; + Distrio::Error *e; + + if (ref.init != ORB_RUNNING) { + std::cerr << "corba not initialized" << std::endl; + return; + } + try { - ref.poa_mgr = ref.poa->the_POAManager (); - ref.poa_mgr->activate (); - ref.orb->run (); - ref.orb->destroy (); - } catch (CORBA::Exception &e) { - std::cerr << "run CORBA orb failed: " << e << std::endl; + e = ref.manager->digital (*dig_list); + free (e); + } catch (CORBA::Exception &_e) { + std::cerr << "CORBA get digital list failed: " + << _e << std::endl; } } -int run_orb () +void lookup_analog (std::string _name, Distrio::Analog_list_var ana_list, + Distrio::Analog **ptr) { - if (ref.init != ORB_INIT) { - std::cerr << "corba not initialized or orb already running" << std::endl; - return -1; + if (ref.init != ORB_RUNNING) { + std::cerr << "corba not initialized" << std::endl; + return; } - if (pthread_create (&orb_thread, NULL, orb_runner, NULL)) { - std::cerr << "create thread for corba orb failed" << std::endl; - return -1; + for (unsigned int i = 0; i < ana_list->length (); i++) { + ::CORBA::String_var name; + Distrio::Error *e; + + e = ana_list[i]->name (name); + free (e); + + if (! _name.compare (name.in ())) { + *ptr = ana_list[i]; + return; + } + } +} +void lookup_digital (std::string _name, Distrio::Digital_list_var dig_list, + Distrio::Digital **ptr) +{ + if (ref.init != ORB_RUNNING) { + std::cerr << "corba not initialized" << std::endl; + return; } - ref.init = ORB_RUNNING; + for (unsigned int i = 0; i < dig_list->length (); i++) { + ::CORBA::String_var name; + Distrio::Error *e; - return 0; + e = dig_list[i]->name (name); + free (e); + + if (! _name.compare (name.in ())) { + *ptr = dig_list[i]; + return; + } + } } diff --git a/common/distrio_helper.h b/common/distrio_helper.h index b4d2d55..0a571db 100644 --- a/common/distrio_helper.h +++ b/common/distrio_helper.h @@ -41,13 +41,24 @@ static corba_ref ref = { /** initialize corba orb - argc, argv as passed to main() */ int init_corba (int argc, char **argv); +/** run the orb - function starts orb in new thread and returns */ +int run_orb (void); + /** register a digital io with a common name at the naming service */ int register_digital (Distrio_Digital_i *digital); -/** lookup a digital io by a common name at the manager */ +/** register a analog io with a common name at the naming service */ +int register_analog (Distrio_Analog_i *analog); +/** register a device with a common name at the naming service */ +int register_device (Distrio_Device_i *dev); + +/* returns a list of all registered digital ios */ void get_digital_list (Distrio::Digital_list_var *dig_list); +/* returns a list of all registered analog ios */ +void get_analog_list (Distrio::Analog_list_var *ana_list); + +/** lookup a digital io by a common name at the manager */ void lookup_digital (std::string _name, Distrio::Digital_list_var dig_list, Distrio::Digital **ptr); -/** 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); +/** lookup a analog io by a common name at the manager */ +void lookup_analog (std::string _name, Distrio::Analog_list_var ana_list, + Distrio::Analog **ptr); diff --git a/devices/simple_dev/simple_dev.cpp b/devices/simple_dev/simple_dev.cpp index 6e57e94..01f62c2 100644 --- a/devices/simple_dev/simple_dev.cpp +++ b/devices/simple_dev/simple_dev.cpp @@ -7,19 +7,23 @@ class My_device : public Distrio_Device_i { public: - ::CORBA::Long id (void) - { - return my_id; + My_device (std::string name) { dev_name = name; } + ~My_device () { } + + ::CORBA::Long id (void) { + return dev_id; } - void id (::CORBA::Long id) - { - my_id = id; + void id (::CORBA::Long id) { + dev_id = id; + } + ::Distrio::Error *name (::CORBA::String_out _name) { + _name = ::CORBA::string_dup (dev_name.c_str ()); + return distrio_success (); } - ::Distrio::Digital_list_var digitals; - private: - ::CORBA::Long my_id; + std::string dev_name; + ::CORBA::Long dev_id; }; ACE_TMAIN (int argc, ACE_TCHAR *argv[]) @@ -34,9 +38,9 @@ ACE_TMAIN (int argc, ACE_TCHAR *argv[]) if (run_orb ()) return -EINVAL; - dev = new My_device (); + dev = new My_device ("simple_dev"); - if (register_device ("simpele device", dev)) { + if (register_device (dev)) { ret = -EINVAL; goto out; } @@ -46,8 +50,6 @@ ACE_TMAIN (int argc, ACE_TCHAR *argv[]) get_digital_list (&dev->digitals); lookup_digital ("pin huhu", dev->digitals, &digital_io); - std::cout << "digital io app: " << digital_io << std::endl; - while (1) { try { |
