summaryrefslogtreecommitdiff
path: root/digital
diff options
context:
space:
mode:
authorNicolas Schodet2010-05-14 18:54:15 +0200
committerNicolas Schodet2010-05-14 18:54:15 +0200
commit1da5c07801b01ab63a748d0422291c981691c9e6 (patch)
tree73db7d9b7c07206065674d9376289a7bfb4faf4f /digital
parent3ee60de086963a418bb2104da3f9dded851a6b50 (diff)
digital/io/src: add food_cancel
Diffstat (limited to 'digital')
-rw-r--r--digital/io/src/ai_top_cb.c4
-rw-r--r--digital/io/src/food.c77
-rw-r--r--digital/io/src/food.h4
-rw-r--r--digital/io/src/top.fsm1
4 files changed, 54 insertions, 32 deletions
diff --git a/digital/io/src/ai_top_cb.c b/digital/io/src/ai_top_cb.c
index 65895afe..0d7d25c3 100644
--- a/digital/io/src/ai_top_cb.c
+++ b/digital/io/src/ai_top_cb.c
@@ -318,12 +318,16 @@ ai__COLLECT__move_fsm_succeed (void)
* COLLECT =move_fsm_failed=>
* unload => UNLOAD
* collect => COLLECT
+ * cancel this element
*/
fsm_branch_t
ai__COLLECT__move_fsm_failed (void)
{
if (top_collect (0))
+ {
+ food_cancel (top_food);
return ai_next_branch (COLLECT, move_fsm_failed, collect);
+ }
else
return ai_next_branch (COLLECT, move_fsm_failed, unload);
}
diff --git a/digital/io/src/food.c b/digital/io/src/food.c
index 0ed6af1d..26a2f034 100644
--- a/digital/io/src/food.c
+++ b/digital/io/src/food.c
@@ -58,6 +58,8 @@ struct food_t
vect_t pos;
/** Food type. Corn can be good or bad. */
enum food_type_t type;
+ /** Score modifier. */
+ int16_t score;
};
/** Information gathered on food. */
@@ -65,46 +67,46 @@ struct food_t food_table[] =
{
/* {{{ */
/* First half. */
- { 1, { 150, 128 + 5 * 250 }, FOOD_TYPE_CORN },
- { 1, { 150, 128 + 4 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 150, 128 + 3 * 250 }, FOOD_TYPE_CORN },
- { 1, { 150, 128 + 2 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 150, 128 + 1 * 250 }, FOOD_TYPE_CORN },
+ { 1, { 150, 128 + 5 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 150, 128 + 4 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 150, 128 + 3 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 150, 128 + 2 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 150, 128 + 1 * 250 }, FOOD_TYPE_CORN, 0 },
- { 1, { 150 + 1 * 450, 128 + 4 * 250 }, FOOD_TYPE_CORN },
- { 1, { 150 + 1 * 450, 128 + 3 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 150 + 1 * 450, 128 + 2 * 250 }, FOOD_TYPE_CORN },
- { 1, { 150 + 1 * 450, 128 + 1 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 150 + 1 * 450, 128 + 0 * 250 }, FOOD_TYPE_CORN },
+ { 1, { 150 + 1 * 450, 128 + 4 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 150 + 1 * 450, 128 + 3 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 150 + 1 * 450, 128 + 2 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 150 + 1 * 450, 128 + 1 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 150 + 1 * 450, 128 + 0 * 250 }, FOOD_TYPE_CORN, 0 },
- { 1, { 150 + 2 * 450, 128 + 3 * 250 }, FOOD_TYPE_CORN },
- { 1, { 150 + 2 * 450, 128 + 2 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 150 + 2 * 450, 128 + 1 * 250 }, FOOD_TYPE_CORN },
- { 1, { 150 + 2 * 450, 128 + 0 * 250 }, FOOD_TYPE_TOMATO },
+ { 1, { 150 + 2 * 450, 128 + 3 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 150 + 2 * 450, 128 + 2 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 150 + 2 * 450, 128 + 1 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 150 + 2 * 450, 128 + 0 * 250 }, FOOD_TYPE_TOMATO, 0 },
/* Second half. */
- { 1, { 3000 - 150, 128 + 5 * 250 }, FOOD_TYPE_CORN },
- { 1, { 3000 - 150, 128 + 4 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 3000 - 150, 128 + 3 * 250 }, FOOD_TYPE_CORN },
- { 1, { 3000 - 150, 128 + 2 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 3000 - 150, 128 + 1 * 250 }, FOOD_TYPE_CORN },
+ { 1, { 3000 - 150, 128 + 5 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 3000 - 150, 128 + 4 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 3000 - 150, 128 + 3 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 3000 - 150, 128 + 2 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 3000 - 150, 128 + 1 * 250 }, FOOD_TYPE_CORN, 0 },
- { 1, { 3000 - 150 - 1 * 450, 128 + 4 * 250 }, FOOD_TYPE_CORN },
- { 1, { 3000 - 150 - 1 * 450, 128 + 3 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 3000 - 150 - 1 * 450, 128 + 2 * 250 }, FOOD_TYPE_CORN },
- { 1, { 3000 - 150 - 1 * 450, 128 + 1 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 3000 - 150 - 1 * 450, 128 + 0 * 250 }, FOOD_TYPE_CORN },
+ { 1, { 3000 - 150 - 1 * 450, 128 + 4 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 3000 - 150 - 1 * 450, 128 + 3 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 3000 - 150 - 1 * 450, 128 + 2 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 3000 - 150 - 1 * 450, 128 + 1 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 3000 - 150 - 1 * 450, 128 + 0 * 250 }, FOOD_TYPE_CORN, 0 },
- { 1, { 3000 - 150 - 2 * 450, 128 + 3 * 250 }, FOOD_TYPE_CORN },
- { 1, { 3000 - 150 - 2 * 450, 128 + 2 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 3000 - 150 - 2 * 450, 128 + 1 * 250 }, FOOD_TYPE_CORN },
- { 1, { 3000 - 150 - 2 * 450, 128 + 0 * 250 }, FOOD_TYPE_TOMATO },
+ { 1, { 3000 - 150 - 2 * 450, 128 + 3 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 3000 - 150 - 2 * 450, 128 + 2 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 3000 - 150 - 2 * 450, 128 + 1 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 3000 - 150 - 2 * 450, 128 + 0 * 250 }, FOOD_TYPE_TOMATO, 0 },
/* Center. */
- { 1, { 3000 / 2, 128 + 3 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 3000 / 2, 128 + 2 * 250 }, FOOD_TYPE_CORN },
- { 1, { 3000 / 2, 128 + 1 * 250 }, FOOD_TYPE_TOMATO },
- { 1, { 3000 / 2, 128 + 0 * 250 }, FOOD_TYPE_CORN },
+ { 1, { 3000 / 2, 128 + 3 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 3000 / 2, 128 + 2 * 250 }, FOOD_TYPE_CORN, 0 },
+ { 1, { 3000 / 2, 128 + 1 * 250 }, FOOD_TYPE_TOMATO, 0 },
+ { 1, { 3000 / 2, 128 + 0 * 250 }, FOOD_TYPE_CORN, 0 },
/* }}} */
};
@@ -170,6 +172,8 @@ food_score (position_t robot_pos, uint8_t food)
score -= 500;
else
score -= 100000;
+ /* Score modifier. */
+ score += food_table[food].score;
/* Distance to robot. */
food_pos (food, &v);
int32_t dr = distance_point_point (&v, &robot_pos.v);
@@ -275,3 +279,12 @@ food_black (uint8_t food)
food_table[food].valid = 1;
food_table[food].type = FOOD_TYPE_CORN_BLACK;
}
+
+void
+food_cancel (uint8_t food)
+{
+ assert (food < UTILS_COUNT (food_table));
+ food_table[food].valid = 1;
+ food_table[food].score += 300;
+}
+
diff --git a/digital/io/src/food.h b/digital/io/src/food.h
index b0e15034..2feced0e 100644
--- a/digital/io/src/food.h
+++ b/digital/io/src/food.h
@@ -71,4 +71,8 @@ food_slow_motion (uint8_t food);
void
food_black (uint8_t food);
+/** Cancel a food pickup. */
+void
+food_cancel (uint8_t food);
+
#endif /* food_h */
diff --git a/digital/io/src/top.fsm b/digital/io/src/top.fsm
index 4bebcdaa..f9a95994 100644
--- a/digital/io/src/top.fsm
+++ b/digital/io/src/top.fsm
@@ -134,6 +134,7 @@ COLLECT:
move to food
move_fsm_failed: unload -> UNLOAD
move_fsm_failed: collect -> COLLECT
+ cancel this element
COLLECT_SLOW_MOTION:
bot_move_succeed: unload -> UNLOAD