#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
* 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
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
if (!hithigh || !hitlow)\r
bit ^= 1;\r
\r
- BitStream[bit2idx++] = bit;\r
+ BitStream[bit2idx++] = bit ^ invert;\r
}\r
}\r
\r
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
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
PrintToScrollback("Error: too many decode errors, aborting.");\r
return;\r
}\r
- }\r
- }\r
+ }\r
+ } \r
}\r
\r
PrintToScrollback("Manchester decoded bitstream");\r
"hisamplest", CmdHi14readt,0, " Get samples HF, for testing",\r
"hisimlisten", CmdHisimlisten,0, " Get HF samples as fake tag",\r
"hpf", CmdHpf,1, " Remove DC offset from trace",\r
- "indalademod", CmdIndalademod,0, "['224'] -- Demodulate samples for Indala",\r
+ "indalademod", CmdIndalademod,0, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)",\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
"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