24 _nfc(new Adafruit_PN532(ssPin, theSPI)) {}
29 _nfc(new Adafruit_PN532(clk, miso, mosi, ss)) {}
34 _nfc(new Adafruit_PN532(irqPin, resetPin, wire)) {}
39 _nfc(new Adafruit_PN532(resetPin, uartSerial)) {}
50 return _nfc->getFirmwareVersion() != 0;
54 uint8_t* response, uint8_t& responseLen) {
62 bool success =
_nfc->inDataExchange(
const_cast<uint8_t*
>(apdu), apduLen,
63 response, &responseLen);
65 _logger->println(
F(
"APDU exchange failed!"));
70 _logger->print(
F(
"APDU response ("));
74 for (uint8_t i = 0; i < responseLen; i++) {
76 if (response[i] < 16) {
_logger->print(
F(
"0")); }
79 if (((i + 1) % 16 == 0) && ((i + 1) != responseLen)) {
_logger->println(); }
88 uint8_t* response, uint16_t& responseLen) {
96 bool success =
_nfc->inDataExchange16(
const_cast<uint8_t*
>(apdu), apduLen,
97 response, &responseLen);
99 _logger->println(
F(
"APDU exchange (large) failed!"));
104 _logger->print(
F(
"APDU response ("));
106 _logger->println(
F(
" bytes, large):"));
108 for (uint16_t i = 0; i < responseLen; i++) {
110 if (response[i] < 16) {
_logger->print(
F(
"0")); }
113 if (((i + 1) % 16 == 0) && ((i + 1) != responseLen)) {
_logger->println(); }
122 return _nfc->inListPassiveTarget();
130 uint32_t versionData =
_nfc->getFirmwareVersion();
132 if (versionData == 0) {
133 _logger->println(
F(
"PN532 not found!"));
137 uint8_t ic = (versionData >> 24U) & 0xFFU;
138 uint8_t verMajor = (versionData >> 16U) & 0xFFU;
139 uint8_t verMinor = (versionData >> 8U) & 0xFFU;
140 uint8_t flags = versionData & 0xFFU;
143 _logger->println(
F(
"PN532 information"));
144 _logger->print(
F(
" ├─ Raw firmware: 0x"));
148 _logger->println((ic == 0x32U) ?
F(
"PN532") :
F(
"Unknown"));
150 _logger->print(
F(
" ├─ Firmware: "));
155 _logger->print(
F(
" └─ Features: "));
156 if ((flags & 0x01U) != 0U) {
_logger->print(
F(
"MIFARE")); first =
false; }
157 if ((flags & 0x02U) != 0U) {
158 if (!first) {
_logger->print(
F(
" + ")); }
159 _logger->print(
F(
"ISO-DEP")); first =
false;
161 if ((flags & 0x04U) != 0U) {
162 if (!first) {
_logger->print(
F(
" + ")); }
163 _logger->print(
F(
"FeliCa")); first =
false;
165 if (first) {
_logger->print(
F(
"Unknown")); }
Concrete CW_NfcTransport over Adafruit_PN532 (SPI / I2C / UART).
Abstract interface for serial/debug output.
PN532Interface _interface
Wiring variant the active constructor selected.
void resetReader() override
Reset the PN532 into a clean idle state.
bool printFirmwareVersion() override
Pretty-print the PN532 firmware version + supported features.
bool sendAPDU(const uint8_t *apdu, uint8_t apduLen, uint8_t *response, uint8_t &responseLen) override
Exchange one ISO-DEP APDU with the currently selected card.
Adafruit_PN532 * _nfc
Owned Adafruit_PN532 driver instance.
PN532Adapter(CW_Logger &logger, uint8_t ssPin, SPIClass *theSPI=&SPI)
Construct an adapter wired over hardware SPI.
bool inListPassiveTarget() override
Poll for a card in the field.
bool begin() override
Initialise the PN532 and probe its firmware version.
~PN532Adapter() override
Release the heap-allocated Adafruit_PN532 instance.
CW_Logger * _logger
Logger reference (non-owning).
bool sendAPDULarge(const uint8_t *apdu, uint8_t apduLen, uint8_t *response, uint16_t &responseLen) override
APDU exchange that can return more than 255 bytes.
PN532Interface
Physical wiring used to reach the PN532 reader.
@ SPI_HARDWARE
Hardware SPI via an SPIClass instance.
@ SPI_SOFTWARE
Bit-banged SPI on four arbitrary GPIOs.
@ UART
UART via a HardwareSerial instance.
@ I2C
I2C via a TwoWire instance.