]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
New LF edge detection algorithm + lowpass filter
[proxmark3-svn] / client / cmddata.c
index a333fe39b88468d7191aaa4f982e8567a86077a2..fa54d01a69387897b5498ccd8e43270e46a50dbf 100644 (file)
@@ -17,6 +17,7 @@
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
+#include "util.h"
 #include "cmdmain.h"
 #include "cmddata.h"
 
@@ -393,46 +394,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, <bytes> + <offset> > 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;
 }
@@ -815,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;
 }
@@ -854,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, "<window length> -- Autocorrelation over window"},
   {"bitsamples",    CmdBitsamples,      0, "Get raw samples as bitstring"},
   {"bitstream",     CmdBitstream,       1, "[clock rate] -- Convert waveform into a bitstream"},
@@ -877,6 +910,7 @@ static command_t CommandTable[] =
   {"scale",         CmdScale,           1, "<int> -- Set cursor display scale"},
   {"threshold",     CmdThreshold,       1, "<threshold> -- Maximize/minimize every value in the graph window depending on threshold"},
   {"zerocrossings", CmdZerocrossings,   1, "Count time between zero-crossings"},
+  {"dirthreshold",  CmdDirectionalThreshold,   1, "<thres up> <thres down> -- Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev."},
   {NULL, NULL, 0, NULL}
 };
 
Impressum, Datenschutz