X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/6982ac2612c12af9fa65437bf4279007d734cc59..7fe9b0b742d7dae9c5af1d292d11840b5c3cbfae:/client/graph.c diff --git a/client/graph.c b/client/graph.c new file mode 100644 index 00000000..4a966676 --- /dev/null +++ b/client/graph.c @@ -0,0 +1,85 @@ +#include +#include +#include "ui.h" +#include "graph.h" + +int GraphBuffer[MAX_GRAPH_TRACE_LEN]; +int GraphTraceLen; + +/* write a bit to the graph */ +void AppendGraph(int redraw, int clock, int bit) +{ + int i; + + for (i = 0; i < (int)(clock / 2); ++i) + GraphBuffer[GraphTraceLen++] = bit ^ 1; + + for (i = (int)(clock / 2); i < clock; ++i) + GraphBuffer[GraphTraceLen++] = bit; + + if (redraw) + RepaintGraphWindow(); +} + +/* clear out our graph window */ +int ClearGraph(int redraw) +{ + int gtl = GraphTraceLen; + GraphTraceLen = 0; + + if (redraw) + RepaintGraphWindow(); + + return gtl; +} + +/* + * Detect clock rate + */ +int DetectClock(int peak) +{ + int i; + int clock = 0xFFFF; + int lastpeak = 0; + + /* Detect peak if we don't have one */ + if (!peak) + for (i = 0; i < GraphTraceLen; ++i) + if (GraphBuffer[i] > peak) + peak = GraphBuffer[i]; + + for (i = 1; i < GraphTraceLen; ++i) + { + /* If this is the beginning of a peak */ + if (GraphBuffer[i - 1] != GraphBuffer[i] && GraphBuffer[i] == peak) + { + /* Find lowest difference between peaks */ + if (lastpeak && i - lastpeak < clock) + clock = i - lastpeak; + lastpeak = i; + } + } + + return clock; +} + +/* Get or auto-detect clock rate */ +int GetClock(const char *str, int peak, int verbose) +{ + int clock; + + sscanf(str, "%i", &clock); + if (!strcmp(str, "")) + clock = 0; + + /* Auto-detect clock */ + if (!clock) + { + clock = DetectClock(peak); + /* Only print this message if we're not looping something */ + if (!verbose) + PrintAndLog("Auto-detected clock rate: %d", clock); + } + + return clock; +}