My ELEC2645 project. Nikollao Sulollari. 200804685
Dependencies: N5110 SoftPWM mbed
Revision 21:6b02ef341358, committed 2016-05-04
- Comitter:
- Nikollao
- Date:
- Wed May 04 09:19:50 2016 +0000
- Parent:
- 20:59aa6189a47d
- Commit message:
- Final Version for Submission! Well done!
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
main.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 59aa6189a47d -r 6b02ef341358 main.cpp --- a/main.cpp Mon May 02 17:57:27 2016 +0000 +++ b/main.cpp Wed May 04 09:19:50 2016 +0000 @@ -9,13 +9,11 @@ int main(void) { lcd.init(); ///initialise LED - init_K64F(); - init_serial(); + init_K64F(); ///init K64F + init_serial(); ///initiate connection with PC port init_game(); ///initialize game - led_output = fsm[fsm_state]; + led_output = fsm[fsm_state]; ///set FSM to turn on LEDs calibrateJoystick(); ///calibrate joystick - button.rise(&button_isr); ///assign rise with ISR - button1.rise(&button1_isr); game_ticker.attach(&game_timer_isr,0.2); ///attach ticker for the menu different from the main ticker menu(); @@ -24,46 +22,34 @@ ticker.attach(&timer_isr,game_speed); ///attach ticker with ISR. Speed is selected by the user reset = level; ///set reset = level to check later if level has increased - + g_button1_flag = 0; + timer.start(); while (1) { - + if (g_timer_flag) {///if timer flag is UP g_timer_flag = 0; ///reset flag - //g_button_flag = 0; lcd.clear(); + if (reset < level) { ///if level has increased + g_button1_flag = 0; ///reset weapon button + reset = level; ///update reset + rectY = 0; ///set enemies to default position + circleX = 0; + } guidance(); ///get guidance hero(); ///call hero enemies(); ///generate enemies obstacles(); ///generate obstacles - if (g_button1_flag) { ///if heavy weapon button is pressed - - g_button1_flag = 0; - rectY = 60; ///remove enemies from field - rectX = -10; - circleX = -10; - circleY = 100; - //timer.reset(); - //timer.start(); + //float count_time = timer.read(); + + if (g_button1_flag) { ///the blue LED indicates if the weapon is ready to use or not + blue_led = 0; + } else { + blue_led = 1; } - //float count_time = timer.read(); - if (reset < level) { ///if level has increased - reset = level; ///update reset - rectY = 0; ///remove enemies from field - circleX = 0; - } - if (g_button1_flag) { ///if heavy weapon button is pressed - - g_button1_flag = 0; - rectY = 60; ///remove enemies from field - rectX = -10; - circleX = -10; - circleY = 100; - //timer.reset(); - //timer.start(); - } + checkOverlap(); ///check is hero has overlapped with enemies or obstacles - updateJoystick(); + updateJoystick(); ///update joystick lcd.refresh(); } sleep();///use sleep and timer triggered interrupt to save power @@ -71,9 +57,7 @@ } - - - +//mbed functions void init_serial() @@ -95,7 +79,10 @@ // resistors that are enabled by default using InterruptIn sw2.mode(PullNone); sw3.mode(PullNone); - button.mode(PullDown); + + button.rise(&button_isr); ///assign rise with ISR + button1.rise(&button1_isr); + button.mode(PullDown); ///use PullDown mode button1.mode(PullDown); } @@ -144,102 +131,141 @@ void enemies() { /// generate enemies in the screen depending on the level of difficulty - if (level == 0) { + if (level == 0) { ///generate enemies at level 0 + + enemyRect(); + if (g_button1_flag == 0) { + enemyCircle(); + } + } else if (level == 1) {///generate enemies at level 1 enemyRect(); - enemyCircle(); - } else if (level == 1) { + if (g_button1_flag == 0) { + enemyCircle(); + } + } else if (level == 2) {///generate enemies at level 2 + + enemyRocket(); + if (g_button1_flag == 0) { + enemyCircle(); + } + } else if (level == 3) {///generate enemies at level 3 + + enemyRect(); + if (g_button1_flag == 0) { + enemyCircle(); + } + } else if (level == 4) {///generate enemies at level 4 enemyRect(); - enemyCircle(); - } else if (level == 2) { - + if (g_button1_flag == 0) { + enemyCircle(); + } + } else if (level == 5) {///generate enemies at level 5 enemyRocket(); - } else if (level == 3) { - - enemyRect(); + if (g_button1_flag == 0) { + enemyCircle(); + } + } else if (level == 6) {///generate enemies at level 6 + enemyRocket(); + if (g_button1_flag == 0) { + enemyCircle(); + } + } else if (level == 7) {///generate enemies at level 7 + enemyRocket(); enemyCircle(); - } else if (level == 4) { - - enemyRect(); - enemyCircle(); - } else if (level == 5) { - enemyRocket(); - } else if (level == 6) { - enemyRocket(); - enemyCircle(); + if (g_button1_flag == 1) {///if button1 is pressed don't allow to use at level 7 + g_button1_flag = 0; + lcd.clear(); + lcd.printString("Can't use now!",0,0); + lcd.refresh(); + wait(1); + lcd.clear(); + } } - else if (level == 7) { - enemyRocket(); - enemyCircle(); - } + } void enemyRect() { - ///generate rect shape enemy + ///generate rectangular shape enemy lcd.drawRect(rectX,rectY,5,4,1); - if (g_button1_flag == 0) { - rectX = rectX + rand()%4 - 2; - rectY++; ///enemy moving towards hero + + rectX = rectX + rand()%4 - 2; + rectY++; ///enemy moving towards hero - if (rectY > 50) { - rectY = 0; - } - if (rectX > 75 || rectX < 25) { - rectX = 40+rand()%6 - 3; - } + if (rectY > 50) {///set boundaries for enemy position + rectY = 0; + } + if (rectX > 75 || rectX < 25) { + rectX = 40+rand()%6 - 3; } } -void enemyRocket() { +void enemyRocket() { ///generate a "rocket-like" enemy lcd.drawRect(rectX,rectY,2,7,1); lcd.drawCircle(rectX+1,rectY+1,2,1); lcd.drawLine(rectX-2,rectY+2,rectX,rectY-1,1); lcd.drawLine(rectX+2,rectY+2,rectX,rectY-1,1); - - if (g_button1_flag == 0) { - rectX = rectX + rand()%4 - 2; - rectY++; ///enemy moving towards hero + + rectX = rectX + rand()%4 - 2; + rectY++; ///enemy moving towards hero + + if (rectY > 50) {///set boundaries for position of enemy + rectY = 0; + } + if (rectX > 75 || rectX < 10) { + rectX = 40+rand()%6 - 3; + } +} - if (rectY > 50) { - rectY = 0; - } - if (rectX > 75 || rectX < 10) { - rectX = 40+rand()%6 - 3; - } +void enemyCircle() +{ + ///generate circle shape enemy + lcd.drawCircle(circleX,circleY,4,1); + circleY = circleY + rand() %4 - 2; + + if (circleY <= 10) { ///set the boundaries of the enemy + circleY = 20; } + if (circleY >= 35) { + circleY = 35; + } + if (circleX > 84) { + circleX = 0; + } + circleX++; ///enemy moving towards hero } void hero() { ///cotrol hero - if (joystick.direction == RIGHT) { + if (joystick.direction == RIGHT) { ///joystick direction points to the right heroX--; - } else if (joystick.direction == LEFT) { + } else if (joystick.direction == LEFT) {///joystick direction points to the left heroX++; } else { heroX = heroX; } - if (joystick.direction == UP) { + if (joystick.direction == UP) {///joystick direction points to the top heroY--; - } else if (joystick.direction == DOWN) { + } else if (joystick.direction == DOWN) {///joystick direction points down heroY++; } else { - heroY = heroY; + heroY = heroY; ///joystick is centred } - if (joystick.direction == UP_LEFT) { + if (joystick.direction == UP_LEFT) { ///joystick direction points up and left heroY--; heroX++; - } else if (joystick.direction == UP_RIGHT) { + } else if (joystick.direction == UP_RIGHT) { ///joystick direction points up and right heroY--; heroX--; - } else if (joystick.direction == DOWN_RIGHT) { + } else if (joystick.direction == DOWN_RIGHT) {///joystick direction points down and right heroY++; heroX--; - } else if (joystick.direction == DOWN_LEFT) { + } else if (joystick.direction == DOWN_LEFT) {///joystick direction points down and left heroY++; heroX++; } @@ -253,39 +279,20 @@ } if (heroY < -45) { ///if hero has reached the top of the screen heroY = 0; ///hero goes back to the bottom of the screen - level++; ///level increases by 1 + g_button1_flag = 0; + level++; ///increase level of the game } if (heroY >= 0) {/// hero cannot go to previous level heroY = 0; } ///draw hero - lcd.drawLine(40+heroX, 47+heroY, 48+heroX, 43+heroY,1); + lcd.drawLine(40+heroX, 47+heroY, 48+heroX, 43+heroY,1); ///variables heroX and heroY are used to control the direction of the hero lcd.drawLine(40+heroX, 43+heroY,48+heroX, 47+heroY,1); lcd.drawLine(44+heroX, 45+heroY,44+heroX, 41+heroY,1); lcd.drawCircle(44+heroX, 39+heroY,2,0); } -void enemyCircle() -{ - ///generate circle shape enemy - lcd.drawCircle(circleX,circleY,4,1); - circleY = circleY + rand() %4 - 2; - - if (g_button1_flag == 0) { - if (circleY <= 10) { - circleY = 20; - } - if (circleY >= 35) { - circleY = 35; - } - if (circleX > 84) { - circleX = 0; - } - circleX++; ///enemy moving towards hero - } -} - void init_game() { ///initialise game @@ -300,42 +307,47 @@ lcd.printString("Treasure Hunt!",1,3); lcd.refresh(); //timeout.attach(&timeout_isr,3); - //sleep(); - wait(3); + // sleep(); + wait(3); ///small delay prints welcome message lcd.clear(); } void guidance() { - /// show arrow to act as guidance towards the treasure - if (level < 7) { ///check level of difficulty - - lcd.drawLine(42,0,42,4,1); + if (level < 7) { lcd.drawLine(42,0,40,2,1); lcd.drawLine(42,0,44,2,1); - } else if (level == 7) { + lcd.drawLine(42,0,42,3,1); + } + /// function acts as guidance towards the treasure + else if (level == 7) { lcd.printString("F",42,0); /// print the treasure icon } else if (level == 8) { - + + timer.stop(); ///stop timer + timer.reset(); + float win_time = timer.read();///value reads the time taken to win the game + char win[80]; ///create an array of chars + sprintf(win,"Time:%.2f sec",win_time); ///create string ticker.detach(); - game_ticker.attach(&game_timer_isr,0.2); + game_ticker.attach(&game_timer_isr,0.2); lcd.clear(); lcd.printString("Well done!",0,0); lcd.refresh(); wait(2); lcd.clear(); - lcd.printString("You 're a WINNER!",0,0); - wait(2); + lcd.printString(win,0,0); ///print the time taken to win the game on screen + wait(3); lcd.clear(); - lcd.printString("Play again!",0,0); + lcd.printString("Play again!",0,0); ///provide play again option lcd.drawCircle(70,4,2,1); lcd.refresh(); g_button_flag = 0; while(1) { - if (g_button1_flag) { - + if (g_button1_flag) { ///if button1 is pressed + ///reset g_button1_flag = 0; level = 0; lcd.clear(); @@ -352,7 +364,8 @@ { /// place obstacles in the screen /// as level difficulty increases, more obstacles are added - if (level == 0) { + + if (level == 0) { ///obstacles are located in the ground and they change from one level to another lcd.drawRect(10,15,2,2,1); lcd.drawRect(74,15,2,2,1); @@ -364,11 +377,11 @@ lcd.drawRect(74,28,2,2,1); } else if (level == 2) { - lcd.drawCircle(37,25,5,0); - lcd.drawCircle(47,25,5,0); - lcd.drawCircle(42,11,3,1); - lcd.drawCircle(37,25,3,1); - lcd.drawCircle(47,25,3,1); + lcd.drawCircle(25,25,5,0); + lcd.drawCircle(65,25,5,0); + lcd.drawCircle(45,11,3,1); + lcd.drawCircle(25,25,3,1); + lcd.drawCircle(65,25,3,1); lcd.drawRect(80,2,2,42,1); lcd.drawRect(2,2,2,42,1); @@ -384,7 +397,7 @@ lcd.drawRect(52,30,2,2,1); } else if (level == 4) { - lcd.drawRect(5+rand() %4 - 2 ,12+rand() %4 - 2,2,2,1); + lcd.drawRect(5+rand() %4 - 2 ,12+rand() %4 - 2,2,2,1); ///make obstacles moveable by adding a small random variance in position lcd.drawRect(79 + rand() %4 - 2,12 + rand() %4 - 2,2,2,1); lcd.drawRect(5+ rand() %4 - 2,30+rand() %4 - 2 ,2,2,1); lcd.drawRect(79 + rand() %4 - 2,30+rand() %4 - 2,2,2,1); @@ -526,10 +539,10 @@ option++; break; } - if (option < 0) { + if (option < 0) { /// if the last (down) option is set for selection and user presses joystick down, selector moves at the top option = 2; } - if (option > 2) { + if (option > 2) { /// if the first (up) option is set for selection and user presses joystick up, selector moves at the bottom option = 0; } @@ -564,24 +577,24 @@ lcd.printString("Game speed",0,0); ///print settings menu lcd.printString("Lcd:Inverse",0,1); lcd.printString("Sound:ON",0,2); - lcd.printString("Back",0,3); + lcd.printString("Back",0,4); } else { lcd.printString("Game speed",0,0); ///print settings menu lcd.printString("Lcd:Inverse",0,1); lcd.printString("Sound:OFF",0,2); - lcd.printString("Back",0,3); + lcd.printString("Back",0,4); } } else { if (sound) { lcd.printString("Game speed",0,0); ///print settings menu lcd.printString("Lcd:Normal",0,1); lcd.printString("Sound:ON",0,2); - lcd.printString("Back",0,3); + lcd.printString("Back",0,4); } else { lcd.printString("Game speed",0,0); ///print settings menu lcd.printString("Lcd:Normal",0,1); lcd.printString("Sound:OFF",0,2); - lcd.printString("Back",0,3); + lcd.printString("Back",0,4); } } switch (joystick.direction) { @@ -610,7 +623,7 @@ } else if (option == 2) { lcd.drawCircle(70,20,2,1); } else { - lcd.drawCircle(35,27,2,1); + lcd.drawCircle(35,36,2,1); } if (g_button_flag) { ///if button is pressed g_button_flag = 0; ///reset button @@ -624,20 +637,20 @@ updateJoystick(); lcd.clear(); if (speed == 0) { - lcd.printString("Slow!",0,0); ///print game speed menu + lcd.printString("Slow<",0,0); ///print game speed menu lcd.printString("Normal",0,1); lcd.printString("Fast",0,2); - lcd.printString("Back",0,3); + lcd.printString("Back",0,4); } else if (speed == 1) { - lcd.printString("Slow",0,0); ///print game speed menu - lcd.printString("Normal!",0,1); + lcd.printString("Slow",0,0); //print game speed menu + lcd.printString("Normal<",0,1); lcd.printString("Fast",0,2); - lcd.printString("Back",0,3); + lcd.printString("Back",0,4); } else if (speed == 2) { - lcd.printString("Slow",0,0); ///print game speed menu + lcd.printString("Slow",0,0); //print game speed menu lcd.printString("Normal",0,1); - lcd.printString("Fast!",0,2); - lcd.printString("Back",0,3); + lcd.printString("Fast<",0,2); + lcd.printString("Back",0,4); } switch (joystick.direction) { @@ -665,20 +678,20 @@ } else if (option == 2) { lcd.drawCircle(35,20,2,1); } else { - lcd.drawCircle(35,27,2,1); + lcd.drawCircle(35,36,2,1); } if (g_button_flag) { g_button_flag = 0; if (option == 0) { - game_speed = 0.1; + game_speed = 0.1; ///slow speed = 0; } else if (option == 1) { - game_speed = 0.05; + game_speed = 0.05; ///normal speed = 1; } else if (option == 2) { - game_speed = 0.04; + game_speed = 0.04; ///fast speed = 2; } else if (option == 3) { break; @@ -699,10 +712,13 @@ sound =! sound; - if (sound) - buzzer.write(0.5); - else + if (sound) { + //buzzer.write(0.5); + // buzzer.period(1/4000); + } + else { buzzer.write(0.0); + } // buzzer.period(1/400); } else if(option == 3) { ///go back to main menu break; @@ -753,19 +769,19 @@ void checkOverlap() { - for (int i=40+heroX; i<50+heroX; i++) { + for (int i=40+heroX; i<50+heroX; i++) { ///loop follows the hero and checks for overlap around him for (int j=35+heroY; j<48+heroY; j++) { - int check = intersection(i,j); + int check = intersection(i,j); ///int gets number of pixels around the hero //lcd.setPixel(i,j); char bit[50]; sprintf(bit,"Pixels: %d",check); - for(int i = 40; i < 50; i++) { + for(int i = 40; i < 50; i++) { ///provides safety if hero is in default position he doesn't get killed by enemies for (int j = 35; j < 47; j++) { - if (lcd.getPixel(i,j) && check > 6) { + if (lcd.getPixel(i,j) && check > 6) { ///6 is the offset of the neigbours, as hero has his own neighbours pixels check = 6; } } @@ -773,14 +789,20 @@ if (check > 7) { tries--; //if tries - - lcd.printString("BANG!",0,0); + lcd.printString("BANG!",0,0); ///Bang message is displayed when overlap has occured + if (sound) { + buzzer.write(0.5); + //buzzer.pulsewidth(0.9); + } else { + buzzer.write(0.0); + } lcd.refresh(); wait(2); lcd.clear(); if (tries == 2) { - + + g_button1_flag = 0; lcd.printString("Ready.",20,1); lcd.refresh(); wait(0.5); @@ -790,29 +812,33 @@ lcd.printString("Ready...",20,1); lcd.refresh(); wait(1); - lcd.printString("GO!",31,2); + lcd.printString("GO!",31,3); lcd.refresh(); wait(1); lcd.clear(); fsm_state = 1; ///2 lives left } else if (tries == 1) { - + + g_button1_flag = 0; lcd.clear(); lcd.printString("Last Chance!",10,2); lcd.refresh(); wait(1); fsm_state = 2; //1 life left } else if (tries == 0) { - + + g_button1_flag = 0; fsm_state = 3; led_output=fsm[fsm_state]; lcd.clear(); lcd.printString("Game Over!",10,2); + timer.stop(); + timer.reset(); lcd.refresh(); wait(2); ticker.detach(); - game_ticker.attach(&game_timer_isr,0.2); + game_ticker.attach(&game_timer_isr,0.2); ///attach a slower ticker to save power while not playing lcd.clear(); lcd.printString("Play again!",0,0); lcd.drawCircle(70,4,2,1); @@ -820,19 +846,21 @@ g_button_flag = 0; while(1) { - if (g_button1_flag) { + if (g_button1_flag) { ///if button1 is pressed - g_button1_flag = 0; - level = 0; + g_button1_flag = 0; ///reset button1 flag + level = 0; ///reset parameters tries = 3; fsm_state = 0; led_output=fsm[fsm_state]; + buzzer.write(0.0); lcd.clear(); + ///reset values heroX = 0; heroY = 0; rectY = 0; circleX = 0; - main(); + main(); ///call main } sleep(); } @@ -843,25 +871,15 @@ rectY = 0; circleX = 0; led_output=fsm[fsm_state]; + buzzer.write(0.0); } } } } -void error() -{ - /// display error message - while (1) { - - lcd.printString("Error!",0,0); - r_led = 0; - wait(0.2); - r_led = 1; - wait(0.2); - } -} +
diff -r 59aa6189a47d -r 6b02ef341358 main.h --- a/main.h Mon May 02 17:57:27 2016 +0000 +++ b/main.h Wed May 04 09:19:50 2016 +0000 @@ -21,37 +21,37 @@ DigitalOut r_led(LED_RED); /** -@nameSpace g_led +@namespace g_led @brief output for status of green LED */ DigitalOut g_led(LED_GREEN); /** -@nameSpace b_led +@namespace b_led @brief output for status of blue LED */ DigitalOut b_led(LED_BLUE); /** -@nameSpace blue_led +@namespace blue_led @brief output for status of blue LED, lights when game tool is loaded */ DigitalOut blue_led(PTA1); /** -@nameSpace led_output +@namespace led_output @brief output for status of left tries for the user to win the game */ BusOut led_output(PTC2,PTA2,PTB23); /** -@nameSpace lcd +@namespace lcd @brief object of the N5110 class */ N5110 lcd(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3); /** -@nameSpace pc +@namespace pc @brief serial connection between mbed and pc */ Serial pc(USBTX,USBRX); @@ -62,62 +62,62 @@ /** -@nameSpace xPot +@namespace xPot @brief read x-axis position from the value of the joystick */ AnalogIn xPot(PTB2); /** -@nameSpace yPot +@namespace yPot @brief read y-axis position from the value of the joystick */ AnalogIn yPot(PTB3); /** -@nameSpace button +@namespace button @brief interrupt executes an event triggered task */ InterruptIn button(PTB10); /** -@nameSpace button +@namespace button @brief interrupt executes an event triggered task */ InterruptIn button1(PTB18); /** -@nameSpace buzzer -@brief create PWM signal to set buzzer duty cycle and period +@namespace buzzer +@brief create PWM signal using the SoftPWM library to set buzzer duty cycle and period */ SoftPWM buzzer(PTB9); /** -@nameSpace ticker +@namespace ticker @brief interrupt executes a time-triggered task */ Ticker ticker; /** -@nameSpace timer +@namespace timer @brief interface is used to measure the time between start and stop */ Timer timer; /** -@nameSpace game_ticker +@namespace game_ticker @brief interrupt executes a time-triggered task */ Ticker game_ticker; /** -@nameSpace timeout +@namespace timeout @brief interrupt calls a function after a specified amount of time */ Timeout timeout; /** -@nameSpace DirectionName +@namespace DirectionName @brief define joystick's direction based on its x,y values */ enum DirectionName { @@ -133,7 +133,7 @@ }; /** -@nameSpace Joystick +@namespace Joystick @brief create strcut Joystick */ typedef struct JoyStick Joystick; @@ -148,14 +148,12 @@ /// create struct variable Joystick joystick; +/** +The main function where the program takes place +*/ int main(); /** -Displays an error message -*/ -void error(); - -/** set-up serial port */ void init_serial(); @@ -273,7 +271,7 @@ Check for intrersection @param i loops through x direction @param j loops through y direction -@returns the number of pixels aroun the hero detected +@returns the number of pixels around the hero detected */ int intersection(int i, int j); @@ -331,8 +329,6 @@ int state1 = 1; /*!< controls the direction of the objtacle */ -//int menuY = 5; /*!< controls the position of the circle selector */ - int speed = 1; /*!< controls the speed menu display */ bool normal=0; /*!< controls the lcd mode selection on menu */