Satellite Observers Workbench. NOT yet complete, just published for forum posters to \"cherry pick\" pieces of code as requiered as an example.
Diff: test/th_xbox360gamepad.c
- Revision:
- 0:0a841b89d614
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/th_xbox360gamepad.c Mon Oct 11 10:34:55 2010 +0000 @@ -0,0 +1,123 @@ +/**************************************************************************** + * Copyright 2010 Andy Kirkham, Stellar Technologies Ltd + * + * This file is part of the Satellite Observers Workbench (SOWB). + * + * SOWB 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 3 of the License, or + * (at your option) any later version. + * + * SOWB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with SOWB. If not, see <http://www.gnu.org/licenses/>. + * + * $Id: main.cpp 5 2010-07-12 20:51:11Z ajk $ + * + ***************************************************************************/ + +#ifndef TH_XBOX360GAMEPAD_C +#define TH_XBOX360GAMEPAD_C +#endif + +#include "mbed.h" +#include "usbeh.h" +#include "usbeh_endpoint.h" +#include "usbeh_device.h" +#include "usbeh_controller.h" +#include "usbeh_api.h" +#include "xbox360gamepad.h" +#include "th_xbox360gamepad.h" + +#include "main.h" +#include "debug.h" + + +const char *button_text[] = { "","LS","RS","XBOX","Unused","A","B","X","Y","DPAD UP","DPAD DOWN","DPAD LEFT","DPAG RIGHT","START","BACK","LEFT HAT","RIGHT HAT" }; + +/* Define globals to hold Xbox360 stick data. */ +XBOX360_STICK *stick; +XBOX360_STICK stick_left_previous; +XBOX360_STICK stick_right_previous; +unsigned char trigger_left = 0, trigger_left_last = 0; +unsigned char trigger_right = 0, trigger_right_last = 0; + +void th_xbox360gamepad_init(void) { + stick = xbox360gamepad_get_stick_left(); + stick_left_previous.x = stick->x; + stick_left_previous.y = stick->y; + stick = xbox360gamepad_get_stick_right(); + stick_right_previous.x = stick->x; + stick_right_previous.y = stick->y; +} + +void th_xbox360gamepad(void) { + unsigned char button; + if ((button = xbox360gamepad_get_button()) != 0) { + if (button > 0) { + debug_printf("Button "); + if (button > (BUTT_RIGHT_HAT_PRESS + 16)) { + debug_printf("%s held\r\n", button_text[button - 32]); + } + else if (button > BUTT_RIGHT_HAT_PRESS) { + debug_printf("%s released\r\n", button_text[button - 16]); + } + else { + debug_printf("%s pressed\r\n", button_text[button]); + switch (button) { + case BUTT_A_PRESS: + xbox360gamepad_led(LED_1_FLASH_THEN_ON); + break; + case BUTT_B_PRESS: + xbox360gamepad_led(LED_2_FLASH_THEN_ON); + break; + case BUTT_X_PRESS: + xbox360gamepad_led(LED_3_FLASH_THEN_ON); + break; + case BUTT_Y_PRESS: + xbox360gamepad_led(LED_4_FLASH_THEN_ON); + break; + } + } + } + } + + if ((trigger_left = xbox360gamepad_get_trigger_left()) != trigger_left_last) { + debug_printf("Left trigger: %d\r\n", trigger_left); + trigger_left_last = trigger_left; + } + + if ((trigger_right = xbox360gamepad_get_trigger_right()) != trigger_right_last) { + debug_printf("Right trigger: %d\r\n", trigger_right); + trigger_right_last = trigger_right; + } + + unsigned char xbox360gamepad_get_trigger_right(void); + + stick = xbox360gamepad_get_stick_left(); + if (stick->x/STICK_DIVISOR != stick_left_previous.x/STICK_DIVISOR || stick->y/STICK_DIVISOR != stick_left_previous.y/STICK_DIVISOR) { + stick_left_previous.x = stick->x; + stick_left_previous.y = stick->y; + // Don't bother printing for now, the sticks are too sensitive! + int x = stick->x/STICK_DIVISOR, y = stick->y/STICK_DIVISOR; + if (1 || (x > 10 || x < -10) || (y > 10 || y < -10) ) { + debug_printf("New LEFT stick position x = %d y = %d\r\n", stick->x/STICK_DIVISOR, stick->y/STICK_DIVISOR); + } + } + + stick = xbox360gamepad_get_stick_right(); + if (stick->x/STICK_DIVISOR != stick_right_previous.x/STICK_DIVISOR || stick->y/STICK_DIVISOR != stick_right_previous.y/STICK_DIVISOR) { + stick_right_previous.x = stick->x; + stick_right_previous.y = stick->y; + // Don't bother printing for now, the sticks are too sensitive! + int x = stick->x/STICK_DIVISOR, y = stick->y/STICK_DIVISOR; + if (1 || (x > 10 || x < -10) || (y > 10 || y < -10) ) { + debug_printf("New RIGHT stick position x = %d y = %d\r\n", stick->x/STICK_DIVISOR, stick->y/STICK_DIVISOR); + } + } +} +