@ -27,7 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "host_driver.h"
# include "vusb.h"
# include "joystick.h"
# include "joystick.h"
# include <util/delay.h>
static uint8_t vusb_keyboard_leds = 0 ;
@ -144,64 +143,67 @@ static void send_consumer(uint16_t data) {
typedef struct {
uint8_t report_id ;
# if JOYSTICK_AXES_COUNT>0
# if JOYSTICK_AXES_COUNT > 0
int8_t axes [ JOYSTICK_AXES_COUNT ] ;
# endif
# endif
# if JOYSTICK_BUTTON_COUNT>0
uint8_t buttons [ ( JOYSTICK_BUTTON_COUNT - 1 ) / 8 + 1 ] ;
# endif
} __attribute__ ( ( packed ) ) vusb_joystick_report_t ;
# 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 )
{
void send_joystick_packet ( joystick_t * status ) {
vusb_joystick_report_t r = {
. report_id = REPORT_ID_JOYSTICK ,
# 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
# 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_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
# endif // JOYSTICK_BUTTON_COUNT>0
} ;
if ( usbInterruptIsReady3 ( ) ) {
usbSetInterrupt3 ( ( void * ) & r , sizeof ( vusb_joystick_report_t ) ) ;
}
}
/*------------------------------------------------------------------*
* Request from host *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
@ -395,39 +397,40 @@ 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)
# if JOYSTICK_ENABLE
0x05 ,
0x01 , // USAGE_PAGE (Generic Desktop)
0x09 , 0x04 , // USAGE (Joystick)
0xa1 , 0x01 , // COLLECTION (Application)
0x85 , REPORT_ID_JOYSTICK , // REPORT_ID (6)
0x09 , 0x01 , // USAGE (Pointer)
0xa1 , 0x00 , // COLLECTION (Physical)
# if JOYSTICK_AXES_COUNT > 0
# if JOYSTICK_AXES_COUNT >= 1
# if JOYSTICK_AXES_COUNT > 0
# if JOYSTICK_AXES_COUNT >= 1
0x09 , 0x30 , // USAGE (X)
# endif
# if JOYSTICK_AXES_COUNT >= 2
# endif
# if JOYSTICK_AXES_COUNT >= 2
0x09 , 0x31 , // USAGE (Y)
# endif
# if JOYSTICK_AXES_COUNT >= 3
# endif
# if JOYSTICK_AXES_COUNT >= 3
0x09 , 0x32 , // USAGE (Z)
# endif
# if JOYSTICK_AXES_COUNT >= 4
# endif
# if JOYSTICK_AXES_COUNT >= 4
0x09 , 0x33 , // USAGE (RX)
# endif
# if JOYSTICK_AXES_COUNT >= 5
# endif
# if JOYSTICK_AXES_COUNT >= 5
0x09 , 0x34 , // USAGE (RY)
# endif
# if JOYSTICK_AXES_COUNT >= 6
# endif
# if JOYSTICK_AXES_COUNT >= 6
0x09 , 0x35 , // USAGE (RZ)
# endif
# 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)
# endif
# if JOYSTICK_BUTTON_COUNT> 0
# endif
# if JOYSTICK_BUTTON_COUNT > 0
0x05 , 0x09 , // USAGE_PAGE (Button)
0x19 , 0x01 , // USAGE_MINIMUM (Button 1)
0x29 , JOYSTICK_BUTTON_COUNT , // USAGE_MAXIMUM
@ -436,16 +439,16 @@ const PROGMEM uchar mouse_extra_hid_report[] = {
0x75 , 0x01 , // REPORT_SIZE (1)
0x95 , JOYSTICK_BUTTON_COUNT , // REPORT_COUNT
0x81 , 0x02 , // INPUT (Data,Var,Abs)
//fill up report to get it byte-aligned
# if (JOYSTICK_BUTTON_COUNT % 8) != 0
// fill up report to get it byte-aligned
# if (JOYSTICK_BUTTON_COUNT % 8) != 0
0x75 , 0x01 , // REPORT_SIZE (1)
0x95 , 8 - ( JOYSTICK_BUTTON_COUNT % 8 ) , // REPORT_COUNT
0x81 , 0x01 , // INPUT (Data,Var,Abs)
# endif
# endif
# endif
# endif
0xc0 , // END_COLLECTION
0xc0 // END_COLLECTION
# endif //JOYSTICK_ENABLE
# endif // JOYSTICK_ENABLE
} ;
# endif
@ -468,19 +471,19 @@ const PROGMEM char usbDescriptorConfiguration[] = {
/* USB configuration descriptor */
9 , /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
USBDESCR_CONFIG , /* descriptor type */
# if defined (MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
59 , // 9 + (9 + 9 + 7) + (9 + 9 + 7)
# else
# else
34 , // 9 + (9 + 9 + 7)
# endif
0 ,
// 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 + 9, 0,
/* total length of data returned (including inlined descriptors) */
// 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 + 9, 0,
/* total length of data returned (including inlined descriptors) */
# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
2 , /* number of interfaces in this configuration */
# else
1 ,
# endif
# endif
1 , /* index of this configuration */
0 , /* configuration name string index */
# if USB_CFG_IS_SELF_POWERED