From 5f792eef110b9f4d9c357266ae3084ee19b5d8b0 Mon Sep 17 00:00:00 2001 From: Nicolas Haller Date: Fri, 17 Apr 2009 00:03:02 +0200 Subject: * digital/io/src - modification of elevator and filterbridge fsm to use branches instead of "events races" --- digital/io/src/elevator.fsm | 24 +++++-------- digital/io/src/elevator_cb.c | 77 ++++++++++++++++------------------------ digital/io/src/filterbridge.fsm | 26 +++++--------- digital/io/src/filterbridge_cb.c | 69 +++++++++++------------------------ 4 files changed, 68 insertions(+), 128 deletions(-) diff --git a/digital/io/src/elevator.fsm b/digital/io/src/elevator.fsm index 8466ae3e..70d1e297 100644 --- a/digital/io/src/elevator.fsm +++ b/digital/io/src/elevator.fsm @@ -9,11 +9,9 @@ States: go to a position to be ready to get a new puck WAIT_A_PUCK waiting for a new puck (hurry up filter bridge!) - BLAH - useless state (incrementing nb_puck variable) WAIT_POS_ORDER waiting for position order (depending where we want to drop our column) - GO_TO_POX_Y + GO_TO_POS_Y go to a position to be ready to release pucks WAIT_FOR_RELEASE_ORDER ready to open doors at your command @@ -31,10 +29,6 @@ Events: elevator is in position new_puck we received a new puck from FB (filter bridge, not facebook) - ok_for_other_pucks - complex event (nb_pucks < 4 . (time_ok + !fb_empty)) - not_ok_for_other_pucks - complex event !ok_for_other_pucks time_up complex event (!time_ok . fb_empty) order_received @@ -53,22 +47,20 @@ GO_TO_POS_X: in position and ready to get a new puck WAIT_A_PUCK: - new_puck -> BLAH + new_puck: ok_for_other_pucks -> GO_TO_POS_X incrementing nb_puck var + update elevator position to get a new puck + new_puck: not_ok_for_other_pucks -> WAIT_POS_ORDER + incrementing nb_puck var + no more time to wait a new puck time_up -> WAIT_POS_ORDER no more time to wait a new puck -BLAH: - ok_for_other_pucks -> GO_TO_POS_X - update elevator position to get a new puck - not_ok_for_other_pucks -> WAIT_POS_ORDER - no more puck, going next step - WAIT_POS_ORDER: - order_received -> GO_TO_POX_Y + order_received -> GO_TO_POS_Y go to position Y -GO_TO_POX_Y: +GO_TO_POS_Y: in_position -> WAIT_FOR_RELEASE_ORDER ready to release pucks at altitude Y diff --git a/digital/io/src/elevator_cb.c b/digital/io/src/elevator_cb.c index 7fc880c6..d6cf1005 100644 --- a/digital/io/src/elevator_cb.c +++ b/digital/io/src/elevator_cb.c @@ -1,4 +1,4 @@ -/* filterbridge_cb.c - filterbridge FSM callbacks. */ +/* elevator_cb.c - elevator FSM callbacks. */ /* {{{ * * Copyright (C) 2009 Nicolas Haller @@ -48,17 +48,6 @@ elevator__WAIT_FOR_CLOSE_ORDER__order_received (void) return elevator_next (WAIT_FOR_CLOSE_ORDER, order_received); } -/* - * CLOSE_DOORS =doors_closed=> - * => GO_TO_POS_X - * pucks are released and elevator is ready to make a new column - */ -fsm_branch_t -elevator__CLOSE_DOORS__doors_closed (void) -{ - return elevator_next (CLOSE_DOORS, doors_closed); -} - /* * WAIT_A_PUCK =time_up=> * => WAIT_POS_ORDER @@ -72,24 +61,29 @@ elevator__WAIT_A_PUCK__time_up (void) /* * WAIT_A_PUCK =new_puck=> - * => BLAH + * ok_for_other_pucks => GO_TO_POS_X * incrementing nb_puck var + * update elevator position to get a new puck + * not_ok_for_other_pucks => WAIT_POS_ORDER + * incrementing nb_puck var + * no more time to wait a new puck */ fsm_branch_t elevator__WAIT_A_PUCK__new_puck (void) { - return elevator_next (WAIT_A_PUCK, new_puck); + return elevator_next_branch (WAIT_A_PUCK, new_puck, ok_for_other_pucks); + return elevator_next_branch (WAIT_A_PUCK, new_puck, not_ok_for_other_pucks); } /* - * GO_TO_POX_Y =in_position=> + * GO_TO_POS_Y =in_position=> * => WAIT_FOR_RELEASE_ORDER * ready to release pucks at altitude Y */ fsm_branch_t -elevator__GO_TO_POX_Y__in_position (void) +elevator__GO_TO_POS_Y__in_position (void) { - return elevator_next (GO_TO_POX_Y, in_position); + return elevator_next (GO_TO_POS_Y, in_position); } /* @@ -104,58 +98,47 @@ elevator__GO_TO_POS_X__in_position (void) } /* - * WAIT_FOR_RELEASE_ORDER =order_received=> - * => OPEN_DOORS - * release pucks to the target position (I hope) + * IDLE =started=> + * => GO_TO_POS_X + * match begin, we're going to be ready to get a new puck */ fsm_branch_t -elevator__WAIT_FOR_RELEASE_ORDER__order_received (void) +elevator__IDLE__started (void) { - return elevator_next (WAIT_FOR_RELEASE_ORDER, order_received); + return elevator_next (IDLE, started); } /* - * BLAH =not_ok_for_other_pucks=> - * => WAIT_POS_ORDER - * no more puck, going next step + * WAIT_FOR_RELEASE_ORDER =order_received=> + * => OPEN_DOORS + * release pucks to the target position (I hope) */ fsm_branch_t -elevator__BLAH__not_ok_for_other_pucks (void) +elevator__WAIT_FOR_RELEASE_ORDER__order_received (void) { - return elevator_next (BLAH, not_ok_for_other_pucks); + return elevator_next (WAIT_FOR_RELEASE_ORDER, order_received); } /* - * BLAH =ok_for_other_pucks=> - * => GO_TO_POS_X - * update elevator position to get a new puck + * WAIT_POS_ORDER =order_received=> + * => GO_TO_POS_Y + * go to position Y */ fsm_branch_t -elevator__BLAH__ok_for_other_pucks (void) +elevator__WAIT_POS_ORDER__order_received (void) { - return elevator_next (BLAH, ok_for_other_pucks); + return elevator_next (WAIT_POS_ORDER, order_received); } /* - * IDLE =started=> + * CLOSE_DOORS =doors_closed=> * => GO_TO_POS_X - * match begin, we're going to be ready to get a new puck - */ -fsm_branch_t -elevator__IDLE__started (void) -{ - return elevator_next (IDLE, started); -} - -/* - * WAIT_POS_ORDER =order_received=> - * => GO_TO_POX_Y - * go to position Y + * pucks are released and elevator is ready to make a new column */ fsm_branch_t -elevator__WAIT_POS_ORDER__order_received (void) +elevator__CLOSE_DOORS__doors_closed (void) { - return elevator_next (WAIT_POS_ORDER, order_received); + return elevator_next (CLOSE_DOORS, doors_closed); } diff --git a/digital/io/src/filterbridge.fsm b/digital/io/src/filterbridge.fsm index 324314b7..d1495abe 100644 --- a/digital/io/src/filterbridge.fsm +++ b/digital/io/src/filterbridge.fsm @@ -9,14 +9,12 @@ States: waiting for a new puck CLOSE_FIRST_DOOR isolating the firt puck on the bridge - WAIT_RGB_IDENT + WAIT_RGB_PROBE waiting for RGB probe the first puck EJECT_PUCK eject a bad puck RETURN_NORMAL_POS move the bridge to his normal position - BLAH - useless states OPEN_SECOND_DOOR open and free the puck to the lift CLOSE_SECOND_DOOR @@ -31,20 +29,18 @@ Events: a puck has been detected on bridge's position 2 first_door_closed the first door is closed - bad_color - the RGB had probed the puck and it is bad no_puck_on_pos2 there is no puck on position 2 bridge_in_position bridge is in his normal position - good_color - the RGB had probed the puck and it is good (and ready to listening horrible lift music) second_door_closed you shall not pass to the lift first_door_opened bridge ready to test a new puck puck_ejected the ejection procedure is completed + color_probed + the result of the investigation will be revealed (suspens!!) IDLE: @@ -56,13 +52,13 @@ WAIT_A_PUCK: close the first door after a puck is ready for filtering CLOSE_FIRST_DOOR: - first_door_closed -> WAIT_RGB_IDENT + first_door_closed -> WAIT_RGB_PROBE get puck color -WAIT_RGB_IDENT: - bad_color -> EJECT_PUCK +WAIT_RGB_PROBE: + color_probed: bad_color -> EJECT_PUCK eject bad PUCK - good_color -> OPEN_SECOND_DOOR + color_probed: good_color -> OPEN_SECOND_DOOR put puck to the lift EJECT_PUCK: @@ -70,13 +66,9 @@ EJECT_PUCK: put bridge on normal position after puck ejection RETURN_NORMAL_POS: - bridge_in_position -> BLAH - ready for a new puck test (unless bad puck is here yet) - -BLAH: - puck_on_pos2 -> EJECT_PUCK + bridge_in_position: puck_still_here -> EJECT_PUCK re-eject this sticky puck, grml! - no_puck_on_pos2 -> OPEN_FIRST_DOOR + bridge_in_position: no_puck_anymore -> OPEN_FIRST_DOOR make bridge ready to test a new puck OPEN_SECOND_DOOR: diff --git a/digital/io/src/filterbridge_cb.c b/digital/io/src/filterbridge_cb.c index a34b9a6f..0864fa8d 100644 --- a/digital/io/src/filterbridge_cb.c +++ b/digital/io/src/filterbridge_cb.c @@ -28,7 +28,7 @@ /* * CLOSE_FIRST_DOOR =first_door_closed=> - * => WAIT_RGB_IDENT + * => WAIT_RGB_PROBE * get puck color */ fsm_branch_t @@ -37,6 +37,20 @@ filterbridge__CLOSE_FIRST_DOOR__first_door_closed (void) return filterbridge_next (CLOSE_FIRST_DOOR, first_door_closed); } +/* + * WAIT_RGB_PROBE =color_probed=> + * bad_color => EJECT_PUCK + * eject bad PUCK + * good_color => OPEN_SECOND_DOOR + * put puck to the lift + */ +fsm_branch_t +filterbridge__WAIT_RGB_PROBE__color_probed (void) +{ + return filterbridge_next_branch (WAIT_RGB_PROBE, color_probed, bad_color); + return filterbridge_next_branch (WAIT_RGB_PROBE, color_probed, good_color); +} + /* * WAIT_A_PUCK =puck_on_pos2=> * => CLOSE_FIRST_DOOR @@ -59,50 +73,6 @@ filterbridge__CLOSE_SECOND_DOOR__second_door_closed (void) return filterbridge_next (CLOSE_SECOND_DOOR, second_door_closed); } -/* - * WAIT_RGB_IDENT =good_color=> - * => OPEN_SECOND_DOOR - * put puck to the lift - */ -fsm_branch_t -filterbridge__WAIT_RGB_IDENT__good_color (void) -{ - return filterbridge_next (WAIT_RGB_IDENT, good_color); -} - -/* - * WAIT_RGB_IDENT =bad_color=> - * => EJECT_PUCK - * eject bad PUCK - */ -fsm_branch_t -filterbridge__WAIT_RGB_IDENT__bad_color (void) -{ - return filterbridge_next (WAIT_RGB_IDENT, bad_color); -} - -/* - * BLAH =no_puck_on_pos2=> - * => OPEN_FIRST_DOOR - * make bridge ready to test a new puck - */ -fsm_branch_t -filterbridge__BLAH__no_puck_on_pos2 (void) -{ - return filterbridge_next (BLAH, no_puck_on_pos2); -} - -/* - * BLAH =puck_on_pos2=> - * => EJECT_PUCK - * re-eject this sticky puck, grml! - */ -fsm_branch_t -filterbridge__BLAH__puck_on_pos2 (void) -{ - return filterbridge_next (BLAH, puck_on_pos2); -} - /* * IDLE =lift_ready=> * => WAIT_A_PUCK @@ -116,13 +86,16 @@ filterbridge__IDLE__lift_ready (void) /* * RETURN_NORMAL_POS =bridge_in_position=> - * => BLAH - * ready for a new puck test (unless bad puck is here yet) + * no_puck_anymore => OPEN_FIRST_DOOR + * make bridge ready to test a new puck + * puck_still_here => EJECT_PUCK + * re-eject this sticky puck, grml! */ fsm_branch_t filterbridge__RETURN_NORMAL_POS__bridge_in_position (void) { - return filterbridge_next (RETURN_NORMAL_POS, bridge_in_position); + return filterbridge_next_branch (RETURN_NORMAL_POS, bridge_in_position, no_puck_anymore); + return filterbridge_next_branch (RETURN_NORMAL_POS, bridge_in_position, puck_still_here); } /* -- cgit v1.2.3