using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
namespace AudioControler
{
public class TDA7313
{
private GHIElectronics.NETMF.Hardware.Emulation.SoftwareI2C _softI2C;
private I2CDevice.Configuration _slaveConfig;
bool _isSoftI2C = false;
public enum AudioInput: int
{
Input1 = 0,
Input2 = 1,
Input3 = 10,
// Input4 = 11
}
public enum AudioGain: int
{
Gain_0db = 11,
Gain_3_75db = 10,
Gain_7_5db = 1,
Gain_11_25db = 0
}
private byte[] volume = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, /* 0 -- -8.75db */
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, /*-10-- -18.75db */
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, /*-20-- -28.75db */
0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, /*-30-- -38.75db */
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, /*-40-- -48.75db */
0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, /*-50-- -58.75db */
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, /*-60-- -68.75db */
0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, /*-70-- -78.75db */
};
private byte[] spLeftFront = {
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, /* 0 -- -8.75db */
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, /* 10 -- -18.75db */
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, /* 20 -- -28.75db */
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f /* 30 -- -38.75db */
};
private byte[] spRightFront = {
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, /* 0 -- -8.75db */
0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, /* 10 -- -18.75db */
0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, /* 20 -- -28.75db */
0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf /* 30 -- -38.75db */
};
private byte[] spLeftRear = {
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, /* 0 -- -8.75db */
0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, /* 10 -- -18.75db */
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, /* 20 -- -28.75db */
0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf /* 30 -- -38.75db */
};
private byte[] spRightRear = {
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, /* 0 -- -8.75db */
0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, /* 10 -- -18.75db */
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, /* 20 -- -28.75db */
0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff /* 30 -- -38.75db */
};
private byte[] bassControl = { 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68 }; // -14dB to +14dB
private byte[] trebleControl = { 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78 }; // -14dB to +14dB
///
/// Init TDA7313 in Normal I2C mode (hardware)
///
public TDA7313()
{
_isSoftI2C = false;
_slaveConfig = new I2CDevice.Configuration(0x44, 59); //0x44 7bit Chip address
}
///
/// Init TDA7313 in Emulated I2C mode (software)
///
/// Digital I/O pin for SCL
/// Digital I/O pin for SDZ
public TDA7313(Cpu.Pin softSCLpin, Cpu.Pin softSDApin)
{
_isSoftI2C = true;
InitSoft(softSCLpin, softSDApin);
}
private void InitSoft(Cpu.Pin SCLpin, Cpu.Pin SDApin)
{
_softI2C = new GHIElectronics.NETMF.Hardware.Emulation.SoftwareI2C(SCLpin, SDApin, 100);
_softI2C.Transmit(true, false, 0x88); //Chip Address 8 bits
_softI2C.Transmit(false, false, (byte)0x80); //Speaker Left Front 0dB
_softI2C.Transmit(false, false, (byte)0xa0); //Speaker Right Front 0dB
_softI2C.Transmit(false, false, (byte)0xc0); //Speaker Left Rear 0dB
_softI2C.Transmit(false, false, (byte)0xe0); //Speaker Right Rear 0dB
_softI2C.Transmit(false, false, (byte)0x3f); //Volume -78,5 dB (silent)
// _softI2C.Transmit(false, false, (byte)0x00); //Volume 0 dB (full volume)
_softI2C.Transmit(false, false, (byte)0x5c); // Input 1, Gain: 0dB, No loudness
}
private void InitHw()
{
hwI2C(0x88); //Chip Address 8 bits
hwI2C((byte)0x80); //Speaker Left Front 0dB
hwI2C((byte)0xa0); //Speaker Right Front 0dB
hwI2C((byte)0xc0); //Speaker Left Rear 0dB
hwI2C((byte)0xe0); //Speaker Right Rear 0dB
hwI2C((byte)0x3f); //Volume -78,5 dB (silent)
//hwI2C((byte)0x00); //Volume 0 dB (full volume)
hwI2C((byte)0x5c); // Input 1, Gain: 0dB, No loudness
}
///
/// Set Audiosource
///
/// Input 1-3
/// Audio Gain, 0 to +11.25dB in four steps
/// Use loudness filter
public void SetInput(AudioInput inp, AudioGain gain, bool loudness)
{
string _loud = "1";
if(loudness)
_loud = "0";
string _binStr = "010" + FillZero((int)gain, 2) + _loud + FillZero((int)inp, 2);
_binStr = FillZero(_binStr, 8);
if (_isSoftI2C)
{
_softI2C.Transmit(false, false, ConvertString2Byte(_binStr));
}
else
{
hwI2C(ConvertString2Byte(_binStr));
}
}
///
/// Main Volume Control. 0dB to -78,5dB regulated in 1.25dB steps (64 steps)
///
/// Volume in procent. 0 = silent, 100 = full volume.
public void SetVolumeMain(double proc)
{
double _vol = 63 * (proc / 100);
int _volIndex = 63 - ((int)_vol);
if (_isSoftI2C)
{
_softI2C.Transmit(false, false, (byte)volume[_volIndex]);
}
else
{
hwI2C((byte)volume[_volIndex]);
}
}
///
/// Speaker Left Front Volume. 0dB to -38,5dB regulated in 1.25dB steps (32 steps)
///
/// Volume in procent. 0 = silent, 100 = full volume.
public void SetSpeakerLeftFrontVolume(double proc)
{
double _vol = 31 * (proc / 100);
int _volIndex = 31 - ((int)_vol);
if (_isSoftI2C)
_softI2C.Transmit(false, false, (byte)spLeftFront[_volIndex]);
else
hwI2C((byte)spLeftFront[_volIndex]);
}
///
/// Speaker Right Front Volume. 0dB to -38,5dB regulated in 1.25dB steps (32 steps)
///
/// Volume in procent. 0 = silent, 100 = full volume.
public void SetSpeakerRightFrontVolume(double proc)
{
double _vol = 31 * (proc / 100);
int _volIndex = 31 - ((int)_vol);
if (_isSoftI2C)
_softI2C.Transmit(false, false, (byte)spRightFront[_volIndex]);
else
hwI2C((byte)spRightFront[_volIndex]);
}
///
/// Speaker Left Rear Volume. 0dB to -38,5dB regulated in 1.25dB steps (32 steps)
///
/// Volume in procent. 0 = silent, 100 = full volume.
public void SetSpeakerLeftRearVolume(double proc)
{
double _vol = 31 * (proc / 100);
int _volIndex = 31 - ((int)_vol);
if (_isSoftI2C)
_softI2C.Transmit(false, false, (byte)spLeftRear[_volIndex]);
else
hwI2C((byte)spLeftRear[_volIndex]);
}
///
/// Speaker Right Rear Volume. 0dB to -38,5dB regulated in 1.25dB steps (32 steps)
///
/// Volume in procent. 0 = silent, 100 = full volume.
public void SetSpeakerRightRearVolume(double proc)
{
double _vol = 31 * (proc / 100);
int _volIndex = 31 - ((int)_vol);
if (_isSoftI2C)
_softI2C.Transmit(false, false, (byte)spRightRear[_volIndex]);
else
hwI2C((byte)spRightRear[_volIndex]);
}
///
/// Set Treble -14dB to +14dB in 2dB steps
///
/// -7 = -14dB, 0 = 0dB, 7 = +14dB
public void SetTreble(int val)
{
int _index = val + 7;
if (_index < 0)
_index = 0;
if (_index > 14)
_index = 14;
Debug.Print("treble _Index: " + _index);
if (_isSoftI2C)
_softI2C.Transmit(false, false, (byte)trebleControl[_index]);
else
hwI2C((byte)trebleControl[_index]);
}
///
/// Set Bass -14dB to +14dB in 2dB steps
///
/// -7 = -14dB, 0 = 0dB, 7 = +14dB
public void SetBass(int val)
{
int _index = val + 7;
if (_index < 0)
_index = 0;
if (_index > 14)
_index = 14;
Debug.Print("Bass _index: " + _index);
if (_isSoftI2C)
_softI2C.Transmit(false, false, (byte)bassControl[_index]);
else
hwI2C((byte)bassControl[_index]);
}
private void hwI2C(byte data)
{
I2CBus.GetInstance().Write(_slaveConfig, new byte[] { data }, 1000);
}
#region Utils
public string FillZero(int Number, int Digits)
{
return FillZero(Number.ToString(), Digits);
}
public string FillZero(string Number, int Digits)
{
char _char = '0';
for (int i = Number.Length; i < Digits; ++i)
{
Number = _char + Number;
}
return Number;
}
#region ConvertString2Byte
private byte ConvertString2Byte(string strByte)
{
switch(strByte)
{
case "00000000": return 0X00;
case "00000001": return 0X01;
case "00000010": return 0X02;
case "00000011": return 0X03;
case "00000100": return 0X04;
case "00000101": return 0X05;
case "00000110": return 0X06;
case "00000111": return 0X07;
case "00001000": return 0X08;
case "00001001": return 0X09;
case "00001010": return 0X0A;
case "00001011": return 0X0B;
case "00001100": return 0X0C;
case "00001101": return 0X0D;
case "00001110": return 0X0E;
case "00001111": return 0X0F;
case "00010000": return 0X10;
case "00010001": return 0X11;
case "00010010": return 0X12;
case "00010011": return 0X13;
case "00010100": return 0X14;
case "00010101": return 0X15;
case "00010110": return 0X16;
case "00010111": return 0X17;
case "00011000": return 0X18;
case "00011001": return 0X19;
case "00011010": return 0X1A;
case "00011011": return 0X1B;
case "00011100": return 0X1C;
case "00011101": return 0X1D;
case "00011110": return 0X1E;
case "00011111": return 0X1F;
case "00100000": return 0X20;
case "00100001": return 0X21;
case "00100010": return 0X22;
case "00100011": return 0X23;
case "00100100": return 0X24;
case "00100101": return 0X25;
case "00100110": return 0X26;
case "00100111": return 0X27;
case "00101000": return 0X28;
case "00101001": return 0X29;
case "00101010": return 0X2A;
case "00101011": return 0X2B;
case "00101100": return 0X2C;
case "00101101": return 0X2D;
case "00101110": return 0X2E;
case "00101111": return 0X2F;
case "00110000": return 0X30;
case "00110001": return 0X31;
case "00110010": return 0X32;
case "00110011": return 0X33;
case "00110100": return 0X34;
case "00110101": return 0X35;
case "00110110": return 0X36;
case "00110111": return 0X37;
case "00111000": return 0X38;
case "00111001": return 0X39;
case "00111010": return 0X3A;
case "00111011": return 0X3B;
case "00111100": return 0X3C;
case "00111101": return 0X3D;
case "00111110": return 0X3E;
case "00111111": return 0X3F;
case "01000000": return 0X40;
case "01000001": return 0X41;
case "01000010": return 0X42;
case "01000011": return 0X43;
case "01000100": return 0X44;
case "01000101": return 0X45;
case "01000110": return 0X46;
case "01000111": return 0X47;
case "01001000": return 0X48;
case "01001001": return 0X49;
case "01001010": return 0X4A;
case "01001011": return 0X4B;
case "01001100": return 0X4C;
case "01001101": return 0X4D;
case "01001110": return 0X4E;
case "01001111": return 0X4F;
case "01010000": return 0X50;
case "01010001": return 0X51;
case "01010010": return 0X52;
case "01010011": return 0X53;
case "01010100": return 0X54;
case "01010101": return 0X55;
case "01010110": return 0X56;
case "01010111": return 0X57;
case "01011000": return 0X58;
case "01011001": return 0X59;
case "01011010": return 0X5A;
case "01011011": return 0X5B;
case "01011100": return 0X5C;
case "01011101": return 0X5D;
case "01011110": return 0X5E;
case "01011111": return 0X5F;
case "01100000": return 0X60;
case "01100001": return 0X61;
case "01100010": return 0X62;
case "01100011": return 0X63;
case "01100100": return 0X64;
case "01100101": return 0X65;
case "01100110": return 0X66;
case "01100111": return 0X67;
case "01101000": return 0X68;
case "01101001": return 0X69;
case "01101010": return 0X6A;
case "01101011": return 0X6B;
case "01101100": return 0X6C;
case "01101101": return 0X6D;
case "01101110": return 0X6E;
case "01101111": return 0X6F;
case "01110000": return 0X70;
case "01110001": return 0X71;
case "01110010": return 0X72;
case "01110011": return 0X73;
case "01110100": return 0X74;
case "01110101": return 0X75;
case "01110110": return 0X76;
case "01110111": return 0X77;
case "01111000": return 0X78;
case "01111001": return 0X79;
case "01111010": return 0X7A;
case "01111011": return 0X7B;
case "01111100": return 0X7C;
case "01111101": return 0X7D;
case "01111110": return 0X7E;
case "01111111": return 0X7F;
case "10000000": return 0X80;
case "10000001": return 0X81;
case "10000010": return 0X82;
case "10000011": return 0X83;
case "10000100": return 0X84;
case "10000101": return 0X85;
case "10000110": return 0X86;
case "10000111": return 0X87;
case "10001000": return 0X88;
case "10001001": return 0X89;
case "10001010": return 0X8A;
case "10001011": return 0X8B;
case "10001100": return 0X8C;
case "10001101": return 0X8D;
case "10001110": return 0X8E;
case "10001111": return 0X8F;
case "10010000": return 0X90;
case "10010001": return 0X91;
case "10010010": return 0X92;
case "10010011": return 0X93;
case "10010100": return 0X94;
case "10010101": return 0X95;
case "10010110": return 0X96;
case "10010111": return 0X97;
case "10011000": return 0X98;
case "10011001": return 0X99;
case "10011010": return 0X9A;
case "10011011": return 0X9B;
case "10011100": return 0X9C;
case "10011101": return 0X9D;
case "10011110": return 0X9E;
case "10011111": return 0X9F;
case "10100000": return 0XA0;
case "10100001": return 0XA1;
case "10100010": return 0XA2;
case "10100011": return 0XA3;
case "10100100": return 0XA4;
case "10100101": return 0XA5;
case "10100110": return 0XA6;
case "10100111": return 0XA7;
case "10101000": return 0XA8;
case "10101001": return 0XA9;
case "10101010": return 0XAA;
case "10101011": return 0XAB;
case "10101100": return 0XAC;
case "10101101": return 0XAD;
case "10101110": return 0XAE;
case "10101111": return 0XAF;
case "10110000": return 0XB0;
case "10110001": return 0XB1;
case "10110010": return 0XB2;
case "10110011": return 0XB3;
case "10110100": return 0XB4;
case "10110101": return 0XB5;
case "10110110": return 0XB6;
case "10110111": return 0XB7;
case "10111000": return 0XB8;
case "10111001": return 0XB9;
case "10111010": return 0XBA;
case "10111011": return 0XBB;
case "10111100": return 0XBC;
case "10111101": return 0XBD;
case "10111110": return 0XBE;
case "10111111": return 0XBF;
case "11000000": return 0XC0;
case "11000001": return 0XC1;
case "11000010": return 0XC2;
case "11000011": return 0XC3;
case "11000100": return 0XC4;
case "11000101": return 0XC5;
case "11000110": return 0XC6;
case "11000111": return 0XC7;
case "11001000": return 0XC8;
case "11001001": return 0XC9;
case "11001010": return 0XCA;
case "11001011": return 0XCB;
case "11001100": return 0XCC;
case "11001101": return 0XCD;
case "11001110": return 0XCE;
case "11001111": return 0XCF;
case "11010000": return 0XD0;
case "11010001": return 0XD1;
case "11010010": return 0XD2;
case "11010011": return 0XD3;
case "11010100": return 0XD4;
case "11010101": return 0XD5;
case "11010110": return 0XD6;
case "11010111": return 0XD7;
case "11011000": return 0XD8;
case "11011001": return 0XD9;
case "11011010": return 0XDA;
case "11011011": return 0XDB;
case "11011100": return 0XDC;
case "11011101": return 0XDD;
case "11011110": return 0XDE;
case "11011111": return 0XDF;
case "11100000": return 0XE0;
case "11100001": return 0XE1;
case "11100010": return 0XE2;
case "11100011": return 0XE3;
case "11100100": return 0XE4;
case "11100101": return 0XE5;
case "11100110": return 0XE6;
case "11100111": return 0XE7;
case "11101000": return 0XE8;
case "11101001": return 0XE9;
case "11101010": return 0XEA;
case "11101011": return 0XEB;
case "11101100": return 0XEC;
case "11101101": return 0XED;
case "11101110": return 0XEE;
case "11101111": return 0XEF;
case "11110000": return 0XF0;
case "11110001": return 0XF1;
case "11110010": return 0XF2;
case "11110011": return 0XF3;
case "11110100": return 0XF4;
case "11110101": return 0XF5;
case "11110110": return 0XF6;
case "11110111": return 0XF7;
case "11111000": return 0XF8;
case "11111001": return 0XF9;
case "11111010": return 0XFA;
case "11111011": return 0XFB;
case "11111100": return 0XFC;
case "11111101": return 0XFD;
case "11111110": return 0XFE;
case "11111111": return 0XFF;
default: return 0x00;
}
}
#endregion
#endregion
}
}