From fd1d30cb76a384adc8176df1f0f35658c091d96c Mon Sep 17 00:00:00 2001
From: marshmellow42 <marshmellowrf@gmail.com>
Date: Wed, 3 Jun 2015 18:28:56 -0400
Subject: [PATCH 1/1] addition animal tags demod info

---
 client/cmddata.c | 35 ++++++++++++++---------------------
 common/lfdemod.c | 13 +++++++------
 common/lfdemod.h |  1 +
 3 files changed, 22 insertions(+), 27 deletions(-)

diff --git a/client/cmddata.c b/client/cmddata.c
index 089e7d5f..fd08b6dd 100644
--- a/client/cmddata.c
+++ b/client/cmddata.c
@@ -1493,11 +1493,14 @@ int CmdIso11784demodBI(const char *Cmd){
 	setDemodBuf(BitStream, 128, preambleIndex);
 	//printDemodBuff();
 
-	size = removeParity(BitStream, preambleIndex + 11, 9, 1, 117);
-	if ( size <= 0 ) {
+	size = removeParity(BitStream, preambleIndex + 11, 9, 2, 117);
+	if ( size <= 103 ) {
 		if (g_debugMode) PrintAndLog("Error removeParity:: %d", size);
 		return 0;
 	}
+	//char *bin = sprint_bin_break(BitStream,size,16);
+	//PrintAndLog("DEBUG BinStream:\n%s",bin);
+
 	PrintAndLog("startmarker %d;   Size %d", preambleIndex, size);
 
 	//return 1;
@@ -1511,25 +1514,14 @@ int CmdIso11784demodBI(const char *Cmd){
 	uint32_t crc16 = bytebits_to_byteLSBF(BitStream+64,16);
 	uint32_t extended = bytebits_to_byteLSBF(BitStream+80,24);
 
-	PrintAndLog("NationalCode: %x%08x",NationalCodeB,NationalCodeA);
-	//add rest of print code here...
-	/*
-	uint8_t ByteStream[16] = {0x00};
-	uint8_t bitCnt = 0;
-	uint8_t ByteCnt = 0;
-	size_t startIdx = preambleIndex + 11; //start after preamble
-	for (size_t idx = 0; idx < size-11; idx++){
-
-		//lsb first
-		ByteStream[ByteCnt] = ByteStream[ByteCnt] | (BitStream[startIdx+idx] << bitCnt);
-		bitCnt++;
-		if (bitCnt % 8 == 0){
-			if (g_debugMode) PrintAndLog("byte %d: %02x", ByteCnt, ByteStream[ByteCnt]);
-			bitCnt = 0;
-			ByteCnt++;
-		}
-	}
-	*/
+	PrintAndLog("NationalCode: %X%08X",NationalCodeB,NationalCodeA);
+	PrintAndLog("CountryCode:  %d",countryCode);
+	PrintAndLog("dataBlockBit: %d",dataBlockBit);
+	PrintAndLog("reservedCode: %X",reservedCode);
+	PrintAndLog("animalBit:    %d", animalBit);
+	PrintAndLog("CRC:          %02X", crc16);
+	PrintAndLog("Extended:     %x", extended);
+	
 	return 1;
 }
 
@@ -2289,6 +2281,7 @@ static command_t CommandTable[] =
 	{"hexsamples",      CmdHexsamples,      0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},
 	{"hide",            CmdHide,            1, "Hide graph window"},
 	{"hpf",             CmdHpf,             1, "Remove DC offset from trace"},
+	{"iso11784demod",   CmdIso11784demodBI, 1, "Demodulate a ISO11784/85 Biphase tag from GraphBuffer"},
 	{"load",            CmdLoad,            1, "<filename> -- Load trace (to graph window"},
 	{"ltrim",           CmdLtrim,           1, "<samples> -- Trim samples from left of trace"},
 	{"rtrim",           CmdRtrim,           1, "<location to end trace> -- Trim samples from right of trace"},
diff --git a/common/lfdemod.c b/common/lfdemod.c
index c0f2bb71..aa37bb9e 100644
--- a/common/lfdemod.c
+++ b/common/lfdemod.c
@@ -526,7 +526,7 @@ int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, ui
 	return (int)startIdx;
 }
 
-uint32_t bytebits_to_byte(uint8_t* src, size_t numbits)
+uint32_t bytebits_to_byte(uint8_t *src, size_t numbits)
 {
 	uint32_t num = 0;
 	for(int i = 0 ; i < numbits ; i++)
@@ -538,13 +538,12 @@ uint32_t bytebits_to_byte(uint8_t* src, size_t numbits)
 }
 
 //least significant bit first
-uint32_t bytebits_to_byteLSBF(uint8_t* src, size_t numbits)
+uint32_t bytebits_to_byteLSBF(uint8_t *src, size_t numbits)
 {
 	uint32_t num = 0;
 	for(int i = 0 ; i < numbits ; i++)
 	{
-		num = (num << 1) | (*src);
-		src++;
+		num = (num << 1) | *(src + (numbits-(i+1)));
 	}
 	return num;
 }
@@ -581,7 +580,7 @@ int IOdemodFSK(uint8_t *dest, size_t size)
 
 // by marshmellow
 // takes a array of binary values, start position, length of bits per parity (includes parity bit),
-//   Parity Type (1 for odd 0 for even), and binary Length (length to run) 
+//   Parity Type (1 for odd; 0 for even; 2 for just drop it), and binary Length (length to run) 
 size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen)
 {
 	uint32_t parityWd = 0;
@@ -593,7 +592,9 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p
 		}
 		j--;
 		// if parity fails then return 0
-		if (parityTest(parityWd, pLen, pType) == 0) return -1;
+		if (pType != 2) {
+			if (parityTest(parityWd, pLen, pType) == 0) return -1;
+		}
 		bitCnt+=(pLen-1);
 		parityWd = 0;
 	}
diff --git a/common/lfdemod.h b/common/lfdemod.h
index 81157d19..e21bfe11 100644
--- a/common/lfdemod.h
+++ b/common/lfdemod.h
@@ -41,6 +41,7 @@ void     psk1TOpsk2(uint8_t *BitStream, size_t size);
 size_t   removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen);
 
 //tag specific
+int ISO11784demodBI(uint8_t *dest, size_t *size);
 int AWIDdemodFSK(uint8_t *dest, size_t *size);
 int gProxII_Demod(uint8_t BitStream[], size_t *size);
 int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo);
-- 
2.39.5