%% ===========================================================================
% Copyright (C):
%       1998-2000 by Telia Research AB, Lulea, Sweden
%       2001-2002 by Forschungszentrum Telekommunikation Wien, Austria;
%                                                         All rights reserved.
% Description   : Graphical setup window for duplex simulator
%
% File          : uiSetup.m
% Project       : FSAN duplex model
% Author(s)     : Tomas Nordstrom (Tomas.Nordstrom@FTW.at)
%               : Daniel Bengtsson (Daniel.J.Bengtsson@Telia.se)
%
% CVS:       $Id: uiSetup.m,v 1.4 2002/06/06 15:02:44 tono Exp $
%% ===========================================================================
% Change History
%      1998-12-15 (ToNo) Created
%      1998-12-16 (ToNo) Added popups for scenario and duplex setting
%      1998-12-16 (ToNo) Added parameter editing and start button
%      1998-12-17 (ToNo) Removed uiInit (set things here instead)
%      1998-12-17 (ToNo) Added more parameters for editing (like PBO)
%      1998-12-22 (ToNo) Added more comments
%      1999-01-04 (ToNo) Fixed handling of efficiencyLoss
%      1999-01-05 (ToNo) Changed modem under test selection, Added FSAN
%                        noise model selection, Removed precalc models
%      1999-01-11 (ToNo) Let HAM band flag be reflected in PSD plot
%                        and allowed instant window resizing
%      1999-01-14 (ToNo) Working on the str2mat/mat2str & char bug
%      1999-02-05 (DaB)  Added go function in go button
%      1999-02-07 (ToNo) Modified layout to encompass NEXT/FEXT/3cXT levels
%      1999-02-12 (ToNo) Added support for PBOmaxlen
%      1999-02-25 (ToNo) Generlized list (tfplist) handling
%      1998-02-26 (ToNo) Made tt scenarios into a list
%      1999-08-12 (DaB)  Rewritten for new efficiencyLoss struct 
%      1999-08-19 (DaB)  Updated for new tfplan struct
%      1999-10-01 (DaB)  Rewritten for new ex struct
%      1999-10-22 (ToDo) Added ADSL eff box
%      2000-03-31 (UvAn) Updated gui.lc when new entry from VDSL duplex popup menu
%      2001-07-05 (ToNo) Now we support two-sided colored background noise
%      2002-06-05 (StTr) Definition of the resize function needs
%                        to be placed after all uicontrol commands in
%                        order to prevent a self-call of uiSetup.m
%                        caused by uicontrol calls with a 'pos'
%                        parameter (crashes Windows version of Matlab 6.1)
%% ===========================================================================
global ex;
global gui;

gui.tfplan              = getList(ex.tfplist,gui.vdslDuplex);
gui.lc                  = getList(ex.lclist,gui.tfplan.lcname);
gui.tfplan.PSD.PBO.param.maxlen=getMaxVDSLlength(ex.tt.topology,ex.tt.traffic);
gui.efficiencyLoss.ADSL = 0.1;

figure(gui.setupfig);			% Use and show our setup window
clf;

gui.figsize=get(gcf,'Position');	% Define sizes and positions of figures
gui.fwidth=gui.figsize(3);
gui.fheight=gui.figsize(4);
gui.uiheight=225;			% User interaction area height
gui.plotheight=(gui.fheight-gui.uiheight)/2; 	% Make space for two diagrams
gui.plotbd=35;

% Coordinates for some of the drawing areas (axes); RECT = [left, gui.bottom, width, height]
gui.coordall=[1 1 gui.fwidth gui.fheight];
gui.coordui=[1 gui.fheight-gui.uiheight gui.fwidth gui.uiheight];
gui.coordfm=[gui.plotbd gui.plotheight+gui.plotbd gui.fwidth-gui.plotbd*2 gui.plotheight-gui.plotbd*2];
gui.coordfl=[gui.plotbd gui.plotbd gui.fwidth-gui.plotbd*2 gui.plotheight-gui.plotbd*2];
 
% Set up drawing areas
gui.sallax=axes('Units','pixels','pos',gui.coordall);	% The whole window
axis('off');
gui.suiax=axes('Units','pixels','pos',gui.coordui);	% User interaction area
fill([0 0 1 1] ,[0 1 1 0],'w');
axis('off');
gui.plotheight=(gui.fheight-gui.uiheight)/2;
gui.tgui.fax=axes('Units','pixels','pos',gui.coordfm);	% Area for TF plan
axis('off');
gui.psdax=axes('Units','pixels','pos',gui.coordfl);	% Area for VDSL PSD mask
axis('off');

