Initial

Dependencies:   mbed USBDevice USBJoystick_SIM

Committer:
Cirrus01
Date:
Sun Oct 21 11:24:39 2018 +0000
Revision:
3:86d3de520428
Parent:
1:5aa8e8b17eac
Child:
4:7ca148e9a75f
Minor changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cirrus01 0:e38e3d7b921c 1 /* mbed USBJoystick Library Demo
Cirrus01 0:e38e3d7b921c 2 * Copyright (c) 2012, v01: Initial version, WH,
Cirrus01 0:e38e3d7b921c 3 * Modified USBMouse code ARM Limited.
Cirrus01 0:e38e3d7b921c 4 * (c) 2010-2011 mbed.org, MIT License
Cirrus01 0:e38e3d7b921c 5 * 2016, v02: Updated USBDevice Lib, Added waitForConnect, Updated 32 bits button
Cirrus01 0:e38e3d7b921c 6 *
Cirrus01 0:e38e3d7b921c 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
Cirrus01 0:e38e3d7b921c 8 * of this software and associated documentation files (the "Software"), to deal
Cirrus01 0:e38e3d7b921c 9 * in the Software without restriction, inclumosig without limitation the rights
Cirrus01 0:e38e3d7b921c 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Cirrus01 0:e38e3d7b921c 11 * copies of the Software, and to permit persons to whom the Software is
Cirrus01 0:e38e3d7b921c 12 * furnished to do so, subject to the following conditions:
Cirrus01 0:e38e3d7b921c 13 *
Cirrus01 0:e38e3d7b921c 14 * The above copyright notice and this permission notice shall be included in
Cirrus01 0:e38e3d7b921c 15 * all copies or substantial portions of the Software.
Cirrus01 0:e38e3d7b921c 16 *
Cirrus01 0:e38e3d7b921c 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Cirrus01 0:e38e3d7b921c 18 * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Cirrus01 0:e38e3d7b921c 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Cirrus01 0:e38e3d7b921c 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Cirrus01 0:e38e3d7b921c 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Cirrus01 0:e38e3d7b921c 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Cirrus01 0:e38e3d7b921c 23 * THE SOFTWARE.
Cirrus01 0:e38e3d7b921c 24 */
Cirrus01 0:e38e3d7b921c 25
Cirrus01 0:e38e3d7b921c 26 #include "mbed.h"
Cirrus01 0:e38e3d7b921c 27 #include "config.h"
Cirrus01 0:e38e3d7b921c 28 #include "USBJoystick.h"
Cirrus01 0:e38e3d7b921c 29
Cirrus01 0:e38e3d7b921c 30 USBJoystick joystick;
Cirrus01 0:e38e3d7b921c 31
Cirrus01 0:e38e3d7b921c 32 // Variables for Heartbeat and Status monitoring
Cirrus01 0:e38e3d7b921c 33 DigitalOut myled1(LED4);
Cirrus01 0:e38e3d7b921c 34 DigitalOut myled2(LED2);
Cirrus01 0:e38e3d7b921c 35 DigitalOut myled3(LED3);
Cirrus01 0:e38e3d7b921c 36 DigitalOut heartbeatLED(LED1);
Cirrus01 0:e38e3d7b921c 37
Cirrus01 0:e38e3d7b921c 38 AnalogIn inX(A0); // X
Cirrus01 0:e38e3d7b921c 39 AnalogIn inY(A1); // Y
Cirrus01 0:e38e3d7b921c 40 AnalogIn inRudder(A2); // Rz (Rudder)
Cirrus01 0:e38e3d7b921c 41 AnalogIn inThrottle(A3); // Slider (Throttle)
Cirrus01 0:e38e3d7b921c 42 AnalogIn inBreaks(A4); // Z (Breaks)
Cirrus01 0:e38e3d7b921c 43 AnalogIn inFlaps(A5); // Rx (Flaps)
Cirrus01 0:e38e3d7b921c 44
Cirrus01 0:e38e3d7b921c 45 Ticker heartbeat;
Cirrus01 0:e38e3d7b921c 46 Serial pc(USBTX, USBRX); // tx, rx
Cirrus01 0:e38e3d7b921c 47
Cirrus01 0:e38e3d7b921c 48 // number of elements in an array
Cirrus01 0:e38e3d7b921c 49 #define countof(x) (sizeof(x)/sizeof((x)[0]))
Cirrus01 0:e38e3d7b921c 50
Cirrus01 0:e38e3d7b921c 51 // button input map array
Cirrus01 0:e38e3d7b921c 52 DigitalIn *buttonDigIn[NUM_OF_BUTTONS]; // config.h
Cirrus01 0:e38e3d7b921c 53
Cirrus01 0:e38e3d7b921c 54 // hat button input map array
Cirrus01 0:e38e3d7b921c 55 DigitalIn *hatDigIn[NUM_OF_HAT_BUTTONS]; // config.h
Cirrus01 0:e38e3d7b921c 56
Cirrus01 0:e38e3d7b921c 57 // Heartbeat monitor
Cirrus01 0:e38e3d7b921c 58 void pulse()
Cirrus01 0:e38e3d7b921c 59 {
Cirrus01 0:e38e3d7b921c 60 heartbeatLED = !heartbeatLED;
Cirrus01 0:e38e3d7b921c 61 }
Cirrus01 0:e38e3d7b921c 62
Cirrus01 0:e38e3d7b921c 63 void heartbeat_start()
Cirrus01 0:e38e3d7b921c 64 {
Cirrus01 0:e38e3d7b921c 65 heartbeatLED=1;
Cirrus01 0:e38e3d7b921c 66 heartbeat.attach(&pulse, 0.5);
Cirrus01 0:e38e3d7b921c 67 }
Cirrus01 0:e38e3d7b921c 68
Cirrus01 0:e38e3d7b921c 69 void heartbeat_stop()
Cirrus01 0:e38e3d7b921c 70 {
Cirrus01 0:e38e3d7b921c 71 heartbeat.detach();
Cirrus01 0:e38e3d7b921c 72 }
Cirrus01 0:e38e3d7b921c 73
Cirrus01 0:e38e3d7b921c 74 // button state
Cirrus01 0:e38e3d7b921c 75 struct ButtonState
Cirrus01 0:e38e3d7b921c 76 {
Cirrus01 0:e38e3d7b921c 77 // current on/off state
Cirrus01 0:e38e3d7b921c 78 int pressed;
Cirrus01 0:e38e3d7b921c 79
Cirrus01 0:e38e3d7b921c 80 // Sticky time remaining for current state. When a
Cirrus01 0:e38e3d7b921c 81 // state transition occurs, we set this to a debounce
Cirrus01 0:e38e3d7b921c 82 // period. Future state transitions will be ignored
Cirrus01 0:e38e3d7b921c 83 // until the debounce time elapses.
Cirrus01 0:e38e3d7b921c 84 int bt;
Cirrus01 0:e38e3d7b921c 85 } buttonState[NUM_OF_BUTTONS];
Cirrus01 0:e38e3d7b921c 86
Cirrus01 0:e38e3d7b921c 87 // timer for button reports
Cirrus01 0:e38e3d7b921c 88 static Timer buttonTimer;
Cirrus01 0:e38e3d7b921c 89
Cirrus01 0:e38e3d7b921c 90 // initialize the button inputs
Cirrus01 0:e38e3d7b921c 91 void initButtons()
Cirrus01 0:e38e3d7b921c 92 {
Cirrus01 0:e38e3d7b921c 93 // create the digital inputs
Cirrus01 0:e38e3d7b921c 94 for (int i = 0 ; i < countof(buttonDigIn) ; i++)
Cirrus01 0:e38e3d7b921c 95 {
Cirrus01 0:e38e3d7b921c 96 if (i < countof(buttonMap) && buttonMap[i] != NC)
Cirrus01 0:e38e3d7b921c 97 buttonDigIn[i] = new DigitalIn(buttonMap[i]);
Cirrus01 0:e38e3d7b921c 98 else
Cirrus01 0:e38e3d7b921c 99 buttonDigIn[i] = 0;
Cirrus01 0:e38e3d7b921c 100 }
Cirrus01 0:e38e3d7b921c 101
Cirrus01 0:e38e3d7b921c 102 // start the button timer
Cirrus01 0:e38e3d7b921c 103 buttonTimer.start();
Cirrus01 0:e38e3d7b921c 104 }
Cirrus01 0:e38e3d7b921c 105
Cirrus01 0:e38e3d7b921c 106
Cirrus01 0:e38e3d7b921c 107 // read the button input state
Cirrus01 0:e38e3d7b921c 108 uint32_t readButtons()
Cirrus01 0:e38e3d7b921c 109 {
Cirrus01 0:e38e3d7b921c 110 // start with all buttons off
Cirrus01 0:e38e3d7b921c 111 uint32_t buttons = 0;
Cirrus01 0:e38e3d7b921c 112
Cirrus01 0:e38e3d7b921c 113 // figure the time elapsed since the last scan
Cirrus01 0:e38e3d7b921c 114 int dt = buttonTimer.read_ms();
Cirrus01 0:e38e3d7b921c 115
Cirrus01 0:e38e3d7b921c 116 // reset the timef for the next scan
Cirrus01 0:e38e3d7b921c 117 buttonTimer.reset();
Cirrus01 0:e38e3d7b921c 118
Cirrus01 0:e38e3d7b921c 119 // scan the button list
Cirrus01 0:e38e3d7b921c 120 uint32_t bit = 1;
Cirrus01 0:e38e3d7b921c 121 DigitalIn **di = buttonDigIn;
Cirrus01 0:e38e3d7b921c 122 ButtonState *bs = buttonState;
Cirrus01 0:e38e3d7b921c 123 for (int i = 0 ; i < countof(buttonDigIn) ; i++, di++, bs++, bit <<= 1)
Cirrus01 0:e38e3d7b921c 124 {
Cirrus01 0:e38e3d7b921c 125 // read this button
Cirrus01 0:e38e3d7b921c 126 if (*di != 0)
Cirrus01 0:e38e3d7b921c 127 {
Cirrus01 0:e38e3d7b921c 128 // deduct the elapsed time since the last update
Cirrus01 0:e38e3d7b921c 129 // from the button's remaining sticky time
Cirrus01 0:e38e3d7b921c 130 bs->bt -= dt;
Cirrus01 0:e38e3d7b921c 131 if (bs->bt < 0)
Cirrus01 0:e38e3d7b921c 132 bs->bt = 0;
Cirrus01 0:e38e3d7b921c 133
Cirrus01 0:e38e3d7b921c 134 // If the sticky time has elapsed, note the new physical
Cirrus01 0:e38e3d7b921c 135 // state of the button. If we still have sticky time
Cirrus01 0:e38e3d7b921c 136 // remaining, ignore the physical state; the last state
Cirrus01 0:e38e3d7b921c 137 // change persists until the sticky time elapses so that
Cirrus01 0:e38e3d7b921c 138 // we smooth out any "bounce" (electrical transients that
Cirrus01 0:e38e3d7b921c 139 // occur when the switch contact is opened or closed).
Cirrus01 0:e38e3d7b921c 140 if (bs->bt == 0)
Cirrus01 0:e38e3d7b921c 141 {
Cirrus01 0:e38e3d7b921c 142 // get the new physical state
Cirrus01 0:e38e3d7b921c 143 int pressed = !(*di)->read();
Cirrus01 0:e38e3d7b921c 144
Cirrus01 0:e38e3d7b921c 145 // update the button's logical state if this is a change
Cirrus01 0:e38e3d7b921c 146 if (pressed != bs->pressed)
Cirrus01 0:e38e3d7b921c 147 {
Cirrus01 0:e38e3d7b921c 148 // store the new state
Cirrus01 0:e38e3d7b921c 149 bs->pressed = pressed;
Cirrus01 0:e38e3d7b921c 150
Cirrus01 0:e38e3d7b921c 151 // start a new sticky period for debouncing this
Cirrus01 0:e38e3d7b921c 152 // state change
Cirrus01 0:e38e3d7b921c 153 bs->bt = 10;
Cirrus01 0:e38e3d7b921c 154 }
Cirrus01 0:e38e3d7b921c 155 }
Cirrus01 0:e38e3d7b921c 156
Cirrus01 0:e38e3d7b921c 157 // if it's pressed, OR its bit into the state
Cirrus01 0:e38e3d7b921c 158 if (bs->pressed)
Cirrus01 0:e38e3d7b921c 159 buttons |= bit;
Cirrus01 3:86d3de520428 160 //pc.printf("Buttons: %d\n", buttons);
Cirrus01 0:e38e3d7b921c 161 }
Cirrus01 0:e38e3d7b921c 162 }
Cirrus01 0:e38e3d7b921c 163
Cirrus01 0:e38e3d7b921c 164 // return the new button list
Cirrus01 0:e38e3d7b921c 165 return buttons;
Cirrus01 0:e38e3d7b921c 166 }
Cirrus01 0:e38e3d7b921c 167
Cirrus01 0:e38e3d7b921c 168 // hat state
Cirrus01 0:e38e3d7b921c 169 struct HatState
Cirrus01 0:e38e3d7b921c 170 {
Cirrus01 0:e38e3d7b921c 171 // current on/off state
Cirrus01 0:e38e3d7b921c 172 int pressed;
Cirrus01 0:e38e3d7b921c 173
Cirrus01 0:e38e3d7b921c 174 // Sticky time remaining for current state. When a
Cirrus01 0:e38e3d7b921c 175 // state transition occurs, we set this to a debounce
Cirrus01 0:e38e3d7b921c 176 // period. Future state transitions will be ignored
Cirrus01 0:e38e3d7b921c 177 // until the debounce time elapses.
Cirrus01 0:e38e3d7b921c 178 int ht;
Cirrus01 0:e38e3d7b921c 179 } hatState[NUM_OF_HAT_BUTTONS];
Cirrus01 0:e38e3d7b921c 180
Cirrus01 0:e38e3d7b921c 181 // timer for hat reports
Cirrus01 0:e38e3d7b921c 182 static Timer hatTimer;
Cirrus01 0:e38e3d7b921c 183
Cirrus01 0:e38e3d7b921c 184 // initialize the hat inputs
Cirrus01 0:e38e3d7b921c 185 void initHat()
Cirrus01 0:e38e3d7b921c 186 {
Cirrus01 0:e38e3d7b921c 187 // create the digital inputs
Cirrus01 0:e38e3d7b921c 188 for (int i = 0 ; i <= countof(hatDigIn) ; i++)
Cirrus01 0:e38e3d7b921c 189 {
Cirrus01 0:e38e3d7b921c 190 if (i < countof(hatMap) && hatMap[i] != NC)
Cirrus01 0:e38e3d7b921c 191 hatDigIn[i] = new DigitalIn(hatMap[i]);
Cirrus01 0:e38e3d7b921c 192 else
Cirrus01 0:e38e3d7b921c 193 hatDigIn[i] = 0;
Cirrus01 0:e38e3d7b921c 194 }
Cirrus01 0:e38e3d7b921c 195
Cirrus01 0:e38e3d7b921c 196 // start the hat timer
Cirrus01 0:e38e3d7b921c 197 hatTimer.start();
Cirrus01 0:e38e3d7b921c 198 }
Cirrus01 0:e38e3d7b921c 199
Cirrus01 0:e38e3d7b921c 200 // read the hat button input state
Cirrus01 0:e38e3d7b921c 201 uint8_t readHat()
Cirrus01 0:e38e3d7b921c 202 {
Cirrus01 0:e38e3d7b921c 203 // start with all buttons off
Cirrus01 0:e38e3d7b921c 204 uint8_t hat = 0;
Cirrus01 0:e38e3d7b921c 205
Cirrus01 0:e38e3d7b921c 206 // figure the time elapsed since the last scan
Cirrus01 0:e38e3d7b921c 207 int dt = hatTimer.read_ms();
Cirrus01 0:e38e3d7b921c 208
Cirrus01 0:e38e3d7b921c 209 // reset the time for the next scan
Cirrus01 0:e38e3d7b921c 210 hatTimer.reset();
Cirrus01 0:e38e3d7b921c 211
Cirrus01 0:e38e3d7b921c 212 // scan the button list
Cirrus01 0:e38e3d7b921c 213 uint8_t bit = 1;
Cirrus01 0:e38e3d7b921c 214 DigitalIn **di = hatDigIn;
Cirrus01 0:e38e3d7b921c 215 HatState *hs = hatState;
Cirrus01 0:e38e3d7b921c 216 for (int i = 0 ; i < countof(hatDigIn) ; i++, di++, hs++)
Cirrus01 0:e38e3d7b921c 217 {
Cirrus01 0:e38e3d7b921c 218 // read this button
Cirrus01 0:e38e3d7b921c 219 if (*di != 0)
Cirrus01 0:e38e3d7b921c 220 {
Cirrus01 0:e38e3d7b921c 221 // deduct the elapsed time since the last update
Cirrus01 0:e38e3d7b921c 222 // from the button's remaining sticky time
Cirrus01 0:e38e3d7b921c 223 hs->ht -= dt;
Cirrus01 0:e38e3d7b921c 224 if (hs->ht < 0)
Cirrus01 0:e38e3d7b921c 225 hs->ht = 0;
Cirrus01 0:e38e3d7b921c 226
Cirrus01 0:e38e3d7b921c 227 // If the sticky time has elapsed, note the new physical
Cirrus01 0:e38e3d7b921c 228 // state of the button. If we still have sticky time
Cirrus01 0:e38e3d7b921c 229 // remaining, ignore the physical state; the last state
Cirrus01 0:e38e3d7b921c 230 // change persists until the sticky time elapses so that
Cirrus01 0:e38e3d7b921c 231 // we smooth out any "bounce" (electrical transients that
Cirrus01 0:e38e3d7b921c 232 // occur when the switch contact is opened or closed).
Cirrus01 0:e38e3d7b921c 233 if (hs->ht == 0)
Cirrus01 0:e38e3d7b921c 234 {
Cirrus01 0:e38e3d7b921c 235 // get the new physical state
Cirrus01 0:e38e3d7b921c 236 int pressed = !(*di)->read();
Cirrus01 0:e38e3d7b921c 237
Cirrus01 0:e38e3d7b921c 238 // update the button's logical state if this is a change
Cirrus01 0:e38e3d7b921c 239 if (pressed != hs->pressed)
Cirrus01 0:e38e3d7b921c 240 {
Cirrus01 0:e38e3d7b921c 241 // store the new state
Cirrus01 0:e38e3d7b921c 242 hs->pressed = pressed;
Cirrus01 0:e38e3d7b921c 243
Cirrus01 0:e38e3d7b921c 244 // start a new sticky period for debouncing this
Cirrus01 0:e38e3d7b921c 245 // state change
Cirrus01 0:e38e3d7b921c 246 hs->ht = 10;
Cirrus01 0:e38e3d7b921c 247 }
Cirrus01 0:e38e3d7b921c 248 }
Cirrus01 0:e38e3d7b921c 249
Cirrus01 0:e38e3d7b921c 250 // if it's pressed, OR its bit into the state
Cirrus01 0:e38e3d7b921c 251 if (hs->pressed)
Cirrus01 0:e38e3d7b921c 252 hat |= bit;
Cirrus01 3:86d3de520428 253 //pc.printf("Hat: %d\n", hat);
Cirrus01 0:e38e3d7b921c 254 }
Cirrus01 0:e38e3d7b921c 255 bit <<= 1;
Cirrus01 0:e38e3d7b921c 256 }
Cirrus01 0:e38e3d7b921c 257
Cirrus01 0:e38e3d7b921c 258 // translate values read to descriptor values
Cirrus01 0:e38e3d7b921c 259 #if HAT4 && !HAT4_8
Cirrus01 0:e38e3d7b921c 260 if (hat == 0x01) // 00000001
Cirrus01 0:e38e3d7b921c 261 hat = JOY_HAT_UP; // 0
Cirrus01 0:e38e3d7b921c 262 else if (hat == 0x02) // 00000010
Cirrus01 0:e38e3d7b921c 263 hat = JOY_HAT_RIGHT; // 1
Cirrus01 0:e38e3d7b921c 264 else if (hat == 0x04) // 00000100
Cirrus01 0:e38e3d7b921c 265 hat = JOY_HAT_DOWN; // 2
Cirrus01 0:e38e3d7b921c 266 else if (hat == 0x08) // 00001000
Cirrus01 0:e38e3d7b921c 267 hat = JOY_HAT_LEFT; // 3
Cirrus01 0:e38e3d7b921c 268 else
Cirrus01 0:e38e3d7b921c 269 hat = JOY_HAT_NEUTRAL; // 4
Cirrus01 0:e38e3d7b921c 270 #endif
Cirrus01 0:e38e3d7b921c 271 #if HAT4 && HAT4_8
Cirrus01 0:e38e3d7b921c 272 if (hat == 0x01) // 00000001
Cirrus01 0:e38e3d7b921c 273 hat = JOY_HAT_UP; // 0
Cirrus01 0:e38e3d7b921c 274 else if (hat == 0x03) // 00000011
Cirrus01 0:e38e3d7b921c 275 hat = JOY_HAT_UP_RIGHT; // 1
Cirrus01 0:e38e3d7b921c 276 else if (hat == 0x02) // 00000010
Cirrus01 0:e38e3d7b921c 277 hat = JOY_HAT_RIGHT; // 2
Cirrus01 0:e38e3d7b921c 278 else if (hat == 0x06) // 00000110
Cirrus01 0:e38e3d7b921c 279 hat = JOY_HAT_DOWN_RIGHT; // 3
Cirrus01 0:e38e3d7b921c 280 else if (hat == 0x04) // 00000100
Cirrus01 0:e38e3d7b921c 281 hat = JOY_HAT_DOWN; // 4
Cirrus01 0:e38e3d7b921c 282 else if (hat == 0x0C) // 00001100
Cirrus01 0:e38e3d7b921c 283 hat = JOY_HAT_DOWN_LEFT; // 5
Cirrus01 0:e38e3d7b921c 284 else if (hat == 0x08) // 00001000
Cirrus01 0:e38e3d7b921c 285 hat = JOY_HAT_LEFT; // 6
Cirrus01 0:e38e3d7b921c 286 else if (hat == 0x09) // 00001001
Cirrus01 0:e38e3d7b921c 287 hat = JOY_HAT_UP_LEFT; // 7
Cirrus01 0:e38e3d7b921c 288 else
Cirrus01 0:e38e3d7b921c 289 hat = JOY_HAT_NEUTRAL; // 8
Cirrus01 0:e38e3d7b921c 290 #endif
Cirrus01 0:e38e3d7b921c 291 #if HAT8
Cirrus01 0:e38e3d7b921c 292 if (hat == 0x01) // 00000001
Cirrus01 0:e38e3d7b921c 293 hat = JOY_HAT_UP; // 0
Cirrus01 0:e38e3d7b921c 294 else if (hat == 0x02) // 00000010
Cirrus01 0:e38e3d7b921c 295 hat = JOY_HAT_UP_RIGHT; // 1
Cirrus01 0:e38e3d7b921c 296 else if (hat == 0x04) // 00000100
Cirrus01 0:e38e3d7b921c 297 hat = JOY_HAT_RIGHT; // 2
Cirrus01 0:e38e3d7b921c 298 else if (hat == 0x08) // 00001000
Cirrus01 0:e38e3d7b921c 299 hat = JOY_HAT_DOWN_RIGHT; // 3
Cirrus01 0:e38e3d7b921c 300 else if (hat == 0x10) // 00010000
Cirrus01 0:e38e3d7b921c 301 hat = JOY_HAT_DOWN; // 4
Cirrus01 0:e38e3d7b921c 302 else if (hat == 0x20) // 00100000
Cirrus01 0:e38e3d7b921c 303 hat = JOY_HAT_DOWN_LEFT; // 5
Cirrus01 0:e38e3d7b921c 304 else if (hat == 0x40) // 01000000
Cirrus01 0:e38e3d7b921c 305 hat = JOY_HAT_LEFT; // 6
Cirrus01 0:e38e3d7b921c 306 else if (hat == 0x80) // 10000000
Cirrus01 0:e38e3d7b921c 307 hat = JOY_HAT_UP_LEFT; // 7
Cirrus01 0:e38e3d7b921c 308 else
Cirrus01 0:e38e3d7b921c 309 hat = JOY_HAT_NEUTRAL; // 8
Cirrus01 0:e38e3d7b921c 310 #endif
Cirrus01 0:e38e3d7b921c 311
Cirrus01 0:e38e3d7b921c 312 // return the new button list
Cirrus01 3:86d3de520428 313 //pc.printf("Return Hat: %d", hat);
Cirrus01 0:e38e3d7b921c 314 return hat;
Cirrus01 0:e38e3d7b921c 315 }
Cirrus01 0:e38e3d7b921c 316
Cirrus01 0:e38e3d7b921c 317 int main()
Cirrus01 0:e38e3d7b921c 318 {
Cirrus01 1:5aa8e8b17eac 319 int16_t x = 0;
Cirrus01 1:5aa8e8b17eac 320 int16_t y = 0;
Cirrus01 1:5aa8e8b17eac 321 int16_t breaks = 0;
Cirrus01 1:5aa8e8b17eac 322 int16_t flaps = 0;
Cirrus01 1:5aa8e8b17eac 323 int16_t rudder = 0;
Cirrus01 1:5aa8e8b17eac 324 int16_t throttle = 0;
Cirrus01 0:e38e3d7b921c 325 uint8_t hat = 0;
Cirrus01 0:e38e3d7b921c 326 uint32_t buttons = 0;
Cirrus01 0:e38e3d7b921c 327
Cirrus01 0:e38e3d7b921c 328
Cirrus01 1:5aa8e8b17eac 329 const int16_t l = 32767;
Cirrus01 0:e38e3d7b921c 330 const uint16_t m = 65535;
Cirrus01 0:e38e3d7b921c 331
Cirrus01 3:86d3de520428 332 //pc.printf("Hello World from Joystick!\n\r");
Cirrus01 0:e38e3d7b921c 333
Cirrus01 0:e38e3d7b921c 334 initButtons();
Cirrus01 0:e38e3d7b921c 335 initHat();
Cirrus01 0:e38e3d7b921c 336
Cirrus01 0:e38e3d7b921c 337 heartbeat_start();
Cirrus01 0:e38e3d7b921c 338
Cirrus01 3:86d3de520428 339 //pc.printf("x, y, breaks, flaps, rudder, throttle, hat, buttons\n\n\r");
Cirrus01 0:e38e3d7b921c 340
Cirrus01 0:e38e3d7b921c 341 while (1) {
Cirrus01 0:e38e3d7b921c 342
Cirrus01 1:5aa8e8b17eac 343 x = inX.read() * m - l;
Cirrus01 1:5aa8e8b17eac 344 y = inY.read() * m - l;
Cirrus01 1:5aa8e8b17eac 345 breaks = inBreaks.read() * m - l;
Cirrus01 1:5aa8e8b17eac 346 flaps = inFlaps.read() * m - l;
Cirrus01 1:5aa8e8b17eac 347 rudder = inRudder.read() * m - l;
Cirrus01 1:5aa8e8b17eac 348 throttle = inThrottle.read() * m - l;
Cirrus01 0:e38e3d7b921c 349 hat = readHat();
Cirrus01 0:e38e3d7b921c 350 buttons = readButtons();
Cirrus01 0:e38e3d7b921c 351
Cirrus01 0:e38e3d7b921c 352 pc.printf("%d, %d, %d, %d, %d, %d, %d, %d\n\r", x, y, breaks, flaps, rudder, throttle, hat, buttons);
Cirrus01 3:86d3de520428 353 pc.printf("%d, %d\n\r", inX.read(), inY.read());
Cirrus01 0:e38e3d7b921c 354
Cirrus01 0:e38e3d7b921c 355 joystick.update(x, y, breaks, flaps, rudder, throttle, hat, buttons);
Cirrus01 0:e38e3d7b921c 356 wait(0.01);
Cirrus01 0:e38e3d7b921c 357 }
Cirrus01 0:e38e3d7b921c 358
Cirrus01 0:e38e3d7b921c 359 //pc.printf("Bye World!\n\r");
Cirrus01 0:e38e3d7b921c 360 }