/* filterbridge_cb.c - filterbridge FSM callbacks. */ /* {{{ * * Copyright (C) 2009 Nicolas Haller * * APBTeam: * Web: http://apbteam.org/ * Email: team AT apbteam DOT org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * }}} */ #include "common.h" #include "fsm.h" #include "filterbridge_cb.h" #include "elevator.h" #include "servo_pos.h" #include "aquajim.h" #include "filterbridge.h" #include "top.h" #include "cylinder.h" #include "modules/trace/trace.h" #include "trace_event.h" /* * IDLE =start=> * => WAIT_JACK_IN * we wait for the jack */ fsm_branch_t filterbridge__IDLE__start (void) { return filterbridge_next (IDLE, start); } /* * WAIT_JACK_IN =jack_inserted_into_bot=> * => CLOSE_DOOR * we init the bridge */ fsm_branch_t filterbridge__WAIT_JACK_IN__jack_inserted_into_bot (void) { servo_pos_move_to(SERVO_FINGER_ID, SERVO_FINGER_IDLE); servo_pos_move_to(SERVO_DOOR_ID, SERVO_DOOR_CLOSE); return filterbridge_next (WAIT_JACK_IN, jack_inserted_into_bot); } /* * CLOSE_DOOR =state_timeout=> * => WAIT_A_PUCK * we are ready, we wait a puck */ fsm_branch_t filterbridge__CLOSE_DOOR__state_timeout (void) { return filterbridge_next (CLOSE_DOOR, state_timeout); } /* * WAIT_A_PUCK =puck_on_pos2=> * => WAIT_LIFT_READY * Puck ready to be dropped to the elevator. Test if elvt ready to get it. */ fsm_branch_t filterbridge__WAIT_A_PUCK__puck_on_pos2 (void) { return filterbridge_next (WAIT_A_PUCK, puck_on_pos2); } /* * WAIT_LIFT_READY =lift_ready=> * => MARCEL_WAIT * the lift is ready */ fsm_branch_t filterbridge__WAIT_LIFT_READY__lift_ready (void) { return filterbridge_next (WAIT_LIFT_READY, lift_ready); } /* * MARCEL_WAIT =state_timeout=> * => OPEN_DOOR * lift ready, we deliver */ fsm_branch_t filterbridge__MARCEL_WAIT__state_timeout (void) { servo_pos_move_to(SERVO_DOOR_ID, SERVO_DOOR_OPEN); return filterbridge_next (MARCEL_WAIT, state_timeout); } /* * OPEN_DOOR =state_timeout=> * => PUSH_PUCK * we push the puck to the lift */ fsm_branch_t filterbridge__OPEN_DOOR__state_timeout (void) { servo_pos_move_to(SERVO_FINGER_ID,SERVO_FINGER_PUSHING); return filterbridge_next (OPEN_DOOR, state_timeout); } /* * PUSH_PUCK =no_puck_on_pos2=> * => TEMPO_ELVETATOR_COMMUNICATION * nothing to do. */ fsm_branch_t filterbridge__PUSH_PUCK__no_puck_on_pos2 (void) { return filterbridge_next (PUSH_PUCK, no_puck_on_pos2); } /* * TEMPO_ELVETATOR_COMMUNICATION =state_timeout=> * => CLOSE_DOOR * the puck disappears, we close doors * tell the elevator we are ready. */ fsm_branch_t filterbridge__TEMPO_ELVETATOR_COMMUNICATION__state_timeout (void) { ++elvt_nb_puck; if(fb_nb_puck) --fb_nb_puck; top_puck_inside_bot = cylinder_nb_puck + fb_nb_puck + elvt_nb_puck; elvt_new_puck = 1; servo_pos_move_to(SERVO_FINGER_ID, SERVO_FINGER_IDLE); servo_pos_move_to(SERVO_DOOR_ID, SERVO_DOOR_CLOSE); TRACE (TRACE_FSM__NBPUCKS, top_total_puck_taken, top_puck_inside_bot, cylinder_nb_puck, fb_nb_puck, elvt_nb_puck); return filterbridge_next (TEMPO_ELVETATOR_COMMUNICATION, state_timeout); }