From 3fd7fce4accbe4c5b59987fa4979ec46adcb459c Mon Sep 17 00:00:00 2001
From: marshmellow42 <marshmellowrf@gmail.com>
Date: Mon, 17 Apr 2017 18:37:23 -0400
Subject: [PATCH 1/1] new grid X offset calcs to fix some issues

also fixed a save_restore issue with grid alignments
now save_restoreGB() saves/restores offset values
added macro enumeration of SAVE vs RESTORE for save_restore commands.
---
 client/cmddata.c     |  4 +--
 client/cmdlf.c       | 18 ++++++------
 client/cmdlfem4x.c   |  6 ++--
 client/cmdlft55xx.c  | 12 ++++----
 client/graph.c       |  9 ++++--
 client/graph.h       |  2 ++
 client/proxgui.h     |  2 ++
 client/proxguiqt.cpp | 65 ++++++++++++++------------------------------
 8 files changed, 51 insertions(+), 67 deletions(-)

diff --git a/client/cmddata.c b/client/cmddata.c
index 87c54231..c12c2ce6 100644
--- a/client/cmddata.c
+++ b/client/cmddata.c
@@ -71,7 +71,7 @@ void save_restoreDB(uint8_t saveOpt)
 	static int savedDemodStartIdx = 0;
 	static int savedDemodClock = 0;
 
