tools/ec_list.pl
changeset 186 644a053fe103
child 188 c0e49f4a1c07
equal deleted inserted replaced
185:af570302dcee 186:644a053fe103
       
     1 #!/usr/bin/perl
       
     2 
       
     3 #------------------------------------------------------------------------------
       
     4 #
       
     5 #  e c _ l i s t . p l
       
     6 #
       
     7 #  Userspace tool for listing EtherCAT slaves.
       
     8 #
       
     9 #  $Id: slave.c 340 2006-04-11 10:17:30Z fp $
       
    10 #
       
    11 #------------------------------------------------------------------------------
       
    12 
       
    13 use strict;
       
    14 use Getopt::Std;
       
    15 
       
    16 my $master_index;
       
    17 my $master_dir;
       
    18 
       
    19 #------------------------------------------------------------------------------
       
    20 
       
    21 &get_options;
       
    22 &query_master;
       
    23 exit 0;
       
    24 
       
    25 #------------------------------------------------------------------------------
       
    26 
       
    27 sub query_master
       
    28 {
       
    29     $master_dir = "/sys/ethercat" . $master_index;
       
    30     &query_slaves;
       
    31 }
       
    32 
       
    33 #------------------------------------------------------------------------------
       
    34 
       
    35 sub query_slaves
       
    36 {
       
    37     my $dirhandle;
       
    38     my $slave_dir;
       
    39     my $entry;
       
    40     my $slave_index;
       
    41     my $file_name;
       
    42     my $vendor_name;
       
    43     my @slaves;
       
    44     my $slave;
       
    45 
       
    46     unless (opendir $dirhandle, $master_dir) {
       
    47 	print "Failed to open directory \"$master_dir\".\n";
       
    48 	exit 1;
       
    49     }
       
    50 
       
    51     while ($entry = readdir $dirhandle) {
       
    52         next unless $entry =~ /^slave(\d+)$/;
       
    53 	$slave_dir = $master_dir . "/" . $entry;
       
    54 
       
    55 	$slave = {};
       
    56 	$slave->{'ring_position'} =
       
    57 	    &read_integer("$slave_dir/ring_position");
       
    58 	$slave->{'station_address'} =
       
    59 	    &read_integer("$slave_dir/station_address");
       
    60 	$slave->{'vendor_name'} =
       
    61 	    &read_string("$slave_dir/vendor_name");
       
    62 	$slave->{'product_name'} =
       
    63 	    &read_string("$slave_dir/product_name");
       
    64 	$slave->{'product_desc'} =
       
    65 	    &read_string("$slave_dir/product_desc");
       
    66 	$slave->{'type'} =
       
    67 	    &read_string("$slave_dir/type");
       
    68 
       
    69 	push @slaves, $slave;
       
    70     }
       
    71     closedir $dirhandle;
       
    72 
       
    73     @slaves = sort { $a->{'ring_position'} <=> $b->{'ring_position'} } @slaves;
       
    74 
       
    75     my $coupler_index = -1;
       
    76     my $slave_index = 0;
       
    77     my $abs;
       
    78     my $rel;
       
    79     print "EtherCAT bus listing for master $master_index:\n";
       
    80     for $slave (@slaves) {
       
    81 	if ($slave->{'type'} eq "coupler") {
       
    82 	    print "--------------------------------------------------------\n";
       
    83 	    $coupler_index++;
       
    84 	    $slave_index = 0;
       
    85 	}
       
    86 
       
    87 	$abs = sprintf "%i", $slave->{'ring_position'};
       
    88 	$rel = sprintf "%i:%i", $coupler_index, $slave_index;
       
    89 	printf("%4s %6s   %-15s %-15s %-15s\n", $abs, $rel,
       
    90 	       $slave->{'vendor_name'}, $slave->{'product_name'},
       
    91 	       $slave->{'product_desc'});
       
    92 
       
    93 	if ($slave->{'type'} eq "coupler") {
       
    94 	    print "--------------------------------------------------------\n";
       
    95 	}
       
    96 
       
    97 	$slave_index++;
       
    98     }
       
    99     print "--------------------------------------------------------\n";
       
   100 }
       
   101 
       
   102 #------------------------------------------------------------------------------
       
   103 
       
   104 sub read_string
       
   105 {
       
   106     (my $file_name) = @_;
       
   107     my $data;
       
   108 
       
   109     $data = `cat $file_name 2>/dev/null`;
       
   110     if ($?) {
       
   111 	print "ERROR: Unable to read string $file_name!\n";
       
   112 	exit 1;
       
   113     }
       
   114 
       
   115     chomp $data;
       
   116     return $data;
       
   117 }
       
   118 
       
   119 #------------------------------------------------------------------------------
       
   120 
       
   121 sub read_integer
       
   122 {
       
   123     (my $file_name) = @_;
       
   124 
       
   125     if (`cat $file_name 2>/dev/null` !~ /^(\d+)$/) {
       
   126 	print "ERROR: Unable to read integer $file_name!\n";
       
   127 	exit 1;
       
   128     }
       
   129 
       
   130     return int $1;
       
   131 }
       
   132 
       
   133 #------------------------------------------------------------------------------
       
   134 
       
   135 sub get_options
       
   136 {
       
   137     my %opt;
       
   138     my $optret;
       
   139 
       
   140     $optret = getopts "m:h", \%opt;
       
   141 
       
   142     &print_usage if defined $opt{'h'} or $#ARGV > -1;
       
   143 
       
   144     if (defined $opt{'m'}) {
       
   145 	$master_index = $opt{'m'};
       
   146     }
       
   147     else {
       
   148 	$master_index = 0;
       
   149     }
       
   150 }
       
   151 
       
   152 #------------------------------------------------------------------------------
       
   153 
       
   154 sub print_usage
       
   155 {
       
   156     print "Usage: ec_list [OPTIONS]\n";
       
   157     print "        -m <IDX>    Query master IDX.\n";
       
   158     print "        -h          Show this help.\n";
       
   159     exit 0;
       
   160 }
       
   161 
       
   162 #------------------------------------------------------------------------------