use strict;
use warnings;
use Time::HiRes qw(usleep sleep gettimeofday tv_interval);
sub gpio_enable {
my ($pin,$state) = @_;
if ($state) {
open my $fh,'>','/sys/class/gpio/export' or die "Can't export: $!";
print $fh $pin,"\n";
}
else {
open my $fh,'>','/sys/class/gpio/unexport' or die "Can't unexport: $!";
print $fh $pin,"\n";
}
}
sub gpio_direction {
my ($pin,$direction) = @_;
my $file = "/sys/class/gpio/gpio$pin/direction";
open my $fh,'>',$file
or die "Can't direction $file: $!";
print $fh ($direction ? 'out' : 'in' ),"\n";
}
sub gpio_write {
my ($pin,$value) = @_;
open my $fh,'>',"/sys/class/gpio/gpio$pin/value"
or die "Can't write: $!";
print $fh $value,"\n";
}
my $pin = 132;
gpio_enable($pin,1);
gpio_direction($pin,1);
gpio_write($pin,0);
$SIG{INT} = sub {warn"disabling";gpio_enable($pin,0) };
END { warn"disabling";gpio_enable($pin,0) }
my $width = 370;
sub send_array {
my $state = 1;
for (@_) {
gpio_write($pin,$state);
usleep($width*$_);
$state = $state ? 0 : 1;
}
}
my @prologue = (
1,1, 1,1, 1,1, 1,1, 1,1, 1,1,
2,3, 1,1, 2,2, 1,1, 1,1, 2,1,
1,1, 1,1, 1,2, 1,1, 1,1, 1,1,
1,1, 1,1,
);
my @epilogue = (
1,2, 2,2, 1,3,
);
my @on_signal = (
2,2, 1,1, 1,1, 1,1, 1,1, 2,1, 1,1,
);
my @off_signal = (
1,1, 1,1, 1,1, 1,1, 1,1, 2,2, 2,1,
);
my @train = (
@prologue,
( $ARGV[0] ? @on_signal : @off_signal ),
@epilogue,
);
send_array(@train);
sleep(1);
send_array(@train);
sleep(2);
send_array(@train);