summaryrefslogtreecommitdiff
path: root/digital/io-hub/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'digital/io-hub/src/common')
-rw-r--r--digital/io-hub/src/common/output.c28
-rw-r--r--digital/io-hub/src/common/output.h9
-rw-r--r--digital/io-hub/src/common/output.host.c8
3 files changed, 41 insertions, 4 deletions
diff --git a/digital/io-hub/src/common/output.c b/digital/io-hub/src/common/output.c
index 4f3dbf3b..2e2c604b 100644
--- a/digital/io-hub/src/common/output.c
+++ b/digital/io-hub/src/common/output.c
@@ -27,6 +27,19 @@
#include "simu.host.h"
+/** Output context. */
+struct output_t
+{
+ /** If not zero, toggle outputs after this number of update. */
+ uint16_t transient_duration;
+ /** Mask for transient toggle. */
+ uint32_t transient_mask;
+};
+
+/** Global context. */
+static struct output_t output_global;
+#define ctx output_global
+
void
output_init (void)
{
@@ -71,3 +84,18 @@ output_toggle (uint32_t toggle)
#undef OUTPUT
}
+void
+output_toggle_transient (uint32_t toggle, uint16_t duration)
+{
+ output_toggle (toggle);
+ ctx.transient_mask = toggle;
+ ctx.transient_duration = duration;
+}
+
+void
+output_update (void)
+{
+ if (ctx.transient_duration && !--ctx.transient_duration)
+ output_toggle (ctx.transient_mask);
+}
+
diff --git a/digital/io-hub/src/common/output.h b/digital/io-hub/src/common/output.h
index ab5e617c..3b508be2 100644
--- a/digital/io-hub/src/common/output.h
+++ b/digital/io-hub/src/common/output.h
@@ -48,6 +48,15 @@ output_clear (uint32_t clear);
void
output_toggle (uint32_t toggle);
+/** Toggle state of any number of output, then toggle again after a number of
+ * update. */
+void
+output_toggle_transient (uint32_t toggle, uint16_t duration);
+
+/** Update internal state, used for transient toggles. */
+void
+output_update (void);
+
#ifdef HOST
/** On host, initialise host part. */
diff --git a/digital/io-hub/src/common/output.host.c b/digital/io-hub/src/common/output.host.c
index 5c2d7080..a90bb2e3 100644
--- a/digital/io-hub/src/common/output.host.c
+++ b/digital/io-hub/src/common/output.host.c
@@ -28,8 +28,8 @@
#include "modules/host/host.h"
#include "modules/host/mex.h"
-/** Output context. */
-struct output_t
+/** Host output context. */
+struct output_host_t
{
/** Previous sent state. */
uint32_t previous;
@@ -38,8 +38,8 @@ struct output_t
};
/** Global context. */
-struct output_t output_global;
-#define ctx output_global
+static struct output_host_t output_host_global;
+#define ctx output_host_global
void
output_host_init (void)