image thumbnail
from sldvmisscovtool by Yasumitsu Ito
A GUI tool to obtain test cases for missing coverage objectives

simdata2SignalBuilder.m
function [stat,sigbul] = simdata2SignalBuilder(simdata,GroupLabel,sigbul,Mode)
% SIMDATA2SIGNALBUILDER convert Structure with time data to Signal Builder
% Inputs:
%  simdata: a struct array with structure with time format
%  GroupLabel: Group label for SignalBuilder block. "Test Case xx" will be
%     used if this value is emtpy.
%  blk: Existing SignalBuilder block. New SignalBuilder block will created if this value is empty.
%

%   Copyright 2010-2011 The MathWorks, Inc. 

stat = true;

Nsig = length(simdata(1).signals); % number of signals
Ntc = length(simdata); % number of test cases

tvec = cell(Nsig,Ntc);
dvec = cell(Nsig,Ntc);
siglabels = cell(1,Nsig);
grplabels = cell(1,Ntc);

% obtaining signal names
for n=1:Nsig
    str = simdata(1).signals(n).label;
    
    if isempty(str) % defalt signal name
        str = sprintf('Signal%02d',n);
    end
    siglabels{n} = str;
    if ~all(simdata(1).signals(n).dimensions == 1)
        if any(strcmp(get(0,'lang'),{'ja_jp.shift_jis','japanese','ja_jp'}))
            warndlgstr = '2ȏ̃f[^̃GNX|[g̓T|[gĂ܂';
        else
            warndlgstr = 'Exporting more than 2 dimensional data is not supported by exportSignalBuilder.m';
        end
        stat = false;
        warndlg(warndlgstr)
        return;
    end
end

%% Add additional values if data varies at the end of time
for n=1:Ntc
    if length(simdata(n).time) == 1
        continue;
    end
    tstep = min(diff(simdata(n).time));
    isvaried = false;
    % check if there are signal(s) which last data varies
    for m=1:Nsig 
        if simdata(n).signals(m).values(end)~=simdata(n).signals(m).values(end-1)
            isvaried = true;
        end
    end
    % if it is varied, add additional data at the end
    if isvaried
        simdata(n).time = [simdata(n).time;  simdata(n).time(end)+tstep;];
        for m=1:Nsig
            simdata(n).signals(m).values = [simdata(n).signals(m).values; simdata(n).signals(m).values(end)];
        end
        if any(strcmp(get(0,'lang'),{'ja_jp.shift_jis','japanese','ja_jp'}))
            warndlgstr = sprintf('̓f[^ŏIlŕωĂ߁At=%f܂Ńf[^ێ悤ύX܂',simdata(n).time(end));
        else
            warndlgstr = sprintf('Because input signals were varied at the end time, this tool added a data to keep the value until t=%f',simdata(n).time(end));
        end
        warning(warndlgstr)

    end
end

%% making time and data vectors to be fed to signalbuilder command.

for n=1:Ntc
    for m=1:Nsig
        tvec{m,n} = simdata(n).time';
        dvec{m,n} = double(simdata(n).signals(m).values');
        % sldvData file sometimes include single time testcase
        % In that case, because Signal builder must have more
        % then two time steps, we add data point at 0.2 sec
        if length(simdata(n).time) == 1
            tvec{m,n} = [simdata(n).time 0.2];
            dvec{m,n} = double([simdata(n).signals(m).values simdata(n).signals(m).values]);
        end
    end
    if isempty(GroupLabel)
        grplabels{n} = sprintf('Test Case %02d',n);
    else
        grplabels{n} = GroupLabel{n};
    end
end

% redefine so that value changes are made within a single step
% rigidly in order to prevent interpolation between values.
for n=1:Ntc
    for m=1:Nsig
        tt = tvec{m,n};
        dd = dvec{m,n};
        
        % create double sized vectors
        % t1x1 t2x1 t2x2 t3x2 t3x3 ...
        dnew = reshape([dd;dd],[1 2*numel(dd)]);
        dnew = dnew(1:end-1);
        tnew = reshape([tt;tt],[1 2*numel(tt)]);
        tnew = tnew(2:end);
        
        % obtain both time and value is not different from previous
        % time step (The first step is always effective)
        effectiveElement=[true (diff(dnew)|diff(tnew))];
        
        tvec{m,n} = tnew(effectiveElement);
        dvec{m,n} = dnew(effectiveElement);
        
    end
end


if isempty(sigbul)
    new_system();
    open_system(bdroot);
    sigbul = [bdroot '/TestCases'];
    signalbuilder(sigbul,'CREATE',tvec,dvec,siglabels,grplabels);
elseif exist('Mode','var') && strcmp(Mode,'replace')
    idx = signalbuilder(sigbul,'ACTIVEGROUP');
    signalbuilder(sigbul,'set',1:length(siglabels),idx,tvec,dvec);
    %signalbuilder(sigbul,'APPEND',tvec,dvec,siglabels,grplabels);
    %signalbuilder(sigbul, 'ACTIVEGROUP',idx);
else    
    signalbuilder(sigbul,'APPEND',tvec,dvec,siglabels,grplabels);
end

% resize the size of the SignalBuilder block
pos = get_param(sigbul,'Position');
set_param(sigbul,'Position',[pos(1) pos(2) pos(3) pos(2)+Nsig*50]);

Contact us at files@mathworks.com