# Cylinder FSM # Control the puck's entrance cylinder States: IDLE waiting for init WAIT_FOR_JACK_IN waiting for jack RESET_POS reset the cylinder position INIT_POS initializing cylinder to a good position (open) WAIT_A_PUCK waiting a puck enter in cylinder WAIT_BRIDGE_READY waiting fb is ready to accept new puck TURN_PLUS_1_AND_OFO turn 1+of_offset position after when we see a new puck TURN_PLUS_1_AND_MINUS_OFO turn 1-of_offset position after to be ready to get a new puck WAIT_BOT_NOT_FULL wait the bot to drop pucks WAIT_CLEAR_ORDER wait the clear order (unset close_order flags) TURN_PLUS_1_OPEN open cylinder after close (bot full/close_order) TURN_PLUS_1_FLUSH open cylinder to prepare cyliner flush WAIT_BRIDGE_READY_FLUSH we wait fb is ready during the flush TURN_PLUS_3_FLUSH drop 1 puck to the fb TURN_PLUS_1_CLOSE close the cylinder WAIT_BRIDGE_READY_DISTRIB waiting for the bridge TURN_PLUS_1_AND_OFO_DISTRIB get a puck on distrib TURN_PLUS_1_AND_MINUS_OFO_DISTRIB we neutralize the offset before return in normal mode TURN_PLUS_1_AND_MINUS_OFO_DISTRIB_LOOP blah PROBE_OF we probe the OF Events: start start event jack_inserted_into_bot the init signal new_puck there is a puck in position 1 move_done cylinder move finished bridge_ready the fb is ready to get new pucks close_order we receive the order to close the cylinder no_close_order we can reopen the cylinder bot_not_full the bot dont have 4 pucks flush_order we receive a flush order distrib_fucked we are really in the distributor of_puck we see a puck to the of of_no_puck we don't see a puck in of state_timeout useless here IDLE: start -> WAIT_FOR_JACK_IN we wait the jack before moving anything WAIT_FOR_JACK_IN: jack_inserted_into_bot -> RESET_POS we init the cylinder position RESET_POS: move_done -> INIT_POS move the cylinder to open it INIT_POS: move_done -> WAIT_A_PUCK the cylinder is ready to get pucks WAIT_A_PUCK: new_puck -> WAIT_BRIDGE_READY look if the bridge is ready before move close_order -> TURN_PLUS_1_CLOSE we close cylinder as requested flush_order -> WAIT_BRIDGE_READY_FLUSH flush all pucks to the bridge distrib_fucked -> WAIT_BRIDGE_READY_DISTRIB we verify bridge WAIT_BRIDGE_READY_DISTRIB: bridge_ready -> TURN_PLUS_1_AND_OFO_DISTRIB we turn to check the of TURN_PLUS_1_AND_OFO_DISTRIB: move_done -> PROBE_OF We probe the puck PROBE_OF: of_puck: bot_full -> WAIT_BOT_NOT_FULL return to normal mode with a bot full of puck of_puck: bot_not_full -> TURN_PLUS_1_AND_MINUS_OFO_DISTRIB_LOOP we get a puck and we are hungry yet, go eat an another puck of_no_puck -> TURN_PLUS_1_AND_MINUS_OFO_DISTRIB Distributor empty, go elsewhere TURN_PLUS_1_AND_MINUS_OFO_DISTRIB_LOOP: move_done -> WAIT_BRIDGE_READY_DISTRIB ready to get another puck WAIT_BRIDGE_READY: bridge_ready -> TURN_PLUS_1_AND_OFO open the cylinder with the puck or not. TURN_PLUS_1_AND_OFO: move_done: bot_not_full -> TURN_PLUS_1_AND_MINUS_OFO open the cylinder to wait a new puck move_done: bot_full -> WAIT_BOT_NOT_FULL bot full, waiting for pucks teleportation TURN_PLUS_1_AND_MINUS_OFO_DISTRIB: move_done -> WAIT_A_PUCK bridge empty, return to normal mode TURN_PLUS_1_AND_MINUS_OFO: move_done -> WAIT_A_PUCK ready for other pucks WAIT_BOT_NOT_FULL: bot_not_full -> WAIT_CLEAR_ORDER the bot is not full, we go testing the other close condition flush_order -> TURN_PLUS_1_FLUSH flush order received, go open the cylinder WAIT_CLEAR_ORDER: no_close_order -> TURN_PLUS_1_OPEN no close order, we reopen cylinder to get other pucks flush_order -> TURN_PLUS_1_FLUSH flush order received, go open the cylinder TURN_PLUS_1_OPEN: move_done -> WAIT_A_PUCK cylinder ready to get other pucks TURN_PLUS_1_FLUSH: move_done -> WAIT_BRIDGE_READY_FLUSH we wait the bridge before moving WAIT_BRIDGE_READY_FLUSH: bridge_ready -> TURN_PLUS_3_FLUSH bridge is ready, flush gordon TURN_PLUS_3_FLUSH: move_done -> WAIT_BOT_NOT_FULL cylinder flushed, we test the 2 close conditions before reopen cylinder TURN_PLUS_1_CLOSE: move_done -> WAIT_BOT_NOT_FULL close order executed, test the 2 close conditions before reopen cylinder