ECE 4180 Lab 3 Part 4
Dependencies: 4DGL-uLCD-SE USBHost mbed wave_player_appbd
Fork of AppBoard_Waveplayer by
main.cpp@10:afef0a518c8b, 2018-10-16 (annotated)
- Committer:
- abraha2d
- Date:
- Tue Oct 16 00:25:32 2018 +0000
- Revision:
- 10:afef0a518c8b
- Parent:
- 9:f1aebfbe7e78
Save point
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
samux | 0:0d68fe822228 | 1 | #include "mbed.h" |
samux | 0:0d68fe822228 | 2 | #include "USBHostMSD.h" |
4180_1 | 9:f1aebfbe7e78 | 3 | #include "wave_player.h" |
abraha2d | 10:afef0a518c8b | 4 | #include "uLCD_4DGL.h" |
samux | 0:0d68fe822228 | 5 | |
4180_1 | 9:f1aebfbe7e78 | 6 | AnalogOut DACout(p18); |
4180_1 | 9:f1aebfbe7e78 | 7 | PwmOut PWMout(p26); |
4180_1 | 9:f1aebfbe7e78 | 8 | |
4180_1 | 9:f1aebfbe7e78 | 9 | wave_player waver(&DACout,&PWMout); |
4180_1 | 9:f1aebfbe7e78 | 10 | |
abraha2d | 10:afef0a518c8b | 11 | PwmOut Rgb(p23); |
abraha2d | 10:afef0a518c8b | 12 | PwmOut rGb(p24); |
abraha2d | 10:afef0a518c8b | 13 | PwmOut rgB(p25); |
abraha2d | 10:afef0a518c8b | 14 | |
abraha2d | 10:afef0a518c8b | 15 | int dim = 0; |
abraha2d | 10:afef0a518c8b | 16 | |
abraha2d | 10:afef0a518c8b | 17 | uLCD_4DGL uLCD(p9, p10, p11); // serial tx, serial rx, reset pin; |
abraha2d | 10:afef0a518c8b | 18 | Mutex uLCD_mutex; |
abraha2d | 10:afef0a518c8b | 19 | |
abraha2d | 10:afef0a518c8b | 20 | Serial blue(p28, p27); |
abraha2d | 10:afef0a518c8b | 21 | |
abraha2d | 10:afef0a518c8b | 22 | BusOut myled(LED1,LED2,LED3,LED4); |
abraha2d | 10:afef0a518c8b | 23 | |
abraha2d | 10:afef0a518c8b | 24 | void thread1(void const *args) |
abraha2d | 10:afef0a518c8b | 25 | { |
abraha2d | 10:afef0a518c8b | 26 | float x = 0.0; |
abraha2d | 10:afef0a518c8b | 27 | while(1) { |
abraha2d | 10:afef0a518c8b | 28 | //get a new random number for PWM |
abraha2d | 10:afef0a518c8b | 29 | x = rand() / float(RAND_MAX); |
abraha2d | 10:afef0a518c8b | 30 | //add some exponential brightness scaling |
abraha2d | 10:afef0a518c8b | 31 | //for more of a fast flash effect |
abraha2d | 10:afef0a518c8b | 32 | x = x*x*x; |
abraha2d | 10:afef0a518c8b | 33 | Rgb = x; |
abraha2d | 10:afef0a518c8b | 34 | rGb = x * dim; |
abraha2d | 10:afef0a518c8b | 35 | rgB = x * dim; |
abraha2d | 10:afef0a518c8b | 36 | //fast update rate for welding flashes |
abraha2d | 10:afef0a518c8b | 37 | Thread::wait(20); |
abraha2d | 10:afef0a518c8b | 38 | //add a random pause between welds |
abraha2d | 10:afef0a518c8b | 39 | if (rand() / float(RAND_MAX) > 0.97) { |
abraha2d | 10:afef0a518c8b | 40 | Rgb = 0; |
abraha2d | 10:afef0a518c8b | 41 | rGb = 0; |
abraha2d | 10:afef0a518c8b | 42 | rgB = 0; |
abraha2d | 10:afef0a518c8b | 43 | Thread::wait(4000.0 * rand() / float(RAND_MAX)); |
abraha2d | 10:afef0a518c8b | 44 | } |
abraha2d | 10:afef0a518c8b | 45 | } |
abraha2d | 10:afef0a518c8b | 46 | |
abraha2d | 10:afef0a518c8b | 47 | } |
abraha2d | 10:afef0a518c8b | 48 | |
abraha2d | 10:afef0a518c8b | 49 | void thread2(void const *args) |
abraha2d | 10:afef0a518c8b | 50 | { |
abraha2d | 10:afef0a518c8b | 51 | while(1) { |
abraha2d | 10:afef0a518c8b | 52 | uLCD_mutex.lock(); |
abraha2d | 10:afef0a518c8b | 53 | uLCD.locate(1,2); |
abraha2d | 10:afef0a518c8b | 54 | uLCD.printf("Lightning!!!"); |
abraha2d | 10:afef0a518c8b | 55 | uLCD_mutex.unlock(); |
abraha2d | 10:afef0a518c8b | 56 | |
abraha2d | 10:afef0a518c8b | 57 | Thread::wait(20); |
abraha2d | 10:afef0a518c8b | 58 | |
abraha2d | 10:afef0a518c8b | 59 | uLCD_mutex.lock(); |
abraha2d | 10:afef0a518c8b | 60 | uLCD.locate(1,2); |
abraha2d | 10:afef0a518c8b | 61 | uLCD.printf(" "); |
abraha2d | 10:afef0a518c8b | 62 | uLCD_mutex.unlock(); |
abraha2d | 10:afef0a518c8b | 63 | |
abraha2d | 10:afef0a518c8b | 64 | if (rand() / float(RAND_MAX) > 0.97) { |
abraha2d | 10:afef0a518c8b | 65 | Thread::wait(4000.0 * rand() / float(RAND_MAX)); |
abraha2d | 10:afef0a518c8b | 66 | } |
abraha2d | 10:afef0a518c8b | 67 | } |
abraha2d | 10:afef0a518c8b | 68 | } |
abraha2d | 10:afef0a518c8b | 69 | |
abraha2d | 10:afef0a518c8b | 70 | void thread3(void const *args) |
abraha2d | 10:afef0a518c8b | 71 | { |
abraha2d | 10:afef0a518c8b | 72 | while (1) { |
abraha2d | 10:afef0a518c8b | 73 | uLCD_mutex.lock(); |
abraha2d | 10:afef0a518c8b | 74 | uLCD.locate(1,5); |
abraha2d | 10:afef0a518c8b | 75 | uLCD.printf("Thunder!!!"); |
abraha2d | 10:afef0a518c8b | 76 | uLCD_mutex.unlock(); |
abraha2d | 10:afef0a518c8b | 77 | |
abraha2d | 10:afef0a518c8b | 78 | Thread::wait(20); |
abraha2d | 10:afef0a518c8b | 79 | |
abraha2d | 10:afef0a518c8b | 80 | uLCD_mutex.lock(); |
abraha2d | 10:afef0a518c8b | 81 | uLCD.locate(1,5); |
abraha2d | 10:afef0a518c8b | 82 | uLCD.printf(" "); |
abraha2d | 10:afef0a518c8b | 83 | uLCD_mutex.unlock(); |
abraha2d | 10:afef0a518c8b | 84 | |
abraha2d | 10:afef0a518c8b | 85 | if (rand() / float(RAND_MAX) > 0.97) { |
abraha2d | 10:afef0a518c8b | 86 | Thread::wait(4000.0 * rand() / float(RAND_MAX)); |
abraha2d | 10:afef0a518c8b | 87 | } |
abraha2d | 10:afef0a518c8b | 88 | } |
abraha2d | 10:afef0a518c8b | 89 | } |
abraha2d | 10:afef0a518c8b | 90 | |
abraha2d | 10:afef0a518c8b | 91 | void thread4(void const *args) |
abraha2d | 10:afef0a518c8b | 92 | { |
abraha2d | 10:afef0a518c8b | 93 | char bnum=0; |
abraha2d | 10:afef0a518c8b | 94 | char bhit=0; |
abraha2d | 10:afef0a518c8b | 95 | while(1) { |
abraha2d | 10:afef0a518c8b | 96 | while (!blue.readable()) { |
abraha2d | 10:afef0a518c8b | 97 | Thread::wait(20); |
abraha2d | 10:afef0a518c8b | 98 | } |
abraha2d | 10:afef0a518c8b | 99 | uLCD_mutex.lock(); |
abraha2d | 10:afef0a518c8b | 100 | if (blue.getc()=='!') { |
abraha2d | 10:afef0a518c8b | 101 | if (blue.getc()=='B') { //button data packet |
abraha2d | 10:afef0a518c8b | 102 | bnum = blue.getc(); //button number |
abraha2d | 10:afef0a518c8b | 103 | bhit = blue.getc(); //1=hit, 0=release |
abraha2d | 10:afef0a518c8b | 104 | if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
abraha2d | 10:afef0a518c8b | 105 | myled = bnum - '0'; //current button number will appear on LEDs |
abraha2d | 10:afef0a518c8b | 106 | switch (bnum) { |
abraha2d | 10:afef0a518c8b | 107 | case '1': //number button 1 |
abraha2d | 10:afef0a518c8b | 108 | dim = (bhit == '0'); |
abraha2d | 10:afef0a518c8b | 109 | break; |
abraha2d | 10:afef0a518c8b | 110 | case '2': //number button 2 |
abraha2d | 10:afef0a518c8b | 111 | if (bhit=='1') { |
abraha2d | 10:afef0a518c8b | 112 | //add hit code here |
abraha2d | 10:afef0a518c8b | 113 | } else { |
abraha2d | 10:afef0a518c8b | 114 | //add release code here |
abraha2d | 10:afef0a518c8b | 115 | } |
abraha2d | 10:afef0a518c8b | 116 | break; |
abraha2d | 10:afef0a518c8b | 117 | case '3': //number button 3 |
abraha2d | 10:afef0a518c8b | 118 | if (bhit=='1') { |
abraha2d | 10:afef0a518c8b | 119 | //add hit code here |
abraha2d | 10:afef0a518c8b | 120 | } else { |
abraha2d | 10:afef0a518c8b | 121 | //add release code here |
abraha2d | 10:afef0a518c8b | 122 | } |
abraha2d | 10:afef0a518c8b | 123 | break; |
abraha2d | 10:afef0a518c8b | 124 | case '4': //number button 4 |
abraha2d | 10:afef0a518c8b | 125 | if (bhit=='1') { |
abraha2d | 10:afef0a518c8b | 126 | //add hit code here |
abraha2d | 10:afef0a518c8b | 127 | } else { |
abraha2d | 10:afef0a518c8b | 128 | //add release code here |
abraha2d | 10:afef0a518c8b | 129 | } |
abraha2d | 10:afef0a518c8b | 130 | break; |
abraha2d | 10:afef0a518c8b | 131 | default: |
abraha2d | 10:afef0a518c8b | 132 | break; |
abraha2d | 10:afef0a518c8b | 133 | } |
abraha2d | 10:afef0a518c8b | 134 | } |
abraha2d | 10:afef0a518c8b | 135 | } |
abraha2d | 10:afef0a518c8b | 136 | } |
abraha2d | 10:afef0a518c8b | 137 | uLCD_mutex.unlock(); |
abraha2d | 10:afef0a518c8b | 138 | } |
abraha2d | 10:afef0a518c8b | 139 | } |
abraha2d | 10:afef0a518c8b | 140 | |
4180_1 | 9:f1aebfbe7e78 | 141 | int main() |
4180_1 | 9:f1aebfbe7e78 | 142 | { |
abraha2d | 10:afef0a518c8b | 143 | Thread t1(thread1); |
abraha2d | 10:afef0a518c8b | 144 | Thread t2(thread2); |
abraha2d | 10:afef0a518c8b | 145 | Thread t3(thread3); |
abraha2d | 10:afef0a518c8b | 146 | Thread t4(thread4); |
abraha2d | 10:afef0a518c8b | 147 | |
samux | 0:0d68fe822228 | 148 | USBHostMSD msd("usb"); |
4180_1 | 9:f1aebfbe7e78 | 149 | FILE *wave_file; |
4180_1 | 9:f1aebfbe7e78 | 150 | //setup PWM hardware for a Class D style audio output |
4180_1 | 9:f1aebfbe7e78 | 151 | PWMout.period(1.0/400000.0); |
4180_1 | 9:f1aebfbe7e78 | 152 | printf("\n\n\nHello, wave world!\n"); |
4180_1 | 9:f1aebfbe7e78 | 153 | // wait until connected to a USB device |
4180_1 | 9:f1aebfbe7e78 | 154 | while(!msd.connect()) { |
samux | 0:0d68fe822228 | 155 | Thread::wait(500); |
samux | 0:0d68fe822228 | 156 | } |
abraha2d | 10:afef0a518c8b | 157 | while (1) { |
abraha2d | 10:afef0a518c8b | 158 | //open wav file and play it |
abraha2d | 10:afef0a518c8b | 159 | wave_file=fopen("/usb/storm-thunder.wav","r"); |
abraha2d | 10:afef0a518c8b | 160 | waver.play(wave_file); |
abraha2d | 10:afef0a518c8b | 161 | fclose(wave_file); |
abraha2d | 10:afef0a518c8b | 162 | Thread::wait(4000.0 * rand() / float(RAND_MAX)); |
abraha2d | 10:afef0a518c8b | 163 | } |
samux | 0:0d68fe822228 | 164 | } |