Skip to content

Commit 2af90bc

Browse files
committed
Allow for inverted ranges
MHeironimus#25 Feature request to allow range to be defined as 1024 to 0 instead of 0 to 1024
1 parent fe7a8f3 commit 2af90bc

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

Joystick/examples/JoystickTest/JoystickTest.ino

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,13 @@ void testHatSwitch(unsigned int currentStep)
157157
void testThrottleRudder(unsigned int value)
158158
{
159159
Joystick.setThrottle(value);
160-
Joystick.setRudder(255 - value);
160+
Joystick.setRudder(value);
161161
}
162162

163163
void testXYZAxisRotation(unsigned int degree)
164164
{
165165
Joystick.setRxAxis(degree);
166-
Joystick.setRyAxis(360 - degree);
166+
Joystick.setRyAxis(degree);
167167
Joystick.setRzAxis(degree * 2);
168168
}
169169

@@ -174,10 +174,10 @@ void setup() {
174174
Joystick.setYAxisRange(-127, 127);
175175
Joystick.setZAxisRange(-127, 127);
176176
Joystick.setRxAxisRange(0, 360);
177-
Joystick.setRyAxisRange(0, 360);
177+
Joystick.setRyAxisRange(360, 0);
178178
Joystick.setRzAxisRange(0, 720);
179179
Joystick.setThrottleRange(0, 255);
180-
Joystick.setRudderRange(0, 255);
180+
Joystick.setRudderRange(255, 0);
181181

182182
if (testAutoSendMode)
183183
{

Joystick/src/Joystick.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
#define JOYSTICK_INCLUDE_BRAKE B00001000
4242
#define JOYSTICK_INCLUDE_STEERING B00010000
4343

44+
#define JOYSTICK_VALUE_RANGE_CHECK(value, l, g) if (((value) < min((l), (g))) || ((value) > max((l), (g)))) return
45+
4446
Joystick_::Joystick_(
4547
uint8_t hidReportId,
4648
uint8_t joystickType,
@@ -519,79 +521,79 @@ void Joystick_::releaseButton(uint8_t button)
519521

520522
void Joystick_::setXAxis(int16_t value)
521523
{
522-
if ((value < _xAxisMinimum) || (value > _xAxisMaximum)) return;
524+
JOYSTICK_VALUE_RANGE_CHECK(value, _xAxisMinimum, _xAxisMaximum);
523525

524526
_xAxis = value;
525527
if (_autoSendState) sendState();
526528
}
527529
void Joystick_::setYAxis(int16_t value)
528530
{
529-
if ((value < _yAxisMinimum) || (value > _yAxisMaximum)) return;
531+
JOYSTICK_VALUE_RANGE_CHECK(value, _yAxisMinimum, _yAxisMaximum);
530532

531533
_yAxis = value;
532534
if (_autoSendState) sendState();
533535
}
534536
void Joystick_::setZAxis(int16_t value)
535537
{
536-
if ((value < _zAxisMinimum) || (value > _zAxisMaximum)) return;
538+
JOYSTICK_VALUE_RANGE_CHECK(value, _zAxisMinimum, _zAxisMaximum);
537539

538540
_zAxis = value;
539541
if (_autoSendState) sendState();
540542
}
541543

542544
void Joystick_::setRxAxis(int16_t value)
543545
{
544-
if ((value < _rxAxisMinimum) || (value > _rxAxisMaximum)) return;
546+
JOYSTICK_VALUE_RANGE_CHECK(value, _rxAxisMinimum, _rxAxisMaximum);
545547

546548
_xAxisRotation = value;
547549
if (_autoSendState) sendState();
548550
}
549551
void Joystick_::setRyAxis(int16_t value)
550552
{
551-
if ((value < _ryAxisMinimum) || (value > _ryAxisMaximum)) return;
553+
JOYSTICK_VALUE_RANGE_CHECK(value, _ryAxisMinimum, _ryAxisMaximum);
552554

553555
_yAxisRotation = value;
554556
if (_autoSendState) sendState();
555557
}
556558
void Joystick_::setRzAxis(int16_t value)
557559
{
558-
if ((value < _rzAxisMinimum) || (value > _rzAxisMaximum)) return;
560+
JOYSTICK_VALUE_RANGE_CHECK(value, _rzAxisMinimum, _rzAxisMaximum);
559561

560562
_zAxisRotation = value;
561563
if (_autoSendState) sendState();
562564
}
563565

564566
void Joystick_::setRudder(int16_t value)
565567
{
566-
if ((value < _rudderMinimum) || (value > _rudderMaximum)) return;
568+
JOYSTICK_VALUE_RANGE_CHECK(value, _rudderMinimum, _rudderMaximum);
567569

568570
_rudder = value;
569571
if (_autoSendState) sendState();
570572
}
571573
void Joystick_::setThrottle(int16_t value)
572574
{
573-
if ((value < _throttleMinimum) || (value > _throttleMaximum)) return;
575+
JOYSTICK_VALUE_RANGE_CHECK(value, _throttleMinimum, _throttleMaximum);
574576

575577
_throttle = value;
576578
if (_autoSendState) sendState();
577579
}
578580
void Joystick_::setAccelerator(int16_t value)
579581
{
580-
if ((value < _acceleratorMinimum) || (value > _acceleratorMaximum)) return;
582+
JOYSTICK_VALUE_RANGE_CHECK(value, _acceleratorMinimum, _acceleratorMaximum);
581583

582584
_accelerator = value;
583585
if (_autoSendState) sendState();
584586
}
585587
void Joystick_::setBrake(int16_t value)
586588
{
587-
if ((value < _brakeMinimum) || (value > _brakeMaximum)) return;
589+
JOYSTICK_VALUE_RANGE_CHECK(value, _brakeMinimum, _brakeMaximum);
588590

589591
_brake = value;
590592
if (_autoSendState) sendState();
591593
}
592594
void Joystick_::setSteering(int16_t value)
593595
{
594-
if ((value < _steeringMinimum) || (value > _steeringMaximum)) return;
596+
JOYSTICK_VALUE_RANGE_CHECK(value, _steeringMinimum, _steeringMaximum);
595597

596598
_steering = value;
597599
if (_autoSendState) sendState();
@@ -612,7 +614,14 @@ int Joystick_::buildAndSet16BitValue(bool includeValue, int16_t value, int16_t v
612614
uint8_t lowByte;
613615

614616
if (includeValue == true) {
615-
convertedValue = map(value, valueMinimum, valueMaximum, actualMinimum, actualMaximum);
617+
618+
if (valueMinimum > valueMaximum) {
619+
// Values go from a larger number to a smaller number (e.g. 1024 to 0)
620+
convertedValue = map(valueMinimum - value, valueMaximum, valueMinimum, actualMinimum, actualMaximum);
621+
} else {
622+
// Values go from a smaller number to a larger number (e.g. 0 to 1024)
623+
convertedValue = map(value, valueMinimum, valueMaximum, actualMinimum, actualMaximum);
624+
}
616625

617626
highByte = (uint8_t)(convertedValue >> 8);
618627
lowByte = (uint8_t)(convertedValue & 0x00FF);

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Arduino Joystick Library
2-
#### Version 2.0.1
2+
#### Version 2.0.2
33
This library can be used with Arduino IDE 1.6.6 (or above) to add one or more joysticks (or gamepads) to the list of HID devices an [Arduino Leonardo](https://www.arduino.cc/en/Main/ArduinoBoardLeonardo) or [Arduino Micro](https://www.arduino.cc/en/Main/ArduinoBoardMicro) (or any Arduino clone that is based on the ATmega32u4) can support. This will not work with Arduino IDE 1.6.5 (or below) or with non-32u4 based Arduino devices (e.g. Arduino UNO, Arduino MEGA, etc.).
44

55
## Features

0 commit comments

Comments
 (0)