summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Haller2009-04-17 00:03:02 +0200
committerNicolas Haller2009-04-17 00:03:02 +0200
commit5f792eef110b9f4d9c357266ae3084ee19b5d8b0 (patch)
tree0fc2c643dfe1d0128371b0afbef618efc0461282
parent6ce7551837b1084b89be2fc4fce00de359804c6c (diff)
* digital/io/src
- modification of elevator and filterbridge fsm to use branches instead of "events races"
-rw-r--r--digital/io/src/elevator.fsm24
-rw-r--r--digital/io/src/elevator_cb.c77
-rw-r--r--digital/io/src/filterbridge.fsm26
-rw-r--r--digital/io/src/filterbridge_cb.c69
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
@@ -49,17 +49,6 @@ elevator__WAIT_FOR_CLOSE_ORDER__order_received (void)
}
/*
- * 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
* no more time to wait a new puck
@@ -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
@@ -38,6 +38,20 @@ filterbridge__CLOSE_FIRST_DOOR__first_door_closed (void)
}
/*
+ * 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
* close the first door after a puck is ready for filtering
@@ -60,50 +74,6 @@ filterbridge__CLOSE_SECOND_DOOR__second_door_closed (void)
}
/*
- * 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
* the lift is ready to get pucks, we can begin testing procedure
@@ -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);
}
/*