X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/90d74dc206d876ed38632f3e9b3771dbe0c929fc..c6be64da095246620420500857f1f34994b769a8:/client/cmddata.c?ds=inline diff --git a/client/cmddata.c b/client/cmddata.c index a333fe39..c58f6f62 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -17,6 +17,7 @@ #include "ui.h" #include "graph.h" #include "cmdparser.h" +#include "util.h" #include "cmdmain.h" #include "cmddata.h" @@ -73,12 +74,14 @@ int Cmdaskdemod(const char *Cmd) int i; int c, high = 0, low = 0; - // TODO: complain if we do not give 2 arguments here ! - // (AL - this doesn't make sense! we're only using one argument!!!) sscanf(Cmd, "%i", &c); - /* Detect high and lows and clock */ - // (AL - clock???) + if (c != 0 && c != 1) { + PrintAndLog("Invalid argument: %s", Cmd); + return 0; + } + + /* Detect high and lows */ for (i = 0; i < GraphTraceLen; ++i) { if (GraphBuffer[i] > high) @@ -86,11 +89,7 @@ int Cmdaskdemod(const char *Cmd) else if (GraphBuffer[i] < low) low = GraphBuffer[i]; } - if (c != 0 && c != 1) { - PrintAndLog("Invalid argument: %s", Cmd); - return 0; - } - + if (GraphBuffer[0] > 0) { GraphBuffer[0] = 1-c; } else { @@ -393,46 +392,43 @@ int CmdGrid(const char *Cmd) int CmdHexsamples(const char *Cmd) { - int n; + int i, j; int requested = 0; int offset = 0; - sscanf(Cmd, "%i %i", &requested, &offset); - - int delivered = 0; + char string_buf[25]; + char* string_ptr = string_buf; uint8_t got[40000]; + + sscanf(Cmd, "%i %i", &requested, &offset); - /* round up to nearest 8 bytes so the printed data is all valid */ - if (requested < 8) { + /* if no args send something */ + if (requested == 0) { requested = 8; } - if (requested % 8 != 0) { - int remainder = requested % 8; - requested = requested + 8 - remainder; - } if (offset + requested > sizeof(got)) { PrintAndLog("Tried to read past end of buffer, + > 40000"); - return 0; - } else { - n = requested; - } + return 0; + } - GetFromBigBuf(got,n,offset); + GetFromBigBuf(got,requested,offset); WaitForResponse(CMD_ACK,NULL); - for (int j = 0; j < n; j += 8) { - PrintAndLog("%02x %02x %02x %02x %02x %02x %02x %02x", - sample_buf[j+0], - sample_buf[j+1], - sample_buf[j+2], - sample_buf[j+3], - sample_buf[j+4], - sample_buf[j+5], - sample_buf[j+6], - sample_buf[j+7] - ); - delivered += 8; - if (delivered >= requested) - break; + i = 0; + for (j = 0; j < requested; j++) { + i++; + string_ptr += sprintf(string_ptr, "%02x ", got[j]); + if (i == 8) { + *(string_ptr - 1) = '\0'; // remove the trailing space + PrintAndLog("%s", string_buf); + string_buf[0] = '\0'; + string_ptr = string_buf; + i = 0; + } + if (j == requested - 1 && string_buf[0] != '\0') { // print any remaining bytes + *(string_ptr - 1) = '\0'; + PrintAndLog("%s", string_buf); + string_buf[0] = '\0'; + } } return 0; } @@ -460,25 +456,23 @@ int CmdHpf(const char *Cmd) int CmdSamples(const char *Cmd) { - int cnt = 0; - int n; - uint8_t got[40000]; - - n = strtol(Cmd, NULL, 0); - if (n == 0) n = 512; - if (n > sizeof(got)) n = sizeof(got); + uint8_t got[36440] = {0x00}; + + int n = strtol(Cmd, NULL, 0); + if (n == 0) + n = 512; + if (n > sizeof(got)) + n = sizeof(got); - PrintAndLog("Reading %d samples\n", n); - GetFromBigBuf(got,n,0); - WaitForResponse(CMD_ACK,NULL); - for (int j = 0; j < n; j++) { - GraphBuffer[cnt++] = ((int)got[j]) - 128; - } - - PrintAndLog("Done!\n"); - GraphTraceLen = n; - RepaintGraphWindow(); - return 0; + PrintAndLog("Reading %d samples from device memory\n", n); + GetFromBigBuf(got,n,3560); + WaitForResponse(CMD_ACK,NULL); + for (int j = 0; j < n; ++j) { + GraphBuffer[j] = ((int)got[j]) - 128; + } + GraphTraceLen = n; + RepaintGraphWindow(); + return 0; } int CmdLoad(const char *Cmd) @@ -590,13 +584,16 @@ int CmdManchesterDemod(const char *Cmd) } } + PrintAndLog("Clock: %d", clock); + /* If we're not working with 1/0s, demod based off clock */ if (high != 1) { + PrintAndLog("Entering path A"); bit = 0; /* We assume the 1st bit is zero, it may not be * the case: this routine (I think) has an init problem. * Ed. - */ + */ for (; i < (int)(GraphTraceLen / clock); i++) { hithigh = 0; @@ -685,7 +682,7 @@ int CmdManchesterDemod(const char *Cmd) // We cannot end up in this state, this means we are unsynchronized, // move up 1 bit: i++; - warnings++; + warnings++; PrintAndLog("Unsynchronized, resync..."); PrintAndLog("(too many of those messages mean the stream is not Manchester encoded)"); @@ -815,8 +812,43 @@ int CmdThreshold(const char *Cmd) if (GraphBuffer[i] >= threshold) GraphBuffer[i] = 1; else - GraphBuffer[i] =- 1; + GraphBuffer[i] = -1; + } + RepaintGraphWindow(); + return 0; +} + +int CmdDirectionalThreshold(const char *Cmd) +{ + int8_t upThres = param_get8(Cmd, 0); + int8_t downThres = param_get8(Cmd, 1); + + printf("Applying Up Threshold: %d, Down Threshold: %d\n", upThres, downThres); + + int lastValue = GraphBuffer[0]; + GraphBuffer[0] = 0; // Will be changed at the end, but init 0 as we adjust to last samples value if no threshold kicks in. + + for (int i = 1; i < GraphTraceLen; ++i) { + // Apply first threshold to samples heading up + if (GraphBuffer[i] >= upThres && GraphBuffer[i] > lastValue) + { + lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it. + GraphBuffer[i] = 1; + } + // Apply second threshold to samples heading down + else if (GraphBuffer[i] <= downThres && GraphBuffer[i] < lastValue) + { + lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it. + GraphBuffer[i] = -1; + } + else + { + lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it. + GraphBuffer[i] = GraphBuffer[i-1]; + + } } + GraphBuffer[0] = GraphBuffer[1]; // Aline with first edited sample. RepaintGraphWindow(); return 0; } @@ -854,7 +886,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, {"amp", CmdAmp, 1, "Amplify peaks"}, - {"askdemod", Cmdaskdemod, 1, "<0|1> -- Attempt to demodulate simple ASK tags"}, + {"askdemod", Cmdaskdemod, 1, "<0 or 1> -- Attempt to demodulate simple ASK tags"}, {"autocorr", CmdAutoCorr, 1, " -- Autocorrelation over window"}, {"bitsamples", CmdBitsamples, 0, "Get raw samples as bitstring"}, {"bitstream", CmdBitstream, 1, "[clock rate] -- Convert waveform into a bitstream"}, @@ -877,6 +909,7 @@ static command_t CommandTable[] = {"scale", CmdScale, 1, " -- Set cursor display scale"}, {"threshold", CmdThreshold, 1, " -- Maximize/minimize every value in the graph window depending on threshold"}, {"zerocrossings", CmdZerocrossings, 1, "Count time between zero-crossings"}, + {"dirthreshold", CmdDirectionalThreshold, 1, " -- Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev."}, {NULL, NULL, 0, NULL} };