]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/command.c
fix USB send data timing issue in CMD_DOWNLOADED_SIM_SAMPLES_125K
[proxmark3-svn] / client / command.c
index a2c567e6dc1587bdfa9579b277606a355b8236fb..0d954258c0a8511c47183e02ca7c37753b04daef 100644 (file)
@@ -577,7 +577,6 @@ retest:
 static void CmdEM410xsim(char *str)\r
 {\r
        int i, n, j, h, binary[4], parity[4];\r
-       char *s = "0";\r
 \r
        /* clock is 64 in EM410x tags */\r
        int clock = 64;\r
@@ -628,12 +627,40 @@ static void CmdEM410xsim(char *str)
        }\r
 \r
        /* modulate that biatch */\r
-       Cmdmanchestermod(s);\r
+       Cmdmanchestermod("");\r
 \r
        /* booyah! */\r
        RepaintGraphWindow();\r
+       \r
+       CmdLosim("");\r
+}\r
+\r
+/* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */\r
+static void CmdLosimManchester(char *str)\r
+{\r
+       static int clock, gap;\r
+       static char data[1024], gapstring[8];\r
+       int i;\r
+\r
+       /* get settings/bits */\r
+       sscanf(str, "%i %s %i", &clock, &data[0], &gap);\r
+\r
+       /* clear our graph */\r
+       CmdClearGraph(0);\r
+\r
+       /* fill it with our bitstream */\r
+       for (i= 0; i < strlen(data) ; ++i)\r
+               CmdAppendGraph(0, clock, data[i]- '0');\r
 \r
-       CmdLosim(s);\r
+       /* modulate */\r
+       Cmdmanchestermod("");\r
+\r
+       /* show what we've done */\r
+       RepaintGraphWindow();\r
+\r
+       /* simulate */\r
+       sprintf(&gapstring[0], "%i", gap);\r
+       CmdLosim(gapstring);\r
 }\r
 \r
 static void ChkBitstream(char *str)\r
@@ -654,10 +681,14 @@ static void ChkBitstream(char *str)
 static void CmdLosim(char *str)\r
 {\r
        int i;\r
+       static int gap;\r
+\r
+       sscanf(str,"%i",&gap);\r
 \r
        /* convert to bitstream if necessary */\r
        ChkBitstream(str);\r
 \r
+       PrintToScrollback("Sending data, please wait...");\r
        for (i = 0; i < GraphTraceLen; i += 48) {\r
                UsbCommand c={CMD_DOWNLOADED_SIM_SAMPLES_125K, {i, 0, 0}};\r
                int j;\r
@@ -665,9 +696,11 @@ static void CmdLosim(char *str)
                        c.d.asBytes[j] = GraphBuffer[i+j];\r
                }\r
                SendCommand(&c);\r
+               wait_for_response(CMD_ACK);\r
        }\r
 \r
-       UsbCommand c={CMD_SIMULATE_TAG_125K, {GraphTraceLen, 0, 0}};\r
+       PrintToScrollback("Starting simulator...");\r
+       UsbCommand c={CMD_SIMULATE_TAG_125K, {GraphTraceLen, gap, 0}};\r
        SendCommand(&c);\r
 }\r
 \r
@@ -2881,7 +2914,8 @@ static struct {
        {"hi15sim",                     CmdHi15tag,                     0, "Fake an ISO15693 tag"},\r
        {"hidsimtag",           CmdHIDsimTAG,           0, "<ID> -- HID tag simulator"},\r
        {"hisimlisten",         CmdHisimlisten,         0, "Get HF samples as fake tag"},\r
-       {"losim",                       CmdLosim,                       0, "Simulate LF tag"},\r
+       {"losim",                       CmdLosim,                       0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},\r
+       {"losimman",                    CmdLosimManchester,                     0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},\r
        {"losimbidir",          CmdLosimBidir,          0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},\r
 \r
 /* card reading functions */\r
@@ -2923,7 +2957,7 @@ static struct {
 void CommandReceived(char *cmd)\r
 {\r
        int i;\r
-       char line[256];\r
+       char line[512];\r
 \r
        PrintToScrollback("> %s", cmd);\r
 \r
@@ -3032,14 +3066,19 @@ void UsbCommandReceived(UsbCommand *c)
        /* Maybe it's a response: */\r
        switch(current_command) {\r
                case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K:\r
-               if (c->cmd != CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K) goto unexpected_response;\r
-               int i;\r
-               for(i=0; i<48; i++) sample_buf[i] = c->d.asBytes[i];\r
-               received_command = c->cmd;\r
-               return;\r
-       default:\r
-       unexpected_response:\r
-               PrintToScrollback("unrecognized command %08x\n", c->cmd);\r
-               break;\r
+                       if (c->cmd != CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K) goto unexpected_response;\r
+                       int i;\r
+                       for(i=0; i<48; i++) sample_buf[i] = c->d.asBytes[i];\r
+                       received_command = c->cmd;\r
+                       return;\r
+               case CMD_DOWNLOADED_SIM_SAMPLES_125K:\r
+                       if (c->cmd != CMD_ACK) goto unexpected_response;\r
+                       // got ACK\r
+                       received_command = c->cmd;\r
+                       return;\r
+               default:\r
+               unexpected_response:\r
+                       PrintToScrollback("unrecognized command %08x\n", c->cmd);\r
+                       break;\r
        }\r
 }\r
Impressum, Datenschutz