Gets potentiometer and button reading from a joystick (https://proto-pic.co.uk/thumb-joystick-analogue/)

Dependents:   L2_SpaceInvaders 6-Joystick

Committer:
avi23
Date:
Mon May 02 16:27:49 2016 +0000
Revision:
1:78d3e8b50d19
Parent:
0:56a82b52e0d4
Child:
2:c9f2a9e2f304
Documented using Doxygen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
avi23 1:78d3e8b50d19 1 /**
avi23 1:78d3e8b50d19 2 @file Joystick.cpp
avi23 1:78d3e8b50d19 3
avi23 1:78d3e8b50d19 4 @brief Member functions implementations
avi23 1:78d3e8b50d19 5
avi23 1:78d3e8b50d19 6 */
avi23 0:56a82b52e0d4 7 #include "Joystick.h"
avi23 0:56a82b52e0d4 8 #include "mbed.h"
avi23 0:56a82b52e0d4 9
avi23 0:56a82b52e0d4 10 Joystick::Joystick(PinName x_axis_pin, PinName y_axis_pin, PinName button_pin) {
avi23 0:56a82b52e0d4 11 x_axis_ = new AnalogIn(x_axis_pin);
avi23 0:56a82b52e0d4 12 y_axis_ = new AnalogIn(y_axis_pin);
avi23 0:56a82b52e0d4 13 button_ = new InterruptIn(button_pin);
avi23 0:56a82b52e0d4 14 button_debounce_ = new Timeout();
avi23 0:56a82b52e0d4 15 }
avi23 0:56a82b52e0d4 16
avi23 0:56a82b52e0d4 17 Joystick::~Joystick() {
avi23 0:56a82b52e0d4 18 delete x_axis_;
avi23 0:56a82b52e0d4 19 delete y_axis_;
avi23 0:56a82b52e0d4 20 delete button_;
avi23 0:56a82b52e0d4 21 delete button_debounce_;
avi23 0:56a82b52e0d4 22 }
avi23 0:56a82b52e0d4 23
avi23 0:56a82b52e0d4 24 void Joystick::init() {
avi23 0:56a82b52e0d4 25 //Sets up the button ISR
avi23 0:56a82b52e0d4 26 button_->mode(PullDown);
avi23 0:56a82b52e0d4 27 button_->rise(this, &Joystick::button_isr);
avi23 0:56a82b52e0d4 28
avi23 0:56a82b52e0d4 29 //Initalises the vairables and flags
avi23 0:56a82b52e0d4 30 x_offset_ = 0;
avi23 0:56a82b52e0d4 31 y_offset_ = 0;
avi23 0:56a82b52e0d4 32 g_button_flag_ = false;
avi23 0:56a82b52e0d4 33 g_button_debounce_flag_ = false;
avi23 0:56a82b52e0d4 34
avi23 0:56a82b52e0d4 35 //Samples the joystick 5 times and takes an average to get the offset
avi23 0:56a82b52e0d4 36 float x_sum = 0;
avi23 0:56a82b52e0d4 37 float y_sum = 0;
avi23 0:56a82b52e0d4 38
avi23 0:56a82b52e0d4 39 for (int i = 0; i < 5; ++i) {
avi23 0:56a82b52e0d4 40 x_sum += x_axis_->read();
avi23 0:56a82b52e0d4 41 y_sum += y_axis_->read();
avi23 0:56a82b52e0d4 42 }
avi23 0:56a82b52e0d4 43
avi23 0:56a82b52e0d4 44 x_offset_ = 0.5f - x_sum/5.0f;
avi23 0:56a82b52e0d4 45 y_offset_ = 0.5f - y_sum/5.0f;
avi23 0:56a82b52e0d4 46 }
avi23 0:56a82b52e0d4 47
avi23 0:56a82b52e0d4 48 float Joystick::GetXValue() {
avi23 0:56a82b52e0d4 49
avi23 0:56a82b52e0d4 50 float x_sum = 0;
avi23 0:56a82b52e0d4 51 //Iterates 5 times and calculates an average
avi23 0:56a82b52e0d4 52 for (int i = 0; i < 5; ++i) {
avi23 0:56a82b52e0d4 53 x_sum += x_axis_->read();
avi23 0:56a82b52e0d4 54 }
avi23 0:56a82b52e0d4 55
avi23 0:56a82b52e0d4 56 float x_value = x_sum/5.0f + x_offset_;
avi23 0:56a82b52e0d4 57
avi23 0:56a82b52e0d4 58 //Caps the value for the POT between 0 and 1
avi23 0:56a82b52e0d4 59 if (x_value < 0.0f) {
avi23 0:56a82b52e0d4 60 return 0;
avi23 0:56a82b52e0d4 61 } else if (x_value > 1.0f) {
avi23 0:56a82b52e0d4 62 return 1;
avi23 0:56a82b52e0d4 63 } else {
avi23 0:56a82b52e0d4 64 return x_value;
avi23 0:56a82b52e0d4 65 }
avi23 0:56a82b52e0d4 66 }
avi23 0:56a82b52e0d4 67
avi23 0:56a82b52e0d4 68 float Joystick::GetYValue() {
avi23 0:56a82b52e0d4 69
avi23 0:56a82b52e0d4 70 float y_sum = 0;
avi23 0:56a82b52e0d4 71 //Iterates 5 times and calculates an average
avi23 0:56a82b52e0d4 72 for (int i = 0; i < 5; ++i) {
avi23 0:56a82b52e0d4 73 y_sum += y_axis_->read();
avi23 0:56a82b52e0d4 74 }
avi23 0:56a82b52e0d4 75
avi23 0:56a82b52e0d4 76 float y_value = y_sum/5.0f + y_offset_;
avi23 0:56a82b52e0d4 77
avi23 0:56a82b52e0d4 78 //Caps the value for the POT between 0 and 1
avi23 0:56a82b52e0d4 79 if (y_value < 0.0f) {
avi23 0:56a82b52e0d4 80 return 0;
avi23 0:56a82b52e0d4 81 } else if (y_value > 1.0f) {
avi23 0:56a82b52e0d4 82 return 1;
avi23 0:56a82b52e0d4 83 } else {
avi23 0:56a82b52e0d4 84 return y_value;
avi23 0:56a82b52e0d4 85 }
avi23 0:56a82b52e0d4 86 }
avi23 0:56a82b52e0d4 87
avi23 0:56a82b52e0d4 88 int Joystick::get_button_flag() {
avi23 0:56a82b52e0d4 89 return g_button_flag_;
avi23 0:56a82b52e0d4 90 }
avi23 0:56a82b52e0d4 91
avi23 0:56a82b52e0d4 92 void Joystick::set_button_flag(bool value) {
avi23 0:56a82b52e0d4 93 g_button_flag_ = value;
avi23 0:56a82b52e0d4 94 }
avi23 0:56a82b52e0d4 95
avi23 0:56a82b52e0d4 96 void Joystick::button_isr() {
avi23 0:56a82b52e0d4 97 if (!g_button_debounce_flag_) {
avi23 0:56a82b52e0d4 98 g_button_flag_ = true;
avi23 0:56a82b52e0d4 99 g_button_debounce_flag_ = true;
avi23 0:56a82b52e0d4 100
avi23 0:56a82b52e0d4 101 //Sets up the debounce ticker to fire in 0.2s
avi23 0:56a82b52e0d4 102 button_debounce_->attach(this, &Joystick::button_debounce_isr, 0.2);
avi23 0:56a82b52e0d4 103 }
avi23 0:56a82b52e0d4 104 }
avi23 0:56a82b52e0d4 105
avi23 0:56a82b52e0d4 106 void Joystick::button_debounce_isr() {
avi23 0:56a82b52e0d4 107 g_button_debounce_flag_ = false;
avi23 0:56a82b52e0d4 108 }