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