From 1a3c006469f38deb037cd8f0d79555f2f564d784 Mon Sep 17 00:00:00 2001 From: marshmellow42 Date: Fri, 14 Apr 2017 09:53:36 -0400 Subject: [PATCH] maybe fixed loading/unloading bug. --- client/proxgui.cpp | 3 +- client/proxgui.h | 1 + client/proxguiqt.cpp | 80 ++++++++++++++++++++++++++++++++------------ client/proxguiqt.h | 24 +++++++++---- client/proxmark3.c | 19 ++++++----- client/ui.h | 1 + 6 files changed, 91 insertions(+), 37 deletions(-) diff --git a/client/proxgui.cpp b/client/proxgui.cpp index 12faab79..7dcb0da0 100644 --- a/client/proxgui.cpp +++ b/client/proxgui.cpp @@ -63,6 +63,7 @@ extern "C" void ExitGraphics(void) if (!gui) return; - delete gui; + gui->Exit(); + //delete gui; gui = NULL; } diff --git a/client/proxgui.h b/client/proxgui.h index de6dd6c2..846ac45d 100644 --- a/client/proxgui.h +++ b/client/proxgui.h @@ -45,6 +45,7 @@ extern uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN]; extern size_t DemodBufferLen; extern size_t g_DemodStartIdx; extern bool showDemod; +extern uint8_t g_debugMode; #ifdef __cplusplus } diff --git a/client/proxguiqt.cpp b/client/proxguiqt.cpp index c1541999..d81c8108 100644 --- a/client/proxguiqt.cpp +++ b/client/proxguiqt.cpp @@ -23,7 +23,6 @@ #include #include #include -#include "proxguiqt.h" #include "proxgui.h" #include //#include @@ -47,6 +46,11 @@ void ProxGuiQT::HideGraphWindow(void) emit HideGraphWindowSignal(); } +void ProxGuiQT::Exit(void) +{ + emit ExitSignal(); +} + void ProxGuiQT::_ShowGraphWindow(void) { if(!plotapp) @@ -74,6 +78,9 @@ void ProxGuiQT::_HideGraphWindow(void) plotwidget->hide(); } +void ProxGuiQT::_Exit(void) { + delete this; +} void ProxGuiQT::MainLoop() { plotapp = new QApplication(argc, argv); @@ -81,6 +88,7 @@ void ProxGuiQT::MainLoop() connect(this, SIGNAL(ShowGraphWindowSignal()), this, SLOT(_ShowGraphWindow())); connect(this, SIGNAL(RepaintGraphWindowSignal()), this, SLOT(_RepaintGraphWindow())); connect(this, SIGNAL(HideGraphWindowSignal()), this, SLOT(_HideGraphWindow())); + connect(this, SIGNAL(ExitSignal()), this, SLOT(_Exit())); plotapp->exec(); } @@ -92,12 +100,11 @@ ProxGuiQT::ProxGuiQT(int argc, char **argv) : plotapp(NULL), plotwidget(NULL), ProxGuiQT::~ProxGuiQT(void) { - if (plotwidget) { - //plotwidget->close(); - delete plotwidget; - plotwidget = NULL; - } - + //if (plotwidget) { + //plotwidget->destroy(true,true); + // delete plotwidget; + // plotwidget = NULL; + //} if (plotapp) { plotapp->quit(); delete plotapp; @@ -108,22 +115,21 @@ ProxGuiQT::~ProxGuiQT(void) //-------------------- void ProxWidget::applyOperation() { - printf("ApplyOperation()"); + //printf("ApplyOperation()"); save_restoreGB(1); memcpy(GraphBuffer, s_Buff, sizeof(int) * GraphTraceLen); RepaintGraphWindow(); - } void ProxWidget::stickOperation() { save_restoreGB(0); - printf("stickOperation()"); + //printf("stickOperation()"); } void ProxWidget::vchange_autocorr(int v) { int ans; ans = AutoCorrelate(GraphBuffer, s_Buff, GraphTraceLen, v, true, false); - printf("vchange_autocorr(w:%d): %d\n", v, ans); + if (g_debugMode) printf("vchange_autocorr(w:%d): %d\n", v, ans); RepaintGraphWindow(); } void ProxWidget::vchange_askedge(int v) @@ -131,20 +137,20 @@ void ProxWidget::vchange_askedge(int v) int ans; //extern int AskEdgeDetect(const int *in, int *out, int len, int threshold); ans = AskEdgeDetect(GraphBuffer, s_Buff, GraphTraceLen, v); - printf("vchange_askedge(w:%d)\n", v); + if (g_debugMode) printf("vchange_askedge(w:%d)%d\n", v, ans); RepaintGraphWindow(); } void ProxWidget::vchange_dthr_up(int v) { int down = opsController->horizontalSlider_dirthr_down->value(); directionalThreshold(GraphBuffer, s_Buff, GraphTraceLen, v, down); - printf("vchange_dthr_up(%d)", v); + //printf("vchange_dthr_up(%d)", v); RepaintGraphWindow(); } void ProxWidget::vchange_dthr_down(int v) { - printf("vchange_dthr_down(%d)", v); + //printf("vchange_dthr_down(%d)", v); int up = opsController->horizontalSlider_dirthr_up->value(); directionalThreshold(GraphBuffer,s_Buff, GraphTraceLen, v, up); RepaintGraphWindow(); @@ -157,7 +163,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) /** Setup the controller widget **/ - QWidget* controlWidget = new QWidget(); + controlWidget = new QWidget(); opsController = new Ui::Form(); opsController->setupUi(controlWidget); //Due to quirks in QT Designer, we need to fiddle a bit @@ -189,9 +195,43 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) //layout->addWidget(slider); layout->addWidget(plot); setLayout(layout); - printf("Proxwidget Constructor just set layout\r\n"); + //printf("Proxwidget Constructor just set layout\r\n"); } +// not 100% sure what i need in this block +// feel free to fix - marshmellow... +ProxWidget::~ProxWidget(void) +{ + if (controlWidget) { + controlWidget->close(); + delete controlWidget; + controlWidget = NULL; + } + + if (opsController) { + delete opsController; + opsController = NULL; + } + + if (plot) { + plot->close(); + delete plot; + plot = NULL; + } +} +void ProxWidget::closeEvent(QCloseEvent *event) +{ + event->ignore(); + this->hide(); +} +void ProxWidget::hideEvent(QHideEvent *event) { + controlWidget->hide(); + plot->hide(); +} +void ProxWidget::showEvent(QShowEvent *event) { + controlWidget->show(); + plot->show(); +} //----------- Plotting @@ -242,7 +282,7 @@ void Plot::PlotDemod(uint8_t *buffer, size_t len, QRect plotRect, QRect annotati // round down if (DemodStart-plotOffset > 0) BitStart = (int)(((DemodStart-plotOffset)+(PlotGridX-1))/PlotGridX)-1; first_delta_x += BitStart * PlotGridX; - if (BitStart > len) return; + if (BitStart > (int)len) return; int delta_x = 0; int v = 0; //printf("first_delta_x %i, grid_delta_x %i, DemodStart %i, BitStart %i\n",first_delta_x,grid_delta_x,DemodStart, BitStart); @@ -255,8 +295,8 @@ void Plot::PlotDemod(uint8_t *buffer, size_t len, QRect plotRect, QRect annotati penPath.moveTo(x, y); delta_x = 0; int clk = first_delta_x; - for(int i = BitStart; i < len && xCoordOf(delta_x+DemodStart, plotRect) < plotRect.right(); i++) { - for (int ii = 0; ii < (clk) && i < len && xCoordOf(DemodStart+delta_x+ii, plotRect) < plotRect.right() ; ii++ ) { + for(int i = BitStart; i < (int)len && xCoordOf(delta_x+DemodStart, plotRect) < plotRect.right(); i++) { + for (int ii = 0; ii < (clk) && i < (int)len && xCoordOf(DemodStart+delta_x+ii, plotRect) < plotRect.right() ; ii++ ) { x = xCoordOf(DemodStart+delta_x+ii, plotRect); v = buffer[i]*200-100; @@ -407,8 +447,6 @@ void Plot::plotGridLines(QPainter* painter,QRect r) void Plot::paintEvent(QPaintEvent *event) { QPainter painter(this); - //QPainterPath penPath, whitePath, greyPath, lightgreyPath, cursorAPath, cursorBPath, cursorCPath, cursorDPath; - //QRect r; QBrush brush(QColor(100, 255, 100)); QPen pen(QColor(100, 255, 100)); diff --git a/client/proxguiqt.h b/client/proxguiqt.h index fa1ba018..aa3b5b35 100644 --- a/client/proxguiqt.h +++ b/client/proxguiqt.h @@ -8,6 +8,9 @@ // GUI (QT) //----------------------------------------------------------------------------- +#ifndef PROXGUI_QT +#define PROXGUI_QT + #include #include #include @@ -51,19 +54,24 @@ class ProxGuiQT; */ class ProxWidget : public QWidget { - Q_OBJECT; + Q_OBJECT; //needed for slot/signal classes private: + ProxGuiQT *master; Plot *plot; Ui::Form *opsController; - ProxGuiQT *master; - + QWidget* controlWidget; + public: ProxWidget(QWidget *parent = 0, ProxGuiQT *master = NULL); + ~ProxWidget(void); + //OpsShow(void); - //protected: + protected: // void paintEvent(QPaintEvent *event); - // void closeEvent(QCloseEvent *event); + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void hideEvent(QHideEvent *event); // void mouseMoveEvent(QMouseEvent *event); // void mousePressEvent(QMouseEvent *event) { mouseMoveEvent(event); } // void keyPressEvent(QKeyEvent *event); @@ -94,14 +102,16 @@ class ProxGuiQT : public QObject void RepaintGraphWindow(void); void HideGraphWindow(void); void MainLoop(void); - + void Exit(void); private slots: void _ShowGraphWindow(void); void _RepaintGraphWindow(void); void _HideGraphWindow(void); - + void _Exit(void); signals: void ShowGraphWindowSignal(void); void RepaintGraphWindowSignal(void); void HideGraphWindowSignal(void); + void ExitSignal(void); }; +#endif // PROXGUI_QT diff --git a/client/proxmark3.c b/client/proxmark3.c index 98f7880e..d00af5cc 100644 --- a/client/proxmark3.c +++ b/client/proxmark3.c @@ -102,7 +102,7 @@ static void *main_loop(void *targ) { struct receiver_arg rarg; char *cmd = NULL; pthread_t reader_thread; - + if (arg->usb_present == 1) { rarg.run = 1; pthread_create(&reader_thread, NULL, &uart_receiver, &rarg); @@ -175,13 +175,13 @@ static void *main_loop(void *targ) { rarg.run = 0; pthread_join(reader_thread, NULL); } - + + ExitGraphics(); + if (script_file) { fclose(script_file); script_file = NULL; } - - ExitGraphics(); pthread_exit(NULL); return NULL; } @@ -254,7 +254,7 @@ int main(int argc, char* argv[]) { .usb_present = 0, .script_cmds_file = NULL }; - pthread_t main_loop_threat; + pthread_t main_loop_thread; sp = uart_open(argv[1]); @@ -288,13 +288,16 @@ int main(int argc, char* argv[]) { // create a mutex to avoid interlacing print commands from our different threads pthread_mutex_init(&print_lock, NULL); + pthread_create(&main_loop_thread, NULL, &main_loop, &marg); - pthread_create(&main_loop_threat, NULL, &main_loop, &marg); + // build ui/graph forms on separate thread (killed on main_loop_thread); InitGraphics(argc, argv); - MainGraphics(); + //this won't return until ExitGraphics() is called - pthread_join(main_loop_threat, NULL); + //wait for thread to finish + pthread_join(main_loop_thread, NULL); + // Clean up the port if (offline == 0) { diff --git a/client/ui.h b/client/ui.h index 5aaac17e..4049033d 100644 --- a/client/ui.h +++ b/client/ui.h @@ -12,6 +12,7 @@ #define UI_H__ #include +#include void ShowGui(void); void HideGraphWindow(void); -- 2.39.5