summaryrefslogtreecommitdiff
path: root/digital/ucoolib
diff options
context:
space:
mode:
Diffstat (limited to 'digital/ucoolib')
-rw-r--r--digital/ucoolib/ucoolib/hal/gpio/Module2
-rw-r--r--digital/ucoolib/ucoolib/hal/gpio/gpio.hh4
-rw-r--r--digital/ucoolib/ucoolib/hal/gpio/gpio.host.cc170
-rw-r--r--digital/ucoolib/ucoolib/hal/gpio/gpio.host.hh67
4 files changed, 241 insertions, 2 deletions
diff --git a/digital/ucoolib/ucoolib/hal/gpio/Module b/digital/ucoolib/ucoolib/hal/gpio/Module
index 34c77fd8..8f2ba40f 100644
--- a/digital/ucoolib/ucoolib/hal/gpio/Module
+++ b/digital/ucoolib/ucoolib/hal/gpio/Module
@@ -1 +1 @@
-hal_gpio_SOURCES = gpio.stm32f4.cc
+hal_gpio_SOURCES = gpio.host.cc gpio.stm32f4.cc
diff --git a/digital/ucoolib/ucoolib/hal/gpio/gpio.hh b/digital/ucoolib/ucoolib/hal/gpio/gpio.hh
index 721d6383..80ba4718 100644
--- a/digital/ucoolib/ucoolib/hal/gpio/gpio.hh
+++ b/digital/ucoolib/ucoolib/hal/gpio/gpio.hh
@@ -24,7 +24,9 @@
//
// }}}
-#ifdef TARGET_stm32f4
+#if defined (TARGET_host)
+# include "gpio.host.hh"
+#elif defined TARGET_stm32f4
# include "gpio.stm32f4.hh"
#else
# error "not implemented for this target"
diff --git a/digital/ucoolib/ucoolib/hal/gpio/gpio.host.cc b/digital/ucoolib/ucoolib/hal/gpio/gpio.host.cc
new file mode 100644
index 00000000..64ed7cb8
--- /dev/null
+++ b/digital/ucoolib/ucoolib/hal/gpio/gpio.host.cc
@@ -0,0 +1,170 @@
+// ucoolib - Microcontroller object oriented library. {{{
+//
+// Copyright (C) 2013 Nicolas Schodet
+//
+// APBTeam:
+// Web: http://apbteam.org/
+// Email: team AT apbteam DOT org
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// }}}
+#include "gpio.host.hh"
+
+#include <cstring>
+
+namespace ucoo {
+
+/// Shared context between instances.
+class GpioShared
+{
+ public:
+ /// Constructor, connect to mex node.
+ GpioShared (Host &host);
+ /// Register a new GPIO.
+ void register_instance (Host &host, Gpio &instance);
+ /// Set output state.
+ void set (Gpio &instance, bool state);
+ /// Set direction.
+ void output (Gpio &instance, bool output);
+ private:
+ /// Send state change message.
+ void send (Gpio &instance);
+ /// Handle input value from Mex.
+ void handle_gpio_input (mex::Msg &msg);
+ private:
+ Host &host_;
+ mex::Node &node_;
+ mex::mtype_t gpio_output_mtype_, gpio_input_mtype_;
+ typedef std::map<std::string, Gpio *> Instances;
+ Instances instances_;
+};
+
+GpioShared::GpioShared (Host &host)
+ : host_ (host), node_ (host.get_node ())
+{
+ std::string instance = host_.get_instance ();
+ gpio_output_mtype_ = node_.reserve (instance + ":gpio_out");
+ gpio_input_mtype_ = node_.reserve (instance + ":gpio_in");
+ node_.handler_register (gpio_input_mtype_, *this,
+ &GpioShared::handle_gpio_input);
+}
+
+void
+GpioShared::register_instance (Host &host, Gpio &instance)
+{
+ assert (&host == &host_);
+ std::pair<Instances::iterator, bool> r =
+ instances_.insert (Instances::value_type (instance.name_, &instance));
+ assert (r.second);
+}
+
+void
+GpioShared::set (Gpio &instance, bool state)
+{
+ if (state != instance.output_)
+ {
+ instance.output_ = state;
+ send (instance);
+ }
+}
+
+void
+GpioShared::output (Gpio &instance, bool output)
+{
+ if (output != instance.direction_output_)
+ {
+ instance.direction_output_ = output;
+ send (instance);
+ }
+}
+
+void
+GpioShared::send (Gpio &instance)
+{
+ mex::Msg msg (gpio_output_mtype_);
+ msg.push ("BB") << instance.direction_output_ << instance.output_;
+ msg.push (instance.name_, std::strlen (instance.name_));
+ node_.send (msg);
+}
+
+void
+GpioShared::handle_gpio_input (mex::Msg &msg)
+{
+ int input, namelen;
+ msg.pop ("B") >> input;
+ namelen = msg.len ();
+ std::string name (msg.pop (namelen), namelen);
+ Instances::iterator i = instances_.find (name);
+ assert (i != instances_.end ());
+ i->second->input_ = input;
+}
+
+GpioShared *Gpio::shared_;
+
+Gpio::Gpio (Host &host, const char *name)
+ : name_ (name), input_ (false), output_ (false), direction_output_ (false)
+{
+ if (!shared_)
+ {
+ static GpioShared shared (host);
+ shared_ = &shared;
+ }
+ shared_->register_instance (host, *this);
+}
+
+void
+Gpio::set ()
+{
+ shared_->set (*this, true);
+}
+
+void
+Gpio::reset ()
+{
+ shared_->set (*this, false);
+}
+
+void
+Gpio::set (bool state)
+{
+ shared_->set (*this, state);
+}
+
+void
+Gpio::toggle ()
+{
+ shared_->set (*this, !output_);
+}
+
+bool
+Gpio::get () const
+{
+ return input_;
+}
+
+void
+Gpio::input ()
+{
+ shared_->output (*this, false);
+}
+
+void
+Gpio::output ()
+{
+ shared_->output (*this, true);
+}
+
+} // namespace ucoo
diff --git a/digital/ucoolib/ucoolib/hal/gpio/gpio.host.hh b/digital/ucoolib/ucoolib/hal/gpio/gpio.host.hh
new file mode 100644
index 00000000..5e796797
--- /dev/null
+++ b/digital/ucoolib/ucoolib/hal/gpio/gpio.host.hh
@@ -0,0 +1,67 @@
+#ifndef ucoolib_hal_gpio_gpio_host_hh
+#define ucoolib_hal_gpio_gpio_host_hh
+// ucoolib - Microcontroller object oriented library. {{{
+//
+// Copyright (C) 2013 Nicolas Schodet
+//
+// APBTeam:
+// Web: http://apbteam.org/
+// Email: team AT apbteam DOT org
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// }}}
+#include "ucoolib/intf/io.hh"
+#include "ucoolib/arch/host/host.hh"
+
+namespace ucoo {
+
+class GpioShared;
+
+/// General purpose input/output on host.
+class Gpio : public Io
+{
+ public:
+ /// Initialise GPIO.
+ Gpio (Host &host, const char *name);
+ /// See Io::set.
+ void set ();
+ /// See Io::reset.
+ void reset ();
+ /// See Io::set.
+ void set (bool state);
+ /// See Io::toggle.
+ void toggle ();
+ /// See Io::get.
+ bool get () const;
+ /// See Io::input.
+ void input ();
+ /// See Io::output.
+ void output ();
+ private:
+ /// Name.
+ const char *name_;
+ /// Current input/output states.
+ bool input_, output_;
+ /// Current direction, true for output.
+ bool direction_output_;
+ /// Shared context.
+ static GpioShared *shared_;
+ friend class GpioShared;
+};
+
+} // namespace ucoo
+
+#endif // ucoolib_hal_gpio_gpio_host_hh