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
}\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
+ /* modulate */\r
+ Cmdmanchestermod("");\r
+\r
+ /* show what we've done */\r
+ RepaintGraphWindow();\r
\r
- CmdLosim(s);\r
+ /* simulate */\r
+ sprintf(&gapstring[0], "%i", gap);\r
+ CmdLosim(gapstring);\r
}\r
\r
static void ChkBitstream(char *str)\r
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
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
static void CmdHexsamples(char *str)\r
{\r
int i, j, n;\r
- int requested = strtol(str, NULL, 0);\r
+ int requested = 0;\r
+ int offset = 0;\r
+ sscanf(str, "%i %i", &requested, &offset);\r
+ if (offset % 4!=0) {\r
+ PrintToScrollback("Offset must be a multiple of 4");\r
+ return;\r
+ }\r
+ offset = offset/4; \r
+\r
int delivered = 0;\r
\r
if (requested == 0) {\r
n = requested/4;\r
}\r
\r
- for(i = 0; i < n; i += 12) {\r
+ for(i = offset; i < n+offset; i += 12) {\r
UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}};\r
SendCommand(&c);\r
wait_for_response(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K);\r
/* data transfer functions */\r
\r
{"bitsamples", CmdBitsamples, 0, "Get raw samples as bitstring"},\r
- {"hexsamples", CmdHexsamples, 0, "<blocks> -- Dump big buffer as hex bytes"},\r
+ {"hexsamples", CmdHexsamples, 0, "<blocks> [<offset>] -- Dump big buffer as hex bytes"},\r
{"higet", CmdHi14read_sim, 0, "<samples> -- Get samples HF, 'analog'"},\r
{"hisamples", CmdHisamples, 0, "Get raw samples for HF tag"},\r
{"hisampless", CmdHisampless, 0, "<samples> -- Get signed raw samples, HF tag"},\r
{"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
void CommandReceived(char *cmd)\r
{\r
int i;\r
- char line[256];\r
+ char line[512];\r
\r
PrintToScrollback("> %s", cmd);\r
\r
/* 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