@@ -47,18 +47,25 @@ enum CanonicalAxisIndex {
47
47
AXIS_INDEX_COUNT
48
48
};
49
49
50
+ const float BUTTON_THRESHOLD_VALUE = 0 .1f ;
51
+
50
52
float NormalizeTouch (long aValue, long aMin, long aMax) {
51
53
return (2 .f * (aValue - aMin) / static_cast <float >(aMax - aMin)) - 1 .f ;
52
54
}
53
55
54
56
bool AxisNegativeAsButton (float input) {
55
57
const float value = (input < -0 .5f ) ? 1 .f : 0 .f ;
56
- return value > 0 . 1f ;
58
+ return value > BUTTON_THRESHOLD_VALUE ;
57
59
}
58
60
59
61
bool AxisPositiveAsButton (float input) {
60
62
const float value = (input > 0 .5f ) ? 1 .f : 0 .f ;
61
- return value > 0 .1f ;
63
+ return value > BUTTON_THRESHOLD_VALUE;
64
+ }
65
+
66
+ double AxisToButtonValue (double aValue) {
67
+ // Mapping axis value range from (-1, +1) to (0, +1).
68
+ return (aValue + 1 .0f ) * 0 .5f ;
62
69
}
63
70
64
71
void FetchDpadFromAxis (uint32_t aIndex, double dir) {
@@ -173,14 +180,18 @@ class ADT1Remapper final : public GamepadRemapper {
173
180
case 2 :
174
181
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
175
182
break ;
176
- case 3 :
183
+ case 3 : {
184
+ const double value = AxisToButtonValue (aValue);
177
185
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
178
- aValue > 0 . 1f );
186
+ value > BUTTON_THRESHOLD_VALUE, value );
179
187
break ;
180
- case 4 :
188
+ }
189
+ case 4 : {
190
+ const double value = AxisToButtonValue (aValue);
181
191
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
182
- aValue > 0 . 1f );
192
+ value > BUTTON_THRESHOLD_VALUE, value );
183
193
break ;
194
+ }
184
195
case 5 :
185
196
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
186
197
break ;
@@ -329,12 +340,16 @@ class StadiaControllerRemapper final : public GamepadRemapper {
329
340
case 3 :
330
341
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
331
342
break ;
332
- case 4 :
333
- service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER, aValue);
343
+ case 4 : {
344
+ const double value = AxisToButtonValue (aValue);
345
+ service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER, value > BUTTON_THRESHOLD_VALUE, value);
334
346
break ;
335
- case 5 :
336
- service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER, aValue);
347
+ }
348
+ case 5 : {
349
+ const double value = AxisToButtonValue (aValue);
350
+ service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER, value > BUTTON_THRESHOLD_VALUE, value);
337
351
break ;
352
+ }
338
353
default :
339
354
NS_WARNING (
340
355
nsPrintfCString (
@@ -405,7 +420,7 @@ class Playstation3Remapper final : public GamepadRemapper {
405
420
default :
406
421
NS_WARNING (
407
422
nsPrintfCString (
408
- " Axis idx '%d' doesn't support in Dualshock4Remapper ()." , aAxis)
423
+ " Axis idx '%d' doesn't support in Playstation3Remapper ()." , aAxis)
409
424
.get());
410
425
break ;
411
426
}
@@ -575,14 +590,18 @@ class Dualshock4Remapper final : public GamepadRemapper {
575
590
case 2 :
576
591
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
577
592
break ;
578
- case 3 :
593
+ case 3 : {
594
+ const double value = AxisToButtonValue (aValue);
579
595
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
580
- aValue > 0 .1f );
581
- break ;
582
- case 4 :
596
+ value > BUTTON_THRESHOLD_VALUE, value);
597
+ break ;
598
+ }
599
+ case 4 : {
600
+ const double value = AxisToButtonValue (aValue);
583
601
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
584
- aValue > 0 .1f );
585
- break ;
602
+ value > BUTTON_THRESHOLD_VALUE, value);
603
+ break ;
604
+ }
586
605
case 5 :
587
606
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
588
607
break ;
@@ -832,14 +851,18 @@ class NvShieldRemapper final : public GamepadRemapper {
832
851
case 2 :
833
852
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
834
853
break ;
835
- case 3 :
854
+ case 3 : {
855
+ const double value = AxisToButtonValue (aValue);
836
856
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
837
- aValue > 0 . 1f );
857
+ value > BUTTON_THRESHOLD_VALUE, value );
838
858
break ;
839
- case 4 :
859
+ }
860
+ case 4 : {
861
+ const double value = AxisToButtonValue (aValue);
840
862
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
841
- aValue > 0 . 1f );
863
+ value > BUTTON_THRESHOLD_VALUE, value );
842
864
break ;
865
+ }
843
866
case 5 :
844
867
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
845
868
break ;
@@ -924,14 +947,18 @@ class NvShield2017Remapper final : public GamepadRemapper {
924
947
case 2 :
925
948
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
926
949
break ;
927
- case 3 :
950
+ case 3 : {
951
+ const double value = AxisToButtonValue (aValue);
928
952
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
929
- aValue > 0 . 1f );
953
+ value > BUTTON_THRESHOLD_VALUE, value );
930
954
break ;
931
- case 4 :
955
+ }
956
+ case 4 : {
957
+ const double value = AxisToButtonValue (aValue);
932
958
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
933
- aValue > 0 . 1f );
959
+ value > BUTTON_THRESHOLD_VALUE, value );
934
960
break ;
961
+ }
935
962
case 5 :
936
963
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
937
964
break ;
@@ -1089,14 +1116,18 @@ class XSkillsRemapper final : public GamepadRemapper {
1089
1116
case 2 :
1090
1117
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
1091
1118
break ;
1092
- case 3 :
1119
+ case 3 : {
1120
+ const double value = AxisToButtonValue (aValue);
1093
1121
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1094
- aValue > 0 . 1f );
1122
+ value > BUTTON_THRESHOLD_VALUE, value );
1095
1123
break ;
1096
- case 4 :
1124
+ }
1125
+ case 4 : {
1126
+ const double value = AxisToButtonValue (aValue);
1097
1127
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1098
- aValue > 0 . 1f );
1128
+ value > BUTTON_THRESHOLD_VALUE, value );
1099
1129
break ;
1130
+ }
1100
1131
case 5 :
1101
1132
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
1102
1133
break ;
@@ -1230,7 +1261,7 @@ class BoomN64PsxRemapper final : public GamepadRemapper {
1230
1261
};
1231
1262
};
1232
1263
1233
- class AnalogGamepadRemapper final : public GamepadRemapper {
1264
+ class StadiaControllerOldFirmwareRemapper final : public GamepadRemapper {
1234
1265
public:
1235
1266
virtual uint32_t GetAxisCount () const override { return AXIS_INDEX_COUNT; }
1236
1267
@@ -1256,14 +1287,18 @@ class AnalogGamepadRemapper final : public GamepadRemapper {
1256
1287
case 2 :
1257
1288
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
1258
1289
break ;
1259
- case 3 :
1290
+ case 3 : {
1291
+ const double value = AxisToButtonValue (aValue);
1260
1292
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1261
- aValue > 0 . 1f );
1293
+ value > BUTTON_THRESHOLD_VALUE, value );
1262
1294
break ;
1263
- case 4 :
1295
+ }
1296
+ case 4 : {
1297
+ const double value = AxisToButtonValue (aValue);
1264
1298
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1265
- aValue > 0 . 1f );
1299
+ value > BUTTON_THRESHOLD_VALUE, value );
1266
1300
break ;
1301
+ }
1267
1302
case 5 :
1268
1303
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
1269
1304
break ;
@@ -1352,14 +1387,18 @@ class RazerServalRemapper final : public GamepadRemapper {
1352
1387
case 2 :
1353
1388
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
1354
1389
break ;
1355
- case 3 :
1390
+ case 3 : {
1391
+ const double value = AxisToButtonValue (aValue);
1356
1392
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1357
- aValue > 0 . 1f );
1393
+ value > BUTTON_THRESHOLD_VALUE, value );
1358
1394
break ;
1359
- case 4 :
1395
+ }
1396
+ case 4 : {
1397
+ const double value = AxisToButtonValue (aValue);
1360
1398
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1361
- aValue > 0 . 1f );
1399
+ value > BUTTON_THRESHOLD_VALUE, value );
1362
1400
break ;
1401
+ }
1363
1402
case 5 :
1364
1403
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
1365
1404
break ;
@@ -1435,14 +1474,18 @@ class MogaProRemapper final : public GamepadRemapper {
1435
1474
case 2 :
1436
1475
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
1437
1476
break ;
1438
- case 3 :
1477
+ case 3 : {
1478
+ const double value = AxisToButtonValue (aValue);
1439
1479
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1440
- aValue > 0 . 1f );
1480
+ value > BUTTON_THRESHOLD_VALUE, value );
1441
1481
break ;
1442
- case 4 :
1482
+ }
1483
+ case 4 : {
1484
+ const double value = AxisToButtonValue (aValue);
1443
1485
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1444
- aValue > 0 . 1f );
1486
+ value > BUTTON_THRESHOLD_VALUE, value );
1445
1487
break ;
1488
+ }
1446
1489
case 5 :
1447
1490
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
1448
1491
break ;
@@ -1512,20 +1555,24 @@ class OnLiveWirelessRemapper final : public GamepadRemapper {
1512
1555
case 1 :
1513
1556
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_LEFT_STICK_Y, aValue);
1514
1557
break ;
1515
- case 2 :
1558
+ case 2 : {
1559
+ const double value = AxisToButtonValue (aValue);
1516
1560
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1517
- aValue > 0 . 1f );
1561
+ value > BUTTON_THRESHOLD_VALUE, value );
1518
1562
break ;
1563
+ }
1519
1564
case 3 :
1520
1565
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
1521
1566
break ;
1522
1567
case 4 :
1523
1568
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
1524
1569
break ;
1525
- case 5 :
1570
+ case 5 : {
1571
+ const double value = AxisToButtonValue (aValue);
1526
1572
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1527
- aValue > 0 . 1f );
1573
+ value > BUTTON_THRESHOLD_VALUE, value );
1528
1574
break ;
1575
+ }
1529
1576
case 9 :
1530
1577
FetchDpadFromAxis (aIndex, aValue);
1531
1578
break ;
@@ -1597,20 +1644,24 @@ class OUYARemapper final : public GamepadRemapper {
1597
1644
case 1 :
1598
1645
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_LEFT_STICK_Y, aValue);
1599
1646
break ;
1600
- case 2 :
1647
+ case 2 : {
1648
+ const double value = AxisToButtonValue (aValue);
1601
1649
service->NewButtonEvent (aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1602
- aValue > 0 . 1f );
1650
+ value > BUTTON_THRESHOLD_VALUE, value );
1603
1651
break ;
1652
+ }
1604
1653
case 3 :
1605
1654
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
1606
1655
break ;
1607
1656
case 4 :
1608
1657
service->NewAxisMoveEvent (aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
1609
1658
break ;
1610
- case 5 :
1659
+ case 5 : {
1660
+ const double value = AxisToButtonValue (aValue);
1611
1661
service->NewButtonEvent (aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1612
- aValue > 0 . 1f );
1662
+ value > BUTTON_THRESHOLD_VALUE, value );
1613
1663
break ;
1664
+ }
1614
1665
default :
1615
1666
NS_WARNING (
1616
1667
nsPrintfCString (" Axis idx '%d' doesn't support in OUYARemapper()." ,
@@ -1672,7 +1723,7 @@ already_AddRefed<GamepadRemapper> GetGamepadRemapper(const uint16_t aVendorId,
1672
1723
{GamepadId::kPadixProduct2060 , new IBuffaloRemapper ()},
1673
1724
{GamepadId::kPlayComProduct0005 , new XSkillsRemapper ()},
1674
1725
{GamepadId::kPrototypeVendorProduct0667 , new BoomN64PsxRemapper ()},
1675
- {GamepadId::kPrototypeVendorProduct9401 , new AnalogGamepadRemapper ()},
1726
+ {GamepadId::kPrototypeVendorProduct9401 , new StadiaControllerOldFirmwareRemapper ()},
1676
1727
{GamepadId::kRazer1532Product0900 , new RazerServalRemapper ()},
1677
1728
{GamepadId::kSonyProduct0268 , new Playstation3Remapper ()},
1678
1729
{GamepadId::kSonyProduct05c4 , new Dualshock4Remapper ()},
0 commit comments