]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
apply @holiman s graph changes +
[proxmark3-svn] / client / cmddata.c
index 2f508efcc5744fb6da8f1c3f1c91ed95742ebf7f..7a411324de4c0a9384e62942c2eaa7c6c7708d7a 100644 (file)
@@ -28,8 +28,8 @@
 uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
 uint8_t g_debugMode=0;
 size_t DemodBufferLen=0;
-//size_t g_demodStartIdx=0;
-//uint8_t g_demodClock=0;
+int g_DemodStartIdx=0;
+int g_DemodClock=0;
 
 static int CmdHelp(const char *Cmd);
 
@@ -40,8 +40,8 @@ void setDemodBuf(uint8_t *buff, size_t size, size_t startIdx)
        if (buff == NULL) 
                return;
 
-       if ( size + startIdx >= MAX_DEMOD_BUF_LEN)
-               size = MAX_DEMOD_BUF_LEN;
+       if ( size > MAX_DEMOD_BUF_LEN - startIdx)
+               size = MAX_DEMOD_BUF_LEN - startIdx;
 
        size_t i = 0;
        for (; i < size; i++){
@@ -223,7 +223,7 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType,
        }
        bool st = false;
        size_t ststart = 0, stend = 0;
-       if (*stCheck) st = DetectST_ext(BitStream, &BitLen, &foundclk, &ststart, &stend);
+       if (*stCheck) st = DetectST(BitStream, &BitLen, &foundclk, &ststart, &stend);
        *stCheck = st;
        if (st) {
                clk = (clk == 0) ? foundclk : clk;
@@ -236,7 +236,8 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType,
                //}
                //RepaintGraphWindow();
        }
-       int errCnt = askdemod(BitStream, &BitLen, &clk, &invert, maxErr, askamp, askType);
+       int startIdx = 0;
+       int errCnt = askdemod_ext(BitStream, &BitLen, &clk, &invert, maxErr, askamp, askType, &startIdx);
        if (errCnt<0 || BitLen<16){  //if fatal error (or -1)
                if (g_debugMode) PrintAndLog("DEBUG: no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk);
                return 0;
@@ -246,9 +247,10 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType,
                return 0;
        }
        if (verbose || g_debugMode) PrintAndLog("\nUsing Clock:%d, Invert:%d, Bits Found:%d",clk,invert,BitLen);
-
        //output
        setDemodBuf(BitStream,BitLen,0);
+       setClockGrid(clk, startIdx);
+
        if (verbose || g_debugMode){
                if (errCnt>0) PrintAndLog("# Errors during Demoding (shown as 7 in bit stream): %d",errCnt);
                if (askType) PrintAndLog("ASK/Manchester - Clock: %d - Decoded bitstream:",clk);
@@ -294,11 +296,11 @@ int Cmdaskmandemod(const char *Cmd)
        }
        bool st = true;
        if (Cmd[0]=='s') 
-               return ASKDemod_ext(Cmd++, true, true, 1, &st);
+               return ASKDemod_ext(Cmd++, true, false, 1, &st);
        else if (Cmd[1] == 's')
-               return ASKDemod_ext(Cmd+=2, true, true, 1, &st);
+               return ASKDemod_ext(Cmd+=2, true, false, 1, &st);
        else
-               return ASKDemod(Cmd, true, true, 1);
+               return ASKDemod(Cmd, true, false, 1);
 }
 
 //by marshmellow
@@ -787,13 +789,16 @@ int FSKrawDemod(const char *Cmd, bool verbose)
        }
        //get bit clock length
        if (!rfLen) {
-               rfLen = detectFSKClk(BitStream, BitLen, fchigh, fclow);
+               int firstClockEdge = 0; //todo - align grid on graph with this...
+               rfLen = detectFSKClk(BitStream, BitLen, fchigh, fclow, &firstClockEdge);
                if (!rfLen) rfLen = 50;
        }
