MFRC522 Status auslesen bei Verwendung von easyMFRC522

Hallo zusammen,

für ein Vereinsprojekt beschäftige ich mich gerade mit dem allseits bekannten MFRC522.
Da ich mehrere Informationen auf dem RFID Tag speichern muss, fand ich die Bibliothek easyMFRC522 ( GitHub - pablo-sampaio/easy_mfrc522 ) sehr elegant, weil sie mir einiges an Arbeit abnimmt und ich neue Datenfelder einfach auf dem Tag speichern kann.

Die easyMFRC522 Library baut auf der sehr bekannten MFRC522 Library auf. Daher gibt es auch den Hinweis im easyMFRC522 Git:

So, if you want to do other operations supported by MFRC522, you can access (the wrapped instance of) Balboa's class and use its functionality. Just call getMFRC522().

Das "just call getMFRC522()" bringt mich etwas zum zweifeln, weil ich gern den Status der Schreib-Operationen auslesen möchte um eine Rückmeldung zu haben, ob erfolgreich geschrieben wurde oder nicht.

Bei der normalen MFRC522 Library wird der Status wie folgt gelesen:

MFRC522::StatusCode status;
status = mfrc522.MIFARE_Write(block, buffer, size);
    if (status != MFRC522::STATUS_OK) {
      // irgendetwas ist falsch gelaufen
    } else {
      // alles in Ordnung.
    }

Nun habe ich diverse Optionen versucht "getMFRC522()" zu Verwenden um den Status zu lesen, allerdings ohne erfolg.

Mein aktueller Code ist anbei. Und immer wenn ich rfidDict.set verwende möchte ich gern den Status der MFRC522 Schreib-Operation abgreifen.

Probiert habe ich bereits Dinge, wie hier zu sehen, allerdings ist die Funktion rfidDict.set void.

MFRC522::StatusCode status;
status = rfidDict.set( "CARGO", String(newCargo) );

Könnt ihr mir hier weiterhelfen?

Vielen Dank für eure Antworten!
rusher

#include "RfidDictionaryView.h"

int startBlock = 10; 
RfidDictionaryView rfidDict(D4, D3, startBlock);
  MFRC522::StatusCode status;

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(20000); 
  while (!Serial)
    ;
  delay(1000); 
}


void loop() {
  bool tagSelected;

  Serial.println();
  Serial.println("Warten auf NFC...");

  do {
      tagSelected = rfidDict.detectTag();
    delay(5);
  } while (!tagSelected);

  Serial.println("STEP 0: RFID Tag wird ausgelesen...");

  String key, value;
  int numKeys;
  value = rfidDict.get( "CARGO" ); 
  Serial.println("Step 1: RFID Tag  hat eine Ladung von " + value + "%. Be-/Entladevorgang beginnt...");
  delay(1000);

  int initialCargo = value.toInt();
  int newCargo;

  if (initialCargo == 0) {
    Serial.println("STEP 2: RFID Tag ist leer, Ladevorgang beginnt");
    newCargo = initialCargo;
    while (newCargo < 100) {
      newCargo = newCargo + 10; //Ladung um 10% erhöhen
      rfidDict.set( "CARGO", String(newCargo) );   //Ladung auf Chip schreiben
      Serial.println("Ladevorgang: " + String(newCargo) + "%");
      delay(1000);
    }
  } else {
    Serial.println("STEP 2: RFID Tag hat Ladung, Entladevorgang beginnt");
    newCargo = initialCargo;
    while (newCargo > 0) {
      newCargo = newCargo - 10; //Ladung um 10% verringern
      rfidDict.set( "CARGO", String(newCargo) );   //Ladung auf Chip schreiben
     
      Serial.println("Entladevorgang: " + String(newCargo) + "%");
      delay(1000);
    }
  }

  Serial.println("  --------------------------------\n");
  rfidDict.disconnectTag();

  delay(3000); //
}

also lt. lib:

    inline MFRC522* getMFRC522() {
        return &this->device;
    }

dein Objekt heißt

rfidDict

also sollte ein

int result = rfidDict.getMFRC522();

eigentlich irgend ein Ergebnis bringen. Theoretisch. Nur geraten.

Vielen Dank für deine Antwort:
so einfach scheint es nicht zu funktionieren. Immer wenn ich rfidDict.getMFRC522(); probiere knallt es schon beim compillieren:

error: 'class RfidDictionaryView' has no member named 'getMFRC522'

Also kurz in die RfidDictionaryView.h geschaut und tatsächlich gibt es kein getMFRC522() in der Definition. Nach ein wenig Analyse habe ich festgestellt, dass ich aktuell die Library "RfidDictionaryView" nutze, welche die Library "EasyMFRC522" nutzt, welche wiederum die Library "MFRC522" nutzt.

In der Definition von der Library "EasyMFRC522" gibt es tatsächlich die Definition

    inline MFRC522* getMFRC522() {
        return &this->device;
    }

was auf MFRC522 device; zurück greift.

Nun habe ich versucht, das gleiche in RfidDictionaryView.h einzubauen, da dort "device" folgendermaßen bereits definiert ist:

    EasyMFRC522* device;

D.h. letztendlich nutzt meine genutzte "RfidDictionaryView" library eine Instanz der Klasse EasyMFRC522. Somit dachte ich, dass ich mit folgendem Code in der RfidDictionaryView.h auf das Device verweisen kann:

inline EasyMFRC522** getMFRC522() {
        return &this->device;
    }

Allerdings gibt es dennoch Fehler beim compillieren wenn ich versuche folgenden Code zu verwenden:

EasyMFRC522 easyMFRC= rfidDict.getMFRC522();

error: conversion from 'EasyMFRC522**' to non-scalar type 'EasyMFRC522' requested

Ich hätte jetzt gedacht, dass ich mich so durch die Kontexte hangeln kann: vom EasyMFRC522 Device zum MFRC522 Device ... aber vermutlich liege ich damit falsch.

Für den Status habe ich mir jetzt einfach die Library ein wenig umgeschrieben und schleife den Status Code durch bis in meinen Code. Das war dann die schnellste Lösung. Allerdings bin ich immernoch an einer Lösung interessiert, um den MFRC522 Context zu bekommen, da ich gern auch andere grundlegende Features der Library nutzen möchte.

Vielen Dank für eure Hilfe!

schon mal probiert das
MFRC522 device;
in der Klasse EasyMFRC522 von private nach public zu schieben um darauf direkten zugriff zu erhalten? Damit