Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: N5110 Ping_Pong beep mbed Servo
main.cpp@9:80898ce9d4d5, 2017-04-15 (annotated)
- Committer:
- el14jpps
- Date:
- Sat Apr 15 18:47:27 2017 +0000
- Revision:
- 9:80898ce9d4d5
- Parent:
- 6:70830f1ed62e
sencod
Who changed what in which revision?
User | Revision | Line number | New 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 |