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: mbed 4DGL-uLCD-SE SDFileSystem PinDetect
main.cpp@5:cf8ae4ca6f2b, 2022-04-25 (annotated)
- Committer:
- mmcdoanld81
- Date:
- Mon Apr 25 01:52:31 2022 +0000
- Revision:
- 5:cf8ae4ca6f2b
- Parent:
- 4:9a4d22a279b3
LAME-Michael McDonald
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| mmcdoanld81 | 5:cf8ae4ca6f2b | 1 | //Michael McDonald-LAME | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 2 | |
| 4180_1 | 0:cc87c48aa43c | 3 | #include "mbed.h" | 
| 4180_1 | 4:9a4d22a279b3 | 4 | #include "uLCD_4DGL.h" | 
| 4180_1 | 0:cc87c48aa43c | 5 | #include "PinDetect.h" | 
| 4180_1 | 2:58d85409f7ff | 6 | #include "Speaker.h" | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 7 | #include "MMA8452.h" | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 8 | #include "lame.h" | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 9 | #include <cstdlib> | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 10 | #include <ctime> | 
| 4180_1 | 0:cc87c48aa43c | 11 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 12 | PinDetect pbFire(p22); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 13 | Serial pc(USBTX,USBRX); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 14 | uLCD_4DGL uLCD(p9, p10, p11); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 15 | MMA8452 acc(p28, p27, 40000); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 16 | Speaker soundOut(p25); | 
| 4180_1 | 2:58d85409f7ff | 17 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 18 | //Create my objects | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 19 | Timer timeObject; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 20 | Ship shipObject; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 21 | Bullet bulletObject; | 
| 4180_1 | 0:cc87c48aa43c | 22 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 23 | // Pushbutton Function | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 24 | void pbFire_hit_callback(void) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 25 | soundOut.PlayNote(100, 0.05, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 26 | bulletObject.setBullet(true); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 27 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 28 | // Accelerometer Functions | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 29 | void setupAccelerometer(){ | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 30 | acc.setBitDepth(MMA8452::BIT_DEPTH_12); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 31 | acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 32 | acc.setDataRate(MMA8452::RATE_100); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 33 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 34 | double x = .01; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 35 | double y = .01; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 36 | double z = .01; | 
| 4180_1 | 0:cc87c48aa43c | 37 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 38 | void accInput(){ | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 39 | acc.readXYZGravity(&x,&y,&z); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 40 | if ((y>0.1)){ | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 41 | shipObject.moveLeft();} | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 42 | if ((y<-0.1)){ | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 43 | shipObject.moveRight();} | 
| 4180_1 | 2:58d85409f7ff | 44 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 45 | }; | 
| 4180_1 | 2:58d85409f7ff | 46 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 47 | int main() { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 48 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 49 | setupAccelerometer(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 50 | std::srand(time(0)); //seeded with time | 
| 4180_1 | 0:cc87c48aa43c | 51 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 52 | uLCD.display_control(LANDSCAPE_R); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 53 | uLCD.cls(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 54 | uLCD.baudrate(3000000); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 55 | wait(0.3); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 56 | uLCD.background_color(BLACK); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 57 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 58 | // Intro Screen Message | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 59 | uLCD.text_width(2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 60 | uLCD.text_height(2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 61 | uLCD.printf("HELP!\nTHEY ARE\nATTACKING"); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 62 | soundOut.PlayNote(100.0,0.15,0.2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 63 | soundOut.PlayNote(200.0,0.15,0.2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 64 | soundOut.PlayNote(300.0,0.15,0.2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 65 | soundOut.PlayNote(400.0,0.15,0.2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 66 | soundOut.PlayNote(300.0,0.15,0.2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 67 | soundOut.PlayNote(200.0,0.15,0.2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 68 | soundOut.PlayNote(100.0,0.15,0.2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 69 | wait(2.0); | 
| 4180_1 | 2:58d85409f7ff | 70 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 71 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 72 | pbFire.mode(PullUp); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 73 | pbFire.attach_deasserted(&pbFire_hit_callback); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 74 | pbFire.setSampleFrequency(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 75 | wait(.01); | 
| 4180_1 | 0:cc87c48aa43c | 76 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 77 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 78 | uLCD.cls(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 79 | ScreenObject *alienObject[6]; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 80 | alienObject[0] = new AlienBob(1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 81 | alienObject[1] = new AlienMike(2); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 82 | alienObject[2] = new AlienJeff(3); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 83 | alienObject[3] = new AlienBob(4); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 84 | alienObject[4] = new AlienMike(5); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 85 | alienObject[5] = new AlienAlice(6); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 86 | for (int i = 0; i < 6; i++) | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 87 | { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 88 | alienObject[i]->draw(uLCD); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 89 | alienObject[i]->setHit(false); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 90 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 91 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 92 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 93 | shipObject.draw(uLCD); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 94 | timeObject.start(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 95 | bool endGame = false; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 96 | int numberOfAliens = 6; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 97 | bool isHit[6] = {false}; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 98 | while (endGame == false) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 99 | accInput(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 100 | if (bulletObject.getBullet() == true) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 101 | bulletObject.fireBullet(shipObject,uLCD); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 102 | soundOut.PlayNote(100, 0.05, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 103 | soundOut.PlayNote(50, 0.05, 0.3); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 104 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 105 | //If the ship has a bullet, run this code | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 106 | while (bulletObject.getBullet() == true) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 107 | accInput(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 108 | shipObject.draw(uLCD); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 109 | bulletObject.update(uLCD); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 110 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 111 | for (int i = 0; i < 6; i++) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 112 | if (numberOfAliens < 1) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 113 | endGame = true; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 114 | break; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 115 | } | 
| 4180_1 | 2:58d85409f7ff | 116 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 117 | isHit[i] = (bulletObject.hitTest(*alienObject[i])); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 118 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 119 | if (isHit[i] == true){ | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 120 | alienObject[i]->setHit(true); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 121 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 122 | if (isHit[i] == true) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 123 | --numberOfAliens; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 124 | alienObject[i]->clearScreen(uLCD); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 125 | soundOut.PlayNote(200, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 126 | soundOut.PlayNote(350, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 127 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 128 | uLCD.filled_circle(bulletObject.getxBullet(), bulletObject.getyBullet(), 8, BLACK); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 129 | bulletObject.setBullet(false); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 130 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 131 | else | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 132 | if ((alienObject[i]->getHit()) == false) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 133 | alienObject[i]->update(uLCD); | 
| 4180_1 | 2:58d85409f7ff | 134 | } | 
| 4180_1 | 2:58d85409f7ff | 135 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 136 | wait(0.01); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 137 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 138 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 139 | while (bulletObject.getBullet() == false) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 140 | accInput(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 141 | if (numberOfAliens < 1) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 142 | endGame = true; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 143 | break; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 144 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 145 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 146 | shipObject.draw(uLCD); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 147 | for (int i = 0; i < 6; i++) { | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 148 | if ((alienObject[i]->getHit()) == false){ | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 149 | alienObject[i]->update(uLCD); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 150 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 151 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 152 | wait(0.01); | 
| 4180_1 | 2:58d85409f7ff | 153 | } | 
| 4180_1 | 0:cc87c48aa43c | 154 | } | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 155 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 156 | delete[] alienObject; | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 157 | timeObject.stop(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 158 | float total = timeObject.read(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 159 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 160 | //Winning sound | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 161 | soundOut.PlayNote(1200, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 162 | soundOut.PlayNote(900, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 163 | soundOut.PlayNote(600, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 164 | soundOut.PlayNote(300, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 165 | soundOut.PlayNote(100, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 166 | soundOut.PlayNote(300, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 167 | soundOut.PlayNote(600, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 168 | soundOut.PlayNote(900, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 169 | soundOut.PlayNote(1200, 0.1, 0.1); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 170 | |
| mmcdoanld81 | 5:cf8ae4ca6f2b | 171 | //Win Screen | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 172 | uLCD.cls(); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 173 | uLCD.printf("\n\n\n\n Congratulations!!\n\n Earth Saved!\n\n\n (%f\n Seconds)",total); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 174 | wait(4.0); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 175 | exit(0); | 
| mmcdoanld81 | 5:cf8ae4ca6f2b | 176 | }//end main |