summaryrefslogtreecommitdiff
path: root/digital/io-hub/src/apbirthday
diff options
context:
space:
mode:
authorNicolas Schodet2013-03-21 21:20:18 +0100
committerNicolas Schodet2013-03-21 21:20:18 +0100
commit0c5ba0b879baa5291d35dd0a5028ab9a5d52560d (patch)
tree0d1dbc0a4c91776e3db686ba672755ba5dfa8bd8 /digital/io-hub/src/apbirthday
parentc9f14499885b3c087aa5b107156cc91b48917a7c (diff)
digital/io-hub/src/apbirthday: add FSM queue
Diffstat (limited to 'digital/io-hub/src/apbirthday')
-rw-r--r--digital/io-hub/src/apbirthday/Makefile4
-rw-r--r--digital/io-hub/src/apbirthday/robot.cc16
-rw-r--r--digital/io-hub/src/apbirthday/robot.hh6
3 files changed, 19 insertions, 7 deletions
diff --git a/digital/io-hub/src/apbirthday/Makefile b/digital/io-hub/src/apbirthday/Makefile
index 89458a08..362e7476 100644
--- a/digital/io-hub/src/apbirthday/Makefile
+++ b/digital/io-hub/src/apbirthday/Makefile
@@ -5,7 +5,7 @@ PROGS = apbirthday
apbirthday_SOURCES = main.cc robot.cc hardware.host.cc hardware.stm32.cc \
i2c_queue.cc asserv.cc \
top.cc \
- angfsm.host.c angfsm_gen_arm_AI.arm.c \
+ angfsm.host.c angfsm_gen_arm_AI.arm.c fsm_queue.cc \
$(AVR_SOURCES)
MODULES = utils hal/gpio hal/uart hal/usb hal/i2c base/proto
@@ -21,7 +21,7 @@ AVR_SOURCES = $(foreach module,$(AVR_MODULES),$($(subst /,_,$(module))_SOURCES))
# FSM.
INCLUDES += -I$(BASE)/../ai/src/fsm -I.
-vpath %.c $(BASE)/../ai/src/fsm
+vpath angfsm.host.c $(BASE)/../ai/src/fsm
# Common files.
INCLUDES += -I../common-cc
diff --git a/digital/io-hub/src/apbirthday/robot.cc b/digital/io-hub/src/apbirthday/robot.cc
index 4464013e..83a9928d 100644
--- a/digital/io-hub/src/apbirthday/robot.cc
+++ b/digital/io-hub/src/apbirthday/robot.cc
@@ -46,19 +46,27 @@ Robot::main_loop ()
// Wait until next cycle.
hardware.wait ();
// Handle communications.
- main_i2c_queue_.sync ();
+ bool sync = main_i2c_queue_.sync ();
+ // Handle events if synchronised.
+ if (sync)
+ fsm_gen_event ();
// Handle commands.
dev_proto.accept ();
zb_proto.accept ();
usb_proto.accept ();
- // Handle events.
- fsm_gen_event ();
}
}
-void
+bool
Robot::fsm_gen_event ()
{
+ if (fsm_queue.poll ())
+ {
+ FsmQueue::Event event = fsm_queue.pop ();
+ if (ANGFSM_HANDLE_VAR (AI, event))
+ return true;
+ }
+ return false;
}
void
diff --git a/digital/io-hub/src/apbirthday/robot.hh b/digital/io-hub/src/apbirthday/robot.hh
index e0b50f41..d9590e59 100644
--- a/digital/io-hub/src/apbirthday/robot.hh
+++ b/digital/io-hub/src/apbirthday/robot.hh
@@ -25,6 +25,7 @@
// }}}
#include "hardware.hh"
#include "asserv.hh"
+#include "fsm_queue.hh"
#include "ucoolib/base/proto/proto.hh"
@@ -40,7 +41,7 @@ class Robot : public ucoo::Proto::Handler
/// Main program loop.
void main_loop ();
/// Generate events for the FSM.
- void fsm_gen_event ();
+ bool fsm_gen_event ();
/// Receive proto messages.
void proto_handle (ucoo::Proto &proto, char cmd, const uint8_t *args, int size);
public:
@@ -55,6 +56,9 @@ class Robot : public ucoo::Proto::Handler
private:
/// Proto associated to each serial interface.
ucoo::Proto dev_proto, zb_proto, usb_proto;
+ public:
+ /// Public access to deferred events FSM queue.
+ FsmQueue fsm_queue;
};
/// Global instance pointer.