From b29d55f24b7bbdfad0e4c1644d06a046336c07ae Mon Sep 17 00:00:00 2001
From: marshmellow42 <marshmellowrf@gmail.com>
Date: Sat, 27 Jun 2015 22:49:26 -0400
Subject: [PATCH 1/1] change lf config threshold, hf 14b reader,

adjust lf config threshold to coincide with graph values and trigger on
highs over the threshold or lows under the threshold * -1

split general hf 14b reader from full info printing
---
 CHANGELOG.md        |  6 ++--
 armsrc/lfsampling.c |  9 ++++--
 client/cmdhf14b.c   | 76 +++++++++++++++++++++++++++++++++++++--------
 client/cmdlf.c      |  2 +-
 4 files changed, 74 insertions(+), 19 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3f9546d9..0f420915 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,11 +5,13 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
 ## [Unreleased][unreleased]
 
 ### Changed
+- Changed lf config's `threshold` to a graph (signed) metric and it will trigger on + or - value set to. (example: set to 50 and recording would begin at first graphed value of >= 50 or <= -50) (marshmellow)
 - Changed `hf 14b write` to `hf 14b sriwrite` as it only applied to sri tags (marshmellow)
-- Added `hf 14b info` to `hf search` (marshmellow)
+- Added `hf 14b reader` to `hf search` (marshmellow)
 
 ### Added
-- Add `hf 14b info` to find and print info about std 14b tags and sri tags (using 14b raw commands in the client)  (marshmellow)
+- Add `hf 14b reader` to find and print general info about known 14b tags (marshmellow)
+- Add `hf 14b info` to find and print full info about std 14b tags and sri tags (using 14b raw commands in the client)  (marshmellow)
 - Add PACE replay functionality (frederikmoellers)
 
 ### Fixed 
diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c
index 120c0801..662ebf24 100644
--- a/armsrc/lfsampling.c
+++ b/armsrc/lfsampling.c
@@ -119,8 +119,7 @@ void LFSetupFPGAForADC(int divisor, bool lf_field)
  * @param silent - is true, now outputs are made. If false, dbprints the status
  * @return the number of bits occupied by the samples.
  */