-       int size = fskdemod(BitStream, BitLen, rfLen, invert, fchigh, fclow);
+       int startIdx = 0;
+       int size = fskdemod_ext(BitStream, BitLen, rfLen, invert, fchigh, fclow, &startIdx);
        if (size > 0) {
                setDemodBuf(BitStream,size,0);
-
+               setClockGrid(rfLen, startIdx);
+       
                // Now output the bitstream to the scrollback by line of 16 bits
                if (verbose || g_debugMode) {
                        PrintAndLog("\nUsing Clock:%u, invert:%u, fchigh:%u, fclow:%u", (unsigned int)rfLen, (unsigned int)invert, (unsigned int)fchigh, (unsigned int)fclow);
@@ -854,7 +859,8 @@ int PSKDemod(const char *Cmd, bool verbose)
        size_t BitLen = getFromGraphBuf(BitStream);
        if (BitLen==0) return 0;
        int errCnt=0;
-       errCnt = pskRawDemod(BitStream, &BitLen, &clk, &invert);
+       int startIdx = 0;
+       errCnt = pskRawDemod_ext(BitStream, &BitLen, &clk, &invert, &startIdx);
        if (errCnt > maxErr){
                if (g_debugMode || verbose) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
                return 0;
@@ -871,6 +877,8 @@ int PSKDemod(const char *Cmd, bool verbose)
        }
        //prime demod buffer for output
        setDemodBuf(BitStream,BitLen,0);
+       setClockGrid(clk, startIdx);
+
        return 1;
 }
 
@@ -909,6 +917,8 @@ int NRZrawDemod(const char *Cmd, bool verbose)
        if (verbose || g_debugMode) PrintAndLog("Tried NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
        //prime demod buffer for output
        setDemodBuf(BitStream,BitLen,0);
+       setClockGrid(clk, clkStartIdx);
+
 
        if (errCnt>0 && (verbose || g_debugMode)) PrintAndLog("# Errors during Demoding (shown as 7 in bit stream): %d",errCnt);
        if (verbose || g_debugMode) {
@@ -1047,6 +1057,29 @@ int CmdRawDemod(const char *Cmd)
        return ans;
 }
 
+void setClockGrid(int clk, int offset) {
+       g_DemodStartIdx = offset;
+       g_DemodClock = clk;
+       PrintAndLog("demodoffset %d, clk %d",offset,clk);
+       if (offset > clk) offset %= clk;
+       if (offset < 0) offset += clk;
+
+       if (offset > GraphTraceLen || offset < 0) return;
+       if (clk < 8 || clk > GraphTraceLen) {
+               GridLocked = false;
+               GridOffset = 0;
+               PlotGridX = 0;
+               PlotGridXdefault = 0;
+               RepaintGraphWindow();
+       } else {
+               GridLocked = true;
+               GridOffset = offset;
+               PlotGridX = clk;
+               PlotGridXdefault = clk;
+               RepaintGraphWindow();
+       }
+}
+
 int CmdGrid(const char *Cmd)
 {
        sscanf(Cmd, "%i %i", &PlotGridX, &PlotGridY);
@@ -1184,6 +1217,7 @@ int getSamples(int n, bool silent)
                GraphTraceLen = n;
        }
 
+       setClockGrid(0,0);
        RepaintGraphWindow();
        return 0;
 }
@@ -1287,6 +1321,7 @@ int CmdLoad(const char *Cmd)
        }
        fclose(f);
        PrintAndLog("loaded %d samples", GraphTraceLen);
+       setClockGrid(0,0);
        RepaintGraphWindow();
        return 0;
 }
@@ -1561,7 +1596,6 @@ static command_t CommandTable[] =
        {"buffclear",       CmdBuffClear,       1, "Clear sample buffer and graph window"},
        {"dec",             CmdDec,             1, "Decimate samples"},
        {"detectclock",     CmdDetectClockRate, 1, "[modulation] Detect clock rate of wave in GraphBuffer (options: 'a','f','n','p' for ask, fsk, nrz, psk respectively)"},
-       //{"fskfcdetect",   CmdFSKfcDetect,     1, "Try to detect the Field Clock of an FSK wave"},
        {"getbitstream",    CmdGetBitStream,    1, "Convert GraphBuffer's >=1 values to 1 and <1 to 0"},
        {"grid",            CmdGrid,            1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},
        {"hexsamples",      CmdHexsamples,      0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},
Impressum, Datenschutz