From a952395dac9dfd8ba28a855db8e8618944a57641 Mon Sep 17 00:00:00 2001 From: Jerome Jutteau Date: Mon, 1 Apr 2013 23:37:16 +0200 Subject: digital/io-hub/src/apbirthday: be more c++ --- digital/io-hub/src/apbirthday/candles.cc | 101 +++++++++++++++++-------------- digital/io-hub/src/apbirthday/candles.hh | 60 +++++++++--------- 2 files changed, 85 insertions(+), 76 deletions(-) (limited to 'digital') diff --git a/digital/io-hub/src/apbirthday/candles.cc b/digital/io-hub/src/apbirthday/candles.cc index dfa01d57..340c1c2e 100644 --- a/digital/io-hub/src/apbirthday/candles.cc +++ b/digital/io-hub/src/apbirthday/candles.cc @@ -35,32 +35,32 @@ Candles::Candles (int calif_mode) { int i; /* Init candles color. */ - for (i = 0; i < CANDLES_NB; i++) + for (i = 0; i < total_count; i++) { - color[i] = CANDLE_UNKNOWN; - state[i] = CANDLE_UNPUNCHED; + color[i] = UNKNOWN; + state[i] = UNPUNCHED; } - color[0] = CANDLE_BLUE; - color[8] = CANDLE_BLUE; - color[7] = CANDLE_RED; - color[19] = CANDLE_RED; + color[0] = BLUE; + color[8] = BLUE; + color[7] = RED; + color[19] = RED; if (calif_mode) { - color[12] = CANDLE_WHITE; - color[13] = CANDLE_WHITE; - color[14] = CANDLE_WHITE; - color[15] = CANDLE_WHITE; + color[12] = WHITE; + color[13] = WHITE; + color[14] = WHITE; + color[15] = WHITE; } - actual_pos[FLOOR_NEAR] = CANDLES_NB; - actual_pos[FLOOR_FAR] = CANDLES_NB; + actual_pos[NEAR] = -1; + actual_pos[FAR] = -1; } void Candles::blow (int candle) { - if (CANDLE_IS_FAR(candle)) - actual_pos[FLOOR_FAR] = candle; + if (is_far (candle)) + actual_pos[FAR] = candle; else - actual_pos[FLOOR_NEAR] = candle; + actual_pos[NEAR] = candle; deduce (); robot->fsm_queue.post (FSM_EVENT (ai_candle_blow)); } @@ -72,30 +72,41 @@ void Candles::deduce () for (i = 1; i < 4; i++) if (color[i] != color[i + 3]) { - if (color[i] == CANDLE_RED) - color[i + 3] = CANDLE_BLUE; - else if (color[i] == CANDLE_BLUE) - color[i + 3] = CANDLE_RED; - else if (color[i + 3] == CANDLE_RED) - color[i] = CANDLE_BLUE; - else if (color[i + 3] == CANDLE_BLUE) - color[i] = CANDLE_RED; + if (color[i] == RED) + color[i + 3] = BLUE; + else if (color[i] == BLUE) + color[i + 3] = RED; + else if (color[i + 3] == RED) + color[i] = BLUE; + else if (color[i + 3] == BLUE) + color[i] = RED; } /* Near. */ for (i = 9; i < 14; i++) if (color[i] != color[i + 5]) { - if (color[i] == CANDLE_RED) - color[i + 5] = CANDLE_BLUE; - else if (color[i] == CANDLE_BLUE) - color[i + 5] = CANDLE_RED; - else if (color[i + 5] == CANDLE_RED) - color[i] = CANDLE_BLUE; - else if (color[i + 5] == CANDLE_BLUE) - color[i] = CANDLE_RED; + if (color[i] == RED) + color[i + 5] = BLUE; + else if (color[i] == BLUE) + color[i + 5] = RED; + else if (color[i + 5] == RED) + color[i] = BLUE; + else if (color[i + 5] == BLUE) + color[i] = RED; } } +inline bool Candles::is_near (int pos) +{ + return pos >= far_count; +} + + +inline bool Candles::is_far (int pos) +{ + return pos < far_count; +} + /* Global candle FSM */ FSM_STATES (AI_CANDLE_SLEEPING, AI_CANDLE_READY, @@ -123,26 +134,26 @@ FSM_TRANS (AI_CANDLE_SLEEPING, ai_candle_deploy, AI_CANDLE_READY) FSM_TRANS (AI_CANDLE_READY, ai_candle_blow, AI_CANDLE_READY) { int i; - for (i = 0; i < CANDLE_FLOOR_NB; i++) + for (i = 0; i < Candles::FLOOR_NB; i++) { - if (robot->candles.actual_pos[i] != CANDLE_FLOOR_NB) + if (robot->candles.actual_pos[i] != -1) { /* We can already punch if we know the color. */ - if (robot->candles.state[robot->candles.actual_pos[i]] == CANDLE_UNPUNCHED - && (robot->candles.color[robot->candles.actual_pos[i]] == (candle_color_t) team_color - || robot->candles.color[robot->candles.actual_pos[i]] == CANDLE_WHITE)) + if (robot->candles.state[robot->candles.actual_pos[i]] == Candles::UNPUNCHED + && (robot->candles.color[robot->candles.actual_pos[i]] == (Candles::Color) team_color + || robot->candles.color[robot->candles.actual_pos[i]] == Candles::WHITE)) { - if (CANDLE_IS_FAR (robot->candles.actual_pos[i])) + if (Candles::is_far (robot->candles.actual_pos[i])) FSM_HANDLE (AI, ai_candle_far_punch); else FSM_HANDLE (AI, ai_candle_near_punch); - robot->candles.state[robot->candles.actual_pos[i]] = CANDLE_PUNCHED; - robot->candles.actual_pos[i] = CANDLE_FLOOR_NB; + robot->candles.state[robot->candles.actual_pos[i]] = Candles::PUNCHED; + robot->candles.actual_pos[i] = -1; } /* We need to analyse color. */ - else if (robot->candles.color[robot->candles.actual_pos[i]] == CANDLE_UNKNOWN) + else if (robot->candles.color[robot->candles.actual_pos[i]] == Candles::UNKNOWN) { - if (CANDLE_IS_FAR (robot->candles.actual_pos[i])) + if (Candles::is_far (robot->candles.actual_pos[i])) FSM_HANDLE (AI, ai_candle_far_analyse); else FSM_HANDLE (AI, ai_candle_near_analyse); @@ -233,7 +244,8 @@ FSM_TRANS_TIMEOUT (AI_CANDLE_FAR_ANALYSING, 10, AI_CANDLE_FAR_ANALYSE_SLEEP) //T /* Update color. */ if (true) // TODO color analysise is ok { - robot->candles.color[robot->candles.actual_pos[FLOOR_FAR]] = CANDLE_RED; // TODO = color_result + robot->candles.color[robot->candles.actual_pos[Candles::FAR]] = + Candles::RED; // TODO = color_result /* Update whole colors. */ robot->candles.deduce (); /* Send blow event. */ @@ -263,7 +275,8 @@ FSM_TRANS_TIMEOUT (AI_CANDLE_NEAR_ANALYSING, 10, AI_CANDLE_NEAR_ANALYSE_SLEEP) / /* Update color. */ if (true) // TODO color analysise is ok { - robot->candles.color[robot->candles.actual_pos[FLOOR_NEAR]] = CANDLE_RED; // TODO + robot->candles.color[robot->candles.actual_pos[Candles::NEAR]] = + Candles::RED; // TODO = color_result /* Update whole colors. */ robot->candles.deduce (); /* Send blow event. */ diff --git a/digital/io-hub/src/apbirthday/candles.hh b/digital/io-hub/src/apbirthday/candles.hh index 5aa917d9..3d953a87 100644 --- a/digital/io-hub/src/apbirthday/candles.hh +++ b/digital/io-hub/src/apbirthday/candles.hh @@ -25,12 +25,6 @@ // // }}} -#define CANDLE_FAR 8 -#define CANDLE_NEAR 12 -#define CANDLES_NB (CANDLE_NEAR + CANDLE_FAR) -#define CANDLE_IS_FAR(c) ((c) < CANDLE_FAR) -#define CANDLE_IS_NEAR(c) ((c) >= CANDLE_FAR) - /* The cake is a lie ! ----------------------------------------------------------- @@ -45,38 +39,40 @@ - ______ - */ -typedef enum -{ - CANDLE_UNPUNCHED, - CANDLE_PUNCHED, - CANDLE_STATE_NB -} candle_state_t; - -typedef enum -{ - FLOOR_NEAR = 0, - FLOOR_FAR = 1, - CANDLE_FLOOR_NB -} candle_floor_t; - -/* XXX use another common type for colors ? */ -typedef enum -{ - CANDLE_RED = TEAM_COLOR_RIGHT, - CANDLE_BLUE = TEAM_COLOR_LEFT, - CANDLE_WHITE, - CANDLE_UNKNOWN, -} candle_color_t; - class Candles { public: - candle_state_t state[CANDLES_NB]; - candle_color_t color[CANDLES_NB]; Candles (int calif_mode); void blow (int candle); void deduce (); - int actual_pos[CANDLE_FLOOR_NB]; + enum State + { + UNPUNCHED, + PUNCHED, + }; + enum Floor + { + NEAR = 0, + FAR = 1, + FLOOR_NB + }; + enum Color + { + RED = TEAM_COLOR_RIGHT, + BLUE = TEAM_COLOR_LEFT, + WHITE, + UNKNOWN, + }; + static bool is_near (int pos); + static bool is_far (int pos); + private: + static const int total_count = 20; + static const int near_count = 12; + static const int far_count = 8; + public: + State state[total_count]; + Color color[total_count]; + int actual_pos[FLOOR_NB]; }; #endif // candles_hh -- cgit v1.2.3