Button für Lieblingskarte

Hallo,
ich hab tatsächlich noch ein GPIO-Port frei, den möchte ich meiner Lieblingskarte zuordnen. Nur komme ich mit der Syntax nicht zurecht. Wenn der Port Low ist soll die Karte abspielen.

Es geht um folgende Zeile:

xQueueSend(rfidCardQueue, &cardIdString, 0);

Wie kann ich z.B. die Karte „041250080155“ da an Stelle des &cardIdString bringen, damit die Karte abgespielt wird? Oder stelle ich mir das zu einfach vor?

Danke für jeden Hinweis im voraus…

Den String solltest Du einer Char Variable z.B.

 char* lieblingsKarte="041250080155";

zuordnen und dann deren Anfangsadresse an die Funktion übergeben.

  xQueueSend(rfidCardQueue, lieblingsKarte, 0);

Wäre jedenfalls mein Tipp. So firm bin ich aber auch noch nicht in der Codebasis hier. Mir ist z.B. nicht klar, wie lang die Variable „lebt“, sodass die Adresse noch verfügbar ist, wenn die Informationen gebraucht wird.

@SeebM
danke für den Tipp. Leider habe ich das schon probiert. Der Espuino stürzt ab und startet daraufhin nur neu. Spielt aber nicht die Karte ab… :pensive:

Auch
char lieblingsKarte[25] = „041250080155“; habe ich probiert…auch Absturz und Neustart.

Vielleicht musst Du die Variable etwas globaler deklarieren. Meine Befürchtung ist, dass auf die Addresse erst nach beendigung der Funktion zurückgegriffen wird und die dann illegal ist. Da müsste man aber mehr Ahnung von dem Threading haben vermute ich. Schau doch mal, wie die Funktion das macht, die die IDs einliest und dann weiterleitet.

Versuch’s mal mit:

xQueueSend(rfidCardQueue, &lieblingsKarte, 0);

Aber ist nicht char* schon ein Zeiger? Oder muss man noch eine Hierarchie „höher“ gehn? Bei Strings und Chars finde ich die Zeigerarithmetik immer verwirrend :innocent:

@biologist
@SeebM
Vielen Dank für eure Hinweise, mit dem kaufmännischen UND hatte ich heute nachmittag schon erfolglos probiert. Jetzt nochmals, damit ich mir sicher war. Einmal mit
char* lieblingsKarte=„041250080155“; und auch mit
char lieblingsKarte[25] = „041250080155“;

Wieder Absturz und Neustart.

Ich habe die Tasterabfrage allerdings im void loop…ist das evtl. ein Problem mit der Gültigkeit?
Sorry ich kenn mich so ganz und gar nicht aus, mit den Variablen, ob die global gültig sind, oder lokal, oder wo auch immer.
Das mit dem & habe ich halt einfach so ausprobiert, weils ja beim Einlesen der RFID Karte auch so da stand…hat aber leider auch nichts gebracht.
Ist evtl. der String der Karten-ID unvollständig? Kommt da noch ein verstecktes Zeichen oder Steuerzeichen vorne oder hinten dran?

Das passt. Hierbei wird automatisch ein char-Array mit passender Länge (n+1) erzeugt und entsprechend viel Platz im Speicher reserviert. Wo genau hast du diese Variable denn deklariert?

Wenn man zyklisch einen Taster abfragen will, dann hat man drei Möglichkeiten:
a) Mit jedem Zyklus in loop(). Ist recht einfach, aber in Abhängigkeit der Loopzeit des Sketches können sich Bedingungen halt ändern.
b) Per Interrupt: Da wird der µC quasi bei seinem Tun unterbrochen, wenn erkannt wird, dass die Taste gedrückt wurde. Wird oft gemacht, ich habe allerdings gelernt, dass man das eher nicht macht. Weil wenn ein Taster viel prellt kann das evtl. zu vielen Unterbrechungen führen.
c) Per Hardware-Timer: Da wird die CPU zyklisch unterbrochen und der Status des Buttons gepollt. Vorteil an dieser Variante ist, dass man immer definierte Verhältnisse hat. In meinem Code benutze ich z.B. 1000 Hz und so kann ich sicher sein, dass das immer genau so abläuft.

Wie dem auch sei: Was man bei einem Taster auf jeden Fall will ist Entprellen. Einerseits, weil ein Taster (siehe Link) erstmal einschwingt und dann auch, weil du so kurz gar nicht drücken kannst, dass du nur ein Event wirfst.

Wie auch immer: Ich persönlich bräuchte so einen Taster nicht, aber finde es legitim, dass man sowas gerne machen möchte. Ich schau mal, was man da machen kann.

Wenn du den gpio nur kurzzeitig auf Low ziehst also wie ein Taster hand habst,
kannst du einfach das neue Tastenlayout nutzen.

Definiere dir ne neue CMD_XXX Variable, ordner den GPIO und CMD z.b. Taster 4 zu.

In der doCmdAction erstellst du dann ne neue case für dein Button mit der erstellten CMD_XXX

case CMD_XXX:
    char *lastRfid = "041250080155";
    xQueueSend(rfidCardQueue, &lastRfid, 0);
    break;

