Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
83ce6dc
feat(ui): add centralized dark theme system (PStheme)
Mar 7, 2026
20c3817
perf(parser): replace eval() with dynamic field access in PSload
Mar 7, 2026
2db494d
chore: fix CRLF line endings, add .gitattributes
Mar 7, 2026
736559f
perf(ui): add PStheme, defer spectral delay computation to Run click
Mar 7, 2026
8606ff9
perf(spectral): replace eval() with dynamic field access in plot files
Mar 7, 2026
8d4eb68
feat(ui): unified dark theme across all dashboards
Mar 7, 2026
632f277
fix(ui): unify font size via PStheme, remove all hardcoded FontSize v…
Mar 7, 2026
1456aff
fix(ui): pixel-based CP resize, remove duplicate widgets, fix topbar …
Mar 8, 2026
97ceee9
chore: remove dead code and unused compat shims
Mar 8, 2026
d6c68ec
fix(spectral): handle short/empty logs in Spectral Analyzer without c…
Mar 8, 2026
13e5369
refactor: str2double, preallocate arrays, extract preset callback
Mar 8, 2026
daeabdb
perf(ui): cache smooth() in Log Viewer, remove eval()
Mar 8, 2026
06d2d43
fix(ui): add file dropdowns to PID Error/Stats, fix checkbox layout a…
Mar 8, 2026
4348516
perf(parser): use --output-dir instead of copying decoder and log files
Mar 8, 2026
c0f4702
fix(ui): add drawnow after figure(1) to fix maximize race condition
Mar 8, 2026
66413a8
fix(filter-sim): fall back to BF 4.2 header names for filter params
Mar 8, 2026
9065100
fix(filter-sim): correct BF filter type mapping (0=PT1 not OFF)
Mar 8, 2026
5f9a075
fix(parser): replace str2num with str2double across codebase
Mar 8, 2026
16995e9
fix(ui): fix Freq×Throttle colorbars and Step Response 4-column layout
Mar 8, 2026
d0963ad
fix(ui): dynamic plot widths and PSgrid resize for all dashboards
Mar 8, 2026
1a295a1
feat(filter-sim): redesign with 2x4 layout and edit boxes
Mar 10, 2026
a1c7020
fix(filter-sim): log frequency toggle no longer freezes GUI
Mar 10, 2026
eb30d34
fix(filter-sim): Show Both hides right column properly
Mar 10, 2026
ad473cb
fix(filter-sim): unify layout into applyLayout() for all toggle combos
Mar 10, 2026
9c6760e
fix(filter-sim): suppress log-axis warnings during redraw
Mar 10, 2026
7dd446d
fix(parser): handle BF 2025.12 headerless format in PSparseBFversion
Mar 11, 2026
7e1fb11
feat(motor-noise): RPM overlay overhaul for Freq×Time and Freq×Throttle
Mar 11, 2026
e0ad651
feat(ui): PID Slider Tool with PTB/BF math toggle
Mar 11, 2026
2ae9570
fix(ui): stick overlay, KISS parsing, firmware switch cleanup
Mar 12, 2026
10edfa9
fix(ui): preset header no longer resets dropdowns, colorbar orphan cl…
Mar 12, 2026
f0b6bc8
fix(ui): clear smoothCacheLV on firmware switch, defensive length check
Mar 12, 2026
09fca6f
fix(ui): unify motor colors to FPV standard from PStheme
Mar 12, 2026
8fb3596
fix(firmware): Step Response crash for RF/KISS/AP + Stats crash for A…
Mar 12, 2026
9b37c14
fix(ui): Rotorflight stick overlay — collective is -500..500 not 1000…
Mar 12, 2026
43eac43
fix(rotorflight): override setpoint_3_ with governor throttle (rcComm…
Mar 12, 2026
88d22ca
feat(rotorflight): show servo data in Motor slots + dynamic labels ba…
Mar 12, 2026
c2ce675
fix(firmware): auto-detect firmware from log headers instead of dropdown
Mar 13, 2026
7be3151
fix(compat): replace subplot() with tag-based axes + CI/build/macOS u…
Mar 14, 2026
b026103
fix(ui): dynamic axis scaling, motor expansion, FileNum reload, Step …
Mar 14, 2026
4db149e
feat(ui): Test Signal Config, PStheme colors, Filter Sim/Test Signal …
Mar 15, 2026
5da63c2
fix(filter-sim): plot fidelity across all 8 subplots
Mar 15, 2026
2e1733e
feat(step-response): SD shading, error bars, raw traces, period tool,…
Mar 16, 2026
005d024
fix(filter-sim): fixed LPF step 4ms range + notch phase +-90 deg clamp
Mar 22, 2026
63bfcc2
fix(filter-sim): Emuflight per-axis keys + gyro rate from looptime he…
Mar 23, 2026
2ad0907
feat(ui): Period tool - red markers on all LV axes + ms/Hz annotation
Mar 24, 2026
8a54212
feat(ui): eRPM overlay on motor subplot
Mar 24, 2026
e65bc09
fix(ui): 4 per-motor RPM checkboxes, Stats mode-switch cleanup
Mar 25, 2026
39ac3a1
feat(ui): Setup Info diff, Filter Sim overhaul, Copy CLI
Mar 28, 2026
dd49b98
feat(spectral): Motor Noise panels, RPM overlay, hex/octo, perf cache
Mar 29, 2026
476dd27
perf(spectral): PSD/render cache, Motor Noise FFT cache, hex/octo eRP…
Mar 29, 2026
e246037
perf(motor-noise): pre-compute coherence for all 3 gyro axes, cache i…
Mar 30, 2026
2111689
feat(spectral): use gyroUnfilt for Gyro prefilt on BF 4.5+, fallback …
Mar 30, 2026
81e7aaf
feat(step-response): vectorized FFT, subsample/threshold controls, sn…
Apr 2, 2026
279a268
feat(spectral): pre/post filter PSD overlay polish
Apr 2, 2026
f60eb96
feat(spectral): TPA diagnostic annotation on Freq x Throttle spectrog…
Apr 4, 2026
223fa5b
fix(compat): old BF logs crash on missing gyroADC fields
Apr 4, 2026
59c9504
fix(spectral): delete unchecked RPY panels instead of cla-only
Apr 4, 2026
a88a11f
feat(ui): add Gyro(pf) checkbox to Log Viewer
Apr 5, 2026
66a25d2
fix(spectral): Sub 100Hz column vanishes on re-render
Apr 6, 2026
6c24cb1
fix(spectral): skip gyroPrefilt default when data unavailable
Apr 6, 2026
314c558
chore: bump version to 26.04.0-rc1
Apr 6, 2026
3d51de1
ci: update macOS runners and all actions to latest
Apr 6, 2026
95d539b
fix(parser): guard INAV rcData_3_ and setpoint_3_ plot
Apr 19, 2026
0e1f949
fix(parser): QS JSON path doubling + AP older log compat
Apr 19, 2026
92107f1
chore: bump version to 26.05.0
May 30, 2026
0a0d746
fix(step-response): default min rate 20 deg/s for Rotorflight logs
Jun 5, 2026
de79206
fix(ui): lift dark line colors to theme min brightness
Jun 5, 2026
8ebd5af
fix(ui): keep title bar on screen on Windows via OuterPosition
Jun 5, 2026
78e9ff8
chore: bump version to 26.06.0-rc1
Jun 5, 2026
992a12c
docs: mention AUR packages in README
Jun 5, 2026
0fe9573
fix(step-response): guard step tool styling when no file is loaded
Jun 13, 2026
e0b2809
chore: bump version to 26.06.0-rc2
Jun 13, 2026
34e3737
chore(build): bump Windows Octave to 11.3.0
Jun 13, 2026
35186dc
fix(ui): prevent crash from clicks during ginput capture
Jun 16, 2026
281caf9
chore: bump version to 26.06.0-rc3
Jun 16, 2026
4644288
fix(parser): correct multi-session log selection and INAV decoder fal…
Aug 11, 2026
bfc7a15
chore: bump version to 26.08.0-rc4
Aug 11, 2026
58e2ee4
fix(ui): ignore dashboard clicks during spectral runs
Aug 11, 2026
e291895
chore: bump version to 26.08.0-rc5
Aug 11, 2026
f65a415
chore: bump version to 26.08.0
Aug 13, 2026
0214faa
chore: record squashed main release as merged
Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions PIDscope.m
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,14 @@
screensz = get(0,'ScreenSize');
% Octave Qt bug: setting figure units to 'normalized' permanently breaks uipanel
% Calculate pixel position manually instead
set(PSfig, 'Position', round([0 0 screensz(3) screensz(4)]));
try set(PSfig, 'WindowState', 'maximized'); catch, end
if ispc
% Position sets the client area only - on Windows the title bar ends up
% above the screen top; OuterPosition includes the frame
drawnow;
set(PSfig, 'OuterPosition', round([0 0 screensz(3) screensz(4)]));
else
set(PSfig, 'Position', round([0 0 screensz(3) screensz(4)]));
end
set(PSfig, 'NumberTitle', 'off');
set(PSfig, 'Name', ['PIDscope (' PsVersion ') - Log Viewer']);
drawnow; pause(0.2);
Expand Down Expand Up @@ -264,7 +270,7 @@
set(guiHandles.clr, 'ForegroundColor', cautionCol);

guiHandles.startEndButton = uicontrol(PSfig,'style','checkbox', 'string','Trim ','fontsize',fontsz,'TooltipString', [TooltipString_selectButton], 'units','normalized','Position',[posInfo.startEndButton],...
'callback','if exist(''filenameA'',''var'') && ~isempty(filenameA) && get(guiHandles.startEndButton, ''Value''), try, [x y] = ginput(1); epoch1_A(get(guiHandles.FileNum, ''Value'')) = round(x(1)*10)/10; PSplotLogViewer; [x y] = ginput(1); epoch2_A(get(guiHandles.FileNum, ''Value'')) = round(x(1)*10)/10; PSplotLogViewer; catch, end, end');
'callback','PStrimSelect;');

