summaryrefslogtreecommitdiffhomepage
path: root/digital/io-hub/src/apbirthday/cannon.cc
diff options
context:
space:
mode:
Diffstat (limited to 'digital/io-hub/src/apbirthday/cannon.cc')
-rw-r--r--digital/io-hub/src/apbirthday/cannon.cc34
1 files changed, 28 insertions, 6 deletions
diff --git a/digital/io-hub/src/apbirthday/cannon.cc b/digital/io-hub/src/apbirthday/cannon.cc
index eaa82c72..d14af355 100644
--- a/digital/io-hub/src/apbirthday/cannon.cc
+++ b/digital/io-hub/src/apbirthday/cannon.cc
@@ -30,6 +30,17 @@ Cannon::Cannon ()
// Init the cannon and the RGB sensor
}
+void
+Cannon::fire (int duration)
+{
+ if (duration < 1)
+ duration = 1;
+ else if (duration > 3)
+ duration = 3;
+ duration_ = duration;
+ ANGFSM_HANDLE (AI, cannon_fire);
+}
+
inline void Cannon::blower_on (int speed)
{
// Start the blower
@@ -121,13 +132,24 @@ FSM_TRANS (CANNON_READY, cannon_fire, CANNON_FIRING)
robot->rgb.start_cannon_color ();
}
-FSM_TRANS_TIMEOUT (CANNON_FIRING, 2500, CANNON_READY)
+FSM_TRANS_TIMEOUT (CANNON_FIRING, 1750,
+ again, CANNON_FIRING,
+ end, CANNON_READY)
{
- // Stop the blower
- Cannon::blower_off ();
- // Stop the RGB sensor
- robot->rgb.stop_cannon_color ();
- robot->fsm_queue.post (FSM_EVENT (cannon_fire_ok));
+ robot->cannon.duration_--;
+ if (robot->cannon.duration_)
+ {
+ return ANGFSM_BRANCH (again);
+ }
+ else
+ {
+ // Stop the blower
+ Cannon::blower_off ();
+ // Stop the RGB sensor
+ robot->rgb.stop_cannon_color ();
+ robot->fsm_queue.post (FSM_EVENT (cannon_fire_ok));
+ return ANGFSM_BRANCH (end);
+ }
}