#include <SPI.h>
#include <MFRC522.h>


#define resetPin 22         // Reset pin
#define ssPin 21            // Slave select pin

MFRC522 T1_RFIDleser = MFRC522(ssPin, resetPin); //Eine Instanz der Klasse MFRC522 erstellen

const int UID_NR = 5;
byte registered_uid[UID_NR][4]=  //2-dim array to zum Speichern von bis zu 'UID_NR' verschiedenen UIDs mit einer Länge von je 4 bytes (notwenidg für die Freigabe)
{
  {0x29,0x97,0xCE,0xA3},    //erste gespeicherte UID (in HEX)
  {0xB9,0x25,0x95,0x99},    //zweite
  {},    //dritte
  {},    //vierte
  {}     //fünfte
};

void setup()
{
  Serial.begin(115200);     //Serial Monito (SM) starten
  SPI.begin();              //SPI kommunikaion am ESP32 initialisieren

  T1_RFIDleser.PCD_Init();                                  //Kommunikation zum RFID Leser initielisieren
  T1_RFIDleser.PCD_DumpVersionToSerial();                   //Überprüfung, ob die Kommunikation funktioniert
}

void loop()
{
  if ( ! T1_RFIDleser.PICC_IsNewCardPresent())             //überprüfe, ob eine Karte vorm RFID-Leser ist
  {
    return;
  }
  if ( ! T1_RFIDleser.PICC_ReadCardSerial())               //Liest die User ID (UID) des chips, liefert "true" wenn erfolgreich
  {
    return;
  }

  T1_RFIDleser.PICC_DumpDetailsToSerial(&(T1_RFIDleser.uid));   //funktion der MFRC522 Bibliothke um die Karteninformationen im SM auszugeben

  Serial.print("Freigabe für die Aktuelle UID:");
  Serial.println(UID_IsKnown());                                //gibt "true" zurück, wenn Freigabe erstattet
}

boolean UID_IsKnown()
{
  boolean temp =false;         //lokaler bool, Hile zur überprüfung aller Bytes
  for(int uidNrIdx=0; uidNrIdx<UID_NR; uidNrIdx++)    //Schleife um durch alle gespeicherten UIDs zu gehen
  {
    for(int uidByteIdx=0; uidByteIdx<4; uidByteIdx++) //Schleife um durch alle Bytes der aktuellen UID zu gehen
    {
      //vergleiche das aktuelle UID Byte mit dem der gespeicherten UID
      if(registered_uid[uidNrIdx][uidByteIdx]!=T1_RFIDleser.uid.uidByte[uidByteIdx])
      {
        temp = false;
        break;                //Wenn ungleich, dann höre auf, diese UID zu prüfen
      }
      else
      {
        temp = true;          //Ein weiterer Teil der UID ist identisch
      }
       
    }
    if(temp)                //ÜBerprüfe, ob auch der letzte Teil der UID identisch ist
    {
      return true;          //Wenn sie identisch sind, dann verlasse diese Methode und leifere "true" zurück
    }
  }
  return false;             //wenn kein treffer gefunden wurde, liefere "false" zurück
}
