view scripts/control/sysidx.m @ 3284:f7e4a95916f2

[project @ 1999-10-13 21:37:04 by jwe]
author jwe
date Wed, 13 Oct 1999 21:37:40 +0000
parents 6dd06d525de6
children 69b167451491
line wrap: on
line source

# Copyright (C) 1999 Auburn University. All rights reserved.
#
# This file is part of Octave.
#
# Octave is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option) any
# later version.
#
# Octave is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with Octave; see the file COPYING.  If not, write to the Free
# Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
#
# Written by A. S. Hodel, a.s.hodel@eng.auburn.edu


function idxvec = sysidx(sys,sigtype,signamelist)
# idxvec = sysidx(sys,sigtype,signamelist)
# return indices of signals with specified signal names
# inputs:
#   sys:         OCST system data structure
#   sigtype:     signal type to be selected: "in", "out", "st"
#   signamelist: list of desired signal names
# outputs:
#   idxvec: vector of signal indices (appropriate for use with sysprune)

if(nargin != 3)         usage("idxvec = sysidx(sys,sigtype,signamelist)");
elseif(!is_struct(sys)) error("sys must be a system data structure");
elseif(!isstr(sigtype)) error("sigtype must be a string");
elseif(rows(sigtype) != 1) 
                        error("sigtype (%d x %d) must be a single string", ...
	                  rows(sigtype),columns(sigtype));
elseif(!is_signal_list(signamelist)) 
                        error("signamelist must be a list of strings");
endif

sigtype_list = list("input","output","state");
sigtnum = 0;
for idx = 1:length(sigtype_list)
  thistype = nth(sigtype_list,idx);
  if(strcmp(sigtype, thistype(1:length(sigtype)) )) sigtnum = idx; endif
endfor
if(sigtnum == 0)  error("Illegal sigtype value = %s\n",sigtype); endif

syssiglist = sysgetsignals(sys,sigtype);

for idx = 1:length(signamelist)
  signame = nth(signamelist,idx);
  idxvec(idx) = 0;
  nsigs = sysdimensions(sys,sigtype);
  for jdx = 1:nsigs
    #printf("idx=%d jdx=%d signame=-%s- thissig=-%s-\n",idx,jdx,signame, ...
    #  sysgetsignals(sys,sigtype,jdx,1));
    if(strcmp(signame,sysgetsignals(sys,sigtype,jdx,1)))
      if(idxvec(idx) != 0)
        warning("Duplicate system input %s (%d,%d)\n", ...
          sysgetsignals(sys,sigtype,jdx,1),jdx,idxvec(idx));
      else
        idxvec(idx) = jdx;
      endif
    endif
  endfor
  if(idxvec(idx) == 0)
    error("Did not find %s %s",nth(sigtype_list,sigtnum),signame);
  endif
endfor


endfunction