8 use Data::Dump qw(dump);
14 foreach my $pin_file ( glob 'pins/bcm-*.tsv' ) {
15 open(my $fh, '<', $pin_file);
18 my ($pin,$desc) = split(/\t+/,$_,2);
19 $bcm_desc->{$pin} = $desc;
22 warn "# $pin_file ",dump($bcm_desc);
26 my ( $pin, $desc ) = @_;
27 $bcm_desc->{$pin} = $desc;
32 my @pcf = `gpio -x pcf8591:120:0x48 readall`;
33 my @gpio = `gpio -g readall`;
40 # kill wiringpi mapping columns
44 s/([ \d]{2})(...GPIO.)../$1$2$1/;
45 s/(GPIO.)..(...)(\s*\d+)/$1$3$2$3/;
47 my $line = substr($_,0,29) . ' ' . substr($_,39);
48 if ( my $add = shift @pcf ) {
53 my @l = split(/\|/, $line);
54 my @o = split(/\|/, $last[$i] || '');
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+)/;
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;
69 $line = join('|', @l);
70 $line .= "|" unless $line =~ m/\+$/;
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];
78 $line = join('|', @l);
79 $line .= "|" unless $line =~ m/\+$/;
87 # re-create from modified data
92 #warn "# mode = ", dump($mode);
98 my ($p) = grep { /$pin/ } keys %$mode;
100 my $dir = $mode->{ $p }->[2];
101 warn "# pin2dir $pin = $dir\n";
108 if ( $cmd =~ m/^(\d+)$/ ) {
110 system "gpio -g mode $pin out" unless pin2dir($pin) =~ m/OUT/i;
112 my $v = `gpio -g read $pin`;
113 warn "# pin $pin ", $v;
115 system "gpio -g write $pin $v";
116 } elsif ( $cmd =~ m/^gpio\s+(.+)/ ) {
123 return 1 if caller; # used as module