function varargout = gui_signal_generator(varargin)
% GUI_SIGNAL_GENERATOR Application M-file for gui_signal_generator.fig
% FIG = GUI_SIGNAL_GENERATOR launch gui_signal_generator GUI.
% GUI_SIGNAL_GENERATOR('callback_name', ...) invoke the named callback.
% This user interface is provided to edit and plot signal generators.
% Typically it is launched by another program that has set the global
% struct array "SignalGenerators" and the global variable
% "NumSignalGenerators". The calling program must pass one argument
% which is the length of the run time. If this user interface is started
% without any arguments (launched by itself), it will allow the user to
% adjust and plot signals.
% Last Modified by GUIDE v2.5 02-Apr-2003 08:42:44
%% Modified on Jan. 21, 2004 by cha.
%% Changed external file inputs to read in all the components of a vector
%% Added square wave signals.
% Modified on Oct. 17, 2001 by cha to add titles and legends to the plot figure.
%
% Modified on 10/29/01 by John Harwell
%
% Removed unused, commented out code.
%
% Modified on 10/31/01 by John Harwell
%
% renamed "new_genSignal" to "sim_genSignal"
global NumSignalGenerators SignalGenerators
if nargin <= 1
if nargin == 0
if exist('SignalGenerators') ~= 0
NumSignalGenerators = 0;
end
end
fig = openfig(mfilename,'reuse');
% Generate a structure of handles to pass to callbacks, and store it.
handles = guihandles(fig);
handles.fig = fig;
handles.lengthOfRun = 1.0;
handles.enableLengthOfRun = 1;
if nargin == 0
createSignalGenerators;
else
handles.lengthOfRun = varargin{1};
handles.enableLengthOfRun = 0;
end
guidata(fig, handles);
set(fig, 'Name', 'NESIM: External Input');
loadSignalNumMenu(handles);
loadSignalGeneratorData(handles);
setEnables(handles);
if nargout > 0
varargout{1} = fig;
end
elseif ischar(varargin{1}) % INVOKE NAMED SUBFUNCTION OR CALLBACK
try
[varargout{1:nargout}] = feval(varargin{:}); % FEVAL switchyard
catch
disp(lasterr);
end
end
%| ABOUT CALLBACKS:
%| GUIDE automatically appends subfunction prototypes to this file, and
%| sets objects' callback properties to call them through the FEVAL
%| switchyard above. This comment describes that mechanism.
%|
%| Each callback subfunction declaration has the following form:
%| <SUBFUNCTION_NAME>(H, EVENTDATA, HANDLES, VARARGIN)
%|
%| The subfunction name is composed using the object's Tag and the
%| callback type separated by '_', e.g. 'slider2_Callback',
%| 'figure1_CloseRequestFcn', 'axis1_ButtondownFcn'.
%|
%| H is the callback object's handle (obtained using GCBO).
%|
%| EVENTDATA is empty, but reserved for future use.
%|
%| HANDLES is a structure containing handles of components in GUI using
%| tags as fieldnames, e.g. handles.figure1, handles.slider2. This
%| structure is created at GUI startup using GUIHANDLES and stored in
%| the figure's application data using GUIDATA. A copy of the structure
%| is passed to each callback. You can store additional information in
%| this structure at GUI startup, and you can change the structure
%| during callbacks. Call guidata(h, handles) after changing your
%| copy to replace the stored original so that subsequent callbacks see
%| the updates. Type "help guihandles" and "help guidata" for more
%| information.
%|
%| VARARGIN contains any extra arguments you have passed to the
%| callback. Specify the extra arguments by editing the callback
%| property in the inspector. By default, GUIDE sets the property to:
%| <MFILENAME>('<SUBFUNCTION_NAME>', gcbo, [], guidata(gcbo))
%| Add any extra arguments after the last argument, before the final
%| closing parenthesis.
% --------------------------------------------------------------------
function setEnables(handles);
% disable all text boxes
set(handles.frequencyText, 'Enable','off');
set(handles.frequencyLabel, 'Enable', 'off');
set(handles.frequencyHighText, 'Enable', 'off');
set(handles.phaseLabel, 'Enable', 'off');
set(handles.phaseText, 'Enable', 'off');
set(handles.amplitudeLabel, 'Enable', 'off');
set(handles.amplitudeText, 'Enable', 'off');
set(handles.dcOffsetLabel, 'Enable', 'off');
set(handles.dcOffsetText, 'Enable', 'off');
set(handles.timeLabel, 'Enable', 'off');
set(handles.timeOnText, 'Enable', 'off');
set(handles.timeOffText, 'Enable', 'off');
set(handles.filenameLabel, 'Enable', 'off');
set(handles.filenameText, 'Enable', 'off');
set(handles.componentPopupMenu, 'Enable','on');
switch get(handles.signalTypePopupMenu, 'Value');
case 1 % band limited noise
set(handles.amplitudeLabel, 'Enable', 'on');
set(handles.amplitudeText, 'Enable', 'on');
set(handles.dcOffsetLabel, 'Enable', 'on');
set(handles.dcOffsetText, 'Enable', 'on');
set(handles.frequencyLabel, 'Enable', 'on');
set(handles.frequencyText, 'Enable', 'on');
set(handles.frequencyHighText, 'Enable', 'on'); %% CHA 1/21/04
case 2 % constant
set(handles.amplitudeLabel,'Enable', 'on');
set(handles.amplitudeText, 'Enable', 'on');
case 3 % file
set(handles.filenameLabel, 'Enable', 'on');
set(handles.filenameText, 'Enable', 'on');
set(handles.componentPopupMenu, 'Enable','off'); %% CHA 1/21/04
case 4 % ramp
set(handles.timeLabel, 'Enable', 'on');
set(handles.timeOnText, 'Enable', 'on');
set(handles.timeOffText, 'Enable', 'on');
set(handles.amplitudeLabel,'Enable', 'on');
set(handles.amplitudeText, 'Enable', 'on');
set(handles.dcOffsetLabel, 'Enable', 'on');
set(handles.dcOffsetText, 'Enable', 'on');
case 5 % sine
set(handles.amplitudeLabel,'Enable', 'on');
set(handles.amplitudeText, 'Enable', 'on');
set(handles.dcOffsetLabel, 'Enable', 'on');
set(handles.dcOffsetText, 'Enable', 'on');
set(handles.frequencyLabel,'Enable', 'on');
set(handles.frequencyText, 'Enable', 'on');
set(handles.phaseLabel, 'Enable', 'on');
set(handles.phaseText, 'Enable', 'on');
case 6 % square wave
set(handles.amplitudeLabel,'Enable', 'on');
set(handles.amplitudeText, 'Enable', 'on');
set(handles.dcOffsetLabel, 'Enable', 'on');
set(handles.dcOffsetText, 'Enable', 'on');
set(handles.frequencyLabel,'Enable', 'on');
set(handles.frequencyText, 'Enable', 'on');
set(handles.phaseLabel, 'Enable', 'on');
set(handles.phaseText, 'Enable', 'on');
case 7 % step
set(handles.amplitudeLabel,'Enable', 'on');
set(handles.amplitudeText, 'Enable', 'on');
set(handles.dcOffsetLabel, 'Enable', 'on');
set(handles.dcOffsetText, 'Enable', 'on');
set(handles.timeLabel, 'Enable', 'on');
set(handles.timeOnText, 'Enable', 'on');
set(handles.timeOffText, 'Enable', 'on');
end
if (handles.enableLengthOfRun ~= 0)
set(handles.lengthOfRunText, 'Enable', 'on');
else
set(handles.lengthOfRunText, 'Enable', 'off');
end
% --------------------------------------------------------------------
function varargout = createSignalGenerators()
% If no signal generators exist in global memory this function will
% create the signal generator structure
global NumSignalGenerators SignalGenerators
if exist('SignalGenerators') ~= 0
if (NumSignalGenerators > 0)
return;
end
end
NumSignalGenerators = 1;
SignalGenerators = repmat(struct('SigType', 'Ramp', ...
'Frequency', 5.0, ...
'FrequencyHigh', 30.0, ...
'Phase', 0.0, ...
'Amplitude', 0.5, ...
'dcOffset', 0.0, ...
'TimeOn', 0.0, ...
'TimeOff', 1.0, ...
'Filename', '' ), ...
NumSignalGenerators, 3);
% --------------------------------------------------------------------
function varargout = loadSignalNumMenu(handles)
% Load the Signal Generator Number menu
global NumSignalGenerators SignalGenerators
if NumSignalGenerators == 0
return;
end
for i = 1:NumSignalGenerators
signalNums{i}= num2str(i);
end
set(handles.signalGenNumberPopupMenu, 'String', signalNums);
set(handles.signalGenNumberPopupMenu, 'Value', 1);
% --------------------------------------------------------------------
function varargout = loadSignalGeneratorData(handles);
% Load the data windows for the currently selected signal generator
global NumSignalGenerators SignalGenerators SignalGeneratorDimension
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
for i = 1:SignalGeneratorDimension(signalNum)
componentNums{i} = num2str(i);
end
set(handles.componentPopupMenu, 'String', componentNums);
componentNum = get(handles.componentPopupMenu, 'Value');
if (componentNum > SignalGeneratorDimension(signalNum))
componentNum = 1;
set(handles.componentPopupMenu, 'Value', componentNum);
end
indx = 1;
switch lower(SignalGenerators(signalNum,componentNum).SigType(1:4))
case 'cons'
indx = 2;
case 'ramp'
indx = 4;
case 'step'
indx = 7;
case 'sine'
indx = 5;
case 'squa'
indx = 6;
case 'nois'
indx = 1;
case 'file'
indx = 3;
end
set(handles.signalTypePopupMenu, 'Value', indx);
set(handles.frequencyText, 'String', num2str(SignalGenerators(signalNum,componentNum).Frequency));
set(handles.frequencyHighText, 'String', num2str(SignalGenerators(signalNum,componentNum).FrequencyHigh));
set(handles.phaseText, 'String', num2str(SignalGenerators(signalNum,componentNum).Phase));
set(handles.amplitudeText, 'String', num2str(SignalGenerators(signalNum,componentNum).Amplitude));
set(handles.dcOffsetText, 'String', num2str(SignalGenerators(signalNum,componentNum).dcOffset));
set(handles.timeOnText, 'String', num2str(SignalGenerators(signalNum,componentNum).TimeOn));
set(handles.timeOffText, 'String', num2str(SignalGenerators(signalNum,componentNum).TimeOff));
set(handles.filenameText, 'String', SignalGenerators(signalNum,componentNum).Filename);
set(handles.lengthOfRunText, 'String', num2str(handles.lengthOfRun));
% --------------------------------------------------------------------
function varargout = signalTypePopupMenu_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.signalTypePopupMenu.
global NumSignalGenerators SignalGenerators
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
s = '';
indx = get(handles.signalTypePopupMenu, 'Value');
switch indx;
case 1
s = 'noise';
case 2
s = 'const';
case 3
s = 'file';
componentNum = 1; %% CHA 1/21/04
case 4
s = 'ramp';
case 5
s = 'sine';
case 6
s = 'squa';
case 7
s = 'step';
end
SignalGenerators(signalNum,componentNum).SigType = s;
setEnables(handles);
% --------------------------------------------------------------------
function varargout = frequencyText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.frequencyText.
global NumSignalGenerators SignalGenerators
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).Frequency = str2double(get(handles.frequencyText, 'String'));
% --------------------------------------------------------------------
function varargout = phaseText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.phaseText.
global NumSignalGenerators SignalGenerators
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).Phase = str2double(get(handles.phaseText, 'String'));
% --------------------------------------------------------------------
function varargout = amplitudeText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.amplitudeText.
global NumSignalGenerators SignalGenerators
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).Amplitude = str2double(get(handles.amplitudeText, 'String'));
% --------------------------------------------------------------------
function varargout = timeOnText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.timeOnText.
global NumSignalGenerators SignalGenerators
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).TimeOn = str2double(get(handles.timeOnText, 'String'));
% --------------------------------------------------------------------
function varargout = lengthOfRunText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.slopeText.
% --------------------------------------------------------------------
function varargout = filenameText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.filenameText.
global NumSignalGenerators SignalGenerators
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).Filename = get(handles.filenameText, 'String');
% --------------------------------------------------------------------
function varargout = frequencyHighText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.frequencyHighText.
global NumSignalGenerators SignalGenerators
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).FrequencyHigh = str2double(get(handles.frequencyHighText, 'String'));
% --------------------------------------------------------------------
function varargout = timeOffText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.timeOffText.
global NumSignalGenerators SignalGenerators
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).TimeOff = str2double(get(handles.timeOffText, 'String'));
% --------------------------------------------------------------------
function varargout = closeButton_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.closeButton.
% close all;
delete(gcbf);
% --------------------------------------------------------------------
function varargout = signalGenNumberPopupMenu_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.signalGenNumberPopupMenu.
loadSignalGeneratorData(handles);
setEnables(handles);
% --------------------------------------------------------------------
function varargout = plotButton_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.plotButton.
global SignalGenerators SignalGeneratorDimension
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
figure(1); clf;
sigTemp = SignalGenerators(signalNum,:);
tot = str2double(get(handles.lengthOfRunText, 'String'));
dTime = 0.0005; %% Needs to be changed to Nyquist limit of signal -cha
t = [0:dTime:tot];
componentDim = SignalGeneratorDimension(signalNum);
sig = sim_genSignal(t, sigTemp, componentDim);
plot(t,sig');
titlestr=['External Input',num2str(signalNum)];
title(titlestr);
comstr = 'component';
legstr = zeros(componentDim,length(comstr)+3);
for(i=1:componentDim);
if(i<10)
legstr(i,:) = [comstr,' ',num2str(i),' '];
else
legstr(i,:) = [comstr,' ',num2str(i)];
end
end
legend(char(legstr));
% --------------------------------------------------------------------
function varargout = dcOffsetText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.dcOffsetText.
global NumSignalGenerators SignalGenerators
componentNum = get(handles.componentPopupMenu, 'Value');
signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).dcOffset = str2double(get(handles.dcOffsetText, 'String'));
% --------------------------------------------------------------------
function varargout = componentPopupMenu_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.componentPopupMenu.
loadSignalGeneratorData(handles);
setEnables(handles);