comunication between front panel and main MCU - tomaskovacik/audi_concert1_chorus1_volume_fix GitHub Wiki

example of comunication from MCU to PANEL:

mcu_to_panel

example of comunication from PANEL to MCU, button push:

panel_to_mcu

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;
  }
}