]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - winsrc/command.cpp
add inversion option to mandemod and fix indentation
[proxmark3-svn] / winsrc / command.cpp
index 0397ea3796d2b39d5664d5639bb632f87e9356d2..3fa75431e6e98915b3c349dccf8db0e55f77dba8 100644 (file)
@@ -52,6 +52,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 +269,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 +315,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 +372,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 +397,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
@@ -1862,7 +1881,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
@@ -2046,7 +2065,7 @@ static void Cmdmanchestermod(char *str)
  *               Typical values can be 64, 32, 128...\r
  */\r
 static void Cmdmanchesterdemod(char *str) {\r
-       int i, j;\r
+       int i, j, invert= 0;\r
        int bit;\r
        int clock;\r
        int lastval;\r
@@ -2058,6 +2077,16 @@ static void Cmdmanchesterdemod(char *str) {
        int bit2idx = 0;\r
        int warnings = 0;\r
 \r
+       /* check if we're inverting output */\r
+       if(*str == 'i')\r
+       {\r
+               PrintToScrollback("Inverting output");\r
+               invert= 1;\r
+               do\r
+                       ++str;\r
+               while(*str == ' '); // in case a 2nd argument was given\r
+       }\r
+\r
        /* Holds the decoded bitstream: each clock period contains 2 bits       */\r
        /* later simplified to 1 bit after manchester decoding.                 */\r
        /* Add 10 bits to allow for noisy / uncertain traces without aborting   */\r
@@ -2128,7 +2157,7 @@ static void Cmdmanchesterdemod(char *str) {
                        if (!hithigh || !hitlow)\r
                                bit ^= 1;\r
 \r
-                       BitStream[bit2idx++] = bit;\r
+                       BitStream[bit2idx++] = bit ^ invert;\r
                }\r
        }\r
 \r
@@ -2136,7 +2165,7 @@ static void Cmdmanchesterdemod(char *str) {
        else\r
        {\r
 \r
-       /* Then detect duration between 2 successive transitions */\r
+               /* Then detect duration between 2 successive transitions */\r
                for (bitidx = 1; i < GraphTraceLen; i++)\r
                {\r
                        if (GraphBuffer[i-1] != GraphBuffer[i])\r
@@ -2171,18 +2200,18 @@ static void Cmdmanchesterdemod(char *str) {
                                                PrintToScrollback("Error: too many detection errors, aborting.");\r
                                                return;\r
                                        }\r
+                               }\r
                        }\r
                }\r
-       }\r
 \r
-       // At this stage, we now have a bitstream of "01" ("1") or "10" ("0"), parse it into final decoded bitstream\r
-       // Actually, we overwrite BitStream with the new decoded bitstream, we just need to be careful\r
-       // to stop output at the final bitidx2 value, not bitidx\r
-       for (i = 0; i < bitidx; i += 2) {\r
-               if ((BitStream[i] == 0) && (BitStream[i+1] == 1)) {\r
-                       BitStream[bit2idx++] = 1;\r
+               // At this stage, we now have a bitstream of "01" ("1") or "10" ("0"), parse it into final decoded bitstream\r
+               // Actually, we overwrite BitStream with the new decoded bitstream, we just need to be careful\r
+               // to stop output at the final bitidx2 value, not bitidx\r
+               for (i = 0; i < bitidx; i += 2) {\r
+                       if ((BitStream[i] == 0) && (BitStream[i+1] == 1)) {\r
+                               BitStream[bit2idx++] = 1 ^ invert;\r
                } else if ((BitStream[i] == 1) && (BitStream[i+1] == 0)) {\r
-                       BitStream[bit2idx++] = 0;\r
+                       BitStream[bit2idx++] = 0 ^ invert;\r
                } else {\r
                        // We cannot end up in this state, this means we are unsynchronized,\r
                        // move up 1 bit:\r
@@ -2196,8 +2225,8 @@ static void Cmdmanchesterdemod(char *str) {
                                        PrintToScrollback("Error: too many decode errors, aborting.");\r
                                        return;\r
                                }\r
-               }\r
-       }\r
+                       }\r
+               }       \r
        }\r
 \r
        PrintToScrollback("Manchester decoded bitstream");\r
@@ -2384,6 +2413,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
@@ -2424,7 +2454,7 @@ static struct {
        "losamples",            CmdLosamples,0,         "[128 - 16000] -- Get raw samples for LF tag",\r
        "losim",                        CmdLosim,0,             "    Simulate LF tag",\r
        "ltrim",                        CmdLtrim,1,             "<samples> -- Trim samples from left of trace",\r
-       "mandemod",                     Cmdmanchesterdemod,1,   "[clock rate] -- Try a Manchester demodulation on a binary stream",\r
+       "mandemod",                     Cmdmanchesterdemod,1,   "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)",\r
        "manmod",                       Cmdmanchestermod,1,     "[clock rate] -- Manchester modulate a binary stream",\r
        "norm",                         CmdNorm,1,              "    Normalize max/min to +/-500",\r
        "plot",                         CmdPlot,1,              "    Show graph window",\r
Impressum, Datenschutz