Space invaders with a nRF2401A wireless joypad
Dependencies: Gameduino mbed nRF2401A
Fork of Gameduino_Invaders_game by
Gameduino and an nRF2401A hooked up to an mbed on an mbeduino:
joystick.cpp@5:3ede9991d8e0, 2014-03-09 (annotated)
- Committer:
- TheChrisyd
- Date:
- Sun Mar 09 12:27:20 2014 +0000
- Revision:
- 5:3ede9991d8e0
- Parent:
- 4:bb78bedae411
Update to match Library update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TheChrisyd | 2:20a89dc286d5 | 1 | /*------------------------------------------------------------ |
TheChrisyd | 2:20a89dc286d5 | 2 | Universal joystick driver for Gameduino |
TheChrisyd | 2:20a89dc286d5 | 3 | |
TheChrisyd | 2:20a89dc286d5 | 4 | http://www.artlum.com/gameduino/gameduino.html#joystick |
TheChrisyd | 2:20a89dc286d5 | 5 | ------------------------------------------------------------*/ |
TheChrisyd | 2:20a89dc286d5 | 6 | #include "joystick.h" |
TheChrisyd | 2:20a89dc286d5 | 7 | #include "GD.h" |
TheChrisyd | 4:bb78bedae411 | 8 | //#include "nRF2401A.h" |
TheChrisyd | 2:20a89dc286d5 | 9 | //#include <SPI.h> |
TheChrisyd | 2:20a89dc286d5 | 10 | //#include <GD.h> |
TheChrisyd | 2:20a89dc286d5 | 11 | |
TheChrisyd | 2:20a89dc286d5 | 12 | // Change this line to enable your customized |
TheChrisyd | 2:20a89dc286d5 | 13 | // joystick configuration |
TheChrisyd | 2:20a89dc286d5 | 14 | // "1" = custom configuration |
TheChrisyd | 2:20a89dc286d5 | 15 | // "0" = default (Sparkfun joystick) |
TheChrisyd | 2:20a89dc286d5 | 16 | // |
TheChrisyd | 2:20a89dc286d5 | 17 | #define CUSTOM_JOYSTICK 0 |
TheChrisyd | 4:bb78bedae411 | 18 | #define WIRELESS |
TheChrisyd | 2:20a89dc286d5 | 19 | extern GDClass GD; |
TheChrisyd | 4:bb78bedae411 | 20 | //extern nRF2401A wireless_joypad; |
TheChrisyd | 4:bb78bedae411 | 21 | extern byte wireless_dpad; |
TheChrisyd | 4:bb78bedae411 | 22 | extern byte wireless_buttons; |
TheChrisyd | 2:20a89dc286d5 | 23 | #if CUSTOM_JOYSTICK |
TheChrisyd | 2:20a89dc286d5 | 24 | /*------------------------------------------------------------------ |
TheChrisyd | 2:20a89dc286d5 | 25 | Custom joystick configuration. This is what you need to |
TheChrisyd | 2:20a89dc286d5 | 26 | hack to get your joystick working. |
TheChrisyd | 2:20a89dc286d5 | 27 | |
TheChrisyd | 2:20a89dc286d5 | 28 | The joystick layout can be customized by commenting |
TheChrisyd | 2:20a89dc286d5 | 29 | or uncommenting the lines below. |
TheChrisyd | 2:20a89dc286d5 | 30 | |
TheChrisyd | 2:20a89dc286d5 | 31 | Notes |
TheChrisyd | 2:20a89dc286d5 | 32 | ----- |
TheChrisyd | 2:20a89dc286d5 | 33 | To specify an analog pin for a button add "A0" to |
TheChrisyd | 2:20a89dc286d5 | 34 | the pin number, eg. Analog pin 4 is "A0+4" |
TheChrisyd | 2:20a89dc286d5 | 35 | |
TheChrisyd | 2:20a89dc286d5 | 36 | When connecting a Joystick to an Arduino: |
TheChrisyd | 2:20a89dc286d5 | 37 | * Digital pins 0/1 are used for system stuff. |
TheChrisyd | 2:20a89dc286d5 | 38 | * Gameduino uses pins 2/9/10/11/13 for SPI interface |
TheChrisyd | 2:20a89dc286d5 | 39 | |
TheChrisyd | 2:20a89dc286d5 | 40 | That leaves digital pins 3/4/5/6/7/8/10 free, plus |
TheChrisyd | 2:20a89dc286d5 | 41 | all the analog pins (which work as digital pins, too!) |
TheChrisyd | 2:20a89dc286d5 | 42 | ------------------------------------------------------------------*/ |
TheChrisyd | 2:20a89dc286d5 | 43 | |
TheChrisyd | 2:20a89dc286d5 | 44 | // eg. The following layout is good for an NES controller |
TheChrisyd | 2:20a89dc286d5 | 45 | |
TheChrisyd | 2:20a89dc286d5 | 46 | // Connect the four buttons to pins 3/4/5/6 |
TheChrisyd | 2:20a89dc286d5 | 47 | #define BUTTON_A_PIN 3 |
TheChrisyd | 2:20a89dc286d5 | 48 | #define BUTTON_B_PIN 4 |
TheChrisyd | 2:20a89dc286d5 | 49 | //#define BUTTON_C_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 50 | //#define BUTTON_X_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 51 | //#define BUTTON_Y_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 52 | //#define BUTTON_Z_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 53 | #define BUTTON_ST_PIN 5 |
TheChrisyd | 2:20a89dc286d5 | 54 | #define BUTTON_SEL_PIN 6 |
TheChrisyd | 2:20a89dc286d5 | 55 | |
TheChrisyd | 2:20a89dc286d5 | 56 | // Connect the DPAD L/R/U/D to analog pins 2/3/4/5 |
TheChrisyd | 2:20a89dc286d5 | 57 | #define STICK_LEFT_PIN (A0+2) |
TheChrisyd | 2:20a89dc286d5 | 58 | #define STICK_RIGHT_PIN (A0+3) |
TheChrisyd | 2:20a89dc286d5 | 59 | #define STICK_UP_PIN (A0+4) |
TheChrisyd | 2:20a89dc286d5 | 60 | #define STICK_DOWN_PIN (A0+5) |
TheChrisyd | 2:20a89dc286d5 | 61 | |
TheChrisyd | 2:20a89dc286d5 | 62 | // Analog input is disabled... |
TheChrisyd | 2:20a89dc286d5 | 63 | //#define ANALOG_X_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 64 | //#define ANALOG_Y_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 65 | |
TheChrisyd | 2:20a89dc286d5 | 66 | // Make the DPAD emulate an analog joystick |
TheChrisyd | 2:20a89dc286d5 | 67 | #define DIGITAL_EMULATE_ANALOG |
TheChrisyd | 2:20a89dc286d5 | 68 | //#define ANALOG_EMULATE_DIGITAL |
TheChrisyd | 2:20a89dc286d5 | 69 | |
TheChrisyd | 2:20a89dc286d5 | 70 | #else |
TheChrisyd | 4:bb78bedae411 | 71 | |
TheChrisyd | 4:bb78bedae411 | 72 | #ifndef WIRELESS |
TheChrisyd | 4:bb78bedae411 | 73 | |
TheChrisyd | 2:20a89dc286d5 | 74 | /*------------------------------------------------------------------ |
TheChrisyd | 2:20a89dc286d5 | 75 | Default: Sparkfun joystick |
TheChrisyd | 2:20a89dc286d5 | 76 | ------------------------------------------------------------------*/ |
TheChrisyd | 2:20a89dc286d5 | 77 | #define BUTTON_A_PIN 3 |
TheChrisyd | 2:20a89dc286d5 | 78 | #define BUTTON_B_PIN 4 |
TheChrisyd | 2:20a89dc286d5 | 79 | // #define BUTTON_C_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 80 | // nb. Button X is pin 7 if you've hacked your board |
TheChrisyd | 2:20a89dc286d5 | 81 | #define BUTTON_X_PIN 2 |
TheChrisyd | 2:20a89dc286d5 | 82 | // #define BUTTON_Y_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 83 | // #define BUTTON_Z_PIN ? |
TheChrisyd | 2:20a89dc286d5 | 84 | #define BUTTON_ST_PIN 5 |
TheChrisyd | 2:20a89dc286d5 | 85 | #define BUTTON_SEL_PIN 6 |
TheChrisyd | 2:20a89dc286d5 | 86 | |
TheChrisyd | 2:20a89dc286d5 | 87 | // Digital joystick/DPAD |
TheChrisyd | 2:20a89dc286d5 | 88 | //#define STICK_LEFT_PIN 11 |
TheChrisyd | 2:20a89dc286d5 | 89 | //#define STICK_RIGHT_PIN 12 |
TheChrisyd | 2:20a89dc286d5 | 90 | //#define STICK_UP_PIN 13 |
TheChrisyd | 2:20a89dc286d5 | 91 | //#define STICK_DOWN_PIN 14 |
TheChrisyd | 2:20a89dc286d5 | 92 | |
TheChrisyd | 2:20a89dc286d5 | 93 | // Analog joystick is enabled |
TheChrisyd | 2:20a89dc286d5 | 94 | #define ANALOG_X_PIN 0 |
TheChrisyd | 2:20a89dc286d5 | 95 | #define ANALOG_Y_PIN 1 |
TheChrisyd | 2:20a89dc286d5 | 96 | |
TheChrisyd | 2:20a89dc286d5 | 97 | // Enable digital joystick emulation |
TheChrisyd | 2:20a89dc286d5 | 98 | // #define DIGITAL_EMULATE_ANALOG |
TheChrisyd | 2:20a89dc286d5 | 99 | #define ANALOG_EMULATE_DIGITAL |
TheChrisyd | 2:20a89dc286d5 | 100 | |
TheChrisyd | 2:20a89dc286d5 | 101 | #endif |
TheChrisyd | 4:bb78bedae411 | 102 | #endif |
TheChrisyd | 2:20a89dc286d5 | 103 | /*------------------------------------------------------ |
TheChrisyd | 2:20a89dc286d5 | 104 | Stop hacking now...! |
TheChrisyd | 2:20a89dc286d5 | 105 | |
TheChrisyd | 2:20a89dc286d5 | 106 | There are no user-servicable parts below this line |
TheChrisyd | 2:20a89dc286d5 | 107 | ------------------------------------------------------*/ |
TheChrisyd | 4:bb78bedae411 | 108 | |
TheChrisyd | 2:20a89dc286d5 | 109 | |
TheChrisyd | 4:bb78bedae411 | 110 | #ifndef WIRELESS |
TheChrisyd | 2:20a89dc286d5 | 111 | /*--------------------------------------------- |
TheChrisyd | 2:20a89dc286d5 | 112 | Joystick reader |
TheChrisyd | 2:20a89dc286d5 | 113 | ---------------------------------------------*/ |
TheChrisyd | 2:20a89dc286d5 | 114 | static PROGMEM prog_uchar joystickPinList[] = { |
TheChrisyd | 2:20a89dc286d5 | 115 | #ifdef BUTTON_A_PIN |
TheChrisyd | 2:20a89dc286d5 | 116 | BUTTON_A_PIN |
TheChrisyd | 2:20a89dc286d5 | 117 | #endif |
TheChrisyd | 2:20a89dc286d5 | 118 | #ifdef BUTTON_B_PIN |
TheChrisyd | 2:20a89dc286d5 | 119 | , BUTTON_B_PIN |
TheChrisyd | 2:20a89dc286d5 | 120 | #endif |
TheChrisyd | 2:20a89dc286d5 | 121 | #ifdef BUTTON_C_PIN |
TheChrisyd | 2:20a89dc286d5 | 122 | , BUTTON_C_PIN |
TheChrisyd | 2:20a89dc286d5 | 123 | #endif |
TheChrisyd | 2:20a89dc286d5 | 124 | #ifdef BUTTON_X_PIN |
TheChrisyd | 2:20a89dc286d5 | 125 | , BUTTON_X_PIN |
TheChrisyd | 2:20a89dc286d5 | 126 | #endif |
TheChrisyd | 2:20a89dc286d5 | 127 | #ifdef BUTTON_Y_PIN |
TheChrisyd | 2:20a89dc286d5 | 128 | , BUTTON_Y_PIN |
TheChrisyd | 2:20a89dc286d5 | 129 | #endif |
TheChrisyd | 2:20a89dc286d5 | 130 | #ifdef BUTTON_Z_PIN |
TheChrisyd | 2:20a89dc286d5 | 131 | , BUTTON_Z_PIN |
TheChrisyd | 2:20a89dc286d5 | 132 | #endif |
TheChrisyd | 2:20a89dc286d5 | 133 | #ifdef BUTTON_ST_PIN |
TheChrisyd | 2:20a89dc286d5 | 134 | , BUTTON_ST_PIN |
TheChrisyd | 2:20a89dc286d5 | 135 | #endif |
TheChrisyd | 2:20a89dc286d5 | 136 | #ifdef BUTTON_SEL_PIN |
TheChrisyd | 2:20a89dc286d5 | 137 | , BUTTON_SEL_PIN |
TheChrisyd | 2:20a89dc286d5 | 138 | #endif |
TheChrisyd | 2:20a89dc286d5 | 139 | #ifdef STICK_LEFT_PIN |
TheChrisyd | 2:20a89dc286d5 | 140 | , STICK_LEFT_PIN, |
TheChrisyd | 2:20a89dc286d5 | 141 | STICK_RIGHT_PIN, |
TheChrisyd | 2:20a89dc286d5 | 142 | STICK_UP_PIN, |
TheChrisyd | 2:20a89dc286d5 | 143 | STICK_DOWN_PIN |
TheChrisyd | 2:20a89dc286d5 | 144 | #endif |
TheChrisyd | 2:20a89dc286d5 | 145 | }; |
TheChrisyd | 4:bb78bedae411 | 146 | #endif |
TheChrisyd | 4:bb78bedae411 | 147 | |
TheChrisyd | 4:bb78bedae411 | 148 | #ifdef WIRELESS |
TheChrisyd | 4:bb78bedae411 | 149 | |
TheChrisyd | 4:bb78bedae411 | 150 | #endif |
TheChrisyd | 2:20a89dc286d5 | 151 | Joystick::Joystick() |
TheChrisyd | 2:20a89dc286d5 | 152 | { |
TheChrisyd | 4:bb78bedae411 | 153 | #ifdef WIRELESS |
TheChrisyd | 4:bb78bedae411 | 154 | // wireless_joypad.attachRXHandler(&nRF2401A_rx, 0); |
TheChrisyd | 4:bb78bedae411 | 155 | #else |
TheChrisyd | 2:20a89dc286d5 | 156 | // set up digital pins for dpad and buttons |
TheChrisyd | 2:20a89dc286d5 | 157 | // const prog_uchar *pin = joystickPinList; |
TheChrisyd | 2:20a89dc286d5 | 158 | for (byte i=0; i<sizeof(joystickPinList); ++i) { |
TheChrisyd | 2:20a89dc286d5 | 159 | byte p = pgm_read_byte(joystickPinList+i); |
TheChrisyd | 2:20a89dc286d5 | 160 | //pinMode(p,INPUT); |
TheChrisyd | 2:20a89dc286d5 | 161 | //digitalWrite(p,HIGH); |
TheChrisyd | 4:bb78bedae411 | 162 | } |
TheChrisyd | 4:bb78bedae411 | 163 | #endif |
TheChrisyd | 4:bb78bedae411 | 164 | |
TheChrisyd | 4:bb78bedae411 | 165 | |
TheChrisyd | 2:20a89dc286d5 | 166 | stickX = stickY = 0; |
TheChrisyd | 2:20a89dc286d5 | 167 | xCal = yCal = 0; |
TheChrisyd | 2:20a89dc286d5 | 168 | buttons = prev = dpad = 0; |
TheChrisyd | 2:20a89dc286d5 | 169 | |
TheChrisyd | 2:20a89dc286d5 | 170 | #ifdef ANALOG_X_PIN |
TheChrisyd | 2:20a89dc286d5 | 171 | dpad |= ANALOG_STICK_BIT; |
TheChrisyd | 2:20a89dc286d5 | 172 | #endif |
TheChrisyd | 2:20a89dc286d5 | 173 | } |
TheChrisyd | 4:bb78bedae411 | 174 | |
TheChrisyd | 2:20a89dc286d5 | 175 | bool Joystick::hasAnalogStick() |
TheChrisyd | 2:20a89dc286d5 | 176 | { |
TheChrisyd | 2:20a89dc286d5 | 177 | return (dpad&ANALOG_STICK_BIT)!=0; |
TheChrisyd | 2:20a89dc286d5 | 178 | } |
TheChrisyd | 4:bb78bedae411 | 179 | |
TheChrisyd | 2:20a89dc286d5 | 180 | void Joystick::recalibrate() |
TheChrisyd | 2:20a89dc286d5 | 181 | { |
TheChrisyd | 4:bb78bedae411 | 182 | |
TheChrisyd | 2:20a89dc286d5 | 183 | read(); |
TheChrisyd | 2:20a89dc286d5 | 184 | xCal = stickX; |
TheChrisyd | 2:20a89dc286d5 | 185 | yCal = stickY; |
TheChrisyd | 2:20a89dc286d5 | 186 | } |
TheChrisyd | 2:20a89dc286d5 | 187 | static char stickCalc(int a, char cal) |
TheChrisyd | 2:20a89dc286d5 | 188 | { |
TheChrisyd | 2:20a89dc286d5 | 189 | //a = ((analogRead(a)-512)/4)-cal; |
TheChrisyd | 2:20a89dc286d5 | 190 | if (a < -128) a = -128; |
TheChrisyd | 2:20a89dc286d5 | 191 | if (a > 127) a = 127; |
TheChrisyd | 2:20a89dc286d5 | 192 | return char(a); |
TheChrisyd | 2:20a89dc286d5 | 193 | } |
TheChrisyd | 2:20a89dc286d5 | 194 | void Joystick::read() |
TheChrisyd | 2:20a89dc286d5 | 195 | { |
TheChrisyd | 2:20a89dc286d5 | 196 | // Joystick buttons |
TheChrisyd | 2:20a89dc286d5 | 197 | prev = buttons; |
TheChrisyd | 2:20a89dc286d5 | 198 | buttons = 0; |
TheChrisyd | 2:20a89dc286d5 | 199 | #ifdef BUTTON_A_PIN |
TheChrisyd | 2:20a89dc286d5 | 200 | // if (digitalRead(BUTTON_A_PIN)==LOW) { buttons |= buttonA; } |
TheChrisyd | 2:20a89dc286d5 | 201 | #endif |
TheChrisyd | 2:20a89dc286d5 | 202 | #ifdef BUTTON_B_PIN |
TheChrisyd | 2:20a89dc286d5 | 203 | // if (digitalRead(BUTTON_B_PIN)==LOW) { buttons |= buttonB; } |
TheChrisyd | 2:20a89dc286d5 | 204 | #endif |
TheChrisyd | 2:20a89dc286d5 | 205 | #ifdef BUTTON_C_PIN |
TheChrisyd | 2:20a89dc286d5 | 206 | // if (digitalRead(BUTTON_C_PIN)==LOW) { buttons |= buttonC; } |
TheChrisyd | 2:20a89dc286d5 | 207 | #endif |
TheChrisyd | 2:20a89dc286d5 | 208 | #ifdef BUTTON_X_PIN |
TheChrisyd | 2:20a89dc286d5 | 209 | // if (digitalRead(BUTTON_X_PIN)==LOW) { buttons |= buttonX; } |
TheChrisyd | 2:20a89dc286d5 | 210 | #endif |
TheChrisyd | 2:20a89dc286d5 | 211 | #ifdef BUTTON_Y_PIN |
TheChrisyd | 2:20a89dc286d5 | 212 | // if (digitalRead(BUTTON_Y_PIN)==LOW) { buttons |= buttonY; } |
TheChrisyd | 2:20a89dc286d5 | 213 | #endif |
TheChrisyd | 2:20a89dc286d5 | 214 | #ifdef BUTTON_Z_PIN |
TheChrisyd | 2:20a89dc286d5 | 215 | // if (digitalRead(BUTTON_Z_PIN)==LOW) { buttons |= buttonZ; } |
TheChrisyd | 2:20a89dc286d5 | 216 | #endif |
TheChrisyd | 2:20a89dc286d5 | 217 | #ifdef BUTTON_SEL_PIN |
TheChrisyd | 2:20a89dc286d5 | 218 | // if (digitalRead(BUTTON_SEL_PIN)==LOW){ buttons |= buttonSelect; } |
TheChrisyd | 2:20a89dc286d5 | 219 | #endif |
TheChrisyd | 2:20a89dc286d5 | 220 | #ifdef BUTTON_ST_PIN |
TheChrisyd | 2:20a89dc286d5 | 221 | // if (digitalRead(BUTTON_ST_PIN)==LOW){ buttons |= buttonStart; } |
TheChrisyd | 2:20a89dc286d5 | 222 | #endif |
TheChrisyd | 4:bb78bedae411 | 223 | #ifndef WIRELESS |
TheChrisyd | 2:20a89dc286d5 | 224 | // Digital joystick/dpad |
TheChrisyd | 2:20a89dc286d5 | 225 | dpad &= STICK_INFO_MASK; // The top bits are informational...preserve them |
TheChrisyd | 4:bb78bedae411 | 226 | #else |
TheChrisyd | 4:bb78bedae411 | 227 | dpad = wireless_dpad; |
TheChrisyd | 4:bb78bedae411 | 228 | buttons = wireless_buttons; |
TheChrisyd | 4:bb78bedae411 | 229 | #endif |
TheChrisyd | 4:bb78bedae411 | 230 | |
TheChrisyd | 2:20a89dc286d5 | 231 | #ifdef STICK_LEFT_PIN |
TheChrisyd | 2:20a89dc286d5 | 232 | // if (!digitalRead(STICK_LEFT_PIN)) { dpad |= STICK_LEFT_BIT; } |
TheChrisyd | 2:20a89dc286d5 | 233 | // if (!digitalRead(STICK_RIGHT_PIN)) { dpad |= STICK_RIGHT_BIT; } |
TheChrisyd | 2:20a89dc286d5 | 234 | // if (!digitalRead(STICK_UP_PIN)) { dpad |= STICK_UP_BIT; } |
TheChrisyd | 2:20a89dc286d5 | 235 | // if (!digitalRead(STICK_DOWN_PIN)) { dpad |= STICK_DOWN_BIT; } |
TheChrisyd | 2:20a89dc286d5 | 236 | #ifdef DIGITAL_EMULATE_ANALOG |
TheChrisyd | 2:20a89dc286d5 | 237 | stickX = 0; |
TheChrisyd | 2:20a89dc286d5 | 238 | if (dpad&STICK_LEFT_BIT) { stickX = -127; } |
TheChrisyd | 2:20a89dc286d5 | 239 | else if (dpad&STICK_RIGHT_BIT) { stickX = 127; } |
TheChrisyd | 2:20a89dc286d5 | 240 | stickY = 0; |
TheChrisyd | 2:20a89dc286d5 | 241 | if (dpad&STICK_UP_BIT) { stickY = 127; } |
TheChrisyd | 2:20a89dc286d5 | 242 | else if (dpad&STICK_DOWN_BIT) { stickY = -127; } |
TheChrisyd | 2:20a89dc286d5 | 243 | #endif |
TheChrisyd | 2:20a89dc286d5 | 244 | #endif |
TheChrisyd | 2:20a89dc286d5 | 245 | |
TheChrisyd | 2:20a89dc286d5 | 246 | // Analog stick |
TheChrisyd | 2:20a89dc286d5 | 247 | #ifdef ANALOG_X_PIN |
TheChrisyd | 2:20a89dc286d5 | 248 | stickX = stickCalc(ANALOG_X_PIN,xCal); |
TheChrisyd | 2:20a89dc286d5 | 249 | #endif |
TheChrisyd | 2:20a89dc286d5 | 250 | #ifdef ANALOG_Y_PIN |
TheChrisyd | 2:20a89dc286d5 | 251 | stickY = stickCalc(ANALOG_Y_PIN,yCal); |
TheChrisyd | 2:20a89dc286d5 | 252 | #endif |
TheChrisyd | 2:20a89dc286d5 | 253 | #ifdef ANALOG_EMULATE_DIGITAL |
TheChrisyd | 2:20a89dc286d5 | 254 | if (stickX < -40) { dpad |= STICK_LEFT_BIT; } |
TheChrisyd | 2:20a89dc286d5 | 255 | else if (stickX > 40) { dpad |= STICK_RIGHT_BIT; } |
TheChrisyd | 2:20a89dc286d5 | 256 | if (stickY > 40) { dpad |= STICK_UP_BIT; } |
TheChrisyd | 2:20a89dc286d5 | 257 | else if (stickY < -40) { dpad |= STICK_DOWN_BIT; } |
TheChrisyd | 2:20a89dc286d5 | 258 | #endif |
TheChrisyd | 2:20a89dc286d5 | 259 | } |
TheChrisyd | 2:20a89dc286d5 | 260 | |
TheChrisyd | 2:20a89dc286d5 | 261 | /*-------------------------------------------------------- |
TheChrisyd | 2:20a89dc286d5 | 262 | Useful function to show joystick status on screen. |
TheChrisyd | 2:20a89dc286d5 | 263 | |
TheChrisyd | 2:20a89dc286d5 | 264 | Note: You won't make your program any smaller by |
TheChrisyd | 2:20a89dc286d5 | 265 | removing this - the Arduino compiler is really, |
TheChrisyd | 2:20a89dc286d5 | 266 | really good at discarding unused code. |
TheChrisyd | 2:20a89dc286d5 | 267 | |
TheChrisyd | 2:20a89dc286d5 | 268 | ie. If you're not calling Joystick::dump() then it |
TheChrisyd | 2:20a89dc286d5 | 269 | doesn't take up any space. Try it and see...! |
TheChrisyd | 2:20a89dc286d5 | 270 | --------------------------------------------------------*/ |
TheChrisyd | 2:20a89dc286d5 | 271 | // Formatted output of joystick position |
TheChrisyd | 2:20a89dc286d5 | 272 | static void jpos(int v, char *s, char t) |
TheChrisyd | 2:20a89dc286d5 | 273 | { |
TheChrisyd | 2:20a89dc286d5 | 274 | *s++ = t; |
TheChrisyd | 2:20a89dc286d5 | 275 | *s++ = ':'; |
TheChrisyd | 2:20a89dc286d5 | 276 | boolean neg = (v<0); |
TheChrisyd | 2:20a89dc286d5 | 277 | if (neg) { |
TheChrisyd | 2:20a89dc286d5 | 278 | v = -v; |
TheChrisyd | 2:20a89dc286d5 | 279 | } |
TheChrisyd | 2:20a89dc286d5 | 280 | char *o = s; |
TheChrisyd | 2:20a89dc286d5 | 281 | int m = 1000; |
TheChrisyd | 2:20a89dc286d5 | 282 | while (m != 0) { |
TheChrisyd | 2:20a89dc286d5 | 283 | int d = v/m; |
TheChrisyd | 2:20a89dc286d5 | 284 | *o++ = d+'0'; |
TheChrisyd | 2:20a89dc286d5 | 285 | v -= d*m; |
TheChrisyd | 2:20a89dc286d5 | 286 | m /= 10; |
TheChrisyd | 2:20a89dc286d5 | 287 | } |
TheChrisyd | 2:20a89dc286d5 | 288 | *o-- = 0; |
TheChrisyd | 2:20a89dc286d5 | 289 | // Remove leading zeros |
TheChrisyd | 2:20a89dc286d5 | 290 | while ((s<o) and (*s=='0')) { |
TheChrisyd | 2:20a89dc286d5 | 291 | *s++ = ' '; |
TheChrisyd | 2:20a89dc286d5 | 292 | } |
TheChrisyd | 2:20a89dc286d5 | 293 | if (neg) { |
TheChrisyd | 2:20a89dc286d5 | 294 | s[-1] = '-'; |
TheChrisyd | 2:20a89dc286d5 | 295 | } |
TheChrisyd | 2:20a89dc286d5 | 296 | } |
TheChrisyd | 2:20a89dc286d5 | 297 | void Joystick::dump(int sx, int sy) |
TheChrisyd | 2:20a89dc286d5 | 298 | { |
TheChrisyd | 2:20a89dc286d5 | 299 | char temp[32]; |
TheChrisyd | 2:20a89dc286d5 | 300 | if (hasAnalogStick()) { |
TheChrisyd | 2:20a89dc286d5 | 301 | jpos(analogX(),temp,'X'); |
TheChrisyd | 2:20a89dc286d5 | 302 | GD.putstr(sx,sy++,temp); |
TheChrisyd | 2:20a89dc286d5 | 303 | jpos(analogY(),temp,'Y'); |
TheChrisyd | 2:20a89dc286d5 | 304 | GD.putstr(sx,sy++,temp); |
TheChrisyd | 2:20a89dc286d5 | 305 | } |
TheChrisyd | 2:20a89dc286d5 | 306 | temp[0] = 'D'; |
TheChrisyd | 2:20a89dc286d5 | 307 | temp[1] = ':'; |
TheChrisyd | 2:20a89dc286d5 | 308 | char *s = temp+2; |
TheChrisyd | 2:20a89dc286d5 | 309 | *s++ = left() ?'L':'.'; |
TheChrisyd | 2:20a89dc286d5 | 310 | *s++ = right() ?'R':'.'; |
TheChrisyd | 2:20a89dc286d5 | 311 | *s++ = up() ?'U':'.'; |
TheChrisyd | 2:20a89dc286d5 | 312 | *s++ = down() ?'D':'.'; |
TheChrisyd | 2:20a89dc286d5 | 313 | *s = 0; |
TheChrisyd | 2:20a89dc286d5 | 314 | GD.putstr(sx,sy++,temp); |
TheChrisyd | 2:20a89dc286d5 | 315 | temp[0] = 'B'; |
TheChrisyd | 2:20a89dc286d5 | 316 | s = temp+2; |
TheChrisyd | 2:20a89dc286d5 | 317 | *s++ = (buttons&buttonSelect)?'L':'.'; |
TheChrisyd | 2:20a89dc286d5 | 318 | *s++ = (buttons&buttonStart)?'S':'.'; |
TheChrisyd | 2:20a89dc286d5 | 319 | *s++ = (buttons&buttonZ)?'Z':'.'; |
TheChrisyd | 2:20a89dc286d5 | 320 | *s++ = (buttons&buttonY)?'Y':'.'; |
TheChrisyd | 2:20a89dc286d5 | 321 | *s++ = (buttons&buttonX)?'X':'.'; |
TheChrisyd | 2:20a89dc286d5 | 322 | *s++ = (buttons&buttonC)?'C':'.'; |
TheChrisyd | 2:20a89dc286d5 | 323 | *s++ = (buttons&buttonB)?'B':'.'; |
TheChrisyd | 2:20a89dc286d5 | 324 | *s++ = (buttons&buttonA)?'A':'.'; |
TheChrisyd | 2:20a89dc286d5 | 325 | *s = 0; |
TheChrisyd | 2:20a89dc286d5 | 326 | GD.putstr(sx,sy++,temp); |
TheChrisyd | 0:8a7c58553b44 | 327 | } |