X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=gpio.pl;h=078e63f4aeaa7d82dae8a105eab3fdf8b6919499;hb=69cca0f4ce6c9408d6d4ed838f82c43bf2ecc9b4;hp=ed000c9a2891c9241eb754480539d154f422d584;hpb=59ebb73515084b685183ee87756fba412cb46725;p=x300-pci diff --git a/gpio.pl b/gpio.pl index ed000c9..078e63f 100755 --- 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 = ; -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 = ; + gpio::cmd($cmd); +}