summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--digital/io-hub/src/common/output.c62
-rw-r--r--digital/io-hub/src/common/output.h59
-rw-r--r--digital/io-hub/src/common/output.host.c73
-rw-r--r--digital/io-hub/tools/io_hub/mex.py32
4 files changed, 225 insertions, 1 deletions
diff --git a/digital/io-hub/src/common/output.c b/digital/io-hub/src/common/output.c
new file mode 100644
index 00000000..d3518e7c
--- /dev/null
+++ b/digital/io-hub/src/common/output.c
@@ -0,0 +1,62 @@
+/* output.c */
+/* io-hub - Modular Input/Output. {{{
+ *
+ * Copyright (C) 2012 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 "common.h"
+#include "output.h"
+
+#include "simu.host.h"
+
+void
+output_init (void)
+{
+#define OUTPUT(io, init) do { \
+ if (init) IO_SET_ (io); \
+ IO_OUTPUT_ (io); \
+} while (0); // <- do not copy this code unless you know why!
+ OUTPUT_LIST
+#undef OUTPUT
+}
+
+void
+output_set (uint32_t set)
+{
+#define OUTPUT(io, init) do { \
+ if (set & 1ul) IO_SET_ (io); \
+ set >>= 1; \
+} while (0); // <- do not copy this code unless you know why!
+ OUTPUT_LIST
+#undef OUTPUT
+}
+
+void
+output_clear (uint32_t clear)
+{
+#define OUTPUT(io, init) do { \
+ if (clear & 1ul) IO_CLR_ (io); \
+ clear >>= 1; \
+} while (0); // <- do not copy this code unless you know why!
+ OUTPUT_LIST
+#undef OUTPUT
+}
+
diff --git a/digital/io-hub/src/common/output.h b/digital/io-hub/src/common/output.h
new file mode 100644
index 00000000..a4b7de18
--- /dev/null
+++ b/digital/io-hub/src/common/output.h
@@ -0,0 +1,59 @@
+#ifndef output_h
+#define output_h
+/* output.h */
+/* io-hub - Modular Input/Output. {{{
+ *
+ * Copyright (C) 2012 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 "simu.host.h"
+#include "io.h"
+
+#include "output_defs.h"
+
+/** To set an output, use IO_SET (OUTPUT_EXAMPLE) or to clear an output, use
+ * IO_CLR (OUTPUT_EXAMPLE). */
+
+/** Initialize output module. */
+void
+output_init (void);
+
+/** Set state of any number of output. */
+void
+output_set (uint32_t set);
+
+/** Clear state of any number of output. */
+void
+output_clear (uint32_t clear);
+
+#ifdef HOST
+
+/** On host, initialise host part. */
+void
+output_host_init (void);
+
+/** On host, update output state. */
+void
+output_host_update (void);
+
+#endif
+
+#endif /* output_h */
diff --git a/digital/io-hub/src/common/output.host.c b/digital/io-hub/src/common/output.host.c
new file mode 100644
index 00000000..5c2d7080
--- /dev/null
+++ b/digital/io-hub/src/common/output.host.c
@@ -0,0 +1,73 @@
+/* output.host.c */
+/* io-hub - Modular Input/Output. {{{
+ *
+ * Copyright (C) 2012 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 "common.h"
+#include "output.h"
+
+#include "modules/host/host.h"
+#include "modules/host/mex.h"
+
+/** Output context. */
+struct output_t
+{
+ /** Previous sent state. */
+ uint32_t previous;
+ /** Message type. */
+ uint8_t mtype;
+};
+
+/** Global context. */
+struct output_t output_global;
+#define ctx output_global
+
+void
+output_host_init (void)
+{
+ const char *mex_instance = host_get_instance ("io-hub0", 0);
+ ctx.mtype = mex_node_reservef ("%s:output", mex_instance);
+ ctx.previous = (uint32_t) -1;
+}
+
+void
+output_host_update (void)
+{
+ uint32_t new = 0, bit = 1;
+ /* Collect all output states. */
+#define OUTPUT(io, init) do { \
+ if (IO_PORT_ (io) & IO_BV_ (io)) \
+ new |= bit; \
+ bit <<= 1; \
+} while (0); // <- do not copy this code unless you know why!
+ OUTPUT_LIST
+#undef OUTPUT
+ /* If changed, sent it. */
+ if (ctx.previous != new)
+ {
+ mex_msg_t *m = mex_msg_new (ctx.mtype);
+ mex_msg_push (m, "L", new);
+ mex_node_send (m);
+ ctx.previous = new;
+ }
+}
+
diff --git a/digital/io-hub/tools/io_hub/mex.py b/digital/io-hub/tools/io_hub/mex.py
index a86a5b2d..dd383dbc 100644
--- a/digital/io-hub/tools/io_hub/mex.py
+++ b/digital/io-hub/tools/io_hub/mex.py
@@ -119,6 +119,32 @@ class Mex:
m.push ('L', self.contacts)
self.node.send (m)
+ class Output (Observable):
+ """Simple output.
+
+ - state: True (1) or False (0).
+
+ """
+
+ def __init__ (self):
+ Observable.__init__ (self)
+ self.state = None
+
+ class Pack:
+ """Handle reception of several output for one message."""
+
+ def __init__ (self, node, instance, list):
+ self.__list = list
+ node.register (instance + ':output', self.__handle)
+
+ def __handle (self, msg):
+ mask, = msg.pop ('L')
+ for index, output in enumerate (self.__list):
+ new = (False, True)[(mask >> index) & 1]
+ if new != output.state:
+ output.state = new
+ output.notify ()
+
class Codebar (Observable):
"""Codebar stub.
@@ -199,7 +225,7 @@ class Mex:
self.notify ()
def __init__ (self, node, instance = 'io-hub0',
- pwm_nb = 0, contact_nb = 0, codebar = False):
+ pwm_nb = 0, contact_nb = 0, output_nb = 0, codebar = False):
self.adc = tuple (self.ADC (node, instance, i) for i in range (0, ADC_NB))
if pwm_nb:
self.pwm = tuple (self.PWM () for i in range (0, pwm_nb))
@@ -208,6 +234,10 @@ class Mex:
self.__contact_pack = self.Contact.Pack (node, instance)
self.contact = tuple (self.Contact (self.__contact_pack, i)
for i in range (contact_nb))
+ if output_nb:
+ self.output = tuple (self.Output () for i in range (0, output_nb))
+ self.__output_pack = self.Output.Pack (node, instance,
+ self.output)
if codebar:
self.__codebar_pack = self.Codebar.Pack (node, instance)
self.codebar = tuple (self.Codebar (self.__codebar_pack, i)