From 0120e9729d10c21558b4dfdb54ad202fe39243c9 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Wed, 12 May 2010 23:15:25 +0200 Subject: digital/io/src: moved FSM transition table to flash --- digital/io/src/fsm.c | 5 ++--- digital/io/src/fsm.h | 15 +++++++++++++++ digital/io/src/fsm_templates/template_fsm.c | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) (limited to 'digital') 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 + +#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}; -- cgit v1.2.3