gui.fontSize=get(0,'DefaultTextFontSize');

%% ===========================================================================
% Show & set parameters
axes(gui.sallax);

% Print version
tmpstr= sprintf('Version %.1f',fsansimuVersion);
text(gui.fwidth-10, gui.fheight-10, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize, 'HorizontalAlignment', 'right');

% Set up scenario popup menu
tmpstr= sprintf('Scenario:');
text(20, gui.fheight-20, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+2,'FontWeight','bold');

gui.scen = getNameList(gui.ttlist);
tmpval=1;
for i=1:length(gui.scen(:,1)), % get previous value selected
    if strcmp(deblank(gui.scen(i,:)),ex.tt.name)
        tmpval=i; break;
    end
end
uicontrol('style','popupmenu','string', gui.scen, 'value',tmpval,...
  'units','pixels','pos',[20, gui.fheight-50 270 20], ...
  'FontSize', gui.fontSize+1, 'BackgroundColor', [1 1 0.9], ...
  'callback', 'ex.tt=getList(gui.ttlist,deblank(gui.scen(get(gcbo, ''value''),:)));axes(gui.psdax);plotTTstructure(ex.tt);gui.tfplan.PSD.PBO.param.maxlen=getMaxVDSLlength(ex.tt.topology,ex.tt.traffic); set(gui.pbolenui,''string'',num2str(gui.tfplan.PSD.PBO.param.maxlen));' ...
);

% Set up FSAN noise model
gui.dval=getNoiseModels;
tmpval=1;
for i=1:length(gui.dval(:,1)), % get previous value selected
    if strcmp(deblank(gui.dval(i,:)),ex.param.FSANNoiseModel)
        tmpval=i; break; %% WHAT is this tmpval used for? /ToNo 990929
    end
