From a813659e9d27d79da42e51c352d54b2f9e3e5805 Mon Sep 17 00:00:00 2001 From: Richard Waltman Date: Mon, 25 Jan 2021 21:39:07 -0600 Subject: [PATCH 1/2] Fix Session Settings Errors found in 5.0.2 Fixes #942 --- OpenBCI_GUI/DataProcessing.pde | 4 +-- OpenBCI_GUI/FilterEnums.pde | 44 ++++++++++++++++++++------- OpenBCI_GUI/SessionSettings.pde | 54 ++++++++++++++++++++------------- OpenBCI_GUI/TopNav.pde | 4 +++ OpenBCI_GUI/W_Spectrogram.pde | 3 -- 5 files changed, 72 insertions(+), 37 deletions(-) diff --git a/OpenBCI_GUI/DataProcessing.pde b/OpenBCI_GUI/DataProcessing.pde index 01b203cf8..6d39cbb52 100644 --- a/OpenBCI_GUI/DataProcessing.pde +++ b/OpenBCI_GUI/DataProcessing.pde @@ -93,8 +93,8 @@ class DataProcessing { float data_std_uV[]; float polarity[]; boolean newDataToSend; - BandPassRanges bpRange = BandPassRanges.FiveToFifty; - BandStopRanges bsRange = BandStopRanges.Sixty; + public BandPassRanges bpRange = BandPassRanges.FiveToFifty; + public BandStopRanges bsRange = BandStopRanges.Sixty; final int[] processing_band_low_Hz = { 1, 4, 8, 13, 30 }; //lower bound for each frequency band of interest (2D classifier only) diff --git a/OpenBCI_GUI/FilterEnums.pde b/OpenBCI_GUI/FilterEnums.pde index 65cb449fd..26d7a9ec1 100644 --- a/OpenBCI_GUI/FilterEnums.pde +++ b/OpenBCI_GUI/FilterEnums.pde @@ -1,21 +1,32 @@ public enum BandStopRanges { - Sixty(60.0d), - Fifty(50.0d), - None(null); + Sixty(0, 60.0d), + Fifty(1, 50.0d), + None(2, null); + private int index; private Double freq; private static BandStopRanges[] vals = values(); - BandStopRanges(Double freq) { + BandStopRanges(int index, Double freq) { + this.index = index; this.freq = freq; } + + public int getIndex() { + return index; + } public Double getFreq() { return freq; } + public static BandStopRanges getByIndex(int i) + { + return vals[i]; + } + public BandStopRanges next() { return vals[(this.ordinal() + 1) % vals.length]; @@ -31,22 +42,28 @@ public enum BandStopRanges public enum BandPassRanges { - FiveToFifty(5.0d, 50.0d), - SevenToThirteen(7.0d, 13.0d), - FifteenToFifty(15.0d, 50.0d), - OneToFifty(1.0d, 50.0d), - OneToHundred(1.0d, 100.0d), - None(null, null); + FiveToFifty(0, 5.0d, 50.0d), + SevenToThirteen(1, 7.0d, 13.0d), + FifteenToFifty(2, 15.0d, 50.0d), + OneToFifty(3, 1.0d, 50.0d), + OneToHundred(4, 1.0d, 100.0d), + None(5, null, null); + private int index; private Double start; private Double stop; private static BandPassRanges[] vals = values(); - BandPassRanges(Double start, Double stop) { + BandPassRanges(int index, Double start, Double stop) { + this.index = index; this.start = start; this.stop = stop; } + + public int getIndex() { + return index; + } public Double getStart() { return start; @@ -56,6 +73,11 @@ public enum BandPassRanges return stop; } + public static BandPassRanges getByIndex(int i) + { + return vals[i]; + } + public BandPassRanges next() { return vals[(this.ordinal() + 1) % vals.length]; diff --git a/OpenBCI_GUI/SessionSettings.pde b/OpenBCI_GUI/SessionSettings.pde index fcf050386..7fb6c8968 100644 --- a/OpenBCI_GUI/SessionSettings.pde +++ b/OpenBCI_GUI/SessionSettings.pde @@ -61,9 +61,6 @@ class SessionSettings { CColor dropdownColors = new CColor(); ///These `Save` vars are set to default when each widget instantiates ///and updated every time user selects from dropdown - //Notch and Bandpass filter variables for save - int dataProcessingNotchSave = 0; - int dataProcessingBandpassSave = 3; //Accelerometer settings int accVertScaleSave; int accHorizScaleSave; @@ -171,11 +168,6 @@ class SessionSettings { String[] spectMaxFrqArray = {"20 Hz", "40 Hz", "60 Hz", "100 Hz", "120 Hz", "250 Hz"}; String[] spectSampleRateArray = {"1 Hz", "5 hz", "10 Hz", "20 Hz", "40 Hz"}; - //Load global settings variables - int loadLayoutSetting; - int loadNotchSetting; - int loadBandpassSetting; - //Load Accel. dropdown variables int loadAccelVertScale; int loadAccelHorizScale; @@ -376,10 +368,13 @@ class SessionSettings { JSONObject saveGlobalSettings = new JSONObject(); saveGlobalSettings.setBoolean("Expert Mode", expertModeToggle); saveGlobalSettings.setInt("Current Layout", currentLayout); - saveGlobalSettings.setInt("Notch", dataProcessingNotchSave); - saveGlobalSettings.setInt("Bandpass Filter", dataProcessingBandpassSave); + saveGlobalSettings.setInt("Notch", dataProcessing.bsRange.getIndex()); + saveGlobalSettings.setInt("Bandpass Filter", dataProcessing.bpRange.getIndex()); saveGlobalSettings.setInt("Analog Read Vert Scale", arVertScaleSave); saveGlobalSettings.setInt("Analog Read Horiz Scale", arHorizScaleSave); + if (currentBoard instanceof SmoothingCapableBoard) { + saveGlobalSettings.setBoolean("Data Smoothing", ((SmoothingCapableBoard)currentBoard).getSmoothingActive()); + } saveSettingsJSONData.setJSONObject(kJSONKeySettings, saveGlobalSettings); /////Setup JSON Object for gui version and settings Version @@ -585,15 +580,15 @@ class SessionSettings { //get the global settings JSON object JSONObject loadGlobalSettings = loadSettingsJSONData.getJSONObject(kJSONKeySettings); - loadLayoutSetting = loadGlobalSettings.getInt("Current Layout"); - loadNotchSetting = loadGlobalSettings.getInt("Notch"); - loadBandpassSetting = loadGlobalSettings.getInt("Bandpass Filter"); - Boolean loadExpertModeToggle = loadGlobalSettings.getBoolean("Expert Mode"); + //Store loaded layout to current layout variable + currentLayout = loadGlobalSettings.getInt("Current Layout"); loadAnalogReadVertScale = loadGlobalSettings.getInt("Analog Read Vert Scale"); loadAnalogReadHorizScale = loadGlobalSettings.getInt("Analog Read Horiz Scale"); - //Store loaded layout to current layout variable - currentLayout = loadLayoutSetting; //Load more global settings after this line, if needed + int loadNotchSetting = loadGlobalSettings.getInt("Notch"); + int loadBandpassSetting = loadGlobalSettings.getInt("Bandpass Filter"); + Boolean loadExpertModeToggle = loadGlobalSettings.getBoolean("Expert Mode"); + Boolean loadDataSmoothingSetting = (currentBoard instanceof SmoothingCapableBoard) ? loadGlobalSettings.getBoolean("Data Smoothing") : null; //get the FFT settings JSONObject loadFFTSettings = loadSettingsJSONData.getJSONObject(kJSONKeyFFT); @@ -717,8 +712,8 @@ class SessionSettings { //get the Widget/Container settings JSONObject loadWidgetSettings = loadSettingsJSONData.getJSONObject(kJSONKeyWidget); //Apply Layout directly before loading and applying widgets to containers - wm.setNewContainerLayout(loadLayoutSetting); - verbosePrint("LoadGUISettings: Layout " + loadLayoutSetting + " Loaded!"); + wm.setNewContainerLayout(currentLayout); + verbosePrint("LoadGUISettings: Layout " + currentLayout + " Loaded!"); numLoadedWidgets = loadWidgetSettings.size(); @@ -749,11 +744,28 @@ class SessionSettings { ///////////////////////////////////////////////////////////// // Load more widget settings above this line as above // + ///////////////////////////////////////////////////////////// - //}//end case for all objects in JSON + ///////////////////////////////////////////////////////////// + // Apply Settings below this line // + ///////////////////////////////////////////////////////////// + + //Apply notch + dataProcessing.bsRange = BandStopRanges.getByIndex(loadNotchSetting); + topNav.filtNotchButton.getCaptionLabel().setText("Notch\n" + dataProcessing.getShortNotchDescription()); + //Apply Bandpass filter + dataProcessing.bpRange = BandPassRanges.getByIndex(loadBandpassSetting); + topNav.filtBPButton.getCaptionLabel().setText("BP Filt\n" + dataProcessing.getShortFilterDescription()); + + //Apply Data Smoothing for capable boards + if (currentBoard instanceof SmoothingCapableBoard) { + ((SmoothingCapableBoard)currentBoard).setSmoothingActive(loadDataSmoothingSetting); + topNav.updateSmoothingButtonText(); + } //Apply Expert Mode toggle - topNav.configSelector.toggleExpertMode(loadExpertModeToggle); + //This should not be loaded with other session settings - RW Jan 2021 + //topNav.configSelector.toggleExpertMode(loadExpertModeToggle); //Load and apply all of the settings that are in dropdown menus. It's a bit much, so it has it's own function below. loadApplyWidgetDropdownText(); @@ -987,7 +999,7 @@ class SessionSettings { w_timeSeries.cp5_widget.getController("VertScale_TS").getCaptionLabel().setText(w_timeSeries.getTSVertScale().getString()); //changes front-end w_timeSeries.setTSHorizScale(loadTimeSeriesSettings.getInt("Time Series Horiz Scale")); - w_timeSeries.cp5_widget.getController("Duration").getCaptionLabel().setText(w_timeSeries.getTSVertScale().getString()); + w_timeSeries.cp5_widget.getController("Duration").getCaptionLabel().setText(w_timeSeries.getTSHorizScale().getString()); JSONArray loadTSChan = loadTimeSeriesSettings.getJSONArray("activeChannels"); w_timeSeries.tsChanSelect.deactivateAllButtons(); diff --git a/OpenBCI_GUI/TopNav.pde b/OpenBCI_GUI/TopNav.pde index 78b7acbe4..448dec2b9 100644 --- a/OpenBCI_GUI/TopNav.pde +++ b/OpenBCI_GUI/TopNav.pde @@ -398,6 +398,10 @@ class TopNav { return val; } + public void updateSmoothingButtonText() { + smoothingButton.getCaptionLabel().setText(getSmoothingString()); + } + private String getSmoothingString() { return ((SmoothingCapableBoard)currentBoard).getSmoothingActive() ? "Smoothing\n On" : "Smoothing\n Off"; } diff --git a/OpenBCI_GUI/W_Spectrogram.pde b/OpenBCI_GUI/W_Spectrogram.pde index c93b066c1..02a01321c 100644 --- a/OpenBCI_GUI/W_Spectrogram.pde +++ b/OpenBCI_GUI/W_Spectrogram.pde @@ -424,9 +424,6 @@ class W_Spectrogram extends Widget { //triggered when there is an event in the Spectrogram Widget MaxFreq. Dropdown void SpectrogramMaxFreq(int n) { settings.spectMaxFrqSave = n; - //Link the choices made in the FFT widget and the Spectrogram Widget for this parameter - MaxFreq(n); - w_fft.cp5_widget.getController("MaxFreq").getCaptionLabel().setText(settings.fftMaxFrqArray[n]); //reset the vertical axis labelss w_spectrogram.vertAxisLabel = w_spectrogram.vertAxisLabels[n]; //Resize the height of the data image From 8b9fee80fef646841d3ef4b687a098fb339993e5 Mon Sep 17 00:00:00 2001 From: Richard Waltman Date: Mon, 25 Jan 2021 21:43:13 -0600 Subject: [PATCH 2/2] Update changelog and bump version to 5.0.3-beta.0 --- CHANGELOG.md | 1 + OpenBCI_GUI/Info.plist.tmpl | 2 +- OpenBCI_GUI/OpenBCI_GUI.pde | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 442eea2a2..5e53da4b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * Fix Pulse LSL output error #943 * Fix Accel/Aux UDP output #944 * Fix Expert Mode unplanned keyboard shortcuts crash GUI #941 +* Fix bugs found when loading Session Settings #942 # v5.0.2 diff --git a/OpenBCI_GUI/Info.plist.tmpl b/OpenBCI_GUI/Info.plist.tmpl index 9de05e0c6..4599da95a 100644 --- a/OpenBCI_GUI/Info.plist.tmpl +++ b/OpenBCI_GUI/Info.plist.tmpl @@ -23,7 +23,7 @@ CFBundleShortVersionString 4 CFBundleVersion - 5.0.3-alpha.3 + 5.0.3-beta.0 CFBundleSignature ???? NSHumanReadableCopyright diff --git a/OpenBCI_GUI/OpenBCI_GUI.pde b/OpenBCI_GUI/OpenBCI_GUI.pde index abc488e47..51c9bd5fe 100644 --- a/OpenBCI_GUI/OpenBCI_GUI.pde +++ b/OpenBCI_GUI/OpenBCI_GUI.pde @@ -64,7 +64,7 @@ import http.requests.*; // Global Variables & Instances //------------------------------------------------------------------------ //Used to check GUI version in TopNav.pde and displayed on the splash screen on startup -String localGUIVersionString = "v5.0.3-alpha.3"; +String localGUIVersionString = "v5.0.3-beta.0"; String localGUIVersionDate = "January 2020"; String guiLatestVersionGithubAPI = "https://api.github.com/repos/OpenBCI/OpenBCI_GUI/releases/latest"; String guiLatestReleaseLocation = "https://github.com/OpenBCI/OpenBCI_GUI/releases/latest";