add support for hid gamepad interface
add documentation for HID joystick Add joystick_task to read analog axes values even when no key is pressed or release. update doc Update docs/feature_joystick.md Manage pin setup and read to maintain matrix scan after analog read
This commit is contained in:
		
							parent
							
								
									d8f3c28a37
								
							
						
					
					
						commit
						3cf7611139
					
				
					 15 changed files with 675 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -26,6 +26,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#include "debug.h"
 | 
			
		||||
#include "host_driver.h"
 | 
			
		||||
#include "vusb.h"
 | 
			
		||||
#include "joystick.h"
 | 
			
		||||
#include "joystick.h"
 | 
			
		||||
#include <util/delay.h>
 | 
			
		||||
 | 
			
		||||
static uint8_t vusb_keyboard_leds = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -79,6 +81,7 @@ static void    send_keyboard(report_keyboard_t *report);
 | 
			
		|||
static void    send_mouse(report_mouse_t *report);
 | 
			
		||||
static void    send_system(uint16_t data);
 | 
			
		||||
static void    send_consumer(uint16_t data);
 | 
			
		||||
static void    send_joystick(void);
 | 
			
		||||
 | 
			
		||||
static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -139,6 +142,68 @@ static void send_consumer(uint16_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    uint8_t report_id;
 | 
			
		||||
 | 
			
		||||
    #if JOYSTICK_AXES_COUNT>0
 | 
			
		||||
    int8_t  axes[JOYSTICK_AXES_COUNT];
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if JOYSTICK_BUTTON_COUNT>0
 | 
			
		||||
    uint8_t buttons[(JOYSTICK_BUTTON_COUNT-1)/8+1];
 | 
			
		||||
    #endif
 | 
			
		||||
} __attribute__ ((packed)) vusb_joystick_report_t;
 | 
			
		||||
 | 
			
		||||
