summaryrefslogtreecommitdiff
path: root/digital
diff options
context:
space:
mode:
authorJérôme Jutteau2011-05-30 18:15:49 +0200
committerJérôme Jutteau2011-05-30 18:20:47 +0200
commit69bae8c81600790e5593facf92be774458d7b7c7 (patch)
tree4e0a09075b6c986dde3092da726c521ec57ad6aa /digital
parent35d59d44b1b2fa98de77192cefffd0018acd1048 (diff)
digital/io-hub: manage founded towers
Diffstat (limited to 'digital')
-rw-r--r--digital/io-hub/src/robospierre/element.h5
-rw-r--r--digital/io-hub/src/robospierre/logistic.c34
2 files changed, 38 insertions, 1 deletions
diff --git a/digital/io-hub/src/robospierre/element.h b/digital/io-hub/src/robospierre/element.h
index 7ef80e48..01e8f22e 100644
--- a/digital/io-hub/src/robospierre/element.h
+++ b/digital/io-hub/src/robospierre/element.h
@@ -44,6 +44,11 @@
#define ELEMENT_TOWER_1_KING 32
#define ELEMENT_TOWER_2_KING 64
+#define ELEMENT_TOWER (ELEMENT_TOWER_1_QUEEN | \
+ ELEMENT_TOWER_2_QUEEN | \
+ ELEMENT_TOWER_1_KING | \
+ ELEMENT_TOWER_2_KING)
+
/** Return non zero if element is a head, not a pawn. */
#define ELEMENT_IS_HEAD(e) ((e) && !((e) & ELEMENT_PAWN))
diff --git a/digital/io-hub/src/robospierre/logistic.c b/digital/io-hub/src/robospierre/logistic.c
index 1e44d675..35e40efa 100644
--- a/digital/io-hub/src/robospierre/logistic.c
+++ b/digital/io-hub/src/robospierre/logistic.c
@@ -250,6 +250,33 @@ logistic_put_element ()
}
}
+/** If we picked up a tower. */
+static void
+logistic_new_tower ()
+{
+ uint8_t dir_bay, nodir_bay;
+ if (ctx.collect_direction == DIRECTION_FORWARD)
+ {
+ dir_bay = CLAMP_SLOT_FRONT_BOTTOM;
+ nodir_bay = CLAMP_SLOT_BACK_BOTTOM;
+ }
+ else
+ {
+ dir_bay = CLAMP_SLOT_BACK_BOTTOM;
+ nodir_bay = CLAMP_SLOT_FRONT_BOTTOM;
+ }
+ if (ctx.slots[dir_bay] == ELEMENT_TOWER)
+ {
+ ctx.ready = 1;
+ if (ctx.collect_direction == DIRECTION_FORWARD)
+ ctx.collect_direction = DIRECTION_BACKWARD;
+ else
+ ctx.collect_direction = DIRECTION_FORWARD;
+ }
+ if (ctx.slots[nodir_bay] == ELEMENT_TOWER)
+ ctx.ready = 1;
+}
+
/** Examine current state and take a decision. */
static void
logistic_decision (void)
@@ -268,6 +295,11 @@ logistic_decision (void)
if (ctx.prepare == 3)
return;
+ /* We founded a tower ! */
+ logistic_new_tower ();
+ if (ctx.ready)
+ return;
+
/* Check if we really need to prepare something. */
logistic_check_need_prepare ();
@@ -359,7 +391,7 @@ logistic_decision (void)
return;
}
/* We have to prepare an element to put out. */
- else if ((ctx.prepare == 2 || ctx.need_prepare) && ctx.construct_possible)
+ else if (ctx.prepare == 2 && ctx.construct_possible)
{
logistic_put_element ();
}