git.y1.nz

SameBoy

Accurate GB/GBC emulator
download: https://git.y1.nz/archives/sameboy.tar.gz
README | Files | Log | Refs | LICENSE

JoyKit/ControllerConfiguration.inc

      1 #define BUTTON(x) @(JOYButtonUsageGeneric0 + (x))
      2 #define AXIS(x) @(JOYAxisUsageGeneric0 + (x))
      3 #define AXES2D(x) @(JOYAxes2DUsageGeneric0 + (x))
      4 
      5 hacksByManufacturer = @{
      6     @(0x045E): @{ // Microsoft
      7             
      8         JOYAxisGroups: @{
      9               @(kHIDUsage_GD_X): @(0),
     10               @(kHIDUsage_GD_Y): @(0),
     11               @(kHIDUsage_GD_Z): @(2),
     12               @(kHIDUsage_GD_Rx): @(1),
     13               @(kHIDUsage_GD_Ry): @(1),
     14               @(kHIDUsage_GD_Rz): @(2),
     15         },
     16         
     17         JOYButtonUsageMapping: @{
     18               BUTTON(1): @(JOYButtonUsageA),
     19               BUTTON(2): @(JOYButtonUsageB),
     20               BUTTON(3): @(JOYButtonUsageX),
     21               BUTTON(4): @(JOYButtonUsageY),
     22               BUTTON(5): @(JOYButtonUsageL1),
     23               BUTTON(6): @(JOYButtonUsageR1),
     24               BUTTON(7): @(JOYButtonUsageLStick),
     25               BUTTON(8): @(JOYButtonUsageRStick),
     26               BUTTON(9): @(JOYButtonUsageStart),
     27               BUTTON(10): @(JOYButtonUsageSelect),
     28               BUTTON(11): @(JOYButtonUsageHome),
     29          },
     30         
     31          JOYAxisUsageMapping: @{
     32              AXIS(3): @(JOYAxisUsageL1),
     33              AXIS(6): @(JOYAxisUsageR1),
     34          },
     35          
     36          JOYAxes2DUsageMapping: @{
     37              AXES2D(1): @(JOYAxes2DUsageLeftStick),
     38              AXES2D(3): @(JOYAxes2DUsageRightStick),
     39          },
     40          
     41          JOYEmulateAxisButtons: @YES,
     42     },
     43     
     44     @(0x054C): @{ // Sony
     45         /* Generally untested, but should work */
     46             
     47         JOYAxisGroups: @{
     48               @(kHIDUsage_GD_X): @(0),
     49               @(kHIDUsage_GD_Y): @(0),
     50               @(kHIDUsage_GD_Z): @(1),
     51               @(kHIDUsage_GD_Rx): @(2),
     52               @(kHIDUsage_GD_Ry): @(3),
     53               @(kHIDUsage_GD_Rz): @(1),
     54         },
     55         
     56         JOYButtonUsageMapping: @{
     57               BUTTON(1): @(JOYButtonUsageY),
     58               BUTTON(2): @(JOYButtonUsageB),
     59               BUTTON(3): @(JOYButtonUsageA),
     60               BUTTON(4): @(JOYButtonUsageX),
     61               BUTTON(5): @(JOYButtonUsageL1),
     62               BUTTON(6): @(JOYButtonUsageR1),
     63               BUTTON(7): @(JOYButtonUsageL2),
     64               BUTTON(8): @(JOYButtonUsageR2),
     65               BUTTON(9): @(JOYButtonUsageSelect),
     66               BUTTON(10): @(JOYButtonUsageStart),
     67               BUTTON(11): @(JOYButtonUsageLStick),
     68               BUTTON(12): @(JOYButtonUsageRStick),
     69               BUTTON(13): @(JOYButtonUsageHome),
     70               BUTTON(14): @(JOYButtonUsageMisc),
     71          },
     72         
     73          JOYAxisUsageMapping: @{
     74              AXIS(4): @(JOYAxisUsageL2),
     75              AXIS(5): @(JOYAxisUsageR2),
     76          },
     77          
     78          JOYAxes2DUsageMapping: @{
     79              AXES2D(1): @(JOYAxes2DUsageLeftStick),
     80              AXES2D(4): @(JOYAxes2DUsageRightStick),
     81          },
     82          
     83          // When DualSense mode is activated on BT, The report ID is 0x31 and there's an extra byte
     84          JOYCustomReports: @{
     85             @(0x31): @[
     86             /* 1D and 2D axes */
     87             @{@"reportID": @(0x31), @"size":@8, @"offset":@0x08, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_X), @"min": @0, @"max": @255},
     88             @{@"reportID": @(0x31), @"size":@8, @"offset":@0x10, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Y), @"min": @0, @"max": @255},
     89             @{@"reportID": @(0x31), @"size":@8, @"offset":@0x18, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Z), @"min": @0, @"max": @255},
     90             @{@"reportID": @(0x31), @"size":@8, @"offset":@0x20, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rz), @"min": @0, @"max": @255},
     91             @{@"reportID": @(0x31), @"size":@8, @"offset":@0x28, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rx), @"min": @0, @"max": @255},
     92             @{@"reportID": @(0x31), @"size":@8, @"offset":@0x30, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Ry), @"min": @0, @"max": @255},
     93             
     94             /* Hat Switch*/
     95             @{@"reportID": @(0x31), @"size":@4, @"offset":@0x40, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Hatswitch), @"min": @0, @"max": @7},
     96             
     97             /* Buttons */
     98             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x44, @"usagePage":@(kHIDPage_Button), @"usage":@1},
     99             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x45, @"usagePage":@(kHIDPage_Button), @"usage":@2},
    100             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x46, @"usagePage":@(kHIDPage_Button), @"usage":@3},
    101             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x47, @"usagePage":@(kHIDPage_Button), @"usage":@4},
    102             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x48, @"usagePage":@(kHIDPage_Button), @"usage":@5},
    103             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x49, @"usagePage":@(kHIDPage_Button), @"usage":@6},
    104             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x4A, @"usagePage":@(kHIDPage_Button), @"usage":@7},
    105             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x4B, @"usagePage":@(kHIDPage_Button), @"usage":@8},
    106             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x4C, @"usagePage":@(kHIDPage_Button), @"usage":@9},
    107             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x4D, @"usagePage":@(kHIDPage_Button), @"usage":@10},
    108             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x4E, @"usagePage":@(kHIDPage_Button), @"usage":@11},
    109             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x4F, @"usagePage":@(kHIDPage_Button), @"usage":@12},
    110             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x50, @"usagePage":@(kHIDPage_Button), @"usage":@13},
    111             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x51, @"usagePage":@(kHIDPage_Button), @"usage":@14},
    112             @{@"reportID": @(0x31), @"size":@1, @"offset":@0x52, @"usagePage":@(kHIDPage_Button), @"usage":@15},
    113             
    114             @{@"reportID": @(0x31), @"size":@16, @"offset":@0x80, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityXAxis)},
    115             @{@"reportID": @(0x31), @"size":@16, @"offset":@0x90, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityYAxis)},
    116             @{@"reportID": @(0x31), @"size":@16, @"offset":@0xA0, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityZAxis)},
    117             @{@"reportID": @(0x31), @"size":@16, @"offset":@0xB0, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisX)},
    118             @{@"reportID": @(0x31), @"size":@16, @"offset":@0xC0, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisY)},
    119             @{@"reportID": @(0x31), @"size":@16, @"offset":@0xD0, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisZ)},
    120             ],
    121             
    122             @(1): @[
    123                 @{@"reportID": @(1), @"size":@16, @"offset":@0x78, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityXAxis)},
    124                 @{@"reportID": @(1), @"size":@16, @"offset":@0x88, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityYAxis)},
    125                 @{@"reportID": @(1), @"size":@16, @"offset":@0x98, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityZAxis)},
    126                 @{@"reportID": @(1), @"size":@16, @"offset":@0xA8, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisX)},
    127                 @{@"reportID": @(1), @"size":@16, @"offset":@0xB8, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisY)},
    128                 @{@"reportID": @(1), @"size":@16, @"offset":@0xC8, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisZ)},
    129             ],
    130         },
    131          
    132          JOYIsSony: @YES,
    133     }
    134 };
    135 
    136 hacksByName = @{
    137     @"WUP-028": @{ // Nintendo GameCube Controller Adapter
    138         JOYReportIDFilters: @[@[@1], @[@2], @[@3], @[@4]],
    139         JOYButtonUsageMapping: @{
    140             BUTTON(1): @(JOYButtonUsageA),
    141             BUTTON(2): @(JOYButtonUsageB),
    142             BUTTON(3): @(JOYButtonUsageX),
    143             BUTTON(4): @(JOYButtonUsageY),
    144             BUTTON(5): @(JOYButtonUsageStart),
    145             BUTTON(6): @(JOYButtonUsageZ),
    146             BUTTON(7): @(JOYButtonUsageR1),
    147             BUTTON(8): @(JOYButtonUsageL1),
    148         },
    149         
    150         JOYAxisUsageMapping: @{
    151             AXIS(3): @(JOYAxisUsageL1),
    152             AXIS(6): @(JOYAxisUsageR1),
    153         },
    154         
    155         JOYAxes2DUsageMapping: @{
    156             AXES2D(1): @(JOYAxes2DUsageLeftStick),
    157             AXES2D(4): @(JOYAxes2DUsageRightStick),
    158         },
    159         
    160         JOYAxisGroups: @{
    161             @(kHIDUsage_GD_X): @(0),
    162             @(kHIDUsage_GD_Y): @(0),
    163             @(kHIDUsage_GD_Z): @(2),
    164             @(kHIDUsage_GD_Rx): @(1),
    165             @(kHIDUsage_GD_Ry): @(1),
    166             @(kHIDUsage_GD_Rz): @(3),
    167         },
    168         
    169         JOYRumbleUsage: @1,
    170         JOYRumbleUsagePage: @0xFF00,
    171         
    172         JOYConnectedUsage: @2,
    173         JOYConnectedUsagePage: @0xFF00,
    174         
    175         JOYActivationReport: [NSData dataWithBytes:&inline_const(uint8_t, 0x13) length:1],
    176 
    177         JOYCustomReports: @{
    178             
    179             // Rumble
    180             @(-17): @[
    181                 @{@"reportID": @(1), @"size":@1, @"offset":@0,  @"usagePage":@(0xFF00), @"usage":@1, @"min": @0, @"max": @1},
    182                 @{@"reportID": @(2), @"size":@1, @"offset":@8,  @"usagePage":@(0xFF00), @"usage":@1, @"min": @0, @"max": @1},
    183                 @{@"reportID": @(3), @"size":@1, @"offset":@16, @"usagePage":@(0xFF00), @"usage":@1, @"min": @0, @"max": @1},
    184                 @{@"reportID": @(4), @"size":@1, @"offset":@24, @"usagePage":@(0xFF00), @"usage":@1, @"min": @0, @"max": @1},
    185             ],
    186             
    187             @(33): @[
    188             
    189             // Player 1
    190             
    191             @{@"reportID": @(1), @"size":@1, @"offset":@4, @"usagePage":@(0xFF00), @"usage":@2, @"min": @0, @"max": @1},
    192                                         
    193             @{@"reportID": @(1), @"size":@1, @"offset":@8, @"usagePage":@(kHIDPage_Button), @"usage":@1},
    194             @{@"reportID": @(1), @"size":@1, @"offset":@9, @"usagePage":@(kHIDPage_Button), @"usage":@2},
    195             @{@"reportID": @(1), @"size":@1, @"offset":@10,@"usagePage":@(kHIDPage_Button), @"usage":@3},
    196             @{@"reportID": @(1), @"size":@1, @"offset":@11,@"usagePage":@(kHIDPage_Button), @"usage":@4},
    197                 
    198             @{@"reportID": @(1), @"size":@1, @"offset":@12, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadLeft)},
    199             @{@"reportID": @(1), @"size":@1, @"offset":@13, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadRight)},
    200             @{@"reportID": @(1), @"size":@1, @"offset":@14, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadDown)},
    201             @{@"reportID": @(1), @"size":@1, @"offset":@15, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadUp)},
    202             
    203             
    204             @{@"reportID": @(1), @"size":@1, @"offset":@16, @"usagePage":@(kHIDPage_Button), @"usage":@5},
    205             @{@"reportID": @(1), @"size":@1, @"offset":@17, @"usagePage":@(kHIDPage_Button), @"usage":@6},
    206             @{@"reportID": @(1), @"size":@1, @"offset":@18, @"usagePage":@(kHIDPage_Button), @"usage":@7},
    207             @{@"reportID": @(1), @"size":@1, @"offset":@19, @"usagePage":@(kHIDPage_Button), @"usage":@8},
    208             
    209             @{@"reportID": @(1), @"size":@8, @"offset":@24, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_X), @"min": @0, @"max": @255},
    210             @{@"reportID": @(1), @"size":@8, @"offset":@32, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Y), @"min": @255, @"max": @0},
    211 
    212             @{@"reportID": @(1), @"size":@8, @"offset":@40, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rx), @"min": @0, @"max": @255},
    213             @{@"reportID": @(1), @"size":@8, @"offset":@48, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Ry), @"min": @255, @"max": @0},
    214 
    215             @{@"reportID": @(1), @"size":@8, @"offset":@56, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Z), @"min": @0, @"max": @255},
    216             @{@"reportID": @(1), @"size":@8, @"offset":@64, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rz), @"min": @0, @"max": @255},
    217             
    218             // Player 2
    219             
    220             @{@"reportID": @(2), @"size":@1, @"offset":@(4 + 72), @"usagePage":@(0xFF00), @"usage":@2, @"min": @0, @"max": @1},
    221 
    222             
    223             @{@"reportID": @(2), @"size":@1, @"offset":@(8 + 72), @"usagePage":@(kHIDPage_Button), @"usage":@1},
    224             @{@"reportID": @(2), @"size":@1, @"offset":@(9 + 72), @"usagePage":@(kHIDPage_Button), @"usage":@2},
    225             @{@"reportID": @(2), @"size":@1, @"offset":@(10 + 72), @"usagePage":@(kHIDPage_Button), @"usage":@3},
    226             @{@"reportID": @(2), @"size":@1, @"offset":@(11 + 72), @"usagePage":@(kHIDPage_Button), @"usage":@4},
    227                 
    228             @{@"reportID": @(2), @"size":@1, @"offset":@(12 + 72),  @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadLeft)},
    229             @{@"reportID": @(2), @"size":@1, @"offset":@(13 + 72),  @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadRight)},
    230             @{@"reportID": @(2), @"size":@1, @"offset":@(14 + 72), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadDown)},
    231             @{@"reportID": @(2), @"size":@1, @"offset":@(15 + 72), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadUp)},
    232             
    233             
    234             @{@"reportID": @(2), @"size":@1, @"offset":@(16 + 72), @"usagePage":@(kHIDPage_Button), @"usage":@5},
    235             @{@"reportID": @(2), @"size":@1, @"offset":@(17 + 72), @"usagePage":@(kHIDPage_Button), @"usage":@6},
    236             @{@"reportID": @(2), @"size":@1, @"offset":@(18 + 72), @"usagePage":@(kHIDPage_Button), @"usage":@7},
    237             @{@"reportID": @(2), @"size":@1, @"offset":@(19 + 72), @"usagePage":@(kHIDPage_Button), @"usage":@8},
    238             
    239             @{@"reportID": @(2), @"size":@8, @"offset":@(24 + 72), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_X), @"min": @0, @"max": @255},
    240             @{@"reportID": @(2), @"size":@8, @"offset":@(32 + 72), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Y), @"min": @255, @"max": @0},
    241 
    242             @{@"reportID": @(2), @"size":@8, @"offset":@(40 + 72), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rx), @"min": @0, @"max": @255},
    243             @{@"reportID": @(2), @"size":@8, @"offset":@(48 + 72), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Ry), @"min": @255, @"max": @0},
    244             
    245             @{@"reportID": @(2), @"size":@8, @"offset":@(56 + 72), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Z), @"min": @0, @"max": @255},
    246             @{@"reportID": @(2), @"size":@8, @"offset":@(64 + 72), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rz), @"min": @0, @"max": @255},
    247             
    248             // Player 3
    249             
    250             @{@"reportID": @(3), @"size":@1, @"offset":@(4 + 144), @"usagePage":@(0xFF00), @"usage":@2, @"min": @0, @"max": @1},
    251             
    252             @{@"reportID": @(3), @"size":@1, @"offset":@(8 + 144), @"usagePage":@(kHIDPage_Button), @"usage":@1},
    253             @{@"reportID": @(3), @"size":@1, @"offset":@(9 + 144), @"usagePage":@(kHIDPage_Button), @"usage":@2},
    254             @{@"reportID": @(3), @"size":@1, @"offset":@(10 + 144), @"usagePage":@(kHIDPage_Button), @"usage":@3},
    255             @{@"reportID": @(3), @"size":@1, @"offset":@(11 + 144), @"usagePage":@(kHIDPage_Button), @"usage":@4},
    256                 
    257             @{@"reportID": @(3), @"size":@1, @"offset":@(12 + 144),  @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadLeft)},
    258             @{@"reportID": @(3), @"size":@1, @"offset":@(13 + 144),  @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadRight)},
    259             @{@"reportID": @(3), @"size":@1, @"offset":@(14 + 144), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadDown)},
    260             @{@"reportID": @(3), @"size":@1, @"offset":@(15 + 144), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadUp)},
    261             
    262             
    263             @{@"reportID": @(3), @"size":@1, @"offset":@(16 + 144), @"usagePage":@(kHIDPage_Button), @"usage":@5},
    264             @{@"reportID": @(3), @"size":@1, @"offset":@(17 + 144), @"usagePage":@(kHIDPage_Button), @"usage":@6},
    265             @{@"reportID": @(3), @"size":@1, @"offset":@(18 + 144), @"usagePage":@(kHIDPage_Button), @"usage":@7},
    266             @{@"reportID": @(3), @"size":@1, @"offset":@(19 + 144), @"usagePage":@(kHIDPage_Button), @"usage":@8},
    267             
    268             @{@"reportID": @(3), @"size":@8, @"offset":@(24 + 144), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_X), @"min": @0, @"max": @255},
    269             @{@"reportID": @(3), @"size":@8, @"offset":@(32 + 144), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Y), @"min": @255, @"max": @0},
    270 
    271             @{@"reportID": @(3), @"size":@8, @"offset":@(40 + 144), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rx), @"min": @0, @"max": @255},
    272             @{@"reportID": @(3), @"size":@8, @"offset":@(48 + 144), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Ry), @"min": @255, @"max": @0},
    273             
    274             @{@"reportID": @(3), @"size":@8, @"offset":@(56 + 144), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Z), @"min": @0, @"max": @255},
    275             @{@"reportID": @(3), @"size":@8, @"offset":@(64 + 144), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rz), @"min": @0, @"max": @255},
    276 
    277             // Player 4
    278             
    279             @{@"reportID": @(4), @"size":@1, @"offset":@(4 + 216), @"usagePage":@(0xFF00), @"usage":@2, @"min": @0, @"max": @1},
    280             
    281             @{@"reportID": @(4), @"size":@1, @"offset":@(8 + 216), @"usagePage":@(kHIDPage_Button), @"usage":@1},
    282             @{@"reportID": @(4), @"size":@1, @"offset":@(9 + 216), @"usagePage":@(kHIDPage_Button), @"usage":@2},
    283             @{@"reportID": @(4), @"size":@1, @"offset":@(10 + 216), @"usagePage":@(kHIDPage_Button), @"usage":@3},
    284             @{@"reportID": @(4), @"size":@1, @"offset":@(11 + 216), @"usagePage":@(kHIDPage_Button), @"usage":@4},
    285                 
    286             @{@"reportID": @(4), @"size":@1, @"offset":@(12 + 216),  @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadLeft)},
    287             @{@"reportID": @(4), @"size":@1, @"offset":@(13 + 216),  @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadRight)},
    288             @{@"reportID": @(4), @"size":@1, @"offset":@(14 + 216), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadDown)},
    289             @{@"reportID": @(4), @"size":@1, @"offset":@(15 + 216), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadUp)},
    290             
    291             
    292             @{@"reportID": @(4), @"size":@1, @"offset":@(16 + 216), @"usagePage":@(kHIDPage_Button), @"usage":@5},
    293             @{@"reportID": @(4), @"size":@1, @"offset":@(17 + 216), @"usagePage":@(kHIDPage_Button), @"usage":@6},
    294             @{@"reportID": @(4), @"size":@1, @"offset":@(18 + 216), @"usagePage":@(kHIDPage_Button), @"usage":@7},
    295             @{@"reportID": @(4), @"size":@1, @"offset":@(19 + 216), @"usagePage":@(kHIDPage_Button), @"usage":@8},
    296             
    297             @{@"reportID": @(4), @"size":@8, @"offset":@(24 + 216), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_X), @"min": @0, @"max": @255},
    298             @{@"reportID": @(4), @"size":@8, @"offset":@(32 + 216), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Y), @"min": @255, @"max": @0},
    299 
    300             @{@"reportID": @(4), @"size":@8, @"offset":@(40 + 216), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rx), @"min": @0, @"max": @255},
    301             @{@"reportID": @(4), @"size":@8, @"offset":@(48 + 216), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Ry), @"min": @255, @"max": @0},
    302             
    303             @{@"reportID": @(4), @"size":@8, @"offset":@(56 + 216), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Z), @"min": @0, @"max": @255},
    304             @{@"reportID": @(4), @"size":@8, @"offset":@(64 + 216), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rz), @"min": @0, @"max": @255},
    305 
    306             
    307         ]},
    308     },
    309     
    310     @"GameCube Controller Adapter": @{ // GameCube Controller PC Adapter
    311         JOYAxisGroups: @{
    312             @(kHIDUsage_GD_X): @(0),
    313             @(kHIDUsage_GD_Y): @(0),
    314             @(kHIDUsage_GD_Z): @(1),
    315             @(kHIDUsage_GD_Rx): @(2),
    316             @(kHIDUsage_GD_Ry): @(3),
    317             @(kHIDUsage_GD_Rz): @(1),
    318         },
    319         JOYReportIDFilters: @[@[@1], @[@2], @[@3], @[@4]],
    320         JOYButtonUsageMapping: @{
    321             BUTTON(1): @(JOYButtonUsageX),
    322             BUTTON(2): @(JOYButtonUsageA),
    323             BUTTON(3): @(JOYButtonUsageB),
    324             BUTTON(4): @(JOYButtonUsageY),
    325             BUTTON(5): @(JOYButtonUsageL1),
    326             BUTTON(6): @(JOYButtonUsageR1),
    327             BUTTON(8): @(JOYButtonUsageZ),
    328             BUTTON(10): @(JOYButtonUsageStart),
    329             BUTTON(13): @(JOYButtonUsageDPadUp),
    330             BUTTON(14): @(JOYButtonUsageDPadRight),
    331             BUTTON(15): @(JOYButtonUsageDPadDown),
    332             BUTTON(16): @(JOYButtonUsageDPadLeft),
    333         },
    334         
    335         JOYAxisUsageMapping: @{
    336             AXIS(4): @(JOYAxisUsageL1),
    337             AXIS(5): @(JOYAxisUsageR1),
    338         },
    339         
    340         JOYAxes2DUsageMapping: @{
    341             AXES2D(1): @(JOYAxes2DUsageLeftStick),
    342             AXES2D(3): @(JOYAxes2DUsageRightStick),
    343         },
    344         
    345         JOYRumbleUsage: @1,
    346         JOYRumbleUsagePage: @0xFF00,
    347         JOYRumbleMin: @0,
    348         JOYRumbleMax: @255,
    349         JOYSwapZRz: @YES,
    350     },
    351     
    352     @"Twin USB Joystick": @{ // DualShock PC Adapter
    353         JOYAxisGroups: @{
    354             @(kHIDUsage_GD_X): @(0),
    355             @(kHIDUsage_GD_Y): @(0),
    356             @(kHIDUsage_GD_Z): @(1),
    357             @(kHIDUsage_GD_Rx): @(2),
    358             @(kHIDUsage_GD_Ry): @(2),
    359             @(kHIDUsage_GD_Rz): @(1),
    360         },
    361         JOYReportIDFilters: @[@[@1], @[@2]],
    362         JOYButtonUsageMapping: @{
    363             BUTTON(1): @(JOYButtonUsageX),
    364             BUTTON(2): @(JOYButtonUsageA),
    365             BUTTON(3): @(JOYButtonUsageB),
    366             BUTTON(4): @(JOYButtonUsageY),
    367             BUTTON(5): @(JOYButtonUsageL2),
    368             BUTTON(6): @(JOYButtonUsageR2),
    369             BUTTON(7): @(JOYButtonUsageL1),
    370             BUTTON(8): @(JOYButtonUsageR1),
    371             BUTTON(9): @(JOYButtonUsageSelect),
    372             BUTTON(10): @(JOYButtonUsageStart),
    373             BUTTON(11): @(JOYButtonUsageLStick),
    374             BUTTON(12): @(JOYButtonUsageRStick),
    375             BUTTON(13): @(JOYButtonUsageDPadUp),
    376             BUTTON(14): @(JOYButtonUsageDPadRight),
    377             BUTTON(15): @(JOYButtonUsageDPadDown),
    378             BUTTON(16): @(JOYButtonUsageDPadLeft),
    379         },
    380         
    381         JOYAxes2DUsageMapping: @{
    382             AXES2D(1): @(JOYAxes2DUsageLeftStick),
    383             AXES2D(6): @(JOYAxes2DUsageRightStick),
    384         },
    385         
    386         JOYSwapZRz: @YES,
    387     },
    388     
    389     @"Pro Controller": @{ // Switch Pro Controller
    390         JOYIsSwitch: @YES,
    391         JOYAxisGroups: @{
    392               @(kHIDUsage_GD_X): @(0),
    393               @(kHIDUsage_GD_Y): @(0),
    394               @(kHIDUsage_GD_Z): @(0),
    395               @(kHIDUsage_GD_Rx): @(1),
    396               @(kHIDUsage_GD_Ry): @(1),
    397               @(kHIDUsage_GD_Rz): @(1),
    398         },
    399             
    400         JOYButtonUsageMapping: @{
    401             BUTTON(1): @(JOYButtonUsageB),
    402             BUTTON(2): @(JOYButtonUsageA),
    403             BUTTON(3): @(JOYButtonUsageY),
    404             BUTTON(4): @(JOYButtonUsageX),
    405             BUTTON(5): @(JOYButtonUsageL1),
    406             BUTTON(6): @(JOYButtonUsageR1),
    407             BUTTON(7): @(JOYButtonUsageL2),
    408             BUTTON(8): @(JOYButtonUsageR2),
    409             BUTTON(9): @(JOYButtonUsageSelect),
    410             BUTTON(10): @(JOYButtonUsageStart),
    411             BUTTON(11): @(JOYButtonUsageLStick),
    412             BUTTON(12): @(JOYButtonUsageRStick),
    413             BUTTON(13): @(JOYButtonUsageHome),
    414             BUTTON(14): @(JOYButtonUsageMisc),
    415         },
    416         
    417         JOYAxes2DUsageMapping: @{
    418             AXES2D(1): @(JOYAxes2DUsageLeftStick),
    419             AXES2D(4): @(JOYAxes2DUsageRightStick),
    420         },
    421         
    422         JOYCustomReports: @{
    423             @(0x30): @[
    424             
    425             @{@"reportID": @(1), @"size":@1, @"offset":@16, @"usagePage":@(kHIDPage_Button), @"usage":@3},
    426             @{@"reportID": @(1), @"size":@1, @"offset":@17, @"usagePage":@(kHIDPage_Button), @"usage":@4},
    427             @{@"reportID": @(1), @"size":@1, @"offset":@18, @"usagePage":@(kHIDPage_Button), @"usage":@1},
    428             @{@"reportID": @(1), @"size":@1, @"offset":@19, @"usagePage":@(kHIDPage_Button), @"usage":@2},
    429             
    430             // SR and SL not used on the Pro Controller
    431             @{@"reportID": @(1), @"size":@1, @"offset":@22, @"usagePage":@(kHIDPage_Button), @"usage":@6},
    432             @{@"reportID": @(1), @"size":@1, @"offset":@23, @"usagePage":@(kHIDPage_Button), @"usage":@8},
    433             
    434             @{@"reportID": @(1), @"size":@1, @"offset":@24, @"usagePage":@(kHIDPage_Button), @"usage":@9},
    435             @{@"reportID": @(1), @"size":@1, @"offset":@25, @"usagePage":@(kHIDPage_Button), @"usage":@10},
    436             @{@"reportID": @(1), @"size":@1, @"offset":@26, @"usagePage":@(kHIDPage_Button), @"usage":@12},
    437             @{@"reportID": @(1), @"size":@1, @"offset":@27, @"usagePage":@(kHIDPage_Button), @"usage":@11},
    438             
    439             @{@"reportID": @(1), @"size":@1, @"offset":@28, @"usagePage":@(kHIDPage_Button), @"usage":@13},
    440             @{@"reportID": @(1), @"size":@1, @"offset":@29, @"usagePage":@(kHIDPage_Button), @"usage":@14},
    441 
    442             @{@"reportID": @(1), @"size":@1, @"offset":@32, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadDown)},
    443             @{@"reportID": @(1), @"size":@1, @"offset":@33, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadUp)},
    444             @{@"reportID": @(1), @"size":@1, @"offset":@34, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadRight)},
    445             @{@"reportID": @(1), @"size":@1, @"offset":@35, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadLeft)},
    446             
    447             // SR and SL not used on the Pro Controller
    448             @{@"reportID": @(1), @"size":@1, @"offset":@38, @"usagePage":@(kHIDPage_Button), @"usage":@5},
    449             @{@"reportID": @(1), @"size":@1, @"offset":@39, @"usagePage":@(kHIDPage_Button), @"usage":@7},
    450 
    451             /* Sticks */
    452             @{@"reportID": @(1), @"size":@12, @"offset":@40, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_X), @"min": @0, @"max": @0xFFF},
    453             @{@"reportID": @(1), @"size":@12, @"offset":@52, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Y), @"min": @0xFFF, @"max": @0},
    454             
    455             @{@"reportID": @(1), @"size":@12, @"offset":@64, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rx), @"min": @0, @"max": @0xFFF},
    456             @{@"reportID": @(1), @"size":@12, @"offset":@76, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Ry), @"min": @0xFFF, @"max": @0},
    457             
    458             @{@"reportID": @(1), @"size":@16, @"offset":@96, @"usagePage":@(kHIDPage_Sensor), @"min": @0x7FFF, @"max": @-0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisZ)},
    459             @{@"reportID": @(1), @"size":@16, @"offset":@112, @"usagePage":@(kHIDPage_Sensor), @"min": @0x7FFF, @"max": @-0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisX)},
    460             @{@"reportID": @(1), @"size":@16, @"offset":@128, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisY)},
    461             @{@"reportID": @(1), @"size":@16, @"offset":@144, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityZAxis)},
    462             @{@"reportID": @(1), @"size":@16, @"offset":@160, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityXAxis)},
    463             @{@"reportID": @(1), @"size":@16, @"offset":@176, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityYAxis)},
    464             ],
    465         },
    466         
    467         JOYIgnoredReports: @[@(0x30)], // Ignore the real 0x30 report as it's broken
    468     },
    469     
    470     @"Joy-Con (L)": @{ // Switch Pro Controller
    471         JOYIsSwitch: @YES,
    472         JOYJoyCon: @(JOYJoyConTypeLeft),
    473         JOYAxisGroups: @{
    474               @(kHIDUsage_GD_X): @(0),
    475               @(kHIDUsage_GD_Y): @(0),
    476               @(kHIDUsage_GD_Z): @(0),
    477         },
    478             
    479         JOYButtonUsageMapping: @{
    480             BUTTON(5): @(JOYButtonUsageL1),
    481             BUTTON(7): @(JOYButtonUsageL2),
    482             BUTTON(9): @(JOYButtonUsageSelect),
    483             BUTTON(11): @(JOYButtonUsageLStick),
    484             BUTTON(14): @(JOYButtonUsageMisc),
    485             BUTTON(15): @(JOYButtonUsageL3),
    486             BUTTON(16): @(JOYButtonUsageR3),
    487         },
    488         
    489         JOYAxes2DUsageMapping: @{
    490             AXES2D(1): @(JOYAxes2DUsageLeftStick),
    491         },
    492         
    493         JOYCustomReports: @{
    494             @(0x30): @[
    495             @{@"reportID": @(1), @"size":@1, @"offset":@24, @"usagePage":@(kHIDPage_Button), @"usage":@9},
    496             @{@"reportID": @(1), @"size":@1, @"offset":@27, @"usagePage":@(kHIDPage_Button), @"usage":@11},
    497             
    498             @{@"reportID": @(1), @"size":@1, @"offset":@29, @"usagePage":@(kHIDPage_Button), @"usage":@14},
    499 
    500             @{@"reportID": @(1), @"size":@1, @"offset":@32, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadDown)},
    501             @{@"reportID": @(1), @"size":@1, @"offset":@33, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadUp)},
    502             @{@"reportID": @(1), @"size":@1, @"offset":@34, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadRight)},
    503             @{@"reportID": @(1), @"size":@1, @"offset":@35, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_DPadLeft)},
    504             
    505             @{@"reportID": @(1), @"size":@1, @"offset":@36, @"usagePage":@(kHIDPage_Button), @"usage":@16},
    506             @{@"reportID": @(1), @"size":@1, @"offset":@37, @"usagePage":@(kHIDPage_Button), @"usage":@15},
    507             @{@"reportID": @(1), @"size":@1, @"offset":@38, @"usagePage":@(kHIDPage_Button), @"usage":@5},
    508             @{@"reportID": @(1), @"size":@1, @"offset":@39, @"usagePage":@(kHIDPage_Button), @"usage":@7},
    509 
    510             /* Sticks */
    511             @{@"reportID": @(1), @"size":@12, @"offset":@40, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_X), @"min": @0, @"max": @0xFFF},
    512             @{@"reportID": @(1), @"size":@12, @"offset":@52, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Y), @"min": @0xFFF, @"max": @0},
    513             
    514             @{@"reportID": @(1), @"size":@16, @"offset":@96, @"usagePage":@(kHIDPage_Sensor), @"min": @0x7FFF, @"max": @-0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisZ)},
    515             @{@"reportID": @(1), @"size":@16, @"offset":@112, @"usagePage":@(kHIDPage_Sensor), @"min": @0x7FFF, @"max": @-0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisX)},
    516             @{@"reportID": @(1), @"size":@16, @"offset":@128, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisY)},
    517             @{@"reportID": @(1), @"size":@16, @"offset":@144, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityZAxis)},
    518             @{@"reportID": @(1), @"size":@16, @"offset":@160, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityXAxis)},
    519             @{@"reportID": @(1), @"size":@16, @"offset":@176, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityYAxis)},
    520             ],
    521         },
    522         
    523         JOYIgnoredReports: @[@(0x30)], // Ignore the real 0x30 report as it's broken
    524     },
    525     
    526     @"Joy-Con (R)": @{ // Switch Pro Controller
    527         JOYIsSwitch: @YES,
    528         JOYJoyCon: @(JOYJoyConTypeRight),
    529         JOYAxisGroups: @{
    530               @(kHIDUsage_GD_Rx): @(1),
    531               @(kHIDUsage_GD_Ry): @(1),
    532               @(kHIDUsage_GD_Rz): @(1),
    533         },
    534             
    535         JOYButtonUsageMapping: @{
    536             BUTTON(1): @(JOYButtonUsageB),
    537             BUTTON(2): @(JOYButtonUsageA),
    538             BUTTON(3): @(JOYButtonUsageY),
    539             BUTTON(4): @(JOYButtonUsageX),
    540             BUTTON(6): @(JOYButtonUsageR1),
    541             BUTTON(8): @(JOYButtonUsageR2),
    542             BUTTON(10): @(JOYButtonUsageStart),
    543             BUTTON(12): @(JOYButtonUsageRStick),
    544             BUTTON(13): @(JOYButtonUsageHome),
    545             BUTTON(15): @(JOYButtonUsageL3),
    546             BUTTON(16): @(JOYButtonUsageR3),
    547         },
    548         
    549         JOYAxes2DUsageMapping: @{
    550             AXES2D(4): @(JOYAxes2DUsageRightStick),
    551         },
    552         
    553         JOYCustomReports: @{
    554             @(0x30): @[
    555             
    556             @{@"reportID": @(1), @"size":@1, @"offset":@16, @"usagePage":@(kHIDPage_Button), @"usage":@3},
    557             @{@"reportID": @(1), @"size":@1, @"offset":@17, @"usagePage":@(kHIDPage_Button), @"usage":@4},
    558             @{@"reportID": @(1), @"size":@1, @"offset":@18, @"usagePage":@(kHIDPage_Button), @"usage":@1},
    559             @{@"reportID": @(1), @"size":@1, @"offset":@19, @"usagePage":@(kHIDPage_Button), @"usage":@2},
    560             @{@"reportID": @(1), @"size":@1, @"offset":@20, @"usagePage":@(kHIDPage_Button), @"usage":@16},
    561             @{@"reportID": @(1), @"size":@1, @"offset":@21, @"usagePage":@(kHIDPage_Button), @"usage":@15},
    562             @{@"reportID": @(1), @"size":@1, @"offset":@22, @"usagePage":@(kHIDPage_Button), @"usage":@6},
    563             @{@"reportID": @(1), @"size":@1, @"offset":@23, @"usagePage":@(kHIDPage_Button), @"usage":@8},
    564 
    565             @{@"reportID": @(1), @"size":@1, @"offset":@25, @"usagePage":@(kHIDPage_Button), @"usage":@10},
    566             @{@"reportID": @(1), @"size":@1, @"offset":@26, @"usagePage":@(kHIDPage_Button), @"usage":@12},
    567             @{@"reportID": @(1), @"size":@1, @"offset":@28, @"usagePage":@(kHIDPage_Button), @"usage":@13},
    568             
    569             /* Sticks */
    570             @{@"reportID": @(1), @"size":@12, @"offset":@64, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rx), @"min": @0, @"max": @0xFFF},
    571             @{@"reportID": @(1), @"size":@12, @"offset":@76, @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Ry), @"min": @0xFFF, @"max": @0},
    572             
    573             // The X axis is inverted on the right Joy-Con
    574             @{@"reportID": @(1), @"size":@16, @"offset":@96, @"usagePage":@(kHIDPage_Sensor), @"min": @0x7FFF, @"max": @-0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisZ)},
    575             @{@"reportID": @(1), @"size":@16, @"offset":@112, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisX)},
    576             @{@"reportID": @(1), @"size":@16, @"offset":@128, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AccelerationAxisY)},
    577             @{@"reportID": @(1), @"size":@16, @"offset":@144, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityZAxis)},
    578             @{@"reportID": @(1), @"size":@16, @"offset":@160, @"usagePage":@(kHIDPage_Sensor), @"min": @0x7FFF, @"max": @-0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityXAxis)},
    579             @{@"reportID": @(1), @"size":@16, @"offset":@176, @"usagePage":@(kHIDPage_Sensor), @"min": @-0x7FFF, @"max": @0x7FFF, @"usage":@(kHIDUsage_Snsr_Data_Motion_AngularVelocityYAxis)},
    580             ],
    581         },
    582         
    583         JOYIgnoredReports: @[@(0x30)], // Ignore the real 0x30 report as it's broken
    584     },
    585 
    586     
    587     @"NSW wired controller": @{ // Wired Switch controllers
    588             JOYButtonUsageMapping: @{
    589                     BUTTON(1): @(JOYButtonUsageY),
    590                     BUTTON(2): @(JOYButtonUsageB),
    591                     BUTTON(3): @(JOYButtonUsageA),
    592                     BUTTON(4): @(JOYButtonUsageX),
    593                     BUTTON(5): @(JOYButtonUsageL1),
    594                     BUTTON(6): @(JOYButtonUsageR1),
    595                     BUTTON(7): @(JOYButtonUsageL2),
    596                     BUTTON(8): @(JOYButtonUsageR2),
    597                     BUTTON(9): @(JOYButtonUsageSelect),
    598                     BUTTON(10): @(JOYButtonUsageStart),
    599                     BUTTON(11): @(JOYButtonUsageLStick),
    600                     BUTTON(12): @(JOYButtonUsageRStick),
    601                     BUTTON(13): @(JOYButtonUsageHome),
    602                     BUTTON(14): @(JOYButtonUsageMisc),
    603             },
    604     },
    605     
    606     @"PLAYSTATION(R)3 Controller": @{ // DualShock 3
    607         JOYAxisGroups: @{
    608             @(kHIDUsage_GD_X): @(0),
    609             @(kHIDUsage_GD_Y): @(0),
    610             @(kHIDUsage_GD_Z): @(1),
    611             @(kHIDUsage_GD_Rx): @(2),
    612             @(kHIDUsage_GD_Ry): @(3),
    613             @(kHIDUsage_GD_Rz): @(1),
    614         },
    615         
    616         JOYButtonUsageMapping: @{
    617             BUTTON(1): @(JOYButtonUsageSelect),
    618             BUTTON(2): @(JOYButtonUsageL3),
    619             BUTTON(3): @(JOYButtonUsageR3),
    620             BUTTON(4): @(JOYButtonUsageStart),
    621             BUTTON(5): @(JOYButtonUsageDPadUp),
    622             BUTTON(6): @(JOYButtonUsageDPadRight),
    623             BUTTON(7): @(JOYButtonUsageDPadDown),
    624             BUTTON(8): @(JOYButtonUsageDPadLeft),
    625             BUTTON(9): @(JOYButtonUsageL2),
    626             BUTTON(10): @(JOYButtonUsageR2),
    627             BUTTON(11): @(JOYButtonUsageL1),
    628             BUTTON(12): @(JOYButtonUsageR1),
    629             BUTTON(13): @(JOYButtonUsageX),
    630             BUTTON(14): @(JOYButtonUsageA),
    631             BUTTON(15): @(JOYButtonUsageB),
    632             BUTTON(16): @(JOYButtonUsageY),
    633             BUTTON(17): @(JOYButtonUsageHome),
    634         },
    635         
    636         JOYAxisUsageMapping: @{
    637             AXIS(4): @(JOYAxisUsageL1),
    638             AXIS(5): @(JOYAxisUsageR1),
    639             AXIS(8): @(JOYAxisUsageL2),
    640             AXIS(9): @(JOYAxisUsageR2),
    641         },
    642         
    643         JOYAxes2DUsageMapping: @{
    644             AXES2D(1): @(JOYAxes2DUsageLeftStick),
    645             AXES2D(3): @(JOYAxes2DUsageRightStick),
    646         },
    647                 
    648         JOYCustomReports: @{
    649             @(0x01): @[
    650             /* Pressure sensitive inputs */
    651             @{@"reportID": @(1), @"size":@8, @"offset":@(13 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Slider), @"min": @0, @"max": @255},
    652             @{@"reportID": @(1), @"size":@8, @"offset":@(14 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Slider), @"min": @0, @"max": @255},
    653             @{@"reportID": @(1), @"size":@8, @"offset":@(15 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Slider), @"min": @0, @"max": @255},
    654             @{@"reportID": @(1), @"size":@8, @"offset":@(16 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Slider), @"min": @0, @"max": @255},
    655             @{@"reportID": @(1), @"size":@8, @"offset":@(17 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Dial), @"min": @0, @"max": @255},
    656             @{@"reportID": @(1), @"size":@8, @"offset":@(18 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Wheel), @"min": @0, @"max": @255},
    657             @{@"reportID": @(1), @"size":@8, @"offset":@(19 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Rx), @"min": @0, @"max": @255},
    658             @{@"reportID": @(1), @"size":@8, @"offset":@(20 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Ry), @"min": @0, @"max": @255},
    659             @{@"reportID": @(1), @"size":@8, @"offset":@(21 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Slider), @"min": @0, @"max": @255},
    660             @{@"reportID": @(1), @"size":@8, @"offset":@(22 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Slider), @"min": @0, @"max": @255},
    661             @{@"reportID": @(1), @"size":@8, @"offset":@(23 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Slider), @"min": @0, @"max": @255},
    662             @{@"reportID": @(1), @"size":@8, @"offset":@(24 * 8), @"usagePage":@(kHIDPage_GenericDesktop), @"usage":@(kHIDUsage_GD_Slider), @"min": @0, @"max": @255},
    663             ]
    664         },
    665         
    666         JOYIsDualShock3: @YES,
    667     },
    668 
    669 };

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.