#include <stdio.h>\r
#include <limits.h>\r
#include <math.h>\r
+#include <unistd.h>\r
\r
#include "prox.h"\r
#include "../common/iso14443_crc.c"\r
SendCommand(&c, FALSE);\r
}\r
\r
+static void CmdBuffClear(char *str)\r
+{\r
+ UsbCommand c;\r
+ c.cmd = CMD_BUFF_CLEAR;\r
+ SendCommand(&c, FALSE);\r
+ CmdClearGraph(TRUE);\r
+}\r
\r
static void CmdQuit(char *str)\r
{\r
int i, j, clock, header, rows, bit, hithigh, hitlow, first, bit2idx, high, low;\r
int parity[4];\r
char id[11];\r
+ int retested = 0;\r
int BitStream[MAX_GRAPH_TRACE_LEN];\r
high = low = 0;\r
\r
if (hithigh && hitlow)\r
break;\r
}\r
-\r
+ \r
/* If we didn't hit both high and low peaks, we had a bit transition */\r
if (!hithigh || !hitlow)\r
bit ^= 1;\r
-\r
+ \r
BitStream[bit2idx++] = bit;\r
}\r
-\r
+ \r
+retest:\r
/* We go till 5 before the graph ends because we'll get that far below */\r
for (i = 1; i < bit2idx - 5; i++)\r
{\r
\r
/* Stop any loops */\r
go = 0;\r
- break;\r
+ return;\r
}\r
\r
/* Crap! Incorrect parity or no stop bit, start all over */\r
header = 0;\r
}\r
}\r
+ \r
+ /* if we've already retested after flipping bits, return */\r
+ if (retested++)\r
+ return;\r
+\r
+ /* if this didn't work, try flipping bits */\r
+ for (i = 0; i < bit2idx; i++)\r
+ BitStream[i] ^= 1;\r
+\r
+ goto retest;\r
}\r
\r
/* emulate an EM410X tag\r
SendCommand(&c, FALSE);\r
}\r
\r
+/* send a command before reading */\r
+static void CmdLoCommandRead(char *str)\r
+{\r
+ static char dummy[3];\r
+\r
+ dummy[0]= ' ';\r
+ \r
+ UsbCommand c;\r
+ c.cmd = CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K;\r
+ sscanf(str, "%i %i %i %s %s", &c.ext1, &c.ext2, &c.ext3, &c.d.asBytes,&dummy+1);\r
+ // in case they specified 'h'\r
+ strcpy(&c.d.asBytes + strlen(c.d.asBytes),dummy);\r
+ SendCommand(&c, FALSE);\r
+}\r
+\r
static void CmdLosamples(char *str)\r
{\r
int cnt = 0;\r
* - we're high: transition if we hit a low\r
* (we need to do it this way because some tags keep high or\r
* low for long periods, others just reach the peak and go\r
- * down)
+ * down)\r
*/\r
if ((GraphBuffer[i]==high) && (GraphBuffer[i-1] == c)) {\r
GraphBuffer[i]=1-c;\r
"autocorr", CmdAutoCorr,1, "<window length> -- Autocorrelation over window",\r
"bitsamples", CmdBitsamples,0, " Get raw samples as bitstring",\r
"bitstream", Cmdbitstream,1, "[clock rate] -- Convert waveform into a bitstream",\r
+ "buffclear", CmdBuffClear,0, " Clear sample buffer and graph window",\r
"dec", CmdDec,1, " Decimate samples",\r
"detectclock", Cmddetectclockrate,1, " Detect clock rate",\r
"em410xsim", CmdEM410xsim,1, "<UID> -- Simulate EM410x tag",\r
"lcd", CmdLcd,0, "<HEX command> <count> -- Send command/data to LCD",\r
"lcdreset", CmdLcdReset,0, " Hardware reset LCD",\r
"load", CmdLoad,1, "<filename> -- Load trace (to graph window",\r
+ "locomread", CmdLoCommandRead,0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)",\r
"loread", CmdLoread,0, "['h'] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134)",\r
"losamples", CmdLosamples,0, "[128 - 16000] -- Get raw samples for LF tag",\r
"losim", CmdLosim,0, " Simulate LF tag",\r