- // if we received an I- or R(ACK)-Block with a block number equal to the
- // current block number, toggle the current block number
- else if (len >= 4 // PCB+CID+CRC = 4 bytes
+ } else{
+ // S-Block WTX
+ while((data_bytes[0] & 0xF2) == 0xF2) {
+ uint32_t save_iso14a_timeout = iso14a_timeout;
+ // temporarily increase timeout
+ iso14a_timeout = MAX((data_bytes[1] & 0x3f) * iso14a_timeout, MAX_ISO14A_TIMEOUT);
+ // Transmit WTX back
+ // byte1 - WTXM [1..59]. command FWT=FWT*WTXM
+ data_bytes[1] = data_bytes[1] & 0x3f; // 2 high bits mandatory set to 0b
+ // now need to fix CRC.
+ AppendCrc14443a(data_bytes, len - 2);
+ // transmit S-Block
+ ReaderTransmit(data_bytes, len, NULL);
+ // retrieve the result again (with increased timeout)
+ len = ReaderReceive(data, parity);
+ data_bytes = data;
+ // restore timeout
+ iso14a_timeout = save_iso14a_timeout;
+ }
+
+ // if we received an I- or R(ACK)-Block with a block number equal to the
+ // current block number, toggle the current block number
+ if (len >= 3 // PCB+CRC = 3 bytes