WIP conversion from HID to PID

Dependents:   USBJoystick_HelloWorld2_wip

Fork of USBJoystick by Wim Huiskamp

Revision:
1:7f1e68e6da0c
Parent:
0:e086541742c3
--- a/USBJoystick.h	Thu Jan 05 14:22:02 2017 +0000
+++ b/USBJoystick.h	Sat Jul 07 10:46:53 2018 +0000
@@ -2,7 +2,7 @@
  * 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 
+ *               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
@@ -26,47 +26,53 @@
 #ifndef USBJOYSTICK_H
 #define USBJOYSTICK_H
 
-#include "USBHID.h"
+#include "USBPID.h"
 
 #define REPORT_ID_JOYSTICK  4
 
 //Configure Joystick
-#define HAT4      0
-#define HAT8      1
 
+//Number of Hat Buttons
+#define HAT4      1
+#define HAT8      0
+
+//Number of Buttons
 #define BUTTONS4  0
 #define BUTTONS8  0
 #define BUTTONS32 1
 
+//Force Feedback
+#define FFB       1
+
 
 /* Common usage */
 enum JOY_BUTTON {
-     JOY_B0 = 1,
-     JOY_B1 = 2,
-     JOY_B2 = 4,
-     JOY_B3 = 8,     
+    JOY_B0 = 1,
+    JOY_B1 = 2,
+    JOY_B2 = 4,
+    JOY_B3 = 8,
 };
 
 #if (HAT4 == 1)
 enum JOY_HAT {
-     JOY_HAT_UP      = 0,
-     JOY_HAT_RIGHT   = 1,
-     JOY_HAT_DOWN    = 2,
-     JOY_HAT_LEFT    = 3,     
-     JOY_HAT_NEUTRAL = 4,          
+    JOY_HAT_UP      = 0,
+    JOY_HAT_RIGHT   = 1,
+    JOY_HAT_DOWN    = 2,
+    JOY_HAT_LEFT    = 3,
+    JOY_HAT_NEUTRAL = 4,
 };
 #endif
 #if (HAT8 == 1)
 enum JOY_HAT {
-     JOY_HAT_UP         = 0,     
-     JOY_HAT_UP_RIGHT   = 1,
-     JOY_HAT_RIGHT      = 2,
-     JOY_HAT_RIGHT_DOWN = 3,
-     JOY_HAT_DOWN       = 4,
-     JOY_HAT_DOWN_LEFT  = 5,     
-     JOY_HAT_LEFT       = 6,     
-     JOY_HAT_LEFT_UP    = 7,          
-     JOY_HAT_NEUTRAL    = 8,          
+    JOY_HAT_UP         = 0,
+    JOY_HAT_UP_RIGHT   = 1,
+    JOY_HAT_RIGHT      = 2,
+    JOY_HAT_RIGHT_DOWN = 3,
+    JOY_HAT_DOWN       = 4,
+    JOY_HAT_DOWN_LEFT  = 5,
+    JOY_HAT_LEFT       = 6,
+    JOY_HAT_LEFT_UP    = 7,
+    JOY_HAT_NEUTRAL    = 8,
 };
 #endif
 
@@ -76,9 +82,17 @@
 #define JX_MIN_ABS    (-127)     /*!< The maximum value that we can move to the left on the x-axis */
 #define JY_MIN_ABS    (-127)     /*!< The maximum value that we can move up on the y-axis */
 #define JT_MIN_ABS    (-127)     /*!< The minimum value for the throttle */
+#define JR_MIN_ABS    (-127)     /*!< The minimum value for the rudder */
+#define JF_MIN_ABS    (-127)     /*!< The minimum value for the flaps */
+#define JB_MIN_ABS    (-127)     /*!< The minimum value for the breaks */
+#define JB_MIN_ABS    (-127)     /*!< The minimum value for the gear */
 #define JX_MAX_ABS    (127)      /*!< The maximum value that we can move to the right on the x-axis */
 #define JY_MAX_ABS    (127)      /*!< The maximum value that we can move down on the y-axis */
 #define JT_MAX_ABS    (127)      /*!< The maximum value for the throttle */
