This Class allows the joystick, buttons and petiometers to be implemented easily and coherently in other classes

Fork of Gamepad by Craig Evans

Committer:
domkay97
Date:
Sun Apr 16 13:45:22 2017 +0000
Revision:
24:7b149f5d4bef
Parent:
23:34da21dfdfd6
Child:
26:ccdf299b26c4
Tidying up and formatting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
domkay97 21:99ec20695524 1 #include "Controller.h"
domkay97 21:99ec20695524 2 #include "mbed.h"
domkay97 21:99ec20695524 3
domkay97 21:99ec20695524 4 //////////// constructor/destructor ////////////
domkay97 21:99ec20695524 5 Controller::Controller()
domkay97 21:99ec20695524 6 :
domkay97 21:99ec20695524 7 _led1(new PwmOut(PTA1)),
domkay97 21:99ec20695524 8 _led2(new PwmOut(PTA2)),
domkay97 21:99ec20695524 9 _led3(new PwmOut(PTC2)),
domkay97 21:99ec20695524 10 _led4(new PwmOut(PTC3)),
domkay97 21:99ec20695524 11 _led5(new PwmOut(PTC4)),
domkay97 21:99ec20695524 12 _led6(new PwmOut(PTD3)),
domkay97 21:99ec20695524 13
domkay97 21:99ec20695524 14 _button_A(new InterruptIn(PTB9)),
domkay97 21:99ec20695524 15 _button_B(new InterruptIn(PTD0)),
domkay97 21:99ec20695524 16 _button_X(new InterruptIn(PTC17)),
domkay97 21:99ec20695524 17 _button_Y(new InterruptIn(PTC12)),
domkay97 21:99ec20695524 18 _button_L(new InterruptIn(PTB18)),
domkay97 21:99ec20695524 19 _button_R(new InterruptIn(PTB3)),
domkay97 21:99ec20695524 20 _button_back(new InterruptIn(PTB19)),
domkay97 21:99ec20695524 21 _button_start(new InterruptIn(PTC5)),
domkay97 21:99ec20695524 22 _button_joystick(new InterruptIn(PTC16)),
domkay97 21:99ec20695524 23
domkay97 21:99ec20695524 24 _vert(new AnalogIn(PTB10)),
domkay97 21:99ec20695524 25 _horiz(new AnalogIn(PTB11)),
domkay97 21:99ec20695524 26
domkay97 21:99ec20695524 27 _buzzer(new PwmOut(PTC10)),
domkay97 21:99ec20695524 28 _pot(new AnalogIn(PTB2)),
domkay97 21:99ec20695524 29
domkay97 21:99ec20695524 30 _timeout(new Timeout()),
domkay97 21:99ec20695524 31
domkay97 24:7b149f5d4bef 32 _event_state(0)
domkay97 21:99ec20695524 33
domkay97 21:99ec20695524 34 {}
domkay97 21:99ec20695524 35
domkay97 21:99ec20695524 36 Controller::~Controller()
domkay97 21:99ec20695524 37 {
domkay97 21:99ec20695524 38 delete _led1,_led2,_led3,_led4,_led5,_led6;
domkay97 21:99ec20695524 39 delete _button_A,_button_B,_button_joystick,_vert,_horiz;
domkay97 21:99ec20695524 40 delete _button_X,_button_Y,_button_back,_button_start;
domkay97 21:99ec20695524 41 delete _button_L,_button_R, _buzzer, _pot, _timeout;
domkay97 21:99ec20695524 42 }
domkay97 21:99ec20695524 43
domkay97 21:99ec20695524 44 ///////////////// public methods /////////////////
domkay97 21:99ec20695524 45
domkay97 21:99ec20695524 46 void Controller::init()
domkay97 21:99ec20695524 47 {
domkay97 24:7b149f5d4bef 48 ledsOFF();
domkay97 21:99ec20695524 49 init_buttons();
domkay97 21:99ec20695524 50
domkay97 21:99ec20695524 51 // clear all flags
domkay97 21:99ec20695524 52 _event_state = 0;
domkay97 21:99ec20695524 53 }
domkay97 21:99ec20695524 54
domkay97 24:7b149f5d4bef 55 void Controller::ledsOFF()
domkay97 21:99ec20695524 56 {
domkay97 21:99ec20695524 57 leds(0.0);
domkay97 21:99ec20695524 58 }
domkay97 21:99ec20695524 59
domkay97 24:7b149f5d4bef 60 void Controller::ledsON()
domkay97 21:99ec20695524 61 {
domkay97 21:99ec20695524 62 leds(1.0);
domkay97 21:99ec20695524 63 }
domkay97 21:99ec20695524 64
domkay97 21:99ec20695524 65 void Controller::leds(float val) const
domkay97 21:99ec20695524 66 {
domkay97 21:99ec20695524 67 if (val < 0.0f) {
domkay97 21:99ec20695524 68 val = 0.0f;
domkay97 21:99ec20695524 69 }
domkay97 21:99ec20695524 70 if (val > 1.0f) {
domkay97 21:99ec20695524 71 val = 1.0f;
domkay97 21:99ec20695524 72 }
domkay97 24:7b149f5d4bef 73
domkay97 21:99ec20695524 74 // leds are active-low, so subtract from 1.0
domkay97 21:99ec20695524 75 // 0.0 corresponds to fully-off, 1.0 to fully-on
domkay97 21:99ec20695524 76 val = 1.0f - val;
domkay97 21:99ec20695524 77
domkay97 21:99ec20695524 78 _led1->write(val);
domkay97 21:99ec20695524 79 _led2->write(val);
domkay97 21:99ec20695524 80 _led3->write(val);
domkay97 21:99ec20695524 81 _led4->write(val);
domkay97 21:99ec20695524 82 _led5->write(val);
domkay97 21:99ec20695524 83 _led6->write(val);
domkay97 21:99ec20695524 84 }
domkay97 21:99ec20695524 85
domkay97 21:99ec20695524 86 void Controller::led(int n,float val) const
domkay97 21:99ec20695524 87 {
domkay97 21:99ec20695524 88 // ensure they are within vlaid range
domkay97 21:99ec20695524 89 if (val < 0.0f) {
domkay97 21:99ec20695524 90 val = 0.0f;
domkay97 21:99ec20695524 91 }
domkay97 21:99ec20695524 92 if (val > 1.0f) {
domkay97 21:99ec20695524 93 val = 1.0f;
domkay97 21:99ec20695524 94 }
domkay97 21:99ec20695524 95
domkay97 21:99ec20695524 96 switch (n) {
domkay97 21:99ec20695524 97
domkay97 21:99ec20695524 98 // check for valid LED number and set value
domkay97 21:99ec20695524 99
domkay97 21:99ec20695524 100 case 1:
domkay97 21:99ec20695524 101 _led1->write(1.0f-val); // active-low so subtract from 1
domkay97 21:99ec20695524 102 break;
domkay97 21:99ec20695524 103 case 2:
domkay97 21:99ec20695524 104 _led2->write(1.0f-val); // active-low so subtract from 1
domkay97 21:99ec20695524 105 break;
domkay97 21:99ec20695524 106 case 3:
domkay97 21:99ec20695524 107 _led3->write(1.0f-val); // active-low so subtract from 1
domkay97 21:99ec20695524 108 break;
domkay97 21:99ec20695524 109 case 4:
domkay97 21:99ec20695524 110 _led4->write(1.0f-val); // active-low so subtract from 1
domkay97 21:99ec20695524 111 break;
domkay97 21:99ec20695524 112 case 5:
domkay97 21:99ec20695524 113 _led5->write(1.0f-val); // active-low so subtract from 1
domkay97 21:99ec20695524 114 break;
domkay97 21:99ec20695524 115 case 6:
domkay97 21:99ec20695524 116 _led6->write(1.0f-val); // active-low so subtract from 1
domkay97 21:99ec20695524 117 break;
domkay97 21:99ec20695524 118
domkay97 21:99ec20695524 119 }
domkay97 21:99ec20695524 120 }
domkay97 21:99ec20695524 121
domkay97 24:7b149f5d4bef 122 float Controller::pot_value() const
domkay97 21:99ec20695524 123 {
domkay97 21:99ec20695524 124 return _pot->read();
domkay97 21:99ec20695524 125 }
domkay97 21:99ec20695524 126
domkay97 24:7b149f5d4bef 127 void Controller::sound(float frequency, float duration)
domkay97 21:99ec20695524 128 {
domkay97 21:99ec20695524 129 _buzzer->period(1.0f/frequency);
domkay97 21:99ec20695524 130 _buzzer->write(0.5); // 50% duty cycle - square wave
domkay97 24:7b149f5d4bef 131 _timeout->attach(callback(this, &Controller::sound_off), duration );
domkay97 21:99ec20695524 132 }
domkay97 21:99ec20695524 133
domkay97 21:99ec20695524 134 bool Controller::check_event(ControllerEvent const id)
domkay97 21:99ec20695524 135 {
domkay97 21:99ec20695524 136 // Check whether event flag is set
domkay97 21:99ec20695524 137 if (_event_state[id]) {
domkay97 21:99ec20695524 138 _event_state.reset(id); // clear flag
domkay97 21:99ec20695524 139 return true;
domkay97 21:99ec20695524 140 } else {
domkay97 21:99ec20695524 141 return false;
domkay97 21:99ec20695524 142 }
domkay97 21:99ec20695524 143 }
domkay97 21:99ec20695524 144
domkay97 21:99ec20695524 145 ///////////////////// private methods ////////////////////////
domkay97 21:99ec20695524 146
domkay97 24:7b149f5d4bef 147 void Controller::sound_off()
domkay97 21:99ec20695524 148 {
domkay97 21:99ec20695524 149 // called after timeout
domkay97 21:99ec20695524 150 _buzzer->write(0.0);
domkay97 21:99ec20695524 151 }
domkay97 21:99ec20695524 152
domkay97 21:99ec20695524 153 void Controller::init_buttons()
domkay97 21:99ec20695524 154 {
domkay97 21:99ec20695524 155 // turn on pull-downs as other side of button is connected to 3V3
domkay97 21:99ec20695524 156 // button is 0 when not pressed and 1 when pressed
domkay97 21:99ec20695524 157 _button_A->mode(PullDown);
domkay97 21:99ec20695524 158 _button_B->mode(PullDown);
domkay97 21:99ec20695524 159 _button_X->mode(PullDown);
domkay97 21:99ec20695524 160 _button_Y->mode(PullDown);
domkay97 21:99ec20695524 161 _button_back->mode(PullDown);
domkay97 21:99ec20695524 162 _button_start->mode(PullDown);
domkay97 21:99ec20695524 163 _button_L->mode(PullDown);
domkay97 21:99ec20695524 164 _button_R->mode(PullDown);
domkay97 21:99ec20695524 165 _button_joystick->mode(PullDown);
domkay97 21:99ec20695524 166 // therefore setup rising edge interrupts
domkay97 21:99ec20695524 167 _button_A->rise(callback(this,&Controller::a_isr));
domkay97 21:99ec20695524 168 _button_B->rise(callback(this,&Controller::b_isr));
domkay97 21:99ec20695524 169 _button_X->rise(callback(this,&Controller::x_isr));
domkay97 21:99ec20695524 170 _button_Y->rise(callback(this,&Controller::y_isr));
domkay97 21:99ec20695524 171 _button_L->rise(callback(this,&Controller::l_isr));
domkay97 21:99ec20695524 172 _button_R->rise(callback(this,&Controller::r_isr));
domkay97 21:99ec20695524 173 _button_start->rise(callback(this,&Controller::start_isr));
domkay97 21:99ec20695524 174 _button_back->rise(callback(this,&Controller::back_isr));
domkay97 21:99ec20695524 175 _button_joystick->rise(callback(this,&Controller::joy_isr));
domkay97 21:99ec20695524 176 }
domkay97 21:99ec20695524 177
domkay97 21:99ec20695524 178 // button interrupts ISRs
domkay97 21:99ec20695524 179 // Each of these simply sets the appropriate event bit in the _event_state
domkay97 21:99ec20695524 180 // variable
domkay97 21:99ec20695524 181 void Controller::a_isr()
domkay97 21:99ec20695524 182 {
domkay97 21:99ec20695524 183 _event_state.set(A_PRESSED);
domkay97 21:99ec20695524 184 }
domkay97 21:99ec20695524 185 void Controller::b_isr()
domkay97 21:99ec20695524 186 {
domkay97 21:99ec20695524 187 _event_state.set(B_PRESSED);
domkay97 21:99ec20695524 188 }
domkay97 21:99ec20695524 189 void Controller::x_isr()
domkay97 21:99ec20695524 190 {
domkay97 21:99ec20695524 191 _event_state.set(X_PRESSED);
domkay97 21:99ec20695524 192 }
domkay97 21:99ec20695524 193 void Controller::y_isr()
domkay97 21:99ec20695524 194 {
domkay97 21:99ec20695524 195 _event_state.set(Y_PRESSED);
domkay97 21:99ec20695524 196 }
domkay97 21:99ec20695524 197 void Controller::l_isr()
domkay97 21:99ec20695524 198 {
domkay97 21:99ec20695524 199 _event_state.set(L_PRESSED);
domkay97 21:99ec20695524 200 }
domkay97 21:99ec20695524 201 void Controller::r_isr()
domkay97 21:99ec20695524 202 {
domkay97 21:99ec20695524 203 _event_state.set(R_PRESSED);
domkay97 21:99ec20695524 204 }
domkay97 21:99ec20695524 205 void Controller::back_isr()
domkay97 21:99ec20695524 206 {
domkay97 21:99ec20695524 207 _event_state.set(BACK_PRESSED);
domkay97 21:99ec20695524 208 }
domkay97 21:99ec20695524 209 void Controller::start_isr()
domkay97 21:99ec20695524 210 {
domkay97 21:99ec20695524 211 _event_state.set(START_PRESSED);
domkay97 21:99ec20695524 212 }
domkay97 21:99ec20695524 213 void Controller::joy_isr()
domkay97 21:99ec20695524 214 {
domkay97 21:99ec20695524 215 _event_state.set(JOY_PRESSED);
domkay97 21:99ec20695524 216 }
domkay97 21:99ec20695524 217
domkay97 21:99ec20695524 218 int Controller::check_for_buttons() {
domkay97 21:99ec20695524 219 if (check_event(A_PRESSED)) {
domkay97 21:99ec20695524 220 return 1; }
domkay97 21:99ec20695524 221 else if (check_event(B_PRESSED)) {
domkay97 21:99ec20695524 222 return 2; }
domkay97 21:99ec20695524 223 else if (check_event(X_PRESSED)) {
domkay97 21:99ec20695524 224 return 3; }
domkay97 21:99ec20695524 225 else if (check_event(Y_PRESSED)) {
domkay97 21:99ec20695524 226 return 4; }
domkay97 22:2f5a009a82a6 227 else if (check_event(L_PRESSED)) {
domkay97 22:2f5a009a82a6 228 return 5; }
domkay97 22:2f5a009a82a6 229 else if (check_event(R_PRESSED)) {
domkay97 22:2f5a009a82a6 230 return 6; }
domkay97 22:2f5a009a82a6 231 else if (check_event(JOY_PRESSED)) {
domkay97 22:2f5a009a82a6 232 return 7; }
domkay97 21:99ec20695524 233 else {
domkay97 21:99ec20695524 234 return 0; }
domkay97 21:99ec20695524 235 }