vt100: include pgmspace.h as we use PROGMEM macro
[aversive.git] / microb2010 / ballboard / main.h
1 /*  
2  *  Copyright Droids Corporation (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: main.h,v 1.4 2009-05-27 20:04:07 zer0 Exp $
19  *
20  */
21
22 /* was sensorboard in 2009 */
23
24 #define LED_TOGGLE(port, bit) do {              \
25                 if (port & _BV(bit))            \
26                         port &= ~_BV(bit);      \
27                 else                            \
28                         port |= _BV(bit);       \
29         } while(0)
30
31 #define LED1_ON()       sbi(PORTJ, 2)
32 #define LED1_OFF()      cbi(PORTJ, 2)
33 #define LED1_TOGGLE()   LED_TOGGLE(PORTJ, 2)
34
35 #define LED2_ON()       sbi(PORTJ, 3)
36 #define LED2_OFF()      cbi(PORTJ, 3)
37 #define LED2_TOGGLE()   LED_TOGGLE(PORTJ, 3)
38
39 #define LED3_ON()       sbi(PORTL, 7)
40 #define LED3_OFF()      cbi(PORTL, 7)
41 #define LED3_TOGGLE()   LED_TOGGLE(PORTL, 7)
42
43 #define LED4_ON()       sbi(PORTL, 6)
44 #define LED4_OFF()      cbi(PORTL, 6)
45 #define LED4_TOGGLE()   LED_TOGGLE(PORTL, 6)
46
47 #define BRAKE_DDR()     do { DDRJ |= 0xF0; } while(0)
48 #define BRAKE_ON()      do { PORTJ |= 0xF0; } while(0)
49 #define BRAKE_OFF()     do { PORTJ &= 0x0F; } while(0)
50
51 #define ROLLER_ENCODER    ((void *)0)
52 #define FORKTRANS_ENCODER ((void *)1)
53 #define FORKROT_ENCODER   ((void *)2)
54
55 #define ROLLER_PWM     ((void *)&gen.pwm1_4A)
56 #define FORKTRANS_PWM  ((void *)&gen.pwm2_4B)
57 #define FORKROT_PWM    ((void *)&gen.pwm3_1A)
58 #define XXX_PWM        ((void *)&gen.pwm4_1B)
59
60 #define BALL_PRESENT_SENSOR  2 /* XXX dummy example */
61
62 /** ERROR NUMS */
63 #define E_USER_I2C_PROTO       195
64 #define E_USER_SENSOR          196
65 #define E_USER_ST_MACH         197
66
67 #define LED_PRIO           170
68 #define TIME_PRIO          160
69 #define ADC_PRIO           120
70 #define CS_PRIO            100
71 #define I2C_POLL_PRIO       20
72
73 #define CS_PERIOD 5000L
74
75 #define NB_LOGS 4
76
77 /* generic to all boards */
78 struct genboard {
79         /* command line interface */
80         struct rdline rdl;
81         char prompt[RDLINE_PROMPT_SIZE];
82
83         /* motors */
84         struct pwm_ng pwm1_4A;
85         struct pwm_ng pwm2_4B;
86         struct pwm_ng pwm3_1A;
87         struct pwm_ng pwm4_1B;
88
89         /* servos */
90         struct pwm_ng servo1;
91         struct pwm_ng servo2;
92         struct pwm_ng servo3;
93         struct pwm_ng servo4;
94
95         /* ax12 interface */
96         AX12 ax12;
97
98         /* log */
99         uint8_t logs[NB_LOGS+1];
100         uint8_t log_level;
101         uint8_t debug;
102 };
103
104 struct cs_block {
105         uint8_t on;
106         struct cs cs;
107         struct pid_filter pid;
108         struct quadramp_filter qr;
109         struct blocking_detection bd;
110 };
111
112 /* ballboard specific */
113 struct ballboard {
114 #define DO_ENCODERS  1
115 #define DO_CS        2
116 #define DO_BD        4
117 #define DO_POWER     8
118 #define DO_ERRBLOCKING 16
119         uint8_t flags;                /* misc flags */
120
121         /* control systems */
122         struct cs_block roller;
123         struct cs_block forktrans;
124         struct cs_block forkrot;
125
126         /* robot status */
127         uint8_t our_color;
128 };
129
130 extern struct genboard gen;
131 extern struct ballboard ballboard;
132
133 /* start the bootloader */
134 void bootloader(void);
135
136 #define wait_cond_or_timeout(cond, timeout)                   \
137 ({                                                            \
138         microseconds __us = time_get_us2();                   \
139         uint8_t __ret = 1;                                    \
140         while(! (cond)) {                                     \
141                 if (time_get_us2() - __us > (timeout)*1000L) {\
142                         __ret = 0;                            \
143                         break;                                \
144                 }                                             \
145         }                                                     \
146         __ret;                                                \
147 })