Waveform generator
Dependencies: 4DGL-uLCD-SE AFG_project PinDetect RPG mbed
main.cpp@0:7e122b3c7928, 21 months ago (annotated)
- Committer:
- carsonbrown27
- Date:
- Thu Dec 08 05:06:29 2022 +0000
- Revision:
- 0:7e122b3c7928
Final Version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
carsonbrown27 | 0:7e122b3c7928 | 1 | #include "mbed.h" |
carsonbrown27 | 0:7e122b3c7928 | 2 | #include "PinDetect.h" |
carsonbrown27 | 0:7e122b3c7928 | 3 | #include "uLCD_4DGL.h" |
carsonbrown27 | 0:7e122b3c7928 | 4 | #include "SongPlayer.h" |
carsonbrown27 | 0:7e122b3c7928 | 5 | #include "RPG.h" |
carsonbrown27 | 0:7e122b3c7928 | 6 | #include "MODDMA.h" |
carsonbrown27 | 0:7e122b3c7928 | 7 | #include "SignalGenDAC.h" |
carsonbrown27 | 0:7e122b3c7928 | 8 | #include "SignalGenDefs.h" |
carsonbrown27 | 0:7e122b3c7928 | 9 | #include <cstdlib> |
carsonbrown27 | 0:7e122b3c7928 | 10 | #include <string.h> |
carsonbrown27 | 0:7e122b3c7928 | 11 | |
carsonbrown27 | 0:7e122b3c7928 | 12 | //TO DO: |
carsonbrown27 | 0:7e122b3c7928 | 13 | //Serial Code (Generate Waveform from GUI) |
carsonbrown27 | 0:7e122b3c7928 | 14 | |
carsonbrown27 | 0:7e122b3c7928 | 15 | PinDetect pb_w(p5); |
carsonbrown27 | 0:7e122b3c7928 | 16 | PinDetect pb_v(p6); |
carsonbrown27 | 0:7e122b3c7928 | 17 | PinDetect pb_k(p7); |
carsonbrown27 | 0:7e122b3c7928 | 18 | InterruptIn rpg_a(p14,PullUp); |
carsonbrown27 | 0:7e122b3c7928 | 19 | InterruptIn rpg_b(p15,PullUp); |
carsonbrown27 | 0:7e122b3c7928 | 20 | PinDetect pb_rpg(p16); |
carsonbrown27 | 0:7e122b3c7928 | 21 | PwmOut red(p21); // R |
carsonbrown27 | 0:7e122b3c7928 | 22 | PwmOut blue(p22); // G |
carsonbrown27 | 0:7e122b3c7928 | 23 | PwmOut green(p23); // B |
carsonbrown27 | 0:7e122b3c7928 | 24 | uLCD_4DGL uLCD(p28,p27,p30); |
carsonbrown27 | 0:7e122b3c7928 | 25 | SongPlayer mySpeaker(p26); |
carsonbrown27 | 0:7e122b3c7928 | 26 | RPG rpg(p14, p15, p16); |
carsonbrown27 | 0:7e122b3c7928 | 27 | SignalGenDAC signal; |
carsonbrown27 | 0:7e122b3c7928 | 28 | Serial pc(USBTX, USBRX); |
carsonbrown27 | 0:7e122b3c7928 | 29 | |
carsonbrown27 | 0:7e122b3c7928 | 30 | float note[18]= {1568.0,1396.9,1244.5, 0.0}; |
carsonbrown27 | 0:7e122b3c7928 | 31 | float duration[18]= {0.48,0.24,0.72, 0.0}; |
carsonbrown27 | 0:7e122b3c7928 | 32 | volatile int waveform = 0; |
carsonbrown27 | 0:7e122b3c7928 | 33 | volatile int values = 1; |
carsonbrown27 | 0:7e122b3c7928 | 34 | volatile bool khz = true; |
carsonbrown27 | 0:7e122b3c7928 | 35 | volatile bool generated = false; |
carsonbrown27 | 0:7e122b3c7928 | 36 | volatile bool prepared = false; |
carsonbrown27 | 0:7e122b3c7928 | 37 | volatile int places = 1; |
carsonbrown27 | 0:7e122b3c7928 | 38 | float scaling[6] = {0.001, 0.01, 0.1, 1, 10, 100}; |
carsonbrown27 | 0:7e122b3c7928 | 39 | volatile float amplitude = 5; |
carsonbrown27 | 0:7e122b3c7928 | 40 | volatile float offset = 0; |
carsonbrown27 | 0:7e122b3c7928 | 41 | volatile float frequency = 10; |
carsonbrown27 | 0:7e122b3c7928 | 42 | volatile int duty_cycle = 50; |
carsonbrown27 | 0:7e122b3c7928 | 43 | volatile int direction = 0; |
carsonbrown27 | 0:7e122b3c7928 | 44 | volatile int value_count = 0; |
carsonbrown27 | 0:7e122b3c7928 | 45 | |
carsonbrown27 | 0:7e122b3c7928 | 46 | /* |
carsonbrown27 | 0:7e122b3c7928 | 47 | *** WAVEFORMS *** |
carsonbrown27 | 0:7e122b3c7928 | 48 | 0: dc_offset (offset) |
carsonbrown27 | 0:7e122b3c7928 | 49 | 1: sine (amplitude, offset, frequency) |
carsonbrown27 | 0:7e122b3c7928 | 50 | 2: square (amplitude, offset, frequency) |
carsonbrown27 | 0:7e122b3c7928 | 51 | 3: triangle (amplitude, offset, frequency) |
carsonbrown27 | 0:7e122b3c7928 | 52 | 4: ramp (amplitude, offset, frequency) |
carsonbrown27 | 0:7e122b3c7928 | 53 | 5: pulse (amplitude, offset, frequency, duty_cycle) |
carsonbrown27 | 0:7e122b3c7928 | 54 | |
carsonbrown27 | 0:7e122b3c7928 | 55 | *** VALUES *** |
carsonbrown27 | 0:7e122b3c7928 | 56 | 0: amplitude (Default: 5, Resolution: 0.01, Range: -5 to 5) |
carsonbrown27 | 0:7e122b3c7928 | 57 | 1: offset (Default: 0, Resolution: 0.01, Range: -5 to 5) |
carsonbrown27 | 0:7e122b3c7928 | 58 | 2: frequency (Default: 10KHz, Resolution: 1, Range(Hz): 10 to 999, Range(KHz: 1 to 20) |
carsonbrown27 | 0:7e122b3c7928 | 59 | 3: duty_cycle (Default: 50, Resolution: 1, Range: 0 to 100) |
carsonbrown27 | 0:7e122b3c7928 | 60 | |
carsonbrown27 | 0:7e122b3c7928 | 61 | *** UNITS *** |
carsonbrown27 | 0:7e122b3c7928 | 62 | false: Hz |
carsonbrown27 | 0:7e122b3c7928 | 63 | true: KHz |
carsonbrown27 | 0:7e122b3c7928 | 64 | |
carsonbrown27 | 0:7e122b3c7928 | 65 | *** PLACES *** |
carsonbrown27 | 0:7e122b3c7928 | 66 | 0: Thousandths (frequency(KHz)) |
carsonbrown27 | 0:7e122b3c7928 | 67 | 1: Hundredths (amplitude, offset, frequency(KHz)) |
carsonbrown27 | 0:7e122b3c7928 | 68 | 2: Tenths (amplitude, offset, frequency(KHz)) |
carsonbrown27 | 0:7e122b3c7928 | 69 | 3: Ones (amplitude, offset, frequency(KHz), frequency(Hz), duty cycle) |
carsonbrown27 | 0:7e122b3c7928 | 70 | 4: Tens (frequency(KHz), frequency(Hz), duty cycle) |
carsonbrown27 | 0:7e122b3c7928 | 71 | 5: Hundreds (frequency(Hz)) |
carsonbrown27 | 0:7e122b3c7928 | 72 | */ |
carsonbrown27 | 0:7e122b3c7928 | 73 | |
carsonbrown27 | 0:7e122b3c7928 | 74 | float map(float x, float in_min, float in_max, float out_min, float out_max) { |
carsonbrown27 | 0:7e122b3c7928 | 75 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
carsonbrown27 | 0:7e122b3c7928 | 76 | } |
carsonbrown27 | 0:7e122b3c7928 | 77 | |
carsonbrown27 | 0:7e122b3c7928 | 78 | void updateLCD(void) { |
carsonbrown27 | 0:7e122b3c7928 | 79 | value_count = 0; |
carsonbrown27 | 0:7e122b3c7928 | 80 | uLCD.cls(); |
carsonbrown27 | 0:7e122b3c7928 | 81 | // Printing Offset |
carsonbrown27 | 0:7e122b3c7928 | 82 | uLCD.locate(1,1); |
carsonbrown27 | 0:7e122b3c7928 | 83 | if (values == 1) { |
carsonbrown27 | 0:7e122b3c7928 | 84 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 85 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 86 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 87 | } |
carsonbrown27 | 0:7e122b3c7928 | 88 | uLCD.printf("Offset: %3.2f", offset); |
carsonbrown27 | 0:7e122b3c7928 | 89 | if (waveform != 0) { |
carsonbrown27 | 0:7e122b3c7928 | 90 | // Printing Amplitude |
carsonbrown27 | 0:7e122b3c7928 | 91 | uLCD.locate(1,0); |
carsonbrown27 | 0:7e122b3c7928 | 92 | if (values == 0) { |
carsonbrown27 | 0:7e122b3c7928 | 93 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 94 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 95 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 96 | } |
carsonbrown27 | 0:7e122b3c7928 | 97 | uLCD.printf("Amplitude: %3.2f", amplitude); |
carsonbrown27 | 0:7e122b3c7928 | 98 | // Printing Frequency |
carsonbrown27 | 0:7e122b3c7928 | 99 | uLCD.locate(1,2); |
carsonbrown27 | 0:7e122b3c7928 | 100 | if (values == 2) { |
carsonbrown27 | 0:7e122b3c7928 | 101 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 102 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 103 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 104 | } |
carsonbrown27 | 0:7e122b3c7928 | 105 | if (khz) { |
carsonbrown27 | 0:7e122b3c7928 | 106 | uLCD.printf("Freq(KHz): %3.3f", frequency); |
carsonbrown27 | 0:7e122b3c7928 | 107 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 108 | uLCD.printf("Freq(Hz): %3.3f", frequency); |
carsonbrown27 | 0:7e122b3c7928 | 109 | } |
carsonbrown27 | 0:7e122b3c7928 | 110 | } |
carsonbrown27 | 0:7e122b3c7928 | 111 | if (waveform == 5) { |
carsonbrown27 | 0:7e122b3c7928 | 112 | // Printing Duty Cycle |
carsonbrown27 | 0:7e122b3c7928 | 113 | uLCD.locate(1,3); |
carsonbrown27 | 0:7e122b3c7928 | 114 | if (values == 3) { |
carsonbrown27 | 0:7e122b3c7928 | 115 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 116 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 117 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 118 | } |
carsonbrown27 | 0:7e122b3c7928 | 119 | uLCD.printf("Duty Cycle: %3.0d", duty_cycle); |
carsonbrown27 | 0:7e122b3c7928 | 120 | } |
carsonbrown27 | 0:7e122b3c7928 | 121 | //Printing Places |
carsonbrown27 | 0:7e122b3c7928 | 122 | uLCD.locate(1,5); |
carsonbrown27 | 0:7e122b3c7928 | 123 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 124 | uLCD.printf("Place: %3.3f", scaling[places]); |
carsonbrown27 | 0:7e122b3c7928 | 125 | //Printing Waveform |
carsonbrown27 | 0:7e122b3c7928 | 126 | uLCD.locate(1,6); |
carsonbrown27 | 0:7e122b3c7928 | 127 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 128 | uLCD.printf("Waveform:"); |
carsonbrown27 | 0:7e122b3c7928 | 129 | uLCD.locate(1,7); |
carsonbrown27 | 0:7e122b3c7928 | 130 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 131 | switch (waveform) { |
carsonbrown27 | 0:7e122b3c7928 | 132 | case 0: |
carsonbrown27 | 0:7e122b3c7928 | 133 | uLCD.printf("DC Offset\n"); |
carsonbrown27 | 0:7e122b3c7928 | 134 | break; |
carsonbrown27 | 0:7e122b3c7928 | 135 | case 1: |
carsonbrown27 | 0:7e122b3c7928 | 136 | uLCD.printf("Sine\n"); |
carsonbrown27 | 0:7e122b3c7928 | 137 | break; |
carsonbrown27 | 0:7e122b3c7928 | 138 | case 2: |
carsonbrown27 | 0:7e122b3c7928 | 139 | uLCD.printf("Square\n"); |
carsonbrown27 | 0:7e122b3c7928 | 140 | break; |
carsonbrown27 | 0:7e122b3c7928 | 141 | case 3: |
carsonbrown27 | 0:7e122b3c7928 | 142 | uLCD.printf("Triangle\n"); |
carsonbrown27 | 0:7e122b3c7928 | 143 | break; |
carsonbrown27 | 0:7e122b3c7928 | 144 | case 4: |
carsonbrown27 | 0:7e122b3c7928 | 145 | uLCD.printf("Ramp\n"); |
carsonbrown27 | 0:7e122b3c7928 | 146 | break; |
carsonbrown27 | 0:7e122b3c7928 | 147 | case 5: |
carsonbrown27 | 0:7e122b3c7928 | 148 | uLCD.printf("Pulse\n"); |
carsonbrown27 | 0:7e122b3c7928 | 149 | break; |
carsonbrown27 | 0:7e122b3c7928 | 150 | default: |
carsonbrown27 | 0:7e122b3c7928 | 151 | break; |
carsonbrown27 | 0:7e122b3c7928 | 152 | } |
carsonbrown27 | 0:7e122b3c7928 | 153 | } |
carsonbrown27 | 0:7e122b3c7928 | 154 | |
carsonbrown27 | 0:7e122b3c7928 | 155 | void updateValue(void) { |
carsonbrown27 | 0:7e122b3c7928 | 156 | float scale = scaling[places]; |
carsonbrown27 | 0:7e122b3c7928 | 157 | switch (values) { |
carsonbrown27 | 0:7e122b3c7928 | 158 | case 0: // amplitude |
carsonbrown27 | 0:7e122b3c7928 | 159 | amplitude += value_count * scale; |
carsonbrown27 | 0:7e122b3c7928 | 160 | if (amplitude > 5.0) { |
carsonbrown27 | 0:7e122b3c7928 | 161 | amplitude = 5.0; |
carsonbrown27 | 0:7e122b3c7928 | 162 | } else if (amplitude < -5.0) { |
carsonbrown27 | 0:7e122b3c7928 | 163 | amplitude = -5.0; |
carsonbrown27 | 0:7e122b3c7928 | 164 | } |
carsonbrown27 | 0:7e122b3c7928 | 165 | uLCD.locate(1,0); |
carsonbrown27 | 0:7e122b3c7928 | 166 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 167 | uLCD.printf("Amplitude: %3.2f", amplitude); |
carsonbrown27 | 0:7e122b3c7928 | 168 | break; |
carsonbrown27 | 0:7e122b3c7928 | 169 | case 1: // offset |
carsonbrown27 | 0:7e122b3c7928 | 170 | offset += value_count * scale; |
carsonbrown27 | 0:7e122b3c7928 | 171 | if (offset > 5.0) { |
carsonbrown27 | 0:7e122b3c7928 | 172 | offset = 5.0; |
carsonbrown27 | 0:7e122b3c7928 | 173 | } else if (offset < -5.0) { |
carsonbrown27 | 0:7e122b3c7928 | 174 | offset = -5.0; |
carsonbrown27 | 0:7e122b3c7928 | 175 | } |
carsonbrown27 | 0:7e122b3c7928 | 176 | uLCD.locate(1,1); |
carsonbrown27 | 0:7e122b3c7928 | 177 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 178 | uLCD.printf("Offset: %3.2f", offset); |
carsonbrown27 | 0:7e122b3c7928 | 179 | break; |
carsonbrown27 | 0:7e122b3c7928 | 180 | case 2: // frequency |
carsonbrown27 | 0:7e122b3c7928 | 181 | frequency += value_count * scale; |
carsonbrown27 | 0:7e122b3c7928 | 182 | if (frequency > 999 && !khz) { |
carsonbrown27 | 0:7e122b3c7928 | 183 | frequency = 999; |
carsonbrown27 | 0:7e122b3c7928 | 184 | } else if (frequency < 10 && !khz) { |
carsonbrown27 | 0:7e122b3c7928 | 185 | frequency = 10; |
carsonbrown27 | 0:7e122b3c7928 | 186 | } else if (frequency > 20 && khz) { |
carsonbrown27 | 0:7e122b3c7928 | 187 | frequency = 20; |
carsonbrown27 | 0:7e122b3c7928 | 188 | } else if (frequency < 0 && khz) { |
carsonbrown27 | 0:7e122b3c7928 | 189 | frequency = 0; |
carsonbrown27 | 0:7e122b3c7928 | 190 | } |
carsonbrown27 | 0:7e122b3c7928 | 191 | uLCD.locate(1,2); |
carsonbrown27 | 0:7e122b3c7928 | 192 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 193 | if (khz) { |
carsonbrown27 | 0:7e122b3c7928 | 194 | uLCD.printf("Freq(KHz): %3.3f", frequency); |
carsonbrown27 | 0:7e122b3c7928 | 195 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 196 | uLCD.printf("Freq(Hz): %3.3f", frequency); |
carsonbrown27 | 0:7e122b3c7928 | 197 | } |
carsonbrown27 | 0:7e122b3c7928 | 198 | break; |
carsonbrown27 | 0:7e122b3c7928 | 199 | case 3: // duty cycle |
carsonbrown27 | 0:7e122b3c7928 | 200 | duty_cycle += value_count * scale; |
carsonbrown27 | 0:7e122b3c7928 | 201 | if (duty_cycle > 100) { |
carsonbrown27 | 0:7e122b3c7928 | 202 | duty_cycle = 100; |
carsonbrown27 | 0:7e122b3c7928 | 203 | } else if (duty_cycle < 0) { |
carsonbrown27 | 0:7e122b3c7928 | 204 | duty_cycle = 0; |
carsonbrown27 | 0:7e122b3c7928 | 205 | } |
carsonbrown27 | 0:7e122b3c7928 | 206 | uLCD.locate(1,3); |
carsonbrown27 | 0:7e122b3c7928 | 207 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 208 | uLCD.printf("Duty Cycle: %3.0d", duty_cycle); |
carsonbrown27 | 0:7e122b3c7928 | 209 | break; |
carsonbrown27 | 0:7e122b3c7928 | 210 | default: |
carsonbrown27 | 0:7e122b3c7928 | 211 | break; |
carsonbrown27 | 0:7e122b3c7928 | 212 | } |
carsonbrown27 | 0:7e122b3c7928 | 213 | value_count = 0; |
carsonbrown27 | 0:7e122b3c7928 | 214 | } |
carsonbrown27 | 0:7e122b3c7928 | 215 | |
carsonbrown27 | 0:7e122b3c7928 | 216 | void changeWaveform(void) { |
carsonbrown27 | 0:7e122b3c7928 | 217 | if (waveform < 5) { |
carsonbrown27 | 0:7e122b3c7928 | 218 | waveform++; |
carsonbrown27 | 0:7e122b3c7928 | 219 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 220 | waveform = 0; |
carsonbrown27 | 0:7e122b3c7928 | 221 | } |
carsonbrown27 | 0:7e122b3c7928 | 222 | if (waveform == 0) { |
carsonbrown27 | 0:7e122b3c7928 | 223 | values = 1; |
carsonbrown27 | 0:7e122b3c7928 | 224 | places = 1; |
carsonbrown27 | 0:7e122b3c7928 | 225 | } |
carsonbrown27 | 0:7e122b3c7928 | 226 | updateLCD(); |
carsonbrown27 | 0:7e122b3c7928 | 227 | } |
carsonbrown27 | 0:7e122b3c7928 | 228 | |
carsonbrown27 | 0:7e122b3c7928 | 229 | void changeValues(void) { |
carsonbrown27 | 0:7e122b3c7928 | 230 | switch (waveform) { |
carsonbrown27 | 0:7e122b3c7928 | 231 | case 0: // dc_offset |
carsonbrown27 | 0:7e122b3c7928 | 232 | break; |
carsonbrown27 | 0:7e122b3c7928 | 233 | case 5: // pulse |
carsonbrown27 | 0:7e122b3c7928 | 234 | if (values < 3) { |
carsonbrown27 | 0:7e122b3c7928 | 235 | values++; |
carsonbrown27 | 0:7e122b3c7928 | 236 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 237 | values = 0; |
carsonbrown27 | 0:7e122b3c7928 | 238 | } |
carsonbrown27 | 0:7e122b3c7928 | 239 | break; |
carsonbrown27 | 0:7e122b3c7928 | 240 | default: |
carsonbrown27 | 0:7e122b3c7928 | 241 | if (values < 2) { |
carsonbrown27 | 0:7e122b3c7928 | 242 | values++; |
carsonbrown27 | 0:7e122b3c7928 | 243 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 244 | values = 0; |
carsonbrown27 | 0:7e122b3c7928 | 245 | } |
carsonbrown27 | 0:7e122b3c7928 | 246 | break; |
carsonbrown27 | 0:7e122b3c7928 | 247 | } |
carsonbrown27 | 0:7e122b3c7928 | 248 | switch (values) { |
carsonbrown27 | 0:7e122b3c7928 | 249 | case 0: // amplitude |
carsonbrown27 | 0:7e122b3c7928 | 250 | places = 1; |
carsonbrown27 | 0:7e122b3c7928 | 251 | break; |
carsonbrown27 | 0:7e122b3c7928 | 252 | case 1: // offset |
carsonbrown27 | 0:7e122b3c7928 | 253 | places = 1; |
carsonbrown27 | 0:7e122b3c7928 | 254 | break; |
carsonbrown27 | 0:7e122b3c7928 | 255 | case 2: // frequency |
carsonbrown27 | 0:7e122b3c7928 | 256 | if (!khz) { |
carsonbrown27 | 0:7e122b3c7928 | 257 | places = 3; |
carsonbrown27 | 0:7e122b3c7928 | 258 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 259 | places = 0; |
carsonbrown27 | 0:7e122b3c7928 | 260 | } |
carsonbrown27 | 0:7e122b3c7928 | 261 | break; |
carsonbrown27 | 0:7e122b3c7928 | 262 | case 3: // duty cycle |
carsonbrown27 | 0:7e122b3c7928 | 263 | places = 3; |
carsonbrown27 | 0:7e122b3c7928 | 264 | break; |
carsonbrown27 | 0:7e122b3c7928 | 265 | default: |
carsonbrown27 | 0:7e122b3c7928 | 266 | break; |
carsonbrown27 | 0:7e122b3c7928 | 267 | } |
carsonbrown27 | 0:7e122b3c7928 | 268 | updateLCD(); |
carsonbrown27 | 0:7e122b3c7928 | 269 | } |
carsonbrown27 | 0:7e122b3c7928 | 270 | |
carsonbrown27 | 0:7e122b3c7928 | 271 | void changePlaces(void) { |
carsonbrown27 | 0:7e122b3c7928 | 272 | switch (values) { |
carsonbrown27 | 0:7e122b3c7928 | 273 | case 0: // amplitude |
carsonbrown27 | 0:7e122b3c7928 | 274 | if (places < 3) { |
carsonbrown27 | 0:7e122b3c7928 | 275 | places++; |
carsonbrown27 | 0:7e122b3c7928 | 276 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 277 | places = 1; |
carsonbrown27 | 0:7e122b3c7928 | 278 | } |
carsonbrown27 | 0:7e122b3c7928 | 279 | break; |
carsonbrown27 | 0:7e122b3c7928 | 280 | case 1: // offset |
carsonbrown27 | 0:7e122b3c7928 | 281 | if (places < 3) { |
carsonbrown27 | 0:7e122b3c7928 | 282 | places++; |
carsonbrown27 | 0:7e122b3c7928 | 283 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 284 | places = 1; |
carsonbrown27 | 0:7e122b3c7928 | 285 | } |
carsonbrown27 | 0:7e122b3c7928 | 286 | break; |
carsonbrown27 | 0:7e122b3c7928 | 287 | case 2: // frequency |
carsonbrown27 | 0:7e122b3c7928 | 288 | if (!khz && places < 5) { |
carsonbrown27 | 0:7e122b3c7928 | 289 | places++; |
carsonbrown27 | 0:7e122b3c7928 | 290 | } else if (!khz) { |
carsonbrown27 | 0:7e122b3c7928 | 291 | khz = true; |
carsonbrown27 | 0:7e122b3c7928 | 292 | places = 0; |
carsonbrown27 | 0:7e122b3c7928 | 293 | frequency = 0; |
carsonbrown27 | 0:7e122b3c7928 | 294 | } else if (khz && places < 4) { |
carsonbrown27 | 0:7e122b3c7928 | 295 | places++; |
carsonbrown27 | 0:7e122b3c7928 | 296 | } else if (khz) { |
carsonbrown27 | 0:7e122b3c7928 | 297 | khz = false; |
carsonbrown27 | 0:7e122b3c7928 | 298 | places = 3; |
carsonbrown27 | 0:7e122b3c7928 | 299 | frequency = 0; |
carsonbrown27 | 0:7e122b3c7928 | 300 | } |
carsonbrown27 | 0:7e122b3c7928 | 301 | break; |
carsonbrown27 | 0:7e122b3c7928 | 302 | case 3: // duty cycle |
carsonbrown27 | 0:7e122b3c7928 | 303 | if (places < 4) { |
carsonbrown27 | 0:7e122b3c7928 | 304 | places++; |
carsonbrown27 | 0:7e122b3c7928 | 305 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 306 | places = 3; |
carsonbrown27 | 0:7e122b3c7928 | 307 | } |
carsonbrown27 | 0:7e122b3c7928 | 308 | break; |
carsonbrown27 | 0:7e122b3c7928 | 309 | default: |
carsonbrown27 | 0:7e122b3c7928 | 310 | break; |
carsonbrown27 | 0:7e122b3c7928 | 311 | } |
carsonbrown27 | 0:7e122b3c7928 | 312 | updateLCD(); |
carsonbrown27 | 0:7e122b3c7928 | 313 | } |
carsonbrown27 | 0:7e122b3c7928 | 314 | |
carsonbrown27 | 0:7e122b3c7928 | 315 | void adjustValues(void) { |
carsonbrown27 | 0:7e122b3c7928 | 316 | value_count += rpg.dir(); |
carsonbrown27 | 0:7e122b3c7928 | 317 | } |
carsonbrown27 | 0:7e122b3c7928 | 318 | |
carsonbrown27 | 0:7e122b3c7928 | 319 | void generate(void) |
carsonbrown27 | 0:7e122b3c7928 | 320 | { |
carsonbrown27 | 0:7e122b3c7928 | 321 | if (!generated && !prepared) { |
carsonbrown27 | 0:7e122b3c7928 | 322 | uLCD.cls(); |
carsonbrown27 | 0:7e122b3c7928 | 323 | uLCD.locate(1,0); |
carsonbrown27 | 0:7e122b3c7928 | 324 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 325 | uLCD.printf("Waveform is being prepared"); |
carsonbrown27 | 0:7e122b3c7928 | 326 | float adjusted_frequency = frequency; |
carsonbrown27 | 0:7e122b3c7928 | 327 | if (khz) { |
carsonbrown27 | 0:7e122b3c7928 | 328 | adjusted_frequency *= 1000.0; |
carsonbrown27 | 0:7e122b3c7928 | 329 | } |
carsonbrown27 | 0:7e122b3c7928 | 330 | switch (waveform) { |
carsonbrown27 | 0:7e122b3c7928 | 331 | case 0: // dc_offset |
carsonbrown27 | 0:7e122b3c7928 | 332 | signal.PrepareWaveform(SG_SQUARE, 10000, 100, map(offset, -5, 5, 0, 3.3), 0); |
carsonbrown27 | 0:7e122b3c7928 | 333 | break; |
carsonbrown27 | 0:7e122b3c7928 | 334 | case 1: // sine |
carsonbrown27 | 0:7e122b3c7928 | 335 | signal.PrepareWaveform(SG_SINE, adjusted_frequency, 50, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3)); |
carsonbrown27 | 0:7e122b3c7928 | 336 | break; |
carsonbrown27 | 0:7e122b3c7928 | 337 | case 2: // square |
carsonbrown27 | 0:7e122b3c7928 | 338 | signal.PrepareWaveform(SG_SQUARE, adjusted_frequency, 50, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3)); |
carsonbrown27 | 0:7e122b3c7928 | 339 | break; |
carsonbrown27 | 0:7e122b3c7928 | 340 | case 3: // triangle |
carsonbrown27 | 0:7e122b3c7928 | 341 | signal.PrepareWaveform(SG_TRIANGLE, adjusted_frequency, 50, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3)); |
carsonbrown27 | 0:7e122b3c7928 | 342 | break; |
carsonbrown27 | 0:7e122b3c7928 | 343 | case 4: // ramp |
carsonbrown27 | 0:7e122b3c7928 | 344 | signal.PrepareWaveform(SG_SAWTOOTH, adjusted_frequency, 50, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3)); |
carsonbrown27 | 0:7e122b3c7928 | 345 | break; |
carsonbrown27 | 0:7e122b3c7928 | 346 | case 5: // pulse |
carsonbrown27 | 0:7e122b3c7928 | 347 | signal.PrepareWaveform(SG_SQUARE, adjusted_frequency, duty_cycle, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3)); |
carsonbrown27 | 0:7e122b3c7928 | 348 | break; |
carsonbrown27 | 0:7e122b3c7928 | 349 | default: |
carsonbrown27 | 0:7e122b3c7928 | 350 | break; |
carsonbrown27 | 0:7e122b3c7928 | 351 | } |
carsonbrown27 | 0:7e122b3c7928 | 352 | wait(1.0); |
carsonbrown27 | 0:7e122b3c7928 | 353 | mySpeaker.PlaySong(note,duration); |
carsonbrown27 | 0:7e122b3c7928 | 354 | red = 1.0; |
carsonbrown27 | 0:7e122b3c7928 | 355 | green = 0.0; |
carsonbrown27 | 0:7e122b3c7928 | 356 | blue = 1.0; |
carsonbrown27 | 0:7e122b3c7928 | 357 | prepared = true; |
carsonbrown27 | 0:7e122b3c7928 | 358 | } else if (!generated) { |
carsonbrown27 | 0:7e122b3c7928 | 359 | uLCD.cls(); |
carsonbrown27 | 0:7e122b3c7928 | 360 | uLCD.locate(1,0); |
carsonbrown27 | 0:7e122b3c7928 | 361 | uLCD.color(BLUE); |
carsonbrown27 | 0:7e122b3c7928 | 362 | uLCD.printf("Waveform is being generated"); |
carsonbrown27 | 0:7e122b3c7928 | 363 | signal.Start(); |
carsonbrown27 | 0:7e122b3c7928 | 364 | red = 1.0; |
carsonbrown27 | 0:7e122b3c7928 | 365 | green = 1.0; |
carsonbrown27 | 0:7e122b3c7928 | 366 | blue = 0.0; |
carsonbrown27 | 0:7e122b3c7928 | 367 | generated = true; |
carsonbrown27 | 0:7e122b3c7928 | 368 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 369 | signal.Stop(); |
carsonbrown27 | 0:7e122b3c7928 | 370 | red = 0.0; |
carsonbrown27 | 0:7e122b3c7928 | 371 | green = 1.0; |
carsonbrown27 | 0:7e122b3c7928 | 372 | blue = 1.0; |
carsonbrown27 | 0:7e122b3c7928 | 373 | updateLCD(); |
carsonbrown27 | 0:7e122b3c7928 | 374 | prepared = false; |
carsonbrown27 | 0:7e122b3c7928 | 375 | generated = false; |
carsonbrown27 | 0:7e122b3c7928 | 376 | } |
carsonbrown27 | 0:7e122b3c7928 | 377 | } |
carsonbrown27 | 0:7e122b3c7928 | 378 | |
carsonbrown27 | 0:7e122b3c7928 | 379 | int main() { |
carsonbrown27 | 0:7e122b3c7928 | 380 | pb_w.mode(PullUp); |
carsonbrown27 | 0:7e122b3c7928 | 381 | pb_v.mode(PullUp); |
carsonbrown27 | 0:7e122b3c7928 | 382 | pb_k.mode(PullUp); |
carsonbrown27 | 0:7e122b3c7928 | 383 | pb_rpg.mode(PullDown); |
carsonbrown27 | 0:7e122b3c7928 | 384 | wait(.001); |
carsonbrown27 | 0:7e122b3c7928 | 385 | pb_w.attach_deasserted(&changeWaveform); |
carsonbrown27 | 0:7e122b3c7928 | 386 | pb_v.attach_deasserted(&changeValues); |
carsonbrown27 | 0:7e122b3c7928 | 387 | pb_k.attach_deasserted(&changePlaces); |
carsonbrown27 | 0:7e122b3c7928 | 388 | pb_rpg.attach_deasserted(&generate); |
carsonbrown27 | 0:7e122b3c7928 | 389 | pb_w.setSampleFrequency(); |
carsonbrown27 | 0:7e122b3c7928 | 390 | pb_v.setSampleFrequency(); |
carsonbrown27 | 0:7e122b3c7928 | 391 | pb_k.setSampleFrequency(); |
carsonbrown27 | 0:7e122b3c7928 | 392 | pb_rpg.setSampleFrequency(); |
carsonbrown27 | 0:7e122b3c7928 | 393 | red = 0.0; // 1.0 is off, 0.0 on |
carsonbrown27 | 0:7e122b3c7928 | 394 | green = 1.0; |
carsonbrown27 | 0:7e122b3c7928 | 395 | blue = 1.0; |
carsonbrown27 | 0:7e122b3c7928 | 396 | rpg_a.rise(&adjustValues); |
carsonbrown27 | 0:7e122b3c7928 | 397 | rpg_a.fall(&adjustValues); |
carsonbrown27 | 0:7e122b3c7928 | 398 | rpg_b.rise(&adjustValues); |
carsonbrown27 | 0:7e122b3c7928 | 399 | rpg_b.fall(&adjustValues); |
carsonbrown27 | 0:7e122b3c7928 | 400 | updateLCD(); |
carsonbrown27 | 0:7e122b3c7928 | 401 | while(1) { |
carsonbrown27 | 0:7e122b3c7928 | 402 | if (!generated && !prepared && value_count != 0) { |
carsonbrown27 | 0:7e122b3c7928 | 403 | updateValue(); |
carsonbrown27 | 0:7e122b3c7928 | 404 | } |
carsonbrown27 | 0:7e122b3c7928 | 405 | if (pc.readable()) { |
carsonbrown27 | 0:7e122b3c7928 | 406 | char str[100]; |
carsonbrown27 | 0:7e122b3c7928 | 407 | char* message = pc.gets(str, 100); |
carsonbrown27 | 0:7e122b3c7928 | 408 | pc.printf(message); |
carsonbrown27 | 0:7e122b3c7928 | 409 | if (prepared && !generated) { |
carsonbrown27 | 0:7e122b3c7928 | 410 | pc.printf("generating"); |
carsonbrown27 | 0:7e122b3c7928 | 411 | generate(); |
carsonbrown27 | 0:7e122b3c7928 | 412 | } else if (prepared && generated) { |
carsonbrown27 | 0:7e122b3c7928 | 413 | pc.printf("stopping"); |
carsonbrown27 | 0:7e122b3c7928 | 414 | generate(); |
carsonbrown27 | 0:7e122b3c7928 | 415 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 416 | uLCD.locate(1,8); |
carsonbrown27 | 0:7e122b3c7928 | 417 | uLCD.color(GREEN); |
carsonbrown27 | 0:7e122b3c7928 | 418 | uLCD.printf("%s", message); |
carsonbrown27 | 0:7e122b3c7928 | 419 | char* token = strtok(message, ","); |
carsonbrown27 | 0:7e122b3c7928 | 420 | char* waveformStr = token; |
carsonbrown27 | 0:7e122b3c7928 | 421 | token = strtok(NULL, ","); |
carsonbrown27 | 0:7e122b3c7928 | 422 | char* amplitudeStr = token; |
carsonbrown27 | 0:7e122b3c7928 | 423 | token = strtok(NULL, ","); |
carsonbrown27 | 0:7e122b3c7928 | 424 | char* offsetStr = token; |
carsonbrown27 | 0:7e122b3c7928 | 425 | token = strtok(NULL, ","); |
carsonbrown27 | 0:7e122b3c7928 | 426 | char* frequencyStr = token; |
carsonbrown27 | 0:7e122b3c7928 | 427 | token = strtok(NULL, ","); |
carsonbrown27 | 0:7e122b3c7928 | 428 | char* duty_cycleStr = token; |
carsonbrown27 | 0:7e122b3c7928 | 429 | waveform = atoi(waveformStr); |
carsonbrown27 | 0:7e122b3c7928 | 430 | amplitude = atof(amplitudeStr); |
carsonbrown27 | 0:7e122b3c7928 | 431 | offset = atof(offsetStr); |
carsonbrown27 | 0:7e122b3c7928 | 432 | frequency = atof(frequencyStr); |
carsonbrown27 | 0:7e122b3c7928 | 433 | if (frequency >= 1000.0) { |
carsonbrown27 | 0:7e122b3c7928 | 434 | khz = true; |
carsonbrown27 | 0:7e122b3c7928 | 435 | frequency /= 1000.0; |
carsonbrown27 | 0:7e122b3c7928 | 436 | } else { |
carsonbrown27 | 0:7e122b3c7928 | 437 | khz = false; |
carsonbrown27 | 0:7e122b3c7928 | 438 | } |
carsonbrown27 | 0:7e122b3c7928 | 439 | duty_cycle = atoi(duty_cycleStr); |
carsonbrown27 | 0:7e122b3c7928 | 440 | updateLCD(); |
carsonbrown27 | 0:7e122b3c7928 | 441 | prepared = false; |
carsonbrown27 | 0:7e122b3c7928 | 442 | generated = false; |
carsonbrown27 | 0:7e122b3c7928 | 443 | generate(); |
carsonbrown27 | 0:7e122b3c7928 | 444 | } |
carsonbrown27 | 0:7e122b3c7928 | 445 | } |
carsonbrown27 | 0:7e122b3c7928 | 446 | } |
carsonbrown27 | 0:7e122b3c7928 | 447 | } |