ELEC2645 (2015/16) / Mbed 2 deprecated el14jpps_2645_Ping_Pong_Project

Dependencies:   N5110 Ping_Pong beep mbed Servo

Committer:
el14jpps
Date:
Thu May 05 11:56:13 2016 +0000
Revision:
5:722864843189
Parent:
4:a36aceb50612
Child:
6:70830f1ed62e
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 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 0:bf56ee79c09e 134 buzzer.beep(500,0.5);
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 0:bf56ee79c09e 143 }
el14jpps 0:bf56ee79c09e 144 /**
el14jpps 0:bf56ee79c09e 145 * As described above the button funtion is controlled by PTB11 Joy stick button
el14jpps 0:bf56ee79c09e 146 */
el14jpps 0:bf56ee79c09e 147 if(button==1) { // if it is a external switch then it needs to be a 1
el14jpps 0:bf56ee79c09e 148 serial.printf("button == 1 ping pong has been selected\n ");
el14jpps 0:bf56ee79c09e 149 tone1();
el14jpps 0:bf56ee79c09e 150 yellow =1;
el14jpps 0:bf56ee79c09e 151 light();
el14jpps 0:bf56ee79c09e 152 pongGame();
el14jpps 0:bf56ee79c09e 153 }
el14jpps 0:bf56ee79c09e 154
el14jpps 0:bf56ee79c09e 155 switch (star) {
el14jpps 0:bf56ee79c09e 156 case 0 :
el14jpps 0:bf56ee79c09e 157 Option_seclected = 2;
el14jpps 0:bf56ee79c09e 158
el14jpps 0:bf56ee79c09e 159 break;
el14jpps 0:bf56ee79c09e 160 case 1:
el14jpps 0:bf56ee79c09e 161 Option_seclected =0;
el14jpps 0:bf56ee79c09e 162
el14jpps 0:bf56ee79c09e 163 break;
el14jpps 0:bf56ee79c09e 164 case 2:
el14jpps 0:bf56ee79c09e 165 Option_seclected =1;
el14jpps 0:bf56ee79c09e 166
el14jpps 0:bf56ee79c09e 167 break;
el14jpps 0:bf56ee79c09e 168 }
el14jpps 0:bf56ee79c09e 169 break;
el14jpps 0:bf56ee79c09e 170 case 1:
el14jpps 0:bf56ee79c09e 171 display.clear();
el14jpps 0:bf56ee79c09e 172
el14jpps 0:bf56ee79c09e 173 display.printString("-=- MENU -=-",6,1);
el14jpps 0:bf56ee79c09e 174 display.printString("PING PONG",5,2);
el14jpps 0:bf56ee79c09e 175 display.printString("G of Life[.]",5,3);
el14jpps 0:bf56ee79c09e 176 display.printString("Credits ",5,4);
el14jpps 0:bf56ee79c09e 177 buzzer.beep(500,0.5);
el14jpps 0:bf56ee79c09e 178 serial.printf("g of life\n");
el14jpps 0:bf56ee79c09e 179
el14jpps 0:bf56ee79c09e 180 if(button==1) {// if it is a external switch then it needs to be a 1
el14jpps 0:bf56ee79c09e 181
el14jpps 0:bf56ee79c09e 182 serial.printf("button ==1 game of life has been selected \n");
el14jpps 0:bf56ee79c09e 183 tone2();
el14jpps 0:bf56ee79c09e 184 green=1;
el14jpps 0:bf56ee79c09e 185 light();
el14jpps 0:bf56ee79c09e 186 gameOfLife();
el14jpps 0:bf56ee79c09e 187
el14jpps 0:bf56ee79c09e 188 }
el14jpps 0:bf56ee79c09e 189 switch (star) {
el14jpps 0:bf56ee79c09e 190 case 0 :
el14jpps 0:bf56ee79c09e 191 Option_seclected = 0;
el14jpps 0:bf56ee79c09e 192
el14jpps 0:bf56ee79c09e 193 break;
el14jpps 0:bf56ee79c09e 194 case 1:
el14jpps 0:bf56ee79c09e 195 Option_seclected =1;
el14jpps 0:bf56ee79c09e 196
el14jpps 0:bf56ee79c09e 197 break;
el14jpps 0:bf56ee79c09e 198 case 2:
el14jpps 0:bf56ee79c09e 199 Option_seclected =2;
el14jpps 0:bf56ee79c09e 200
el14jpps 0:bf56ee79c09e 201 break;
el14jpps 0:bf56ee79c09e 202 }
el14jpps 0:bf56ee79c09e 203 break;
el14jpps 0:bf56ee79c09e 204 case 2:
el14jpps 0:bf56ee79c09e 205 display.clear();
el14jpps 0:bf56ee79c09e 206 display.printString("--= MENU =--",6,1);
el14jpps 0:bf56ee79c09e 207 display.printString("PING PONG ",5,2);
el14jpps 0:bf56ee79c09e 208 display.printString("G of Life ",5,3);
el14jpps 0:bf56ee79c09e 209 display.printString("Credits [*]",5,4);
el14jpps 0:bf56ee79c09e 210 buzzer.beep(500,0.5);
el14jpps 0:bf56ee79c09e 211 serial.printf("credits \n");
el14jpps 0:bf56ee79c09e 212
el14jpps 0:bf56ee79c09e 213 if (button==1) {
el14jpps 0:bf56ee79c09e 214 light();
el14jpps 0:bf56ee79c09e 215 display.clear();
el14jpps 0:bf56ee79c09e 216 display.printString("Thank you ",2,1);
el14jpps 0:bf56ee79c09e 217 buzzer.beep(1000,0.5);
el14jpps 0:bf56ee79c09e 218 wait(1);
el14jpps 0:bf56ee79c09e 219 display.printString(" for ",2,2);
el14jpps 0:bf56ee79c09e 220 buzzer.beep(1000,0.5);
el14jpps 0:bf56ee79c09e 221 wait(1);
el14jpps 0:bf56ee79c09e 222 display.printString(" playing ",2,3);
el14jpps 0:bf56ee79c09e 223 buzzer.beep(1000,0.5);
el14jpps 0:bf56ee79c09e 224 wait(1);
el14jpps 0:bf56ee79c09e 225 display.printString("see you later ",2,4);
el14jpps 0:bf56ee79c09e 226 buzzer.beep(1000,0.5);
el14jpps 0:bf56ee79c09e 227
el14jpps 0:bf56ee79c09e 228 wait(1);
el14jpps 0:bf56ee79c09e 229 }
el14jpps 0:bf56ee79c09e 230 switch (star) {
el14jpps 0:bf56ee79c09e 231 case 0 :
el14jpps 0:bf56ee79c09e 232 Option_seclected = 1;
el14jpps 0:bf56ee79c09e 233 break;
el14jpps 0:bf56ee79c09e 234 case 1:
el14jpps 0:bf56ee79c09e 235 Option_seclected =2;
el14jpps 0:bf56ee79c09e 236 break;
el14jpps 0:bf56ee79c09e 237 case 2:
el14jpps 0:bf56ee79c09e 238 Option_seclected =0;
el14jpps 0:bf56ee79c09e 239
el14jpps 0:bf56ee79c09e 240 break;
el14jpps 0:bf56ee79c09e 241 }
el14jpps 0:bf56ee79c09e 242 break;
el14jpps 0:bf56ee79c09e 243
el14jpps 0:bf56ee79c09e 244 }
el14jpps 0:bf56ee79c09e 245 sleep();
el14jpps 0:bf56ee79c09e 246 }
el14jpps 0:bf56ee79c09e 247 }
el14jpps 0:bf56ee79c09e 248 void calibrateJoystick()
el14jpps 0:bf56ee79c09e 249 {
el14jpps 0:bf56ee79c09e 250 button.mode(PullDown);
el14jpps 0:bf56ee79c09e 251
el14jpps 0:bf56ee79c09e 252
el14jpps 0:bf56ee79c09e 253 joystick.y0 = yPot;
el14jpps 0:bf56ee79c09e 254 joystick.x0 = xPot;
el14jpps 0:bf56ee79c09e 255 }
el14jpps 0:bf56ee79c09e 256 void updateJoystick()
el14jpps 0:bf56ee79c09e 257 {
el14jpps 0:bf56ee79c09e 258 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
el14jpps 0:bf56ee79c09e 259
el14jpps 0:bf56ee79c09e 260 joystick.y = yPot - joystick.y0;
el14jpps 0:bf56ee79c09e 261 joystick.x = xPot - joystick.x0;
el14jpps 0:bf56ee79c09e 262 // read button state
el14jpps 0:bf56ee79c09e 263 joystick.button = button ;
el14jpps 0:bf56ee79c09e 264
el14jpps 0:bf56ee79c09e 265 // calculate direction depending on x,y values
el14jpps 0:bf56ee79c09e 266 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
el14jpps 0:bf56ee79c09e 267 if ( fabs(joystick.y) < DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 268 joystick.direction = CENTRE;
el14jpps 0:bf56ee79c09e 269 } else if ( joystick.y > DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 270 joystick.direction = UP;
el14jpps 0:bf56ee79c09e 271 } else if ( joystick.y < DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 272 joystick.direction = DOWN;
el14jpps 0:bf56ee79c09e 273 } else if ( joystick.x > DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 274 joystick.direction = RIGHT;
el14jpps 0:bf56ee79c09e 275 } else if ( joystick.x < DIRECTION_TOLERANCE) {
el14jpps 0:bf56ee79c09e 276 joystick.direction = LEFT;
el14jpps 0:bf56ee79c09e 277 } else {
el14jpps 0:bf56ee79c09e 278 joystick.direction = UNKNOWN;
el14jpps 0:bf56ee79c09e 279 }
el14jpps 0:bf56ee79c09e 280 printFlag = 1;
el14jpps 0:bf56ee79c09e 281 }
el14jpps 0:bf56ee79c09e 282 void switch2_isr()
el14jpps 0:bf56ee79c09e 283 {
el14jpps 0:bf56ee79c09e 284 g_switch2_flag = 1;
el14jpps 0:bf56ee79c09e 285 }
el14jpps 0:bf56ee79c09e 286