ELEC2645 (2015/16) / Mbed 2 deprecated el14jpps_2645_Ping_Pong_Project

Dependencies:   N5110 Ping_Pong beep mbed Servo

Committer:
el14jpps
Date:
Sat Apr 15 18:47:27 2017 +0000
Revision:
9:80898ce9d4d5
Parent:
6:70830f1ed62e
sencod

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