summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--io/bin/generic_gpio/Makefile5
-rw-r--r--io/bin/generic_gpio/generic_gpio.cpp111
-rw-r--r--io/bin/generic_gpio/gpio.conf11
3 files changed, 94 insertions, 33 deletions
diff --git a/io/bin/generic_gpio/Makefile b/io/bin/generic_gpio/Makefile
index 0528035..4fc8bd2 100644
--- a/io/bin/generic_gpio/Makefile
+++ b/io/bin/generic_gpio/Makefile
@@ -13,9 +13,12 @@ LDFLAGS += -L$(DISTRIO_COMMON) -ldistrio_common \
-L$(DISTRIO_IO) -ldistrio_io \
-L$(DISTRIO_MANAGER) -ldistrio_manager \
-lACE -lTAO -lTAO_AnyTypeCode -lTAO_CosNaming -lTAO_PortableServer \
+ `pkg-config --libs libgpio` \
-L. -lini \
-lrt
-CFLAGS += -fPIC -I$(DISTRIO_COMMON) -I$(DISTRIO_IO) -I$(DISTRIO_MANAGER)
+CFLAGS += -fPIC -I$(DISTRIO_COMMON) -I$(DISTRIO_IO) -I$(DISTRIO_MANAGER) \
+ `pkg-config --cflags libgpio`
+
CXXFLAGS += $(CFLAGS)
DESTDIR := /usr
diff --git a/io/bin/generic_gpio/generic_gpio.cpp b/io/bin/generic_gpio/generic_gpio.cpp
index 35986ea..06b9f59 100644
--- a/io/bin/generic_gpio/generic_gpio.cpp
+++ b/io/bin/generic_gpio/generic_gpio.cpp
@@ -1,24 +1,56 @@
#include <distrio_helper.h>
#include <distrio_error.h>
-
#include <distrio_io.h>
#include <ace/Task.h>
#include <iostream>
+#include <gpio.h>
+
+#include "ini.h"
+
+#define MODULE_ID 1212
+
+static void err (const char *s)
+{
+ fprintf (stderr, s);
+}
-class My_digital : public Distrio_Digital_i {
+class GPIO : public Distrio_Digital_i {
public:
- My_digital (std::string io_name) : Distrio_Digital_i (io_name) { }
+ GPIO (std::string io_name, int value, ::Distrio::Direction dir) :
+ Distrio_Digital_i (io_name, dir) {
+ int ret = -1;
+ if (dir == ::Distrio::OUTPUT)
+ ret = gpio_open_dir (&p, value, GPIO_OUT);
+ if (dir == ::Distrio::INPUT)
+ ret = gpio_open_dir (&p, value, GPIO_IN);
+ if (ret) {
+ id(-1);
+ err ("open gpio failed\n");
+ } else
+ id(0);
+ }
::Distrio::Error *set () {
+
+ if (gpio_set_value (&p, GPIO_HIGH))
+ return distrio_error
+ (Distrio::E_NOTSUPPORTED, Distrio::L_NORMAL, MODULE_ID, "set gpio failed");
+
update_timestamp ();
val = 1;
std::cout << "set" << std::endl;
return distrio_success ();
+
}
::Distrio::Error *reset () {
+
+ if (gpio_set_value (&p, GPIO_LOW))
+ return distrio_error
+ (Distrio::E_NOTSUPPORTED, Distrio::L_NORMAL, MODULE_ID, "reset gpio failed");
+
update_timestamp ();
val = 0;
std::cout << "reset" << std::endl;
@@ -30,31 +62,28 @@ class My_digital : public Distrio_Digital_i {
std::cout << "get" << std::endl;
return distrio_success ();
}
-};
-
-class Io_simulator : public ACE_Task < ACE_MT_SYNCH > {
- public:
- Io_simulator (My_digital *_io) { io = _io; }
- ~Io_simulator () { }
-
private:
- My_digital *io;
-
- int svc (void) {
- while (1) {
- io->raise ();
- sleep (3);
- io->fall ();
- sleep (5);
- }
- }
+ gpio_pin p;
};
+
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
- int ret = 0;
- My_digital *digital;
- Io_simulator *sim;
+ int ret = 0, num = 0, i = 0;
+ std::list<GPIO *> io_list;
+ dictionary *d = _iniparser_load (GPIO_CONFIG);
+
+ if (!d) {
+ err ("load inifile failed\n");
+ return -EINVAL;
+ }
+
+ num = _iniparser_getnsec (d);
+
+ if (!num) {
+ err ("no gpios configured, check config\n");
+ return -ENOMEM;
+ }
if (init_corba (argc, argv))
return -EINVAL;
@@ -62,21 +91,39 @@ ACE_TMAIN (int argc, ACE_TCHAR *argv[])
if (run_orb ())
return -EINVAL;
- digital = new My_digital (std::string ("pin huhu"));
+ for (i = 0; i < num; i++) {
+ ::Distrio::Direction dir;
+ char *name = _iniparser_getsecname (d, i);
+ char *direction = _iniparser_getstring (d, "direction", "unknown");
+ int value = _iniparser_getint (d, "value", -1);
- if (register_digital (digital)) {
- ret = -EINVAL;
- goto out;
- }
+ if (strcmp (direction, "in") == 0)
+ dir = ::Distrio::INPUT;
+ else
+ dir = ::Distrio::OUTPUT;
- sim = new Io_simulator (digital);
+ GPIO *g = new GPIO (std::string (name), value, dir);
+
+ if (g->id () == -1) {
+ err ("create gpio object failed - hw error?\n");
+ delete g;
+ continue;
+ }
+
+ if (register_digital (g)) {
+ err ("register gpio object at the manager failed\n");
+ delete g;
+ continue;
+ }
+ std::cout << "registered gpio " << name <<" with id: " << g->id () << std::endl;
+ io_list.push_back (g);
+ }
- std::cout << "registered id: " << digital->id () << std::endl;
+ _iniparser_freedict (d);
- sim->activate ();
join_orb ();
out:
- free (digital);
+ /* io_list.erase (); */
return ret;
}
diff --git a/io/bin/generic_gpio/gpio.conf b/io/bin/generic_gpio/gpio.conf
new file mode 100644
index 0000000..2408983
--- /dev/null
+++ b/io/bin/generic_gpio/gpio.conf
@@ -0,0 +1,11 @@
+[0]
+ direction = out;
+ value = 1;
+
+[1]
+ direction = out;
+ value = 0;
+
+[332]
+ direction = out;
+ value = 0;