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:56:02 2016 +0000
Revision:
2:96191cfb9494
Parent:
1:9e0ee68a0487
Child:
4:a36aceb50612
My ELEC2645 Project Jefferson Sanchez 200883251

Who changed what in which revision?

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