From ced5faed197679a0f3a18a2445bbbf79d77987a5 Mon Sep 17 00:00:00 2001 From: Jérémy Dufour Date: Thu, 24 Apr 2008 23:46:38 +0200 Subject: * digital/io/src - make fsm handle event return 1 if a transition has been executed ; - in the main loop, when a transition has been executed, continue to the next iteration. --- digital/io/src/fsm.c | 4 +++- digital/io/src/fsm.h | 8 ++++++-- digital/io/src/main.c | 41 +++++++++++++++++++++++++++-------------- 3 files changed, 36 insertions(+), 17 deletions(-) (limited to 'digital') diff --git a/digital/io/src/fsm.c b/digital/io/src/fsm.c index 95288e1a..945896a6 100644 --- a/digital/io/src/fsm.c +++ b/digital/io/src/fsm.c @@ -38,7 +38,7 @@ fsm_init (fsm_t *fsm) } /** Handle an event on the given FSM. */ -void +uint8_t fsm_handle_event (fsm_t *fsm, u8 event) { assert (fsm); @@ -62,6 +62,8 @@ fsm_handle_event (fsm_t *fsm, u8 event) #else fsm->state_current = br; #endif + return 1; } + return 0; } diff --git a/digital/io/src/fsm.h b/digital/io/src/fsm.h index 224e5801..4933cb8e 100644 --- a/digital/io/src/fsm.h +++ b/digital/io/src/fsm.h @@ -89,8 +89,12 @@ typedef struct fsm_t fsm_t; void fsm_init (fsm_t *fsm); -/** Handle an event on the given FSM. */ -void +/** Handle an event on the given FSM. + * @return + * - 0 if this FSM does not handle this event ; + * - 1 if this FSM handles this event in its current state. + */ +uint8_t fsm_handle_event (fsm_t *fsm, u8 event); #include "getsamples_fsm.h" diff --git a/digital/io/src/main.c b/digital/io/src/main.c index 99967b6e..81928cd6 100644 --- a/digital/io/src/main.c +++ b/digital/io/src/main.c @@ -97,6 +97,13 @@ main_init (void) static void main_loop (void) { +#define FSM_HANDLE_EVENT(fsm,event) \ + { if (fsm_handle_event (fsm,event)) \ + { \ + continue; \ + } \ + } + /* Infinite loop */ while (1) { @@ -125,31 +132,37 @@ main_loop (void) /* Is last command has been acknowledged? */ if (asserv_last_cmd_ack () == 0) + { /* Called function to manage retransmission */ asserv_retransmit (); + } else { + /* Update */ + uint8_t main_asserv_arm_position_reached = asserv_arm_position_reached (); + uint8_t main_top_generate_settings_ack_event = top_generate_settings_ack_event (); + uint8_t main_gutter_generate_wait_finished_event = gutter_generate_wait_finished_event (); asserv_status_e move_status = asserv_last_cmd_ack () ? asserv_move_cmd_status () : none; /* Check commands move status */ if (move_status == success) { /* Pass it to all the FSM that need it */ - fsm_handle_event (&getsamples_fsm, + FSM_HANDLE_EVENT (&getsamples_fsm, GETSAMPLES_EVENT_bot_move_succeed); - fsm_handle_event (&gutter_fsm, + FSM_HANDLE_EVENT (&gutter_fsm, GUTTER_EVENT_bot_move_succeed); - fsm_handle_event (&move_fsm, + FSM_HANDLE_EVENT (&move_fsm, MOVE_EVENT_reached); } else if (move_status == failure) { /* Move failed */ - fsm_handle_event (&getsamples_fsm, + FSM_HANDLE_EVENT (&getsamples_fsm, GETSAMPLES_EVENT_bot_move_failed); - fsm_handle_event (&gutter_fsm, + FSM_HANDLE_EVENT (&gutter_fsm, GUTTER_EVENT_bot_move_failed); - fsm_handle_event (&move_fsm, + FSM_HANDLE_EVENT (&move_fsm, MOVE_EVENT_blocked); } asserv_status_e arm_status = asserv_last_cmd_ack () @@ -158,31 +171,31 @@ main_loop (void) if (arm_status == success) { /* Pass it to all the FSM that need it */ - fsm_handle_event (&getsamples_fsm, + FSM_HANDLE_EVENT (&getsamples_fsm, GETSAMPLES_EVENT_arm_move_succeed); } /* TODO: Check if the sensor placed at the noted position has seen * an arm passed and forward this event to the getsamples FSM */ - if (asserv_arm_position_reached ()) + if (main_asserv_arm_position_reached) { /* Reset the notifier */ asserv_arm_set_position_reached (0); - fsm_handle_event (&getsamples_fsm, + FSM_HANDLE_EVENT (&getsamples_fsm, GETSAMPLES_EVENT_arm_pass_noted_position); } /* Jack */ - fsm_handle_event (&top_fsm, switch_get_jack () ? + FSM_HANDLE_EVENT (&top_fsm, switch_get_jack () ? TOP_EVENT_jack_removed_from_bot : TOP_EVENT_jack_inserted_into_bot); /* Settings acknowledge */ - if (top_generate_settings_ack_event ()) + if (main_top_generate_settings_ack_event) { - fsm_handle_event (&top_fsm, TOP_EVENT_settings_acknowledged); + FSM_HANDLE_EVENT (&top_fsm, TOP_EVENT_settings_acknowledged); } /* Gutter wait_finished event */ - if (gutter_generate_wait_finished_event ()) + if (main_gutter_generate_wait_finished_event) { - fsm_handle_event (&gutter_fsm, GUTTER_EVENT_wait_finished); + FSM_HANDLE_EVENT (&gutter_fsm, GUTTER_EVENT_wait_finished); } /* TODO: Check other sensors */ } -- cgit v1.2.3