ELEC2645 (2015/16) / Mbed 2 deprecated el14jpps_2645_Ping_Pong_Project

Dependencies:   N5110 Ping_Pong beep mbed Servo

Committer:
el14jpps
Date:
Wed May 04 23:27:07 2016 +0000
Revision:
0:bf56ee79c09e
Child:
1:9e0ee68a0487
el14jpps_2645_Project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el14jpps 0:bf56ee79c09e 1 /**
el14jpps 0:bf56ee79c09e 2 On this code the main has been used as at the pricipal code for the menu and the funtions needed for the selection are brought from their original folders... e.g Pong and Game of life.
el14jpps 0:bf56ee79c09e 3 Revision 1.0.
el14jpps 0:bf56ee79c09e 4 @author Jefferson Sanchez
el14jpps 0:bf56ee79c09e 5 @date April 2016
el14jpps 0:bf56ee79c09e 6 */
el14jpps 0:bf56ee79c09e 7
el14jpps 0:bf56ee79c09e 8 #include "N5110.h" // Author Dr Evans
el14jpps 0:bf56ee79c09e 9 #include "mbed.h" // Arm
el14jpps 0:bf56ee79c09e 10 #include "beep.h" // Author Peter Drescher
el14jpps 0:bf56ee79c09e 11 #include "Game_of_life.h"//Jefferson Sanchez
el14jpps 0:bf56ee79c09e 12 #include "menu.h" //Jefferson Sanchez
el14jpps 0:bf56ee79c09e 13
el14jpps 0:bf56ee79c09e 14 //This changes the tolerance of joystick direction
el14jpps 0:bf56ee79c09e 15 #define DIRECTION_TOLERANCE 0.010L
el14jpps 0:bf56ee79c09e 16
el14jpps 0:bf56ee79c09e 17 // LEDs connections
el14jpps 0:bf56ee79c09e 18 DigitalOut red_led(LED_RED);
el14jpps 0:bf56ee79c09e 19 DigitalOut green_led(LED_GREEN);
el14jpps 0:bf56ee79c09e 20 DigitalOut blue_led(LED_BLUE);
el14jpps 0:bf56ee79c09e 21
el14jpps 0:bf56ee79c09e 22 //Buttons
el14jpps 0:bf56ee79c09e 23 DigitalIn button(PTB11);
el14jpps 0:bf56ee79c09e 24 InterruptIn switch2(SW3);
el14jpps 0:bf56ee79c09e 25 //Joystick
el14jpps 0:bf56ee79c09e 26 AnalogIn xPot(PTB2);
el14jpps 0:bf56ee79c09e 27 AnalogIn yPot(PTB3);
el14jpps 0:bf56ee79c09e 28 DigitalOut yellow(PTA1);
el14jpps 0:bf56ee79c09e 29 DigitalOut green(PTC2);
el14jpps 0:bf56ee79c09e 30 //LCD
el14jpps 0:bf56ee79c09e 31 N5110 display(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3);
el14jpps 0:bf56ee79c09e 32 // Timer to regularly read the joystick.
el14jpps 0:bf56ee79c09e 33 Ticker pollJoystick;
el14jpps 0:bf56ee79c09e 34 // Serial used For debugging Inputs and Outputs.
el14jpps 0:bf56ee79c09e 35 Serial serial(USBTX,USBRX);
el14jpps 0:bf56ee79c09e 36
el14jpps 0:bf56ee79c09e 37 volatile int g_switch2_flag = 0;
el14jpps 0:bf56ee79c09e 38 void switch2_isr();
el14jpps 0:bf56ee79c09e 39
el14jpps 0:bf56ee79c09e 40 // Used for to show the direction of the joystick.
el14jpps 0:bf56ee79c09e 41 enum DirectionName {
el14jpps 0:bf56ee79c09e 42 UP,
el14jpps 0:bf56ee79c09e 43 DOWN,
el14jpps 0:bf56ee79c09e 44 LEFT,
el14jpps 0:bf56ee79c09e 45 RIGHT,
el14jpps 0:bf56ee79c09e 46 CENTRE,
el14jpps 0:bf56ee79c09e 47 UNKNOWN
el14jpps 0:bf56ee79c09e 48 };
el14jpps 0:bf56ee79c09e 49
el14jpps 0:bf56ee79c09e 50 // Struct for Joystick
el14jpps 0:bf56ee79c09e 51 typedef struct JoyStick Joystick;
el14jpps 0:bf56ee79c09e 52 struct JoyStick {
el14jpps 0:bf56ee79c09e 53 float x; // current x value
el14jpps 0:bf56ee79c09e 54 float x0; // 'centred' x value
el14jpps 0:bf56ee79c09e 55 float y; // current y value
el14jpps 0:bf56ee79c09e 56 float y0; // 'centred' y value
el14jpps 0:bf56ee79c09e 57 int button;
el14jpps 0:bf56ee79c09e 58
el14jpps 0:bf56ee79c09e 59 int switch2; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
el14jpps 0:bf56ee79c09e 60 DirectionName direction; // current direction
el14jpps 0:bf56ee79c09e 61 };
el14jpps 0:bf56ee79c09e 62
el14jpps 0:bf56ee79c09e 63 /// Tone for the push button
el14jpps 0:bf56ee79c09e 64
el14jpps 0:bf56ee79c09e 65 Joystick joystick;
el14jpps 0:bf56ee79c09e 66
el14jpps 0:bf56ee79c09e 67 // function prototypes
el14jpps 0:bf56ee79c09e 68 int printFlag = 0;
el14jpps 0:bf56ee79c09e 69 int Option_seclected = 1;
el14jpps 0:bf56ee79c09e 70 int star = 1;
el14jpps 0:bf56ee79c09e 71 void light();
el14jpps 0:bf56ee79c09e 72 void light()
el14jpps 0:bf56ee79c09e 73 {
el14jpps 0:bf56ee79c09e 74
el14jpps 0:bf56ee79c09e 75 display.setBrightness(0);
el14jpps 0:bf56ee79c09e 76 wait(0.3);
el14jpps 0:bf56ee79c09e 77 display.setBrightness(1);
el14jpps 0:bf56ee79c09e 78 wait(0.5);
el14jpps 0:bf56ee79c09e 79 display.setBrightness(0);
el14jpps 0:bf56ee79c09e 80 wait(0.3);
el14jpps 0:bf56ee79c09e 81 display.setBrightness(1);
el14jpps 0:bf56ee79c09e 82 wait(0.5);
el14jpps 0:bf56ee79c09e 83 display.setBrightness(0);
el14jpps 0:bf56ee79c09e 84 wait(0.3);
el14jpps 0:bf56ee79c09e 85 display.setBrightness(1);
el14jpps 0:bf56ee79c09e 86 wait(0.5);
el14jpps 0:bf56ee79c09e 87 display.setBrightness(0);
el14jpps 0:bf56ee79c09e 88 wait(0.3);
el14jpps 0:bf56ee79c09e 89 display.setBrightness(1);
el14jpps 0:bf56ee79c09e 90
el14jpps 0:bf56ee79c09e 91
el14jpps 0:bf56ee79c09e 92 }
el14jpps 0:bf56ee79c09e 93 int main()
el14jpps 0:bf56ee79c09e 94 {
el14jpps 0:bf56ee79c09e 95 menu_intro();
el14jpps 0:bf56ee79c09e 96 calibrateJoystick(); // get centred values of joystick
el14jpps 0:bf56ee79c09e 97 pollJoystick.attach(&updateJoystick,0.23); // read joystick 10 times per second
el14jpps 0:bf56ee79c09e 98 switch2.fall(&switch2_isr);
el14jpps 0:bf56ee79c09e 99 switch2.mode(PullUp);
el14jpps 0:bf56ee79c09e 100 while(1) {
el14jpps 0:bf56ee79c09e 101 if(joystick.direction == DOWN) {
el14jpps 0:bf56ee79c09e 102 star=0;
el14jpps 0:bf56ee79c09e 103 serial.printf("up\n");
el14jpps 0:bf56ee79c09e 104 /** the following leds will light up to give a visual*/
el14jpps 0:bf56ee79c09e 105 blue_led =1;
el14jpps 0:bf56ee79c09e 106 red_led= 1;
el14jpps 0:bf56ee79c09e 107 green_led = 0;
el14jpps 0:bf56ee79c09e 108
el14jpps 0:bf56ee79c09e 109 } else if (joystick.direction == CENTRE) {
el14jpps 0:bf56ee79c09e 110 serial.printf(" middle\n");
el14jpps 0:bf56ee79c09e 111 star=1;
el14jpps 0:bf56ee79c09e 112 blue_led=0;
el14jpps 0:bf56ee79c09e 113 red_led =1;
el14jpps 0:bf56ee79c09e 114 green_led=1;
el14jpps 0:bf56ee79c09e 115
el14jpps 0:bf56ee79c09e 116 } else if (joystick.direction == UP) {
el14jpps 0:bf56ee79c09e 117 star=2;
el14jpps 0:bf56ee79c09e 118 red_led= 0;
el14jpps 0:bf56ee79c09e 119 blue_led =1;
el14jpps 0:bf56ee79c09e 120 green_led = 1;
el14jpps 0:bf56ee79c09e 121
el14jpps 0:bf56ee79c09e 122
el14jpps 0:bf56ee79c09e 123 }
el14jpps 0:bf56ee79c09e 124 switch(Option_seclected) {
el14jpps 0:bf56ee79c09e 125 case 0:
el14jpps 0:bf56ee79c09e 126 display.clear();
el14jpps 0:bf56ee79c09e 127 display.printString("=-- MENU --=",6,1);
el14jpps 0:bf56ee79c09e 128 display.printString("PING PONG[o]",5,2);
el14jpps 0:bf56ee79c09e 129 display.printString("G of Life",5,3);
el14jpps 0:bf56ee79c09e 130 display.printString("Credits",5,4);
el14jpps 0:bf56ee79c09e 131 buzzer.beep(500,0.5);
el14jpps 0:bf56ee79c09e 132 serial.printf("ping pong \n");
el14jpps 0:bf56ee79c09e 133 /**
el14jpps 0:bf56ee79c09e 134 *As shown bellow I have used a interrupt for the g_switch2_flag to show that the selection can be done using two diferent methods.
el14jpps 0:bf56ee79c09e 135 This funtion is controlled by the sw2 switch.
el14jpps 0:bf56ee79c09e 136 */
el14jpps 0:bf56ee79c09e 137 if (g_switch2_flag) {
el14jpps 0:bf56ee79c09e 138 g_switch2_flag = 0;
el14jpps 0:bf56ee79c09e 139 pongGame();
el14jpps 0:bf56ee79c09e 140 }
el14jpps 0:bf56ee79c09e 141 /**
el14jpps 0:bf56ee79c09e 142 * As described above the button funtion is controlled by PTB11 Joy stick button
el14jpps 0:bf56ee79c09e 143 */
el14jpps 0:bf56ee79c09e 144 if(button==1) { // if it is a external switch then it needs to be a 1
el14jpps 0:bf56ee79c09e 145 serial.printf("button == 1 ping pong has been selected\n ");
el14jpps 0:bf56ee79c09e 146 tone1();
el14jpps 0:bf56ee79c09e 147 yellow =1;
el14jpps 0:bf56ee79c09e 148 light();
el14jpps 0:bf56ee79c09e 149 pongGame();
el14jpps 0:bf56ee79c09e 150 }
el14jpps 0:bf56ee79c09e 151
el14jpps 0:bf56ee79c09e 152 switch (star) {
el14jpps 0:bf56ee79c09e 153 case 0 :
el14jpps 0:bf56ee79c09e 154 Option_seclected = 2;
el14jpps 0:bf56ee79c09e 155
el14jpps 0:bf56ee79c09e 156 break;
el14jpps 0:bf56ee79c09e 157 case 1:
el14jpps 0:bf56ee79c09e 158 Option_seclected =0;
el14jpps 0:bf56ee79c09e 159
el14jpps 0:bf56ee79c09e 160 break;
el14jpps 0:bf56ee79c09e 161 case 2:
el14jpps 0:bf56ee79c09e 162 Option_seclected =1;
el14jpps 0:bf56ee79c09e 163
el14jpps 0:bf56ee79c09e 164 break;
el14jpps 0:bf56ee79c09e 165 }
el14jpps 0:bf56ee79c09e 166 break;
el14jpps 0:bf56ee79c09e 167 case 1:
el14jpps 0:bf56ee79c09e 168 display.clear();
el14jpps 0:bf56ee79c09e 169
el14jpps 0:bf56ee79c09e 170 display.printString("-=- MENU -=-",6,1);
el14jpps 0:bf56ee79c09e 171 display.printString("PING PONG",5,2);
el14jpps 0:bf56ee79c09e 172 display.printString("G of Life[.]",5,3);
el14jpps 0:bf56ee79c09e 173 display.printString("Credits ",5,4);
el14jpps 0:bf56ee79c09e 174 buzzer.beep(500,0.5);
el14jpps 0:bf56ee79c09e 175 serial.printf("g of life\n");
el14jpps 0:bf56ee79c09e 176
el14jpps 0:bf56ee79c09e 177 if(button==1) {// if it is a external switch then it needs to be a 1
el14jpps 0:bf56ee79c09e 178
el14jpps 0:bf56ee79c09e 179 serial.printf("button ==1 game of life has been selected \n");
el14jpps 0:bf56ee79c09e 180 tone2();
el14jpps 0:bf56ee79c09e 181 green=1;
el14jpps 0:bf56ee79c09e 182 light();
el14jpps 0:bf56ee79c09e 183 gameOfLife();
el14jpps 0:bf56ee79c09e 184
el14jpps 0:bf56ee79c09e 185 }
el14jpps 0:bf56ee79c09e 186 switch (star) {
el14jpps 0:bf56ee79c09e 187 case 0 :
el14jpps 0:bf56ee79c09e 188 Option_seclected = 0;
el14jpps 0:bf56ee79c09e 189
el14jpps 0:bf56ee79c09e 190 break;
el14jpps 0:bf56ee79c09e 191 case 1:
el14jpps 0:bf56ee79c09e 192 Option_seclected =1;
el14jpps 0:bf56ee79c09e 193
el14jpps 0:bf56ee79c09e 194 break;
el14jpps 0:bf56ee79c09e 195 case 2:
el14jpps 0:bf56ee79c09e 196 Option_seclected =2;
el14jpps 0:bf56ee79c09e 197
el14jpps 0:bf56ee79c09e 198 break;
el14jpps 0:bf56ee79c09e 199 }
el14jpps 0:bf56ee79c09e 200 break;
el14jpps 0:bf56ee79c09e 201 case 2:
el14jpps 0:bf56ee79c09e 202 display.clear();
el14jpps 0:bf56ee79c09e 203 display.printString("--= MENU =--",6,1);
el14jpps 0:bf56ee79c09e 204 display.printString("PING PONG ",5,2);
el14jpps 0:bf56ee79c09e 205 display.printString("G of Life ",5,3);
el14jpps 0:bf56ee79c09e 206 display.printString("Credits [*]",5,4);
el14jpps 0:bf56ee79c09e 207 buzzer.beep(500,0.5);
el14jpps 0:bf56ee79c09e 208 serial.printf("credits \n");
el14jpps 0:bf56ee79c09e 209
el14jpps 0:bf56ee79c09e 210 if (button==1) {
el14jpps 0:bf56ee79c09e 211 light();
el14jpps 0:bf56ee79c09e 212 display.clear();
el14jpps 0:bf56ee79c09e 213 display.printString("Thank you ",2,1);
el14jpps 0:bf56ee79c09e 214 buzzer.beep(1000,0.5);
el14jpps 0:bf56ee79c09e 215 wait(1);
el14jpps 0:bf56ee79c09e 216 display.printString(" for ",2,2);
el14jpps 0:bf56ee79c09e 217 buzzer.beep(1000,0.5);
el14jpps 0:bf56ee79c09e 218 wait(1);
el14jpps 0:bf56ee79c09e 219 display.printString(" playing ",2,3);
el14jpps 0:bf56ee79c09e 220 buzzer.beep(1000,0.5);
el14jpps 0:bf56ee79c09e 221 wait(1);
el14jpps 0:bf56ee79c09e 222 display.printString("see you later ",2,4);
el14jpps 0:bf56ee79c09e 223 buzzer.beep(1000,0.5);
el14jpps 0:bf56ee79c09e 224
el14jpps 0:bf56ee79c09e 225 wait(1);
el14jpps 0:bf56ee79c09e 226 }
el14jpps 0:bf56ee79c09e 227 switch (star) {
el14jpps 0:bf56ee79c09e 228 case 0 :
el14jpps 0:bf56ee79c09e 229 Option_seclected = 1;
el14jpps 0:bf56ee79c09e 230 break;
el14jpps 0:bf56ee79c09e 231 case 1:
el14jpps 0:bf56ee79c09e 232 Option_seclected =2;
el14jpps 0:bf56ee79c09e 233 break;
el14jpps 0:bf56ee79c09e 234 case 2:
el14jpps 0:bf56ee79c09e 235 Option_seclected =0;
el14jpps 0:bf56ee79c09e 236
el14jpps 0:bf56ee79c09e 237 break;
el14jpps 0:bf56ee79c09e 238 }
el14jpps 0:bf56ee79c09e 239 break;
el14jpps 0:bf56ee79c09e 240
el14jpps 0:bf56ee79c09e 241 }
el14jpps 0:bf56ee79c09e 242 sleep();
el14jpps 0:bf56ee79c09e 243 }
el14jpps 0:bf56ee79c09e 244 }
el14jpps 0:bf56ee79c09e 245 void calibrateJoystick()
el14jpps 0:bf56ee79c09e 246 {
el14jpps 0:bf56ee79c09e 247 button.mode(PullDown);
el14jpps 0:bf56ee79c09e 248
el14jpps 0:bf56ee79c09e 249
el14jpps 0:bf56ee79c09e 250 joystick.y0 = yPot;
el14jpps 0:bf56ee79c09e 251 joystick.x0 = xPot;
el14jpps 0:bf56ee79c09e 252 }
el14jpps 0:bf56ee79c09e 253 void updateJoystick()
el14jpps 0:bf56ee79c09e 254 {
el14jpps 0:bf56ee79c09e 255 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
el14jpps 0:bf56ee79c09e 256
el14jpps 0:bf56ee79c09e 257 joystick.y = yPot - joystick.y0;
el14jpps 0:bf56ee79c09e 258 joystick.x = xPot - joystick.x0;
el14jpps 0:bf56ee79c09e 259 // read button state
el14jpps 0:bf56ee79c09e 260 joystick.button = button ;
el14jpps 0:bf56ee79c09e 261
el14jpps 0:bf56ee79c09e 262 // calculate direction depending on x,y values
el14jpps 0:bf56ee79c09e 263 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
el14jpps 0:bf56ee79c09e 264 if ( fabs(joystick.y) < DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 265 joystick.direction = CENTRE;
el14jpps 0:bf56ee79c09e 266 } else if ( joystick.y > DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 267 joystick.direction = UP;
el14jpps 0:bf56ee79c09e 268 } else if ( joystick.y < DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 269 joystick.direction = DOWN;
el14jpps 0:bf56ee79c09e 270 } else if ( joystick.x > DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 271 joystick.direction = RIGHT;
el14jpps 0:bf56ee79c09e 272 } else if ( joystick.x < DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 273 joystick.direction = LEFT;
el14jpps 0:bf56ee79c09e 274 } else {
el14jpps 0:bf56ee79c09e 275 joystick.direction = UNKNOWN;
el14jpps 0:bf56ee79c09e 276 }
el14jpps 0:bf56ee79c09e 277 printFlag = 1;
el14jpps 0:bf56ee79c09e 278 }
el14jpps 0:bf56ee79c09e 279 void switch2_isr()
el14jpps 0:bf56ee79c09e 280 {
el14jpps 0:bf56ee79c09e 281 g_switch2_flag = 1;
el14jpps 0:bf56ee79c09e 282 }
el14jpps 0:bf56ee79c09e 283