Demo for USBJoystick updated for 32 buttons.

Dependencies:   USBDevice USBJoystick_SIM mbed USBJoystick_2

Dependents:   USBJoystick_2

Fork of USBJoystick_HelloWorld2 by Wim Huiskamp

Committer:
Cirrus01
Date:
Sun Sep 16 09:57:12 2018 +0000
Revision:
3:3ddaf1227e1b
Parent:
2:967da2faedcd
Child:
4:dc3556a31262
Hat switch translation reorganized plus bug fixed

Who changed what in which revision?

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