From 1da5c07801b01ab63a748d0422291c981691c9e6 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Fri, 14 May 2010 18:54:15 +0200 Subject: digital/io/src: add food_cancel --- digital/io/src/ai_top_cb.c | 4 +++ digital/io/src/food.c | 77 +++++++++++++++++++++++++++------------------- digital/io/src/food.h | 4 +++ digital/io/src/top.fsm | 1 + 4 files changed, 54 insertions(+), 32 deletions(-) (limited to 'digital') 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 -- cgit v1.2.3