summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Schodet2010-05-12 23:15:25 +0200
committerNicolas Schodet2010-05-12 23:15:25 +0200
commit0120e9729d10c21558b4dfdb54ad202fe39243c9 (patch)
tree80fcc3b3af31bd665b4099775c43d3df69eb0cd1
parentb924ab5f66538c6c2f2f19f02bff755a3ddd266d (diff)
digital/io/src: moved FSM transition table to flash
-rw-r--r--digital/io/src/fsm.c5
-rw-r--r--digital/io/src/fsm.h15
-rw-r--r--digital/io/src/fsm_templates/template_fsm.c2
3 files changed, 18 insertions, 4 deletions
diff --git a/digital/io/src/fsm.c b/digital/io/src/fsm.c
index d39c6e23..45eeb5ba 100644
--- a/digital/io/src/fsm.c
+++ b/digital/io/src/fsm.c
@@ -55,8 +55,7 @@ fsm_handle_event_single (fsm_t *fsm, uint8_t active, uint8_t event)
assert (event < fsm->events_nb);
/* Lookup transition. */
uint8_t old_state = fsm->states_active[active];
- fsm_transition_t tr = fsm->transition_table[
- old_state * fsm->events_nb + event];
+ fsm_transition_t tr = FSM_TRANSITION (fsm, old_state, event);
/* Ignore unhandled events. */
if (tr)
{
@@ -130,7 +129,7 @@ fsm_can_handle_event (fsm_t *fsm, uint8_t event)
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])
+ if (FSM_TRANSITION (fsm, state, event))
return 1;
}
return 0;
diff --git a/digital/io/src/fsm.h b/digital/io/src/fsm.h
index f06c92fb..82a860a8 100644
--- a/digital/io/src/fsm.h
+++ b/digital/io/src/fsm.h
@@ -25,6 +25,17 @@
*
* }}} */
+#ifndef HOST
+
+# include <avr/pgmspace.h>
+
+#else
+
+# define PROGMEM
+# define pgm_read_word(addr) (*(addr))
+
+#endif
+
/**
* The io board includes an FSM with several concurrent active states.
*
@@ -88,6 +99,10 @@ struct fsm_t
};
typedef struct fsm_t fsm_t;
+#define FSM_TRANSITION(fsm, state, event) \
+ ((fsm_transition_t) pgm_read_word ( \
+ &(fsm)->transition_table[(state) * (fsm)->events_nb + (event)]))
+
/** Reset a FSM. */
void
fsm_init (fsm_t *fsm);
diff --git a/digital/io/src/fsm_templates/template_fsm.c b/digital/io/src/fsm_templates/template_fsm.c
index efa1b0d3..03ce5abf 100644
--- a/digital/io/src/fsm_templates/template_fsm.c
+++ b/digital/io/src/fsm_templates/template_fsm.c
@@ -11,7 +11,7 @@
#define NULL ((void *)0L)
/* %(name)s transition table. */
-static const fsm_transition_t
+static const fsm_transition_t PROGMEM
%(prefix)s_transition_table[%(PREFIX)s_STATE_NB][%(PREFIX)s_EVENT_NB] = {
%(transition_table)s};