Class used to interface with the handheld gamepad.

Fork of Gamepad by Craig Evans

Committer:
eencae
Date:
Sat Feb 04 16:21:19 2017 +0000
Revision:
2:ea5538fcfe2f
Parent:
1:6d25cd49059b
Child:
3:964a6d95acdd
B button change pin definition;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:a6288c29b936 1 #include "Gamepad.h"
eencae 0:a6288c29b936 2
eencae 1:6d25cd49059b 3 //////////// constructor/destructor ////////////
eencae 0:a6288c29b936 4 Gamepad::Gamepad()
eencae 0:a6288c29b936 5 {
eencae 0:a6288c29b936 6 led_1 = new PwmOut(PTA1);
eencae 0:a6288c29b936 7 led_2 = new PwmOut(PTA2);
eencae 0:a6288c29b936 8 led_3 = new PwmOut(PTC2);
eencae 0:a6288c29b936 9 led_4 = new PwmOut(PTC3);
eencae 0:a6288c29b936 10 led_5 = new PwmOut(PTC4);
eencae 0:a6288c29b936 11 led_6 = new PwmOut(PTD3);
eencae 0:a6288c29b936 12
eencae 0:a6288c29b936 13 lcd = new N5110(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
eencae 0:a6288c29b936 14 joystick = new Joystick(PTB10,PTB11,PTC16);
eencae 0:a6288c29b936 15
eencae 0:a6288c29b936 16 button_A = new InterruptIn(PTB9);
eencae 2:ea5538fcfe2f 17 button_B = new InterruptIn(PTD0);
eencae 0:a6288c29b936 18 button_X = new InterruptIn(PTC17);
eencae 2:ea5538fcfe2f 19 button_Y = new InterruptIn(PTC12);
eencae 0:a6288c29b936 20 button_back = new InterruptIn(PTB19);
eencae 0:a6288c29b936 21 button_start = new InterruptIn(PTC5);
eencae 0:a6288c29b936 22 button_L = new InterruptIn(PTB18);
eencae 0:a6288c29b936 23 button_R = new InterruptIn(PTB3);
eencae 0:a6288c29b936 24
eencae 0:a6288c29b936 25 buzzer = new PwmOut(PTC10);
eencae 0:a6288c29b936 26 pot = new AnalogIn(PTB2);
eencae 0:a6288c29b936 27
eencae 1:6d25cd49059b 28 timeout = new Timeout();
eencae 1:6d25cd49059b 29
eencae 0:a6288c29b936 30 }
eencae 0:a6288c29b936 31
eencae 1:6d25cd49059b 32 Gamepad::~Gamepad()
eencae 1:6d25cd49059b 33 {
eencae 1:6d25cd49059b 34 delete led_1,led_2,led_3,led_4,led_5,led_6;
eencae 1:6d25cd49059b 35 delete lcd,joystick,button_A,button_B;
eencae 1:6d25cd49059b 36 delete button_X, button_Y, button_back, button_start;
eencae 1:6d25cd49059b 37 delete button_L, button_R, buzzer, pot, timeout;
eencae 1:6d25cd49059b 38 }
eencae 1:6d25cd49059b 39
eencae 1:6d25cd49059b 40 ///////////////// public methods /////////////////
eencae 1:6d25cd49059b 41
eencae 0:a6288c29b936 42 void Gamepad::init()
eencae 0:a6288c29b936 43 {
eencae 0:a6288c29b936 44 lcd->init();
eencae 0:a6288c29b936 45 joystick->init();
eencae 1:6d25cd49059b 46 leds_off();
eencae 1:6d25cd49059b 47
eencae 1:6d25cd49059b 48 buzzer->period(1.0/1000.0); // 1 kHz
eencae 1:6d25cd49059b 49
eencae 1:6d25cd49059b 50 // clear all flags
eencae 1:6d25cd49059b 51 a_flag=0,b_flag=0,x_flag=0,y_flag=0,l_flag=0,r_flag=0,back_flag=0,start_flag=0;
eencae 1:6d25cd49059b 52
eencae 0:a6288c29b936 53 }
eencae 0:a6288c29b936 54
eencae 0:a6288c29b936 55 void Gamepad::leds_off()
eencae 0:a6288c29b936 56 {
eencae 1:6d25cd49059b 57 fade_leds(0.0);
eencae 0:a6288c29b936 58 }
eencae 0:a6288c29b936 59
eencae 0:a6288c29b936 60 void Gamepad::leds_on()
eencae 0:a6288c29b936 61 {
eencae 1:6d25cd49059b 62 fade_leds(1.0);
eencae 1:6d25cd49059b 63 }
eencae 1:6d25cd49059b 64
eencae 1:6d25cd49059b 65 void Gamepad::fade_leds(float val)
eencae 1:6d25cd49059b 66 {
eencae 1:6d25cd49059b 67 if (val < 0.0f) {
eencae 1:6d25cd49059b 68 val = 0.0f;
eencae 1:6d25cd49059b 69 }
eencae 1:6d25cd49059b 70 if (val > 1.0f) {
eencae 1:6d25cd49059b 71 val = 1.0f;
eencae 1:6d25cd49059b 72 }
eencae 1:6d25cd49059b 73
eencae 1:6d25cd49059b 74 // leds are active-low, so subtract from 1.0
eencae 1:6d25cd49059b 75 // 0.0 corresponds to fully-off, 1.0 to fully-on
eencae 1:6d25cd49059b 76 val = 1.0f - val;
eencae 1:6d25cd49059b 77
eencae 1:6d25cd49059b 78 led_1->write(val);
eencae 1:6d25cd49059b 79 led_2->write(val);
eencae 1:6d25cd49059b 80 led_3->write(val);
eencae 1:6d25cd49059b 81 led_4->write(val);
eencae 1:6d25cd49059b 82 led_5->write(val);
eencae 1:6d25cd49059b 83 led_6->write(val);
eencae 1:6d25cd49059b 84 }
eencae 1:6d25cd49059b 85
eencae 1:6d25cd49059b 86 float Gamepad::read_pot()
eencae 1:6d25cd49059b 87 {
eencae 1:6d25cd49059b 88 return pot->read();
eencae 1:6d25cd49059b 89 }
eencae 1:6d25cd49059b 90
eencae 1:6d25cd49059b 91 void Gamepad::tone(float frequency, float duration)
eencae 1:6d25cd49059b 92 {
eencae 1:6d25cd49059b 93 buzzer->period(1.0f/frequency);
eencae 1:6d25cd49059b 94 buzzer->write(0.5); // 50% duty cycle - square wave
eencae 1:6d25cd49059b 95 timeout->attach(callback(this, &Gamepad::tone_off), duration );
eencae 1:6d25cd49059b 96 }
eencae 1:6d25cd49059b 97
eencae 1:6d25cd49059b 98 bool Gamepad::a_pressed()
eencae 1:6d25cd49059b 99 {
eencae 1:6d25cd49059b 100 // ISR must have been triggered
eencae 1:6d25cd49059b 101 if (a_flag) {
eencae 1:6d25cd49059b 102 a_flag = 0; // clear flag
eencae 1:6d25cd49059b 103 return true;
eencae 1:6d25cd49059b 104 } else {
eencae 1:6d25cd49059b 105 return false;
eencae 1:6d25cd49059b 106 }
eencae 1:6d25cd49059b 107 }
eencae 1:6d25cd49059b 108
eencae 1:6d25cd49059b 109 bool Gamepad::b_pressed()
eencae 1:6d25cd49059b 110 {
eencae 1:6d25cd49059b 111 // ISR must have been triggered
eencae 1:6d25cd49059b 112 if (b_flag) {
eencae 1:6d25cd49059b 113 b_flag = 0; // clear flag
eencae 1:6d25cd49059b 114 return true;
eencae 1:6d25cd49059b 115 } else {
eencae 1:6d25cd49059b 116 return false;
eencae 1:6d25cd49059b 117 }
eencae 1:6d25cd49059b 118 }
eencae 1:6d25cd49059b 119
eencae 1:6d25cd49059b 120 bool Gamepad::x_pressed()
eencae 1:6d25cd49059b 121 {
eencae 1:6d25cd49059b 122 // ISR must have been triggered
eencae 1:6d25cd49059b 123 if (x_flag) {
eencae 1:6d25cd49059b 124 x_flag = 0; // clear flag
eencae 1:6d25cd49059b 125 return true;
eencae 1:6d25cd49059b 126 } else {
eencae 1:6d25cd49059b 127 return false;
eencae 1:6d25cd49059b 128 }
eencae 1:6d25cd49059b 129 }
eencae 1:6d25cd49059b 130
eencae 1:6d25cd49059b 131 bool Gamepad::y_pressed()
eencae 1:6d25cd49059b 132 {
eencae 1:6d25cd49059b 133 // ISR must have been triggered
eencae 1:6d25cd49059b 134 if (y_flag) {
eencae 1:6d25cd49059b 135 y_flag = 0; // clear flag
eencae 1:6d25cd49059b 136 return true;
eencae 1:6d25cd49059b 137 } else {
eencae 1:6d25cd49059b 138 return false;
eencae 1:6d25cd49059b 139 }
eencae 1:6d25cd49059b 140 }
eencae 1:6d25cd49059b 141
eencae 1:6d25cd49059b 142 bool Gamepad::l_pressed()
eencae 1:6d25cd49059b 143 {
eencae 1:6d25cd49059b 144 // ISR must have been triggered
eencae 1:6d25cd49059b 145 if (l_flag) {
eencae 1:6d25cd49059b 146 l_flag = 0; // clear flag
eencae 1:6d25cd49059b 147 return true;
eencae 1:6d25cd49059b 148 } else {
eencae 1:6d25cd49059b 149 return false;
eencae 1:6d25cd49059b 150 }
eencae 0:a6288c29b936 151 }
eencae 1:6d25cd49059b 152
eencae 1:6d25cd49059b 153 bool Gamepad::r_pressed()
eencae 1:6d25cd49059b 154 {
eencae 1:6d25cd49059b 155 // ISR must have been triggered
eencae 1:6d25cd49059b 156 if (r_flag) {
eencae 1:6d25cd49059b 157 r_flag = 0; // clear flag
eencae 1:6d25cd49059b 158 return true;
eencae 1:6d25cd49059b 159 } else {
eencae 1:6d25cd49059b 160 return false;
eencae 1:6d25cd49059b 161 }
eencae 1:6d25cd49059b 162 }
eencae 1:6d25cd49059b 163
eencae 1:6d25cd49059b 164 bool Gamepad::back_pressed()
eencae 1:6d25cd49059b 165 {
eencae 1:6d25cd49059b 166 // ISR must have been triggered
eencae 1:6d25cd49059b 167 if (back_flag) {
eencae 1:6d25cd49059b 168 back_flag = 0; // clear flag
eencae 1:6d25cd49059b 169 return true;
eencae 1:6d25cd49059b 170 } else {
eencae 1:6d25cd49059b 171 return false;
eencae 1:6d25cd49059b 172 }
eencae 1:6d25cd49059b 173 }
eencae 1:6d25cd49059b 174
eencae 1:6d25cd49059b 175 bool Gamepad::start_pressed()
eencae 1:6d25cd49059b 176 {
eencae 1:6d25cd49059b 177 // ISR must have been triggered
eencae 1:6d25cd49059b 178 if (a_flag) {
eencae 1:6d25cd49059b 179 a_flag = 0; // clear flag
eencae 1:6d25cd49059b 180 return true;
eencae 1:6d25cd49059b 181 } else {
eencae 1:6d25cd49059b 182 return false;
eencae 1:6d25cd49059b 183 }
eencae 1:6d25cd49059b 184 }
eencae 1:6d25cd49059b 185 ///////////////////// private methods ////////////////////////
eencae 1:6d25cd49059b 186
eencae 1:6d25cd49059b 187 void Gamepad::tone_off()
eencae 1:6d25cd49059b 188 {
eencae 1:6d25cd49059b 189 buzzer->write(0.0);
eencae 1:6d25cd49059b 190 }
eencae 1:6d25cd49059b 191
eencae 1:6d25cd49059b 192 void Gamepad::init_buttons()
eencae 1:6d25cd49059b 193 {
eencae 1:6d25cd49059b 194 // turn on pull-downs as other side of button is connected to 3V3
eencae 1:6d25cd49059b 195 // button is 0 when not pressed and 1 when pressed
eencae 1:6d25cd49059b 196 button_A->mode(PullDown);
eencae 1:6d25cd49059b 197 button_B->mode(PullDown);
eencae 1:6d25cd49059b 198 button_X->mode(PullDown);
eencae 1:6d25cd49059b 199 button_Y->mode(PullDown);
eencae 1:6d25cd49059b 200 button_back->mode(PullDown);
eencae 1:6d25cd49059b 201 button_start->mode(PullDown);
eencae 1:6d25cd49059b 202 button_L->mode(PullDown);
eencae 1:6d25cd49059b 203 button_R->mode(PullDown);
eencae 1:6d25cd49059b 204 // therefore setup rising edge interrupts
eencae 1:6d25cd49059b 205 button_A->rise(callback(this,&Gamepad::a_isr));
eencae 1:6d25cd49059b 206 button_B->rise(callback(this,&Gamepad::b_isr));
eencae 1:6d25cd49059b 207 button_X->rise(callback(this,&Gamepad::x_isr));
eencae 1:6d25cd49059b 208 button_Y->rise(callback(this,&Gamepad::y_isr));
eencae 1:6d25cd49059b 209 button_L->rise(callback(this,&Gamepad::l_isr));
eencae 1:6d25cd49059b 210 button_R->rise(callback(this,&Gamepad::r_isr));
eencae 1:6d25cd49059b 211 button_start->rise(callback(this,&Gamepad::start_isr));
eencae 1:6d25cd49059b 212 button_back->rise(callback(this,&Gamepad::back_isr));
eencae 1:6d25cd49059b 213 }
eencae 1:6d25cd49059b 214
eencae 1:6d25cd49059b 215 // button interrupts ISRs
eencae 1:6d25cd49059b 216 void Gamepad::a_isr()
eencae 1:6d25cd49059b 217 {
eencae 1:6d25cd49059b 218 a_flag=1;
eencae 1:6d25cd49059b 219 }
eencae 1:6d25cd49059b 220 void Gamepad::b_isr()
eencae 1:6d25cd49059b 221 {
eencae 1:6d25cd49059b 222 b_flag=1;
eencae 1:6d25cd49059b 223 }
eencae 1:6d25cd49059b 224 void Gamepad::x_isr()
eencae 1:6d25cd49059b 225 {
eencae 1:6d25cd49059b 226 x_flag=1;
eencae 1:6d25cd49059b 227 }
eencae 1:6d25cd49059b 228 void Gamepad::y_isr()
eencae 1:6d25cd49059b 229 {
eencae 1:6d25cd49059b 230 y_flag=1;
eencae 1:6d25cd49059b 231 }
eencae 1:6d25cd49059b 232 void Gamepad::l_isr()
eencae 1:6d25cd49059b 233 {
eencae 1:6d25cd49059b 234 l_flag=1;
eencae 1:6d25cd49059b 235 }
eencae 1:6d25cd49059b 236 void Gamepad::r_isr()
eencae 1:6d25cd49059b 237 {
eencae 1:6d25cd49059b 238 r_flag=1;
eencae 1:6d25cd49059b 239 }
eencae 1:6d25cd49059b 240 void Gamepad::back_isr()
eencae 1:6d25cd49059b 241 {
eencae 1:6d25cd49059b 242 back_flag=1;
eencae 1:6d25cd49059b 243 }
eencae 1:6d25cd49059b 244 void Gamepad::start_isr()
eencae 1:6d25cd49059b 245 {
eencae 1:6d25cd49059b 246 start_flag=1;
eencae 1:6d25cd49059b 247 }