]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/graph.c
Merge remote-tracking branch 'upstream/master'
[proxmark3-svn] / client / graph.c
index 174e4a5fe6abc71a2173faaf849088b4bcfae1de..95050f558c169078e96a4d7aaad1a91e7419869b 100644 (file)
@@ -9,6 +9,7 @@
 //-----------------------------------------------------------------------------
 
 #include <stdio.h>
+#include <stdbool.h>
 #include <string.h>
 #include "ui.h"
 #include "graph.h"
@@ -50,7 +51,11 @@ int ClearGraph(int redraw)
 
 void setGraphBuf(uint8_t *buff, size_t size)
 {
-  int i=0;
+       if ( buff == NULL ) return;
+       
+       uint16_t i = 0;  
+       if ( size > MAX_GRAPH_TRACE_LEN )
+               size = MAX_GRAPH_TRACE_LEN;
   ClearGraph(0);
   for (; i < size; ++i){
                GraphBuffer[i]=buff[i]-128;
@@ -61,6 +66,8 @@ void setGraphBuf(uint8_t *buff, size_t size)
 }
 size_t getFromGraphBuf(uint8_t *buff)
 {
+       if ( buff == NULL ) return 0;
+       
   uint32_t i;
   for (i=0;i<GraphTraceLen;++i){
     if (GraphBuffer[i]>127) GraphBuffer[i]=127; //trim
@@ -74,24 +81,59 @@ size_t getFromGraphBuf(uint8_t *buff)
 // 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;
+       int clock;
+       sscanf(str, "%i", &clock);
+       if (!strcmp(str, ""))
+               clock = 0;
 
        // Auto-detect clock
-  if (!clock)
-  {
-    uint8_t grph[MAX_GRAPH_TRACE_LEN]={0};
+       if (!clock)
+       {
+               uint8_t grph[MAX_GRAPH_TRACE_LEN]={0};
                size_t size = getFromGraphBuf(grph);
-    clock = DetectASKClock(grph,size,0);
+               if ( size == 0 ) {
+                       PrintAndLog("Failed to copy from graphbuffer");
+                       return -1;
+               }
+               clock = DetectASKClock(grph,size,0);
                // Only print this message if we're not looping something
-    if (!verbose){
-      PrintAndLog("Auto-detected clock rate: %d", clock);
-    }
-  }
+               if (!verbose){
+                       PrintAndLog("Auto-detected clock rate: %d", clock);
+               }
+       }
+       return clock;
+}
+
+// A simple test to see if there is any data inside Graphbuffer. 
+bool HasGraphData(){
 
-  return clock;
+       if ( GraphTraceLen <= 0) {
+               PrintAndLog("No data available, try reading something first");
+               return false;
+       }
+       return true;    
+}
+
+// Detect high and lows in Grapbuffer.
+// Only loops the first 256 values. 
+void DetectHighLowInGraph(int *high, int *low, bool addFuzz) {
+
+       uint8_t loopMax = 255;
+       if ( loopMax > GraphTraceLen)
+               loopMax = GraphTraceLen;
+  
+       for (uint8_t i = 0; i < loopMax; ++i) {
+               if (GraphBuffer[i] > *high)
+                       *high = GraphBuffer[i];
+               else if (GraphBuffer[i] < *low)
+                       *low = GraphBuffer[i];
+       }
+       
+       //12% fuzz in case highs and lows aren't clipped
+       if (addFuzz) {
+               *high = (int)(*high * .88);
+               *low  = (int)(*low  * .88);
+       }
 }
 
 int GetNRZpskClock(const char *str, int peak, int verbose)
@@ -106,6 +148,10 @@ int GetNRZpskClock(const char *str, int peak, int verbose)
        {
                uint8_t grph[MAX_GRAPH_TRACE_LEN]={0};
                size_t size = getFromGraphBuf(grph);
+               if ( size == 0 ) {
+                       PrintAndLog("Failed to copy from graphbuffer");
+                       return -1;
+               }
                clock = DetectpskNRZClock(grph,size,0);
                // Only print this message if we're not looping something
                if (!verbose){
Impressum, Datenschutz