* ***********************************************************/
FSM_STATE_DECL(wait_for_command);
+FSM_STATE_DECL(reactive_demo);
FSM_STATE_DECL(dummy_action);
+FSM_STATE_DECL(suck_the_puck);
/* ***********************************************************
* STATE DEFINITIONS
case EV_ENTRY:
act_belts(BELTS_OFF, BELTS_OFF);
act_chelae(CHELA_OPEN, CHELA_OPEN);
+ FSM_TRANSITION(reactive_demo);
// TODO
// put all actuators to defined initial positions
break;
case EV_PICK_UP_PUCK:
- FSM_TRANSITION(dummy_action);
+ //FSM_TRANSITION(dummy_action);
break;
case EV_RETURN:
case EV_TIMER:
+ case EV_PUCK_REACHABLE:
+ case EV_PUCK_INSIDE:
DBG_PRINT_EVENT("unhandled event");
break;
case EV_EXIT:
}
}
+FSM_STATE(reactive_demo) {
+ switch (FSM_EVENT) {
+ case EV_ENTRY:
+ break;
+ case EV_PUCK_REACHABLE:
+ FSM_TRANSITION(suck_the_puck);
+ break;
+ case EV_PUCK_INSIDE:
+ break;
+ case EV_RETURN:
+ case EV_TIMER:
+ case EV_PICK_UP_PUCK:
+ DBG_PRINT_EVENT("unhandled event");
+ break;
+ case EV_EXIT:
+ break;
+ }
+}
+
+FSM_STATE(suck_the_puck) {
+ switch (FSM_EVENT) {
+ case EV_ENTRY:
+ FSM_TIMER(1000);
+ act_chelae(CHELA_TIGHT, CHELA_TIGHT);
+ act_belts(BELTS_IN, BELTS_IN);
+ break;
+ case EV_PUCK_INSIDE:
+ act_belts(BELTS_OFF, BELTS_OFF);
+ FSM_TRANSITION(reactive_demo);
+ break;
+ case EV_RETURN:
+ case EV_TIMER:
+ FSM_TRANSITION(reactive_demo);
+ break;
+ case EV_PICK_UP_PUCK:
+ case EV_PUCK_REACHABLE:
+ DBG_PRINT_EVENT("unhandled event");
+ break;
+ case EV_EXIT:
+ act_belts(BELTS_OFF, BELTS_OFF);
+ act_chelae(CHELA_OPEN, CHELA_OPEN);
+ break;
+ }
+}
+
FSM_STATE(dummy_action) {
switch (FSM_EVENT) {
case EV_ENTRY:
break;
case EV_RETURN:
case EV_PICK_UP_PUCK:
+ case EV_PUCK_REACHABLE:
+ case EV_PUCK_INSIDE:
DBG_PRINT_EVENT("unhandled event");
break;
case EV_EXIT:
}
-
robot.state = COMPETITION_STARTED;
ROBOT_UNLOCK(state);
//FSM_TRANSITION(approach_our_static_dispenser);
- FSM_TRANSITION(approach_opponents_static_dispenser);
+ //FSM_TRANSITION(approach_opponents_static_dispenser);
break;
case EV_RETURN:
case EV_TIMER:
robot.fsm.main.debug_states = 1;
robot.fsm.motion.debug_states = 1;
+ robot.fsm.act.debug_states = 1;
robot.fsm.main.state = &fsm_state_main_init;
robot.fsm.main.transition_callback = trans_callback;
},
"act" : {
"EV_PICK_UP_PUCK" : "Signal from the main FSM to initiate the puck picking up procedure",
+ "EV_PUCK_REACHABLE" : "Puck (or something) in reach of chelae",
+ "EV_PUCK_INSIDE" : "Puck inside the mechanism",
#"EV_LIFT_GO_POSITION" : "",
#"EV_LIFT_GROUND_POSITION" : "",
- #"EV_PUCK_INSIDE" : "",
}
}
switch (info->status) {
case NEW_DATA:
//printf("Sharp distance: %f\n", robot.orte.puck_distance.distance);
- // FIXME F.J. (?) inform display in case of invalid data?
+ if(robot.orte.puck_distance.distance <= 0.055) {
+ FSM_SIGNAL(ACT, EV_PUCK_INSIDE, NULL);
+ }
+ if(robot.orte.puck_distance.distance < 0.13 && robot.orte.puck_distance.distance > 0.055) {
+ FSM_SIGNAL(ACT, EV_PUCK_REACHABLE, NULL);
+ }
break;
case DEADLINE:
+ // FIXME F.J. (?) inform display in case of invalid data?
// FIXME F.J. (?) limited space on the display...
//robot.hw_status[STATUS_ACTUATORS]=HW_STATUS_FAILED;
DBG("ORTE deadline occurred - servos receive\n");
return rv;
/* creating publishers */
- robottype_publisher_motion_irc_create(&robot.orte, NULL, &robot.orte);
robottype_publisher_motion_speed_create(&robot.orte, NULL, &robot.orte);
- robottype_publisher_motion_status_create(&robot.orte, NULL, &robot.orte);
robottype_publisher_ref_pos_create(&robot.orte, send_ref_pos_cb, &robot.orte);
robottype_publisher_est_pos_create(&robot.orte, send_est_pos_cb, &robot.orte);
- robottype_publisher_pwr_voltage_create(&robot.orte, NULL, &robot.orte);
- robottype_publisher_pwr_ctrl_create(&robot.orte, NULL, &robot.orte);
+ //???robottype_publisher_pwr_ctrl_create(&robot.orte, NULL, &robot.orte);
robottype_publisher_lift_create(&robot.orte, send_dummy_cb, &robot.orte);
robottype_publisher_pusher_create(&robot.orte, send_dummy_cb, &robot.orte);