+#define JR_MAX_ABS    (127)      /*!< The maximum value for the rudder */
+#define JF_MAX_ABS    (127)      /*!< The maximum value for the flaps */
+#define JB_MAX_ABS    (127)      /*!< The maximum value for the breaks */
+#define JB_MAX_ABS    (127)      /*!< The maximum value for the gear */
 
 /**
  *
@@ -110,25 +124,25 @@
  * int main(void) {
  *   uint16_t i = 0;
  *   int16_t throttle = 0;
- *   int16_t rudder = 0;    
+ *   int16_t rudder = 0;
  *   int16_t x = 0;
  *   int16_t y = 0;
  *   int32_t radius = 120;
  *   int32_t angle = 0;
- *   uint32_t buttons = 0;    
- *   uint8_t  hat = 0;    
- *   
+ *   uint32_t buttons = 0;
+ *   uint8_t  hat = 0;
+ *
  *   while (1) {
  *       // Basic Joystick
  *       throttle = (i >> 8) & 0xFF; // value -127 .. 128
- *       rudder   = (i >> 8) & 0xFF; // value -127 .. 128        
- *       buttons  = (i >> 8) & 0x0F; // value    0 .. 15, one bit per button     
- *       hat      = (i >> 8) & 0x07; // value    0 .. 7 or 8 for neutral         
- *       i++;        
- *       
+ *       rudder   = (i >> 8) & 0xFF; // value -127 .. 128
+ *       buttons  = (i >> 8) & 0x0F; // value    0 .. 15, one bit per button
+ *       hat      = (i >> 8) & 0x07; // value    0 .. 7 or 8 for neutral
+ *       i++;
+ *
  *       x = cos((double)angle*3.14/180.0)*radius;  // value -127 .. 128
  *       y = sin((double)angle*3.14/180.0)*radius;  // value -127 .. 128
- *       angle += 3;        
+ *       angle += 3;
  *
  *       joystick.update(throttle, rudder, x, y, buttons, hat);
  *
@@ -139,101 +153,148 @@
  */
 
 
