From f157fac2fb036059275d00bc8c2e7425d1194a5e Mon Sep 17 00:00:00 2001 From: mwalker33 Date: Mon, 5 Oct 2020 21:19:09 +1100 Subject: [PATCH] Add option to hide/show plot sliders --- client/Makefile | 9 +++++ client/src/preferences.c | 76 +++++++++++++++++++++++++++++++++++++++- client/src/proxguiqt.cpp | 11 ++++-- client/src/ui.h | 1 + 4 files changed, 94 insertions(+), 3 deletions(-) diff --git a/client/Makefile b/client/Makefile index 29fb4462e..ba7802bbf 100644 --- a/client/Makefile +++ b/client/Makefile @@ -299,6 +299,15 @@ endif CXXFLAGS ?= -Wall -Werror -O3 PM3CXXFLAGS = $(CXXFLAGS) PM3CXXFLAGS += -I../include +ifneq (,$(findstring MINGW,$(platform))) + # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) + # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 + # FTR __USE_MINGW_ANSI_STDIO seems deprecated in Mingw32 + # but not Mingw64 https://fr.osdn.net/projects/mingw/lists/archive/users/2019-January/000199.html + PM3CXXFLAGS += -D_ISOC99_SOURCE +endif + + ifeq ($(QT_FOUND),1) PM3CFLAGS += -DHAVE_GUI diff --git a/client/src/preferences.c b/client/src/preferences.c index 40a93a948..5865bac8b 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -52,6 +52,7 @@ int preferences_load(void) { session.overlay.y = 60 + session.plot.y + session.plot.h; session.overlay.h = 200; session.overlay.w = session.plot.w; + session.overlay_sliders = true; session.show_hints = false; // setDefaultPath (spDefault, ""); @@ -185,6 +186,7 @@ void preferences_save_callback(json_t *root) { JsonSaveInt(root, "window.overlay.ypos", session.overlay.y); JsonSaveInt(root, "window.overlay.hsize", session.overlay.h); JsonSaveInt(root, "window.overlay.wsize", session.overlay.w); + JsonSaveBoolean(root, "window.overlay.sliders", session.overlay_sliders); // Log level, convert to text switch (session.client_debug_level) { @@ -270,6 +272,8 @@ void preferences_load_callback(json_t *root) { session.overlay.h = i1; if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.wsize", &i1) == 0) session.overlay.w = i1; + if (json_unpack_ex(root, &up_error, 0, "{s:b}", "window.overlay.sliders", &b1) == 0) + session.overlay_sliders = b1; // show options if (json_unpack_ex(root, &up_error, 0, "{s:s}", "show.emoji", &s1) == 0) { @@ -353,6 +357,16 @@ static int usage_set_hints(void) { PrintAndLogEx(NORMAL, " "_GREEN_("on")" - Display hints"); return PM3_SUCCESS; } + +static int usage_set_plotsliders(void) { + PrintAndLogEx(NORMAL, "Usage: pref set plotsliders "); + PrintAndLogEx(NORMAL, "Options:"); + PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help"); + PrintAndLogEx(NORMAL, " "_GREEN_("on")" - show plot slider controls"); + PrintAndLogEx(NORMAL, " "_GREEN_("off")" - hide plot slider controls"); + return PM3_SUCCESS; +} + /* static int usage_set_savePaths(void) { PrintAndLogEx(NORMAL, "Usage: pref set savepaths [help] [create] [default ] [dump ] [trace ]"); @@ -492,6 +506,13 @@ static void showHintsState(prefShowOpt_t opt) { PrintAndLogEx(INFO, " %s hints.................. "_WHITE_("off"), prefShowMsg(opt)); } +static void showPlotSliderState(prefShowOpt_t opt) { + if (session.overlay_sliders) + PrintAndLogEx(INFO, " %s show plot sliders...... "_GREEN_("on"), prefShowMsg(opt)); + else + PrintAndLogEx(INFO, " %s show plot sliders...... "_WHITE_("off"), prefShowMsg(opt)); +} + static int setCmdEmoji(const char *Cmd) { uint8_t cmdp = 0; @@ -755,6 +776,52 @@ static int setCmdHint(const char *Cmd) { return PM3_SUCCESS; } +static int setCmdPlotSliders(const char *Cmd) { + uint8_t cmdp = 0; + bool errors = false; + bool validValue = false; + char strOpt[50]; + bool newValue = session.overlay_sliders; + + if (param_getchar(Cmd, cmdp) == 0x00) + return usage_set_plotsliders(); + + while ((param_getchar(Cmd, cmdp) != 0x00) && !errors) { + + if (param_getstr(Cmd, cmdp++, strOpt, sizeof(strOpt)) != 0) { + str_lower(strOpt); // convert to lowercase + + if (strncmp(strOpt, "help", 4) == 0) + return usage_set_plotsliders(); + if (strncmp(strOpt, "off", 3) == 0) { + validValue = true; + newValue = false; + } + if (strncmp(strOpt, "on", 2) == 0) { + validValue = true; + newValue = true; + } + + if (validValue) { + if (session.overlay_sliders != newValue) {// changed + showPlotSliderState(prefShowOLD); + session.overlay_sliders = newValue; + showPlotSliderState(prefShowNEW); + preferences_save(); + } else { + PrintAndLogEx(INFO, "nothing changed"); + showPlotSliderState(prefShowNone); + } + } else { + PrintAndLogEx(ERR, "invalid option"); + return usage_set_plotsliders(); + } + } + } + + return PM3_SUCCESS; +} + /* static int setCmdSavePaths (const char *Cmd) { uint8_t cmdp = 0; @@ -866,6 +933,11 @@ static int getCmdDebug(const char *Cmd) { return PM3_SUCCESS; } +static int getCmdPlotSlider(const char *Cmd) { + showPlotSliderState(prefShowNone); + return PM3_SUCCESS; +} + static command_t getCommandTable[] = { // {"help", getCmdHelp, AlwaysAvailable, "This help"}, {"emoji", getCmdEmoji, AlwaysAvailable, "Get emoji display preference"}, @@ -873,6 +945,7 @@ static command_t getCommandTable[] = { {"color", getCmdColor, AlwaysAvailable, "Get color support preference"}, // {"defaultsavepaths", getCmdSavePaths, AlwaysAvailable, "... to be adjusted next ... "}, {"clientdebug", getCmdDebug, AlwaysAvailable, "Get client debug level preference"}, + {"plotsliders", getCmdPlotSlider, AlwaysAvailable, "Get plot slider display preference"}, // {"devicedebug", getCmdDeviceDebug, AlwaysAvailable, "Get device debug level"}, {NULL, NULL, NULL, NULL} }; @@ -884,6 +957,7 @@ static command_t setCommandTable[] = { {"color", setCmdColor, AlwaysAvailable, "Set color support"}, // {"defaultsavepaths", setCmdSavePaths, AlwaysAvailable, "... to be adjusted next ... "}, {"clientdebug", setCmdDebug, AlwaysAvailable, "Set client debug level"}, + {"plotsliders",setCmdPlotSliders, AlwaysAvailable, "Set plot slider display"}, // {"devicedebug", setCmdDeviceDebug, AlwaysAvailable, "Set device debug level"}, {NULL, NULL, NULL, NULL} }; @@ -925,8 +999,8 @@ static int CmdPrefShow(const char *Cmd) { // showSavePathState(spDefault, prefShowNone); // showSavePathState(spDump, prefShowNone); // showSavePathState(spTrace, prefShowNone); - showClientDebugState(prefShowNone); + showPlotSliderState(prefShowNone); // showDeviceDebugState(prefShowNone); PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; diff --git a/client/src/proxguiqt.cpp b/client/src/proxguiqt.cpp index 02a9b4c7b..a40e751be 100644 --- a/client/src/proxguiqt.cpp +++ b/client/src/proxguiqt.cpp @@ -7,6 +7,7 @@ //----------------------------------------------------------------------------- // GUI (QT) //----------------------------------------------------------------------------- +#define __STDC_FORMAT_MACROS #include "proxguiqt.h" #include #include @@ -251,7 +252,8 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) { QString ct = QString("[*]Slider [ %1 ]").arg(conn.serial_port_name); controlWidget->setWindowTitle(ct); - controlWidget->show(); + // The hide/show event functions should take care of this. + // controlWidget->show(); // now that is up, reset pos/size change flags session.window_changed = false; @@ -289,7 +291,10 @@ void ProxWidget::hideEvent(QHideEvent *event) { plot->hide(); } void ProxWidget::showEvent(QShowEvent *event) { - controlWidget->show(); + if (session.overlay_sliders) + controlWidget->show(); + else + controlWidget->hide(); plot->show(); } void ProxWidget::moveEvent(QMoveEvent *event) { @@ -485,6 +490,8 @@ void Plot::PlotGraph(int *buffer, size_t len, QRect plotRect, QRect annotationRe //Graph annotations painter->drawPath(penPath); char str[200]; +// sprintf(str, "max=%d min=%d mean=%llu n=%u/%zu CursorAVal=[%d] CursorBVal=[%d]", +// vMax, vMin, vMean, GraphStop - GraphStart, len, buffer[CursorAPos], buffer[CursorBPos]); sprintf(str, "max=%d min=%d mean=%" PRId64 " n=%u/%zu CursorAVal=[%d] CursorBVal=[%d]", vMax, vMin, vMean, GraphStop - GraphStart, len, buffer[CursorAPos], buffer[CursorBPos]); painter->drawText(20, annotationRect.bottom() - 23 - 20 * graphNum, str); diff --git a/client/src/ui.h b/client/src/ui.h index f19f2024a..66f6df279 100644 --- a/client/src/ui.h +++ b/client/src/ui.h @@ -40,6 +40,7 @@ typedef struct { bool window_changed; // track if plot/overlay pos/size changed to save on exit qtWindow_t plot; qtWindow_t overlay; + bool overlay_sliders; // char *defaultPaths[spItemCount]; // Array should allow loop searching for files clientdebugLevel_t client_debug_level; // uint8_t device_debug_level;