From 37bb283f17a455014cafd2f0b383ae72443b051a Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Tue, 12 Mar 2013 21:00:54 +0100 Subject: digital/ucoolib/ucoolib/hal/gpio: add host support --- digital/ucoolib/ucoolib/hal/gpio/Module | 2 +- digital/ucoolib/ucoolib/hal/gpio/gpio.hh | 4 +- digital/ucoolib/ucoolib/hal/gpio/gpio.host.cc | 170 ++++++++++++++++++++++++++ digital/ucoolib/ucoolib/hal/gpio/gpio.host.hh | 67 ++++++++++ 4 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 digital/ucoolib/ucoolib/hal/gpio/gpio.host.cc create mode 100644 digital/ucoolib/ucoolib/hal/gpio/gpio.host.hh (limited to 'digital/ucoolib') 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 + +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 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 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 -- cgit v1.2.3