From 2e9d4b3ff492826eeaa7c5eefb905fcff3eb003c Mon Sep 17 00:00:00 2001
From: Martin Holst Swende <martin@swende.se>
Date: Sat, 3 Jan 2015 15:11:48 +0100
Subject: [PATCH] Some work on iclass, started on some better support in 'hf
 iclass list' and also fixes to 'hf iclass reader' so it exits better when the
 button is pressed

---
 armsrc/iclass.c      |  3 +++
 client/cmdhficlass.c | 40 +++++++++++++++++++++++++++++++---------
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/armsrc/iclass.c b/armsrc/iclass.c
index 28bdb3bc..2b1230f5 100644
--- a/armsrc/iclass.c
+++ b/armsrc/iclass.c
@@ -1551,6 +1551,9 @@ void ReaderIClass(uint8_t arg0) {
             break;
         }
     }
+
+    cmd_send(CMD_ACK,0,0,0,card_data, 0);
+
     LED_A_OFF();
 }
 
diff --git a/client/cmdhficlass.c b/client/cmdhficlass.c
index 583d518e..19ec57d2 100644
--- a/client/cmdhficlass.c
+++ b/client/cmdhficlass.c
@@ -42,6 +42,23 @@ int xorbits_8(uint8_t val)
     return res & 1;
 }
 
+void explain(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
+{
+
+    switch(cmd[0])
+    {
+    case 0x0a: snprintf(exp,size,"WUP"); break;
+    case 0x0f: snprintf(exp,size,"SOF"); break;
+    case 0x0c: snprintf(exp,size,"Read config"); break;
+    case 0x81: snprintf(exp,size,"SELECT"); break;
+    case 0x88: snprintf(exp,size,"Read E-purse (CC)"); break;
+    case 0x05: snprintf(exp,size,"Reader challenge"); break;
+    case 0x00: snprintf(exp,size,"End"); break;
+    default: snprintf(exp,size,"?"); break;
+    }
+    return;
+}
+
 int CmdHFiClassList(const char *Cmd)
 {
 	bool ShowWaitCycles = false;
@@ -67,8 +84,8 @@ int CmdHFiClassList(const char *Cmd)
 	PrintAndLog("Start = Start of Start Bit, End = End of last modulation. Src = Source of Transfer");
 	PrintAndLog("All times are in carrier periods (1/13.56Mhz)");
 	PrintAndLog("");
-	PrintAndLog("     Start |       End | Src | Data (! denotes parity error)                                   | CRC ");
-	PrintAndLog("-----------|-----------|-----|-----------------------------------------------------------------------");
+    PrintAndLog("     Start |       End | Src | Data (! denotes parity error)                                   | CRC | Explanation|");
+    PrintAndLog("-----------|-----------|-----|-------------------------------------------------------------------------------------");
 
 	uint16_t tracepos = 0;
 	uint16_t duration;
@@ -78,7 +95,7 @@ int CmdHFiClassList(const char *Cmd)
 	uint32_t timestamp;
 	uint32_t first_timestamp;
 	uint32_t EndOfTransmissionTimestamp;
-	
+    char explanation[20] = {0};
 	for (;;) {
 
 		if(tracepos >= TRACE_SIZE) {
@@ -135,7 +152,7 @@ int CmdHFiClassList(const char *Cmd)
 
 		}
 
-		char *crc = ""; 
+        char *crc = "    ";
 		if (data_len > 2) {
 			uint8_t b1, b2;
 			if(!isResponse && data_len == 4 ) {
@@ -156,20 +173,21 @@ int CmdHFiClassList(const char *Cmd)
 		}
 
 		EndOfTransmissionTimestamp = timestamp + duration;
-		
+        explain(explanation,sizeof(explanation),frame,data_len);
 		int num_lines = (data_len - 1)/16 + 1;
 		for (int j = 0; j < num_lines; j++) {
 			if (j == 0) {
-				PrintAndLog(" %9d | %9d | %s | %-64s| %s",
+                PrintAndLog(" %9d | %9d | %s | %-64s| %s| %s",
 					(timestamp - first_timestamp),
 					(EndOfTransmissionTimestamp - first_timestamp),
 					(isResponse ? "Tag" : "Rdr"),
 					line[j], 
-					(j == num_lines-1)?crc:"");
+                    (j == num_lines-1)?crc:"    ",
+                        explanation);
 			} else {
 				PrintAndLog("           |           |     | %-64s| %s",
 					line[j], 
-					(j == num_lines-1)?crc:"");
+                    (j == num_lines-1)?crc:"    ");
 			}
 		}				
 
@@ -322,7 +340,11 @@ int CmdHFiClassReader(const char *Cmd)
             uint8_t * data  = resp.d.asBytes;
 
             PrintAndLog("isOk:%02x", isOK);
-
+            if( isOK == 0){
+                //Aborted
+                PrintAndLog("Quitting...");
+                return 0;
+            }
             if(isOK > 0)
             {
                 PrintAndLog("CSN: %s",sprint_hex(data,8));
-- 
2.39.5