From 7a8a982bde66f752d8aa28423d70487d04f7572c Mon Sep 17 00:00:00 2001
From: marshmellow42 <marshmellowrf@gmail.com>
Date: Fri, 13 Mar 2015 20:49:34 -0400
Subject: [PATCH] adjust pskdemod

add skipped bits before first phase back in
PSKDemod now returns 1 for success or 0 for fail like other demods
---
 client/cmddata.c | 54 +++++++++++++++++++++---------------------------
 common/lfdemod.c |  9 ++++++--
 2 files changed, 31 insertions(+), 32 deletions(-)

diff --git a/client/cmddata.c b/client/cmddata.c
index e96fb517..356bfab3 100644
--- a/client/cmddata.c
+++ b/client/cmddata.c
@@ -1700,7 +1700,7 @@ int PSKDemod(const char *Cmd, bool verbose)
   }
   if (invert != 0 && invert != 1) {
     if (verbose) PrintAndLog("Invalid argument: %s", Cmd);
-    return -1;
+    return 0;
   }
   uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
   size_t BitLen = getFromGraphBuf(BitStream);
@@ -1708,22 +1708,27 @@ int PSKDemod(const char *Cmd, bool verbose)
   uint8_t carrier=countPSK_FC(BitStream, BitLen);
   if (carrier!=2 && carrier!=4 && carrier!=8){
     //invalid carrier
-    return -1;
+    return 0;
   }
   int errCnt=0;
   errCnt = pskRawDemod(BitStream, &BitLen, &clk, &invert);
   if (errCnt > maxErr){
     if (g_debugMode==1 && verbose) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
-    return -1;
+    return 0;
   } 
   if (errCnt<0|| BitLen<16){  //throw away static - allow 1 and -1 (in case of threshold command first)
     if (g_debugMode==1 && verbose) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
-    return -1;
+    return 0;
+  }
+  if (verbose){
+    PrintAndLog("Tried PSK Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
+    if (errCnt>0){
+      PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
+    }
   }
-  if (verbose) PrintAndLog("Tried PSK Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
   //prime demod buffer for output
   setDemodBuf(BitStream,BitLen,0);
-  return errCnt;
+  return 1;
 }
 
 // Indala 26 bit decode
@@ -1738,7 +1743,7 @@ int CmdIndalaDecode(const char *Cmd)
 		ans = PSKDemod("32", 0);
 	}
 
-	if (ans < 0){
+	if (!ans){
 		if (g_debugMode==1) 
 			PrintAndLog("Error1: %d",ans);
 		return 0;
@@ -1879,7 +1884,7 @@ int CmdNRZrawDemod(const char *Cmd)
 // prints binary found and saves in demodbuffer for further commands
 int CmdPSK1rawDemod(const char *Cmd)
 {
-  int errCnt;
+  int ans;
   char cmdp = param_getchar(Cmd, 0);
   if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
     PrintAndLog("Usage:  data rawdemod p1 [clock] <0|1> [maxError]");
@@ -1894,15 +1899,13 @@ int CmdPSK1rawDemod(const char *Cmd)
     PrintAndLog("          : data rawdemod p1 64 1 0 = demod a psk1 tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors");
     return 0;
   }
-  errCnt = PSKDemod(Cmd, TRUE);
+  ans = PSKDemod(Cmd, TRUE);
   //output
-  if (errCnt<0){
-    if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt); 
+  if (!ans){
+    if (g_debugMode) PrintAndLog("Error demoding: %d",ans); 
     return 0;
   }
-  if (errCnt>0){
-    PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
-  }
+ 
   PrintAndLog("PSK demoded bitstream:");
   // Now output the bitstream to the scrollback by line of 16 bits
   printDemodBuff();
@@ -1913,7 +1916,7 @@ int CmdPSK1rawDemod(const char *Cmd)
 // takes same args as cmdpsk1rawdemod
 int CmdPSK2rawDemod(const char *Cmd)
 {
-  int errCnt=0;
+  int ans=0;
   char cmdp = param_getchar(Cmd, 0);
   if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
     PrintAndLog("Usage:  data rawdemod p2 [clock] <0|1> [maxError]");
@@ -1928,24 +1931,15 @@ int CmdPSK2rawDemod(const char *Cmd)
     PrintAndLog("          : data rawdemod p2 64 1 0  = demod a psk2 tag from GraphBuffer using a clock of RF/64, inverting output and allowing 0 demod errors");
     return 0;
   }
-  errCnt=PSKDemod(Cmd, TRUE);
-  if (errCnt<0){
-    if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt);  
+  ans=PSKDemod(Cmd, TRUE);
+  if (!ans){
+    if (g_debugMode) PrintAndLog("Error demoding: %d",ans);  
     return 0;
   } 
   psk1TOpsk2(DemodBuffer, DemodBufferLen);
-  if (errCnt>0){
-    if (g_debugMode){
-      PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
-      PrintAndLog("PSK2 demoded bitstream:");
-      // Now output the bitstream to the scrollback by line of 16 bits
-      printDemodBuff();
-    }
-  }else{
-    PrintAndLog("PSK2 demoded bitstream:");
-    // Now output the bitstream to the scrollback by line of 16 bits
-    printDemodBuff();  
-  }
+  PrintAndLog("PSK2 demoded bitstream:");
+  // Now output the bitstream to the scrollback by line of 16 bits
+  printDemodBuff();  
   return 1;
 }
 
diff --git a/common/lfdemod.c b/common/lfdemod.c
index db945d0a..0a81c6b8 100644
--- a/common/lfdemod.c
+++ b/common/lfdemod.c
@@ -1079,7 +1079,9 @@ void psk1TOpsk2(uint8_t *BitStream, size_t size)
 	size_t i=1;
 	uint8_t lastBit=BitStream[0];
 	for (; i<size; i++){
-		if (lastBit!=BitStream[i]){
+		if (BitStream[i]==77){
+			//ignore errors
+		} else if (lastBit!=BitStream[i]){
 			lastBit=BitStream[i];
 			BitStream[i]=1;
 		} else {
@@ -1619,10 +1621,13 @@ int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert)
   }
   //PrintAndLog("DEBUG: firstFullWave: %d, waveLen: %d",firstFullWave,fullWaveLen);  
   lastClkBit = firstFullWave; //set start of wave as clock align
+  //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d", *clock, lastClkBit);
   waveStart = 0;
   errCnt=0;
   size_t numBits=0;
-  //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d", *clock, lastClkBit);
+  //set skipped bits
+  memset(dest+numBits,curPhase^1,firstFullWave / *clock);
+  numBits += (firstFullWave / *clock);
   dest[numBits++] = curPhase; //set first read bit
   for (i = firstFullWave+fullWaveLen-1; i < *size-3; i++){
     //top edge of wave = start of new wave 
-- 
2.39.5