Mark Peter Vargha / Joystick
Committer:
vargham
Date:
Thu Feb 09 19:13:02 2017 +0000
Revision:
0:f76f52dc57f7
Child:
3:cd36fdbb23f8
Joystick basics.

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 0:f76f52dc57f7 13 void Joystick::process()
vargham 0:f76f52dc57f7 14 {
vargham 0:f76f52dc57f7 15 JoystickValue newValue(_xIn.read_u16(), _yIn.read_u16());
vargham 0:f76f52dc57f7 16 if (_calibrated)
vargham 0:f76f52dc57f7 17 {
vargham 0:f76f52dc57f7 18 if (newValue.x < _center.x - JOYSTICK_CENTER_DEADZONE)
vargham 0:f76f52dc57f7 19 {
vargham 0:f76f52dc57f7 20 newValue.x = newValue.x - (_center.x - JOYSTICK_CENTER_DEADZONE);
vargham 0:f76f52dc57f7 21 }
vargham 0:f76f52dc57f7 22 else if (newValue.x > _center.x + JOYSTICK_CENTER_DEADZONE)
vargham 0:f76f52dc57f7 23 {
vargham 0:f76f52dc57f7 24 newValue.x = newValue.x - (_center.x + JOYSTICK_CENTER_DEADZONE);
vargham 0:f76f52dc57f7 25 }
vargham 0:f76f52dc57f7 26 else
vargham 0:f76f52dc57f7 27 {
vargham 0:f76f52dc57f7 28 newValue.x = 0;
vargham 0:f76f52dc57f7 29 }
vargham 0:f76f52dc57f7 30 if (newValue.y < _center.y - JOYSTICK_CENTER_DEADZONE)
vargham 0:f76f52dc57f7 31 {
vargham 0:f76f52dc57f7 32 newValue.y = newValue.y - (_center.y - JOYSTICK_CENTER_DEADZONE);
vargham 0:f76f52dc57f7 33 }
vargham 0:f76f52dc57f7 34 else if (newValue.y > _center.y + JOYSTICK_CENTER_DEADZONE)
vargham 0:f76f52dc57f7 35 {
vargham 0:f76f52dc57f7 36 newValue.y = newValue.y - (_center.y + JOYSTICK_CENTER_DEADZONE);
vargham 0:f76f52dc57f7 37 }
vargham 0:f76f52dc57f7 38 else
vargham 0:f76f52dc57f7 39 {
vargham 0:f76f52dc57f7 40 newValue.y = 0;
vargham 0:f76f52dc57f7 41 }
vargham 0:f76f52dc57f7 42 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 43 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 44 if (_swapXY)
vargham 0:f76f52dc57f7 45 {
vargham 0:f76f52dc57f7 46 int t = newValue.x;
vargham 0:f76f52dc57f7 47 newValue.x = newValue.y;
vargham 0:f76f52dc57f7 48 newValue.y = t;
vargham 0:f76f52dc57f7 49 }
vargham 0:f76f52dc57f7 50 JoystickValue joyPrev(_joyValue);
vargham 0:f76f52dc57f7 51 _joyValue.x = _flipX ? -1 * newValue.x : newValue.x;
vargham 0:f76f52dc57f7 52 _joyValue.y = _flipY ? -1 * newValue.y : newValue.y;
vargham 0:f76f52dc57f7 53 if (_onChange != NULL && (_delta == 0 || abs(_joyValue.x - joyPrev.x) >= _delta || abs(_joyValue.y - joyPrev.y) >= _delta))
vargham 0:f76f52dc57f7 54 {
vargham 0:f76f52dc57f7 55 _onChange(_joyValue, joyPrev);
vargham 0:f76f52dc57f7 56 }
vargham 0:f76f52dc57f7 57 }
vargham 0:f76f52dc57f7 58 else
vargham 0:f76f52dc57f7 59 {
vargham 0:f76f52dc57f7 60 _center.x = (_center.x + newValue.x) / 2;
vargham 0:f76f52dc57f7 61 _center.y = (_center.y + newValue.y) / 2;
vargham 0:f76f52dc57f7 62 if (++_calibrationCounter >= JOYSTICK_CALIBRATION_CYCLES)
vargham 0:f76f52dc57f7 63 {
vargham 0:f76f52dc57f7 64 _calibrated = true;
vargham 0:f76f52dc57f7 65 }
vargham 0:f76f52dc57f7 66 }
vargham 0:f76f52dc57f7 67 }
vargham 0:f76f52dc57f7 68
vargham 0:f76f52dc57f7 69