From 292a99306cca49bba73632ec2563f454389b7b4e Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Thu, 29 Mar 2012 23:54:50 +0200 Subject: digital/io-hub: add output_toggle --- digital/io-hub/src/common/output.c | 12 ++++++++++++ digital/io-hub/src/common/output.h | 4 ++++ digital/io-hub/src/guybrush/main.c | 6 ++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/digital/io-hub/src/common/output.c b/digital/io-hub/src/common/output.c index d3518e7c..f6b3a705 100644 --- a/digital/io-hub/src/common/output.c +++ b/digital/io-hub/src/common/output.c @@ -60,3 +60,15 @@ output_clear (uint32_t clear) #undef OUTPUT } +/** Toggle state of any number of output. */ +void +output_toggle (uint32_t toggle) +{ +#define OUTPUT(io, init) do { \ + if (toggle & 1ul) IO_TOGGLE_ (io); \ + toggle >>= 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 index a4b7de18..ab5e617c 100644 --- a/digital/io-hub/src/common/output.h +++ b/digital/io-hub/src/common/output.h @@ -44,6 +44,10 @@ output_set (uint32_t set); void output_clear (uint32_t clear); +/** Toggle state of any number of output. */ +void +output_toggle (uint32_t toggle); + #ifdef HOST /** On host, initialise host part. */ diff --git a/digital/io-hub/src/guybrush/main.c b/digital/io-hub/src/guybrush/main.c index 5daa2a30..5fd266f9 100644 --- a/digital/io-hub/src/guybrush/main.c +++ b/digital/io-hub/src/guybrush/main.c @@ -246,15 +246,17 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) /* Stats commands. * - b: interval between stats. */ case c ('o', 5): - /* Set/clear outputs. + /* Set/clear/toggle outputs. * - 1d: mask. - * - 1b: 01 to set, 00 to clear. */ + * - 1b: 01 to set, 00 to clear, 02 to toggle. */ { uint32_t mask = v8_to_v32 (args[0], args[1], args[2], args[3]); if (args[4] == 0) output_clear (mask); else if (args[4] == 1) output_set (mask); + else if (args[4] == 2) + output_toggle (mask); else { proto_send0 ('?'); -- cgit v1.2.3