-	if (saveOpt==1) { //save
+	if (saveOpt == GRAPH_SAVE) { //save
 
 		memcpy(SavedDB, DemodBuffer, sizeof(DemodBuffer));
 		SavedDBlen = DemodBufferLen;
@@ -1077,7 +1077,7 @@ void setClockGrid(int clk, int offset) {
 	g_DemodClock = clk;
 	if (g_debugMode) PrintAndLog("demodoffset %d, clk %d",offset,clk);
 
-  if (offset > clk) offset %= clk;
+	if (offset > clk) offset %= clk;
 	if (offset < 0) offset += clk;
 
 	if (offset > GraphTraceLen || offset < 0) return;
diff --git a/client/cmdlf.c b/client/cmdlf.c
index b18cf215..49c9ea39 100644
--- a/client/cmdlf.c
+++ b/client/cmdlf.c
@@ -879,25 +879,25 @@ int CheckChipType(char cmdp) {
 
 	if (offline || cmdp == '1') return 0;
 
-	save_restoreGB(1);
-	save_restoreDB(1);
+	save_restoreGB(GRAPH_SAVE);
+	save_restoreDB(GRAPH_SAVE);
 	//check for em4x05/em4x69 chips first
 	if (EM4x05Block0Test(&wordData)) {
 		PrintAndLog("\nValid EM4x05/EM4x69 Chip Found\nTry lf em 4x05... commands\n");
-		save_restoreGB(0);
-		save_restoreDB(0);
+		save_restoreGB(GRAPH_RESTORE);
+		save_restoreDB(GRAPH_RESTORE);
 		return 1;
 	}
 
 	//check for t55xx chip...
 	if (tryDetectP1(true)) {
 		PrintAndLog("\nValid T55xx Chip Found\nTry lf t55xx ... commands\n");
-		save_restoreGB(0);
-		save_restoreDB(0);
+		save_restoreGB(GRAPH_RESTORE);
+		save_restoreDB(GRAPH_RESTORE);
 		return 1;		
 	}
-	save_restoreGB(0);
-	save_restoreDB(0);
+	save_restoreGB(GRAPH_RESTORE);
+	save_restoreDB(GRAPH_RESTORE);
 	return 0;
 }
 
@@ -1057,7 +1057,7 @@ int CmdLFfind(const char *Cmd)
 
 	PrintAndLog("\nNo Known Tags Found!\n");
 	if (testRaw=='u' || testRaw=='U') {
-		ans=CheckChipType(cmdp);
+		//ans=CheckChipType(cmdp);
 		//test unknown tag formats (raw mode)0
 		PrintAndLog("\nChecking for Unknown tags:\n");
 		ans=AutoCorrelate(GraphBuffer, GraphBuffer, GraphTraceLen, 4000, false, false);
diff --git a/client/cmdlfem4x.c b/client/cmdlfem4x.c
index 4e0ada57..e84cccf9 100644
--- a/client/cmdlfem4x.c
+++ b/client/cmdlfem4x.c
@@ -571,7 +571,7 @@ int EM4x50Read(const char *Cmd, bool verbose)
 	start = skip;
 	snprintf(tmp2, sizeof(tmp2),"%d %d 1000 %d", clk, invert, clk*47);
 	// save GraphBuffer - to restore it later	
-	save_restoreGB(1);
+	save_restoreGB(GRAPH_SAVE);
 	// get rid of leading crap 
 	snprintf(tmp, sizeof(tmp), "%i", skip);
 	CmdLtrim(tmp);
@@ -599,7 +599,7 @@ int EM4x50Read(const char *Cmd, bool verbose)
 			phaseoff = 0;
 		i += 2;
 		if (ASKDemod(tmp2, false, false, 1) < 1) {
-			save_restoreGB(0);
+			save_restoreGB(GRAPH_RESTORE);
 			return 0;
 		}
 		//set DemodBufferLen to just one block
@@ -638,7 +638,7 @@ int EM4x50Read(const char *Cmd, bool verbose)
 	}
 
 	//restore GraphBuffer
-	save_restoreGB(0);
+	save_restoreGB(GRAPH_RESTORE);
 	return (int)AllPTest;
 }
 
diff --git a/client/cmdlft55xx.c b/client/cmdlft55xx.c
index ed8e3152..252aaaa2 100644
--- a/client/cmdlft55xx.c
+++ b/client/cmdlft55xx.c
@@ -419,23 +419,23 @@ bool DecodeT55xxBlock(){
 			break;
 		case DEMOD_PSK1:
 			// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)
-			save_restoreGB(1);
+			save_restoreGB(GRAPH_SAVE);
 			CmdLtrim("160");
 			snprintf(cmdStr, sizeof(buf),"%d %d 6", bitRate[config.bitrate], config.inverted );
 			ans = PSKDemod(cmdStr, false);
 			//undo trim samples
-			save_restoreGB(0);
+			save_restoreGB(GRAPH_RESTORE);
 			break;
 		case DEMOD_PSK2: //inverted won't affect this
 		case DEMOD_PSK3: //not fully implemented
 			// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)
-			save_restoreGB(1);
+			save_restoreGB(GRAPH_SAVE);
 			CmdLtrim("160");
 			snprintf(cmdStr, sizeof(buf),"%d 0 6", bitRate[config.bitrate] );
 			ans = PSKDemod(cmdStr, false);
 			psk1TOpsk2(DemodBuffer, DemodBufferLen);
 			//undo trim samples
-			save_restoreGB(0);
+			save_restoreGB(GRAPH_RESTORE);
 			break;
 		case DEMOD_NRZ:
 			snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted );
@@ -594,7 +594,7 @@ bool tryDetectModulation(){
 		clk = GetPskClock("", false, false);
 		if (clk>0) {
 			// allow undo
-			save_restoreGB(1);
+			save_restoreGB(GRAPH_SAVE);
 			// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)
 			CmdLtrim("160");
 			if ( PSKDemod("0 0 6", false) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
@@ -638,7 +638,7 @@ bool tryDetectModulation(){
 				}
 			} // inverse waves does not affect this demod
 			//undo trim samples
-			save_restoreGB(0);
+			save_restoreGB(GRAPH_RESTORE);
 		}
 	}	
 	if ( hits == 1) {
diff --git a/client/graph.c b/client/graph.c
index cc0ec6fb..3ea47d2d 100644
--- a/client/graph.c
+++ b/client/graph.c
@@ -53,16 +53,19 @@ int ClearGraph(int redraw)
 void save_restoreGB(uint8_t saveOpt)
 {
 	static int SavedGB[MAX_GRAPH_TRACE_LEN];
-	static int SavedGBlen;
+	static int SavedGBlen=0;
 	static bool GB_Saved = false;
+	static int SavedGridOffsetAdj=0;
 
-	if (saveOpt==1) { //save
+	if (saveOpt == GRAPH_SAVE) { //save
 		memcpy(SavedGB, GraphBuffer, sizeof(GraphBuffer));
 		SavedGBlen = GraphTraceLen;
 		GB_Saved=true;
-	} else if (GB_Saved){ //restore
+		SavedGridOffsetAdj = GridOffset;
+	} else if (GB_Saved) { //restore
 		memcpy(GraphBuffer, SavedGB, sizeof(GraphBuffer));
 		GraphTraceLen = SavedGBlen;
+		GridOffset = SavedGridOffsetAdj;
 		RepaintGraphWindow();
 	}
 	return;
diff --git a/client/graph.h b/client/graph.h
index d77db301..b20ae4e8 100644
--- a/client/graph.h
+++ b/client/graph.h
@@ -32,6 +32,8 @@ void DetectHighLowInGraph(int *high, int *low, bool addFuzz);
 
 // Max graph trace len: 40000 (bigbuf) * 8 (at 1 bit per sample)
 #define MAX_GRAPH_TRACE_LEN (40000 * 8 )
+#define GRAPH_SAVE 1
+#define GRAPH_RESTORE 0
 
 extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
 extern int GraphTraceLen;
diff --git a/client/proxgui.h b/client/proxgui.h
index 846ac45d..74c5063c 100644
--- a/client/proxgui.h
+++ b/client/proxgui.h
@@ -40,6 +40,8 @@ extern int AutoCorrelate(const int *in, int *out, size_t len, int window, bool S
 extern int directionalThreshold(const int* in, int *out, size_t len, int8_t up, int8_t down);
 extern void save_restoreGB(uint8_t saveOpt);
 
+#define GRAPH_SAVE 1
+#define GRAPH_RESTORE 0
 #define MAX_DEMOD_BUF_LEN (1024*128)
 extern uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
 extern size_t DemodBufferLen;
diff --git a/client/proxguiqt.cpp b/client/proxguiqt.cpp
index 6171c429..3805411d 100644
--- a/client/proxguiqt.cpp
+++ b/client/proxguiqt.cpp
@@ -32,7 +32,7 @@ bool g_useOverlays = false;
 int g_absVMax = 0;
 int startMax;
 int PageWidth;
-
+int unlockStart = 0;
 
 void ProxGuiQT::ShowGraphWindow(void)
 {
@@ -119,13 +119,13 @@ ProxGuiQT::~ProxGuiQT(void)
 void ProxWidget::applyOperation()
 {
 	//printf("ApplyOperation()");
-	save_restoreGB(1);
+	save_restoreGB(GRAPH_SAVE);
 	memcpy(GraphBuffer, s_Buff, sizeof(int) * GraphTraceLen);
 	RepaintGraphWindow();
 }
 void ProxWidget::stickOperation()
 {
-	save_restoreGB(0);
+	save_restoreGB(GRAPH_RESTORE);
 	//printf("stickOperation()");
 }
 void ProxWidget::vchange_autocorr(int v)
@@ -434,11 +434,22 @@ void Plot::PlotGraph(int *buffer, int len, QRect plotRect, QRect annotationRect,
 
 void Plot::plotGridLines(QPainter* painter,QRect r)
 {
+	// set GridOffset
+	if (PlotGridX <= 0) return;
+	int offset = GridOffset;
+	if (GridLocked && PlotGridX) {
+		offset = GridOffset + PlotGridX - (GraphStart % PlotGridX);
+	} else if (!GridLocked && GraphStart > 0 && PlotGridX) {
+		offset = PlotGridX-((GraphStart - offset) % PlotGridX) + GraphStart - unlockStart;
+	}
+	offset %= PlotGridX;
+	if (offset < 0) offset += PlotGridX;
+
 	int i;
 	int grid_delta_x = (int) (PlotGridX * GraphPixelsPerPoint);
 	int grid_delta_y = PlotGridY;
 	if ((PlotGridX > 0) && ((PlotGridX * GraphPixelsPerPoint) > 1)) {
-		for(i = (GridOffset * GraphPixelsPerPoint); i < r.right(); i += grid_delta_x) {
+		for(i = (offset * GraphPixelsPerPoint); i < r.right(); i += grid_delta_x) {
 			painter->drawLine(r.left()+i, r.top(), r.left()+i, r.bottom());
 		} 
 	}
@@ -581,9 +592,6 @@ void Plot::mouseMoveEvent(QMouseEvent *event)
 void Plot::keyPressEvent(QKeyEvent *event)
 {
 	int	offset;
-	int	gridchanged;
-
-	gridchanged= 0;
 
 	if(event->modifiers() & Qt::ShiftModifier) {
 		if (PlotGridX)
@@ -611,53 +619,18 @@ void Plot::keyPressEvent(QKeyEvent *event)
 
 		case Qt::Key_Right:
 			if(GraphPixelsPerPoint < 20) {
-				if (PlotGridX && GridLocked && GraphStart < startMax){
-					GridOffset -= offset;
-					GridOffset %= PlotGridX;
-					gridchanged= 1;
-				}
 				GraphStart += offset;
 			} else {
-				if (PlotGridX && GridLocked && GraphStart < startMax){
-					GridOffset--;
-					GridOffset %= PlotGridX;
-					gridchanged= 1;
-				}
 				GraphStart++;
 			}
-			if(GridOffset < 0) {
-				GridOffset += PlotGridX;
-			}
-			if (gridchanged)
-				if (GraphStart > startMax) {
-					GridOffset += (GraphStart - startMax);
-					GridOffset %= PlotGridX;
-				}
 			break;
 
 		case Qt::Key_Left:
 			if(GraphPixelsPerPoint < 20) {
-				if (PlotGridX && GridLocked && GraphStart > 0){
-					GridOffset += offset;
-					GridOffset %= PlotGridX;
-					gridchanged= 1;
-				}
 				GraphStart -= offset;
 			} else {
-				if (PlotGridX && GridLocked && GraphStart > 0){
-					GridOffset++;
-					GridOffset %= PlotGridX;
-					gridchanged= 1;
-				}
 				GraphStart--;
 			}
-			if (gridchanged){
-				if (GraphStart < 0)
-					GridOffset += GraphStart;
-				if(GridOffset < 0)
-					GridOffset += PlotGridX;
-			GridOffset %= PlotGridX;
-			}
 			break;
 
 		case Qt::Key_G:
@@ -667,7 +640,7 @@ void Plot::keyPressEvent(QKeyEvent *event)
 			} else {
 				PlotGridX= PlotGridXdefault;
 				PlotGridY= PlotGridYdefault;
-				}
+			}
 			break;
 
 		case Qt::Key_H:
@@ -692,7 +665,11 @@ void Plot::keyPressEvent(QKeyEvent *event)
 			break;
 
 		case Qt::Key_L:
-			GridLocked= !GridLocked;
+			GridLocked = !GridLocked;
+			if (GridLocked)
+				GridOffset += (GraphStart - unlockStart);
+			else
+				unlockStart = GraphStart;
 			break;
 
 		case Qt::Key_Q:
-- 
2.39.5