Two axis analog (2x potmeter) joystick driver.
Joystick.cpp@5:48ba213dfbb3, 2017-03-16 (annotated)
- Committer:
- vargham
- Date:
- Thu Mar 16 12:35:54 2017 +0000
- Revision:
- 5:48ba213dfbb3
- Parent:
- 4:f2f560cb71fe
Added adjustable center deadzone.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vargham | 0:f76f52dc57f7 | 1 | #include "Joystick.h" |
vargham | 0:f76f52dc57f7 | 2 | |
vargham | 0:f76f52dc57f7 | 3 | int mapInto(int x, int in_min, int in_max, int out_min, int out_max) |
vargham | 0:f76f52dc57f7 | 4 | { |
vargham | 0:f76f52dc57f7 | 5 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
vargham | 0:f76f52dc57f7 | 6 | } |
vargham | 0:f76f52dc57f7 | 7 | |
vargham | 0:f76f52dc57f7 | 8 | int constrain(int x, int x_min, int x_max) |
vargham | 0:f76f52dc57f7 | 9 | { |
vargham | 0:f76f52dc57f7 | 10 | return x >= x_min && x <= x_max ? x : (x < x_min ? x_min : x_max); |
vargham | 0:f76f52dc57f7 | 11 | } |
vargham | 0:f76f52dc57f7 | 12 | |
vargham | 4:f2f560cb71fe | 13 | void Joystick::process(void) |
vargham | 0:f76f52dc57f7 | 14 | { |
vargham | 0:f76f52dc57f7 | 15 | JoystickValue newValue(_xIn.read_u16(), _yIn.read_u16()); |
vargham | 3:cd36fdbb23f8 | 16 | if (!_calibrated) //Calibrating |
vargham | 3:cd36fdbb23f8 | 17 | { |
vargham | 3:cd36fdbb23f8 | 18 | _center.x = (_center.x + newValue.x) / 2; |
vargham | 3:cd36fdbb23f8 | 19 | _center.y = (_center.y + newValue.y) / 2; |
vargham | 3:cd36fdbb23f8 | 20 | if (++_calibrationCounter >= JOYSTICK_CALIBRATION_CYCLES) |
vargham | 3:cd36fdbb23f8 | 21 | { |
vargham | 3:cd36fdbb23f8 | 22 | _calibrated = true; |
vargham | 3:cd36fdbb23f8 | 23 | } |
vargham | 3:cd36fdbb23f8 | 24 | } |
vargham | 3:cd36fdbb23f8 | 25 | else if (!_locked) //Normal process if not locked |
vargham | 0:f76f52dc57f7 | 26 | { |
vargham | 0:f76f52dc57f7 | 27 | if (newValue.x < _center.x - JOYSTICK_CENTER_DEADZONE) |
vargham | 0:f76f52dc57f7 | 28 | { |
vargham | 0:f76f52dc57f7 | 29 | newValue.x = newValue.x - (_center.x - JOYSTICK_CENTER_DEADZONE); |
vargham | 0:f76f52dc57f7 | 30 | } |
vargham | 0:f76f52dc57f7 | 31 | else if (newValue.x > _center.x + JOYSTICK_CENTER_DEADZONE) |
vargham | 0:f76f52dc57f7 | 32 | { |
vargham | 0:f76f52dc57f7 | 33 | newValue.x = newValue.x - (_center.x + JOYSTICK_CENTER_DEADZONE); |
vargham | 0:f76f52dc57f7 | 34 | } |
vargham | 0:f76f52dc57f7 | 35 | else |
vargham | 0:f76f52dc57f7 | 36 | { |
vargham | 0:f76f52dc57f7 | 37 | newValue.x = 0; |
vargham | 0:f76f52dc57f7 | 38 | } |
vargham | 0:f76f52dc57f7 | 39 | if (newValue.y < _center.y - JOYSTICK_CENTER_DEADZONE) |
vargham | 0:f76f52dc57f7 | 40 | { |
vargham | 0:f76f52dc57f7 | 41 | newValue.y = newValue.y - (_center.y - JOYSTICK_CENTER_DEADZONE); |
vargham | 0:f76f52dc57f7 | 42 | } |
vargham | 0:f76f52dc57f7 | 43 | else if (newValue.y > _center.y + JOYSTICK_CENTER_DEADZONE) |
vargham | 0:f76f52dc57f7 | 44 | { |
vargham | 0:f76f52dc57f7 | 45 | newValue.y = newValue.y - (_center.y + JOYSTICK_CENTER_DEADZONE); |
vargham | 0:f76f52dc57f7 | 46 | } |
vargham | 0:f76f52dc57f7 | 47 | else |
vargham | 0:f76f52dc57f7 | 48 | { |
vargham | 0:f76f52dc57f7 | 49 | newValue.y = 0; |
vargham | 0:f76f52dc57f7 | 50 | } |
vargham | 0:f76f52dc57f7 | 51 | newValue.x = constrain(mapInto(newValue.x, -(JOYSTICK_ADC_MAX - JOYSTICK_CENTER_DEADZONE * 2) / 2, (JOYSTICK_ADC_MAX - JOYSTICK_CENTER_DEADZONE * 2) / 2, -_range, _range), -_range, _range); |
vargham | 0:f76f52dc57f7 | 52 | newValue.y = constrain(mapInto(newValue.y, -(JOYSTICK_ADC_MAX - JOYSTICK_CENTER_DEADZONE * 2) / 2, (JOYSTICK_ADC_MAX - JOYSTICK_CENTER_DEADZONE * 2) / 2, -_range, _range), -_range, _range); |
vargham | 0:f76f52dc57f7 | 53 | if (_swapXY) |
vargham | 0:f76f52dc57f7 | 54 | { |
vargham | 0:f76f52dc57f7 | 55 | int t = newValue.x; |
vargham | 0:f76f52dc57f7 | 56 | newValue.x = newValue.y; |
vargham | 0:f76f52dc57f7 | 57 | newValue.y = t; |
vargham | 0:f76f52dc57f7 | 58 | } |
vargham | 0:f76f52dc57f7 | 59 | JoystickValue joyPrev(_joyValue); |
vargham | 0:f76f52dc57f7 | 60 | _joyValue.x = _flipX ? -1 * newValue.x : newValue.x; |
vargham | 0:f76f52dc57f7 | 61 | _joyValue.y = _flipY ? -1 * newValue.y : newValue.y; |
vargham | 0:f76f52dc57f7 | 62 | if (_onChange != NULL && (_delta == 0 || abs(_joyValue.x - joyPrev.x) >= _delta || abs(_joyValue.y - joyPrev.y) >= _delta)) |
vargham | 0:f76f52dc57f7 | 63 | { |
vargham | 0:f76f52dc57f7 | 64 | _onChange(_joyValue, joyPrev); |
vargham | 0:f76f52dc57f7 | 65 | } |
vargham | 0:f76f52dc57f7 | 66 | } |
vargham | 0:f76f52dc57f7 | 67 | } |