added two more possible pins
[x300-pci] / gpio.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use autodie;
5
6 package gpio;
7
8 use Data::Dump qw(dump);
9
10 my @last;
11 my $mode;
12
13 my $bcm_desc;
14 foreach my $pin_file ( glob 'pins/bcm-*.tsv' ) {
15         open(my $fh, '<', $pin_file);
16         while(<$fh>) {
17                 chomp;
18                 my ($pin,$desc) = split(/\t+/,$_,2);
19                 $bcm_desc->{$pin} = $desc;
20         }
21         close($fh);
22         warn "# $pin_file ",dump($bcm_desc);
23 }
24
25 sub add_bcm_desc {
26         my ( $pin, $desc ) = @_;
27         $bcm_desc->{$pin} = $desc;
28 }
29
30 sub pins {
31
32 my @pcf = `gpio -x pcf8591:120:0x48 readall`;
33 my @gpio = `gpio -g readall`;
34 my $i = 0;
35
36 foreach (@gpio) {
37         chomp;
38 #       next unless /\d\s/;
39
40         # kill wiringpi mapping columns
41         s/^(.{8}).{6}/$1/;
42         s/.{6}(.{8})$/$1/;
43
44         s/([ \d]{2})(...GPIO.)../$1$2$1/;
45         s/(GPIO.)..(...)(\s*\d+)/$1$3$2$3/;
46
47         my $line = substr($_,0,29) . '  ' . substr($_,39);
48         if ( my $add = shift @pcf ) {
49                 $line .= '  ' . $add;
50         }
51
52         chomp $line;
53         my @l = split(/\|/, $line);
54         my @o = split(/\|/, $last[$i] || '');
55
56         if ( $#l >= 9 ) {
57                 no warnings;
58
59                 $l[2] = sprintf "%-" . length($l[2]) . 's', ($bcm_desc->{ $1 }||$l[2]) if $l[1] =~ m/(\d+)/;
60                 $l[8] = sprintf "%"  . length($l[8]) . 's', ($bcm_desc->{ $1 }||$l[8]) if $l[9] =~ m/(\d+)/;
61
62                 $mode->{ $l[1]  } = [ $l[4] + 0, $l[2], $l[3] ];
63                 $mode->{ $l[9]  } = [ $l[6] + 0, $l[8], $l[7] ];
64                 $mode->{ $l[11] } = [ $l[12], $l[13] ] if $l[13];
65                 #warn "## l = ",dump(@l) if $i > 2 && $i < 5;
66         }
67
68
69         $line = join('|', @l);
70         $line .= "|" unless $line =~ m/\+$/;
71
72
73         if ( $last[$i] && $line ne $last[$i] ) {
74                 $last[$i] = $line; # save before highlight
75                 foreach my $i ( 0 .. $#l ) {
76                         $l[$i] = "\e[33;7;1m$l[$i]\e[0m" if $l[$i] ne $o[$i];
77                 }
78                 $line = join('|', @l);
79                 $line .= "|" unless $line =~ m/\+$/;
80         } else {
81                 $last[$i] = $line;
82         }
83
84
85         $i++;
86
87         # re-create from modified data
88         print "$line\n";
89
90 }
91
92 #warn "# mode = ", dump($mode);
93
94 } #/gpio
95
96 sub pin2dir {
97         my $pin = shift;
98         my ($p) = grep { /$pin/ } keys %$mode;
99 warn dump($p);
100         my $dir = $mode->{ $p }->[2];
101         warn "# pin2dir $pin = $dir\n";
102         return $dir;
103 }
104
105 sub cmd {
106         my $cmd = shift;
107         chomp $cmd;
108         if ( $cmd =~ m/^(\d+)$/ ) {
109                 my $pin = $1;
110                 system "gpio -g mode $pin out" unless pin2dir($pin) =~ m/OUT/i;
111
112                 my $v = `gpio -g read $pin`;
113                 warn "# pin $pin ", $v;
114                 $v ^= 1;
115                 system "gpio -g write $pin $v";
116         } elsif ( $cmd =~ m/^gpio\s+(.+)/ ) {
117                 system "gpio -g $1";
118         }
119 }
120
121 package main;
122
123 return 1 if caller; # used as module
124
125 while(1) {
126         gpio::pins();
127         my $cmd = <STDIN>;
128         gpio::cmd($cmd);
129 }
130