collect data to detect pins direction
authorDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 17 Jun 2016 14:29:45 +0000 (16:29 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 17 Jun 2016 14:29:45 +0000 (16:29 +0200)
gpio.pl

diff --git a/gpio.pl b/gpio.pl
index 69390e2..ed000c9 100755 (executable)
--- a/gpio.pl
+++ b/gpio.pl
@@ -1,4 +1,8 @@
 #!/usr/bin/perl
+use warnings;
+use strict;
+
+use Data::Dump qw(dump);
 
 my @last;
 
@@ -7,6 +11,8 @@ while(1) {
 my @pcf = `gpio -x pcf8591:120:0x48 readall`;
 my @gpio = `gpio -g readall`;
 my $i = 0;
+my $mode;
+
 foreach (@gpio) {
        chomp;
 #      next unless /\d\s/;
@@ -20,8 +26,17 @@ foreach (@gpio) {
 
        my $line = $_ . ( shift @pcf || '');
        chomp $line;
+       my @l = split(/\|/, $line);
+       if ( $#l > 10 ) {
+               no warnings;
+               $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);
+       }
+       
+
        if ( $last[$i] && $line ne $last[$i] ) {
-               my @l = split(/\|/, $line);
                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];
@@ -32,15 +47,31 @@ foreach (@gpio) {
        }
        $last[$i] = $line;
        $i++;
+
 }
 
+#warn "# mode = ", dump($mode);
+
+sub pin2dir {
+       my $pin = shift;
+       my ($p) = grep { /$pin/ } keys %$mode;
+warn dump($p);
+       my $dir = $mode->{ $p }->[2];
+       warn "# pin2dir $pin = $dir\n";
+       return $dir;
+}
+       
+
 my $cmd = <STDIN>;
 chomp $cmd;
 if ( $cmd =~ m/^(\d+)$/ ) {
-       my $v = `gpio -g read $1`;
-       warn "# pin $1 ", $v;
+       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 $1 $v";
+       system "gpio -g write $pin $v";
 }