8 #define USE_DUMMY_ACTIONS // if defined, simulate actuators' actions by timeouts only
9 //#define GIVE_UP_ON_PUCK_PRESENCE_SENSOR
11 /************************************************************
12 * Actuator's constants
13 ************************************************************/
15 #define MAX_PUCKS_NUM 3 // pucks in holder
17 /************************************************************
18 * Actuator's variables
19 ************************************************************/
22 HIGH = LIFT_TRAVEL_POS,
23 LOW = LIFT_GROUND_POS,
24 } BASIC_LIFT_POSITION;
26 BASIC_LIFT_POSITION basic_lift_position = HIGH;
28 // number of pucks loaded is stored in robot.pucks_inside variable
29 bool lintel_present = 1;
32 /************************************************************
34 ************************************************************/
38 FSM_STATE_DECL(wait_for_command);
40 FSM_STATE_DECL(prepare_for_load);
41 FSM_STATE_DECL(scrabble); // hrabej
42 FSM_STATE_DECL(load_the_puck);
43 FSM_STATE_DECL(suck_the_puck);
44 FSM_STATE_DECL(store_pucks_in_holder);
46 FSM_STATE_DECL(unload_pucks);
47 FSM_STATE_DECL(drive_lift_into_floor);
49 FSM_STATE_DECL(dummy_action);
50 FSM_STATE_DECL(dummy_pucks_unload);
52 /* ***********************************************************
54 * ***********************************************************/
60 robot.pucks_inside = 0;
61 FSM_TRANSITION(wait_for_command);
64 case EV_PREPARE_THE_UNLOAD:
69 case EV_PUSHER_IN_POS:
70 case EV_LOAD_THE_PUCK:
73 DBG_PRINT_EVENT("unhandled event");
80 FSM_STATE(wait_for_command)
84 printf("wait_for_command_state_entered, number of pucks stored: %d\n", robot.pucks_inside);
85 // put all actuators to defined initial positions
86 act_belts(BELTS_OFF, BELTS_OFF);
87 if (robot.pucks_inside<4) {
88 act_chelae(CHELA_OPEN, CHELA_OPEN);
90 act_chelae(CHELA_TIGHT, CHELA_TIGHT);
92 act_holder(HOLDER_TIGHT); //act_holder(HOLDER_LOOSE);
93 act_lift(basic_lift_position);
94 switch(basic_lift_position) {
96 printf("basic lift position set to LOW\n");
99 printf("basic lift position set to HIGH\n");
102 act_pusher(PUSHER_INSIDE);
103 act_hokuyo(HOKUYO_PITCH_HORIZONTAL);
106 #ifdef USE_DUMMY_ACTIONS
107 FSM_TRANSITION(dummy_action);
109 FSM_TRANSITION(scrabble);
112 case EV_LOAD_THE_PUCK:
113 #ifdef USE_DUMMY_ACTIONS
114 FSM_TRANSITION(dummy_action);
116 FSM_TRANSITION(load_the_puck);
119 case EV_PREPARE_THE_UNLOAD:
120 if (robot.pucks_inside == 0) {
121 FSM_SIGNAL(MAIN, EV_ACTION_ERROR, NULL);
123 floor_to_unload = FSM_EVENT_INT;
124 #ifdef USE_DUMMY_ACTIONS
125 FSM_TRANSITION(dummy_pucks_unload);
127 FSM_TRANSITION(unload_pucks);
132 case EV_PUSHER_IN_POS:
133 case EV_PUCK_INSIDE: // we do not want react unless MAIN FSM tells us to
135 case EV_UNLOAD_PUCKS:
139 DBG_PRINT_EVENT("unhandled event");
146 /************************************************************
147 * LOAD THE PUCK ACTION
148 ************************************************************/
150 /* FSM_STATE(prepare_for_load)
154 act_lift(LIFT_GROUND_POS);
157 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
160 FSM_TRANSITION(scrabble);
162 case EV_LOAD_THE_PUCK:
163 FSM_TRANSITION(load_the_puck);
166 case EV_PREPARE_THE_UNLOAD:
167 case EV_UNLOAD_PUCKS:
170 case EV_PUSHER_IN_POS:
172 DBG_PRINT_EVENT("unhandled event");
183 act_chelae(CHELA_LOOSE, CHELA_LOOSE);
185 case EV_LOAD_THE_PUCK:
186 FSM_TRANSITION(load_the_puck);
190 case EV_PREPARE_THE_UNLOAD:
191 case EV_UNLOAD_PUCKS:
195 case EV_PUSHER_IN_POS:
197 DBG_PRINT_EVENT("unhandled event");
204 FSM_STATE(load_the_puck)
208 printf("load_the_puck_state entered\n");
210 act_pusher(PUSHER_INSIDE);
211 act_chelae(CHELA_OPEN, CHELA_OPEN);
212 act_belts(BELTS_OFF, BELTS_OFF);
213 if (robot.pucks_inside > 0) {
214 act_holder(HOLDER_TIGHT);
218 printf("lift in position\n");
219 FSM_TRANSITION(suck_the_puck);
222 case EV_PREPARE_THE_UNLOAD:
223 case EV_UNLOAD_PUCKS:
226 case EV_PUSHER_IN_POS:
228 case EV_LOAD_THE_PUCK:
230 DBG_PRINT_EVENT("unhandled event");
237 FSM_STATE(suck_the_puck)
239 static int timer_arrival_count;
242 // we expect lift is on the ground
243 timer_arrival_count = 0;
244 printf("suck_the_puck state entered\n");
246 act_chelae(CHELA_TIGHT, CHELA_TIGHT);
247 act_belts(BELTS_IN, BELTS_IN);
250 #ifdef GIVE_UP_ON_PUCK_PRESENCE_SENSOR
252 FSM_TRANSITION(store_pucks_in_holder);
254 FSM_TRANSITION(store_pucks_in_holder);
257 timer_arrival_count++;
258 switch (timer_arrival_count) {
260 act_belts(BELTS_OUT, BELTS_OUT);
264 act_belts(BELTS_IN, BELTS_IN);
268 FSM_SIGNAL(MAIN, EV_ACTION_ERROR, NULL);
269 FSM_TRANSITION(wait_for_command);
275 case EV_LOAD_THE_PUCK:
277 case EV_PUSHER_IN_POS:
278 case EV_PREPARE_THE_UNLOAD:
279 case EV_UNLOAD_PUCKS:
282 DBG_PRINT_EVENT("unhandled event");
285 act_belts(BELTS_OFF, BELTS_OFF);
286 act_chelae(CHELA_OPEN, CHELA_OPEN);
291 FSM_STATE(store_pucks_in_holder)
296 act_holder(HOLDER_OPENED);
297 if (robot.pucks_inside > 2) {
298 robot.pucks_inside++; // FIXME: (?) change this variable only here in this state?
299 basic_lift_position = HIGH;
300 FSM_TRANSITION(wait_for_command);
301 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
304 act_holder(HOLDER_OPENED);
305 act_lift(LIFT_IN_HOLDER_POS);
311 act_holder(HOLDER_TIGHT);
312 act_lift(LIFT_TRAVEL_POS);
315 robot.pucks_inside++; // FIXME: (?) change this variable in EV_ENTRY and only in one place?
316 basic_lift_position = HIGH;
317 FSM_TRANSITION(wait_for_command);
318 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
322 case EV_PUCK_INSIDE: // ignore
324 case EV_PREPARE_THE_UNLOAD:
325 case EV_UNLOAD_PUCKS:
328 case EV_PUSHER_IN_POS:
329 case EV_LOAD_THE_PUCK:
332 DBG_PRINT_EVENT("unhandled event");
339 /************************************************************
340 * UNLOAD THE PUCK ACTION
341 ************************************************************/
343 FSM_STATE(unload_pucks)
347 act_chelae(CHELA_OPEN, CHELA_OPEN);
348 printf("unloading pucks\n");
349 if (robot.pucks_inside < 4) {
350 act_lift(LIFT_BELOW_HOLDER_POS);
352 // if there are 4 pucks loaded, we do not need to manipulate the lift
353 FSM_TRANSITION(drive_lift_into_floor);
357 printf("lift in position\n");
358 FSM_TRANSITION(drive_lift_into_floor);
360 case EV_PUCK_INSIDE: // ignore
362 case EV_PREPARE_THE_UNLOAD:
363 case EV_UNLOAD_PUCKS:
366 case EV_PUSHER_IN_POS:
367 case EV_LOAD_THE_PUCK:
370 DBG_PRINT_EVENT("unhandled event");
373 act_holder(HOLDER_OPENED);
378 FSM_STATE(drive_lift_into_floor)
382 printf("driving lift to floor %d\n", floor_to_unload);
383 int lift_destination;
384 switch(floor_to_unload) {
385 case 0: lift_destination = LIFT_FLOOR0;
387 case 1: lift_destination = LIFT_FLOOR1 + LIFT_SHIFT;
389 case 2: lift_destination = LIFT_FLOOR2 + LIFT_SHIFT;
391 case 3: lift_destination = LIFT_FLOOR3 + LIFT_SHIFT;
393 case 4: lift_destination = LIFT_FLOOR4 + LIFT_SHIFT;
396 act_lift(lift_destination);
400 printf("lift in position\n");
401 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
403 case EV_UNLOAD_PUCKS:
404 printf("using pusher\n");
405 robot.pucks_inside = 0;
406 act_pusher(PUSHER_FULLY_OUTSIDE);
408 case EV_PUSHER_IN_POS:
409 printf("pusher in position\n");
410 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
413 printf("returning to wait_for_command state\n");
414 FSM_TRANSITION(wait_for_command);
416 case EV_PUCK_INSIDE: // ignore
418 case EV_PREPARE_THE_UNLOAD:
421 case EV_LOAD_THE_PUCK:
423 DBG_PRINT_EVENT("unhandled event");
430 /************************************************************
431 * GENERIC DUMMY ACTION
432 ************************************************************/
434 FSM_STATE(dummy_action)
441 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
442 FSM_TRANSITION(wait_for_command);
445 case EV_PREPARE_THE_UNLOAD:
446 case EV_UNLOAD_PUCKS:
449 case EV_PUSHER_IN_POS:
450 case EV_LOAD_THE_PUCK:
453 DBG_PRINT_EVENT("unhandled event");
460 /************************************************************
461 * DUMMY UNLOAD ACTION
462 ************************************************************/
464 FSM_STATE(dummy_pucks_unload)
466 static int dummy_unload_status;
469 dummy_unload_status = 0;
470 printf("dummy: driving lift to floor %d\n", floor_to_unload);
474 FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
475 dummy_unload_status++;
477 case EV_UNLOAD_PUCKS:
478 if (dummy_unload_status == 1)
482 if (dummy_unload_status == 2)
486 case EV_PUSHER_IN_POS:
488 case EV_PREPARE_THE_UNLOAD:
490 case EV_LOAD_THE_PUCK:
492 DBG_PRINT_EVENT("unhandled event");
506 case EV_PREPARE_THE_UNLOAD:
507 case EV_UNLOAD_PUCKS:
511 case EV_PUSHER_IN_POS:
512 case EV_LOAD_THE_PUCK:
515 DBG_PRINT_EVENT("unhandled event");