Two axis analog (2x potmeter) joystick driver.

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?

UserRevisionLine numberNew 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 }