ed000c9a2891c9241eb754480539d154f422d584
[x300-pci] / gpio.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use Data::Dump qw(dump);
6
7 my @last;
8
9 while(1) {
10
11 my @pcf = `gpio -x pcf8591:120:0x48 readall`;
12 my @gpio = `gpio -g readall`;
13 my $i = 0;
14 my $mode;
15
16 foreach (@gpio) {
17         chomp;
18 #       next unless /\d\s/;
19
20         # kill wiringpi mapping columns
21         s/^(.{8}).{6}/$1/;
22         s/.{6}(.{8})$/$1/;
23
24         s/([ \d]{2})(...GPIO.)../$1$2$1/;
25         s/(GPIO.)..(...)(\s*\d+)/$1$3$2$3/;
26
27         my $line = $_ . ( shift @pcf || '');
28         chomp $line;
29         my @l = split(/\|/, $line);
30         if ( $#l > 10 ) {
31                 no warnings;
32                 $mode->{ $l[1]  } = [ $l[4] + 0, $l[2], $l[3] ];
33                 $mode->{ $l[11] } = [ $l[8] + 0, $l[10], $l[9] ];
34                 $mode->{ $l[13] } = [ $l[14], $l[15] ] if $l[15];
35                 #warn "## l = ",dump(@l);
36         }
37         
38
39         if ( $last[$i] && $line ne $last[$i] ) {
40                 my @o = split(/\|/, $last[$i]);
41                 foreach my $i ( 0 .. $#l ) {
42                         $l[$i] = "\e[33;7;1m$l[$i]\e[0m" if $l[$i] ne $o[$i];
43                 }
44                 print join('|', @l), "|\n";
45         } else {
46                 print "$line\n";
47         }
48         $last[$i] = $line;
49         $i++;
50
51 }
52
53 #warn "# mode = ", dump($mode);
54
55 sub pin2dir {
56         my $pin = shift;
57         my ($p) = grep { /$pin/ } keys %$mode;
58 warn dump($p);
59         my $dir = $mode->{ $p }->[2];
60         warn "# pin2dir $pin = $dir\n";
61         return $dir;
62 }
63         
64
65 my $cmd = <STDIN>;
66 chomp $cmd;
67 if ( $cmd =~ m/^(\d+)$/ ) {
68         my $pin = $1;
69         system "gpio -g mode $pin out" unless pin2dir($pin) =~ m/OUT/i;
70
71         my $v = `gpio -g read $pin`;
72         warn "# pin $pin ", $v;
73         $v ^= 1;
74         system "gpio -g write $pin $v";
75 }
76
77
78 } #/while
79