Interfacing function
eng


BUSSELECTOR

File content


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