Overview: The project is simple interactive game which utilized accelerometer to reading real time data and convert data into score. The project has one main cpp file and four header files. Four header files contain functions and variables to run the project.
Dependencies: MMA8452 N5110 PowerControl beep mbed
Game.h@9:522f9311ff4b, 2015-05-10 (annotated)
- Committer:
- stevenle93
- Date:
- Sun May 10 17:21:39 2015 +0000
- Revision:
- 9:522f9311ff4b
- Parent:
- 8:aebb468546c5
Changes: all header file are documented, changing in debounce function of all the buttons, little change with condition of putting mbed into sleep mode.;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
stevenle93 | 1:92f77de19aad | 1 | /** |
stevenle93 | 1:92f77de19aad | 2 | @file Game.h |
stevenle93 | 1:92f77de19aad | 3 | @brief Header file of the game rule which contain member functions, variables and functions definition |
stevenle93 | 9:522f9311ff4b | 4 | @brief Revision 1.0 |
stevenle93 | 9:522f9311ff4b | 5 | @author Huynh Minh Tuan Le |
stevenle93 | 9:522f9311ff4b | 6 | @date April 2015 |
stevenle93 | 1:92f77de19aad | 7 | */ |
stevenle93 | 1:92f77de19aad | 8 | |
stevenle93 | 1:92f77de19aad | 9 | #ifndef GAME_H |
stevenle93 | 1:92f77de19aad | 10 | #define GAME_H |
stevenle93 | 1:92f77de19aad | 11 | |
stevenle93 | 1:92f77de19aad | 12 | #include "mbed.h" |
stevenle93 | 1:92f77de19aad | 13 | #include "MMA8452.h" |
stevenle93 | 1:92f77de19aad | 14 | #include "N5110.h" |
stevenle93 | 2:57d1ed1f0ad3 | 15 | #include "Clock.h" |
stevenle93 | 1:92f77de19aad | 16 | |
stevenle93 | 9:522f9311ff4b | 17 | |
stevenle93 | 9:522f9311ff4b | 18 | Ticker gatimer; ///< Set a ticker for the game timing |
stevenle93 | 9:522f9311ff4b | 19 | int gatimerFlag = 0; ///< Declare game ISR flag as a integer type variable |
stevenle93 | 3:1974db5993ef | 20 | |
stevenle93 | 3:1974db5993ef | 21 | void gatimerExpired() |
stevenle93 | 3:1974db5993ef | 22 | { |
stevenle93 | 9:522f9311ff4b | 23 | gatimerFlag = 1; ///Set flag for timer of the game |
stevenle93 | 3:1974db5993ef | 24 | } |
stevenle93 | 1:92f77de19aad | 25 | |
stevenle93 | 9:522f9311ff4b | 26 | ///Game Class |
stevenle93 | 1:92f77de19aad | 27 | class Game |
stevenle93 | 1:92f77de19aad | 28 | { |
stevenle93 | 1:92f77de19aad | 29 | private: |
stevenle93 | 1:92f77de19aad | 30 | /** |
stevenle93 | 9:522f9311ff4b | 31 | * The acceleration variable recalled from MMA8452.h |
stevenle93 | 1:92f77de19aad | 32 | */ |
stevenle93 | 9:522f9311ff4b | 33 | Acceleration accel; ///Acceleration variable declared in MMA8452 class |
stevenle93 | 1:92f77de19aad | 34 | |
stevenle93 | 1:92f77de19aad | 35 | public: |
stevenle93 | 1:92f77de19aad | 36 | /** |
stevenle93 | 9:522f9311ff4b | 37 | * A function that contains condition of easy mode. |
stevenle93 | 9:522f9311ff4b | 38 | * The conditions: Threshold value of 2g - Time interval for reading data of 0.1s. |
stevenle93 | 1:92f77de19aad | 39 | */ |
stevenle93 | 3:1974db5993ef | 40 | void easyMode(); |
stevenle93 | 5:c0a58a6916f2 | 41 | /** |
stevenle93 | 9:522f9311ff4b | 42 | * A function that contains condition of normal mode. |
stevenle93 | 9:522f9311ff4b | 43 | * The conditions: Threshold value of 3g - Time interval for reading data of 0.2s. |
stevenle93 | 5:c0a58a6916f2 | 44 | */ |
stevenle93 | 3:1974db5993ef | 45 | void norMode(); |
stevenle93 | 5:c0a58a6916f2 | 46 | /** |
stevenle93 | 9:522f9311ff4b | 47 | * A functionthat contains condition of hard mode. |
stevenle93 | 9:522f9311ff4b | 48 | * The conditions: Threshold value of 3g - Time interval for reading data of 0.4s. |
stevenle93 | 5:c0a58a6916f2 | 49 | */ |
stevenle93 | 3:1974db5993ef | 50 | void hardMode(); |
stevenle93 | 5:c0a58a6916f2 | 51 | /** |
stevenle93 | 9:522f9311ff4b | 52 | * A global variable to store play score. |
stevenle93 | 9:522f9311ff4b | 53 | * This score will later transfer into an array. |
stevenle93 | 5:c0a58a6916f2 | 54 | */ |
stevenle93 | 4:c141e252d786 | 55 | int score; |
stevenle93 | 5:c0a58a6916f2 | 56 | /** |
stevenle93 | 9:522f9311ff4b | 57 | * An array to store set of scores. |
stevenle93 | 9:522f9311ff4b | 58 | * The array structure is as follow: |
stevenle93 | 9:522f9311ff4b | 59 | * Easy high score, Easy current score, Normal high score, Normal current score, Hard high score, Hard current score. |
stevenle93 | 5:c0a58a6916f2 | 60 | */ |
stevenle93 | 4:c141e252d786 | 61 | int scoArr[6]; |
stevenle93 | 5:c0a58a6916f2 | 62 | /** |
stevenle93 | 9:522f9311ff4b | 63 | * A function used to reset the game condition. |
stevenle93 | 5:c0a58a6916f2 | 64 | */ |
stevenle93 | 3:1974db5993ef | 65 | void reset(); |
stevenle93 | 5:c0a58a6916f2 | 66 | /** |
stevenle93 | 9:522f9311ff4b | 67 | * A funtion to draw a battery image when playing game. |
stevenle93 | 5:c0a58a6916f2 | 68 | */ |
stevenle93 | 5:c0a58a6916f2 | 69 | void battImag(); |
stevenle93 | 1:92f77de19aad | 70 | }; |
stevenle93 | 1:92f77de19aad | 71 | |
stevenle93 | 3:1974db5993ef | 72 | void Game::easyMode () |
stevenle93 | 1:92f77de19aad | 73 | { |
stevenle93 | 5:c0a58a6916f2 | 74 | lcd.printString("EASY MODE",16,0); //Displaying the title of difficulty level |
stevenle93 | 5:c0a58a6916f2 | 75 | lcd.drawRect(30,32,28,12,0); //Drawing an empty battery image |
stevenle93 | 5:c0a58a6916f2 | 76 | lcd.drawRect(59,36,1,4,1); //Drawing a tip of battery image |
stevenle93 | 3:1974db5993ef | 77 | if (gatimerFlag) { |
stevenle93 | 3:1974db5993ef | 78 | gatimerFlag = 0; |
stevenle93 | 3:1974db5993ef | 79 | accel = mma8452.readValues(); //Read the value from MMA8452 sensor |
stevenle93 | 5:c0a58a6916f2 | 80 | |
stevenle93 | 8:aebb468546c5 | 81 | if (accel.y > 2 || accel.y < -2) { //Easy mode: If the value of accelerator data exceed 2g, the score will increase by one unit |
stevenle93 | 3:1974db5993ef | 82 | score++; |
stevenle93 | 3:1974db5993ef | 83 | char scorebuffer[14]; |
stevenle93 | 4:c141e252d786 | 84 | sprintf(scorebuffer,"Score:%d",score); //Score will be displayed as unsigned Decimal Interger number |
stevenle93 | 4:c141e252d786 | 85 | lcd.printString(scorebuffer,6,3); |
stevenle93 | 5:c0a58a6916f2 | 86 | battImag(); |
stevenle93 | 1:92f77de19aad | 87 | } |
stevenle93 | 1:92f77de19aad | 88 | } |
stevenle93 | 9:522f9311ff4b | 89 | //Condition for storing "score" and transferring "score" between scoArr elements. |
stevenle93 | 9:522f9311ff4b | 90 | scoArr[1] = score; //Store "score" variable into 2nd element of scoArr array |
stevenle93 | 9:522f9311ff4b | 91 | if(scoArr[0] > scoArr[1]) { //If 1st element is greater than 2nd element, store in 2nd element |
stevenle93 | 4:c141e252d786 | 92 | scoArr[1] = score; |
stevenle93 | 9:522f9311ff4b | 93 | } else if(scoArr[0] < scoArr[1]) { //Vice versa, store in 1st element |
stevenle93 | 4:c141e252d786 | 94 | scoArr[0] = score; |
stevenle93 | 4:c141e252d786 | 95 | } |
stevenle93 | 1:92f77de19aad | 96 | } |
stevenle93 | 2:57d1ed1f0ad3 | 97 | |
stevenle93 | 3:1974db5993ef | 98 | void Game::norMode() |
stevenle93 | 3:1974db5993ef | 99 | { |
stevenle93 | 5:c0a58a6916f2 | 100 | lcd.printString("NORMAL MODE",9,0); //Displaying the title of difficulty level |
stevenle93 | 5:c0a58a6916f2 | 101 | lcd.drawRect(30,32,28,12,0); //Drawing an empty battery image |
stevenle93 | 5:c0a58a6916f2 | 102 | lcd.drawRect(59,36,1,4,1); //Drawing a tip of battery image |
stevenle93 | 3:1974db5993ef | 103 | if (gatimerFlag) { |
stevenle93 | 3:1974db5993ef | 104 | gatimerFlag = 0; |
stevenle93 | 3:1974db5993ef | 105 | accel = mma8452.readValues(); //Read the value from MMA8452 sensor |
stevenle93 | 5:c0a58a6916f2 | 106 | |
stevenle93 | 8:aebb468546c5 | 107 | if (accel.y > 3 || accel.y < -3) { //Normal mode: If the value of accelerator data exceed 3g, the score will increase by one unit |
stevenle93 | 3:1974db5993ef | 108 | score++; |
stevenle93 | 3:1974db5993ef | 109 | char scorebuffer[14]; |
stevenle93 | 4:c141e252d786 | 110 | sprintf(scorebuffer,"Score:%d",score); //Score will be displayed as unsigned Decimal Interger number |
stevenle93 | 4:c141e252d786 | 111 | lcd.printString(scorebuffer,6,3); |
stevenle93 | 5:c0a58a6916f2 | 112 | battImag(); |
stevenle93 | 3:1974db5993ef | 113 | } |
stevenle93 | 3:1974db5993ef | 114 | } |
stevenle93 | 9:522f9311ff4b | 115 | //Condition for storing "score" and transferring "score" between scoArr elements. |
stevenle93 | 9:522f9311ff4b | 116 | scoArr[3] = score; //Store "score" variable into 4th element of scoArr array |
stevenle93 | 9:522f9311ff4b | 117 | if(scoArr[2] > scoArr[3]) { //If 3rd element is greater than 4th element, store in 4th element |
stevenle93 | 4:c141e252d786 | 118 | scoArr[3] = score; |
stevenle93 | 9:522f9311ff4b | 119 | } else if(scoArr[2] < scoArr[3]) { //Vice versa, store in 3rd element |
stevenle93 | 4:c141e252d786 | 120 | scoArr[2] = score; |
stevenle93 | 4:c141e252d786 | 121 | } |
stevenle93 | 3:1974db5993ef | 122 | } |
stevenle93 | 3:1974db5993ef | 123 | |
stevenle93 | 3:1974db5993ef | 124 | void Game::hardMode() |
stevenle93 | 3:1974db5993ef | 125 | { |
stevenle93 | 5:c0a58a6916f2 | 126 | lcd.printString("HARD MODE",16,0); //Displaying the title of difficulty level |
stevenle93 | 5:c0a58a6916f2 | 127 | lcd.drawRect(30,32,28,12,0); //Drawing an empty battery image |
stevenle93 | 5:c0a58a6916f2 | 128 | lcd.drawRect(59,36,1,4,1); //Drawing a tip of battery image |
stevenle93 | 3:1974db5993ef | 129 | if (gatimerFlag) { |
stevenle93 | 3:1974db5993ef | 130 | gatimerFlag = 0; |
stevenle93 | 3:1974db5993ef | 131 | accel = mma8452.readValues(); //Read the value from MMA8452 sensor |
stevenle93 | 5:c0a58a6916f2 | 132 | |
stevenle93 | 8:aebb468546c5 | 133 | if (accel.y > 3.5 || accel.y < -3.5) { //Hard mode: If the value of accelerator data exceed 3.5g, the score will increase by one unit |
stevenle93 | 3:1974db5993ef | 134 | score++; |
stevenle93 | 3:1974db5993ef | 135 | char scorebuffer[14]; |
stevenle93 | 4:c141e252d786 | 136 | sprintf(scorebuffer,"Score:%d",score); //Score will be displayed as unsigned Decimal Interger number |
stevenle93 | 4:c141e252d786 | 137 | lcd.printString(scorebuffer,6,3); |
stevenle93 | 5:c0a58a6916f2 | 138 | battImag(); |
stevenle93 | 3:1974db5993ef | 139 | } |
stevenle93 | 3:1974db5993ef | 140 | } |
stevenle93 | 9:522f9311ff4b | 141 | //Condition for storing "score" and transferring "score" between scoArr elements. |
stevenle93 | 9:522f9311ff4b | 142 | scoArr[5] = score; //Store "score" variable into 6th element of scoArr array |
stevenle93 | 9:522f9311ff4b | 143 | if(scoArr[4] > scoArr[5]) { //If 5th element is greater than 6th element, store in 6th element |
stevenle93 | 4:c141e252d786 | 144 | scoArr[5] = score; |
stevenle93 | 9:522f9311ff4b | 145 | } else if(scoArr[4] < scoArr[5]) { //Vice versa, store in 5th element |
stevenle93 | 4:c141e252d786 | 146 | scoArr[4] = score; |
stevenle93 | 4:c141e252d786 | 147 | } |
stevenle93 | 3:1974db5993ef | 148 | } |
stevenle93 | 3:1974db5993ef | 149 | |
stevenle93 | 3:1974db5993ef | 150 | void Game::reset() |
stevenle93 | 2:57d1ed1f0ad3 | 151 | { |
stevenle93 | 2:57d1ed1f0ad3 | 152 | score = 0; |
stevenle93 | 2:57d1ed1f0ad3 | 153 | CClock = 60; |
stevenle93 | 2:57d1ed1f0ad3 | 154 | } |
stevenle93 | 3:1974db5993ef | 155 | |
stevenle93 | 5:c0a58a6916f2 | 156 | void Game::battImag() |
stevenle93 | 5:c0a58a6916f2 | 157 | { |
stevenle93 | 5:c0a58a6916f2 | 158 | if (score>20 && score<40) { |
stevenle93 | 5:c0a58a6916f2 | 159 | lcd.drawRect(32,34,3,8,1); |
stevenle93 | 5:c0a58a6916f2 | 160 | } |
stevenle93 | 5:c0a58a6916f2 | 161 | if (score>40 && score<60) { |
stevenle93 | 5:c0a58a6916f2 | 162 | lcd.drawRect(32,34,6,8,1); |
stevenle93 | 5:c0a58a6916f2 | 163 | } |
stevenle93 | 5:c0a58a6916f2 | 164 | if (score>60 && score<80) { |
stevenle93 | 5:c0a58a6916f2 | 165 | lcd.drawRect(32,34,9,8,1); |
stevenle93 | 5:c0a58a6916f2 | 166 | } |
stevenle93 | 5:c0a58a6916f2 | 167 | if (score>80 && score<100) { |
stevenle93 | 5:c0a58a6916f2 | 168 | lcd.drawRect(32,34,12,8,1); |
stevenle93 | 5:c0a58a6916f2 | 169 | } |
stevenle93 | 5:c0a58a6916f2 | 170 | if (score>100 && score<120) { |
stevenle93 | 5:c0a58a6916f2 | 171 | lcd.drawRect(32,34,15,8,1); |
stevenle93 | 5:c0a58a6916f2 | 172 | } |
stevenle93 | 5:c0a58a6916f2 | 173 | if (score>120 && score<140) { |
stevenle93 | 5:c0a58a6916f2 | 174 | lcd.drawRect(32,34,18,8,1); |
stevenle93 | 5:c0a58a6916f2 | 175 | } |
stevenle93 | 5:c0a58a6916f2 | 176 | if (score>140 && score<160) { |
stevenle93 | 5:c0a58a6916f2 | 177 | lcd.drawRect(32,34,21,8,1); |
stevenle93 | 5:c0a58a6916f2 | 178 | } |
stevenle93 | 5:c0a58a6916f2 | 179 | if (score>160) { |
stevenle93 | 5:c0a58a6916f2 | 180 | lcd.drawRect(32,34,24,8,1); |
stevenle93 | 5:c0a58a6916f2 | 181 | } |
stevenle93 | 5:c0a58a6916f2 | 182 | } |
stevenle93 | 5:c0a58a6916f2 | 183 | |
stevenle93 | 5:c0a58a6916f2 | 184 | |
stevenle93 | 1:92f77de19aad | 185 | #endif |