rewrite to enable usage as module
[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 = $_ . ( shift @pcf || '');
30         chomp $line;
31         my @l = split(/\|/, $line);
32         if ( $#l > 10 ) {
33                 no warnings;
34                 $mode->{ $l[1]  } = [ $l[4] + 0, $l[2], $l[3] ];
35                 $mode->{ $l[11] } = [ $l[8] + 0, $l[10], $l[9] ];
36                 $mode->{ $l[13] } = [ $l[14], $l[15] ] if $l[15];
37                 #warn "## l = ",dump(@l);
38         }
39         
40
41         if ( $last[$i] && $line ne $last[$i] ) {
42                 my @o = split(/\|/, $last[$i]);
43                 foreach my $i ( 0 .. $#l ) {
44                         $l[$i] = "\e[33;7;1m$l[$i]\e[0m" if $l[$i] ne $o[$i];
45                 }
46                 print join('|', @l), "|\n";
47         } else {
48                 print "$line\n";
49         }
50         $last[$i] = $line;
51         $i++;
52
53 }
54
55 #warn "# mode = ", dump($mode);
56
57 } #/gpio
58
59 sub pin2dir {
60         my $pin = shift;
61         my ($p) = grep { /$pin/ } keys %$mode;
62 warn dump($p);
63         my $dir = $mode->{ $p }->[2];
64         warn "# pin2dir $pin = $dir\n";
65         return $dir;
66 }
67
68 sub cmd {
69         my $cmd = shift;
70         chomp $cmd;
71         if ( $cmd =~ m/^(\d+)$/ ) {
72                 my $pin = $1;
73                 system "gpio -g mode $pin out" unless pin2dir($pin) =~ m/OUT/i;
74
75                 my $v = `gpio -g read $pin`;
76                 warn "# pin $pin ", $v;
77                 $v ^= 1;
78                 system "gpio -g write $pin $v";
79         }
80 }
81
82 package main;
83
84 return 1 if caller; # used as module
85
86 while(1) {
87         gpio::pins();
88         my $cmd = <STDIN>;
89         gpio::cmd($cmd);
90 }
91