mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
Merge branch 'settings'
* settings: Get/display a single preference Lighter msg for loading prefs, json will anyway always tell the filename Make sure colors and emoji are disabled when not on TTY Comment out file path code Pre Filepath cleanup Update preferences.c tuning streamline works Update fileutils.c updates clean up device debug and tweaks
This commit is contained in:
commit
99eadded05
7 changed files with 615 additions and 124 deletions
|
@ -49,6 +49,7 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include "scandir.h"
|
#include "scandir.h"
|
||||||
|
#include <direct.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PATH_MAX_LENGTH 200
|
#define PATH_MAX_LENGTH 200
|
||||||
|
@ -130,7 +131,87 @@ static bool is_directory(const char *filename) {
|
||||||
return S_ISDIR(st.st_mode) != 0;
|
return S_ISDIR(st.st_mode) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief create a new directory.
|
||||||
|
* @param dirname
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
// Not used...
|
||||||
|
/*
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define make_dir(a) _mkdir(a)
|
||||||
|
#else
|
||||||
|
#define make_dir(a) mkdir(a,0755) //note 0755 MUST have leading 0 for octal linux file permissions
|
||||||
|
#endif
|
||||||
|
bool create_path(const char *dirname) {
|
||||||
|
|
||||||
|
if (dirname == NULL) // nothing to do
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((strlen(dirname) == 1) && (dirname[0] == '/'))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if ((strlen(dirname) == 2) && (dirname[1] == ':'))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (fileExists(dirname) == 0) {
|
||||||
|
|
||||||
|
char *bs = strrchr(dirname, '\\');
|
||||||
|
char *fs = strrchr(dirname, '/');
|
||||||
|
|
||||||
|
if ((bs == NULL) && (fs != NULL)) {
|
||||||
|
*fs = 0x00;
|
||||||
|
create_path (dirname);
|
||||||
|
*fs = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((bs != NULL) && (fs == NULL)) {
|
||||||
|
*bs = 0x00;
|
||||||
|
create_path (dirname);
|
||||||
|
*bs = '\\';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((bs != NULL) && (fs != NULL)) {
|
||||||
|
if (strlen (bs) > strlen (fs)) {
|
||||||
|
*fs = 0x00; // No slash
|
||||||
|
create_path (dirname);
|
||||||
|
*fs = '/';
|
||||||
|
} else {
|
||||||
|
*bs = 0x00;
|
||||||
|
create_path (dirname);
|
||||||
|
*bs = '\\';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (make_dir(dirname) != 0) {
|
||||||
|
PrintAndLogEx(ERR, "could not create directory.... "_RED_("%s"),dirname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
bool setDefaultPath (savePaths_t pathIndex,const char *Path) {
|
||||||
|
|
||||||
|
if (pathIndex < spItemCount) {
|
||||||
|
if ((Path == NULL) && (session.defaultPaths[pathIndex] != NULL)) {
|
||||||
|
free (session.defaultPaths[pathIndex]);
|
||||||
|
session.defaultPaths[pathIndex] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Path != NULL) {
|
||||||
|
session.defaultPaths[pathIndex] = (char *)realloc(session.defaultPaths[pathIndex], strlen(Path) + 1);
|
||||||
|
strcpy(session.defaultPaths[pathIndex], Path);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
static char *filenamemcopy(const char *preferredName, const char *suffix) {
|
static char *filenamemcopy(const char *preferredName, const char *suffix) {
|
||||||
if (preferredName == NULL) return NULL;
|
if (preferredName == NULL) return NULL;
|
||||||
if (suffix == NULL) return NULL;
|
if (suffix == NULL) return NULL;
|
||||||
|
@ -905,10 +986,10 @@ int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_
|
||||||
}
|
}
|
||||||
*datalen = sptr;
|
*datalen = sptr;
|
||||||
}
|
}
|
||||||
|
PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName);
|
||||||
if (!strcmp(ctype, "settings")) {
|
if (!strcmp(ctype, "settings")) {
|
||||||
preferences_load_callback(root);
|
preferences_load_callback(root);
|
||||||
}
|
}
|
||||||
PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName);
|
|
||||||
out:
|
out:
|
||||||
json_decref(root);
|
json_decref(root);
|
||||||
free(fileName);
|
free(fileName);
|
||||||
|
|
|
@ -74,6 +74,9 @@ typedef enum {
|
||||||
} DumpFileType_t;
|
} DumpFileType_t;
|
||||||
|
|
||||||
int fileExists(const char *filename);
|
int fileExists(const char *filename);
|
||||||
|
//bool create_path(const char *dirname);
|
||||||
|
//bool setDefaultPath (savePaths_t pathIndex,const char *Path); // set a path in the path list session.defaultPaths
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Utility function to save data to a binary file. This method takes a preferred name, but if that
|
* @brief Utility function to save data to a binary file. This method takes a preferred name, but if that
|
||||||
|
|
|
@ -23,11 +23,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "cmdparser.h"
|
#include "cmdparser.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
// #include <unistd.h>
|
#include <dirent.h>
|
||||||
#include <proxmark3.h>
|
#include <proxmark3.h>
|
||||||
|
|
||||||
//#include "proxgui.h"
|
|
||||||
//extern void SetWindowsPosition (void);
|
|
||||||
static int CmdHelp(const char *Cmd);
|
static int CmdHelp(const char *Cmd);
|
||||||
static int setCmdHelp(const char *Cmd);
|
static int setCmdHelp(const char *Cmd);
|
||||||
|
|
||||||
|
@ -51,32 +49,58 @@ static char *prefGetFilename(void) {
|
||||||
|
|
||||||
int preferences_load(void) {
|
int preferences_load(void) {
|
||||||
|
|
||||||
PrintAndLogEx(INFO, "Looking for preferences...");
|
|
||||||
|
|
||||||
// Set all defaults
|
// Set all defaults
|
||||||
session.client_debug_level = OFF;
|
session.client_debug_level = cdbOFF;
|
||||||
|
// session.device_debug_level = ddbOFF;
|
||||||
session.window_changed = false;
|
session.window_changed = false;
|
||||||
session.window_plot_xpos = 10;
|
session.plot.x = 10;
|
||||||
session.window_plot_ypos = 30;
|
session.plot.y = 30;
|
||||||
session.window_plot_hsize = 400;
|
session.plot.h = 400;
|
||||||
session.window_plot_wsize = 800;
|
session.plot.w = 800;
|
||||||
session.window_overlay_xpos = session.window_plot_xpos;
|
session.overlay.x = session.plot.x;
|
||||||
session.window_overlay_ypos = 60 + session.window_plot_ypos + session.window_plot_hsize;
|
session.overlay.y = 60 + session.plot.y + session.plot.h;
|
||||||
session.window_overlay_hsize = 200;
|
session.overlay.h = 200;
|
||||||
session.window_overlay_wsize = session.window_plot_wsize;
|
session.overlay.w = session.plot.w;
|
||||||
session.emoji_mode = ALIAS;
|
session.emoji_mode = ALIAS;
|
||||||
session.show_hints = false;
|
session.show_hints = false;
|
||||||
session.supports_colors = false;
|
session.supports_colors = false;
|
||||||
|
|
||||||
|
// setDefaultPath (spDefault, "");
|
||||||
|
// setDefaultPath (spDump, "");
|
||||||
|
// setDefaultPath (spTrace, "");
|
||||||
|
|
||||||
|
/*
|
||||||
|
// default save path
|
||||||
|
if (get_my_user_directory() != NULL) // should return path to .proxmark3 folder
|
||||||
|
setDefaultPath (spDefault, get_my_user_directory());
|
||||||
|
else
|
||||||
|
setDefaultPath (spDefault, ".");
|
||||||
|
|
||||||
|
// default dump path
|
||||||
|
if (get_my_user_directory() != NULL) // should return path to .proxmark3 folder
|
||||||
|
setDefaultPath (spDump, get_my_user_directory());
|
||||||
|
else
|
||||||
|
setDefaultPath (spDump, ".");
|
||||||
|
|
||||||
|
// default dump path
|
||||||
|
if (get_my_user_directory() != NULL) // should return path to .proxmark3 folder
|
||||||
|
setDefaultPath (spTrace, get_my_user_directory());
|
||||||
|
else
|
||||||
|
setDefaultPath (spTrace, ".");
|
||||||
|
*/
|
||||||
|
|
||||||
// loadFileJson wants these, so pass in place holder values, though not used
|
// loadFileJson wants these, so pass in place holder values, though not used
|
||||||
// in settings load;
|
// in settings load;
|
||||||
uint8_t dummyData = 0x00;
|
uint8_t dummyData = 0x00;
|
||||||
size_t dummyDL = 0x00;
|
size_t dummyDL = 0x00;
|
||||||
|
|
||||||
|
// to better control json cant find file error msg.
|
||||||
|
if (fileExists(prefGetFilename())) {
|
||||||
|
PrintAndLogEx(INFO, "Loading Preferences...");
|
||||||
if (loadFileJSON(prefGetFilename(), &dummyData, sizeof(dummyData), &dummyDL) == PM3_SUCCESS) {
|
if (loadFileJSON(prefGetFilename(), &dummyData, sizeof(dummyData), &dummyDL) == PM3_SUCCESS) {
|
||||||
session.preferences_loaded = true;
|
session.preferences_loaded = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Note, if session.settings_loaded == false then the settings_save
|
// Note, if session.settings_loaded == false then the settings_save
|
||||||
// will be called in main () to save settings as set in defaults and main() checks.
|
// will be called in main () to save settings as set in defaults and main() checks.
|
||||||
|
|
||||||
|
@ -87,10 +111,14 @@ int preferences_load(void) {
|
||||||
int preferences_save(void) {
|
int preferences_save(void) {
|
||||||
// Note sure if backup has value ?
|
// Note sure if backup has value ?
|
||||||
|
|
||||||
char backupFilename[FILENAME_MAX + sizeof(preferencesFilename) + 10] = {0};
|
char *backupFilename = NULL;// [FILENAME_MAX+sizeof(preferencesFilename)+10] = {0};
|
||||||
|
int fnLen = 0;
|
||||||
|
|
||||||
PrintAndLogEx(INFO, "Saving preferences ...");
|
PrintAndLogEx(INFO, "Saving Preferences...");
|
||||||
snprintf(backupFilename, sizeof(backupFilename) - 1, "%s.bak", prefGetFilename());
|
|
||||||
|
fnLen = strlen(prefGetFilename()) + 5; // .bak\0
|
||||||
|
backupFilename = (char *)calloc(fnLen, sizeof(uint8_t));
|
||||||
|
snprintf(backupFilename, fnLen, "%s.bak", prefGetFilename());
|
||||||
|
|
||||||
if (fileExists(backupFilename)) {
|
if (fileExists(backupFilename)) {
|
||||||
if (remove(backupFilename) != 0) {
|
if (remove(backupFilename) != 0) {
|
||||||
|
@ -112,6 +140,9 @@ int preferences_save(void) {
|
||||||
if (saveFileJSON(prefGetFilename(), jsfSettings, &dummyData, dummyDL) != PM3_SUCCESS)
|
if (saveFileJSON(prefGetFilename(), jsfSettings, &dummyData, dummyDL) != PM3_SUCCESS)
|
||||||
PrintAndLogEx(ERR, "Error saving preferences to \"%s\"", prefGetFilename());
|
PrintAndLogEx(ERR, "Error saving preferences to \"%s\"", prefGetFilename());
|
||||||
|
|
||||||
|
if (backupFilename != NULL)
|
||||||
|
free(backupFilename);
|
||||||
|
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,40 +150,13 @@ void preferences_save_callback(json_t *root) {
|
||||||
|
|
||||||
JsonSaveStr(root, "FileType", "settings");
|
JsonSaveStr(root, "FileType", "settings");
|
||||||
|
|
||||||
// Log level, convert to text
|
|
||||||
switch (session.client_debug_level) {
|
|
||||||
case OFF:
|
|
||||||
JsonSaveStr(root, "client.debug.level", "off");
|
|
||||||
break;
|
|
||||||
case SIMPLE:
|
|
||||||
JsonSaveStr(root, "client.debug.level", "simple");
|
|
||||||
break;
|
|
||||||
case FULL:
|
|
||||||
JsonSaveStr(root, "client.debug.level", "full");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
JsonSaveStr(root, "logging.level", "NORMAL");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Plot window
|
|
||||||
JsonSaveInt(root, "window.plot.xpos", session.window_plot_xpos);
|
|
||||||
JsonSaveInt(root, "window.plot.ypos", session.window_plot_ypos);
|
|
||||||
JsonSaveInt(root, "window.plot.hsize", session.window_plot_hsize);
|
|
||||||
JsonSaveInt(root, "window.plot.wsize", session.window_plot_wsize);
|
|
||||||
|
|
||||||
// Overlay/Slider window
|
|
||||||
JsonSaveInt(root, "window.overlay.xpos", session.window_overlay_xpos);
|
|
||||||
JsonSaveInt(root, "window.overlay.ypos", session.window_overlay_ypos);
|
|
||||||
JsonSaveInt(root, "window.overlay.hsize", session.window_overlay_hsize);
|
|
||||||
JsonSaveInt(root, "window.overlay.wsize", session.window_overlay_wsize);
|
|
||||||
|
|
||||||
// Emoji
|
// Emoji
|
||||||
switch (session.emoji_mode) {
|
switch (session.emoji_mode) {
|
||||||
case ALIAS:
|
case ALIAS:
|
||||||
JsonSaveStr(root, "show.emoji", "alias");
|
JsonSaveStr(root, "show.emoji", "alias");
|
||||||
break;
|
break;
|
||||||
case EMOJI:
|
case EMOJI:
|
||||||
JsonSaveStr(root, "show.emoji", "emoji");
|
JsonSaveStr(root,"show.emoji","emoji");
|
||||||
break;
|
break;
|
||||||
case ALTTEXT:
|
case ALTTEXT:
|
||||||
JsonSaveStr(root, "show.emoji", "alttext");
|
JsonSaveStr(root, "show.emoji", "alttext");
|
||||||
|
@ -167,6 +171,58 @@ void preferences_save_callback(json_t *root) {
|
||||||
JsonSaveBoolean(root, "show.hints", session.show_hints);
|
JsonSaveBoolean(root, "show.hints", session.show_hints);
|
||||||
|
|
||||||
JsonSaveBoolean(root, "os.supports.colors", session.supports_colors);
|
JsonSaveBoolean(root, "os.supports.colors", session.supports_colors);
|
||||||
|
|
||||||
|
// JsonSaveStr(root, "file.default.savepath", session.defaultPaths[spDefault]);
|
||||||
|
// JsonSaveStr(root, "file.default.dumppath", session.defaultPaths[spDump]);
|
||||||
|
// JsonSaveStr(root, "file.default.tracepath", session.defaultPaths[spTrace]);
|
||||||
|
|
||||||
|
// Plot window
|
||||||
|
JsonSaveInt(root, "window.plot.xpos", session.plot.x);
|
||||||
|
JsonSaveInt(root, "window.plot.ypos", session.plot.y);
|
||||||
|
JsonSaveInt(root, "window.plot.hsize", session.plot.h);
|
||||||
|
JsonSaveInt(root, "window.plot.wsize", session.plot.w);
|
||||||
|
|
||||||
|
// Overlay/Slider window
|
||||||
|
JsonSaveInt(root, "window.overlay.xpos", session.overlay.x);
|
||||||
|
JsonSaveInt(root, "window.overlay.ypos", session.overlay.y);
|
||||||
|
JsonSaveInt(root, "window.overlay.hsize", session.overlay.h);
|
||||||
|
JsonSaveInt(root, "window.overlay.wsize", session.overlay.w);
|
||||||
|
|
||||||
|
// Log level, convert to text
|
||||||
|
switch (session.client_debug_level) {
|
||||||
|
case cdbOFF:
|
||||||
|
JsonSaveStr(root, "client.debug.level", "off");
|
||||||
|
break;
|
||||||
|
case cdbSIMPLE:
|
||||||
|
JsonSaveStr(root, "client.debug.level", "simple");
|
||||||
|
break;
|
||||||
|
case cdbFULL:
|
||||||
|
JsonSaveStr(root, "client.debug.level", "full");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
JsonSaveStr(root, "logging.level", "NORMAL");
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
switch (session.device_debug_level) {
|
||||||
|
case ddbOFF:
|
||||||
|
JsonSaveStr(root, "device.debug.level", "off");
|
||||||
|
break;
|
||||||
|
case ddbERROR:
|
||||||
|
JsonSaveStr(root, "device.debug.level", "error");
|
||||||
|
break;
|
||||||
|
case ddbINFO:
|
||||||
|
JsonSaveStr(root, "device.debug.level", "info");
|
||||||
|
break;
|
||||||
|
case ddbDEBUG:
|
||||||
|
JsonSaveStr(root, "device.debug.level", "debug");
|
||||||
|
break;
|
||||||
|
case ddbEXTENDED:
|
||||||
|
JsonSaveStr(root, "device.debug.level", "extended");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
JsonSaveStr(root, "logging.level", "NORMAL");
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void preferences_load_callback(json_t *root) {
|
void preferences_load_callback(json_t *root) {
|
||||||
|
@ -180,30 +236,42 @@ void preferences_load_callback(json_t *root) {
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:s}", "client.debug.level", &s1) == 0) {
|
if (json_unpack_ex(root, &up_error, 0, "{s:s}", "client.debug.level", &s1) == 0) {
|
||||||
strncpy(tempStr, s1, sizeof(tempStr) - 1);
|
strncpy(tempStr, s1, sizeof(tempStr) - 1);
|
||||||
str_lower(tempStr);
|
str_lower(tempStr);
|
||||||
if (strncmp(tempStr, "off", 3) == 0) session.client_debug_level = OFF;
|
if (strncmp(tempStr, "off", 3) == 0) session.client_debug_level = cdbOFF;
|
||||||
if (strncmp(tempStr, "simple", 6) == 0) session.client_debug_level = SIMPLE;
|
if (strncmp(tempStr, "simple", 6) == 0) session.client_debug_level = cdbSIMPLE;
|
||||||
if (strncmp(tempStr, "full", 4) == 0) session.client_debug_level = FULL;
|
if (strncmp(tempStr, "full", 4) == 0) session.client_debug_level = cdbFULL;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
// default save path
|
||||||
|
if (json_unpack_ex(root, &up_error, 0, "{s:s}", "file.default.savepath", &s1) == 0)
|
||||||
|
setDefaultPath (spDefault,s1);
|
||||||
|
|
||||||
|
// default dump path
|
||||||
|
if (json_unpack_ex(root, &up_error, 0, "{s:s}", "file.default.dumppath", &s1) == 0)
|
||||||
|
setDefaultPath (spDump,s1);
|
||||||
|
|
||||||
|
// default trace path
|
||||||
|
if (json_unpack_ex(root, &up_error, 0, "{s:s}", "file.default.tracepath", &s1) == 0)
|
||||||
|
setDefaultPath (spTrace,s1);
|
||||||
|
*/
|
||||||
// window plot
|
// window plot
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.plot.xpos", &i1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.plot.xpos", &i1) == 0)
|
||||||
session.window_plot_xpos = i1;
|
session.plot.x = i1;
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.plot.ypos", &i1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.plot.ypos", &i1) == 0)
|
||||||
session.window_plot_ypos = i1;
|
session.plot.y = i1;
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.plot.hsize", &i1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.plot.hsize", &i1) == 0)
|
||||||
session.window_plot_hsize = i1;
|
session.plot.h = i1;
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.plot.wsize", &i1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.plot.wsize", &i1) == 0)
|
||||||
session.window_plot_wsize = i1;
|
session.plot.w = i1;
|
||||||
|
|
||||||
// overlay/slider plot
|
// overlay/slider plot
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.xpos", &i1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.xpos", &i1) == 0)
|
||||||
session.window_overlay_xpos = i1;
|
session.overlay.x = i1;
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.ypos", &i1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.ypos", &i1) == 0)
|
||||||
session.window_overlay_ypos = i1;
|
session.overlay.y = i1;
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.hsize", &i1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.hsize", &i1) == 0)
|
||||||
session.window_overlay_hsize = i1;
|
session.overlay.h = i1;
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.wsize", &i1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:i}", "window.overlay.wsize", &i1) == 0)
|
||||||
session.window_overlay_wsize = i1;
|
session.overlay.w = i1;
|
||||||
|
|
||||||
// show options
|
// show options
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:s}", "show.emoji", &s1) == 0) {
|
if (json_unpack_ex(root, &up_error, 0, "{s:s}", "show.emoji", &s1) == 0) {
|
||||||
|
@ -220,7 +288,18 @@ void preferences_load_callback(json_t *root) {
|
||||||
|
|
||||||
if (json_unpack_ex(root, &up_error, 0, "{s:b}", "os.supports.colors", &b1) == 0)
|
if (json_unpack_ex(root, &up_error, 0, "{s:b}", "os.supports.colors", &b1) == 0)
|
||||||
session.supports_colors = b1;
|
session.supports_colors = b1;
|
||||||
|
/*
|
||||||
|
// Logging Level
|
||||||
|
if (json_unpack_ex(root, &up_error, 0, "{s:s}", "device.debug.level", &s1) == 0) {
|
||||||
|
strncpy(tempStr, s1, sizeof(tempStr) - 1);
|
||||||
|
str_lower(tempStr);
|
||||||
|
if (strncmp(tempStr, "off", 3) == 0) session.device_debug_level = ddbOFF;
|
||||||
|
if (strncmp(tempStr, "error", 5) == 0) session.device_debug_level = ddbERROR;
|
||||||
|
if (strncmp(tempStr, "info", 4) == 0) session.device_debug_level = ddbINFO;
|
||||||
|
if (strncmp(tempStr, "debug", 5) == 0) session.device_debug_level = ddbDEBUG;
|
||||||
|
if (strncmp(tempStr, "extended", 8) == 0) session.device_debug_level = ddbEXTENDED;
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// Help Functions
|
// Help Functions
|
||||||
|
@ -248,7 +327,7 @@ static int usage_set_color() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usage_set_debug() {
|
static int usage_set_debug() {
|
||||||
PrintAndLogEx(NORMAL, "Usage: pref set debug <off | simple | full>");
|
PrintAndLogEx(NORMAL, "Usage: pref set clientdebug <off | simple | full>");
|
||||||
PrintAndLogEx(NORMAL, "Options:");
|
PrintAndLogEx(NORMAL, "Options:");
|
||||||
PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help");
|
PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help");
|
||||||
PrintAndLogEx(NORMAL, " "_GREEN_("off")" - no debug messages");
|
PrintAndLogEx(NORMAL, " "_GREEN_("off")" - no debug messages");
|
||||||
|
@ -257,6 +336,20 @@ static int usage_set_debug() {
|
||||||
|
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
static int usage_set_devicedebug() {
|
||||||
|
PrintAndLogEx(NORMAL, "Usage: pref set devicedebug <off | error | info | debug | extended>");
|
||||||
|
PrintAndLogEx(NORMAL, "Options:");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("off")" - no debug messages");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("error")" - error messages");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("info")" - info messages");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("debug")" - debug messages");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("extended")" - extended debug messages");
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
*/
|
||||||
static int usage_set_hints() {
|
static int usage_set_hints() {
|
||||||
PrintAndLogEx(NORMAL, "Usage: pref set hints <off | on>");
|
PrintAndLogEx(NORMAL, "Usage: pref set hints <off | on>");
|
||||||
PrintAndLogEx(NORMAL, "Options:");
|
PrintAndLogEx(NORMAL, "Options:");
|
||||||
|
@ -266,17 +359,30 @@ static int usage_set_hints() {
|
||||||
|
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
static int usage_set_savePaths() {
|
||||||
|
PrintAndLogEx(NORMAL, "Usage: pref set savepaths [help] [create] [default <path>] [dump <path>] [trace <path>]");
|
||||||
|
PrintAndLogEx(NORMAL, "Options:");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("create")" - Create directory if it does not exist");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("default")" - Deafult path");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("dump")" - Dump path");
|
||||||
|
PrintAndLogEx(NORMAL, " "_GREEN_("trace")" - Trace help");
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
*/
|
||||||
// Preference Processing Functions
|
// Preference Processing Functions
|
||||||
typedef enum preferenceId {prefNONE, prefHELP, prefEMOJI, prefCOLOR, prefPLOT, prefOVERLAY, prefHINTS, prefCLIENTDEBUG} preferenceId_t;
|
// typedef enum preferenceId {prefNONE,prefHELP,prefEMOJI,prefCOLOR,prefPLOT,prefOVERLAY,prefHINTS,prefCLIENTDEBUG} preferenceId_t;
|
||||||
typedef enum prefShowOpt {prefShowNone, prefShowOLD, prefShowNEW} prefShowOpt_t;
|
typedef enum prefShowOpt {prefShowNone, prefShowOLD, prefShowNEW} prefShowOpt_t;
|
||||||
|
|
||||||
const char *prefShowMsg(prefShowOpt_t Opt) {
|
const char *prefShowMsg(prefShowOpt_t Opt)
|
||||||
|
{
|
||||||
switch (Opt) {
|
switch (Opt) {
|
||||||
case prefShowOLD:
|
case prefShowOLD:
|
||||||
return _YELLOW_("[old]"); //strncpy(Msg,"Before ",sizeof(Msg)-1); break;
|
return _YELLOW_("[old]");
|
||||||
case prefShowNEW:
|
case prefShowNEW:
|
||||||
return _GREEN_("[new]"); // strncpy(Msg,"After ",sizeof(Msg)-1); break;
|
return _GREEN_("[new]");
|
||||||
case prefShowNone:
|
case prefShowNone:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
@ -309,41 +415,87 @@ void showColorState(prefShowOpt_t Opt) {
|
||||||
if (session.supports_colors)
|
if (session.supports_colors)
|
||||||
PrintAndLogEx(NORMAL, " %s color.................. "_GREEN_("ansi"), prefShowMsg(Opt));
|
PrintAndLogEx(NORMAL, " %s color.................. "_GREEN_("ansi"), prefShowMsg(Opt));
|
||||||
else
|
else
|
||||||
PrintAndLogEx(NORMAL, " %s color.................. "_GREEN_("off"), prefShowMsg(Opt));
|
PrintAndLogEx(NORMAL, " %s color.................. "_WHITE_("off"), prefShowMsg(Opt));
|
||||||
}
|
}
|
||||||
|
|
||||||
void showClientDebugState(prefShowOpt_t Opt) {
|
void showClientDebugState(prefShowOpt_t Opt) {
|
||||||
|
|
||||||
switch (session.client_debug_level) {
|
switch (session.client_debug_level) {
|
||||||
case OFF:
|
case cdbOFF:
|
||||||
PrintAndLogEx(NORMAL, " %s client debug........... "_GREEN_("off"), prefShowMsg(Opt));
|
PrintAndLogEx(NORMAL, " %s client debug........... "_WHITE_("off"), prefShowMsg(Opt));
|
||||||
break;
|
break;
|
||||||
case SIMPLE:
|
case cdbSIMPLE:
|
||||||
PrintAndLogEx(NORMAL, " %s client debug........... "_GREEN_("simple"), prefShowMsg(Opt));
|
PrintAndLogEx(NORMAL, " %s client debug........... "_GREEN_("simple"), prefShowMsg(Opt));
|
||||||
break;
|
break;
|
||||||
case FULL:
|
case cdbFULL:
|
||||||
PrintAndLogEx(NORMAL, " %s client debug........... "_GREEN_("full"), prefShowMsg(Opt));
|
PrintAndLogEx(NORMAL, " %s client debug........... "_GREEN_("full"), prefShowMsg(Opt));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
PrintAndLogEx(NORMAL, " %s client debug........... "_RED_("unknown"), prefShowMsg(Opt));
|
PrintAndLogEx(NORMAL, " %s client debug........... "_RED_("unknown"), prefShowMsg(Opt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
void showDeviceDebugState(prefShowOpt_t Opt) {
|
||||||
|
switch (session.device_debug_level) {
|
||||||
|
case ddbOFF:
|
||||||
|
PrintAndLogEx(NORMAL, " %s device debug........... "_WHITE_("off"), prefShowMsg(Opt));
|
||||||
|
break;
|
||||||
|
case ddbERROR:
|
||||||
|
PrintAndLogEx(NORMAL, " %s device debug........... "_GREEN_("error"), prefShowMsg(Opt));
|
||||||
|
break;
|
||||||
|
case ddbINFO:
|
||||||
|
PrintAndLogEx(NORMAL, " %s device debug........... "_GREEN_("info"), prefShowMsg(Opt));
|
||||||
|
break;
|
||||||
|
case ddbDEBUG:
|
||||||
|
PrintAndLogEx(NORMAL, " %s device debug........... "_GREEN_("debug"), prefShowMsg(Opt));
|
||||||
|
break;
|
||||||
|
case ddbEXTENDED:
|
||||||
|
PrintAndLogEx(NORMAL, " %s device debug........... "_GREEN_("extended"), prefShowMsg(Opt));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PrintAndLogEx(NORMAL, " %s device debug........... "_RED_("unknown"), prefShowMsg(Opt));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
void showSavePathState(savePaths_t pathIndex, prefShowOpt_t Opt) {
|
||||||
|
|
||||||
void showPlotPosState(void) {
|
char tempStr[50];
|
||||||
|
|
||||||
|
switch (pathIndex) {
|
||||||
|
case spDefault:
|
||||||
|
strcpy (tempStr,"default save path......");
|
||||||
|
break;
|
||||||
|
case spDump:
|
||||||
|
strcpy (tempStr,"dump save path.........");
|
||||||
|
break;
|
||||||
|
case spTrace:
|
||||||
|
strcpy (tempStr,"trace save path........");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
strcpy (tempStr,_RED_("unknown")" save path......");
|
||||||
|
}
|
||||||
|
if ((session.defaultPaths[pathIndex] == NULL) || (strcmp(session.defaultPaths[pathIndex],"") == 0))
|
||||||
|
PrintAndLogEx(NORMAL, " %s %s "_WHITE_("not set"), prefShowMsg(Opt),tempStr);
|
||||||
|
else
|
||||||
|
PrintAndLogEx(NORMAL, " %s %s "_GREEN_("%s"), prefShowMsg(Opt), tempStr, session.defaultPaths[pathIndex]);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
void showPlotPosState(void){
|
||||||
PrintAndLogEx(NORMAL, " Plot window............ X "_GREEN_("%4d")" Y "_GREEN_("%4d")" H "_GREEN_("%4d")" W "_GREEN_("%4d"),
|
PrintAndLogEx(NORMAL, " Plot window............ X "_GREEN_("%4d")" Y "_GREEN_("%4d")" H "_GREEN_("%4d")" W "_GREEN_("%4d"),
|
||||||
session.window_plot_xpos, session.window_plot_ypos, session.window_plot_hsize, session.window_plot_wsize);
|
session.plot.x, session.plot.y, session.plot.h, session.plot.w);
|
||||||
}
|
}
|
||||||
|
|
||||||
void showOverlayPosState(void) {
|
void showOverlayPosState(void) {
|
||||||
PrintAndLogEx(NORMAL, " Slider/Overlay window.. X "_GREEN_("%4d")" Y "_GREEN_("%4d")" H "_GREEN_("%4d")" W "_GREEN_("%4d"),
|
PrintAndLogEx(NORMAL, " Slider/Overlay window.. X "_GREEN_("%4d")" Y "_GREEN_("%4d")" H "_GREEN_("%4d")" W "_GREEN_("%4d"),
|
||||||
session.window_overlay_xpos, session.window_overlay_ypos, session.window_overlay_hsize, session.window_overlay_wsize);
|
session.overlay.x, session.overlay.y, session.overlay.h, session.overlay.w);
|
||||||
}
|
}
|
||||||
|
|
||||||
void showHintsState(prefShowOpt_t Opt) {
|
void showHintsState(prefShowOpt_t Opt) {
|
||||||
if (session.show_hints)
|
if (session.show_hints)
|
||||||
PrintAndLogEx(NORMAL, " %s Hints.................. "_GREEN_("on"), prefShowMsg(Opt));
|
PrintAndLogEx(NORMAL, " %s hints.................. "_GREEN_("on"), prefShowMsg(Opt));
|
||||||
else
|
else
|
||||||
PrintAndLogEx(NORMAL, " %s Hints.................. "_GREEN_("off"), prefShowMsg(Opt));
|
PrintAndLogEx(NORMAL, " %s hints.................. "_WHITE_("off"), prefShowMsg(Opt));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int setCmdEmoji(const char *Cmd) {
|
static int setCmdEmoji(const char *Cmd) {
|
||||||
|
@ -465,15 +617,15 @@ static int setCmdDebug(const char *Cmd) {
|
||||||
return usage_set_debug();
|
return usage_set_debug();
|
||||||
if (strncmp(strOpt, "off", 3) == 0) {
|
if (strncmp(strOpt, "off", 3) == 0) {
|
||||||
validValue = true;
|
validValue = true;
|
||||||
newValue = OFF;
|
newValue = cdbOFF;
|
||||||
}
|
}
|
||||||
if (strncmp(strOpt, "simple", 6) == 0) {
|
if (strncmp(strOpt, "simple", 6) == 0) {
|
||||||
validValue = true;
|
validValue = true;
|
||||||
newValue = SIMPLE;
|
newValue = cdbSIMPLE;
|
||||||
}
|
}
|
||||||
if (strncmp(strOpt, "full", 4) == 0) {
|
if (strncmp(strOpt, "full", 4) == 0) {
|
||||||
validValue = true;
|
validValue = true;
|
||||||
newValue = FULL;
|
newValue = cdbFULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (validValue) {
|
if (validValue) {
|
||||||
|
@ -496,8 +648,75 @@ static int setCmdDebug(const char *Cmd) {
|
||||||
|
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
static int setCmdDeviceDebug (const char *Cmd)
|
||||||
|
{
|
||||||
|
uint8_t cmdp = 0;
|
||||||
|
bool errors = false;
|
||||||
|
bool validValue = false;
|
||||||
|
char strOpt[50];
|
||||||
|
devicedebugLevel_t newValue = session.device_debug_level;
|
||||||
|
|
||||||
static int setCmdHint(const char *Cmd) {
|
if (param_getchar(Cmd, cmdp) == 0x00)
|
||||||
|
return usage_set_devicedebug ();
|
||||||
|
|
||||||
|
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_devicedebug();
|
||||||
|
if (strncmp (strOpt,"off",3) == 0) {
|
||||||
|
validValue = true;
|
||||||
|
newValue = ddbOFF;
|
||||||
|
}
|
||||||
|
if (strncmp (strOpt,"error",5) == 0) {
|
||||||
|
validValue = true;
|
||||||
|
newValue = ddbERROR;
|
||||||
|
}
|
||||||
|
if (strncmp (strOpt,"info",4) == 0) {
|
||||||
|
validValue = true;
|
||||||
|
newValue = ddbINFO;
|
||||||
|
}
|
||||||
|
if (strncmp (strOpt,"debug",5) == 0) {
|
||||||
|
validValue = true;
|
||||||
|
newValue = ddbDEBUG;
|
||||||
|
}
|
||||||
|
if (strncmp (strOpt,"extended",8) == 0) {
|
||||||
|
validValue = true;
|
||||||
|
newValue = ddbEXTENDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validValue) {
|
||||||
|
if (session.device_debug_level != newValue) {// changed
|
||||||
|
showDeviceDebugState (prefShowOLD);
|
||||||
|
session.device_debug_level = newValue;
|
||||||
|
showDeviceDebugState (prefShowNEW);
|
||||||
|
preferences_save ();
|
||||||
|
} else {
|
||||||
|
PrintAndLogEx(INFO,"nothing changed");
|
||||||
|
showDeviceDebugState (prefShowNone);
|
||||||
|
}
|
||||||
|
if (session.pm3_present) {
|
||||||
|
PrintAndLogEx (INFO,"setting device debug loglevel");
|
||||||
|
SendCommandNG(CMD_SET_DBGMODE, &session.device_debug_level, 1);
|
||||||
|
PacketResponseNG resp;
|
||||||
|
if (WaitForResponseTimeout(CMD_SET_DBGMODE, &resp, 2000) == false)
|
||||||
|
PrintAndLogEx (INFO,"failed to set device debug loglevel");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PrintAndLogEx(ERR,"invalid option");
|
||||||
|
return usage_set_devicedebug();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
static int setCmdHint (const char *Cmd)
|
||||||
|
{
|
||||||
uint8_t cmdp = 0;
|
uint8_t cmdp = 0;
|
||||||
bool errors = false;
|
bool errors = false;
|
||||||
bool validValue = false;
|
bool validValue = false;
|
||||||
|
@ -542,17 +761,147 @@ static int setCmdHint(const char *Cmd) {
|
||||||
|
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
static int setCmdSavePaths (const char *Cmd) {
|
||||||
|
uint8_t cmdp = 0;
|
||||||
|
bool errors = false;
|
||||||
|
// bool validValue = false;
|
||||||
|
char *strOpt = NULL;
|
||||||
|
int optLen = 0;
|
||||||
|
char *newValue = NULL;
|
||||||
|
bool createDir = false;
|
||||||
|
savePaths_t pathItem = spItemCount;
|
||||||
|
|
||||||
|
|
||||||
|
if (param_getchar(Cmd, cmdp) == 0x00)
|
||||||
|
return usage_set_savePaths();
|
||||||
|
|
||||||
|
while ((param_getchar(Cmd, cmdp) != 0x00) && !errors) {
|
||||||
|
|
||||||
|
optLen = param_getlength(Cmd, cmdp)+1;
|
||||||
|
strOpt = (char *)realloc(strOpt,optLen+1);//, sizeof(uint8_t));
|
||||||
|
|
||||||
|
if (param_getstr(Cmd, cmdp++, strOpt, optLen) != 0) {
|
||||||
|
str_lower(strOpt); // convert to lowercase
|
||||||
|
|
||||||
|
if (strncmp(strOpt, "help", 4) == 0)
|
||||||
|
return usage_set_savePaths();
|
||||||
|
|
||||||
|
if (strncmp(strOpt, "create", 6) == 0) {
|
||||||
|
// check if 2 more options.
|
||||||
|
if (param_getlength(Cmd, cmdp+1) == 0) // should have min 2 more options
|
||||||
|
return usage_set_savePaths();
|
||||||
|
createDir = true;
|
||||||
|
} else {
|
||||||
|
if ((strncmp(strOpt, "default", 7) == 0) ||
|
||||||
|
(strncmp(strOpt, "dump", 4) == 0) ||
|
||||||
|
(strncmp(strOpt, "trace", 5) == 0)) {
|
||||||
|
|
||||||
|
// Get Path
|
||||||
|
optLen = param_getlength(Cmd, cmdp) + 1;
|
||||||
|
newValue = (char *)realloc(newValue, optLen+1);
|
||||||
|
if (param_getstr(Cmd, cmdp++, newValue, optLen) == 0) {
|
||||||
|
PrintAndLogEx(INFO, "missing %s path",strOpt);
|
||||||
|
return usage_set_savePaths();
|
||||||
|
}
|
||||||
|
// remove trailing slash.
|
||||||
|
if ((newValue[strlen(newValue)-1] == '/') || (newValue[strlen(newValue)-1] == '\\'))
|
||||||
|
newValue[strlen(newValue)-1] = 0x00;
|
||||||
|
|
||||||
|
// Check path
|
||||||
|
if (!fileExists(newValue) && !createDir) {
|
||||||
|
PrintAndLogEx(ERR,"path does not exist... "_RED_("%s"),newValue);
|
||||||
|
} else {
|
||||||
|
// do we need to create it
|
||||||
|
// if (!fileExists(newValue))
|
||||||
|
// create_path (newValue); //mkdir (newValue,0x777);
|
||||||
|
|
||||||
|
pathItem = spItemCount;
|
||||||
|
if (strncmp(strOpt, "default", 7) == 0) pathItem = spDefault;
|
||||||
|
if (strncmp(strOpt, "dump", 4) == 0) pathItem = spDump;
|
||||||
|
if (strncmp(strOpt, "trace", 5) == 0) pathItem = spTrace;
|
||||||
|
|
||||||
|
if (pathItem < spItemCount) {
|
||||||
|
if (strcmp(newValue, session.defaultPaths[pathItem]) != 0) {
|
||||||
|
showSavePathState(pathItem, prefShowOLD);
|
||||||
|
setDefaultPath (pathItem, newValue);
|
||||||
|
showSavePathState(pathItem, prefShowNEW);
|
||||||
|
preferences_save();
|
||||||
|
} else {
|
||||||
|
PrintAndLogEx(INFO, "nothing changed");
|
||||||
|
showSavePathState(pathItem, prefShowNone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return usage_set_savePaths();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// clean up
|
||||||
|
if (strOpt != NULL) free (strOpt);
|
||||||
|
if (newValue != NULL) free (newValue);
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
int getCmdHelp (const char *Cmd) {
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getCmdEmoji (const char *Cmd) {
|
||||||
|
|
||||||
|
showEmojiState(prefShowNone);
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getCmdHint (const char *Cmd) {
|
||||||
|
|
||||||
|
showHintsState(prefShowNone);
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getCmdColor (const char *Cmd) {
|
||||||
|
|
||||||
|
showColorState(prefShowNone);
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getCmdDebug (const char *Cmd) {
|
||||||
|
|
||||||
|
showClientDebugState(prefShowNone);
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static command_t getCommandTable[] = {
|
||||||
|
// {"help", getCmdHelp, AlwaysAvailable, "This help"},
|
||||||
|
{"emoji", getCmdEmoji, AlwaysAvailable, "Get emoji display preference"},
|
||||||
|
{"hints", getCmdHint, AlwaysAvailable, "Get hint display preference"},
|
||||||
|
{"color", getCmdColor, AlwaysAvailable, "Get color support preference"},
|
||||||
|
// {"defaultsavepaths", getCmdSavePaths, AlwaysAvailable, "... to be adjusted next ... "},
|
||||||
|
{"clientdebug", getCmdDebug, AlwaysAvailable, "Get client debug level preference"},
|
||||||
|
// {"devicedebug", getCmdDeviceDebug, AlwaysAvailable, "Get device debug level"},
|
||||||
|
{NULL, NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
static command_t setCommandTable[] = {
|
static command_t setCommandTable[] = {
|
||||||
{"help", setCmdHelp, AlwaysAvailable, "This help"},
|
{"help", setCmdHelp, AlwaysAvailable, "This help"},
|
||||||
{"emoji", setCmdEmoji, AlwaysAvailable, "Set emoji display"},
|
{"emoji", setCmdEmoji, AlwaysAvailable, "Set emoji display"},
|
||||||
{"color", setCmdColor, AlwaysAvailable, "Set color support"},
|
|
||||||
{"debug", setCmdDebug, AlwaysAvailable, "Set client debug level"},
|
|
||||||
{"hints", setCmdHint, AlwaysAvailable, "Set hint display"},
|
{"hints", setCmdHint, AlwaysAvailable, "Set hint display"},
|
||||||
|
{"color", setCmdColor, AlwaysAvailable, "Set color support"},
|
||||||
|
// {"defaultsavepaths", setCmdSavePaths, AlwaysAvailable, "... to be adjusted next ... "},
|
||||||
|
{"clientdebug", setCmdDebug, AlwaysAvailable, "Set client debug level"},
|
||||||
|
// {"devicedebug", setCmdDeviceDebug, AlwaysAvailable, "Set device debug level"},
|
||||||
{NULL, NULL, NULL, NULL}
|
{NULL, NULL, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int setCmdHelp(const char *Cmd) {
|
static int setCmdHelp(const char *Cmd) {
|
||||||
(void)Cmd; // Cmd is not used so far
|
(void)Cmd; // Cmd is not used so far
|
||||||
CmdsHelp(setCommandTable);
|
CmdsHelp(setCommandTable);
|
||||||
|
@ -560,6 +909,12 @@ static int setCmdHelp(const char *Cmd) {
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CmdPrefGet(const char *Cmd) {
|
||||||
|
clearCommandBuffer();
|
||||||
|
|
||||||
|
return CmdsParse(getCommandTable, Cmd);
|
||||||
|
}
|
||||||
|
|
||||||
int CmdPrefSet(const char *Cmd) {
|
int CmdPrefSet(const char *Cmd) {
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
|
|
||||||
|
@ -569,21 +924,25 @@ int CmdPrefSet(const char *Cmd) {
|
||||||
static int CmdPrefShow(const char *Cmd) {
|
static int CmdPrefShow(const char *Cmd) {
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "");
|
PrintAndLogEx(NORMAL, "");
|
||||||
PrintAndLogEx(NORMAL, _BLUE_("Preferences"));
|
PrintAndLogEx(NORMAL, _CYAN_("Preferences loaded from %s"),prefGetFilename());
|
||||||
|
|
||||||
if (!session. preferences_loaded) {
|
if (!session.preferences_loaded) {
|
||||||
PrintAndLogEx(ERR, "Preferneces not loaded");
|
PrintAndLogEx (ERR, "Preferneces not loaded");
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, " preference file........ "_GREEN_("%s"), prefGetFilename());
|
// PrintAndLogEx(NORMAL, " preference file........ "_GREEN_("%s"), prefGetFilename());
|
||||||
showEmojiState(prefShowNone);
|
showEmojiState(prefShowNone);
|
||||||
|
showHintsState(prefShowNone);
|
||||||
showColorState(prefShowNone);
|
showColorState(prefShowNone);
|
||||||
// showPlotPosState ();
|
// showPlotPosState ();
|
||||||
// showOverlayPosState ();
|
// showOverlayPosState ();
|
||||||
showClientDebugState(prefShowNone);
|
// showSavePathState(spDefault, prefShowNone);
|
||||||
showHintsState(prefShowNone);
|
// showSavePathState(spDump, prefShowNone);
|
||||||
|
// showSavePathState(spTrace, prefShowNone);
|
||||||
|
|
||||||
|
showClientDebugState(prefShowNone);
|
||||||
|
// showDeviceDebugState(prefShowNone);
|
||||||
PrintAndLogEx(NORMAL, "");
|
PrintAndLogEx(NORMAL, "");
|
||||||
|
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
|
@ -597,9 +956,9 @@ static int CmdPrefSave (const char *Cmd) {
|
||||||
*/
|
*/
|
||||||
static command_t CommandTable[] = {
|
static command_t CommandTable[] = {
|
||||||
{"help", CmdHelp, AlwaysAvailable, "This help"},
|
{"help", CmdHelp, AlwaysAvailable, "This help"},
|
||||||
|
{"get", CmdPrefGet, AlwaysAvailable, "Get a preference"},
|
||||||
{"set", CmdPrefSet, AlwaysAvailable, "Set a preference"},
|
{"set", CmdPrefSet, AlwaysAvailable, "Set a preference"},
|
||||||
{"show", CmdPrefShow, AlwaysAvailable, "Show preferences"},
|
{"show", CmdPrefShow, AlwaysAvailable, "Show all preferences"},
|
||||||
// {"save", CmdPrefSave, AlwaysAvailable, "Save preferences now"},
|
|
||||||
{NULL, NULL, NULL, NULL}
|
{NULL, NULL, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#define PREFERENCES_H_
|
#define PREFERENCES_H_
|
||||||
|
|
||||||
#include "fileutils.h"
|
#include "fileutils.h"
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
// Current working directory will be prepended.
|
// Current working directory will be prepended.
|
||||||
#define preferencesFilename "preferences.json"
|
#define preferencesFilename "preferences.json"
|
||||||
|
|
|
@ -139,21 +139,21 @@ ProxGuiQT::~ProxGuiQT(void) {
|
||||||
SliderWidget::SliderWidget() {
|
SliderWidget::SliderWidget() {
|
||||||
// Set the initail postion and size from settings
|
// Set the initail postion and size from settings
|
||||||
if (session.preferences_loaded)
|
if (session.preferences_loaded)
|
||||||
setGeometry(session.window_overlay_xpos, session.window_overlay_ypos, session.window_overlay_wsize, session.window_overlay_hsize);
|
setGeometry(session.overlay.x, session.overlay.y, session.overlay.w, session.overlay.h);
|
||||||
else
|
else
|
||||||
resize(800, 400);
|
resize(800, 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SliderWidget::resizeEvent(QResizeEvent *event) {
|
void SliderWidget::resizeEvent(QResizeEvent *event) {
|
||||||
session.window_overlay_hsize = event->size().height();
|
session.overlay.h = event->size().height();
|
||||||
session.window_overlay_wsize = event->size().width();
|
session.overlay.w = event->size().width();
|
||||||
session.window_changed = true;
|
session.window_changed = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SliderWidget::moveEvent(QMoveEvent *event) {
|
void SliderWidget::moveEvent(QMoveEvent *event) {
|
||||||
session.window_overlay_xpos = event->pos().x();
|
session.overlay.x = event->pos().x();
|
||||||
session.window_overlay_ypos = event->pos().y();
|
session.overlay.y = event->pos().y();
|
||||||
session.window_changed = true;
|
session.window_changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) {
|
||||||
this->master = master;
|
this->master = master;
|
||||||
// Set the initail postion and size from settings
|
// Set the initail postion and size from settings
|
||||||
if (session.preferences_loaded)
|
if (session.preferences_loaded)
|
||||||
setGeometry(session.window_plot_xpos, session.window_plot_ypos, session.window_plot_wsize, session.window_plot_hsize);
|
setGeometry(session.plot.x, session.plot.y, session.plot.w, session.plot.h);
|
||||||
else
|
else
|
||||||
resize(800, 400);
|
resize(800, 400);
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) {
|
||||||
QObject::connect(opsController->horizontalSlider_dirthr_down, SIGNAL(valueChanged(int)), this, SLOT(vchange_dthr_down(int)));
|
QObject::connect(opsController->horizontalSlider_dirthr_down, SIGNAL(valueChanged(int)), this, SLOT(vchange_dthr_down(int)));
|
||||||
QObject::connect(opsController->horizontalSlider_askedge, SIGNAL(valueChanged(int)), this, SLOT(vchange_askedge(int)));
|
QObject::connect(opsController->horizontalSlider_askedge, SIGNAL(valueChanged(int)), this, SLOT(vchange_askedge(int)));
|
||||||
|
|
||||||
controlWidget->setGeometry(session.window_overlay_xpos, session.window_overlay_ypos, session.window_overlay_wsize, session.window_overlay_hsize);
|
controlWidget->setGeometry(session.overlay.x, session.overlay.y, session.overlay.w, session.overlay.h);
|
||||||
|
|
||||||
// Set up the plot widget, which does the actual plotting
|
// Set up the plot widget, which does the actual plotting
|
||||||
plot = new Plot(this);
|
plot = new Plot(this);
|
||||||
|
@ -292,13 +292,13 @@ void ProxWidget::showEvent(QShowEvent *event) {
|
||||||
plot->show();
|
plot->show();
|
||||||
}
|
}
|
||||||
void ProxWidget::moveEvent(QMoveEvent *event) {
|
void ProxWidget::moveEvent(QMoveEvent *event) {
|
||||||
session.window_plot_xpos = event->pos().x();
|
session.plot.x = event->pos().x();
|
||||||
session.window_plot_ypos = event->pos().y();
|
session.plot.y = event->pos().y();
|
||||||
session.window_changed = true;
|
session.window_changed = true;
|
||||||
}
|
}
|
||||||
void ProxWidget::resizeEvent(QResizeEvent *event) {
|
void ProxWidget::resizeEvent(QResizeEvent *event) {
|
||||||
session.window_plot_hsize = event->size().height();
|
session.plot.h = event->size().height();
|
||||||
session.window_plot_wsize = event->size().width();
|
session.plot.w = event->size().width();
|
||||||
session.window_changed = true;
|
session.window_changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Used to enable/disable use of preferences json file
|
// Used to enable/disable use of preferences json file
|
||||||
// #define USE_PREFERENCE_FILE
|
#define USE_PREFERENCE_FILE
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
@ -412,13 +412,14 @@ static void set_my_executable_path(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *my_user_directory = NULL;
|
static const char *my_user_directory = NULL;
|
||||||
static char _cwd_Buffer [FILENAME_MAX] = {0};
|
// static char _cwd_Buffer [FILENAME_MAX] = {0};
|
||||||
|
|
||||||
const char *get_my_user_directory(void) {
|
const char *get_my_user_directory(void) {
|
||||||
return my_user_directory;
|
return my_user_directory;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_my_user_directory(void) {
|
static void set_my_user_directory(void) {
|
||||||
my_user_directory = getenv("HOME");
|
/* my_user_directory = getenv("HOME");
|
||||||
|
|
||||||
// if not found, default to current directory
|
// if not found, default to current directory
|
||||||
if (my_user_directory == NULL) {
|
if (my_user_directory == NULL) {
|
||||||
|
@ -428,6 +429,38 @@ static void set_my_user_directory(void) {
|
||||||
if (_cwd_Buffer[i] == '\\') _cwd_Buffer[i] = '/';
|
if (_cwd_Buffer[i] == '\\') _cwd_Buffer[i] = '/';
|
||||||
// my_user_directory = ".";
|
// my_user_directory = ".";
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
my_user_directory = getenv("HOME");
|
||||||
|
|
||||||
|
// if not found, default to current directory
|
||||||
|
if (my_user_directory == NULL) {
|
||||||
|
|
||||||
|
char *cwd_Buffer = NULL;
|
||||||
|
uint16_t pathLen = FILENAME_MAX; // should be a good starting point
|
||||||
|
bool error = false;
|
||||||
|
|
||||||
|
cwd_Buffer = (char *)calloc(pathLen, sizeof(uint8_t));
|
||||||
|
|
||||||
|
while (!error && (GetCurrentDir (cwd_Buffer,pathLen) == NULL)) {
|
||||||
|
if (errno == ERANGE) { // Need bigger buffer
|
||||||
|
pathLen += 10; // if buffer was too small add 10 characters and try again
|
||||||
|
cwd_Buffer = realloc(cwd_Buffer, pathLen);
|
||||||
|
} else {
|
||||||
|
error = true;
|
||||||
|
free (cwd_Buffer);
|
||||||
|
cwd_Buffer = NULL;
|
||||||
|
}
|
||||||
|
printf ("Len... %d\n",pathLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!error) {
|
||||||
|
|
||||||
|
for (int i = 0; i < strlen(cwd_Buffer); i++)
|
||||||
|
if (cwd_Buffer[i] == '\\') cwd_Buffer[i] = '/';
|
||||||
|
|
||||||
|
my_user_directory = cwd_Buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_help(bool showFullHelp, char *exec_name) {
|
static void show_help(bool showFullHelp, char *exec_name) {
|
||||||
|
@ -668,10 +701,6 @@ int main(int argc, char *argv[]) {
|
||||||
// Load Settings and assign
|
// Load Settings and assign
|
||||||
// This will allow the command line to override the settings.json values
|
// This will allow the command line to override the settings.json values
|
||||||
preferences_load();
|
preferences_load();
|
||||||
// Change height/width (Rows,Cols) - Testing
|
|
||||||
// printf ("\e[8;50;100t");
|
|
||||||
// printf ("\e[3;50;50t"); // x,y
|
|
||||||
//printf ("Path : %s \n",my_user_directory);
|
|
||||||
// quick patch for debug level
|
// quick patch for debug level
|
||||||
g_debugMode = session.client_debug_level;
|
g_debugMode = session.client_debug_level;
|
||||||
// settings_save ();
|
// settings_save ();
|
||||||
|
@ -877,6 +906,12 @@ int main(int argc, char *argv[]) {
|
||||||
session.supports_colors = true;
|
session.supports_colors = true;
|
||||||
session.emoji_mode = EMOJI;
|
session.emoji_mode = EMOJI;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// even if prefs, we disable colors if stdin or stdout is not a TTY
|
||||||
|
if ((! session.stdinOnTTY) || (! session.stdoutOnTTY)) {
|
||||||
|
session.supports_colors = false;
|
||||||
|
session.emoji_mode = ALTTEXT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (session.stdinOnTTY && session.stdoutOnTTY) {
|
if (session.stdinOnTTY && session.stdoutOnTTY) {
|
||||||
|
@ -945,9 +980,22 @@ int main(int argc, char *argv[]) {
|
||||||
// Doing this here will ensure other checks and updates are saved to over rule default
|
// Doing this here will ensure other checks and updates are saved to over rule default
|
||||||
// e.g. Linux color use check
|
// e.g. Linux color use check
|
||||||
if (!session.preferences_loaded) {
|
if (!session.preferences_loaded) {
|
||||||
|
PrintAndLogEx (INFO,"Creating initial preferences file"); // json save reports file name, so just info msg here
|
||||||
preferences_save(); // Save defaults
|
preferences_save(); // Save defaults
|
||||||
session.preferences_loaded = true;
|
session.preferences_loaded = true;
|
||||||
|
} /* else {
|
||||||
|
// Set device debug level
|
||||||
|
PrintAndLogEx(INFO,"setting device debug loglevel");
|
||||||
|
if (session.pm3_present) {
|
||||||
|
SendCommandNG(CMD_SET_DBGMODE, &session.device_debug_level, 1);
|
||||||
|
PacketResponseNG resp;
|
||||||
|
if (WaitForResponseTimeout(CMD_SET_DBGMODE, &resp, 2000) == false)
|
||||||
|
PrintAndLogEx (INFO,"failed to set device debug loglevel");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
PrintAndLogEx(WARNING,"Proxmark3 not ready to set debug level");
|
||||||
|
}
|
||||||
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_GUI
|
#ifdef HAVE_GUI
|
||||||
|
|
|
@ -19,7 +19,10 @@
|
||||||
|
|
||||||
typedef enum logLevel {NORMAL, SUCCESS, INFO, FAILED, WARNING, ERR, DEBUG, INPLACE, HINT} logLevel_t;
|
typedef enum logLevel {NORMAL, SUCCESS, INFO, FAILED, WARNING, ERR, DEBUG, INPLACE, HINT} logLevel_t;
|
||||||
typedef enum emojiMode {ALIAS, EMOJI, ALTTEXT, ERASE} emojiMode_t;
|
typedef enum emojiMode {ALIAS, EMOJI, ALTTEXT, ERASE} emojiMode_t;
|
||||||
typedef enum clientdebugLevel {OFF, SIMPLE, FULL} clientdebugLevel_t;
|
typedef enum clientdebugLevel {cdbOFF, cdbSIMPLE, cdbFULL} clientdebugLevel_t;
|
||||||
|
// typedef enum devicedebugLevel {ddbOFF, ddbERROR, ddbINFO, ddbDEBUG, ddbEXTENDED} devicedebugLevel_t;
|
||||||
|
//typedef enum savePaths {spDefault, spDump, spTrace, spItemCount} savePaths_t; // last item spItemCount used to auto map to number of files
|
||||||
|
typedef struct {int x; int y; int h; int w;} qtWindow_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool preferences_loaded;
|
bool preferences_loaded;
|
||||||
|
@ -31,15 +34,11 @@ typedef struct {
|
||||||
bool help_dump_mode;
|
bool help_dump_mode;
|
||||||
bool show_hints;
|
bool show_hints;
|
||||||
bool window_changed; // track if plot/overlay pos/size changed to save on exit
|
bool window_changed; // track if plot/overlay pos/size changed to save on exit
|
||||||
int window_plot_xpos;
|
qtWindow_t plot;
|
||||||
int window_plot_ypos;
|
qtWindow_t overlay;
|
||||||
int window_plot_hsize;
|
// char *defaultPaths[spItemCount]; // Array should allow loop searching for files
|
||||||
int window_plot_wsize;
|
|
||||||
int window_overlay_xpos;
|
|
||||||
int window_overlay_ypos;
|
|
||||||
int window_overlay_hsize;
|
|
||||||
int window_overlay_wsize;
|
|
||||||
clientdebugLevel_t client_debug_level;
|
clientdebugLevel_t client_debug_level;
|
||||||
|
// uint8_t device_debug_level;
|
||||||
} session_arg_t;
|
} session_arg_t;
|
||||||
|
|
||||||
extern session_arg_t session;
|
extern session_arg_t session;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue