comunication between front panel and main MCU - tomaskovacik/audi_concert1_chorus1_volume_fix GitHub Wiki
example of comunication from MCU to PANEL:
example of comunication from PANEL to MCU, button push:
Do = status
d1 = data
d2 = clock
meaning of bytes can be understand after looking at source code of functions decoding button push and display data:
void decode_display_data(uint8_t _data[howmanybytesinpacket]) {
// if(_data[1] == 0x13) Serial.println(_data[2],BIN); //debug
uint8_t dump = 0;
switch (_data[1]) { //switching second byte, which indicate type of packet data
case 0x13:
//leds: whole packet: 9A 13 2E 0 29 0 0 0 0 0 0 0 0 0 0
{
grab_volume = 1;
//Serial.println(_data[2],BIN);
if (_data[2] & B00000001) Serial.print(F("REG ")); //REG bit
if (_data[2] & B00000010) Serial.print(F("RDS ")); //RDS bit
if (_data[2] & B00000100) Serial.print(F("AS ")); //AS bit
if (_data[2] & B00001000) {
if (_data[2] & B01000000) Serial.print(F("FM1 ")); //FM + 1 bit
if (_data[2] & B00100000) Serial.print(F("FM2 ")); //FM + 2 bit
if (_data[2] & B00010000) Serial.print(F("AM ")); //FM+|=AM bit
}
Serial.println();
Serial.print(F("Memory: ")); Serial.println(_data[3] & B00000011); //Memory
Serial.println();
Serial.println(F("LEDS: "));
//this are in data[2]
if (_data[3] & B00001000) Serial.print(F("CPS ")); //CPS
if (_data[3] & B00100000) Serial.print(F("Dolby ")); //Dolby
if (_data[3] & B00010000) Serial.print(F("RD ")); //RD
//other in data[4]
if (_data[4] & B00000001) Serial.print(F("RDS "));
if (_data[4] & B00000010) Serial.print(F("AM "));
if (_data[4] & B00000100) Serial.print(F("TP "));
if (_data[4] & B00001000) Serial.print(F("FM "));
if (_data[4] & B00010000) Serial.print(F("SCAN "));
if (_data[4] & B00100000) Serial.print(F("AS "));
if (_data[4] & B01000000) Serial.print(F("MODE "));
Serial.println();
}
break;
case 0x23:
{
Serial.println(F("display clear"));
}
break;
case 0x32: //freq?
{
grab_volume = 1;
if (_data[3] == 0x10) { //AM
uint16_t freq = 531;
freq = freq + (_data[2] * 9);
Serial.print(F("freq: "));
Serial.print(freq);
Serial.println(F(" kHz (AM)"));
} else { //FM
float freq = 875;
freq = freq + _data[2];
Serial.print(F("freq: "));
Serial.print(freq / 10, 1);
Serial.println(F(" Mhz (FM)"));
}
}
break;
case 0x48:
{
grab_volume = 1;
Serial.print(F("display data ASCI: "));
// }
for (uint8_t i = 2; i < howmanybytesinpacket; i++) {
Serial.write(_data[i]);
//debug
//Serial.print(F(" ");
//Serial.write(_data[i]);
}
Serial.println();
}
break;
case 0x58:
{
grab_volume = 0;
//54 41 20 20 20 35 20 20 0 0 0 0 0
Serial.write(_data[2]);
Serial.write(_data[3]);
Serial.write(_data[4]);
Serial.write(_data[5]);
Serial.write(_data[6]);
Serial.write(_data[7]);
Serial.write(_data[8]);
Serial.write(_data[9]);
Serial.println();
}
break;
case 0x61:
{
grab_volume = 1;
switch (_data[2]) {
case 0x01:
Serial.println(F("TAPE: /\\"));
break;
case 2:
Serial.println(F("TAPE: \\/"));
break;
case 3:
Serial.println(F("TAPE: > (FF)"));
break;
case 4:
Serial.println(F("TAPE: < (FR)"));
break;
case 0:
Serial.println(F("TAPE: Eject"));
break;
case 0x10:
Serial.println(F("TP-INFO"));
break;
case 0x0B:
Serial.println(F("SAFE"));
break;
case 0x17:
Serial.println(F("??????????"));
break;
default:
dump = 1;
}
}
break;
case 0x71:
{
// Serial.print(F("Stored text::");
switch (_data[2] >> 4) {
case 0x00:
grab_volume = 0;
Serial.print(F("BAS "));
if ((_data[2] & 0x0F) == 0) {
Serial.println(0);
} else {
Serial.print(F("+"));
Serial.println((_data[2] & 0x0F), DEC);
}
break;
case 0x1:
grab_volume = 0;
Serial.print(F("BAS "));
if ((_data[2] & 0x0F) == 0) {
Serial.println(0);
} else {
Serial.print(F("-"));
Serial.println((_data[2] & 0x0F), DEC);
}
break;
case 0x2:
grab_volume = 0;
Serial.print(F("TRE "));
if ((_data[2] & 0x0F) == 0) {
Serial.println(0);
} else {
Serial.print(F("+"));
Serial.println((_data[2] & 0x0F), DEC);
}
break;
case 0x3:
Serial.print(F("TRE "));
if ((_data[2] & 0x0F) == 0) {
Serial.println(0);
} else {
Serial.print(F("-"));
Serial.println((_data[2] & 0x0F), DEC);
}
break;
case 0x4:
grab_volume = 0;
Serial.print(F("BAL "));
if ((_data[2] & 0x0F) == 0) {
Serial.println(0);
} else {
Serial.print(F("R"));
Serial.println((_data[2] & 0x0F), DEC);
}
break;
case 0x5:
grab_volume = 0;
Serial.print(F("BAL "));
if ((_data[2] & 0x0F) == 0) {
Serial.println(0);
} else {
Serial.print(F("L"));
Serial.println((_data[2] & 0x0F), DEC);
}
break;
case 0x6:
grab_volume = 0;
Serial.print(F("FAD "));
if ((_data[2] & 0x0F) == 0) {
Serial.println(0);
} else {
Serial.print(F("F"));
Serial.println((_data[2] & 0x0F), DEC);
}
break;
case 0x7:
grab_volume = 0;
Serial.print(F("FAD "));
if ((_data[2] & 0x0F) == 0) {
Serial.println(0);
} else {
Serial.print(F("R"));
Serial.println((_data[2] & 0x0F), DEC);
}
break;
case 0xA:
grab_volume = 1;
Serial.print(F("TP - MEM ")); //A1 is MEM 1?
Serial.print((_data[2] & 0x0F), DEC);
break;
case 0xB:
{
grab_volume = 1;
//GALA
Serial.print("GALA ");
if ((_data[2] & 0x0F) == 1) Serial.println(F("OFF"));
if ((_data[2] & 0x0F) == 0) Serial.println(F("ODB"));
}
break;
default:
dump = 1;
}
}
case 0x80:
{
if (_data[2] == 0x00) Serial.println(F("Shutdown"));
}
break;
case 0x92:
{
Serial.print(F("Entered safe code:"));
Serial.print(_data[2], HEX);
Serial.println(_data[3], HEX);
//Serial.print(_data[4],HEX);
//Serial.println(_data[5],HEX);
}
break;
case 0xA2:
{
grab_volume = 1;
Serial.print(F("CD"));
Serial.print(_data[2], HEX);
Serial.print(F(" TR"));
Serial.println(_data[3], HEX);
}
break;
case 0xE1:
{
if (_data[2] == 0xFB) Serial.println(F("Start"));
}
break;
default:
{
dump = 1;
}
}
void decode_button_push(uint8_t data) {
// Serial.print(data,HEX);
switch (data) {
case 0x01:
Serial.println(F(" 1"));
break;
case 0x02:
Serial.println(F(" 2"));
break;
case 0x03:
Serial.println(F(" 3"));
break;
case 0x04:
Serial.println(F(" 4"));
break;
case 0x05:
Serial.println(F(" 5"));
break;
case 0x06:
Serial.println(F(" 6"));
break;
case 0x07:
Serial.println(F(" seek > "));
break;
case 0x08:
Serial.println(F(" TP"));
break;
case 0x09:
Serial.println(F(" RDS"));
break;
case 0x0A:
Serial.println(F(" CPS"));
break;
case 0x0B:
Serial.println(F(" MODE"));
break;
case 0x0C:
Serial.println(F(" RD(ranodm ? )"));
break;
case 0x0D:
Serial.println(F(" << "));
break;
case 0x0E:
Serial.println(F(" FAD"));
break;
case 0x0F:
Serial.println(F(" BALANCE"));
break;
case 0x10:
Serial.println(F(" BASS"));
break;
case 0x11:
Serial.println(F(" AM"));
break;
case 0x12:
Serial.println(F(" Dolby"));
break;
case 0x13:
Serial.println(F(" >>"));
break;
case 0x14:
Serial.println(F(" TREB"));
break;
case 0x15:
Serial.println(F(" AS"));
break;
case 0x16:
Serial.println(F(" SCAN"));
break;
case 0x17:
Serial.println(F(" FM"));
break;
case 0x18:
Serial.println(F(" Seek < "));
break;
case 0x19:
Serial.println(F(" REV"));
break;
case 0x86:
Serial.println(F(" Knob + "));
break;
case 0x88:
Serial.println(F(" Knob - "));
break;
case 0x1E:
Serial.println(F(" Code in (TP + RDS)"));
break;
case 0x1F:
Serial.println(F("eject"));
break;
case 0x21:
Serial.println(F("button release"));
break;
default:
Serial.print(F(" uknown")); Serial.println(data, HEX);
break;
}
}