diff options
| -rw-r--r-- | io/bin/generic_gpio/Makefile | 5 | ||||
| -rw-r--r-- | io/bin/generic_gpio/generic_gpio.cpp | 111 | ||||
| -rw-r--r-- | io/bin/generic_gpio/gpio.conf | 11 |
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; |
