8 /************************************************************
10 ************************************************************/
12 #define MAX_PUCKS_NUM 3 // pucks in holder
14 /************************************************************
15 * Actuator's variables
16 ************************************************************/
19 HIGH = LIFT_TRAVEL_POS,
20 LOW = LIFT_GROUND_POS,
21 } BASIC_LIFT_POSITION;
23 BASIC_LIFT_POSITION basic_lift_position = HIGH;
25 bool lintel_present = 1;
28 /************************************************************
30 ************************************************************/
32 FSM_STATE_DECL(wait_for_command);
34 FSM_STATE_DECL(prepare_for_load);
35 FSM_STATE_DECL(scrabble); // hrabej
36 FSM_STATE_DECL(load_the_puck);
37 FSM_STATE_DECL(suck_the_puck);
38 FSM_STATE_DECL(store_pucks_in_holder);
40 FSM_STATE_DECL(unload_pucks);
41 FSM_STATE_DECL(drive_lift_into_floor);
43 /* ***********************************************************
45 * ***********************************************************/
47 FSM_STATE(wait_for_command)
51 printf("wait_for_command_state_entered, number of pucks stored: %d\n", pucks_loaded);
52 // put all actuators to defined initial positions
53 act_belts(BELTS_OFF, BELTS_OFF);
55 act_chelae(CHELA_OPEN, CHELA_OPEN);
57 act_chelae(CHELA_TIGHT, CHELA_TIGHT);
59 act_holder(HOLDER_LOOSE);
60 act_lift(basic_lift_position);
61 switch(basic_lift_position) {
63 printf("basic lift position set to LOW\n");
66 printf("basic lift position set to HIGH\n");
69 act_pusher(PUSHER_INSIDE);
70 act_hokuyo(HOKUYO_PITCH_HORIZONTAL);
72 case EV_PREPARE_FOR_LOAD:
73 //basic_lift_position = LOW;
74 //FSM_TRANSITION(wait_for_command);
77 FSM_TRANSITION(scrabble);
79 case EV_LOAD_THE_PUCK:
80 FSM_TRANSITION(load_the_puck);
82 case EV_PREPARE_THE_UNLOAD:
83 if (pucks_loaded == 0) {
84 FSM_SIGNAL(MAIN, EV_ACTION_ERROR, NULL);
86 floor_to_unload = FSM_EVENT_INT;
87 FSM_TRANSITION(unload_pucks);
91 case EV_PUSHER_IN_POS:
92 case EV_PUCK_INSIDE: // we do not want react unless MAIN FSM tells us to
98 DBG_PRINT_EVENT("unhandled event");
105 /************************************************************
106 * LOAD THE PUCK ACTION
107 ************************************************************/
109 /* FSM_STATE(prepare_for_load)
113 act_lift(LIFT_GROUND_POS);
116 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
119 FSM_TRANSITION(scrabble);
121 case EV_LOAD_THE_PUCK:
122 FSM_TRANSITION(load_the_puck);
125 case EV_PREPARE_FOR_LOAD:
126 case EV_PREPARE_THE_UNLOAD:
127 case EV_UNLOAD_PUCKS:
130 case EV_PUSHER_IN_POS:
132 DBG_PRINT_EVENT("unhandled event");
143 act_chelae(CHELA_LOOSE, CHELA_LOOSE);
145 case EV_LOAD_THE_PUCK:
146 FSM_TRANSITION(load_the_puck);
150 case EV_PREPARE_FOR_LOAD:
151 case EV_PREPARE_THE_UNLOAD:
152 case EV_UNLOAD_PUCKS:
156 case EV_PUSHER_IN_POS:
158 DBG_PRINT_EVENT("unhandled event");
165 FSM_STATE(load_the_puck)
169 printf("load_the_puck_state entered\n");
170 act_lift(LIFT_GROUND_POS);
171 act_pusher(PUSHER_INSIDE);
172 act_chelae(CHELA_OPEN, CHELA_OPEN);
173 act_belts(BELTS_OFF, BELTS_OFF);
174 // FIXME: act_holder ?
177 printf("lift in position\n");
178 FSM_TRANSITION(suck_the_puck);
181 case EV_PREPARE_THE_UNLOAD:
182 case EV_UNLOAD_PUCKS:
185 case EV_PUSHER_IN_POS:
187 case EV_PREPARE_FOR_LOAD:
188 case EV_LOAD_THE_PUCK:
190 DBG_PRINT_EVENT("unhandled event");
197 FSM_STATE(suck_the_puck)
199 static int timer_arrival_count;
204 timer_arrival_count = 0;
205 printf("suck_the_puck state entered\n");
208 act_chelae(CHELA_TIGHT, CHELA_TIGHT);
209 act_belts(BELTS_IN, BELTS_IN);
213 printf("puck inside\n");
214 FSM_TRANSITION(store_pucks_in_holder);
217 switch (timer_arrival_count) {
219 act_belts(BELTS_OUT, BELTS_OUT);
223 act_belts(BELTS_IN, BELTS_IN);
227 FSM_SIGNAL(MAIN, EV_ACTION_ERROR, NULL);
228 FSM_TRANSITION(wait_for_command);
231 timer_arrival_count++; */
234 case EV_LOAD_THE_PUCK:
235 case EV_PUSHER_IN_POS:
236 case EV_PREPARE_THE_UNLOAD:
237 case EV_UNLOAD_PUCKS:
239 case EV_PREPARE_FOR_LOAD:
241 DBG_PRINT_EVENT("unhandled event");
244 act_belts(BELTS_OFF, BELTS_OFF);
245 act_chelae(CHELA_OPEN, CHELA_OPEN);
250 FSM_STATE(store_pucks_in_holder)
255 act_holder(HOLDER_OPENED);
256 if (pucks_loaded > 2) {
257 pucks_loaded++; // FIXME: (?) change this variable only here in this state?
258 basic_lift_position = HIGH;
259 FSM_TRANSITION(wait_for_command);
260 FSM_SIGNAL(MAIN, EV_ACTION_DONE, (void*)pucks_loaded);
263 act_holder(HOLDER_OPENED);
264 act_lift(LIFT_IN_HOLDER_POS);
270 act_holder(HOLDER_TIGHT);
271 act_lift(LIFT_TRAVEL_POS);
274 pucks_loaded++; // FIXME: (?) change this variable in EV_ENTRY and only in one place?
275 basic_lift_position = HIGH;
276 FSM_TRANSITION(wait_for_command);
277 FSM_SIGNAL(MAIN, EV_ACTION_DONE, (void*)pucks_loaded);
281 case EV_PUCK_INSIDE: // ignore
283 case EV_PREPARE_THE_UNLOAD:
284 case EV_UNLOAD_PUCKS:
287 case EV_PUSHER_IN_POS:
288 case EV_LOAD_THE_PUCK:
290 case EV_PREPARE_FOR_LOAD:
292 DBG_PRINT_EVENT("unhandled event");
299 /************************************************************
300 * UNLOAD THE PUCK ACTION
301 ************************************************************/
303 FSM_STATE(unload_pucks)
307 act_chelae(CHELA_OPEN, CHELA_OPEN);
308 printf("unloading pucks\n");
309 if (pucks_loaded < 4) {
310 act_lift(LIFT_BELOW_HOLDER_POS);
312 // if there are 4 pucks loaded, we do not need to manipulate the lift
313 FSM_TRANSITION(drive_lift_into_floor);
317 printf("lift in position\n");
318 FSM_TRANSITION(drive_lift_into_floor);
320 case EV_PUCK_INSIDE: // ignore
322 case EV_PREPARE_THE_UNLOAD:
323 case EV_UNLOAD_PUCKS:
326 case EV_PUSHER_IN_POS:
327 case EV_LOAD_THE_PUCK:
329 case EV_PREPARE_FOR_LOAD:
331 DBG_PRINT_EVENT("unhandled event");
334 act_holder(HOLDER_OPENED);
339 FSM_STATE(drive_lift_into_floor)
343 printf("driving lift to floor %d\n", floor_to_unload);
344 int lift_destination;
345 switch(floor_to_unload) {
346 case 0: lift_destination = LIFT_FLOOR0;
348 case 1: lift_destination = LIFT_FLOOR1 + LIFT_SHIFT;
350 case 2: lift_destination = LIFT_FLOOR2 + LIFT_SHIFT;
352 case 3: lift_destination = LIFT_FLOOR3 + LIFT_SHIFT;
354 case 4: lift_destination = LIFT_FLOOR4 + LIFT_SHIFT;
357 act_lift(lift_destination);
361 printf("lift in position\n");
362 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
364 case EV_UNLOAD_PUCKS:
365 printf("using pusher\n");
367 act_pusher(PUSHER_FULLY_OUTSIDE);
369 case EV_PUSHER_IN_POS:
370 printf("pusher in position\n");
371 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
374 printf("returning to wait_for_command state\n");
375 FSM_TRANSITION(wait_for_command);
377 case EV_PUCK_INSIDE: // ignore
379 case EV_PREPARE_THE_UNLOAD:
382 case EV_LOAD_THE_PUCK:
383 case EV_PREPARE_FOR_LOAD:
385 DBG_PRINT_EVENT("unhandled event");
399 case EV_PREPARE_THE_UNLOAD:
400 case EV_UNLOAD_PUCKS:
404 case EV_PUSHER_IN_POS:
405 case EV_LOAD_THE_PUCK:
407 case EV_PREPARE_FOR_LOAD:
409 DBG_PRINT_EVENT("unhandled event");