BUSSELECTOR
function [x,y,typ]=BUSSELECTOR(job,arg1,arg2)
// Copyright INRIA
x=[];y=[];typ=[];
select job
case 'plot' then
standard_draw(arg1)
case 'getinputs' then
[x,y,typ]=standard_inputs(arg1)
case 'getoutputs' then
[x,y,typ]=standard_outputs(arg1)
case 'getorigin' then
[x,y]=standard_origin(arg1)
case 'set' then
x=arg1;
graphics=x.graphics;model=x.model;
exprs=graphics.exprs
old_SelectedSignals=exprs(2)(1)
//scs_m=scs_m;
if graphics.pin(1) <> 0 then
//[Signals,ok]=FindSignalsInBus(x,scs_m,graphics.pin(1))
// Signals=exprs(1)
//if ~ok then return;end
else
//Signals=[];
end
//if model.opar<>list() then opar=model.opar(1); else opar=[];end
ok=%f
while ~ok do
//if Signals==[] then ok=%f;message('No Input Signals to Select');return;end
[ln,fun]=where();
if find (fun=="SUPER_f")<>[] then
v=find (fun=="SUPER_f")
fun=fun(1:v(1)-1)
end
if or(fun=="clickin") then
label=list(exprs(2)(1),exprs(1))
[okk,SelectedSignals,outputbus,label]=getvalue('This is just for test',..
['Signal Selected','Output type bus (0=No 1=yes)'],..
list('string',-1,'vec',1),label) // just for test
outputbus=string(outputbus)
ierr=execstr('SelectedSignals=evstr(SelectedSignals)','errcatch');
if ierr<>0 then
message(['The Format you entered for the ""Signal Selected"" is wrong';
'It must be ""[""S1"";""S2""]""']);okk=%f;
end
//[okk,SelectedSignals,outputbus]=BusSelectorProperties(Signals,opar,model.ipar)
else
if ~exists('okk')then okk=%t;end
SelectedSignals=evstr(exprs(2)(1))
outputbus=exprs(1)
end
if ~okk then return;end
ok=%t;
SSignals=unique(SelectedSignals);
if size(SSignals,'*')<size(SelectedSignals,'*') then
ok=%f
message('Signals must be extracted only one time from the bus');
end
//err_signal=setdiff(SelectedSignals(:),Signals(:))
//if err_signal<>[] then
//ok=%f
// message('The Signal ""'+err_signal+'"" in the selected list doesn''t exist in the Signal list. Please check it');
//end
okk=ok
if ok then
outnb=size(SelectedSignals,'*');
// inpsignals=size(Signals,'*');
// onesignalstay=(inpsignals-outnb==1)
// outbus=(inpsignals-outnb>1)
if outputbus=='0' then
if outnb>0 then
out=[-[1:outnb]' -(outnb+[1:outnb]')];
ot=-[1:outnb]'
else out=[],ot=[]
end
[model,graphics,ok]=set_io(model,graphics,list([0 0],-1),list(out,ot),[],[],[],[],1,[])
// exprs=list(Signals',[])
exprs=list(outputbus,list(sci2exp(SelectedSignals(:)),[]))
else
out=[-1 -2],ot=-1
[model,graphics,ok]=set_io(model,graphics,list([0 0],-1),list(out,ot),[],[],[],[],1,1)
//exprs=list(Signals',SelectedSignals(:))
exprs=list(outputbus,list(sci2exp(SelectedSignals(:)),[]))
end
end
if ok then
if or(old_SelectedSignals<>SelectedSignals) then needcompile=4;y=needcompile;end
//graphics.signal_propagated=SelectedSignals;
graphics.exprs=exprs;
//model.opar=list(SelectedSignals);
if outnb>3 & outputbus=='0' then graphics.sz=[10 40+(outnb-3)*10];
else graphics.sz=[10 40];
end
x.model=model;x.graphics=graphics;
break
end
end
needcompile=resume(needcompile);
case 'define' then
model=scicos_model()
model.sim='busselector'
model.out=-1
model.out2=-2
model.outtyp=-1
model.in=0
model.intyp=-1
model.ipar=[]
model.opar=list()
model.blocktype='c'
model.dep_ut=[%t %f]
exprs=list('1',list([],[],[]))
gr_i=' ' //'xstringb(orig(1),orig(2),''BUS'',sz(1),sz(2),''fill'')'
x=standard_define([.5 2],model,exprs,gr_i)
x.graphics.id="DEBUS"
x.graphics.out_implicit='B'
x.graphics.in_implicit="B"
end
endfunction
function [ok,SelSignals,outputbus]=BusSelectorProperties(Signals,opar,outputbus)
SigVal=[]
for i=1:size(Signals,'*')
ind=strindex(Signals(i),' ');
if ind<>[] then
SigVal=[SigVal;strcat(['{',Signals(i),'}'])];
else
SigVal=[SigVal;Signals(i)];
end
end
SSignal=opar(:)
SelectedSignal=[]
for i=1:size(SSignal,'*')
ind=strindex(SSignal(i),' ');
if ind<>[] then
SelectedSignal=[SelectedSignal;strcat(['{',SSignal(i),'}'])];
else
SelectedSignal=[SelectedSignal;SSignal(i)];
end
end
txt=['set www .busselectorxx'
'catch {destroy $www}'
'toplevel $www'
'set numx [winfo pointerx .]'
'set numy [winfo pointery .]'
'wm geometry $www +$numx+$numy'
'wm title $www '"Parameters'"'
'wm iconname $www '"busselector'"'
'#positionWindow $www'
'frame $www.buttons'
'pack $www.buttons -side bottom -fill x -pady 2m'
'button $www.buttons.dismiss -text Dismiss -command {set done 2}'
'button $www.buttons.code -text OK -command {set done 1}'
'pack $www.buttons.dismiss $www.buttons.code -side left -expand 1'
'frame $www.chkbox'
'pack $www.chkbox -side bottom -fill x -pady 2m'
'checkbutton $www.chkbox.outbus -text ""Output as bus"" -variable outputbus'
'pack $www.chkbox.outbus -side right'
'frame $www.signal'
'pack $www.signal -side bottom -fill x -pady 2m'
'listbox $www.signal.lst'
strcat(['lappend SignalsList' SigVal'],' ')
'$www.signal.lst configure -listvariable SignalsList'
'pack $www.signal.lst -side left -expand 1'
'panedwindow $www.signal.buttons -orient vertical -opaqueresize 0'
'button $www.signal.buttons.select -text Select>> '
'button $www.signal.buttons.remove -text Remove '
'$www.signal.buttons add $www.signal.buttons.select'
'$www.signal.buttons.select configure -state disabled'
'$www.signal.buttons add $www.signal.buttons.remove'
'$www.signal.buttons.remove configure -state disabled'
'pack $www.signal.buttons -side left -expand 1'
'listbox $www.signal.lst2'
strcat(['lappend SelectedSignals' SelectedSignal'],' ')
'$www.signal.lst2 configure -listvariable SelectedSignals'
'pack $www.signal.lst2 -side left -expand 1'
];
txt=[txt;
['frame $www.def'
'pack $www.def -side bottom -fill x -pady 2m'
'label $www.def.lab -text ""This block selected signals from a bus""'
'pack $www.def.lab -side left -expand 1']];
tt='';
for i=1:size(SigVal,'*')
SV=strsubst(SigVal(i),'{','');SV=strsubst(SV,'}','');
tt=tt+'""'+SV+'"" ';
end
txt=[txt;
['$www.signal.lst delete 0 end'
'$www.signal.lst insert end '+tt]];
tt='';
for i=1:size(SelectedSignal,'*')
SSG=strsubst(SelectedSignal(i),'{','');SSG=strsubst(SSG,'}','');
tt=tt+'""'+SSG+'"" ';
end
txt=[txt;
['$www.signal.lst2 delete 0 end'
'$www.signal.lst2 insert end '+tt]];
tt='set Selectindx [$www.signal.lst curselection];'+..
'set ButtonState [$www.signal.buttons.select cget -state];'+..
'if {$Selectindx != """" & $ButtonState != ""disabled""} {'+..
'set SelectSignal [$www.signal.lst get $Selectindx];'+..
'$www.signal.lst2 insert end $SelectSignal;}'
txt=[txt;
['proc Select {www} {'+tt+'}']];
tt='set Selectindx [$www.signal.lst2 curselection];'+..
'set ButtonState [$www.signal.buttons.remove cget -state];'+..
'if {$Selectindx != """" & $ButtonState != ""disabled""} {'+..
'$www.signal.lst2 delete $Selectindx;}';
txt=[txt;
['proc Remove {www} {'+tt+'}']];
tt='global SelectedSignals;global outputbus'
txt=[txt;
['proc done1 {www} {'+tt+'}']];
tt1='$www.signal.buttons.select configure -state normal;'+..
'$www.signal.buttons.remove configure -state disabled';
tt2='$www.signal.buttons.remove configure -state normal;'+..
'$www.signal.buttons.select configure -state disabled';
txt=[txt;
['bind $www.signal.lst <1> {'+tt1+'}'
'bind $www.signal.lst2 <1> {'+tt2+'}'
'bind $www.signal.buttons.select <ButtonPress> {Select $www}'
'bind $www.signal.buttons.remove <ButtonPress> {Remove $www}'
'set done 0'
'bind $www <Return> {set done 1}'
'bind $www <Destroy> {set done 2}'
'tkwait variable done'
'if {$done==1} {done1 $www}']];
TCL_EvalStr(txt);
done=TCL_GetVar('done')
if done==string(1) then
outputbus=TCL_GetVar('outputbus');
SelSignals=TCL_GetVar('SelectedSignals');
ok=%t
indxstart=strindex(SelSignals,'{')
indxend=strindex(SelSignals,'}')
if indxstart<>[] then
SignalVect=part(SelSignals,[1:indxstart(1)-1])
SignalVect=tokens(SignalVect)
SignalVect=[SignalVect;part(SelSignals,[indxstart(1)+1:indxend(1)-1])]
for i=2:size(indxstart,'*')
SVect=part(SelSignals,[indxend(i-1)+1:indxstart(i)-1])
SVect=tokens(SVect)
SignalVect=[SignalVect;SVect;part(SelSignals,[indxstart(i)+1:indxend(i)-1])]
end
SVect=part(SelSignals,[indxend($)+1:length(SelSignals)])
SVect=tokens(SVect)
SignalVect=[SignalVect;SVect]
else
SignalVect=tokens(SelSignals);
end
SelSignals=SignalVect
else
ok=%f;SelSignals=opar(:);outputbus=outputbus
end
TCL_EvalStr('destroy $www')
endfunction