display io and offset for p command
[x300-pci] / gpio.pl
diff --git a/gpio.pl b/gpio.pl
index ed000c9..078e63f 100755 (executable)
--- a/gpio.pl
+++ b/gpio.pl
@@ -1,17 +1,37 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
+use autodie;
+
+package gpio;
 
 use Data::Dump qw(dump);
 
 my @last;
+my $mode;
 
-while(1) {
+my $bcm_desc;
+foreach my $pin_file ( glob 'pins/bcm-*.tsv' ) {
+       open(my $fh, '<', $pin_file);
+       while(<$fh>) {
+               chomp;
+               my ($pin,$desc) = split(/\t+/,$_,2);
+               $bcm_desc->{$pin} = $desc;
+       }
+       close($fh);
+       warn "# $pin_file ",dump($bcm_desc);
+}
+
+sub add_bcm_desc {
+       my ( $pin, $desc ) = @_;
+       $bcm_desc->{$pin} = $desc;
+}
+
+sub pins {
 
 my @pcf = `gpio -x pcf8591:120:0x48 readall`;
 my @gpio = `gpio -g readall`;
 my $i = 0;
-my $mode;
 
 foreach (@gpio) {
        chomp;
@@ -24,34 +44,48 @@ foreach (@gpio) {
        s/([ \d]{2})(...GPIO.)../$1$2$1/;
        s/(GPIO.)..(...)(\s*\d+)/$1$3$2$3/;
 
-       my $line = $_ . ( shift @pcf || '');
+       my $line = substr($_,0,29) . '  ' . substr($_,39);
+       if ( my $add = shift @pcf ) {
+               $line .= '  ' . $add;
+       }
+
        chomp $line;
        my @l = split(/\|/, $line);
-       if ( $#l > 10 ) {
+       my @o = split(/\|/, $last[$i] || '');
+
+       if ( $#l >= 9 ) {
                no warnings;
+
+               $l[2] = sprintf "%-" . length($l[2]) . 's', ($bcm_desc->{ $1 }||$l[2]) if $l[1] =~ m/(\d+)/;
+               $l[8] = sprintf "%"  . length($l[8]) . 's', ($bcm_desc->{ $1 }||$l[8]) if $l[9] =~ m/(\d+)/;
+
                $mode->{ $l[1]  } = [ $l[4] + 0, $l[2], $l[3] ];
-               $mode->{ $l[11] } = [ $l[8] + 0, $l[10], $l[9] ];
-               $mode->{ $l[13] } = [ $l[14], $l[15] ] if $l[15];
-               #warn "## l = ",dump(@l);
+               $mode->{ $l[9]  } = [ $l[6] + 0, $l[8], $l[7] ];
+               $mode->{ $l[11] } = [ $l[12], $l[13] ] if $l[13];
+               #warn "## l = ",dump(@l) if $i > 2 && $i < 5;
        }
        
 
        if ( $last[$i] && $line ne $last[$i] ) {
-               my @o = split(/\|/, $last[$i]);
                foreach my $i ( 0 .. $#l ) {
                        $l[$i] = "\e[33;7;1m$l[$i]\e[0m" if $l[$i] ne $o[$i];
                }
-               print join('|', @l), "|\n";
-       } else {
-               print "$line\n";
        }
+
        $last[$i] = $line;
        $i++;
 
+       # re-create from modified data
+       $line = join('|', @l);
+       $line .= "|" unless $line =~ m/\+$/;
+       print "$line\n";
+
 }
 
 #warn "# mode = ", dump($mode);
 
+} #/gpio
+
 sub pin2dir {
        my $pin = shift;
        my ($p) = grep { /$pin/ } keys %$mode;
@@ -60,20 +94,30 @@ warn dump($p);
        warn "# pin2dir $pin = $dir\n";
        return $dir;
 }
-       
 
-my $cmd = <STDIN>;
-chomp $cmd;
-if ( $cmd =~ m/^(\d+)$/ ) {
-       my $pin = $1;
-       system "gpio -g mode $pin out" unless pin2dir($pin) =~ m/OUT/i;
-
-       my $v = `gpio -g read $pin`;
-       warn "# pin $pin ", $v;
-       $v ^= 1;
-       system "gpio -g write $pin $v";
+sub cmd {
+       my $cmd = shift;
+       chomp $cmd;
+       if ( $cmd =~ m/^(\d+)$/ ) {
+               my $pin = $1;
+               system "gpio -g mode $pin out" unless pin2dir($pin) =~ m/OUT/i;
+
+               my $v = `gpio -g read $pin`;
+               warn "# pin $pin ", $v;
+               $v ^= 1;
+               system "gpio -g write $pin $v";
+       } elsif ( $cmd =~ m/^gpio\s+(.+)/ ) {
+               system "gpio -g $1";
+       }
 }
 
+package main;
+
+return 1 if caller; # used as module
 
-} #/while
+while(1) {
+       gpio::pins();
+       my $cmd = <STDIN>;
+       gpio::cmd($cmd);
+}