/*
 * Lecture d'un bloc MIFARE Classic — Kaihatsu Lab
 * Authentification avec la clé A d'usine (FF FF FF FF FF FF), puis lecture du bloc 4
 * affiché en hexadécimal et en texte.
 */
#include <SPI.h>
#include <MFRC522.h>

const uint8_t PIN_SS  = 5;
const uint8_t PIN_RST = 22;
const byte    BLOCK   = 4;              // secteur 1 : blocs 4, 5 et 6 pour les données, le 7 est la « trailer »

MFRC522 rfid(PIN_SS, PIN_RST);
MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(115200);
  SPI.begin(18, 19, 23, PIN_SS);        // SCK, MISO, MOSI, SS
  rfid.PCD_Init();
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;   // clé d'usine
  Serial.println(F("Approche une carte MIFARE Classic..."));
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;

  MFRC522::StatusCode status = rfid.PCD_Authenticate(
      MFRC522::PICC_CMD_MF_AUTH_KEY_A, BLOCK, &key, &(rfid.uid));

  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentification refusee : "));
    Serial.println(rfid.GetStatusCodeName(status));
  } else {
    byte buffer[18];                    // 16 octets de données + 2 octets de CRC
    byte size = sizeof(buffer);
    status = rfid.MIFARE_Read(BLOCK, buffer, &size);

    if (status == MFRC522::STATUS_OK) {
      Serial.print(F("Bloc "));
      Serial.print(BLOCK);
      Serial.print(F(" :"));
      for (byte i = 0; i < 16; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
      }
      Serial.print(F("  | "));
      for (byte i = 0; i < 16; i++) {
        Serial.print(buffer[i] >= 32 && buffer[i] < 127 ? (char)buffer[i] : '.');
      }
      Serial.println();
    } else {
      Serial.print(F("Lecture impossible : "));
      Serial.println(rfid.GetStatusCodeName(status));
    }
  }

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();               // à appeler après toute authentification
}
