X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/8d183c53b6f6d65593c06d4d40a0c5641798aaf9..1604d0a2909a6ae1a5b615d280671d867c1028a4:/client/cmddata.c diff --git a/client/cmddata.c b/client/cmddata.c index 71ef6752..fa54d01a 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -1,12 +1,23 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Data and Graph commands +//----------------------------------------------------------------------------- + #include #include #include #include -#include "proxusb.h" +#include "proxmark3.h" #include "data.h" #include "ui.h" #include "graph.h" #include "cmdparser.h" +#include "util.h" #include "cmdmain.h" #include "cmddata.h" @@ -143,22 +154,19 @@ int CmdAutoCorr(const char *Cmd) int CmdBitsamples(const char *Cmd) { int cnt = 0; - int n = 3072; - - for (int i = 0; i < n; i += 12) { - UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}}; - SendCommand(&c); - WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K); + uint8_t got[12288]; + + GetFromBigBuf(got,sizeof(got),0); + WaitForResponse(CMD_ACK,NULL); - for (int j = 0; j < 48; j++) { + for (int j = 0; j < sizeof(got); j++) { for (int k = 0; k < 8; k++) { - if(sample_buf[j] & (1 << (7 - k))) { + if(got[j] & (1 << (7 - k))) { GraphBuffer[cnt++] = 1; } else { GraphBuffer[cnt++] = 0; } } - } } GraphTraceLen = cnt; RepaintGraphWindow(); @@ -378,53 +386,51 @@ int CmdFSKdemod(const char *Cmd) int CmdGrid(const char *Cmd) { sscanf(Cmd, "%i %i", &PlotGridX, &PlotGridY); + PlotGridXdefault= PlotGridX; + PlotGridYdefault= PlotGridY; RepaintGraphWindow(); return 0; } int CmdHexsamples(const char *Cmd) { - int n; + int i, j; int requested = 0; int offset = 0; + char string_buf[25]; + char* string_ptr = string_buf; + uint8_t got[40000]; + sscanf(Cmd, "%i %i", &requested, &offset); - if (offset % 4 != 0) { - PrintAndLog("Offset must be a multiple of 4"); - return 0; - } - offset = offset/4; - - int delivered = 0; + /* if no args send something */ if (requested == 0) { - n = 12; - requested = 12; - } else { - n = requested/4; - } - - for (int i = offset; i < n+offset; i += 12) { - UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}}; - SendCommand(&c); - WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K); - for (int j = 0; j < 48; 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], - sample_buf[j+8] - ); - delivered += 8; - if (delivered >= requested) - break; + requested = 8; + } + if (offset + requested > sizeof(got)) { + PrintAndLog("Tried to read past end of buffer, + > 40000"); + return 0; + } + + GetFromBigBuf(got,requested,offset); + WaitForResponse(CMD_ACK,NULL); + + 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 (delivered >= requested) - break; + 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; } @@ -454,22 +460,21 @@ int CmdSamples(const char *Cmd) { int cnt = 0; int n; + uint8_t got[40000]; n = strtol(Cmd, NULL, 0); - if (n == 0) n = 128; - if (n > 16000) n = 16000; - + if (n == 0) n = 512; + if (n > sizeof(got)) n = sizeof(got); + PrintAndLog("Reading %d samples\n", n); - for (int i = 0; i < n; i += 12) { - UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}}; - SendCommand(&c); - WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K); - for (int j = 0; j < 48; j++) { - GraphBuffer[cnt++] = ((int)sample_buf[j]) - 128; - } + 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*4; + GraphTraceLen = n; RepaintGraphWindow(); return 0; } @@ -524,7 +529,7 @@ int CmdManchesterDemod(const char *Cmd) int i, j, invert= 0; int bit; int clock; - int lastval; + int lastval = 0; int low = 0; int high = 0; int hithigh, hitlow, first; @@ -538,6 +543,7 @@ int CmdManchesterDemod(const char *Cmd) { PrintAndLog("Inverting output"); invert = 1; + ++Cmd; do ++Cmd; while(*Cmd == ' '); // in case a 2nd argument was given @@ -550,7 +556,7 @@ int CmdManchesterDemod(const char *Cmd) /* But it does not work if compiling on WIndows: therefore we just allocate a */ /* large array */ - int BitStream[MAX_GRAPH_TRACE_LEN]; + uint8_t BitStream[MAX_GRAPH_TRACE_LEN]; /* Detect high and lows */ for (i = 0; i < GraphTraceLen; i++) @@ -807,8 +813,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; } @@ -846,7 +887,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"}, @@ -855,20 +896,21 @@ static command_t CommandTable[] = {"detectclock", CmdDetectClockRate, 1, "Detect clock rate"}, {"fskdemod", CmdFSKdemod, 1, "Demodulate graph window as a HID FSK"}, {"grid", CmdGrid, 1, " -- overlay grid on graph window, use zero value to turn off either"}, - {"hexsamples", CmdHexsamples, 0, " [] -- Dump big buffer as hex bytes"}, + {"hexsamples", CmdHexsamples, 0, " [] -- Dump big buffer as hex bytes"}, {"hide", CmdHide, 1, "Hide graph window"}, {"hpf", CmdHpf, 1, "Remove DC offset from trace"}, - {"samples", CmdSamples, 0, "[128 - 16000] -- Get raw samples for graph window"}, {"load", CmdLoad, 1, " -- Load trace (to graph window"}, {"ltrim", CmdLtrim, 1, " -- Trim samples from left of trace"}, {"mandemod", CmdManchesterDemod, 1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)"}, {"manmod", CmdManchesterMod, 1, "[clock rate] -- Manchester modulate a binary stream"}, {"norm", CmdNorm, 1, "Normalize max/min to +/-500"}, - {"plot", CmdPlot, 1, "Show graph window"}, + {"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"}, + {"samples", CmdSamples, 0, "[512 - 40000] -- Get raw samples for graph window"}, {"save", CmdSave, 1, " -- Save trace (from graph window)"}, {"scale", CmdScale, 1, " -- Set cursor display scale"}, - {"threshold", CmdThreshold, 1, "Maximize/minimize every value in the graph window depending on threshold"}, + {"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} };