guiHandles.plotR =uicontrol(PSfig,'Style','checkbox','String','R','fontsize',fontsz,'TooltipString', ['Plot Roll '],...
'units','normalized','BackgroundColor',bgcolor,'ForegroundColor',th.axisRoll,'Position',[posInfo.plotR_LV], 'callback','if exist(''fnameMaster'',''var'') && ~isempty(fnameMaster), PSplotLogViewer; end');
Expand Down
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,17 @@ That said - if you find PIDscope useful and want to buy me a coffee (not a beer,
<a href="https://www.buymeacoffee.com/dzikus" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
---

## Installing

AppImage (Linux), Windows and macOS builds are on the [releases page](https://github.com/dzikus/PIDscope/releases).

Arch Linux users can install from the AUR thanks to [FPVogel](https://github.com/FPVogel):

- [pidscope-bin](https://aur.archlinux.org/packages/pidscope-bin) - the released AppImage
- [pidscope-git](https://aur.archlinux.org/packages/pidscope-git) - built from the latest git source

---

## License

PIDscope is licensed under the [GNU General Public License v3.0](LICENSE).
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
26.05.0
26.08.0
2 changes: 1 addition & 1 deletion packaging/windows/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ARG OCTAVE_VERSION=11.1.0
ARG OCTAVE_VERSION=11.3.0

RUN apt-get update && apt-get install -y \
p7zip-full zip wget git curl make \
Expand Down
2 changes: 1 addition & 1 deletion packaging/windows/build-windows.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ set -euo pipefail

SRC_DIR="${1:-/src}"
DIST_DIR="${2:-/dist}"
OCTAVE_VERSION="${OCTAVE_VERSION:-11.1.0}"
OCTAVE_VERSION="${OCTAVE_VERSION:-11.3.0}"
# Version: env > VERSION file > git tag > fallback
if [ -n "${PIDSCOPE_VERSION:-}" ]; then
VERSION="${PIDSCOPE_VERSION}"
Expand Down
95 changes: 57 additions & 38 deletions src/core/PSgetcsv.m
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
function [filename csvFnames] = PSgetcsv(filename, firmware_flag, outdir)
%% [filename csvFnames] = PSgetcsv(filename, firmware_flag, outdir)
function [filename csvFnames] = PSgetcsv(filename, firmware_flag, outdir, sel)
%% [filename csvFnames] = PSgetcsv(filename, firmware_flag, outdir, sel)
% Converts bbl files to csv using blackbox_decode
% filename: full path to BBL/BFL/TXT/BTFL/JSON/BIN file
% outdir: directory for CSV output (default: same as input file)
% sel: session numbers to keep from a multi-log file; omit to ask the user

% ----------------------------------------------------------------------------------
% "THE BEER-WARE LICENSE" (Revision 42):
Expand All @@ -21,6 +22,8 @@
if nargin < 3 || isempty(outdir)
outdir = fdir;
end
if nargin < 4, sel = []; end
askUser = isempty(sel);

if strcmpi(fext, '.bin')
csvFnames = {filename};
Expand All @@ -36,10 +39,10 @@
decoder_path = getappdata(0, 'PSdecoderPath');
decoder_inav = getappdata(0, 'PSdecoderPathINAV');

if firmware_flag == 3 && ~isempty(decoder_inav)
% INAV decoder has no --output-dir; copy input to workdir first
if firmware_flag == 3 && ~isempty(decoder_inav) && exist(decoder_inav, 'file') == 2
% INAV decoder has no --output-dir; run it on a copy inside outdir
tmpSrc = fullfile(outdir, [fname fext]);
copyfile(filename, tmpSrc);
if ~strcmp(tmpSrc, filename), copyfile(filename, tmpSrc); end
cmd = ['"' decoder_inav '" "' tmpSrc '" 2>&1'];
else
cmd = ['"' decoder_path '" --output-dir "' outdir '" "' filename '" 2>&1'];
Expand All @@ -52,9 +55,15 @@
end

fbase = fullfile(outdir, fname);
files = dir([fbase '*.csv']);

% filter out files with .bbl or .bfl in name
% junk the decoder drops next to the csv output
for pat = {'*.event', '*.gps.gpx', '*.gps.csv'}
junk = dir([fbase pat{1}]);
for k = 1:size(junk,1), delete(fullfile(outdir, junk(k).name)); end
end

% side outputs keep the source extension in the name
files = dir([fbase '*.csv']);
valid = true(size(files,1), 1);
for k = 1:size(files,1)
if contains(files(k).name, '.bbl', 'IgnoreCase', true) || contains(files(k).name, '.bfl', 'IgnoreCase', true)
Expand All @@ -64,50 +73,60 @@
files = files(valid, :);

if isempty(files)
set(gcf, 'pointer', 'arrow');
csvFnames = {};
return;
end

% clean up junk files in outdir
fevt = dir([fbase '*.event']);
for k = 1:size(fevt,1), delete(fullfile(outdir, fevt(k).name)); end
fevt = dir([fbase '*.gps.gpx']);
for k = 1:size(fevt,1), delete(fullfile(outdir, fevt(k).name)); end
fevt = dir([fbase '*.gps.csv']);
for k = 1:size(fevt,1), delete(fullfile(outdir, fevt(k).name)); end

% refresh file list after cleanup
files = dir([fbase '*.csv']);

if size(files,1) > 1
% remove empty subfiles (<1KB)
valid = true(size(files,1), 1);
% the decoder prints one duration per log, in the order it wrote them,
% so pair them up before anything is dropped from the list
a = strfind(result, 'duration');
labels = cell(size(files,1), 1);
for k = 1:size(files,1)
if files(k).bytes < 1000
delete(fullfile(outdir, files(k).name));
valid(k) = false;
if k <= length(a)
labels{k} = result(a(k):min(a(k)+filename_nchars, length(result)));
else
labels{k} = files(k).name;
end
end
files = files(valid, :);

a = strfind(result, 'duration');
logDurStr = '';
for d = 1:length(a)
logDurStr{d} = [int2str(d) ') ' result(a(d):a(d)+filename_nchars)];
% logs under 1KB hold no flight data - drop them and their labels together
small = [files.bytes] < 1000;
for k = find(small), delete(fullfile(outdir, files(k).name)); end
files = files(~small, :);
labels = labels(~small);

if isempty(files)
if askUser
a = errordlg(['no valid data in ' mainFname]); pause(3); close(a);
else
warning('PSgetcsv: no valid data in %s', mainFname);
end
csvFnames = {};
return;
end
end

if size(files,1) > 0
x = size(files,1);
if x > 1
[fnums, tf] = listdlg('ListString', logDurStr, 'ListSize', [250, round(size(logDurStr,2)*20)], 'Name', 'Select file(s): ');
for k = 1:x
if ~ismember(k, fnums), delete(fullfile(outdir, files(k).name)); end
end
if size(files,1) > 1
if askUser
for k = 1:size(files,1)
labels{k} = [int2str(k) ') ' labels{k}];
end
% the dialog opens behind the import waitbar on Windows and looks like a hang
wb = findall(0, 'Type', 'figure', 'Tag', 'waitbar');
set(wb, 'Visible', 'off');
[fnums, tf] = listdlg('ListString', labels, 'ListSize', [250, round(numel(labels)*20)], 'Name', 'Select file(s): ');
set(wb, 'Visible', 'on');
if ~tf || isempty(fnums)
for k = 1:size(files,1), delete(fullfile(outdir, files(k).name)); end
csvFnames = {};
return;
end
else
validData = 0;
a = errordlg(['no valid data in ' mainFname]); pause(3); close(a);
fnums = sel(sel >= 1 & sel <= size(files,1));
end
for k = 1:size(files,1)
if ~ismember(k, fnums), delete(fullfile(outdir, files(k).name)); end
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions src/plot/PSplotLogViewer.m
Original file line number Diff line number Diff line change
Expand Up @@ -414,10 +414,10 @@
% i/o keyboard trim: 'i' sets in-point, 'o' sets out-point
set(PSfig, 'KeyPressFcn', [ ...
'if exist(''filenameA'',''var'') && ~isempty(filenameA), ' ...
'kk=get(gcbo,''CurrentCharacter''); fIdx=get(guiHandles.FileNum,''Value''); ' ...
'kk=get(gcbo,''CurrentCharacter''); fIdx=get(guiHandles.FileNum,''Value''); setappdata(0,''PSbusy'',1); ' ...
'if kk==''i'', try, [xt,~]=ginput(1); epoch1_A(fIdx)=round(xt*10)/10; PSplotLogViewer; catch, end; ' ...
'elseif kk==''o'', try, [xt,~]=ginput(1); epoch2_A(fIdx)=round(xt*10)/10; PSplotLogViewer; catch, end; ' ...
'end, end']);
'end, setappdata(0,''PSbusy'',0); end']);

PSdatatipSetup(PSfig);
try PSresizeCP(PSfig, []); catch, end
Expand Down
5 changes: 4 additions & 1 deletion src/plot/PSplotSpec.m
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,9 @@
if updateSpec==0
clear s dat ampmat amp2d freq a RC smat amp2d freq2d Throt
p=0;
hw = waitbar(0,['please wait... ' ]);
% waitbar pumps the event queue, so hold off dashboard clicks until done
setappdata(0, 'PSbusy', 1);
hw = waitbar(0,['please wait... ' ]);

tmpPSDVal = get(guiHandlesSpec.checkboxPSD, 'Value');
for k=1:length(vars)
Expand Down Expand Up @@ -148,6 +150,7 @@
end
end
close(hw)
setappdata(0, 'PSbusy', 0);
end
else
warndlg({'Dropdowns set to ''NONE''.'; 'Please select a preset or specific variables to analyze.'});
Expand Down
5 changes: 5 additions & 0 deletions src/plot/PSplotSpec2D.m
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@

%%% compute delay/overlay data (deferred from UI open to Run click)
if ~exist('delayDataReady','var') || ~delayDataReady
% waitbar pumps the event queue, so hold off dashboard clicks until done
setappdata(0, 'PSbusy', 1);
hw_delay = waitbar(0, 'computing delays...');
FilterDelayDterm={};
SPGyroDelay=[];
Expand Down Expand Up @@ -157,6 +159,7 @@
end
delayDataReady = true;
try close(hw_delay); catch, end
setappdata(0, 'PSbusy', 0);
end

tmpSpecVal = get(guiHandlesSpec2.SpecList, 'Value');
Expand All @@ -177,6 +180,7 @@
freq2d2 = {};
amp2d2 = {};
p=0;
setappdata(0, 'PSbusy', 1);
hw_fft = waitbar(0, 'computing FFT...');
for k = 1 : length(tmpSpecVal)
s = char(datSelectionString(tmpSpecVal(k)));
Expand Down Expand Up @@ -233,6 +237,7 @@
end
end
try close(hw_fft); catch, end
setappdata(0, 'PSbusy', 0);
prevPsdKey_ = struct('specVal', tmpSpecVal, 'fileVal', tmpFileVal, 'psdVal', tmpPSDVal, 'axes', axesOptionsSpec);
end

Expand Down
2 changes: 2 additions & 0 deletions src/ui/PSdispSetupInfoUIcontrol.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
% ----------------------------------------------------------------------------------


if getappdata(0, 'PSbusy'), return; end % skip re-entrant call mid-capture (#21)

if exist('fnameMaster','var') && ~isempty(fnameMaster)

if exist('PSdisp','var') && ishandle(PSdisp)
Expand Down
2 changes: 2 additions & 0 deletions src/ui/PSerrUIcontrol.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
% ----------------------------------------------------------------------------------


if getappdata(0, 'PSbusy'), return; end % skip re-entrant call mid-capture (#21)

if exist('fnameMaster','var') && ~isempty(fnameMaster)

if exist('PSerrfig','var') && ishandle(PSerrfig)
Expand Down
9 changes: 6 additions & 3 deletions src/ui/PSfreqTimeUIcontrol.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
% can do whatever you want with this stuff. If we meet some day, and you think
% this stuff is worth it, you can buy me a beer in return. -Brian White
% ----------------------------------------------------------------------------------


if getappdata(0, 'PSbusy'), return; end % skip re-entrant call from a running job

if exist('fnameMaster','var') && ~isempty(fnameMaster)

%%% tooltips
TooltipString_specRun=['Run current spectral configuration'];
TooltipString_cmap=['Choose from a selection of colormaps'];
Expand Down Expand Up @@ -228,10 +230,11 @@ try set(guiHandlesSpec3.subsampleFactor_select, 'Value', defaults.Values(find(st
try set(guiHandlesSpec3.ColormapSelect, 'Value', defaults.Values(find(strcmp(defaults.Parameters, 'FreqxTime-Colormap')))), catch, set(guiHandlesSpec3.ColormapSelect, 'Value', 3), end


PSstyleControls(PSspecfig3);

else
warndlg('Please select file(s)');
end
PSstyleControls(PSspecfig3);

% functions
function selection2(src,event)
Expand Down
2 changes: 2 additions & 0 deletions src/ui/PSspec2DUIcontrol.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
% this stuff is worth it, you can buy me a beer in return. -Brian White
% ----------------------------------------------------------------------------------

if getappdata(0, 'PSbusy'), return; end % skip re-entrant call mid-capture (#21)

if exist('fnameMaster','var') && ~isempty(fnameMaster)

%%% tooltips
Expand Down
7 changes: 5 additions & 2 deletions src/ui/PSspecUIcontrol.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
% can do whatever you want with this stuff. If we meet some day, and you think
% this stuff is worth it, you can buy me a beer in return. -Brian White
% ----------------------------------------------------------------------------------


if getappdata(0, 'PSbusy'), return; end % skip re-entrant call from a running job

if exist('fnameMaster','var') && ~isempty(fnameMaster)

%%% tooltips
Expand Down Expand Up @@ -328,10 +330,11 @@
try set(guiHandlesSpec.smoothFactor_select, 'Value', defaults.Values(find(strcmp(defaults.Parameters, 'FreqXthr-Smoothing')))), catch, set(guiHandlesSpec.smoothFactor_select, 'Value', 3); end


PSstyleControls(PSspecfig);

else
warndlg('Please select file(s)');
end
PSstyleControls(PSspecfig);

% functions
function selection2(src,event)
Expand Down
2 changes: 2 additions & 0 deletions src/ui/PSstatsUIcontrol.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
% this stuff is worth it, you can buy me a beer in return. -Brian White
% ----------------------------------------------------------------------------------

if getappdata(0, 'PSbusy'), return; end % skip re-entrant call mid-capture (#21)

if exist('fnameMaster','var') && ~isempty(fnameMaster)

if exist('PSstatsfig','var') && ishandle(PSstatsfig)
Expand Down
Loading