summaryrefslogtreecommitdiffhomepage
path: root/digital/io
diff options
context:
space:
mode:
Diffstat (limited to 'digital/io')
-rw-r--r--digital/io/src/fsm.c15
-rw-r--r--digital/io/src/fsm.h5
2 files changed, 20 insertions, 0 deletions
diff --git a/digital/io/src/fsm.c b/digital/io/src/fsm.c
index 53e4877d..c4607176 100644
--- a/digital/io/src/fsm.c
+++ b/digital/io/src/fsm.c
@@ -119,3 +119,18 @@ fsm_handle_timeout (fsm_t *fsm)
return handled;
}
+uint8_t
+fsm_can_handle_event (fsm_t *fsm, uint8_t event)
+{
+ uint8_t i;
+ assert (fsm);
+ assert (event < fsm->events_nb);
+ for (i = 0; i < fsm->active_states_nb; i++)
+ {
+ uint8_t state = fsm->states_active[i];
+ if (fsm->transition_table[state * fsm->events_nb + event])
+ return 1;
+ }
+ return 0;
+}
+
diff --git a/digital/io/src/fsm.h b/digital/io/src/fsm.h
index a90d1e83..72dfc56e 100644
--- a/digital/io/src/fsm.h
+++ b/digital/io/src/fsm.h
@@ -101,6 +101,11 @@ fsm_handle_timeout (fsm_t *fsm);
uint8_t
fsm_handle_event (fsm_t *fsm, uint8_t event);
+/** Return non zero if event can be handled. This can be used if event
+ * generation requires expensive computations. */
+uint8_t
+fsm_can_handle_event (fsm_t *fsm, uint8_t event);
+
#include "ai_fsm.h"
#endif /* fsm_h */