908a2f6191309b4900c02b10b4a6244c61e72f21
[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 have a lot of time */
30 #define END_RESERVED 128 /* reserved... be careful, sometimes error is
31                             coded on a int8_t */
32
33 /* only valid after a END_OBSTACLE */
34 struct opponent_obstacle {
35         int16_t x;
36         int16_t y;
37         int16_t a;
38         int16_t d;
39 };
40 extern struct opponent_obstacle opponent_obstacle;
41
42 /* stop as fast as possible, without ramp */
43 void strat_hardstop(void);
44
45 #define DO_NOT_SET_POS -1000
46 /* Reset position. If arg == DO_NOT_SET_POS, don't update value for
47  * it. */
48 void strat_reset_pos(int16_t x, int16_t y, int16_t a);
49
50 /* decrease gain on angle PID, and go forward until we reach the
51  * border. */
52 uint8_t strat_calib(int16_t d, uint8_t flags);
53
54 /* launch start procedure */
55 void strat_start(void);
56
57 /* go to an x,y point without checking for obstacle or blocking. It
58  * should be used for very small dist only. Return END_TRAJ if we
59  * reach destination, or END_BLOCKING if the robot blocked more than 3
60  * times. */
61 uint8_t strat_goto_xy_force(int16_t x, int16_t y);
62
63 /* return true if we have to brake due to an obstacle */
64 uint8_t strat_obstacle(void);
65
66 /* set/get user strat speed */
67 void strat_set_speed(uint16_t d, uint16_t a);
68 void strat_get_speed(uint16_t *d, uint16_t *a);
69 void strat_set_acc(double d, double a);
70
71 /* when user type ctrl-c we can interrupt traj */
72 void interrupt_traj(void);
73 void interrupt_traj_reset(void);
74
75 /* limit speed when we are close of opponent */
76 void strat_limit_speed_enable(void);
77 void strat_limit_speed_disable(void);
78 void strat_limit_speed(void);
79
80 /* get name of traj error with its number */
81 const char *get_err(uint8_t err);
82
83 /* test trajectory end condition */
84 uint8_t test_traj_end(uint8_t why);
85
86 /* loop until test_traj_end() is true */
87 #define wait_traj_end(why) __wait_traj_end_debug(why, __LINE__)
88 uint8_t __wait_traj_end_debug(uint8_t why, uint16_t line);