]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - winsrc/command.cpp
send LF commands to TAG (locomread)
[proxmark3-svn] / winsrc / command.cpp
index 0397ea3796d2b39d5664d5639bb632f87e9356d2..1f77c4883306d26db5cdac4d52d3c0e4b437c1c1 100644 (file)
@@ -9,6 +9,7 @@
 #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
@@ -52,6 +53,13 @@ static void CmdReset(char *str)
        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
@@ -262,6 +270,7 @@ static void CmdEM410xread(char *str)
        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
@@ -307,14 +316,15 @@ static void CmdEM410xread(char *str)
                        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
@@ -363,7 +373,7 @@ static void CmdEM410xread(char *str)
 \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
@@ -388,6 +398,16 @@ static void CmdEM410xread(char *str)
                                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
@@ -516,6 +536,21 @@ static void CmdLoread(char *str)
        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
@@ -1862,7 +1897,7 @@ static void Cmdaskdemod(char *str) {
                 * - 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
@@ -2384,6 +2419,7 @@ static struct {
        "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
@@ -2420,6 +2456,7 @@ static struct {
        "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
Impressum, Datenschutz