summaryrefslogtreecommitdiffhomepage
path: root/digital/io-hub/src
diff options
context:
space:
mode:
authorNicolas Schodet2012-03-27 01:01:19 +0200
committerNicolas Schodet2012-03-27 01:01:19 +0200
commitf4de6d5292e305e2729687e345f5c2d97121652d (patch)
tree7c0159f6dbe38872c9795641824dd99d62e82cff /digital/io-hub/src
parent7162375903ecb117fb0e9bbd2b5fe20d1f96a81c (diff)
digital/io-hub: add output support
Diffstat (limited to 'digital/io-hub/src')
-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
3 files changed, 194 insertions, 0 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;
+ }
+}
+