X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/3628c31882e371997087ecc0249710340bf170e6..709b784c1639ccd1f777f849c4e76b0498804fcf:/winsrc/command.cpp

diff --git a/winsrc/command.cpp b/winsrc/command.cpp
index 454fbab2..061ea456 100644
--- a/winsrc/command.cpp
+++ b/winsrc/command.cpp
@@ -663,6 +663,15 @@ static void CmdLosim(char *str)
 	SendCommand(&c, FALSE);
 }
 
+static void CmdLosimBidir(char *str)
+{
+	UsbCommand c;
+	c.cmd = CMD_LF_SIMULATE_BIDIR;
+	c.ext1 = 47; /* Set ADC to twice the carrier for a slight supersampling */
+	c.ext2 = 384;
+	SendCommand(&c, FALSE);
+}
+
 static void CmdLoread(char *str)
 {
 	UsbCommand c;
@@ -1397,45 +1406,6 @@ static void CmdHi15demod(char *str)
 	PrintToScrollback("CRC=%04x", Iso15693Crc(outBuf, k-2));
 }
 
-static void CmdTIReadRaw(char *str)
-{
-	UsbCommand c;
-	c.cmd = CMD_ACQUIRE_RAW_BITS_TI_TYPE;
-	SendCommand(&c, FALSE);
-}
-
-static void CmdTIBits(char *str)
-{
-	int cnt = 0;
-	int i;
-//	for(i = 0; i < 1536; i += 12) {
-	for(i = 0; i < 4000; i += 12) {
-		UsbCommand c;
-		c.cmd = CMD_DOWNLOAD_RAW_BITS_TI_TYPE;
-		c.ext1 = i;
-		SendCommand(&c, FALSE);
-		ReceiveCommand(&c);
-		if(c.cmd != CMD_DOWNLOADED_RAW_BITS_TI_TYPE) {
-			PrintToScrollback("bad resp");
-			return;
-		}
-		int j;
-		for(j = 0; j < 12; j++) {
-			int k;
-			for(k = 31; k >= 0; k--) {
-				if(c.d.asDwords[j] & (1 << k)) {
-					GraphBuffer[cnt++] = 1;
-				} else {
-					GraphBuffer[cnt++] = -1;
-				}
-			}
-		}
-	}
-//	GraphTraceLen = 1536*32;
-	GraphTraceLen = 4000*32;
-	RepaintGraphWindow();
-}
-
 static void CmdFSKdemod(char *cmdline)
 {
 	static const int LowTone[]  = {
@@ -1454,13 +1424,13 @@ static void CmdFSKdemod(char *cmdline)
 		1,  1,  1,  1,     -1, -1, -1, -1, -1,
 	};
 
-	int convLen = max(arraylen(HighTone), arraylen(LowTone));
+	int lowLen = sizeof(LowTone)/sizeof(int);
+	int highLen = sizeof(HighTone)/sizeof(int);
+	int convLen = (highLen>lowLen)?highLen:lowLen;
 	DWORD hi = 0, lo = 0;
 
 	int i, j;
 	int minMark=0, maxMark=0;
-	int lowLen = arraylen(LowTone);
-	int highLen = arraylen(HighTone);
 
 	for(i = 0; i < GraphTraceLen - convLen; i++) {
 		int lowSum = 0, highSum = 0;
@@ -1499,10 +1469,10 @@ static void CmdFSKdemod(char *cmdline)
 	int max = 0, maxPos = 0;
 	for(i = 0; i < 6000; i++) {
 		int dec = 0;
-		for(j = 0; j < 3*arraylen(LowTone); j++) {
+		for(j = 0; j < 3*lowLen; j++) {
 			dec -= GraphBuffer[i+j];
 		}
-		for(; j < 3*(arraylen(LowTone) + arraylen(HighTone) ); j++) {
+		for(; j < 3*(lowLen + highLen ); j++) {
 			dec += GraphBuffer[i+j];
 		}
 		if(dec > max) {
@@ -1522,7 +1492,7 @@ static void CmdFSKdemod(char *cmdline)
 	GraphBuffer[maxPos+1] = minMark;
 
 	PrintToScrollback("actual data bits start at sample %d", maxPos);
-	PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));
+	PrintToScrollback("length %d/%d", highLen, lowLen);
 
 	BYTE bits[46];
 	bits[sizeof(bits)-1] = '\0';
@@ -1530,10 +1500,10 @@ static void CmdFSKdemod(char *cmdline)
 	// find bit pairs and manchester decode them
 	for(i = 0; i < arraylen(bits)-1; i++) {
 		int dec = 0;
-		for(j = 0; j < arraylen(LowTone); j++) {
+		for(j = 0; j < lowLen; j++) {
 			dec -= GraphBuffer[maxPos+j];
 		}
-		for(; j < arraylen(LowTone) + arraylen(HighTone); j++) {
+		for(; j < lowLen + highLen; j++) {
 			dec += GraphBuffer[maxPos+j];
 		}
 		maxPos += j;
@@ -1574,7 +1544,7 @@ static void CmdTIWrite(char *str)
 	res = sscanf(str, "0x%x 0x%x 0x%x ", &c.ext1, &c.ext2, &c.ext3);
 	if (res == 2) c.ext3=0;
 	if (res<2)
-		PrintToScrollback("Please specify 2 or three hex strings, eg 0x1234 0x5678");
+		PrintToScrollback("Please specify the data as two hex strings, optionally the CRC as a third");
 	else
 		SendCommand(&c, FALSE);
 }
@@ -1595,52 +1565,57 @@ h = 2*pi*ones(1, floor(f_s*T_h))*(f_h/f_s);
 l = sign(sin(cumsum(l)));
 h = sign(sin(cumsum(h)));
 	*/
+
+// 2M*16/134.2k = 238
  static const int LowTone[] = {
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		 -1, -1
  };
+// 2M*16/123.2k = 260
  static const int HighTone[] = {
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,  1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,     -1, -1, -1, -1, -1, -1, -1, -1,
-  1,  1,  1,  1,  1,  1,  1,
+	1, 1, 1, 1, 1, 1, 1, 1,		-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1,		-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1,			-1, -1, -1, -1, -1, -1, -1,
+	1, 1, 1, 1, 1, 1, 1, 1
  };
-
-	int convLen = max(arraylen(HighTone), arraylen(LowTone));
+	int lowLen = sizeof(LowTone)/sizeof(int);
+	int highLen = sizeof(HighTone)/sizeof(int);
+	int convLen = (highLen>lowLen)?highLen:lowLen;
 	WORD crc;
-	int i, TagType;
+	int i, j, TagType;
+	int lowSum = 0, highSum = 0;;
+	int lowTot = 0, highTot = 0;
+
 	for(i = 0; i < GraphTraceLen - convLen; i++) {
-		int j;
-		int lowSum = 0, highSum = 0;;
-		int lowLen = arraylen(LowTone);
-		int highLen = arraylen(HighTone);
+		lowSum = 0;
+		highSum = 0;;
 
 		for(j = 0; j < lowLen; j++) {
 			lowSum += LowTone[j]*GraphBuffer[i+j];
@@ -1650,12 +1625,15 @@ h = sign(sin(cumsum(h)));
 		}
 		lowSum = abs((100*lowSum) / lowLen);
 		highSum = abs((100*highSum) / highLen);
+		lowSum = (lowSum<0)?-lowSum:lowSum;
+		highSum = (highSum<0)?-highSum:highSum;
+
 		GraphBuffer[i] = (highSum << 16) | lowSum;
 	}
 
 	for(i = 0; i < GraphTraceLen - convLen - 16; i++) {
-		int j;
-		int lowTot = 0, highTot = 0;
+		lowTot = 0;
+		highTot = 0;
 		// 16 and 15 are f_s divided by f_l and f_h, rounded
 		for(j = 0; j < 16; j++) {
 			lowTot += (GraphBuffer[i+j] & 0xffff);
@@ -1688,11 +1666,11 @@ h = sign(sin(cumsum(h)));
 		int j;
 		int dec = 0;
 		// searching 17 consecutive lows
-		for(j = 0; j < 17*arraylen(LowTone); j++) {
+		for(j = 0; j < 17*lowLen; j++) {
 			dec -= GraphBuffer[i+j];
 		}
 		// searching 7 consecutive highs
-		for(; j < 17*arraylen(LowTone) + 6*arraylen(HighTone); j++) {
+		for(; j < 17*lowLen + 6*highLen; j++) {
 			dec += GraphBuffer[i+j];
 		}
 		if(dec > max) {
@@ -1707,8 +1685,8 @@ h = sign(sin(cumsum(h)));
 	GraphBuffer[maxPos+1] = -800;
 
 	// advance pointer to start of actual data stream (after 16 pre and 8 start bits)
-	maxPos += 17*arraylen(LowTone);
-	maxPos += 6*arraylen(HighTone);
+	maxPos += 17*lowLen;
+	maxPos += 6*highLen;
 
 	// place a marker in the buffer to visually aid location
 	// of the end of sync
@@ -1717,7 +1695,7 @@ h = sign(sin(cumsum(h)));
 
 	PrintToScrollback("actual data bits start at sample %d", maxPos);
 
-	PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));
+	PrintToScrollback("length %d/%d", highLen, lowLen);
 
 	BYTE bits[1+64+16+8+16];
 	bits[sizeof(bits)-1] = '\0';
@@ -1728,21 +1706,21 @@ h = sign(sin(cumsum(h)));
 		int high = 0;
 		int low = 0;
 		int j;
-		for(j = 0; j < arraylen(LowTone); j++) {
+		for(j = 0; j < lowLen; j++) {
 			low -= GraphBuffer[maxPos+j];
 		}
-		for(j = 0; j < arraylen(HighTone); j++) {
+		for(j = 0; j < highLen; j++) {
 			high += GraphBuffer[maxPos+j];
 		}
 
 		if(high > low) {
 			bits[i] = '1';
-			maxPos += arraylen(HighTone);
+			maxPos += highLen;
 			// bitstream arrives lsb first so shift right
 			shift3 |= (1<<31);
 		} else {
 			bits[i] = '.';
-			maxPos += arraylen(LowTone);
+			maxPos += lowLen;
 		}
 
 		// 128 bit right shift register
@@ -1830,6 +1808,40 @@ static void CmdNorm(char *str)
 	RepaintGraphWindow();
 }
 
+static void CmdAmp(char *str)
+{
+	int i, rising, falling;
+	int max = INT_MIN, min = INT_MAX;
+	for(i = 10; i < GraphTraceLen; i++) {
+		if(GraphBuffer[i] > max) {
+			max = GraphBuffer[i];
+		}
+		if(GraphBuffer[i] < min) {
+			min = GraphBuffer[i];
+		}
+	}
+	if(max != min) {
+		rising= falling= 0;
+		for(i = 0; i < GraphTraceLen; i++) {
+			if(GraphBuffer[i+1] < GraphBuffer[i]) {
+				if(rising) {
+ 					GraphBuffer[i]= max;
+					rising= 0;
+					}
+				falling= 1;
+				}
+			if(GraphBuffer[i+1] > GraphBuffer[i]) {
+				if(falling) {
+					GraphBuffer[i]= min;
+					falling= 0;
+					}
+				rising= 1;
+				}
+		}
+	}
+	RepaintGraphWindow();
+}
+
 static void CmdDec(char *str)
 {
 	int i;
@@ -2260,9 +2272,11 @@ static void Cmdaskdemod(char *str) {
 	int c, high = 0, low = 0;
 
 	// TODO: complain if we do not give 2 arguments here !
+	// (AL - this doesn't make sense! we're only using one argument!!!)
 	sscanf(str, "%i", &c);
 
 	/* Detect high and lows and clock */
+	// (AL - clock???)
 	for (i = 0; i < GraphTraceLen; i++)
 	{
 		if (GraphBuffer[i] > high)
@@ -2270,6 +2284,10 @@ static void Cmdaskdemod(char *str) {
 		else if (GraphBuffer[i] < low)
 			low = GraphBuffer[i];
 	}
+	if(c != 0 && c != 1) {
+		PrintToScrollback("Invalid argument: %s",str);
+		return;
+		}
 
 	if (GraphBuffer[0] > 0) {
 		GraphBuffer[0] = 1-c;
@@ -2514,7 +2532,12 @@ static void Cmdmanchesterdemod(char *str) {
 
 	/* Detect first transition */
 	/* Lo-Hi (arbitrary)       */
-	for (i = 0; i < GraphTraceLen; i++)
+	/* skip to the first high */
+	for (i= 0; i < GraphTraceLen; i++)
+		if(GraphBuffer[i] == high)
+			break;
+	/* now look for the first low */
+	for (; i < GraphTraceLen; i++)
 	{
 		if (GraphBuffer[i] == low)
 		{
@@ -2763,6 +2786,13 @@ static void CmdReadmem(char *str)
 	SendCommand(&c, FALSE);
 }
 
+static void CmdVersion(char *str)
+{
+	UsbCommand c;
+	c.cmd = CMD_VERSION;
+	SendCommand(&c, FALSE);
+}
+
 static void CmdLcdReset(char *str)
 {
 	UsbCommand c;
@@ -2809,7 +2839,8 @@ static struct {
 	int		offline;  // 1 if the command can be used when in offline mode
 	char		*docString;
 } CommandTable[] = {
-	{"askdemod",			Cmdaskdemod,				1, "<samples per bit> <0|1> -- Attempt to demodulate simple ASK tags"},
+	{"amp",					CmdAmp,						1, "Amplify peaks"},
+	{"askdemod",			Cmdaskdemod,				1, "<0|1> -- Attempt to demodulate simple ASK tags"},
 	{"autocorr",			CmdAutoCorr,				1, "<window length> -- Autocorrelation over window"},
 	{"bitsamples",		CmdBitsamples,			0, "Get raw samples as bitstring"},
 	{"bitstream",			Cmdbitstream,				1, "[clock rate] -- Convert waveform into a bitstream"},
@@ -2858,6 +2889,7 @@ static struct {
 	{"loread",				CmdLoread,					0, "['h'] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134)"},
 	{"losamples",			CmdLosamples,				0, "[128 - 16000] -- Get raw samples for LF tag"},
 	{"losim",					CmdLosim,						0, "Simulate LF tag"},
+	{"losimbidir",					CmdLosimBidir,						0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
 	{"ltrim",					CmdLtrim,						1, "<samples> -- Trim samples from left of trace"},
 	{"mandemod",			Cmdmanchesterdemod,	1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)"},
 	{"manmod",				Cmdmanchestermod,		1, "[clock rate] -- Manchester modulate a binary stream"},
@@ -2870,14 +2902,13 @@ static struct {
 	{"scale",					CmdScale,						1, "<int> -- Set cursor display scale"},
 	{"setlfdivisor",	CmdSetDivisor,			0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},
 	{"sri512read",		CmdSri512read,			0, "<int> -- Read contents of a SRI512 tag"},
-	{"tibits",				CmdTIBits,					0, "Get raw bits for TI-type LF tag"},
 	{"tidemod",				CmdTIDemod,					1, "Demodulate raw bits for TI-type LF tag"},
-	{"tireadraw",			CmdTIReadRaw,				0, "Read a TI-type 134 kHz tag in raw mode"},
 	{"tiread",				CmdTIRead,					0, "Read and decode a TI 134 kHz tag"},
 	{"tiwrite",				CmdTIWrite,					0, "Write new data to a r/w TI 134 kHz tag"},
 	{"threshold",			CmdThreshold,				1, "Maximize/minimize every value in the graph window depending on threshold"},
 	{"tune",					CmdTune,						0, "Measure antenna tuning"},
 	{"vchdemod",			CmdVchdemod,				0, "['clone'] -- Demodulate samples for VeriChip"},
+	{"version",			CmdVersion,				0, "Show version inforation about the connected Proxmark"},
 	{"zerocrossings",	CmdZerocrossings,		1, "Count time between zero-crossings"},
 };