summaryrefslogtreecommitdiff
path: root/trasmitter/sender-chip.pl
diff options
context:
space:
mode:
Diffstat (limited to 'trasmitter/sender-chip.pl')
-rw-r--r--trasmitter/sender-chip.pl91
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);