-class USBJoystick: public USBHID {
-   public:
+class USBJoystick: public USBPID
+{
+public:
 
-   /**
-     *   Constructor
-     *
-     * @param vendor_id Your vendor_id (default: 0x1234)
-     * @param product_id Your product_id (default: 0x0002)
-     * @param product_release Your product_release (default: 0x0001)
-     */
+    /**
+      *   Constructor
+      *
+      * @param vendor_id Your vendor_id (default: 0x1234)
+      * @param product_id Your product_id (default: 0x0002)
+      * @param product_release Your product_release (default: 0x0001)
+      */
 //     USBJoystick(uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0100, uint16_t product_release = 0x0001, int waitForConnect = true):    // 4 buttons, no padding on buttons
 //     USBJoystick(uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0500, uint16_t product_release = 0x0001, int waitForConnect = true):    // 8 buttons, no padding on buttons
-     USBJoystick(uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0600, uint16_t product_release = 0x0001, int waitForConnect = true):    // 32 buttons, no padding on buttons
-       USBHID(0, 0, vendor_id, product_id, product_release, false) {
-         _init();
-         connect(waitForConnect);
-     };
-         
-     /**
-       * Write state of the joystick
-       *
-       * @param t throttle position
-       * @param r rudder position         
-       * @param x x-axis position
-       * @param y y-axis position
-       * @param buttons buttons state
-       * @param hat hat state 0 (up), 1 (right, 2 (down), 3 (left) or 4 (neutral)
-       * @returns true if there is no error, false otherwise
-       */
-     bool update(int16_t t, int16_t r, int16_t x, int16_t y, uint32_t buttons, uint8_t hat);
+//     USBJoystick(uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0600, uint16_t product_release = 0x0001, int waitForConnect = true):    // 32 buttons, no padding on buttons
+    USBJoystick(uint16_t vendor_id = 0x1209, uint16_t product_id = 0x0601, uint16_t product_release = 0x0101, int waitForConnect = true):    // 32 buttons, no padding on buttons, plus Gear, Flaps and Breaks
+        USBPID(0, 0, vendor_id, product_id, product_release, false) {
+        _init();
+        connect(waitForConnect);
+    };
+
+    /**
+      * Write state of the joystick
+      *
+      * @param t throttle position
+      * @param r rudder position
+      * @param f flaps position
+      * @param b breaks position
+      * @param x x-axis position
+      * @param y y-axis position
+      * @param buttons buttons state
+      * @param hat hat state 0 (up), 1 (right, 2 (down), 3 (left) or 4 (neutral)
+      * @param 
+      * @returns true if there is no error, false otherwise
+      */
+    bool update(int16_t t, int16_t r, int16_t f, int16_t b, int16_t x, int16_t y, uint32_t buttons, uint8_t hat);
+
+    /**
+      * Write state of the joystick
+      *
+      * @returns true if there is no error, false otherwise
+      */
+    bool update();
 
-     /**
-       * Write state of the joystick
-       *
-       * @returns true if there is no error, false otherwise
-       */
-     bool update();
+    /**
+      * Move the throttle position
+      *
+      * @param t throttle position
+      * @returns true if there is no error, false otherwise
+      */
+    bool throttle(int16_t t);
+
+    /**
+      * Move the rudder position
+      *
+      * @param r rudder position
+      * @returns true if there is no error, false otherwise
+      */
+    bool rudder(int16_t r);
 
-     /**
-       * Move the throttle position
-       *
-       * @param t throttle position
-       * @returns true if there is no error, false otherwise
-       */
-     bool throttle(int16_t t);
-         
-     /**
-       * Move the rudder position
-       *
-       * @param r rudder position
-       * @returns true if there is no error, false otherwise
-       */        
-     bool rudder(int16_t r);         
+    /**
+    * Move the flaps position
+    *
+    * @param f flaps position
+    * @returns true if there is no error, false otherwise
+    */
+    bool flaps(int16_t r);
+
+    /**
+      * Move the breaks position
+      *
+      * @param b breaks position
+      * @returns true if there is no error, false otherwise
+      */
+    bool breaks(int16_t b);
 
-     /**
-       * Move the cursor to (x, y)
-       *
-       * @param x-axis position
-       * @param y-axis position
-       * @returns true if there is no error, false otherwise
-       */
-     bool move(int16_t x, int16_t y);
-         
-     /**
-       * Press one or several buttons
-       *
-       * @param buttons buttons state
-       * @returns true if there is no error, false otherwise
-       */
-     bool buttons(uint32_t buttons);
-         
-     /**
-       * Press hat
-       *
-       * @param hat hat state
-       * @returns true if there is no error, false otherwise
-       */
-     bool hat(uint8_t hat);
-         
-     /**
-       * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
-       *
-       * @returns pointer to the report descriptor
-       */
-       virtual uint8_t * reportDesc();
+    /**
+      * Move the cursor to (x, y)
+      *
+      * @param x-axis position
+      * @param y-axis position
+      * @returns true if there is no error, false otherwise
+      */
+    bool move(int16_t x, int16_t y);
+
+    /**
+      * Press one or several buttons
+      *
+      * @param buttons buttons state
+      * @returns true if there is no error, false otherwise
+      */
+    bool buttons(uint32_t buttons);
+
+    /**
+      * Press hat
+      *
+      * @param hat hat state
+      * @returns true if there is no error, false otherwise
+      */
+    bool hat(uint8_t hat);
+
+
+    /**
+      * To define the interface descriptor string.
+      *
+      * @returns pointer to the interface descriptor string
+      */
+//      virtual uint8_t * stringIinterfaceDesc();
 
-   private:
-     int8_t _t;     
-     int8_t _r;              
-     int8_t _x;                       
-     int8_t _y;     
-     uint32_t _buttons;
-     uint8_t _hat; 
-         
-     void _init();                 
+    /**
+      * To define the product descriptor string.
+      *
+      * @returns pointer to the product descriptor string
+      */
+//      virtual uint8_t * stringIproductDesc();
+
+    /**
+      * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
+      *
+      * @returns pointer to the report descriptor
+      */
+    virtual uint8_t * reportDesc();
+
+    /*
+    * Called when a data is received on the OUT endpoint. Useful to switch on LED of LOCK keys
+    *
+    * @returns if handle by subclass, return true
+    */
+    virtual bool EPINT_OUT_callback();
+
+private:
+    int8_t _t;
+    int8_t _r;
+    int8_t _f;
+    int8_t _b;
+    int8_t _g;
+    int8_t _x;
+    int8_t _y;
+    uint32_t _buttons;
+    uint8_t _hat;
+
+    void _init();
+
 };
 
 #endif
\ No newline at end of file