work on beacon
[aversive.git] / projects / microb2010 / mainboard / strat_base.h
1 /*  
2  *  Copyright Droids Corporation, Microb Technology (2009)
3  * 
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  *
18  *  Revision : $Id: strat_base.h,v 1.5 2009-11-08 17:24:33 zer0 Exp $
19  *
20  */
21
22 /* return values for strats and sub trajs */
23 #define END_TRAJ       1 /* traj successful */
24 #define END_BLOCKING   2 /* blocking during traj */
25 #define END_NEAR       4 /* we are near destination */
26 #define END_OBSTACLE   8 /* There is an obstacle in front of us */
27 #define END_ERROR     16 /* Cannot do the command */
28 #define END_INTR      32 /* interrupted by user */
29 #define END_TIMER     64 /* we don't a lot of time */
30 #define END_RESERVED 128 /* reserved */
31
32 /* only valid after a END_OBSTACLE */
33 struct opponent_obstacle {
34         int16_t x;
35         int16_t y;
36         int16_t a;
37         int16_t d;
38 };
39 extern struct opponent_obstacle opponent_obstacle;
40
41 /* stop as fast as possible, without ramp */
42 void strat_hardstop(void);
43
44 #define DO_NOT_SET_POS -1000
45 /* Reset position. If arg == DO_NOT_SET_POS, don't update value for
46  * it. */
47 void strat_reset_pos(int16_t x, int16_t y, int16_t a);
48
49 /* decrease gain on angle PID, and go forward until we reach the
50  * border. */
51 uint8_t strat_calib(int16_t d, uint8_t flags);
52
53 /* launch start procedure */
54 void strat_start(void);
55
56 /* go to an x,y point without checking for obstacle or blocking. It
57  * should be used for very small dist only. Return END_TRAJ if we
58  * reach destination, or END_BLOCKING if the robot blocked more than 3
59  * times. */
60 uint8_t strat_goto_xy_force(int16_t x, int16_t y);
61
62 /* escape from disc polygon or another zone */
63 struct build_zone;
64 uint8_t strat_escape(struct build_zone *zone, uint8_t flags);
65
66 /* return true if we have to brake due to an obstacle */
67 uint8_t strat_obstacle(void);
68
69 /* set/get user strat speed */
70 void strat_set_speed(uint16_t d, uint16_t a);
71 void strat_get_speed(uint16_t *d, uint16_t *a);
72
73 /* when user type ctrl-c we can interrupt traj */
74 void interrupt_traj(void);
75 void interrupt_traj_reset(void);
76
77 /* limit speed when we are close of opponent */
78 void strat_limit_speed_enable(void);
79 void strat_limit_speed_disable(void);
80 void strat_limit_speed(void);
81
82 /* get name of traj error with its number */
83 const char *get_err(uint8_t err);
84
85 /* test trajectory end condition */
86 uint8_t test_traj_end(uint8_t why);
87
88 /* loop until test_traj_end() is true */
89 #define wait_traj_end(why) __wait_traj_end_debug(why, __LINE__)
90 uint8_t __wait_traj_end_debug(uint8_t why, uint16_t line);