function SettingsString=DESOS_settings
% Parameter settings for DESOS model
%
% Author: Ugo Pattacini
% Fetch parameters from settings block in model.
settingsBlock=[bdroot '/SETTINGS'];
[TOrbit,OrbitConst,RO,CompressionType,Compression,PassThrough,PassThroughPerc,...
Limit]=getSettings(settingsBlock,'TOrbit','OrbitConst','RO','CompressionType',...
'Compression','PassThrough','PassThroughPerc','Limit');
TOrbit=eval(TOrbit);
OrbitConst=eval(OrbitConst);
RO=eval(RO);
Compression=eval(Compression);
PassThrough=upper(PassThrough);
PassThroughPerc=eval(PassThroughPerc)/100;
Limit=eval(Limit);
switch upper(CompressionType)
case 'OFF'
Compression=1;
compstr='';
case '1D-FFT'
Compression=1-Compression/100;
compstr=sprintf(' (%s%%)',get_param(bdroot,'CompFact1D'));
case '2D-FFT'
Compression=1-Compression/100;
compstr=sprintf(' (%s%%)',get_param(bdroot,'CompFact2D'));
end
SettingsString=sprintf('\nOrbit Period = %g min\n\n',TOrbit/60);
SettingsString=[SettingsString sprintf('Downlink Data Rate = %g Mbps/ch\n\n',RO)];
SettingsString=[SettingsString sprintf('Compression: %s%s\n\n',CompressionType,compstr)];
SettingsString=[SettingsString sprintf('Pass-Through: %s\n',PassThrough)];
% Entity size [MB]
EnSz=10;
Contacts=load('Contacts');
Contacts=Contacts.Contacts;
% Acquisitions handling
Acquisitions=load('Acquisitions');
Acquisitions=Acquisitions.Acquisitions;
Acquisitions_1=Acquisitions;
d_1=diff(Acquisitions_1(:,2).*Acquisitions_1(:,3));
Acquisitions_1(find(~d_1)+1,:)=[];
Acquisitions_2=Acquisitions;
Acquisitions_2(find(Acquisitions_2(:,3)<2),2)=-1; %#ok<FNDSB>
d_2=diff(Acquisitions_2(:,2));
Acquisitions_2(find(~d_2)+1,:)=[];
[AcqEn_1,AcqIntTime_1]=AcqHandling(Acquisitions_1,Compression,EnSz);
[AcqEn_2,AcqIntTime_2]=AcqHandling(Acquisitions_2,Compression,EnSz);
% ------------------------------
% Pass-Through handling
if strcmpi(PassThrough,'off')
PassThrough_1=[0 0];
PassThrough_2=[0 0];
else
PassThroughPerc=min(PassThroughPerc,1);
PassThroughPerc=max(PassThroughPerc,0);
C=Contacts;
idx=find(C(:,2)>0);
RemoveN=round(length(idx)*(1-PassThroughPerc));
for i=1:RemoveN;
j=round(rand*(length(idx)-1))+1;
C(idx(j),2)=-1;
idx(j)=[];
end
PassThrough_1=ComputeAND(C,AcqEn_1);
PassThrough_2=ComputeAND(C,AcqEn_2);
end
% ------------------------------
OrbitConst=TOrbit*OrbitConst;
ServiceTime=(EnSz*8*2^20)/(RO*1e6);
Tfinal=min(Contacts(end,1),Acquisitions(end,1));
Tfinal=min(Tfinal,TOrbit*Limit);
assignin('base','AcqIntTime_1',AcqIntTime_1);
assignin('base','AcqIntTime_2',AcqIntTime_2);
assignin('base','AcqEn_1',AcqEn_1);
assignin('base','AcqEn_2',AcqEn_2);
assignin('base','PassThrough_1',PassThrough_1);
assignin('base','PassThrough_2',PassThrough_2);
assignin('base','Contacts',Contacts);
assignin('base','Compression',Compression);
assignin('base','Tfinal',Tfinal);
assignin('base','TOrbit',TOrbit); % [s]
assignin('base','OrbitConst',OrbitConst); % [min]
assignin('base','EnSz',EnSz); % [MB]
assignin('base','ServiceTime',ServiceTime); % [s]
%--------------------------------------------------------------------------
function varargout=getSettings(settingsBlock,varargin)
for i=1:length(varargin)
varargout{i}=get_param(settingsBlock,varargin{i});
end
%--------------------------------------------------------------------------
function [AcqEn,AcqIntTime]=AcqHandling(Acquisitions,Compression,EnSz)
sz=size(Acquisitions);
L=sz(1);
AcqEn=[Acquisitions(:,1) -ones(L,1)];
AcqEn(find(Acquisitions(:,2)>0),2)=1; %#ok<FNDSB>
d=diff(AcqEn(:,2));
AcqEn(find(~d)+1,:)=[];
AcqIntTime=Acquisitions(:,1:2);
i=find(AcqIntTime(:,2)<0);
AcqIntTime(i,2)=AcqIntTime(min(i+1,L),2);
sz=size(AcqIntTime);
if sz(1)==1 && AcqIntTime(1,2)<0
AcqIntTime(1,2)=1;
return;
end
if AcqIntTime(end,2)<0
AcqIntTime(end,:)=[];
end
d=diff(AcqIntTime(:,2));
AcqIntTime(find(~d)+1,:)=[];
qty=0;
sz=size(AcqIntTime);
for i=1:sz(1)-1
t=AcqIntTime(i+1,1)-AcqIntTime(i,1);
MBps=AcqIntTime(i,2)*Compression/(8*2^20);
MB=max(MBps*t+qty,0);
EnNum=round(MB/EnSz);
qty=MB-EnNum*EnSz;
AcqIntTime(i,2)=t/(EnNum+1);
end
AcqIntTime(end,2)=(EnSz*8*2^20)/(AcqIntTime(end,2)*Compression);
%--------------------------------------------------------------------------
function y=ComputeAND(x1,x2)
t1=x1(:,1);
t2=x2(:,1);
t=sort([t1; t2]);
d=diff(t);
t(find(~d)+1)=[];
L=length(t);
y1=zeros(L,1);
[c,i]=intersect(t,t1);
y1(i)=max(x1(:,2),0);
j=setdiff(1:L,i);
for k=1:length(j)
if j(k)>1
y1(j(k))=y1(j(k)-1);
end
end
y2=zeros(L,1);
[c,i]=intersect(t,t2);
y2(i)=max(x2(:,2),0);
j=setdiff(1:L,i);
for k=1:length(j)
if j(k)>1
y2(j(k))=y2(j(k)-1);
end
end
y=[t and(y1,y2)];
d=diff(y(:,2));
y(find(~d)+1,:)=[];