end
tmpstr= sprintf('Use noise model:');
text(20, gui.fheight-60, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
uicontrol('style','popupmenu','string', gui.dval,  'value',1,...
  'units','pixels','pos',[20, gui.fheight-90 270 20], ...
  'FontSize', gui.fontSize+1, 'BackgroundColor', [1 1 0.9], ...
  'callback', 'ex.param.FSANNoiseModel=deblank(gui.dval(get(gcbo, ''value''),:));' ...
  );

% Set up VDSL duplex popup menu
k=1;gui.vval=1;
for i=1:length(ex.tfplist),
    if strncmp(ex.tfplist(i).name,'VDSL',4)
        gui.modemcells(k)={ex.tfplist(i).name};
        if strcmp(ex.tfplist(i).name,gui.vdslDuplex)
            gui.vval=k;
        end
        k=k+1;
    end
end


gui.modems=str2mat(char(gui.modemcells));

tmpstr= sprintf('VDSL duplex:');
text(20, gui.fheight-100, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
uicontrol('style','popupmenu','string', gui.modems,  'value',gui.vval,...
  'units','pixels','pos',[20, gui.fheight-130 270 20], ...
  'FontSize', gui.fontSize+1, 'BackgroundColor', [1 1 0.9], ...
  'callback', 'gui.vdslDuplex=deblank(gui.modems(get(gcbo, ''value''),:));axes(gui.tgui.fax);gui.tfplan=getList(ex.tfplist,gui.vdslDuplex);gui.lc=getList(ex.lclist,gui.tfplan.lcname);plotTFplan(gui.tfplan,''Lin'');set(gui.pbomui,''value'',findStrIndex(getPBOmethods,gui.tfplan.PSD.PBO.method));set(gui.pbopfui,''string'',num2str(gui.tfplan.PSD.PBO.param.freq));set(gui.pboplui,''string'',num2str(gui.tfplan.PSD.PBO.param.len));set(gui.efflvui,''string'',num2str(gui.lc.param.efficiencyLoss));set(gui.tduui,''string'',num2str(gui.tfplan.timeDivision.up));set(gui.tddui,''string'',num2str(gui.tfplan.timeDivision.down));' ...
  );

% Buttons to run things
uicontrol('string','GO', 'Position', [310 gui.fheight-gui.uiheight+10 60 20],...
          'callback','callbackGO;')

uicontrol('string','Close all', 'Position', [430 gui.fheight-gui.uiheight+10 60 20],...
          'callback','close all')

% Parameters to edit
gui.lheight=gui.fheight-20;
gui.delta=20;

gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('Fast calculation:');
text(310, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
uicontrol('style','checkbox','Value',ex.param.frequency.fastrecalc,...
    'units','pixels','HorizontalAlignment','left',...
    'pos',[510 gui.lheight-10 20 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'ex.param.frequency.fastrecalc=get(gcbo,''value'');' ...
    );

gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('Force HAM band:');
text(310, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
uicontrol('style','checkbox','Value',gui.tfplan.PSD.HAM.active,...
    'units','pixels','HorizontalAlignment','left',...
    'pos',[510 gui.lheight-10 20 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.tfplan.PSD.HAM.active=get(gcbo,''value'');axes(gui.tgui.fax);plotTFplan(gui.tfplan,''Lin'');' ...
    );

gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('Test Modem:');
text(310, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
tmpstr= sprintf('ADSL');
text(430, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
uicontrol('style','checkbox','Value',gui.testADSL,...
    'units','pixels','HorizontalAlignment','left',...
    'pos',[510 gui.lheight-10 20 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.testADSL=get(gcbo,''value'');' ...
    );

gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('Background noise LT:');
text(310, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
uicontrol('style','edit',...
    'string',ex.param.bgNoise.LT,'units','pixels',...
    'HorizontalAlignment','left',...
    'pos',[430 gui.lheight-10 100 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'ex.param.bgNoise.LT=get(gcbo,''string'');' ...
    );

gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('SNR max:');
text(310, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
uicontrol('style','edit',...
    'string',num2str(gui.lc.param.SNRMax),'units','pixels',...
    'HorizontalAlignment','left',...
    'pos',[430 gui.lheight-10 100 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.lc.param.SNRMax=str2num(get(gcbo,''string''));' ...
    );

gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('VDSL Line Code: %s',gui.lc.name);
text(310, gui.lheight, tmpstr, 'Units','pixels', 'FontSize', gui.fontSize+1);


gui.lheight=gui.lheight-gui.delta;
text(310, gui.lheight, 'Level:', 'Units','pixels', 'FontSize', gui.fontSize+1);
text(360, gui.lheight, 'NEXT:', 'Units','pixels', 'FontSize', gui.fontSize+1);
text(420, gui.lheight, 'FEXT:', 'Units','pixels', 'FontSize', gui.fontSize+1);
text(480, gui.lheight, '3cXT:', 'Units','pixels', 'FontSize', gui.fontSize+1);

gui.lheight=gui.lheight-gui.delta;
uicontrol('style','edit', 'string',num2str(ex.param.XTlevel.NEXT), ...
    'units','pixels','HorizontalAlignment','left',...
    'pos',[360 gui.lheight-10 50 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'ex.param.XTlevel.NEXT=str2num(get(gcbo,''string''));' ...
    );

uicontrol('style','edit', 'string',num2str(ex.param.XTlevel.FEXT), ...
    'units','pixels','HorizontalAlignment','left',...
    'pos',[420 gui.lheight-10 50 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'ex.param.XTlevel.FEXT=str2num(get(gcbo,''string''));' ...
    );

uicontrol('style','edit', 'string',num2str(ex.param.XTlevel.thirdCXT), ...
    'units','pixels','HorizontalAlignment','left',...
    'pos',[480 gui.lheight-10 50 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'ex.param.XTlevel.thirdCXT=str2num(get(gcbo,''string''));' ...
    );


% Parameters connected to the modem choosen
gui.lheight=gui.fheight-125;
tfplan=getList(ex.tfplist,gui.vdslDuplex);

gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('PBO method:');
text(20, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
gui.pbomethods=getPBOmethods;
gui.pboval=findStrIndex(gui.pbomethods,gui.tfplan.PSD.PBO.method);
gui.pbomui=uicontrol('style','popupmenu','string', gui.pbomethods, 'value',gui.pboval,...
  'units','pixels','pos',[120, gui.lheight-10 100 20], ...
  'FontSize', gui.fontSize+1, 'BackgroundColor', [1 1 0.9], ...
  'callback', ...
  'gui.tfplan.PSD.PBO.method=deblank(gui.pbomethods(get(gcbo, ''value''),:));' ...
);

gui.lheight=gui.lheight-gui.delta;
gui.pboparamstart=110;
tmpstr= sprintf('PBO param:');
text(20, gui.lheight, tmpstr, 'Units','pixels', 'FontSize', gui.fontSize+1);
text(gui.pboparamstart, gui.lheight, 'f:', 'Units','pixels', 'FontSize', gui.fontSize+1);
gui.pbopfui=uicontrol('style','edit',...
    'string',num2str(gui.tfplan.PSD.PBO.param.freq./1e6),'units','pixels',...
    'HorizontalAlignment','left',...
    'pos',[gui.pboparamstart+10 gui.lheight-10 30 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.tfplan.PSD.PBO.param.freq=str2num(get(gcbo,''string'')).*1e6;' ...
    );
text(gui.pboparamstart+40, gui.lheight, 'MHz,', ...
    'Units','pixels', 'FontSize', gui.fontSize);
text(gui.pboparamstart+75, gui.lheight, 'l:', ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
gui.pboplui=uicontrol('style','edit',...
    'string',num2str(gui.tfplan.PSD.PBO.param.len),'units','pixels',...
    'HorizontalAlignment','left',...
    'pos',[gui.pboparamstart+85 gui.lheight-10 30 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.tfplan.PSD.PBO.param.len=str2num(get(gcbo,''string''));' ...
    );
text(gui.pboparamstart+115, gui.lheight, 'm,', ...
    'Units','pixels', 'FontSize', gui.fontSize);

tmpstr= sprintf('l_m_a_x:');
text(gui.pboparamstart+130, gui.lheight-5, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
gui.pbolenui=uicontrol('style','edit',...
    'string',num2str(gui.tfplan.PSD.PBO.param.maxlen),'units','pixels',...
    'HorizontalAlignment','left',...
    'pos',[gui.pboparamstart+155 gui.lheight-10 35 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.tfplan.PSD.PBO.param.maxlen=str2num(get(gcbo,''string''));' ...
    );

gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('Eff. loss VDSL');
text(20, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
gui.efflvui=uicontrol('style','edit',...
    'string',num2str(gui.lc.param.efficiencyLoss), ...
    'units','pixels','HorizontalAlignment','left',...
    'pos',[120 gui.lheight-10 40 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.lc.param.efficiencyLoss=str2num(get(gcbo,''string''));' ...
    );
tmpstr= sprintf('ADSL');
text(180, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
gui.efflaui=uicontrol('style','edit',...
    'string',num2str(gui.efficiencyLoss.ADSL), ...
    'units','pixels','HorizontalAlignment','left',...
    'pos',[220 gui.lheight-10 40 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.efficiencyLoss.ADSL=str2num(get(gcbo,''string''));' ...
    );
 
gui.lheight=gui.lheight-gui.delta;
tmpstr= sprintf('Time div. up:');
text(20, gui.lheight, tmpstr, ...
    'Units','pixels', 'FontSize', gui.fontSize+1);
gui.tduui=uicontrol('style','edit',...
    'string',num2str(gui.tfplan.timeDivision.up),'units','pixels',...
    'HorizontalAlignment','left',...
    'pos',[120 gui.lheight-10 40 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.tfplan.timeDivision.up=str2num(get(gcbo,''string''));' ...
    );
text(180, gui.lheight, 'down:', 'Units','pixels', 'FontSize', gui.fontSize+1);
gui.tddui=uicontrol('style','edit',...
    'string',num2str(gui.tfplan.timeDivision.down),'units','pixels', ...
    'HorizontalAlignment','left',...
    'pos',[220 gui.lheight-10 40 20],'backgroundcolor', [1 1 0.9], ...
    'callback', 'gui.tfplan.timeDivision.down=str2num(get(gcbo,''string''));' ...
    );


% Show traffic and topology structure
axes(gui.psdax);
plotTTstructure(ex.tt);

% Show PSD masks for VDSL modem
axes(gui.tgui.fax);
gui.fax.min=ex.param.frequency.min;
gui.fax.max=ex.param.frequency.max;
plotTFplan(getList(ex.tfplist,gui.vdslDuplex),'Lin');

set(gui.setupfig,'ResizeFcn','uiSetup')

drawnow;