text: /*
   * Copyright (C) 2016 TriaGnoSys GmbH
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @ingroup tests
   * @{
   *
   * @file
   * @brief       Test application for the PN532 NFC reader
   *
   * @author      Víctor Ariño <victor.arino@triagnosys.com>
   *
   * @}
   */
  
  #include "board.h"
  
  #include "pn532.h"
  #include "pn532_params.h"
  #include "xtimer.h"
  
  #define LOG_LEVEL LOG_INFO
  #include "log.h"
  
  #define MIN(a, b) ((a) < (b) ? (a) : (b))
  
  static void printbuff(char *buff, unsigned len)
  {
      while (len) {
          len--;
          printf("%02x ", *buff++);
      }
      puts("");
  }
  
  int main(void)
  {
      static char data[16];
      static nfc_iso14443a_t card;
      static pn532_t pn532;
      unsigned len;
      int ret;
  
  #if defined(PN532_SUPPORT_I2C)
      ret = pn532_init_i2c(&pn532, &pn532_conf[0]);
  #elif defined(PN532_SUPPORT_SPI)
      ret = pn532_init_spi(&pn532, &pn532_conf[0]);
  #else
  #error None of PN532_SUPPORT_I2C and PN532_SUPPORT_SPI set!
  #endif
  
      if (ret != 0) {
          LOG_INFO("init error %d\n", ret);
      }
  
      xtimer_usleep(200000);
      LOG_INFO("awake\n");
  
      uint32_t fwver;
      pn532_fw_version(&pn532, &fwver);
      LOG_INFO("ver %d.%d\n", (unsigned)PN532_FW_VERSION(fwver), (unsigned)PN532_FW_REVISION(fwver));
  
  
      ret = pn532_sam_configuration(&pn532, PN532_SAM_NORMAL, 1000);
      LOG_INFO("set sam %d\n", ret);
  
      while (1) {
          /* Delay not to be always polling the interface */
          xtimer_usleep(250000UL);
  
          ret = pn532_get_passive_iso14443a(&pn532, &card, 0x50);
          if (ret < 0) {
              LOG_DEBUG("no card\n");
              continue;
          }
  
          if (card.type == ISO14443A_TYPE4) {
              if (pn532_iso14443a_4_activate(&pn532, &card) != 0) {
                  LOG_ERROR("act\n");
                  continue;
  
              }
              else if (pn532_iso14443a_4_read(&pn532, data, &card, 0x00, 2) != 0) {
                  LOG_ERROR("len\n");
                  continue;
              }
  
              len = PN532_ISO14443A_4_LEN_FROM_BUFFER(data);
              len = MIN(len, sizeof(data));
  
              if (pn532_iso14443a_4_read(&pn532, data, &card, 0x02, len) != 0) {
                  LOG_ERROR("read\n");
                  continue;
              }
  
              LOG_INFO("dumping card contents (%d bytes)\n", len);
              printbuff(data, len);
              pn532_release_passive(&pn532, card.target);
  
          }
          else if (card.type == ISO14443A_MIFARE) {
              char key[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
              char data[32];
  
              for (int i = 0; i < 64; i++) {
                  LOG_INFO("sector %02d, block %02d | ", i / 4, i);
                  if ((i & 0x03) == 0) {
                      ret = pn532_mifareclassic_authenticate(&pn532, &card,
                                                             PN532_MIFARE_KEY_A, key, i);
                      if (ret != 0) {
                          LOG_ERROR("auth\n");
                          break;
                      }
                  }
  
                  ret = pn532_mifareclassic_read(&pn532, data, &card, i);
                  if (ret == 0) {
                      printbuff(data, 16);
                  }
                  else {
                      LOG_ERROR("read\n");
                      break;
                  }
              }
  
          }
          else {
              LOG_ERROR("unknown\n");
          }
      }
  
      return 0;
  }
  