Car stereo control using TDA7419 for input select, audio control. Adafruit 96x64 monochrome 0.96" display to show the audio selections four buttons to control selections. Next steps: take input from the car steering wheel controls!

Dependencies:   Adafruit_GFX PinDetect_KL25Z PreampTDA7419 mbed

Committer:
danielashercohen
Date:
Sun Oct 26 22:53:27 2014 +0000
Revision:
4:46da1eff72bf
Parent:
3:8d3cc3488cd8
Child:
5:28533591b528
Basic audio functions (balance, fade, tone, mix, input select) all working.  Display working.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
danielashercohen 0:36eee45709c8 1 #include "mbed.h"
danielashercohen 0:36eee45709c8 2 #include "PinDetect.h"
danielashercohen 1:f5b8687f67b8 3 #include "Adafruit_SSD1306.h"
danielashercohen 2:2b0cf4d80668 4 #include "PreampTDA7419.h"
danielashercohen 0:36eee45709c8 5
danielashercohen 3:8d3cc3488cd8 6 #define NUM_OPTIONS 12 // how many different options does the stereo have?
danielashercohen 3:8d3cc3488cd8 7 char option;
danielashercohen 3:8d3cc3488cd8 8
danielashercohen 0:36eee45709c8 9 PinDetect PinUp ( PTA1 );
danielashercohen 0:36eee45709c8 10 PinDetect PinLeft ( PTD4 );
danielashercohen 0:36eee45709c8 11 PinDetect PinRight ( PTA2 );
danielashercohen 0:36eee45709c8 12 PinDetect PinDown ( PTA12 );
danielashercohen 0:36eee45709c8 13
danielashercohen 1:f5b8687f67b8 14 class SPI2 : public SPI
danielashercohen 1:f5b8687f67b8 15 {
danielashercohen 1:f5b8687f67b8 16 public:
danielashercohen 1:f5b8687f67b8 17 SPI2(PinName mosi, PinName miso, PinName clk) : SPI(mosi,miso,clk)
danielashercohen 1:f5b8687f67b8 18 {
danielashercohen 1:f5b8687f67b8 19 format(8,3);
danielashercohen 1:f5b8687f67b8 20 frequency(2000000);
danielashercohen 1:f5b8687f67b8 21 };
danielashercohen 1:f5b8687f67b8 22 };
danielashercohen 0:36eee45709c8 23
danielashercohen 1:f5b8687f67b8 24 SPI2 gSpi(PTD2,NC,PTD1);
danielashercohen 1:f5b8687f67b8 25 Adafruit_SSD1306 display (gSpi, PTD0, PTD5, PTA13); // SPI obect, DC, RST, CS
danielashercohen 2:2b0cf4d80668 26 PreampTDA7419 Preamp (PTE0, PTE1);
danielashercohen 1:f5b8687f67b8 27
danielashercohen 4:46da1eff72bf 28 /////////////////////////////////////////////
danielashercohen 4:46da1eff72bf 29 // Helper functions for the serial display //
danielashercohen 4:46da1eff72bf 30 /////////////////////////////////////////////
danielashercohen 1:f5b8687f67b8 31 void testfillrect(void) {
danielashercohen 1:f5b8687f67b8 32 uint8_t color = 1;
danielashercohen 1:f5b8687f67b8 33 for (int16_t i=0; i<display.height()/2; i+=3) {
danielashercohen 1:f5b8687f67b8 34 // alternate colors
danielashercohen 1:f5b8687f67b8 35 wait(0.05);
danielashercohen 1:f5b8687f67b8 36 display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
danielashercohen 1:f5b8687f67b8 37 display.display();
danielashercohen 1:f5b8687f67b8 38 color++;
danielashercohen 1:f5b8687f67b8 39 }
danielashercohen 1:f5b8687f67b8 40 }
danielashercohen 0:36eee45709c8 41
danielashercohen 0:36eee45709c8 42 void displayWrite(char firstLine[], int value)
danielashercohen 0:36eee45709c8 43 {
danielashercohen 1:f5b8687f67b8 44 display.clearDisplay();
danielashercohen 1:f5b8687f67b8 45 display.setCursor(0,0);
danielashercohen 1:f5b8687f67b8 46 display.setTextSize(2);
danielashercohen 1:f5b8687f67b8 47 display.printf("%s\r\n", firstLine);
danielashercohen 1:f5b8687f67b8 48 display.setCursor(0,30);
danielashercohen 1:f5b8687f67b8 49 display.setTextSize(5);
danielashercohen 1:f5b8687f67b8 50 display.printf(" %d\r\n", value);
danielashercohen 1:f5b8687f67b8 51 display.display();
danielashercohen 0:36eee45709c8 52 }
danielashercohen 0:36eee45709c8 53
danielashercohen 4:46da1eff72bf 54 void displayWrite(char firstLine[], char secondLine[])
danielashercohen 4:46da1eff72bf 55 {
danielashercohen 4:46da1eff72bf 56 display.clearDisplay();
danielashercohen 4:46da1eff72bf 57 display.setCursor(0,0);
danielashercohen 4:46da1eff72bf 58 display.setTextSize(2);
danielashercohen 4:46da1eff72bf 59 display.printf("%s\r\n", firstLine);
danielashercohen 4:46da1eff72bf 60 display.printf("%s\r\n", secondLine);
danielashercohen 4:46da1eff72bf 61 display.display();
danielashercohen 4:46da1eff72bf 62 }
danielashercohen 4:46da1eff72bf 63
danielashercohen 0:36eee45709c8 64 void processButtonPress (int button) {
danielashercohen 0:36eee45709c8 65
danielashercohen 0:36eee45709c8 66 if (button == 0) {
danielashercohen 0:36eee45709c8 67 if (option < (NUM_OPTIONS-1)) {
danielashercohen 0:36eee45709c8 68 option++;
danielashercohen 0:36eee45709c8 69 } else {
danielashercohen 0:36eee45709c8 70 option = 0;
danielashercohen 0:36eee45709c8 71 }
danielashercohen 0:36eee45709c8 72 }
danielashercohen 0:36eee45709c8 73
danielashercohen 0:36eee45709c8 74 if (button == 1) {
danielashercohen 0:36eee45709c8 75 if (option > 0) {
danielashercohen 0:36eee45709c8 76 option--;
danielashercohen 0:36eee45709c8 77 } else {
danielashercohen 0:36eee45709c8 78 option = (NUM_OPTIONS-1);
danielashercohen 0:36eee45709c8 79 }
danielashercohen 0:36eee45709c8 80 }
danielashercohen 0:36eee45709c8 81
danielashercohen 0:36eee45709c8 82 switch (option) {
danielashercohen 0:36eee45709c8 83 case (0): // if volume option is selected change volume when button 1 and 2 are pressed
danielashercohen 0:36eee45709c8 84 if (button == 2) {
danielashercohen 3:8d3cc3488cd8 85 Preamp.decreaseVolume();
danielashercohen 0:36eee45709c8 86 }
danielashercohen 0:36eee45709c8 87 if (button == 3) {
danielashercohen 3:8d3cc3488cd8 88 Preamp.increaseVolume();
danielashercohen 0:36eee45709c8 89 }
danielashercohen 3:8d3cc3488cd8 90 displayWrite("Volume", Preamp.readVolume() );
danielashercohen 0:36eee45709c8 91 break;
danielashercohen 0:36eee45709c8 92 case (1): // manage the input - 1,2,3 are the standard single ended inputs
danielashercohen 3:8d3cc3488cd8 93 int input = Preamp.readInput();
danielashercohen 0:36eee45709c8 94 if (button == 2) {
danielashercohen 3:8d3cc3488cd8 95 input--;
danielashercohen 0:36eee45709c8 96 }
danielashercohen 0:36eee45709c8 97 if (button == 3) {
danielashercohen 3:8d3cc3488cd8 98 input++;
danielashercohen 0:36eee45709c8 99 }
danielashercohen 3:8d3cc3488cd8 100 Preamp.setInput(input);
danielashercohen 3:8d3cc3488cd8 101 displayWrite("Input", Preamp.readInput() );
danielashercohen 0:36eee45709c8 102 break;
danielashercohen 0:36eee45709c8 103 case (2): // manage the treble value
danielashercohen 0:36eee45709c8 104 if (button == 2) {
danielashercohen 3:8d3cc3488cd8 105 Preamp.decreaseTreble();
danielashercohen 0:36eee45709c8 106 }
danielashercohen 0:36eee45709c8 107 if (button == 3) {
danielashercohen 3:8d3cc3488cd8 108 Preamp.increaseTreble();
danielashercohen 0:36eee45709c8 109 }
danielashercohen 3:8d3cc3488cd8 110 displayWrite("Treble", Preamp.readTreble());
danielashercohen 0:36eee45709c8 111 break;
danielashercohen 4:46da1eff72bf 112 case (3): // manage the treble value
danielashercohen 0:36eee45709c8 113 if (button == 2) {
danielashercohen 4:46da1eff72bf 114 Preamp.decreaseMiddle();
danielashercohen 0:36eee45709c8 115 }
danielashercohen 0:36eee45709c8 116 if (button == 3) {
danielashercohen 4:46da1eff72bf 117 Preamp.increaseMiddle();
danielashercohen 0:36eee45709c8 118 }
danielashercohen 4:46da1eff72bf 119 displayWrite("Middle", Preamp.readMiddle());
danielashercohen 4:46da1eff72bf 120 break;
danielashercohen 4:46da1eff72bf 121 case (4): // manage the treble value
danielashercohen 0:36eee45709c8 122 if (button == 2) {
danielashercohen 4:46da1eff72bf 123 Preamp.decreaseBass();
danielashercohen 0:36eee45709c8 124 }
danielashercohen 0:36eee45709c8 125 if (button == 3) {
danielashercohen 4:46da1eff72bf 126 Preamp.increaseBass();
danielashercohen 0:36eee45709c8 127 }
danielashercohen 4:46da1eff72bf 128 displayWrite("Bass", Preamp.readBass());
danielashercohen 0:36eee45709c8 129 break;
danielashercohen 0:36eee45709c8 130
danielashercohen 0:36eee45709c8 131 // Manage the attenuators
danielashercohen 0:36eee45709c8 132 case (5): // manage the atten_lf value
danielashercohen 0:36eee45709c8 133 if (button == 2) {
danielashercohen 4:46da1eff72bf 134 displayWrite("LF", Preamp.decreaseSpeaker(1) );
danielashercohen 4:46da1eff72bf 135 }
danielashercohen 4:46da1eff72bf 136 else if (button == 3) {
danielashercohen 4:46da1eff72bf 137 displayWrite("LF", Preamp.increaseSpeaker(1) );
danielashercohen 4:46da1eff72bf 138 }
danielashercohen 4:46da1eff72bf 139 else {
danielashercohen 4:46da1eff72bf 140 displayWrite("LF", Preamp.readSpeaker(1) );
danielashercohen 0:36eee45709c8 141 }
danielashercohen 0:36eee45709c8 142 break;
danielashercohen 0:36eee45709c8 143 case (6): // manage the atten_rf value
danielashercohen 0:36eee45709c8 144 if (button == 2) {
danielashercohen 4:46da1eff72bf 145 displayWrite("RF", Preamp.decreaseSpeaker(2) );
danielashercohen 4:46da1eff72bf 146 }
danielashercohen 4:46da1eff72bf 147 else if (button == 3) {
danielashercohen 4:46da1eff72bf 148 displayWrite("RF", Preamp.increaseSpeaker(2) );
danielashercohen 0:36eee45709c8 149 }
danielashercohen 4:46da1eff72bf 150 else {
danielashercohen 4:46da1eff72bf 151 displayWrite("RF", Preamp.readSpeaker(2) );
danielashercohen 4:46da1eff72bf 152 }
danielashercohen 0:36eee45709c8 153 break;
danielashercohen 0:36eee45709c8 154 case (7): // manage the atten_lr value
danielashercohen 0:36eee45709c8 155 if (button == 2) {
danielashercohen 4:46da1eff72bf 156 displayWrite("LR", Preamp.decreaseSpeaker(3) );
danielashercohen 0:36eee45709c8 157 }
danielashercohen 4:46da1eff72bf 158 else if (button == 3) {
danielashercohen 4:46da1eff72bf 159 displayWrite("LR", Preamp.increaseSpeaker(3) );
danielashercohen 4:46da1eff72bf 160 }
danielashercohen 4:46da1eff72bf 161 else {
danielashercohen 4:46da1eff72bf 162 displayWrite("LR", Preamp.readSpeaker(3) );
danielashercohen 4:46da1eff72bf 163 }
danielashercohen 0:36eee45709c8 164 break;
danielashercohen 0:36eee45709c8 165 case (8): // manage the atten_rr value
danielashercohen 0:36eee45709c8 166 if (button == 2) {
danielashercohen 4:46da1eff72bf 167 displayWrite("RR", Preamp.decreaseSpeaker(4) );
danielashercohen 4:46da1eff72bf 168 }
danielashercohen 4:46da1eff72bf 169 else if (button == 3) {
danielashercohen 4:46da1eff72bf 170 displayWrite("RR", Preamp.increaseSpeaker(4) );
danielashercohen 0:36eee45709c8 171 }
danielashercohen 4:46da1eff72bf 172 else {
danielashercohen 4:46da1eff72bf 173 displayWrite("RR", Preamp.readSpeaker(4) );
danielashercohen 4:46da1eff72bf 174 }
danielashercohen 0:36eee45709c8 175 break;
danielashercohen 4:46da1eff72bf 176 case (9): // manage the atten_sub value
danielashercohen 0:36eee45709c8 177 if (button == 2) {
danielashercohen 4:46da1eff72bf 178 displayWrite("SUB", Preamp.decreaseSpeaker(5) );
danielashercohen 0:36eee45709c8 179 }
danielashercohen 4:46da1eff72bf 180 else if (button == 3) {
danielashercohen 4:46da1eff72bf 181 displayWrite("SUB", Preamp.increaseSpeaker(5) );
danielashercohen 0:36eee45709c8 182 }
danielashercohen 4:46da1eff72bf 183 else {
danielashercohen 4:46da1eff72bf 184 displayWrite("SUB", Preamp.readSpeaker(5) );
danielashercohen 4:46da1eff72bf 185 }
danielashercohen 0:36eee45709c8 186 break;
danielashercohen 4:46da1eff72bf 187 case (10): // manage the atten_mix value
danielashercohen 0:36eee45709c8 188 if (button == 2) {
danielashercohen 4:46da1eff72bf 189 displayWrite("Mix Level", Preamp.decreaseSpeaker(6) );
danielashercohen 0:36eee45709c8 190 }
danielashercohen 4:46da1eff72bf 191 else if (button == 3) {
danielashercohen 4:46da1eff72bf 192 displayWrite("Mix Level", Preamp.increaseSpeaker(6) );
danielashercohen 0:36eee45709c8 193 }
danielashercohen 4:46da1eff72bf 194 else {
danielashercohen 4:46da1eff72bf 195 displayWrite("Mix Level", Preamp.readSpeaker(6) );
danielashercohen 4:46da1eff72bf 196 }
danielashercohen 0:36eee45709c8 197 break;
danielashercohen 0:36eee45709c8 198 case (11): // manage the atten_sub value
danielashercohen 4:46da1eff72bf 199 if ( (button == 2) || (button == 3) ) {
danielashercohen 4:46da1eff72bf 200 Preamp.toggleMix();
danielashercohen 4:46da1eff72bf 201 }
danielashercohen 4:46da1eff72bf 202 if (Preamp.readMix()) {
danielashercohen 4:46da1eff72bf 203 displayWrite("Mix", "Enabled");
danielashercohen 0:36eee45709c8 204 }
danielashercohen 4:46da1eff72bf 205 else {
danielashercohen 4:46da1eff72bf 206 displayWrite("Mix", "Disabled");
danielashercohen 0:36eee45709c8 207 }
danielashercohen 4:46da1eff72bf 208 break;
danielashercohen 4:46da1eff72bf 209
danielashercohen 0:36eee45709c8 210 }
danielashercohen 0:36eee45709c8 211 }
danielashercohen 0:36eee45709c8 212
danielashercohen 0:36eee45709c8 213 void UpPressed( void )
danielashercohen 0:36eee45709c8 214 {
danielashercohen 0:36eee45709c8 215 processButtonPress(0);
danielashercohen 0:36eee45709c8 216 }
danielashercohen 0:36eee45709c8 217
danielashercohen 0:36eee45709c8 218 void LeftPressed( void )
danielashercohen 0:36eee45709c8 219 {
danielashercohen 0:36eee45709c8 220 processButtonPress(2);
danielashercohen 0:36eee45709c8 221 }
danielashercohen 0:36eee45709c8 222
danielashercohen 0:36eee45709c8 223 void RightPressed( void )
danielashercohen 0:36eee45709c8 224 {
danielashercohen 0:36eee45709c8 225 processButtonPress(3);
danielashercohen 0:36eee45709c8 226 }
danielashercohen 0:36eee45709c8 227
danielashercohen 0:36eee45709c8 228 void DownPressed( void )
danielashercohen 0:36eee45709c8 229 {
danielashercohen 0:36eee45709c8 230 processButtonPress(1);
danielashercohen 0:36eee45709c8 231 }
danielashercohen 0:36eee45709c8 232
danielashercohen 0:36eee45709c8 233 int main()
danielashercohen 0:36eee45709c8 234 {
danielashercohen 0:36eee45709c8 235 PinUp .mode( PullUp );
danielashercohen 0:36eee45709c8 236 PinLeft .mode( PullUp );
danielashercohen 0:36eee45709c8 237 PinRight.mode( PullUp );
danielashercohen 0:36eee45709c8 238 PinDown .mode( PullUp );
danielashercohen 0:36eee45709c8 239
danielashercohen 0:36eee45709c8 240 PinUp .attach_asserted( &UpPressed );
danielashercohen 0:36eee45709c8 241 PinLeft .attach_asserted( &LeftPressed );
danielashercohen 0:36eee45709c8 242 PinRight.attach_asserted( &RightPressed );
danielashercohen 0:36eee45709c8 243 PinDown .attach_asserted( &DownPressed );
danielashercohen 0:36eee45709c8 244
danielashercohen 1:f5b8687f67b8 245 display.clearDisplay();
danielashercohen 1:f5b8687f67b8 246 // draw multiple rectangles
danielashercohen 1:f5b8687f67b8 247 testfillrect();
danielashercohen 4:46da1eff72bf 248 wait(0.3);
danielashercohen 1:f5b8687f67b8 249 display.display();
danielashercohen 1:f5b8687f67b8 250 display.clearDisplay();
danielashercohen 1:f5b8687f67b8 251 display.display();
danielashercohen 1:f5b8687f67b8 252
danielashercohen 0:36eee45709c8 253
danielashercohen 0:36eee45709c8 254 // Sampling does not begin until you set a frequency.
danielashercohen 0:36eee45709c8 255 // The default is 20ms. If you want a different frequency
danielashercohen 0:36eee45709c8 256 // then pass the period in microseconds for example, for 10ms :-
danielashercohen 0:36eee45709c8 257 // pin.setSampleFrequency( 10000 );
danielashercohen 0:36eee45709c8 258 //
danielashercohen 3:8d3cc3488cd8 259 PinUp .setSampleFrequency(10000); // Defaults to 20ms.
danielashercohen 3:8d3cc3488cd8 260 PinLeft .setSampleFrequency(10000); // Defaults to 20ms.
danielashercohen 3:8d3cc3488cd8 261 PinRight.setSampleFrequency(10000); // Defaults to 20ms.
danielashercohen 3:8d3cc3488cd8 262 PinDown .setSampleFrequency(10000); // Defaults to 20ms.
danielashercohen 0:36eee45709c8 263
danielashercohen 3:8d3cc3488cd8 264 // option = NUM_OPTIONS;
danielashercohen 1:f5b8687f67b8 265 processButtonPress(0);
danielashercohen 1:f5b8687f67b8 266
danielashercohen 0:36eee45709c8 267 while (1) {
danielashercohen 3:8d3cc3488cd8 268 wait(0.2);
danielashercohen 0:36eee45709c8 269 }
danielashercohen 0:36eee45709c8 270
danielashercohen 0:36eee45709c8 271 }
danielashercohen 0:36eee45709c8 272
danielashercohen 0:36eee45709c8 273 // EOF