String vergleichen / Weitergabe

Ich versuche Daten aus einer Bluetoothübertragung zu erhalten und diese dann weiterzugeben.
Das Problem ist, dass durch die Übertragung der switch(id) mehrfach hintereinander ausgeführt wird. Somit wird wie in diesem Fall der "title" mehrmals im serial.print ausgegeben.
Ich wollte das Wiederholen mit einem Vergleich abstellen, bekomme das aber irgendwie nicht hin.
Wie kann ich z.b. "title" in eine andere Variable weitgeben nachdem sie verglichen worden sind und nicht gleich sind?


#include "BluetoothA2DPSink.h"

BluetoothA2DPSink a2dp_sink;


String title="";
String artist="";


void avrc_metadata_callback(uint8_t id, const uint8_t *text) {
  switch(id){
     case ESP_AVRC_MD_ATTR_TITLE:
        title = (const char*)text;
        Serial.println(title);

        break;
     case ESP_AVRC_MD_ATTR_ARTIST:
        artist = (const char*)text;
        break;
  }


}


void setup() {
    a2dp_sink.set_avrc_metadata_callback(avrc_metadata_callback);
    a2dp_sink.start("TEST");
    Serial.begin(9600);
    
}

void loop() {

}

Wenn es denn unbedingt mit Strings sein muss

strcmp
https://cplusplus.com/reference/cstring/strcmp/

ich würde ja eher die id selbst zum vergleichen nehmen.

Außerdem wäre interessant wenn du posten würdest wie denn die Ausgabe im seriellen Monitor genau aussieht.

Wird die function 10 mal pro Sekunde aufgerufen oder nur zweimal ? oder ... ?

vgs

Er führt beim ersten Mal es einfach durch, dann immer doppelt:

I Just Don't Think I'll Ever Get Over You
Shape Of My Heart
Shape Of My Heart
First Day Of My Life
First Day Of My Life

Ich wollte title und artist "zwischenspeichern" und dann wenn ich es benötige abrufen und anzeigen lassen

Der TO nutzt die Stringklasse, da wäre besser

werde ich mal probieren.
macht es sinn statt string es anders durchzuführen? das wurde halt im Beispiele so angegeben...
Da ich noch Anfänger bin, ist das nicht geradd einfach

Ist jetzt "Shape Of My Heart" der artist
und "First Day Of My Life" der title?

Das würde heißen, dass zweimal die gleich id kommt.
Dann könntest du auch die Variable "id" vergleichen

vgs

beides sind titel.
wenn ich bei der wiedergabe auf weiter gehe kommt dann der titel doppelt an.

Lass mal diese Code-Version laufen.
Da sind debug-Ausgaben auf den Serial Monitor eingebaut.

// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *
// a detailed explanation how these macros work is given in this tutorial
// https://forum.arduino.cc/t/comfortable-serial-debug-output-short-to-write-fixed-text-name-and-content-of-any-variable-code-example/888298

#define dbg(myFixedText, variableName) \
  Serial.print( F(#myFixedText " "  #variableName"=") ); \
  Serial.println(variableName);

#define dbgi(myFixedText, variableName,timeInterval) \
  { \
    static unsigned long intervalStartTime; \
    if ( millis() - intervalStartTime >= timeInterval ){ \
      intervalStartTime = millis(); \
      Serial.print( F(#myFixedText " "  #variableName"=") ); \
      Serial.println(variableName); \
    } \
  }

#define dbgc(myFixedText, variableName) \
  { \
    static long lastState; \
    if ( lastState != variableName ){ \
      Serial.print( F(#myFixedText " "  #variableName" changed from ") ); \
      Serial.print(lastState); \
      Serial.print( F(" to ") ); \
      Serial.println(variableName); \
      lastState = variableName; \
    } \
  }

#define dbgcf(myFixedText, variableName) \
  { \
    static float lastState; \
    if ( lastState != variableName ){ \
      Serial.print( F(#myFixedText " "  #variableName" changed from ") ); \
      Serial.print(lastState); \
      Serial.print( F(" to ") ); \
      Serial.println(variableName); \
      lastState = variableName; \
    } \
  }
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *


#include "BluetoothA2DPSink.h"

BluetoothA2DPSink a2dp_sink;

String title = "";
String artist = "";


void avrc_metadata_callback(uint8_t id, const uint8_t *text) {

  dbgc("00",id);
  
  switch(id){
     case ESP_AVRC_MD_ATTR_TITLE:
        title = (const char*)text;
        //Serial.println(title);
        dbg("01",title);
        break;
        
     case ESP_AVRC_MD_ATTR_ARTIST:
        artist = (const char*)text;
        dbg("02",artist);
        break;
  }
}


void setup() {
    Serial.begin(9600);
    Serial.println("Setup-Start");
    a2dp_sink.set_avrc_metadata_callback(avrc_metadata_callback);
    a2dp_sink.start("TEST");
    Serial.println("a2dp_sink.start() done ");   
}

void loop() {

}

vgs

Wird nun nur einmalig und somit korrekt angezeigt, wenn Wiedergabe "weiter" gedrückt wird:

"00" id changed from 32 to 1
"01" title=Love You More
"00" id changed from 1 to 2
"02" artist=Racoon
"00" id changed from 2 to 4
"00" id changed from 4 to 8
"00" id changed from 8 to 16
"00" id changed from 16 to 32
"00" id changed from 32 to 1
"01" title=Lose Another Day
"00" id changed from 1 to 2
"02" artist=Racoon
"00" id changed from 2 to 4
"00" id changed from 4 to 8
"00" id changed from 8 to 16
"00" id changed from 16 to 32

Das würde bedeuten, in deiner Code-Version wird weniger Text ausgegeben. Dadurch ist die function schneller abgearbeitet und die callback-function würde ein zweites mal aufgerufen.
Das finde ich sehr merkwürdig.
Kannst du das mit deiner Version noch einmal neu gegenchecken?

vgs

Falscher Ansatz.
Titel ist bereits Deine Variable, die Du aus *text weiterverwendest.

Vergleiche Titel mit text via strcmp().
Wenn abweichend, fülle Titel neu mit text.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.