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.
PreampTDA7419.cpp
00001 /** PreampTDA7419 Library 00002 * 00003 * @Author: Dan Cohen 00004 * 00005 */ 00006 00007 #include "mbed.h" 00008 #include "PreampTDA7419.h" 00009 #include <stdio.h> 00010 #include <string.h> 00011 00012 PreampTDA7419::PreampTDA7419(PinName sda, PinName scl): 00013 _device(sda, scl) 00014 { 00015 _volume = 6; 00016 _input = 1; 00017 00018 _mute = 0; 00019 _mix = 0; 00020 00021 // for register 4 Treble Filter 00022 _referenceInE = 0; 00023 _trebleCenterFreq = 0; 00024 _treble = 0; 00025 00026 // for middle frequecy filter 00027 _middleSoftStep = 0; 00028 _middleQ = 0; 00029 _middle = 0; 00030 00031 _atten_lf = 9; 00032 _atten_rf = 9; 00033 _atten_lr = 9; 00034 _atten_rr = 9; 00035 _atten_mix = 9; 00036 _atten_sub = 9; 00037 00038 } 00039 00040 void PreampTDA7419::writeToTDA7419 (int command, int value) 00041 { 00042 int transmissionSuccessful; 00043 _device.start(); 00044 transmissionSuccessful = _device.write(TDA7419_ADDRESS<<1); 00045 transmissionSuccessful |= _device.write(command); 00046 transmissionSuccessful |= _device.write(value); 00047 _device.stop(); 00048 // return (transmissionSuccessful); 00049 } 00050 00051 ///////////////////////////////// 00052 // set the speaker attenuators // 00053 ///////////////////////////////// 00054 // attenuation can be set from 0 to 11 and this is mapped to the 00055 // values that the TDA7419 uses for it's attenuation (0->h60) 00056 00057 // 00058 // (FL/FR/RL/RR/SWL/SWR) (13-18) 00059 void PreampTDA7419::setAttenuationReg(int regAddr, int attenuation) 00060 { 00061 int regAtten; 00062 if (attenuation == 11) { 00063 regAtten = 13; 00064 } else if (attenuation == 10) { 00065 regAtten = 6; 00066 } else { 00067 regAtten = (99-(attenuation*9)); 00068 } 00069 writeToTDA7419(regAddr, regAtten); 00070 } 00071 00072 int PreampTDA7419::calcToneAttenuationReg(int attenuation) 00073 { 00074 int regAtten; 00075 if (attenuation > 0) { 00076 regAtten = 16 + (attenuation * 3); 00077 } else if (attenuation == 0) { 00078 regAtten = 0; 00079 } else if (attenuation < 0) { 00080 regAtten = 0 - (attenuation * 3); 00081 } 00082 return (regAtten); 00083 } 00084 00085 // update all of the registers in the TDA7419 00086 void PreampTDA7419::updateTDA7419Reg() 00087 { 00088 00089 int s_main_source = 0; 00090 int s_main_loud = 1 | 0x40; 00091 int s_softmute = 2 | 0x40; 00092 int s_volume = 3 | 0x40; 00093 int s_treble = 4 | 0x40; 00094 int s_middle = 5 | 0x40; 00095 int s_bass = 6 | 0x40; 00096 int s_second_source = 7 | 0x40; 00097 int s_sub_mid_bass = 8 | 0x40; 00098 int s_mix_gain = 9 | 0x40; 00099 int s_atten_lf = 10 | 0x40; 00100 int s_atten_rf = 11 | 0x40; 00101 int s_atten_lr = 12 | 0x40; 00102 int s_atten_rr = 13 | 0x40; 00103 int s_atten_mix = 14 | 0x40; 00104 int s_atten_sub = 15 | 0x40; 00105 int s_spectrum = 16 | 0x40; 00106 // int s_test = 17 | 0x40; 00107 00108 ////////////////////////////////////////////////////////////////// 00109 // Calculate actual register values from the variables that the // 00110 // buttons control // 00111 ////////////////////////////////////////////////////////////////// 00112 00113 ////////////////////////// 00114 // update the registers // 00115 ////////////////////////// 00116 writeToTDA7419(s_main_source, ( (0x78) | (_input & 0x3) ) ); 00117 writeToTDA7419(s_main_loud, (0xc0)); 00118 writeToTDA7419(s_softmute, (0xa7)); 00119 setAttenuationReg(s_volume, _volume); 00120 00121 00122 // tone register attenuation isn't simple so moving that 00123 // calculation to a separate function 00124 // locking softwtep as '0' because that is on and I think we 00125 // want soft step! 00126 writeToTDA7419(s_treble, 00127 ( (0 & 0x1 ) << 7 ) | 00128 ( (1 & 0x3 ) << 5 ) | 00129 ( (calcToneAttenuationReg(_treble) & 0x1f ) ) ); 00130 00131 writeToTDA7419(s_middle, 00132 ( (0 & 0x1 ) << 7 ) | 00133 ( (1 & 0x3 ) << 5 ) | 00134 ( (calcToneAttenuationReg(_middle) & 0x1f ) ) ); 00135 00136 writeToTDA7419(s_bass, 00137 ( (0 & 0x1 ) << 7 ) | 00138 ( (1 & 0x3 ) << 5 ) | 00139 ( (calcToneAttenuationReg(_bass) & 0x1f ) ) ); 00140 00141 00142 // this register allows the second source to be routed to the rear speakers 00143 // not useful in the context of this project 00144 writeToTDA7419(s_second_source, (0x07)); 00145 00146 // this is the subwoofer cut-off frequency 00147 // 11 which is 160Khz) 00148 writeToTDA7419(s_sub_mid_bass, (0x63)); 00149 00150 // mix to the front speakers, enable the sub, no gain 00151 if (_mix == 1) { 00152 writeToTDA7419(s_mix_gain, (0xf7)); 00153 } else { 00154 writeToTDA7419(s_mix_gain, (0xf0)); 00155 } 00156 00157 setAttenuationReg(s_atten_lf , _atten_lf ); 00158 setAttenuationReg(s_atten_rf , _atten_rf ); 00159 setAttenuationReg(s_atten_lr , _atten_lr ); 00160 setAttenuationReg(s_atten_rr , _atten_rr ); 00161 00162 setAttenuationReg(s_atten_mix , _atten_mix ); 00163 setAttenuationReg(s_atten_sub , _atten_sub ); 00164 00165 writeToTDA7419 (s_spectrum, (0x09)); 00166 00167 } 00168 00169 /* setVolume: This sets the volume within the valid range of 0->11 00170 return indicates it was successfully set */ 00171 void PreampTDA7419::setVolume(int volume) 00172 { 00173 if (volume > 11) { 00174 _volume = 11; 00175 } else if (volume < 0) { 00176 volume = 0; 00177 } else { 00178 _volume = volume; 00179 } 00180 updateTDA7419Reg(); 00181 } 00182 00183 /* readVolume: return the volume level that is currently set */ 00184 int PreampTDA7419::readVolume() 00185 { 00186 return (_volume); 00187 } 00188 /* readVolume: return the volume level that is currently set */ 00189 int PreampTDA7419::increaseVolume() 00190 { 00191 _volume++; 00192 setVolume(_volume); 00193 return (_volume); 00194 } 00195 /* readVolume: return the volume level that is currently set */ 00196 int PreampTDA7419::decreaseVolume() 00197 { 00198 _volume--; 00199 setVolume(_volume); 00200 return (_volume); 00201 } 00202 00203 void PreampTDA7419::setInput(int input) 00204 { 00205 if (input > 3) { 00206 _input = 3; 00207 } else if (input < 0) { 00208 input = 0; 00209 } else { 00210 _input = input; 00211 } 00212 updateTDA7419Reg(); 00213 } 00214 00215 int PreampTDA7419::readInput() 00216 { 00217 return (_input); 00218 } 00219 00220 int PreampTDA7419::increaseTreble() 00221 { 00222 if (_treble < 5) { 00223 _treble++; 00224 } 00225 updateTDA7419Reg(); 00226 return(_treble); 00227 } 00228 00229 int PreampTDA7419::decreaseTreble() 00230 { 00231 if (_treble > -5) { 00232 _treble--; 00233 } 00234 updateTDA7419Reg(); 00235 return(_treble); 00236 } 00237 00238 int PreampTDA7419::readTreble() 00239 { 00240 return (_treble); 00241 } 00242 00243 int PreampTDA7419::increaseMiddle() 00244 { 00245 if (_middle < 5) { 00246 _middle++; 00247 } 00248 updateTDA7419Reg(); 00249 return(_middle); 00250 } 00251 00252 int PreampTDA7419::decreaseMiddle() 00253 { 00254 if (_middle > -5) { 00255 _middle--; 00256 } 00257 updateTDA7419Reg(); 00258 return(_middle); 00259 } 00260 00261 int PreampTDA7419::readMiddle() 00262 { 00263 return (_middle); 00264 } 00265 00266 int PreampTDA7419::increaseBass() 00267 { 00268 if (_bass < 5) { 00269 _bass++; 00270 } 00271 updateTDA7419Reg(); 00272 return(_bass); 00273 } 00274 00275 int PreampTDA7419::decreaseBass() 00276 { 00277 if (_bass > -5) { 00278 _bass--; 00279 } 00280 updateTDA7419Reg(); 00281 return(_bass); 00282 } 00283 00284 int PreampTDA7419::readBass() 00285 { 00286 return (_bass); 00287 } 00288 00289 int PreampTDA7419::increaseSpeaker (int speakerNumber) { 00290 switch (speakerNumber) { 00291 case (1): if (_atten_lf < 11) { _atten_lf++; }; updateTDA7419Reg(); return( _atten_lf ); 00292 case (2): if (_atten_rf < 11) { _atten_rf++; }; updateTDA7419Reg(); return( _atten_rf ); 00293 case (3): if (_atten_lr < 11) { _atten_lr++; }; updateTDA7419Reg(); return( _atten_lr ); 00294 case (4): if (_atten_rr < 11) { _atten_rr++; }; updateTDA7419Reg(); return( _atten_rr ); 00295 case (5): if (_atten_sub < 11) { _atten_sub++; }; updateTDA7419Reg(); return( _atten_sub ); 00296 case (6): if (_atten_mix < 11) { _atten_mix++; }; updateTDA7419Reg(); return( _atten_mix ); 00297 } 00298 return (_atten_lf ); 00299 } 00300 00301 int PreampTDA7419::decreaseSpeaker (int speakerNumber) { 00302 switch (speakerNumber) { 00303 case (1): if (_atten_lf > 0) { _atten_lf--; }; updateTDA7419Reg(); return( _atten_lf ); 00304 case (2): if (_atten_rf > 0) { _atten_rf--; }; updateTDA7419Reg(); return( _atten_rf ); 00305 case (3): if (_atten_lr > 0) { _atten_lr--; }; updateTDA7419Reg(); return( _atten_lr ); 00306 case (4): if (_atten_rr > 0) { _atten_rr--; }; updateTDA7419Reg(); return( _atten_rr ); 00307 case (5): if (_atten_sub > 0) { _atten_sub--; }; updateTDA7419Reg(); return( _atten_sub ); 00308 case (6): if (_atten_mix > 0) { _atten_mix--; }; updateTDA7419Reg(); return( _atten_mix ); 00309 } 00310 return (_atten_lf ); 00311 } 00312 00313 int PreampTDA7419::readSpeaker (int speakerNumber) { 00314 switch (speakerNumber) { 00315 case (1): return( _atten_lf ); 00316 case (2): return( _atten_rf ); 00317 case (3): return( _atten_lr ); 00318 case (4): return( _atten_rr ); 00319 case (5): return( _atten_sub ); 00320 case (6): return( _atten_mix ); 00321 } 00322 return (_atten_lf ); 00323 } 00324 00325 int PreampTDA7419::toggleMix() { 00326 _mix = !_mix; 00327 updateTDA7419Reg(); 00328 return (_mix); 00329 } 00330 00331 int PreampTDA7419::readMix() { 00332 return (_mix); 00333 }
Generated on Thu Jul 14 2022 04:32:30 by
1.7.2