Program is a work in progress
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed-rtos mbed wave_player
Fork of 4180_Lab4_v6 by
main.cpp@1:e84085bbf399, 2016-10-30 (annotated)
- Committer:
- ecardenas8
- Date:
- Sun Oct 30 04:39:01 2016 +0000
- Revision:
- 1:e84085bbf399
- Parent:
- 0:9f1095365b9a
Program is a work in progress
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
swilliams346 | 0:9f1095365b9a | 1 | #include "mbed.h" |
swilliams346 | 0:9f1095365b9a | 2 | #include "rtos.h" |
swilliams346 | 0:9f1095365b9a | 3 | #include "uLCD_4DGL.h" |
swilliams346 | 0:9f1095365b9a | 4 | uLCD_4DGL uLCD(p28, p27, p30); |
swilliams346 | 0:9f1095365b9a | 5 | #include "Robot.h" |
swilliams346 | 0:9f1095365b9a | 6 | #include "Nav_Switch.h" |
swilliams346 | 0:9f1095365b9a | 7 | #include "Speaker.h" |
swilliams346 | 0:9f1095365b9a | 8 | #include "wave_player.h" |
swilliams346 | 0:9f1095365b9a | 9 | #include "SDFileSystem.h" |
ecardenas8 | 1:e84085bbf399 | 10 | |
ecardenas8 | 1:e84085bbf399 | 11 | |
swilliams346 | 0:9f1095365b9a | 12 | BusOut mbedleds(LED1,LED2,LED3,LED4); |
swilliams346 | 0:9f1095365b9a | 13 | Robot myRobot; |
swilliams346 | 0:9f1095365b9a | 14 | Nav_Switch myNav( p21, p22, p23, p24, p25); |
swilliams346 | 0:9f1095365b9a | 15 | Mutex stdio_mutex; |
swilliams346 | 0:9f1095365b9a | 16 | AnalogOut DACout(p18); // used to play sound on speaker |
swilliams346 | 0:9f1095365b9a | 17 | wave_player waver(&DACout); |
swilliams346 | 0:9f1095365b9a | 18 | SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card setup |
ecardenas8 | 1:e84085bbf399 | 19 | |
ecardenas8 | 1:e84085bbf399 | 20 | |
swilliams346 | 0:9f1095365b9a | 21 | //Wiring Set-up: |
swilliams346 | 0:9f1095365b9a | 22 | //Speaker: p18 |
swilliams346 | 0:9f1095365b9a | 23 | //SD Card: DO=p6,SCK=p7,DI=p5,CS=p8,VCC=Vout,GND=GND |
swilliams346 | 0:9f1095365b9a | 24 | //Thumb-Stick: U=p25,C=p24,L=p23,D=p22,R=p21,+=pVout,-=GND |
swilliams346 | 0:9f1095365b9a | 25 | bool Alive = 1; |
swilliams346 | 0:9f1095365b9a | 26 | bool Drown = 0; |
swilliams346 | 0:9f1095365b9a | 27 | bool Car = 0; |
swilliams346 | 0:9f1095365b9a | 28 | int i = 11; |
swilliams346 | 0:9f1095365b9a | 29 | int j = 11; |
swilliams346 | 0:9f1095365b9a | 30 | int C1 = 11; |
swilliams346 | 0:9f1095365b9a | 31 | int C2 = 32; |
swilliams346 | 0:9f1095365b9a | 32 | int C3 = 53; |
swilliams346 | 0:9f1095365b9a | 33 | int C4 = 74; |
swilliams346 | 0:9f1095365b9a | 34 | int C5 = 95; |
swilliams346 | 0:9f1095365b9a | 35 | int C6 = 116; |
swilliams346 | 0:9f1095365b9a | 36 | int Position1 = 90; |
swilliams346 | 0:9f1095365b9a | 37 | int Position2 = 90; |
swilliams346 | 0:9f1095365b9a | 38 | int Rate1 = 3; |
swilliams346 | 0:9f1095365b9a | 39 | |
swilliams346 | 0:9f1095365b9a | 40 | void AutoPilot_thread(void const *argument) |
swilliams346 | 0:9f1095365b9a | 41 | { |
swilliams346 | 0:9f1095365b9a | 42 | while(Alive) { |
swilliams346 | 0:9f1095365b9a | 43 | //Auto-pilot Testing |
swilliams346 | 0:9f1095365b9a | 44 | Thread::wait(500); |
swilliams346 | 0:9f1095365b9a | 45 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 46 | myRobot.drawEraser(); |
swilliams346 | 0:9f1095365b9a | 47 | myRobot.moveForward(); |
swilliams346 | 0:9f1095365b9a | 48 | myRobot.drawFrog(); |
swilliams346 | 0:9f1095365b9a | 49 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 50 | |
swilliams346 | 0:9f1095365b9a | 51 | if(myRobot.getYPosition() == 53){ //Check dangers on Traffic 2 Row 3 |
swilliams346 | 0:9f1095365b9a | 52 | } |
swilliams346 | 0:9f1095365b9a | 53 | if(myRobot.getYPosition() == 74){ //Check dangers on water Row 4 |
swilliams346 | 0:9f1095365b9a | 54 | if(myRobot.getXPosition() == 53 || myRobot.getXPosition() == 74 || myRobot.getXPosition() == 116){ |
swilliams346 | 0:9f1095365b9a | 55 | Alive = 0; |
swilliams346 | 0:9f1095365b9a | 56 | Drown = 1; |
swilliams346 | 0:9f1095365b9a | 57 | |
swilliams346 | 0:9f1095365b9a | 58 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 59 | myRobot.drawDrown1(); |
swilliams346 | 0:9f1095365b9a | 60 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 61 | Thread::wait(50); |
swilliams346 | 0:9f1095365b9a | 62 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 63 | myRobot.drawDrown2(); |
swilliams346 | 0:9f1095365b9a | 64 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 65 | Thread::wait(50); |
swilliams346 | 0:9f1095365b9a | 66 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 67 | myRobot.drawDrown3(); |
swilliams346 | 0:9f1095365b9a | 68 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 69 | Thread::wait(50); |
swilliams346 | 0:9f1095365b9a | 70 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 71 | myRobot.drawDrown4(); |
swilliams346 | 0:9f1095365b9a | 72 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 73 | Thread::wait(50); |
swilliams346 | 0:9f1095365b9a | 74 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 75 | myRobot.drawDrown5(); |
swilliams346 | 0:9f1095365b9a | 76 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 77 | } |
swilliams346 | 0:9f1095365b9a | 78 | } |
swilliams346 | 0:9f1095365b9a | 79 | if(myRobot.getYPosition() == 95){ //Check dangers on Traffic 1 Row 5 |
swilliams346 | 0:9f1095365b9a | 80 | } |
swilliams346 | 0:9f1095365b9a | 81 | |
swilliams346 | 0:9f1095365b9a | 82 | } |
swilliams346 | 0:9f1095365b9a | 83 | } |
swilliams346 | 0:9f1095365b9a | 84 | |
swilliams346 | 0:9f1095365b9a | 85 | void Traffic1_thread(void const *argument) //Blue Car |
swilliams346 | 0:9f1095365b9a | 86 | { |
swilliams346 | 0:9f1095365b9a | 87 | while(1) { |
swilliams346 | 0:9f1095365b9a | 88 | Position1 = Position1 + Rate1; |
swilliams346 | 0:9f1095365b9a | 89 | if(Position1 > 140 ){ |
swilliams346 | 0:9f1095365b9a | 90 | Position1 = -10; |
swilliams346 | 0:9f1095365b9a | 91 | } |
swilliams346 | 0:9f1095365b9a | 92 | /*stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 93 | uLCD.locate(3,3); |
swilliams346 | 0:9f1095365b9a | 94 | uLCD.printf("%5.0d", Position1); |
swilliams346 | 0:9f1095365b9a | 95 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 96 | */ |
swilliams346 | 0:9f1095365b9a | 97 | |
swilliams346 | 0:9f1095365b9a | 98 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 99 | uLCD.filled_rectangle(Position1-10,95-4,Position1+10,95+4,BLUE); |
swilliams346 | 0:9f1095365b9a | 100 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 101 | Thread::wait(30); |
swilliams346 | 0:9f1095365b9a | 102 | } |
swilliams346 | 0:9f1095365b9a | 103 | } |
swilliams346 | 0:9f1095365b9a | 104 | |
swilliams346 | 0:9f1095365b9a | 105 | void Traffic2_thread(void const *argument) //Red Car |
swilliams346 | 0:9f1095365b9a | 106 | { |
swilliams346 | 0:9f1095365b9a | 107 | while(1) { |
swilliams346 | 0:9f1095365b9a | 108 | Position2 = Position2 - Rate1; |
swilliams346 | 0:9f1095365b9a | 109 | if(Position2 < 0 ){ |
swilliams346 | 0:9f1095365b9a | 110 | Position2 = 140; |
swilliams346 | 0:9f1095365b9a | 111 | } |
swilliams346 | 0:9f1095365b9a | 112 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 113 | uLCD.filled_rectangle(Position2-10,52-4,Position2+10,52+4,RED); |
swilliams346 | 0:9f1095365b9a | 114 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 115 | Thread::wait(35); |
swilliams346 | 0:9f1095365b9a | 116 | } |
swilliams346 | 0:9f1095365b9a | 117 | } |
swilliams346 | 0:9f1095365b9a | 118 | |
swilliams346 | 0:9f1095365b9a | 119 | void SFX_thread(void const *argument) |
swilliams346 | 0:9f1095365b9a | 120 | { |
swilliams346 | 0:9f1095365b9a | 121 | while(Alive){ |
swilliams346 | 0:9f1095365b9a | 122 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 123 | uLCD.locate(1,1); |
swilliams346 | 0:9f1095365b9a | 124 | uLCD.printf("DRY"); |
swilliams346 | 0:9f1095365b9a | 125 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 126 | //Thread::wait(100); |
swilliams346 | 0:9f1095365b9a | 127 | } |
swilliams346 | 0:9f1095365b9a | 128 | stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 129 | uLCD.locate(1,1); |
swilliams346 | 0:9f1095365b9a | 130 | uLCD.printf("SPLASH!"); |
swilliams346 | 0:9f1095365b9a | 131 | stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 132 | |
swilliams346 | 0:9f1095365b9a | 133 | FILE *wave_file; |
swilliams346 | 0:9f1095365b9a | 134 | wave_file=fopen("/sd/Splash.wav","r"); |
swilliams346 | 0:9f1095365b9a | 135 | waver.play(wave_file); |
swilliams346 | 0:9f1095365b9a | 136 | fclose(wave_file); |
swilliams346 | 0:9f1095365b9a | 137 | Thread::wait(100); |
swilliams346 | 0:9f1095365b9a | 138 | } |
swilliams346 | 0:9f1095365b9a | 139 | |
swilliams346 | 0:9f1095365b9a | 140 | void Location_thread(void const *argument) |
swilliams346 | 0:9f1095365b9a | 141 | { |
swilliams346 | 0:9f1095365b9a | 142 | while(1){ |
swilliams346 | 0:9f1095365b9a | 143 | //stdio_mutex.lock(); |
swilliams346 | 0:9f1095365b9a | 144 | //uLCD.locate(1,1); |
swilliams346 | 0:9f1095365b9a | 145 | //uLCD.printf("%5.0d", myRobot.getXPosition()); |
swilliams346 | 0:9f1095365b9a | 146 | //uLCD.locate(8,1); |
swilliams346 | 0:9f1095365b9a | 147 | //uLCD.printf("%5.0d", myRobot.getYPosition()); |
swilliams346 | 0:9f1095365b9a | 148 | //stdio_mutex.unlock(); |
swilliams346 | 0:9f1095365b9a | 149 | Thread::wait(10); |
swilliams346 | 0:9f1095365b9a | 150 | } |
swilliams346 | 0:9f1095365b9a | 151 | } |
swilliams346 | 0:9f1095365b9a | 152 | void ThumbStick_thread(void const *argument) |
swilliams346 | 0:9f1095365b9a | 153 | { |
swilliams346 | 0:9f1095365b9a | 154 | while(1) { |
swilliams346 | 0:9f1095365b9a | 155 | mbedleds = ~(myNav & 0x0F); //update leds with nav switch direction inputs |
swilliams346 | 0:9f1095365b9a | 156 | if(myNav.fire()) mbedleds = 0x0F; |
ecardenas8 | 1:e84085bbf399 | 157 | |
ecardenas8 | 1:e84085bbf399 | 158 | // Player Movement checked with navigation switch |
ecardenas8 | 1:e84085bbf399 | 159 | if (myNav.left() ) |
ecardenas8 | 1:e84085bbf399 | 160 | { |
ecardenas8 | 1:e84085bbf399 | 161 | myRobot.moveLeft(); |
ecardenas8 | 1:e84085bbf399 | 162 | } |
ecardenas8 | 1:e84085bbf399 | 163 | |
ecardenas8 | 1:e84085bbf399 | 164 | if (myNav.right()) |
ecardenas8 | 1:e84085bbf399 | 165 | { |
ecardenas8 | 1:e84085bbf399 | 166 | myRobot.moveRight(); |
ecardenas8 | 1:e84085bbf399 | 167 | } |
ecardenas8 | 1:e84085bbf399 | 168 | |
ecardenas8 | 1:e84085bbf399 | 169 | if (myNav.up()) |
ecardenas8 | 1:e84085bbf399 | 170 | { |
ecardenas8 | 1:e84085bbf399 | 171 | myRobot.moveForward(); |
ecardenas8 | 1:e84085bbf399 | 172 | } |
ecardenas8 | 1:e84085bbf399 | 173 | |
ecardenas8 | 1:e84085bbf399 | 174 | if (myNav.down()) |
ecardenas8 | 1:e84085bbf399 | 175 | { |
ecardenas8 | 1:e84085bbf399 | 176 | myRobot.moveBackward(); |
ecardenas8 | 1:e84085bbf399 | 177 | } |
swilliams346 | 0:9f1095365b9a | 178 | Thread::wait(50); |
swilliams346 | 0:9f1095365b9a | 179 | } |
swilliams346 | 0:9f1095365b9a | 180 | } |
swilliams346 | 0:9f1095365b9a | 181 | |
swilliams346 | 0:9f1095365b9a | 182 | int main() |
swilliams346 | 0:9f1095365b9a | 183 | { |
swilliams346 | 0:9f1095365b9a | 184 | //Initialize Background |
swilliams346 | 0:9f1095365b9a | 185 | uLCD.filled_rectangle(0, 0 , 127, 127, RED); |
swilliams346 | 0:9f1095365b9a | 186 | myRobot.drawOutline(); |
swilliams346 | 0:9f1095365b9a | 187 | while(i <= 116){ |
swilliams346 | 0:9f1095365b9a | 188 | while(j <= 116){ |
swilliams346 | 0:9f1095365b9a | 189 | myRobot.drawHelper(i,j); |
swilliams346 | 0:9f1095365b9a | 190 | j = j + 21; |
swilliams346 | 0:9f1095365b9a | 191 | } |
swilliams346 | 0:9f1095365b9a | 192 | j = 11; |
swilliams346 | 0:9f1095365b9a | 193 | i = i + 21; |
swilliams346 | 0:9f1095365b9a | 194 | } |
swilliams346 | 0:9f1095365b9a | 195 | myRobot.drawFrog(); |
swilliams346 | 0:9f1095365b9a | 196 | |
ecardenas8 | 1:e84085bbf399 | 197 | //Thread thread1(AutoPilot_thread); |
swilliams346 | 0:9f1095365b9a | 198 | Thread thread2(Location_thread); |
swilliams346 | 0:9f1095365b9a | 199 | Thread thread3(ThumbStick_thread); |
swilliams346 | 0:9f1095365b9a | 200 | Thread thread4(SFX_thread); |
swilliams346 | 0:9f1095365b9a | 201 | Thread thread5(Traffic1_thread); |
swilliams346 | 0:9f1095365b9a | 202 | Thread thread6(Traffic2_thread); |
swilliams346 | 0:9f1095365b9a | 203 | |
swilliams346 | 0:9f1095365b9a | 204 | while (1) { |
swilliams346 | 0:9f1095365b9a | 205 | |
swilliams346 | 0:9f1095365b9a | 206 | Thread::wait(500); |
swilliams346 | 0:9f1095365b9a | 207 | } |
swilliams346 | 0:9f1095365b9a | 208 | } |