void send_joystick_packet(joystick_t* status)
 | 
			
		||||
{
 | 
			
		||||
    vusb_joystick_report_t r = {
 | 
			
		||||
        .report_id = 0x4,
 | 
			
		||||
 | 
			
		||||
        #if JOYSTICK_AXES_COUNT>0
 | 
			
		||||
        .axes = {
 | 
			
		||||
            status->axes[0]
 | 
			
		||||
 | 
			
		||||
          #if JOYSTICK_AXES_COUNT >= 2
 | 
			
		||||
            ,status->axes[1]
 | 
			
		||||
          #endif
 | 
			
		||||
          #if JOYSTICK_AXES_COUNT >= 3
 | 
			
		||||
            ,status->axes[2]
 | 
			
		||||
          #endif
 | 
			
		||||
          #if JOYSTICK_AXES_COUNT >= 4
 | 
			
		||||
            ,status->axes[3]
 | 
			
		||||
          #endif
 | 
			
		||||
          #if JOYSTICK_AXES_COUNT >= 5
 | 
			
		||||
            ,status->axes[4]
 | 
			
		||||
          #endif
 | 
			
		||||
          #if JOYSTICK_AXES_COUNT >= 6
 | 
			
		||||
            ,status->axes[5]
 | 
			
		||||
          #endif
 | 
			
		||||
        },
 | 
			
		||||
        #endif //JOYSTICK_AXES_COUNT>0
 | 
			
		||||
 | 
			
		||||
        #if JOYSTICK_BUTTON_COUNT>0
 | 
			
		||||
        .buttons = {
 | 
			
		||||
            status->buttons[0]
 | 
			
		||||
 | 
			
		||||
          #if JOYSTICK_BUTTON_COUNT>8
 | 
			
		||||
            ,status->buttons[1]
 | 
			
		||||
          #endif
 | 
			
		||||
          #if JOYSTICK_BUTTON_COUNT>16
 | 
			
		||||
            ,status->buttons[2]
 | 
			
		||||
          #endif
 | 
			
		||||
          #if JOYSTICK_BUTTON_COUNT>24
 | 
			
		||||
            ,status->buttons[3]
 | 
			
		||||
          #endif
 | 
			
		||||
        }
 | 
			
		||||
        #endif //JOYSTICK_BUTTON_COUNT>0
 | 
			
		||||
    };
 | 
			
		||||
    if (usbInterruptIsReady3()) {
 | 
			
		||||
        usbSetInterrupt3((void *)&r, sizeof(vusb_joystick_report_t));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*------------------------------------------------------------------*
 | 
			
		||||
 * Request from host                                                *
 | 
			
		||||
 *------------------------------------------------------------------*/
 | 
			
		||||
| 
						 | 
				
			
			@ -251,7 +316,7 @@ const PROGMEM uchar keyboard_hid_report[] = {
 | 
			
		|||
    0xC0         // End Collection
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
 | 
			
		||||
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) || defined(JOYSTICK_ENABLE)
 | 
			
		||||
const PROGMEM uchar mouse_extra_hid_report[] = {
 | 
			
		||||
#    ifdef MOUSE_ENABLE
 | 
			
		||||
    // Mouse report descriptor
 | 
			
		||||
| 
						 | 
				
			
			@ -332,6 +397,47 @@ const PROGMEM uchar mouse_extra_hid_report[] = {
 | 
			
		|||
    0x81, 0x00,                //   Input (Data, Array, Absolute)
 | 
			
		||||
    0xC0                       // End Collection
 | 
			
		||||
#    endif
 | 
			
		||||
#if JOYSTICK_ENABLE
 | 
			
		||||
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop)
 | 
			
		||||
    0x09, 0x04,     // USAGE (Joystick)
 | 
			
		||||
    0xa1, 0x01,     // COLLECTION (Application)
 | 
			
		||||
    0x85, 0x4,      //   REPORT_ID (4)
 | 
			
		||||
    0x09, 0x01,     //   USAGE (Pointer)
 | 
			
		||||
    0xa1, 0x00,     //   COLLECTION (Physical)
 | 
			
		||||
  #if JOYSTICK_AXES_COUNT >= 1
 | 
			
		||||
    0x09, 0x30,     //     USAGE (X)
 | 
			
		||||
  #endif
 | 
			
		||||
  #if JOYSTICK_AXES_COUNT >= 2
 | 
			
		||||
    0x09, 0x31,     //     USAGE (Y)
 | 
			
		||||
  #endif
 | 
			
		||||
  #if JOYSTICK_AXES_COUNT >= 3
 | 
			
		||||
    0x09, 0x32,     //     USAGE (Z)
 | 
			
		||||
  #endif
 | 
			
		||||
  #if JOYSTICK_AXES_COUNT >= 4
 | 
			
		||||
    0x09, 0x33,     //     USAGE (RX)
 | 
			
		||||
  #endif
 | 
			
		||||
  #if JOYSTICK_AXES_COUNT >= 5
 | 
			
		||||
    0x09, 0x34,     //     USAGE (RY)
 | 
			
		||||
  #endif
 | 
			
		||||
  #if JOYSTICK_AXES_COUNT >= 6
 | 
			
		||||
    0x09, 0x35,     //     USAGE (RZ)
 | 
			
		||||
  #endif
 | 
			
		||||
    0x15, 0x81,     //   LOGICAL_MINIMUM (-127)
 | 
			
		||||
    0x25, 0x7f,     //   LOGICAL_MAXIMUM (127)
 | 
			
		||||
    0x75, 0x08,     //   REPORT_SIZE (8)
 | 
			
		||||
    0x95, JOYSTICK_AXES_COUNT,     //   REPORT_COUNT (JOYSTICK_AXES_COUNT)
 | 
			
		||||
    0x81, 0x02,     //   INPUT (Data,Var,Abs)
 | 
			
		||||
    0xc0,           // END_COLLECTION
 | 
			
		||||
    0x05, 0x09,     // USAGE_PAGE (Button)
 | 
			
		||||
    0x19, 0x01,     //   USAGE_MINIMUM (Button 1)
 | 
			
		||||
    0x29, JOYSTICK_BUTTON_COUNT,     //   USAGE_MAXIMUM
 | 
			
		||||
    0x15, 0x00,     //   LOGICAL_MINIMUM (0)
 | 
			
		||||
    0x25, 0x01,     //   LOGICAL_MAXIMUM (1)
 | 
			
		||||
    0x75, 0x01,     // REPORT_SIZE (1)
 | 
			
		||||
    0x95, JOYSTICK_BUTTON_COUNT,     // REPORT_COUNT
 | 
			
		||||
    0x81, 0x02,     // INPUT (Data,Var,Abs)
 | 
			
		||||
    0xc0 // END_COLLECTION
 | 
			
		||||
#endif //GAMEPAD_ENABLE
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue