diff options
Diffstat (limited to 'trasmitter/sender-chip.pl')
-rw-r--r-- | trasmitter/sender-chip.pl | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/trasmitter/sender-chip.pl b/trasmitter/sender-chip.pl new file mode 100644 index 0000000..f6d3dd3 --- /dev/null +++ b/trasmitter/sender-chip.pl @@ -0,0 +1,91 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Time::HiRes qw(usleep sleep gettimeofday tv_interval); + +# my $base = do { +# open my $fh,'<','/sys/class/gpio/gpiochip405/base' or die "can't get base: $!"; +# my $line = <$fh>; +# chomp($line); +# $line; +# }; + +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; # CSID0 +#my $pin = $base+0; # XIO0 + +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; # this seems to provide pulse widths close enough to + # what we need, it's 106 samples at 192kHz + +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, # the last value doesn't much matter +); + +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); |