-
-uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averaging, int trigger_threshold,bool silent)
+uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averaging, int trigger_threshold, bool silent)
 {
 	//.
 	uint8_t *dest = BigBuf_get_addr();
@@ -151,8 +150,12 @@ uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averag
 		if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) {
 			sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
 			LED_D_OFF();
-			if (trigger_threshold > 0 && sample < trigger_threshold)
+			// threshold either high or low values 128 = center 0.  if trigger = 178 
+			if ((trigger_threshold > 0) && (sample < (trigger_threshold+128)) && (sample > (128-trigger_threshold))) // 
 				continue;
+		
+			//if (trigger_threshold > 0 && sample < trigger_threshold) // 
+				//continue;
 
 			trigger_threshold = 0;
 			sample_total_numbers++;
diff --git a/client/cmdhf14b.c b/client/cmdhf14b.c
index d1d668e9..acbd0c2c 100644
--- a/client/cmdhf14b.c
+++ b/client/cmdhf14b.c
@@ -197,6 +197,7 @@ int CmdHF14BCmdRaw (const char *Cmd) {
 	return HF14BCmdRaw(reply, &crc, power, data, &datalen, true);
 }
 
+// print full atqb info
 static void print_atqb_resp(uint8_t *data){
 	PrintAndLog ("           UID: %s", sprint_hex(data+1,4));
 	PrintAndLog ("      App Data: %s", sprint_hex(data+5,4));
@@ -245,6 +246,7 @@ static void print_atqb_resp(uint8_t *data){
 	return;
 }
 
+// get SRx chip model (from UID) // from ST Microelectronics
 char *get_ST_Chip_Model(uint8_t data){
 	static char model[20];
 	char *retStr = model;
@@ -263,7 +265,8 @@ char *get_ST_Chip_Model(uint8_t data){
 	return retStr;
 }
 
-static void print_st_info(uint8_t *data){
+// print UID info from SRx chips (ST Microelectronics)
+static void print_st_general_info(uint8_t *data){
 	//uid = first 8 bytes in data
 	PrintAndLog(" UID: %s", sprint_hex(SwapEndian64(data,8,8),8));
 	PrintAndLog(" MFG: %02X, %s", data[6], getTagInfo(data[6]));
@@ -271,8 +274,18 @@ static void print_st_info(uint8_t *data){
 	return;
 }
 
+// 14b get and print Full Info (as much as we know)
 int HF14BStdInfo(uint8_t *data, uint8_t *datalen){
+	if (!HF14BStdReader(data,datalen)) return 0;
 
+	//add more info here
+	print_atqb_resp(data);
+
+	return 1;
+}
+
+// 14b get and print UID only (general info)
+int HF14BStdReader(uint8_t *data, uint8_t *datalen){
 	//05 00 00 = find one tag in field
 	//1d xx xx xx xx 20 00 08 01 00 = attrib xx=crc
 	//a3 = ?  (resp 03 e2 c2)
@@ -294,19 +307,30 @@ int HF14BStdInfo(uint8_t *data, uint8_t *datalen){
 	//std read cmd
 	data[0] = 0x05;
 	data[1] = 0x00;
-	data[2] = 0x00;
+	data[2] = 0x08;
 
 	if (HF14BCmdRaw(true, &crc, false, data, datalen, false)==0) return 0;
 
 	if (data[0] != 0x50  || *datalen != 14 || !crc) return 0;
 
 	PrintAndLog ("\n14443-3b tag found:");
-	print_atqb_resp(data);
+	PrintAndLog ("           UID: %s", sprint_hex(data+1,4));
 
 	return 1;
 }
 
+// SRx get and print full info (needs more info...)
 int HF14B_ST_Info(uint8_t *data, uint8_t *datalen){
+	if (!HF14B_ST_Reader(data, datalen)) return 0;
+	
+	//add locking bit information here.
+
+
+	return 1;
+}
+
+// SRx get and print general info about SRx chip from UID
+int HF14B_ST_Reader(uint8_t *data, uint8_t *datalen){
 	bool crc = true;
 	*datalen = 2;
 	//wake cmd
@@ -342,12 +366,12 @@ int HF14B_ST_Info(uint8_t *data, uint8_t *datalen){
 	if (*datalen != 10 || !crc) return 0;
 
 	PrintAndLog("\n14443-3b ST tag found:");
-	print_st_info(data);
+	print_st_general_info(data);
 	return 1;
 }
 
 // test for other 14b type tags (mimic another reader - don't have tags to identify)
-int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
+int HF14B_Other_Reader(uint8_t *data, uint8_t *datalen){
 	bool crc = true;
 	*datalen = 4;
 	//std read cmd
@@ -356,7 +380,7 @@ int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
 	data[2] = 0x3f;
 	data[3] = 0x80;
 
-	if (HF14BCmdRaw(true, &crc, false, data, datalen, false)!=0) {
+	if (HF14BCmdRaw(true, &crc, true, data, datalen, false)!=0) {
 		if (*datalen > 2 || !crc) {
 			PrintAndLog ("\n14443-3b tag found:");
 			PrintAndLog ("Unknown tag type answered to a 0x000b3f80 command ans:");
@@ -369,7 +393,7 @@ int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
 	*datalen = 1;
 	data[0] = 0x0a;
 
-	if (HF14BCmdRaw(true, &crc, false, data, datalen, false)!=0) {
+	if (HF14BCmdRaw(true, &crc, true, data, datalen, false)!=0) {
 		if (*datalen > 0) {
 			PrintAndLog ("\n14443-3b tag found:");
 			PrintAndLog ("Unknown tag type answered to a 0x0A command ans:");
@@ -382,7 +406,7 @@ int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
 	*datalen = 1;
 	data[0] = 0x0c;
 
-	if (HF14BCmdRaw(true, &crc, false, data, datalen, false)!=0) {
+	if (HF14BCmdRaw(true, &crc, true, data, datalen, false)!=0) {
 		if (*datalen > 0) {
 			PrintAndLog ("\n14443-3b tag found:");
 			PrintAndLog ("Unknown tag type answered to a 0x0C command ans:");
@@ -390,11 +414,11 @@ int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
 			return 1;
 		}
 	}
-
+	rawClose();
 	return 0;
-
 }
 
+// get and print all info known about any known 14b tag
 int HF14BInfo(bool verbose){
 	uint8_t data[100];
 	uint8_t datalen = 5;
@@ -407,16 +431,41 @@ int HF14BInfo(bool verbose){
 
 	// try unknown 14b read commands (to be identified later)
 	//   could be read of calypso, CEPAS, moneo, or pico pass.
-	if (HF14B_Other_Info(data, &datalen)) return 1;
+	if (HF14B_Other_Reader(data, &datalen)) return 1;
 
 	if (verbose) PrintAndLog("no 14443B tag found");
 	return 0;
 }
 
+// menu command to get and print all info known about any known 14b tag
 int CmdHF14Binfo(const char *Cmd){
 	return HF14BInfo(true);
 }
 
+// get and print general info about all known 14b chips
+int HF14BReader(bool verbose){
+	uint8_t data[100];
+	uint8_t datalen = 5;
+	
+	// try std 14b (atqb)
+	if (HF14BStdReader(data, &datalen)) return 1;
+
+	// try st 14b
+	if (HF14B_ST_Reader(data, &datalen)) return 1;
+
+	// try unknown 14b read commands (to be identified later)
+	//   could be read of calypso, CEPAS, moneo, or pico pass.
+	if (HF14B_Other_Reader(data, &datalen)) return 1;
+
+	if (verbose) PrintAndLog("no 14443B tag found");
+	return 0;
+}
+
+// menu command to get and print general info about all known 14b chips
+int CmdHF14BReader(const char *Cmd){
+	return HF14BReader(true);
+}
+
 int CmdSriWrite( const char *Cmd){
 /*
  * For SRIX4K  blocks 00 - 7F
@@ -487,8 +536,9 @@ int CmdSriWrite( const char *Cmd){
 static command_t CommandTable[] = 
 {
   {"help",        CmdHelp,        1, "This help"},
-	{"info",        CmdHF14Binfo,   0, "Find and print info about a 14b type tag (HF ISO 14443b)"},
-  {"list",        CmdHF14BList,   0, "[Deprecated] List ISO 14443b history"},
+  {"info",        CmdHF14Binfo,   0, "Find and print details about a 14443B tag"},
+  {"list",        CmdHF14BList,   0, "[Deprecated] List ISO 14443B history"},
+  {"reader",      CmdHF14BReader, 0, "Act as a 14443B reader to identify a tag"},
   {"sim",         CmdHF14BSim,    0, "Fake ISO 14443B tag"},
   {"snoop",       CmdHF14BSnoop,  0, "Eavesdrop ISO 14443B"},
   {"sri512read",  CmdSri512Read,  0, "Read contents of a SRI512 tag"},
diff --git a/client/cmdlf.c b/client/cmdlf.c
index edf02932..1acee39b 100644
--- a/client/cmdlf.c
+++ b/client/cmdlf.c
@@ -388,7 +388,7 @@ int usage_lf_config()
 	PrintAndLog("       b <bps>       Sets resolution of bits per sample. Default (max): 8");
 	PrintAndLog("       d <decim>     Sets decimation. A value of N saves only 1 in N samples. Default: 1");
 	PrintAndLog("       a [0|1]       Averaging - if set, will average the stored sample value when decimating. Default: 1");
-	PrintAndLog("       t <threshold> Sets trigger threshold. 0 means no threshold");
+	PrintAndLog("       t <threshold> Sets trigger threshold. 0 means no threshold (range: 0-128)");
 	PrintAndLog("Examples:");
 	PrintAndLog("      lf config b 8 L");
 	PrintAndLog("                    Samples at 125KHz, 8bps.");
-- 
2.39.5