summaryrefslogtreecommitdiff
path: root/digital/io-hub/src
diff options
context:
space:
mode:
Diffstat (limited to 'digital/io-hub/src')
-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
-rw-r--r--digital/io-hub/src/guybrush/main.c9
4 files changed, 50 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)
diff --git a/digital/io-hub/src/guybrush/main.c b/digital/io-hub/src/guybrush/main.c
index b942b5ea..ff1a1ab8 100644
--- a/digital/io-hub/src/guybrush/main.c
+++ b/digital/io-hub/src/guybrush/main.c
@@ -429,6 +429,7 @@ main_loop (void)
}
pressure_update ();
logger_update ();
+ output_update ();
/* Update AI modules. */
timer[2] = timer_get ();
top_update ();
@@ -584,6 +585,14 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args)
}
}
break;
+ case c ('o', 6):
+ /* Toggle outputs for a short time.
+ * - 1d: mask.
+ * - 1w: duration. */
+ output_toggle_transient (v8_to_v32 (args[0], args[1], args[2],
+ args[3]),
+ v8_to_v16 (args[4], args[5]));
+ break;
case c ('f', 2):
/* Set low pressure threshold.
* 1w: sensor value, 1024 is full scale. */