X-Git-Url: http://git.droids-corp.org/?p=aversive.git;a=blobdiff_plain;f=projects%2Fmicrob2010%2Fmainboard%2Fstrat_utils.c;h=33c1474ee5e995a7e6a52bfe26f266873a9ea566;hp=b1bf942e4c3738a72e46baf88b7020b084c72d15;hb=a3ec2f79a4ed7b2148ede881e0685ddb6f141d82;hpb=1714f4ee916fca95ce24120ea6e698237913f947 diff --git a/projects/microb2010/mainboard/strat_utils.c b/projects/microb2010/mainboard/strat_utils.c index b1bf942..33c1474 100644 --- a/projects/microb2010/mainboard/strat_utils.c +++ b/projects/microb2010/mainboard/strat_utils.c @@ -1,6 +1,6 @@ -/* +/* * Copyright Droids Corporation, Microb Technology (2009) - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -74,7 +75,7 @@ int16_t distance_from_robot(int16_t x, int16_t y) position_get_y_s16(&mainboard.pos), x, y); } -/** do a modulo 360 -> [-180,+180], knowing that 'a' is in [-3*180,+3*180] */ +/** do a modulo 360 -> [-180,+180], knowing that 'a' is in [-3*180,+3*180] */ int16_t simple_modulo_360(int16_t a) { if (a < -180) { @@ -92,10 +93,10 @@ int16_t angle_abs_to_rel(int16_t a_abs) return simple_modulo_360(a_abs - position_get_a_deg_s16(&mainboard.pos)); } -void rel_da_to_abs_xy(double d_rel, double a_rel_rad, +void rel_da_to_abs_xy(double d_rel, double a_rel_rad, double *x_abs, double *y_abs) { - double x = position_get_x_double(&mainboard.pos); + double x = position_get_x_double(&mainboard.pos); double y = position_get_y_double(&mainboard.pos); double a = position_get_a_rad_double(&mainboard.pos); @@ -108,7 +109,7 @@ double norm(double x, double y) return sqrt(x*x + y*y); } -void rel_xy_to_abs_xy(double x_rel, double y_rel, +void rel_xy_to_abs_xy(double x_rel, double y_rel, double *x_abs, double *y_abs) { double d_rel, a_rel; @@ -118,13 +119,13 @@ void rel_xy_to_abs_xy(double x_rel, double y_rel, } /* return an angle between -pi and pi */ -void abs_xy_to_rel_da(double x_abs, double y_abs, +void abs_xy_to_rel_da(double x_abs, double y_abs, double *d_rel, double *a_rel_rad) { - double x = position_get_x_double(&mainboard.pos); + double x = position_get_x_double(&mainboard.pos); double y = position_get_y_double(&mainboard.pos); double a = position_get_a_rad_double(&mainboard.pos); - + *a_rel_rad = atan2(y_abs - y, x_abs - x) - a; if (*a_rel_rad < -M_PI) { *a_rel_rad += M_2PI; @@ -138,7 +139,7 @@ void abs_xy_to_rel_da(double x_abs, double y_abs, void rotate(double *x, double *y, double rot) { double l, a; - + l = norm(*x, *y); a = atan2(*y, *x); @@ -171,13 +172,13 @@ uint8_t robot_is_in_area(int16_t margin) } /* return 1 or 0 depending on which side of a line (y=cste) is the - * robot. works in red or green color. */ + * robot. works in yellow or blue color. */ uint8_t y_is_more_than(int16_t y) { int16_t posy; - + posy = position_get_y_s16(&mainboard.pos); - if (mainboard.our_color == I2C_COLOR_RED) { + if (mainboard.our_color == I2C_COLOR_YELLOW) { if (posy > y) return 1; else @@ -192,11 +193,11 @@ uint8_t y_is_more_than(int16_t y) } /* return 1 or 0 depending on which side of a line (x=cste) is the - * robot. works in red or green color. */ + * robot. works in yellow or blue color. */ uint8_t x_is_more_than(int16_t x) { int16_t posx; - + posx = position_get_x_s16(&mainboard.pos); if (posx > x) return 1; @@ -227,15 +228,15 @@ int16_t sin_table[] = { int16_t fast_sin(int16_t deg) { deg %= 360; - + if (deg < 0) deg += 360; - if (deg < 90) + if (deg < 90) return sin_table[(deg*16)/90]; - else if (deg < 180) + else if (deg < 180) return sin_table[((180-deg)*16)/90]; - else if (deg < 270) + else if (deg < 270) return -sin_table[((deg-180)*16)/90]; else return -sin_table[((360-deg)*16)/90]; @@ -256,10 +257,10 @@ uint8_t get_color(void) /* get the color of the opponent robot */ uint8_t get_opponent_color(void) { - if (mainboard.our_color == I2C_COLOR_RED) - return I2C_COLOR_GREEN; + if (mainboard.our_color == I2C_COLOR_YELLOW) + return I2C_COLOR_BLUE; else - return I2C_COLOR_RED; + return I2C_COLOR_YELLOW; } /* get the xy pos of the opponent robot */ @@ -317,3 +318,21 @@ uint8_t opponent_is_behind(void) /* return 1; */ return 0; } + +int16_t distance_from_opponent(int16_t x, int16_t y) +{ + int16_t oppx, oppy; + if (get_opponent_xy(&oppx, &oppy) < 0) + return -1; + return distance_between(x, y, oppx, oppy); +} + +uint8_t get_ball_count(void) +{ + return ballboard.ball_count; +} + +uint8_t get_cob_count(void) +{ + return cobboard.cob_count; +}