Implement "sliders as buttons" mode

In this mode, when the analog values of the L/R triggers exceed a
certain threshold, the corresponding L and R digital buttons are
triggered.
This commit is contained in:
Raphael Assenat 2017-08-05 17:13:21 -04:00
parent a9d5df2b8f
commit a041e8eaf8
1 changed files with 30 additions and 17 deletions

View File

@ -98,6 +98,7 @@ static void buildReportFromGC(const gc_pad_data *gc_data, unsigned char dstbuf[U
{ {
int16_t xval,yval,cxval,cyval,ltrig,rtrig; int16_t xval,yval,cxval,cyval,ltrig,rtrig;
uint16_t buttons; uint16_t buttons;
uint16_t gcbuttons = gc_data->buttons;
/* Force official range */ /* Force official range */
xval = minmax(gc_data->x, -100, 100); xval = minmax(gc_data->x, -100, 100);
@ -114,6 +115,17 @@ static void buildReportFromGC(const gc_pad_data *gc_data, unsigned char dstbuf[U
cxval *= 160; cxval *= 160;
cyval *= -160; cyval *= -160;
if (g_eeprom_data.cfg.flags & FLAG_GC_SLIDERS_AS_BUTTONS) {
/* In this mode, the sliders control buttons */
if (ltrig > 32)
gcbuttons |= GC_BTN_L;
if (rtrig > 32)
gcbuttons |= GC_BTN_R;
/* And the sliders analog values are fixed. */
ltrig = rtrig = 0;
}
else {
if (g_eeprom_data.cfg.flags & FLAG_GC_FULL_SLIDERS) { if (g_eeprom_data.cfg.flags & FLAG_GC_FULL_SLIDERS) {
int16_t lts = (int16_t)ltrig - 127; int16_t lts = (int16_t)ltrig - 127;
int16_t rts = (int16_t)rtrig - 127; int16_t rts = (int16_t)rtrig - 127;
@ -134,6 +146,7 @@ static void buildReportFromGC(const gc_pad_data *gc_data, unsigned char dstbuf[U
ltrig = -ltrig; ltrig = -ltrig;
rtrig = -rtrig; rtrig = -rtrig;
} }
}
/* Unsign for HID report */ /* Unsign for HID report */
xval += 16000; xval += 16000;
@ -159,7 +172,7 @@ static void buildReportFromGC(const gc_pad_data *gc_data, unsigned char dstbuf[U
dstbuf[11] = ((uint8_t*)&rtrig)[0]; dstbuf[11] = ((uint8_t*)&rtrig)[0];
dstbuf[12] = ((uint8_t*)&rtrig)[1]; dstbuf[12] = ((uint8_t*)&rtrig)[1];
buttons = mappings_do(MAPPING_GAMECUBE_DEFAULT, gc_data->buttons); buttons = mappings_do(MAPPING_GAMECUBE_DEFAULT, gcbuttons);
btnsToReport(buttons, dstbuf+13); btnsToReport(buttons, dstbuf+13);
} }