summaryrefslogtreecommitdiffhomepage
path: root/digital/io/src/cylinder.fsm
blob: 3f883058dce340635997791aa75528f1527dea54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# 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
 TURN_PLUS_1
  turn 1 position after when we see a new puck
 TURN_MINUS_1
  turn 1 position before when the new puck dont really exist
 WAIT_BRIDGE_READY
  waiting fb is ready to accept new puck
 TURN_PLUS_1_AGAIN
  turn 1 position after to open cylinder after OF test
 TURN_MINUS_1_CLOSE
  turn 1 position before to close the cylinder (bot full/close_order)
 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_2_FLUSH
  drop 1 puck to the fb

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
 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 -> TURN_PLUS_1
  turn cylinder 1 position after
 close_order -> TURN_MINUS_1_CLOSE
  we close cylinder as requested
 flush_order -> WAIT_BRIDGE_READY_FLUSH
  flush all pucks to the bridge

TURN_PLUS_1:
 move_done: of_no_puck -> TURN_MINUS_1
  There is no puck, go backward
 move_done: of_puck -> WAIT_BRIDGE_READY
  There is a real puck, check if fb is ready to get puck

TURN_MINUS_1:
 move_done -> WAIT_A_PUCK
  wait a puck again

WAIT_BRIDGE_READY:
 bridge_ready -> TURN_PLUS_1_AGAIN
  open cylinder after the puck existence confirmation

TURN_PLUS_1_AGAIN:
 move_done: bot_not_full -> WAIT_A_PUCK
  ready for a new puck
 move_done: bot_full -> TURN_MINUS_1_CLOSE
  bot full we close the cylinder

TURN_MINUS_1_CLOSE:
 move_done -> WAIT_BOT_NOT_FULL
  we wait the bot is not full to reopen cylinder

WAIT_BOT_NOT_FULL:
 bot_not_full -> WAIT_CLEAR_ORDER
  first condition to reopen bot is reached
 flush_order -> TURN_PLUS_1_FLUSH
  flush gordon

WAIT_CLEAR_ORDER:
 no_close_order -> TURN_PLUS_1_OPEN
  last condition to reopen bot reached, opening...
 flush_order -> TURN_PLUS_1_FLUSH
  flush gordon

TURN_PLUS_1_OPEN:
 move_done -> WAIT_A_PUCK
  we wait a puck

TURN_PLUS_1_FLUSH:
 move_done -> WAIT_BRIDGE_READY_FLUSH
  cylinder open and ready to flush

WAIT_BRIDGE_READY_FLUSH:
 bridge_ready -> TURN_PLUS_2_FLUSH
  put a puck on the fb

TURN_PLUS_2_FLUSH:
 move_done: cylinder_empty -> TURN_MINUS_1_CLOSE
  flush finished
 move_done: cylinder_not_empty -> WAIT_BRIDGE_READY_FLUSH
  flush again