From 195af47289761be82eeb4f6687a65f5ee8f38611 Mon Sep 17 00:00:00 2001
From: "roel@libnfc.org" <roel@libnfc.org@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Date: Wed, 3 Apr 2013 08:45:04 +0000
Subject: [PATCH 1/1] removed redundant function to compose reader short frame

---
 armsrc/hitag2.c    |   4 --
 armsrc/iso14443a.c | 107 +++++++++++++--------------------------------
 armsrc/util.c      |   4 ++
 armsrc/util.h      |   1 +
 4 files changed, 36 insertions(+), 80 deletions(-)

diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c
index aa9ce237..1a0e9b56 100644
--- a/armsrc/hitag2.c
+++ b/armsrc/hitag2.c
@@ -29,10 +29,6 @@ bool bAuthenticating;
 bool bPwd;
 bool bSuccessful;
 
-size_t nbytes(size_t nbits) {
-	return (nbits/8)+((nbits%8)>0);
-}
-
 int LogTraceHitag(const uint8_t * btBytes, int iBits, int iSamples, uint32_t dwParity, int bReader)
 {
   // Return when trace is full
diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c
index ca7c3ba4..5a01178d 100644
--- a/armsrc/iso14443a.c
+++ b/armsrc/iso14443a.c
@@ -1262,68 +1262,9 @@ static void TransmitFor14443a(const uint8_t *cmd, int len, int *samples, int *wa
 }
 
 //-----------------------------------------------------------------------------
-// Code a 7-bit command without parity bit
-// This is especially for 0x26 and 0x52 (REQA and WUPA)
+// Prepare reader command (in bits, support short frames) to send to FPGA
 //-----------------------------------------------------------------------------
-void ShortFrameFromReader(const uint8_t bt)
-{
-	int j;
-	int last;
-  uint8_t b;
-
-	ToSendReset();
-
-	// Start of Communication (Seq. Z)
-	ToSend[++ToSendMax] = SEC_Z;
-	last = 0;
-
-	b = bt;
-	for(j = 0; j < 7; j++) {
-		if(b & 1) {
-			// Sequence X
-			ToSend[++ToSendMax] = SEC_X;
-			last = 1;
-		} else {
-			if(last == 0) {
-				// Sequence Z
-				ToSend[++ToSendMax] = SEC_Z;
-			}
-			else {
-				// Sequence Y
-				ToSend[++ToSendMax] = SEC_Y;
-				last = 0;
-			}
-		}
-		b >>= 1;
-	}
-
-	// End of Communication
-	if(last == 0) {
-		// Sequence Z
-		ToSend[++ToSendMax] = SEC_Z;
-	}
-	else {
-		// Sequence Y
-		ToSend[++ToSendMax] = SEC_Y;
-		last = 0;
-	}
-	// Sequence Y
-	ToSend[++ToSendMax] = SEC_Y;
-
-	// Just to be sure!
-	ToSend[++ToSendMax] = SEC_Y;
-	ToSend[++ToSendMax] = SEC_Y;
-	ToSend[++ToSendMax] = SEC_Y;
-
-    // Convert from last character reference to length
-    ToSendMax++;
-}
-
-//-----------------------------------------------------------------------------
-// Prepare reader command to send to FPGA
-//
-//-----------------------------------------------------------------------------
-void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
+void CodeIso14443aBitsAsReaderPar(const uint8_t * cmd, int bits, uint32_t dwParity)
 {
   int i, j;
   int last;
@@ -1335,12 +1276,14 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
   ToSend[++ToSendMax] = SEC_Z;
   last = 0;
 
+  size_t bytecount = nbytes(bits);
   // Generate send structure for the data bits
-  for (i = 0; i < len; i++) {
+  for (i = 0; i < bytecount; i++) {
     // Get the current byte to send
     b = cmd[i];
+    size_t bitsleft = MIN((bits-(i*8)),8);
 
-    for (j = 0; j < 8; j++) {
+    for (j = 0; j < bitsleft; j++) {
       if (b & 1) {
         // Sequence X
     	  ToSend[++ToSendMax] = SEC_X;
@@ -1358,19 +1301,22 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
       b >>= 1;
     }
 
-    // Get the parity bit
-    if ((dwParity >> i) & 0x01) {
-      // Sequence X
-    	ToSend[++ToSendMax] = SEC_X;
-      last = 1;
-    } else {
-      if (last == 0) {
-        // Sequence Z
-    	  ToSend[++ToSendMax] = SEC_Z;
+    // Only transmit (last) parity bit if we transmitted a complete byte
+    if (j == 8) {
+      // Get the parity bit
+      if ((dwParity >> i) & 0x01) {
+        // Sequence X
+        ToSend[++ToSendMax] = SEC_X;
+        last = 1;
       } else {
-        // Sequence Y
-    	  ToSend[++ToSendMax] = SEC_Y;
-        last = 0;
+        if (last == 0) {
+          // Sequence Z
+          ToSend[++ToSendMax] = SEC_Z;
+        } else {
+          // Sequence Y
+          ToSend[++ToSendMax] = SEC_Y;
+          last = 0;
+        }
       }
     }
   }
@@ -1396,6 +1342,14 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
   ToSendMax++;
 }
 
+//-----------------------------------------------------------------------------
+// Prepare reader command to send to FPGA
+//-----------------------------------------------------------------------------
+void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
+{
+  CodeIso14443aBitsAsReaderPar(cmd,len*8,dwParity);
+}
+
 //-----------------------------------------------------------------------------
 // Wait for commands from reader
 // Stop when button is pressed (return 1) or field was gone (return 2)
@@ -1598,7 +1552,8 @@ void ReaderTransmitShort(const uint8_t* bt)
   int wait = 0;
   int samples = 0;
 
-  ShortFrameFromReader(*bt);
+//  ShortFrameFromReader(*bt);
+  CodeIso14443aBitsAsReaderPar(bt,7,0);
 
   // Select the card
   TransmitFor14443a(ToSend, ToSendMax, &samples, &wait);
diff --git a/armsrc/util.c b/armsrc/util.c
index 3870a6c6..f2298290 100644
--- a/armsrc/util.c
+++ b/armsrc/util.c
@@ -12,6 +12,10 @@
 #include "util.h"
 #include "string.h"
 
+size_t nbytes(size_t nbits) {
+	return (nbits/8)+((nbits%8)>0);
+}
+
 uint32_t SwapBits(uint32_t value, int nrbits) {
 	int i;
 	uint32_t newvalue = 0;
diff --git a/armsrc/util.h b/armsrc/util.h
index d2a85ba0..ac141065 100644
--- a/armsrc/util.h
+++ b/armsrc/util.h
@@ -27,6 +27,7 @@
 #define BUTTON_DOUBLE_CLICK -2
 #define BUTTON_ERROR -99
 
+size_t nbytes(size_t nbits);
 uint32_t SwapBits(uint32_t value, int nrbits);
 void num_to_bytes(uint64_t n, size_t len, uint8_t* dest);
 uint64_t bytes_to_num(uint8_t* src, size_t len);
-- 
2.39.5