Initial

Dependencies:   mbed USBDevice USBJoystick_SIM

Revision:
0:e38e3d7b921c
Child:
1:5aa8e8b17eac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Sep 30 11:27:54 2018 +0000
@@ -0,0 +1,359 @@
+/* mbed USBJoystick Library Demo
+ * Copyright (c) 2012, v01:  Initial version, WH,
+ *                           Modified USBMouse code ARM Limited.
+ *                           (c) 2010-2011 mbed.org, MIT License
+ *               2016, v02:  Updated USBDevice Lib, Added waitForConnect, Updated 32 bits button
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, inclumosig without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+ 
+#include "mbed.h"
+#include "config.h"
+#include "USBJoystick.h"
+ 
+USBJoystick joystick;
+ 
+// Variables for Heartbeat and Status monitoring
+DigitalOut myled1(LED4);
+DigitalOut myled2(LED2);
+DigitalOut myled3(LED3);
+DigitalOut heartbeatLED(LED1);
+ 
+AnalogIn inX(A0);               // X
+AnalogIn inY(A1);               // Y
+AnalogIn inRudder(A2);          // Rz (Rudder)
+AnalogIn inThrottle(A3);        // Slider (Throttle)
+AnalogIn inBreaks(A4);          // Z (Breaks)
+AnalogIn inFlaps(A5);           // Rx (Flaps)
+ 
+Ticker heartbeat;
+Serial pc(USBTX, USBRX); // tx, rx
+ 
+// number of elements in an array
+#define countof(x) (sizeof(x)/sizeof((x)[0]))
+ 
+// button input map array
+DigitalIn *buttonDigIn[NUM_OF_BUTTONS];  // config.h
+ 
+// hat button input map array
+DigitalIn *hatDigIn[NUM_OF_HAT_BUTTONS];  // config.h
+ 
+// Heartbeat monitor
+void pulse()
+{
+    heartbeatLED = !heartbeatLED;
+}
+ 
+void heartbeat_start()
+{
+    heartbeatLED=1;
+    heartbeat.attach(&pulse, 0.5);
+}
+ 
+void heartbeat_stop()
+{
+    heartbeat.detach();
+}
+ 
+// button state
+struct ButtonState
+{
+    // current on/off state
+    int pressed;
+    
+    // Sticky time remaining for current state.  When a
+    // state transition occurs, we set this to a debounce
+    // period.  Future state transitions will be ignored
+    // until the debounce time elapses.
+    int bt;
+} buttonState[NUM_OF_BUTTONS];
+ 
+// timer for button reports
+static Timer buttonTimer;
+ 
+// initialize the button inputs
+void initButtons()
+{
+    // create the digital inputs
+    for (int i = 0 ; i < countof(buttonDigIn) ; i++)
+    {
+        if (i < countof(buttonMap) && buttonMap[i] != NC)
+            buttonDigIn[i] = new DigitalIn(buttonMap[i]);
+        else
+            buttonDigIn[i] = 0;
+    }
+    
+    // start the button timer
+    buttonTimer.start();
+}
+ 
+ 
+// read the button input state
+uint32_t readButtons()
+{
+    // start with all buttons off
+    uint32_t buttons = 0;
+    
+    // figure the time elapsed since the last scan
+    int dt = buttonTimer.read_ms();
+    
+    // reset the timef for the next scan
+    buttonTimer.reset();
+    
+    // scan the button list
+    uint32_t bit = 1;
+    DigitalIn **di = buttonDigIn;
+    ButtonState *bs = buttonState;
+    for (int i = 0 ; i < countof(buttonDigIn) ; i++, di++, bs++, bit <<= 1)
+    {
+        // read this button
+        if (*di != 0)
+        {
+            // deduct the elapsed time since the last update
+            // from the button's remaining sticky time
+            bs->bt -= dt;
+            if (bs->bt < 0)
+                bs->bt = 0;
+            
+            // If the sticky time has elapsed, note the new physical
+            // state of the button.  If we still have sticky time
+            // remaining, ignore the physical state; the last state
+            // change persists until the sticky time elapses so that
+            // we smooth out any "bounce" (electrical transients that
+            // occur when the switch contact is opened or closed).
+            if (bs->bt == 0)
+            {
+                // get the new physical state
+                int pressed = !(*di)->read();
+                
+                // update the button's logical state if this is a change
+                if (pressed != bs->pressed)
+                {
+                    // store the new state
+                    bs->pressed = pressed;
+                    
+                    // start a new sticky period for debouncing this
+                    // state change
+                    bs->bt = 10;
+                }
+            }
+            
+            // if it's pressed, OR its bit into the state
+            if (bs->pressed)
+                buttons |= bit;
+            pc.printf("Buttons: %d\n", buttons);
+        }
+    }
+    
+    // return the new button list
+    return buttons;
+}
+ 
+// hat state
+struct HatState
+{
+    // current on/off state
+    int pressed;
+    
+    // Sticky time remaining for current state.  When a
+    // state transition occurs, we set this to a debounce
+    // period.  Future state transitions will be ignored
+    // until the debounce time elapses.
+    int ht;
+} hatState[NUM_OF_HAT_BUTTONS];
+ 
+// timer for hat reports
+static Timer hatTimer;
+ 
+// initialize the hat inputs
+void initHat()
+{
+    // create the digital inputs
+    for (int i = 0 ; i <= countof(hatDigIn) ; i++)
+    {
+        if (i < countof(hatMap) && hatMap[i] != NC)
+            hatDigIn[i] = new DigitalIn(hatMap[i]);
+        else
+            hatDigIn[i] = 0;
+    }
+    
+    // start the hat timer
+    hatTimer.start();
+}
+ 
+// read the hat button input state
+uint8_t readHat()
+{
+    // start with all buttons off
+    uint8_t hat = 0;
+    
+    // figure the time elapsed since the last scan
+    int dt = hatTimer.read_ms();
+    
+    // reset the time for the next scan
+    hatTimer.reset();
+    
+    // scan the button list
+    uint8_t bit = 1;
+    DigitalIn **di = hatDigIn;
+    HatState *hs = hatState;
+    for (int i = 0 ; i < countof(hatDigIn) ; i++, di++, hs++)
+    {
+        // read this button
+        if (*di != 0)
+        {
+            // deduct the elapsed time since the last update
+            // from the button's remaining sticky time
+            hs->ht -= dt;
+            if (hs->ht < 0)
+                hs->ht = 0;
+            
+            // If the sticky time has elapsed, note the new physical
+            // state of the button.  If we still have sticky time
+            // remaining, ignore the physical state; the last state
+            // change persists until the sticky time elapses so that
+            // we smooth out any "bounce" (electrical transients that
+            // occur when the switch contact is opened or closed).
+            if (hs->ht == 0)
+            {
+                // get the new physical state
+                int pressed = !(*di)->read();
+                
+                // update the button's logical state if this is a change
+                if (pressed != hs->pressed)
+                {
+                    // store the new state
+                    hs->pressed = pressed;
+                    
+                    // start a new sticky period for debouncing this
+                    // state change
+                    hs->ht = 10;
+                }
+            }
+            
+            // if it's pressed, OR its bit into the state
+            if (hs->pressed)
+                hat |= bit;
+            pc.printf("Hat: %d\n", hat);
+        }
+        bit <<= 1;
+    }
+    
+    // translate values read to descriptor values
+#if HAT4 && !HAT4_8
+    if (hat == 0x01)                // 00000001
+        hat = JOY_HAT_UP;           // 0
+    else if (hat == 0x02)           // 00000010
+        hat = JOY_HAT_RIGHT;        // 1
+    else if (hat == 0x04)           // 00000100
+        hat = JOY_HAT_DOWN;         // 2
+    else if (hat == 0x08)           // 00001000
+        hat = JOY_HAT_LEFT;         // 3
+    else   
+        hat = JOY_HAT_NEUTRAL;      // 4
+#endif
+#if HAT4 && HAT4_8
+    if (hat == 0x01)                // 00000001
+        hat = JOY_HAT_UP;           // 0
+    else if (hat == 0x03)           // 00000011
+        hat = JOY_HAT_UP_RIGHT;     // 1
+    else if (hat == 0x02)           // 00000010
+        hat = JOY_HAT_RIGHT;        // 2
+    else if (hat == 0x06)           // 00000110
+        hat = JOY_HAT_DOWN_RIGHT;   // 3
+    else if (hat == 0x04)           // 00000100
+        hat = JOY_HAT_DOWN;         // 4
+    else if (hat == 0x0C)           // 00001100
+        hat = JOY_HAT_DOWN_LEFT;    // 5
+    else if (hat == 0x08)           // 00001000
+        hat = JOY_HAT_LEFT;         // 6
+    else if (hat == 0x09)           // 00001001
+        hat = JOY_HAT_UP_LEFT;      // 7
+    else
+        hat = JOY_HAT_NEUTRAL;      // 8
+#endif
+#if HAT8
+    if (hat == 0x01)                // 00000001
+        hat = JOY_HAT_UP;           // 0
+    else if (hat == 0x02)           // 00000010
+        hat = JOY_HAT_UP_RIGHT;     // 1
+    else if (hat == 0x04)           // 00000100
+        hat = JOY_HAT_RIGHT;        // 2
+    else if (hat == 0x08)           // 00001000
+        hat = JOY_HAT_DOWN_RIGHT;   // 3
+    else if (hat == 0x10)           // 00010000
+        hat = JOY_HAT_DOWN;         // 4
+    else if (hat == 0x20)           // 00100000
+        hat = JOY_HAT_DOWN_LEFT;    // 5
+    else if (hat == 0x40)           // 01000000
+        hat = JOY_HAT_LEFT;         // 6
+    else if (hat == 0x80)           // 10000000
+        hat = JOY_HAT_UP_LEFT;      // 7
+    else
+        hat = JOY_HAT_NEUTRAL;      // 8
+#endif
+    
+    // return the new button list
+    pc.printf("Return Hat: %d", hat);
+    return hat;
+}
+ 
+int main()
+{
+    uint16_t x = 0;
+    uint16_t y = 0;
+    uint16_t breaks = 0;
+    uint16_t flaps = 0;
+    uint16_t rudder = 0;
+    uint16_t throttle = 0;
+    uint8_t hat = 0;
+    uint32_t buttons = 0;
+    
+ 
+//    const int16_t l = 32767;
+    const uint16_t m = 65535;
+ 
+    pc.printf("Hello World from Joystick!\n\r");
+ 
+    initButtons();
+    initHat();
+    
+    heartbeat_start();
+ 
+    pc.printf("x, y, breaks, flaps, rudder, throttle, hat, buttons\n\n\r");
+ 
+    while (1) {
+ 
+        x = inX.read() * m;
+        y = inY.read() * m;
+        breaks = inBreaks.read() * m;
+        flaps = inFlaps.read() * m;
+        rudder = inRudder.read() * m;
+        throttle = inThrottle.read() * m;
+        hat = readHat();
+        buttons = readButtons();
+        
+        pc.printf("%d, %d, %d, %d, %d, %d, %d, %d\n\r", x, y, breaks, flaps, rudder, throttle, hat, buttons);
+ 
+        joystick.update(x, y, breaks, flaps, rudder, throttle, hat, buttons);
+        wait(0.01);
+    }
+ 
+    //pc.printf("Bye World!\n\r");
+}
\ No newline at end of file