#!/usr/bin/perl -w use strict; package JKLMwiringPi; use strict; use Inline C => Config => ENABLE => AUTOWRAP => LIBS => "-lwiringPi "; use Inline C => <<"--END-C--"; int wiringPiSetup() ; void pinMode(int pin, int mode) ; int digitalRead(int pin) ; void digitalWrite(int pin, int value) ; void delay(unsigned int howLong); --END-C-- sub setup { my $proto = shift; # MAGIC - DO NOT TRY TO UNDERSTAND THIS my $class = ref($proto) || $proto; # MAGIC - DO NOT TRY TO UNDERSTAND THIS my $self = undef; my $success = wiringPiSetup; if ($success >= 0) { $self = {"success" => $success}; bless $self, $class; # MAGIC - DO NOT TRY TO UNDERSTAND THIS return $self; }; return undef; }; sub pin_mode { my $self = shift; return undef unless $self; my ($pin, $mode, $mode1); while (@_ > 1) { $pin = shift; $mode = shift; $mode1 = 0; if ($mode =~ /[1oO]/) { $mode1 = 1; }; pinMode $pin + 0, $mode1; }; return $self; }; sub ms_delay { my $self = shift; return undef unless $self; my $ms = shift; delay $ms + 0; return $self; }; sub digital_read { my $self = shift; return undef unless $self; my @ans = (); foreach (@_) { push @ans, digitalRead($_ + 0); }; return wantarray ? @ans : $ans[0]; }; sub digital_write { my $self = shift; return undef unless $self; my ($pin, $state, $state1); while (@_ > 1) { $pin = shift; $state = shift; $state1 = 0; if ($state =~ /[1nN]/) { $state1 = 1; }; digitalWrite $pin + 0, $state1; }; return $self; };
1;
package Main; use strict; $| = 1; my ($pin, $state, $wait, $array_ref, @array, $button); # Each element is an array reference constructor: # [ pin to affect, state to set it to, milliseconds to wait ] my @seq = ([0, 1, 500], [1, 1, 500], [2, 1, 0], [0, 0, 500], [3, 1, 0], [1, 0, 500], [4, 1, 0], [2, 0, 500], [5, 1, 0], [3, 0, 500], [6, 1, 0], [4, 0, 500], [7, 1, 0], [5, 0, 500], [6, 0, 500], [7, 0, 1500], [7, 1, 500], [6, 1, 500], [5, 1, 0], [7, 0, 500], [4, 1, 0], [6, 0, 500], [3, 1, 0], [5, 0, 500], [2, 1, 0], [4, 0, 500], [1, 1, 0], [3, 0, 500], [0, 1, 0], [2, 0, 500], [1, 0, 500], [0, 0, 1500]); # Initialise GPIO my $gpio = JKLMwiringPi->setup; die "Something wrong with JKLMwiringPi->setup" unless $gpio; # Set ports 0 - 7 as outputs and port 8 as an input; note this channel has a # pull-up resistor $gpio->pin_mode(0 => "out", 1 => "out", 2 => "out", 3 => "out", 4 => "out", 5 => "out", 6 => "out", 7 => "out", 8 => "in"); # Main loop: Keep going around as long as button is unpressed (due to wiring, # button shows 0 when pressed) while ($button =$gpio->digital_read(8)) { push @seq, $array_ref = shift @seq; ($pin, $state, $wait) = @{$array_ref}; print "Turning pin $pin "; print $state ? "on" : "off"; $gpio->digital_write($pin, $state); $gpio->ms_delay($wait * .15); print "\n"; }; # Tidy up after ourselves, leaving all outputs off $gpio->digital_write(0 => "off", 1 => "off", 2 => "off", 3 => "off", 4 => "off", 5 => "off", 6 => "off", 7 => "off"); exit 0;
Now, that looks a lot more Perl-like. "Asking" methods such as digital_read() return the thing being asked for. "Telling" methods return the JKLMwiringPi object, so they can be concatenated. So we could write the guts of our main loop as
$gpio->digital_write($pin, $state)->ms_delay($wait * .15);
if we really wanted to. But because of the way I've written pin_mode() and digital_write() to be able to accept arrays, there isn't a great deal of need to.
No comments:
Post a Comment