00001
00048 #include "controller.h"
00049 #include "board.h"
00050 #include "gpio.h"
00051 #include "cycle_counter.h"
00052 #include "qt1081.h"
00053 #include "intc.h"
00054
00055 #define JOYSTICK_KEY_DEBOUNCE_MS 200
00056
00057 #define IS_JOYSTICK_KEY_UP() (joystick_status & JOYSTICK_STATUS_UP)
00058 #define IS_JOYSTICK_KEY_DOWN() (joystick_status & JOYSTICK_STATUS_DOWN)
00059 #define IS_JOYSTICK_KEY_RIGHT() (joystick_status & JOYSTICK_STATUS_RIGHT)
00060 #define IS_JOYSTICK_KEY_LEFT() (joystick_status & JOYSTICK_STATUS_LEFT)
00061 #define IS_JOYSTICK_KEY_PRESSED() (joystick_status & JOYSTICK_STATUS_PRESSED)
00062
00063 #define IS_JOYSTICK_ONLY_KEY_UP() ((joystick_status == JOYSTICK_STATUS_UP) & JOYSTICK_STATUS_PRESSED_MASK)
00064 #define IS_JOYSTICK_ONLY_KEY_DOWN() ((joystick_status == JOYSTICK_STATUS_DOWN) & JOYSTICK_STATUS_PRESSED_MASK)
00065 #define IS_JOYSTICK_ONLY_KEY_RIGHT() ((joystick_status == JOYSTICK_STATUS_RIGHT) & JOYSTICK_STATUS_PRESSED_MASK)
00066 #define IS_JOYSTICK_ONLY_KEY_LEFT() ((joystick_status == JOYSTICK_STATUS_LEFT) & JOYSTICK_STATUS_PRESSED_MASK)
00067 #define IS_JOYSTICK_ONLY_KEY_PRESSED() ((joystick_status == JOYSTICK_STATUS_PRESSED) & JOYSTICK_STATUS_PRESSED_MASK)
00068
00069 #define IS_JOYSTICK_RELEASED_KEY_UP() (joystick_status & JOYSTICK_STATUS_RELEASED_UP)
00070 #define IS_JOYSTICK_RELEASED_KEY_DOWN() (joystick_status & JOYSTICK_STATUS_RELEASED_DOWN)
00071 #define IS_JOYSTICK_RELEASED_KEY_RIGHT() (joystick_status & JOYSTICK_STATUS_RELEASED_RIGHT)
00072 #define IS_JOYSTICK_RELEASED_KEY_LEFT() (joystick_status & JOYSTICK_STATUS_RELEASED_LEFT)
00073 #define IS_JOYSTICK_RELEASED_KEY_PRESSED() (joystick_status & JOYSTICK_STATUS_RELEASED_PRESSED)
00074
00075 #define IS_JOYSTICK_ONLY_RELEASED_KEY_UP() ((joystick_status & JOYSTICK_STATUS_RELEASED_UP) & JOYSTICK_STATUS_RELEASED_MASK)
00076 #define IS_JOYSTICK_ONLY_RELEASED_KEY_DOWN() ((joystick_status & JOYSTICK_STATUS_RELEASED_DOWN) & JOYSTICK_STATUS_RELEASED_MASK)
00077 #define IS_JOYSTICK_ONLY_RELEASED_KEY_RIGHT() ((joystick_status & JOYSTICK_STATUS_RELEASED_RIGHT) & JOYSTICK_STATUS_RELEASED_MASK)
00078 #define IS_JOYSTICK_ONLY_RELEASED_KEY_LEFT() ((joystick_status & JOYSTICK_STATUS_RELEASED_LEFT) & JOYSTICK_STATUS_RELEASED_MASK)
00079 #define IS_JOYSTICK_ONLY_RELEASED_KEY_PRESSED() ((joystick_status & JOYSTICK_STATUS_RELEASED_PRESSED) & JOYSTICK_STATUS_RELEASED_MASK)
00080
00081 #define CLEAR_JOYSTICK_KEY_ALL() (joystick_status = JOYSTICK_STATUS_IDLE)
00082
00083 #define CLEAR_JOYSTICK_KEY_UP() (joystick_status &= ~JOYSTICK_STATUS_UP)
00084 #define CLEAR_JOYSTICK_KEY_DOWN() (joystick_status &= ~JOYSTICK_STATUS_DOWN)
00085 #define CLEAR_JOYSTICK_KEY_RIGHT() (joystick_status &= ~JOYSTICK_STATUS_RIGHT)
00086 #define CLEAR_JOYSTICK_KEY_LEFT() (joystick_status &= ~JOYSTICK_STATUS_LEFT)
00087 #define CLEAR_JOYSTICK_KEY_PRESSED() (joystick_status &= ~JOYSTICK_STATUS_PRESSED)
00088
00089 #define CLEAR_JOYSTICK_RELEASED_KEY_UP() (joystick_status &= ~JOYSTICK_STATUS_RELEASED_UP)
00090 #define CLEAR_JOYSTICK_RELEASED_KEY_DOWN() (joystick_status &= ~JOYSTICK_STATUS_RELEASED_DOWN)
00091 #define CLEAR_JOYSTICK_RELEASED_KEY_RIGHT() (joystick_status &= ~JOYSTICK_STATUS_RELEASED_RIGHT)
00092 #define CLEAR_JOYSTICK_RELEASED_KEY_LEFT() (joystick_status &= ~JOYSTICK_STATUS_RELEASED_LEFT)
00093 #define CLEAR_JOYSTICK_RELEASED_KEY_PRESSED() (joystick_status &= ~JOYSTICK_STATUS_RELEASED_PRESSED)
00094
00095
00096 static Bool is_joystick_right(void);
00097 static Bool is_joystick_left(void);
00098 static Bool is_joystick_released_up(void);
00099 static Bool is_joystick_released_down(void);
00100 static Bool is_joystick_released_right(void);
00101 static Bool is_joystick_released_left(void);
00102 static Bool is_joystick_released_pressed(void);
00103
00104 static t_cpu_time joystick_key_sensibility_timer;
00105 static U32 static_fcpu_hz;
00106 static bool no_store = false;
00107 static enum joystick_status_t
00108 {
00109 JOYSTICK_STATUS_IDLE = 0x00000000,
00110 JOYSTICK_STATUS_UP = 0x00000001,
00111 JOYSTICK_STATUS_DOWN = 0x00000002,
00112 JOYSTICK_STATUS_RIGHT = 0x00000004,
00113 JOYSTICK_STATUS_LEFT = 0x00000008,
00114 JOYSTICK_STATUS_PRESSED = 0x00000010,
00115 JOYSTICK_STATUS_PRESSED_MASK = 0x0000FFFF,
00116 JOYSTICK_STATUS_RELEASED_UP = 0x00010000,
00117 JOYSTICK_STATUS_RELEASED_DOWN = 0x00020000,
00118 JOYSTICK_STATUS_RELEASED_RIGHT = 0x00040000,
00119 JOYSTICK_STATUS_RELEASED_LEFT = 0x00080000,
00120 JOYSTICK_STATUS_RELEASED_PRESSED = 0x00100000,
00121 JOYSTICK_STATUS_RELEASED_MASK = 0xFFFF0000
00122 } joystick_status = JOYSTICK_STATUS_IDLE;
00123
00124 static inline void manage_button_isr(int pin, enum joystick_status_t status_pressed, enum joystick_status_t status_released)
00125 {
00126 if (gpio_get_pin_interrupt_flag(pin))
00127 {
00128
00129 joystick_status &= ~(status_pressed | status_released);
00130 if (gpio_get_pin_value(pin))
00131 joystick_status |= status_pressed;
00132 else if (!no_store)
00133 joystick_status |= status_released;
00134 else
00135 no_store = false;
00136 gpio_clear_pin_interrupt_flag(pin);
00137 }
00138 }
00139
00140 #if __GNUC__
00141 __attribute__ ((__interrupt__))
00142 #elif __ICCAVR32__
00143 __interrupt
00144 #endif
00145 void touch_button_isr(void)
00146 {
00147 manage_button_isr(QT1081_TOUCH_SENSOR_UP, JOYSTICK_STATUS_UP, JOYSTICK_STATUS_RELEASED_UP);
00148 manage_button_isr(QT1081_TOUCH_SENSOR_DOWN, JOYSTICK_STATUS_DOWN, JOYSTICK_STATUS_RELEASED_DOWN);
00149 manage_button_isr(QT1081_TOUCH_SENSOR_RIGHT, JOYSTICK_STATUS_RIGHT, JOYSTICK_STATUS_RELEASED_RIGHT);
00150 manage_button_isr(QT1081_TOUCH_SENSOR_LEFT, JOYSTICK_STATUS_LEFT, JOYSTICK_STATUS_RELEASED_LEFT);
00151 manage_button_isr(QT1081_TOUCH_SENSOR_ENTER, JOYSTICK_STATUS_PRESSED, JOYSTICK_STATUS_RELEASED_PRESSED);
00152
00153 if (IS_JOYSTICK_KEY_UP())
00154 gpio_clr_gpio_pin(LED1_GPIO);
00155 else
00156 gpio_set_gpio_pin(LED1_GPIO);
00157 if (IS_JOYSTICK_KEY_PRESSED())
00158 gpio_clr_gpio_pin(LED2_GPIO);
00159 else
00160 gpio_set_gpio_pin(LED2_GPIO);
00161 if (IS_JOYSTICK_KEY_DOWN())
00162 gpio_clr_gpio_pin(LED3_GPIO);
00163 else
00164 gpio_set_gpio_pin(LED3_GPIO);
00165 }
00166
00167 Bool controller_key_pressed(void)
00168 {
00169 if (IS_JOYSTICK_KEY_UP() ||
00170 IS_JOYSTICK_KEY_DOWN() ||
00171 IS_JOYSTICK_KEY_RIGHT() ||
00172 IS_JOYSTICK_KEY_LEFT() ||
00173 IS_JOYSTICK_KEY_PRESSED())
00174 return TRUE;
00175 return FALSE;
00176 }
00177
00178 Bool controller_key_released(void)
00179 {
00180 if (IS_JOYSTICK_RELEASED_KEY_UP() ||
00181 IS_JOYSTICK_RELEASED_KEY_DOWN() ||
00182 IS_JOYSTICK_RELEASED_KEY_RIGHT() ||
00183 IS_JOYSTICK_RELEASED_KEY_LEFT() ||
00184 IS_JOYSTICK_RELEASED_KEY_PRESSED())
00185 return TRUE;
00186 return FALSE;
00187 }
00188
00189 Bool controller_wheel_pressed(void)
00190 {
00191 return controller_key_pressed();
00192 }
00193
00194 Bool controller_key_back(void)
00195 {
00196 static bool start = false;
00197 static t_cpu_time tempo;
00198
00199 if (!IS_JOYSTICK_KEY_PRESSED())
00200 {
00201 gpio_set_gpio_pin(LED0_GPIO);
00202 start = false;
00203 return FALSE;
00204 }
00205
00206 if (!start)
00207 {
00208 cpu_set_timeout(cpu_ms_2_cy(1000, static_fcpu_hz), &tempo);
00209 start = true;
00210 }
00211
00212 if (cpu_is_timeout(&tempo))
00213 {
00214 gpio_clr_gpio_pin(LED0_GPIO);
00215 no_store = true;
00216 start = false;
00217 return TRUE;
00218 }
00219
00220 gpio_set_gpio_pin(LED0_GPIO);
00221 return FALSE;
00222 }
00223
00224 Bool controller_key_reset(void)
00225 {
00226 return FALSE;
00227 }
00228
00229 Bool controller_key_fct1(void)
00230 {
00231 return is_joystick_released_up();
00232 }
00233
00234 Bool controller_key_fct2(void)
00235 {
00236 return is_joystick_released_pressed();
00237 }
00238
00239 Bool controller_key_fct3(void)
00240 {
00241 return is_joystick_released_down();
00242 }
00243
00244 Bool controller_key_fct1_pressed(void)
00245 {
00246 return FALSE;
00247 }
00248
00249 Bool controller_key_fct2_pressed(void)
00250 {
00251 return FALSE;
00252 }
00253
00254 Bool controller_key_fct3_pressed(void)
00255 {
00256 return IS_JOYSTICK_KEY_DOWN();
00257 }
00258
00259 Bool controller_wheel_right(int wheel_inc)
00260 {
00261 return is_joystick_right();
00262 }
00263
00264 Bool controller_wheel_left(int wheel_inc)
00265 {
00266 return is_joystick_left();
00267 }
00268
00269 void controller_reset(void)
00270 {
00271
00272 }
00273
00274 void controller_init(int cpu_hz, int hsb_hz, int pba_hz, int pbb_hz)
00275 {
00276 Disable_global_interrupt();
00277 INTC_register_interrupt(&touch_button_isr, AVR32_GPIO_IRQ_6, 0);
00278
00279 INTC_register_interrupt(&touch_button_isr, AVR32_GPIO_IRQ_7, 0);
00280 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_UP, GPIO_PIN_CHANGE);
00281 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_DOWN, GPIO_PIN_CHANGE);
00282 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_RIGHT, GPIO_PIN_CHANGE);
00283 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_LEFT, GPIO_PIN_CHANGE);
00284 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_ENTER, GPIO_PIN_CHANGE);
00285
00286 Enable_global_interrupt();
00287 static_fcpu_hz = cpu_hz;
00288 cpu_set_timeout(cpu_ms_2_cy(JOYSTICK_KEY_DEBOUNCE_MS, static_fcpu_hz), &joystick_key_sensibility_timer);
00289 }
00290
00291 void controller_task(void)
00292 {
00293 }
00294
00295 static Bool is_joystick_released_up(void)
00296 {
00297 if (IS_JOYSTICK_ONLY_RELEASED_KEY_UP() && cpu_is_timeout(&joystick_key_sensibility_timer))
00298 {
00299 CLEAR_JOYSTICK_RELEASED_KEY_UP();
00300 cpu_set_timeout(cpu_ms_2_cy(JOYSTICK_KEY_DEBOUNCE_MS, static_fcpu_hz), &joystick_key_sensibility_timer);
00301 return TRUE;
00302 }
00303 return FALSE;
00304 }
00305
00306 static Bool is_joystick_released_down(void)
00307 {
00308 if (IS_JOYSTICK_ONLY_RELEASED_KEY_DOWN() && cpu_is_timeout(&joystick_key_sensibility_timer))
00309 {
00310 CLEAR_JOYSTICK_RELEASED_KEY_DOWN();
00311 cpu_set_timeout(cpu_ms_2_cy(JOYSTICK_KEY_DEBOUNCE_MS, static_fcpu_hz), &joystick_key_sensibility_timer);
00312 return TRUE;
00313 }
00314 return FALSE;
00315 }
00316
00317 static Bool is_joystick_released_right(void)
00318 {
00319 if (IS_JOYSTICK_ONLY_RELEASED_KEY_RIGHT() && cpu_is_timeout(&joystick_key_sensibility_timer))
00320 {
00321 CLEAR_JOYSTICK_RELEASED_KEY_RIGHT();
00322 cpu_set_timeout(cpu_ms_2_cy(JOYSTICK_KEY_DEBOUNCE_MS, static_fcpu_hz), &joystick_key_sensibility_timer);
00323 return TRUE;
00324 }
00325 return FALSE;
00326 }
00327
00328 static Bool is_joystick_released_left(void)
00329 {
00330 if (IS_JOYSTICK_ONLY_RELEASED_KEY_LEFT() && cpu_is_timeout(&joystick_key_sensibility_timer))
00331 {
00332 CLEAR_JOYSTICK_RELEASED_KEY_LEFT();
00333 cpu_set_timeout(cpu_ms_2_cy(JOYSTICK_KEY_DEBOUNCE_MS, static_fcpu_hz), &joystick_key_sensibility_timer);
00334 return TRUE;
00335 }
00336 return FALSE;
00337 }
00338
00339 static Bool is_joystick_right(void)
00340 {
00341 if (IS_JOYSTICK_KEY_RIGHT() && cpu_is_timeout(&joystick_key_sensibility_timer))
00342 {
00343 cpu_set_timeout(cpu_ms_2_cy(JOYSTICK_KEY_DEBOUNCE_MS, static_fcpu_hz), &joystick_key_sensibility_timer);
00344 return TRUE;
00345 }
00346 return FALSE;
00347 }
00348
00349 static Bool is_joystick_left(void)
00350 {
00351 if (IS_JOYSTICK_KEY_LEFT() && cpu_is_timeout(&joystick_key_sensibility_timer))
00352 {
00353 cpu_set_timeout(cpu_ms_2_cy(JOYSTICK_KEY_DEBOUNCE_MS, static_fcpu_hz), &joystick_key_sensibility_timer);
00354 return TRUE;
00355 }
00356 return FALSE;
00357 }
00358
00359 static Bool is_joystick_released_pressed(void)
00360 {
00361 if (IS_JOYSTICK_ONLY_RELEASED_KEY_PRESSED() && cpu_is_timeout(&joystick_key_sensibility_timer))
00362 {
00363 CLEAR_JOYSTICK_RELEASED_KEY_PRESSED();
00364 cpu_set_timeout(cpu_ms_2_cy(JOYSTICK_KEY_DEBOUNCE_MS, static_fcpu_hz), &joystick_key_sensibility_timer);
00365 return TRUE;
00366 }
00367 return FALSE;
00368 }