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.
static int savedDemodStartIdx = 0;
static int savedDemodClock = 0;
static int savedDemodStartIdx = 0;
static int savedDemodClock = 0;
- if (saveOpt==1) { //save
+ if (saveOpt == GRAPH_SAVE) { //save
memcpy(SavedDB, DemodBuffer, sizeof(DemodBuffer));
SavedDBlen = DemodBufferLen;
memcpy(SavedDB, DemodBuffer, sizeof(DemodBuffer));
SavedDBlen = DemodBufferLen;
g_DemodClock = clk;
if (g_debugMode) PrintAndLog("demodoffset %d, clk %d",offset,clk);
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;
if (offset < 0) offset += clk;
if (offset > GraphTraceLen || offset < 0) return;
if (offline || cmdp == '1') return 0;
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");
//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");
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);
- save_restoreGB(0);
- save_restoreDB(0);
+ save_restoreGB(GRAPH_RESTORE);
+ save_restoreDB(GRAPH_RESTORE);
PrintAndLog("\nNo Known Tags Found!\n");
if (testRaw=='u' || testRaw=='U') {
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);
//test unknown tag formats (raw mode)0
PrintAndLog("\nChecking for Unknown tags:\n");
ans=AutoCorrelate(GraphBuffer, GraphBuffer, GraphTraceLen, 4000, false, false);
start = skip;
snprintf(tmp2, sizeof(tmp2),"%d %d 1000 %d", clk, invert, clk*47);
// save GraphBuffer - to restore it later
start = skip;
snprintf(tmp2, sizeof(tmp2),"%d %d 1000 %d", clk, invert, clk*47);
// save GraphBuffer - to restore it later
+ save_restoreGB(GRAPH_SAVE);
// get rid of leading crap
snprintf(tmp, sizeof(tmp), "%i", skip);
CmdLtrim(tmp);
// get rid of leading crap
snprintf(tmp, sizeof(tmp), "%i", skip);
CmdLtrim(tmp);
phaseoff = 0;
i += 2;
if (ASKDemod(tmp2, false, false, 1) < 1) {
phaseoff = 0;
i += 2;
if (ASKDemod(tmp2, false, false, 1) < 1) {
+ save_restoreGB(GRAPH_RESTORE);
return 0;
}
//set DemodBufferLen to just one block
return 0;
}
//set DemodBufferLen to just one block
+ save_restoreGB(GRAPH_RESTORE);
break;\r
case DEMOD_PSK1:\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
break;\r
case DEMOD_PSK1:\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
+ save_restoreGB(GRAPH_SAVE);\r
CmdLtrim("160");\r
snprintf(cmdStr, sizeof(buf),"%d %d 6", bitRate[config.bitrate], config.inverted );\r
ans = PSKDemod(cmdStr, false);\r
//undo trim samples\r
CmdLtrim("160");\r
snprintf(cmdStr, sizeof(buf),"%d %d 6", bitRate[config.bitrate], config.inverted );\r
ans = PSKDemod(cmdStr, false);\r
//undo trim samples\r
+ save_restoreGB(GRAPH_RESTORE);\r
break;\r
case DEMOD_PSK2: //inverted won't affect this\r
case DEMOD_PSK3: //not fully implemented\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
break;\r
case DEMOD_PSK2: //inverted won't affect this\r
case DEMOD_PSK3: //not fully implemented\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
+ save_restoreGB(GRAPH_SAVE);\r
CmdLtrim("160");\r
snprintf(cmdStr, sizeof(buf),"%d 0 6", bitRate[config.bitrate] );\r
ans = PSKDemod(cmdStr, false);\r
psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
//undo trim samples\r
CmdLtrim("160");\r
snprintf(cmdStr, sizeof(buf),"%d 0 6", bitRate[config.bitrate] );\r
ans = PSKDemod(cmdStr, false);\r
psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
//undo trim samples\r
+ save_restoreGB(GRAPH_RESTORE);\r
break;\r
case DEMOD_NRZ:\r
snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted );\r
break;\r
case DEMOD_NRZ:\r
snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted );\r
clk = GetPskClock("", false, false);\r
if (clk>0) {\r
// allow undo\r
clk = GetPskClock("", false, false);\r
if (clk>0) {\r
// allow undo\r
+ save_restoreGB(GRAPH_SAVE);\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
CmdLtrim("160");\r
if ( PSKDemod("0 0 6", false) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
CmdLtrim("160");\r
if ( PSKDemod("0 0 6", false) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
}\r
} // inverse waves does not affect this demod\r
//undo trim samples\r
}\r
} // inverse waves does not affect this demod\r
//undo trim samples\r
+ save_restoreGB(GRAPH_RESTORE);\r
}\r
} \r
if ( hits == 1) {\r
}\r
} \r
if ( hits == 1) {\r
void save_restoreGB(uint8_t saveOpt)
{
static int SavedGB[MAX_GRAPH_TRACE_LEN];
void save_restoreGB(uint8_t saveOpt)
{
static int SavedGB[MAX_GRAPH_TRACE_LEN];
+ static int SavedGBlen=0;
static bool GB_Saved = false;
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;
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;
memcpy(GraphBuffer, SavedGB, sizeof(GraphBuffer));
GraphTraceLen = SavedGBlen;
+ GridOffset = SavedGridOffsetAdj;
RepaintGraphWindow();
}
return;
RepaintGraphWindow();
}
return;
// Max graph trace len: 40000 (bigbuf) * 8 (at 1 bit per sample)
#define MAX_GRAPH_TRACE_LEN (40000 * 8 )
// 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;
extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
extern int GraphTraceLen;
extern int directionalThreshold(const int* in, int *out, size_t len, int8_t up, int8_t down);
extern void save_restoreGB(uint8_t saveOpt);
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;
#define MAX_DEMOD_BUF_LEN (1024*128)
extern uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
extern size_t DemodBufferLen;
int g_absVMax = 0;
int startMax;
int PageWidth;
int g_absVMax = 0;
int startMax;
int PageWidth;
void ProxGuiQT::ShowGraphWindow(void)
{
void ProxGuiQT::ShowGraphWindow(void)
{
void ProxWidget::applyOperation()
{
//printf("ApplyOperation()");
void ProxWidget::applyOperation()
{
//printf("ApplyOperation()");
+ save_restoreGB(GRAPH_SAVE);
memcpy(GraphBuffer, s_Buff, sizeof(int) * GraphTraceLen);
RepaintGraphWindow();
}
void ProxWidget::stickOperation()
{
memcpy(GraphBuffer, s_Buff, sizeof(int) * GraphTraceLen);
RepaintGraphWindow();
}
void ProxWidget::stickOperation()
{
+ save_restoreGB(GRAPH_RESTORE);
//printf("stickOperation()");
}
void ProxWidget::vchange_autocorr(int v)
//printf("stickOperation()");
}
void ProxWidget::vchange_autocorr(int v)
void Plot::plotGridLines(QPainter* painter,QRect r)
{
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)) {
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());
}
}
painter->drawLine(r.left()+i, r.top(), r.left()+i, r.bottom());
}
}
void Plot::keyPressEvent(QKeyEvent *event)
{
int offset;
void Plot::keyPressEvent(QKeyEvent *event)
{
int offset;
- int gridchanged;
-
- gridchanged= 0;
if(event->modifiers() & Qt::ShiftModifier) {
if (PlotGridX)
if(event->modifiers() & Qt::ShiftModifier) {
if (PlotGridX)
case Qt::Key_Right:
if(GraphPixelsPerPoint < 20) {
case Qt::Key_Right:
if(GraphPixelsPerPoint < 20) {
- if (PlotGridX && GridLocked && GraphStart < startMax){
- GridOffset -= offset;
- GridOffset %= PlotGridX;
- gridchanged= 1;
- }
GraphStart += offset;
} else {
GraphStart += offset;
} else {
- if (PlotGridX && GridLocked && GraphStart < startMax){
- GridOffset--;
- GridOffset %= PlotGridX;
- gridchanged= 1;
- }
- if(GridOffset < 0) {
- GridOffset += PlotGridX;
- }
- if (gridchanged)
- if (GraphStart > startMax) {
- GridOffset += (GraphStart - startMax);
- GridOffset %= PlotGridX;
- }
break;
case Qt::Key_Left:
if(GraphPixelsPerPoint < 20) {
break;
case Qt::Key_Left:
if(GraphPixelsPerPoint < 20) {
- if (PlotGridX && GridLocked && GraphStart > 0){
- GridOffset += offset;
- GridOffset %= PlotGridX;
- gridchanged= 1;
- }
GraphStart -= offset;
} else {
GraphStart -= offset;
} else {
- if (PlotGridX && GridLocked && GraphStart > 0){
- GridOffset++;
- GridOffset %= PlotGridX;
- gridchanged= 1;
- }
- if (gridchanged){
- if (GraphStart < 0)
- GridOffset += GraphStart;
- if(GridOffset < 0)
- GridOffset += PlotGridX;
- GridOffset %= PlotGridX;
- }
} else {
PlotGridX= PlotGridXdefault;
PlotGridY= PlotGridYdefault;
} else {
PlotGridX= PlotGridXdefault;
PlotGridY= PlotGridYdefault;
- GridLocked= !GridLocked;
+ GridLocked = !GridLocked;
+ if (GridLocked)
+ GridOffset += (GraphStart - unlockStart);
+ else
+ unlockStart = GraphStart;