X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/f3bf15e4844454338fe42d5e93b897c7a61824a6..acaeccf841f65291f5687824cb5322cc661e8183:/client/graph.c diff --git a/client/graph.c b/client/graph.c index 11dbc4d5..ae318ddf 100644 --- a/client/graph.c +++ b/client/graph.c @@ -17,17 +17,16 @@ int GraphBuffer[MAX_GRAPH_TRACE_LEN]; int GraphTraceLen; - -/* write a bit to the graph */ +/* write a manchester bit to the graph */ void AppendGraph(int redraw, int clock, int bit) { int i; - + //set first half the clock bit (all 1's or 0's for a 0 or 1 bit) for (i = 0; i < (int)(clock / 2); ++i) - GraphBuffer[GraphTraceLen++] = bit ^ 1; - + GraphBuffer[GraphTraceLen++] = bit ; + //set second half of the clock bit (all 0's or 1's for a 0 or 1 bit) for (i = (int)(clock / 2); i < clock; ++i) - GraphBuffer[GraphTraceLen++] = bit; + GraphBuffer[GraphTraceLen++] = bit ^ 1; if (redraw) RepaintGraphWindow(); @@ -46,6 +45,23 @@ int ClearGraph(int redraw) return gtl; } +// option '1' to save GraphBuffer any other to restore +void save_restoreGB(uint8_t saveOpt) +{ + static int SavedGB[MAX_GRAPH_TRACE_LEN]; + static int SavedGBlen; + static bool GB_Saved = false; + + if (saveOpt==1) { //save + memcpy(SavedGB,GraphBuffer, sizeof(GraphBuffer)); + SavedGBlen = GraphTraceLen; + GB_Saved=true; + } else if (GB_Saved){ + memcpy(GraphBuffer,SavedGB, sizeof(GraphBuffer)); + GraphTraceLen = SavedGBlen; + } + return; +} // DETECT CLOCK NOW IN LFDEMOD.C @@ -134,6 +150,26 @@ int GetAskClock(const char str[], bool printAns, bool verbose) return clock; } +uint8_t GetPskCarrier(const char str[], bool printAns, bool verbose) +{ + uint8_t carrier=0; + uint8_t grph[MAX_GRAPH_TRACE_LEN]={0}; + size_t size = getFromGraphBuf(grph); + if ( size == 0 ) { + if (verbose) + PrintAndLog("Failed to copy from graphbuffer"); + return 0; + } + //uint8_t countPSK_FC(uint8_t *BitStream, size_t size) + + carrier = countFC(grph,size,0); + // Only print this message if we're not looping something + if (printAns){ + PrintAndLog("Auto-detected PSK carrier rate: %d", carrier); + } + return carrier; +} + int GetPskClock(const char str[], bool printAns, bool verbose) { int clock; @@ -193,31 +229,37 @@ uint8_t GetFskClock(const char str[], bool printAns, bool verbose) clock = 0; if (clock != 0) return (uint8_t)clock; + + uint8_t fc1=0, fc2=0, rf1=0; + uint8_t ans = fskClocks(&fc1, &fc2, &rf1, verbose); + if (ans == 0) return 0; + if ((fc1==10 && fc2==8) || (fc1==8 && fc2==5)){ + if (printAns) PrintAndLog("Detected Field Clocks: FC/%d, FC/%d - Bit Clock: RF/%d", fc1, fc2, rf1); + return rf1; + } + if (verbose){ + PrintAndLog("DEBUG: unknown fsk field clock detected"); + PrintAndLog("Detected Field Clocks: FC/%d, FC/%d - Bit Clock: RF/%d", fc1, fc2, rf1); + } + return 0; +} +uint8_t fskClocks(uint8_t *fc1, uint8_t *fc2, uint8_t *rf1, bool verbose) +{ uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; size_t size = getFromGraphBuf(BitStream); if (size==0) return 0; - uint8_t dummy = 0; - uint16_t ans = countFC(BitStream, size, &dummy); + uint16_t ans = countFC(BitStream, size, 1); if (ans==0) { if (verbose) PrintAndLog("DEBUG: No data found"); return 0; } - uint8_t fc1, fc2; - fc1 = (ans >> 8) & 0xFF; - fc2 = ans & 0xFF; + *fc1 = (ans >> 8) & 0xFF; + *fc2 = ans & 0xFF; - uint8_t rf1 = detectFSKClk(BitStream, size, fc1, fc2); - if (rf1==0) { + *rf1 = detectFSKClk(BitStream, size, *fc1, *fc2); + if (*rf1==0) { if (verbose) PrintAndLog("DEBUG: Clock detect error"); return 0; } - if ((fc1==10 && fc2==8) || (fc1==8 && fc2==5)){ - if (printAns) PrintAndLog("Detected Field Clocks: FC/%d, FC/%d - Bit Clock: RF/%d", fc1, fc2, rf1); - return rf1; - } - if (verbose){ - PrintAndLog("DEBUG: unknown fsk field clock detected"); - PrintAndLog("Detected Field Clocks: FC/%d, FC/%d - Bit Clock: RF/%d", fc1, fc2, rf1); - } - return 0; + return 1; }