+ TagUID[0] = answer[2];
+ TagUID[1] = answer[3];
+ TagUID[2] = answer[4];
+ TagUID[3] = answer[5];
+ TagUID[4] = answer[6];
+ TagUID[5] = answer[7];
+ TagUID[6] = answer[8]; // IC Manufacturer code
+ TagUID[7] = answer[9]; // always E0
+
+ }
+
+ Dbprintf("%d octets read from IDENTIFY request:", answerLen);
+ DbdecodeIso15693Answer(answerLen, answer);
+ Dbhexdump(answerLen, answer, false);
+
+ // UID is reverse
+ if (answerLen >= 12)
+ Dbprintf("UID = %02hX%02hX%02hX%02hX%02hX%02hX%02hX%02hX",
+ TagUID[7],TagUID[6],TagUID[5],TagUID[4],
+ TagUID[3],TagUID[2],TagUID[1],TagUID[0]);
+
+
+ // Dbprintf("%d octets read from SELECT request:", answerLen2);
+ // DbdecodeIso15693Answer(answerLen2,answer2);
+ // Dbhexdump(answerLen2,answer2,true);
+
+ // Dbprintf("%d octets read from XXX request:", answerLen3);
+ // DbdecodeIso15693Answer(answerLen3,answer3);
+ // Dbhexdump(answerLen3,answer3,true);
+
+ // read all pages
+ if (answerLen >= 12 && DEBUG) {
+ for (int i = 0; i < 32; i++) { // sanity check, assume max 32 pages
+ BuildReadBlockRequest(TagUID, i);
+ TransmitTo15693Tag(ToSend, ToSendMax, start_time);
+ int answerLen = GetIso15693AnswerFromTag(answer, sizeof(answer), DELAY_ISO15693_VCD_TO_VICC_READER * 2);
+ start_time = GetCountSspClk() + DELAY_ISO15693_VICC_TO_VCD_READER;
+ if (answerLen > 0) {
+ Dbprintf("READ SINGLE BLOCK %d returned %d octets:", i, answerLen);
+ DbdecodeIso15693Answer(answerLen, answer);
+ Dbhexdump(answerLen, answer, false);
+ if ( *((uint32_t*) answer) == 0x07160101 ) break; // exit on NoPageErr
+ }
+ }
+ }
+
+ // for the time being, switch field off to protect rdv4.0
+ // note: this prevents using hf 15 cmd with s option - which isn't implemented yet anyway
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+ LED_D_OFF();
+
+ LED_A_OFF();
+}
+
+
+// Simulate an ISO15693 TAG.
+// For Inventory command: print command and send Inventory Response with given UID
+// TODO: interpret other reader commands and send appropriate response
+void SimTagIso15693(uint32_t parameter, uint8_t *uid)
+{
+ LEDsoff();
+ LED_A_ON();
+
+ FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
+ SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_NO_MODULATION);
+ FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SIMULATOR);
+
+ StartCountSspClk();
+
+ uint8_t cmd[ISO15693_MAX_COMMAND_LENGTH];
+
+ // Build a suitable response to the reader INVENTORY command
+ BuildInventoryResponse(uid);
+
+ // Listen to reader
+ while (!BUTTON_PRESS()) {
+ uint32_t eof_time = 0, start_time = 0;
+ int cmd_len = GetIso15693CommandFromReader(cmd, sizeof(cmd), &eof_time);
+
+ if ((cmd_len >= 5) && (cmd[0] & ISO15693_REQ_INVENTORY) && (cmd[1] == ISO15693_INVENTORY)) { // TODO: check more flags
+ bool slow = !(cmd[0] & ISO15693_REQ_DATARATE_HIGH);
+ start_time = eof_time + DELAY_ISO15693_VCD_TO_VICC_SIM - DELAY_ARM_TO_READER_SIM;
+ TransmitTo15693Reader(ToSend, ToSendMax, start_time, slow);
+ }
+
+ Dbprintf("%d bytes read from reader:", cmd_len);
+ Dbhexdump(cmd_len, cmd, false);
+ }