summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Traut <manut@mecka.net>2012-06-08 00:26:15 +0200
committerManuel Traut <manut@mecka.net>2012-06-08 00:26:15 +0200
commit8f2ec041aafd8504c54f60ddc2ef1b0908dd7630 (patch)
treefb873037b3d78169f29b5a240d79b2dde6824300
parent297e389057b702bbeb99139a8c248cfccfc0724e (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.cpp176
-rw-r--r--common/distrio_helper.h21
-rw-r--r--devices/simple_dev/simple_dev.cpp28
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 {