Guten morgen,
ich habe jetzt mal folgendes probiert. In dem Bereich wo die lastRfid eingelesen wird habe ich die liebliengsKarte einlesen wollen.

    void recoverLastRfidPlayed(void) {
    if (recoverLastRfid) {
        recoverLastRfid = false;
        String lastRfidPlayed = prefsSettings.getString("lastRfid", "-1");
        if (!lastRfidPlayed.compareTo("-1")) {
            loggerNl((char *) FPSTR(unableToRestoreLastRfidFromNVS), LOGLEVEL_INFO);
        } else {
            //char *lastRfid = strdup(lastRfidPlayed.c_str());
            //xQueueSend(rfidCardQueue, &lastRfid, 0);
            //xxx
            char *lieblingsKarte = "041250080155";
            xQueueSend(rfidCardQueue, lieblingsKarte, 0);                
            //xxx

Dies führt jetzt auch zu einem ständigen Neustart. Hilft euch das weiter? Ist da die Variable doch unvollständig?

Ein

snprintf(idTest, serialLoglength, "%s", lastRfid);

hat mir für die idTest halt nur die Nummer ausgegeben „041250080155“. Aber evtl. wird durch das „%s“ was weggeschnitten?

@QDaniel
danke für den Hinweis. Ich verwende noch einen älteren commit, aber wenn ich auf den Neuen wechsle, dann probier ich deinen Hinweis gerne mal aus. Ist sicherlich formschöner, den Button so zu verwenden.
Aber wie oben bereits berichtet, funktioniert die Variable auch nicht einmal in der lastRfid Funktion.
Ich habe da nur lastRfid mit lieblingsKarte ersetzt…

Also der Taster unter void loop funktioniert, weil folgendes akzeptiert der Espuino:

if((tasterStationStatus == LOW) && (auswahlstatus == 0)) {
      auswahlstatus = 1;
      String lieblingPlayed = prefsSettings.getString("lastRfid", "-1");
      char *lieblingsKarte = strdup(lieblingPlayed.c_str());
    
      xQueueSend(rfidCardQueue, &lieblingsKarte, 0);
 }
 
 if((tasterStationStatus == HIGH) && (auswahlstatus == 1)) {
      auswahlstatus = 0;
 }

Der Espuino spielt dann erneut die letzte Karte ab und stürzt nicht ab und macht keinen Neustart.

Kann aus obigen Zeilen jemand das strdup(lieblingPlayed.c_str()); im Klartext auslesen?
Ist anscheinend nicht nur die Kartennummer alleine?

In deinem vorherigen Beispiel fehlt das &

Im nächsten hast du es:

Das hattest du schon ausprobiert oder?

@christoph_e
danke, habe ich aber alles schon probiert. Hat beides nicht funktioniert. Mit und ohne &.

Dies funktioniert und am seriellen Monitor wird für lieblingPlayed und für lieblingsKarte immer die 12 stellige Kartennummer ausgegeben. 041250080155

      String lieblingPlayed = prefsSettings.getString("lastRfid", "-1");
      char *lieblingsKarte = strdup(lieblingPlayed.c_str());

      Serial.println(lieblingPlayed);
      Serial.println(lieblingsKarte);
 

    xQueueSend(rfidCardQueue, &lieblingsKarte, 0);

Definiere ich die Variable selber mit „041250080155“, dann stürzt der Espuino ab und startet neu.
Also folgendes funktioniert nicht:

char *lieblingsKarte = "041250080155";
xQueueSend(rfidCardQueue, &lieblingsKarte, 0);

@QDaniel
&& führt zu einem Kompilierungsfehler

src\main.cpp:3869:38: error: label ‚lieblingsKarte‘ used but not defined

sorry, jetzt weiß ich nicht mehr, wer das mit den 2 & geschrieben hatte, warst du das Daniel, oder SeebM?

Auf jeden Fall Danke für den Tip, leider geht es nicht.

Das war ich, war aber ne Schnapsidee, sorry.

@SeebM
kein Problem…ich probiere alles…da ich kaum eine Ahnung habe…wie ihr merkt

Wenn du schon am probieren bist, könntest du noch folgendes versuchen :smile:

Zu

char lieblingsKarte[] = "041250080155";
xQueueSend(rfidCardQueue, &lieblingsKarte, 0);

Damit zeigt lieblingsKarte nicht mehr in den schreibgeschützten Speicher, sondern der Inhalt ist veränderbar.

Ich glaube das hattest du schon. Nur für die Vollständigkeit.

@christoph_e
danke

ja leider habe schon ziemlich viel probiert. Es funktioniert keine der folgenden Varianten:

 char *lieblingsKarte="041250080155";
 char lieblingsKarte[] = "041250080155";
 char lieblingsKarte[25] = "041250080155";
 char lieblingsKarte[255] = "041250080155";

Das einzige was mir noch einfällt:

char *lieblingsKarteRO = "041250080155";
char *lieblingsKarte = strdup(lieblingsKarteRO);
xQueueSend(rfidCardQueue, &lieblingsKarte, 0);
free(lieblingsKarte);

Ich hoffe es sind keine Tippfehler drin, schreibe nämlich vom Handy.

1 „Gefällt mir“