my $poll = 0;
my $cmd = "";
my $verbose = 0;
+my $invert_trigger = 0;
my $fh;
'device|d=s' => \$ser_dev,
'poll|p' => \$poll,
'verbose|v' => \$verbose,
+ 'invert_trigger|i' => \$invert_trigger,
) ;
-
+if ($help || (defined $ARGV[0] && $ARGV[0] =~ /help/)) {
+ exit;
+ }
+
+
$ser_dev = "/dev/ttyUSB1" unless defined $ser_dev;
$cmd = "RD0" if $poll;
+my $last = 0;
+
+
+my $c = "stty -F $ser_dev 921600 raw";
+#my $c = "stty -F $ser_dev -isig -icanon -iexten speed 921600 time 100";
+my $r = qx($c);
+print $r;
+
+$r = open ($fh, "+<", $ser_dev);
+unless ($fh) {
+ print "can't open serial interface $ser_dev\n";
+ exit;
+}
+
+$|=1;
+
+
+
+sub Stream {
+ my $v = 0;
+ while(<$fh>) {
+ if ($_ =~ /R([A-Fa-f0-9]{8})/) {$v = hex($1);}
+ next if ($v>>16 & 0xffff) == 0xdead;
+ unless ($v & 0x80000000) {next;}
+ next if $last == $v;
+ $counters[($v&0xf) + (($v>>30 & 1) << 8)]++;
+ my $diff = ($v>>4 & 0x3fffff)*8+($v & 0x7) - ($last>>4 & 0x3fffff)*8-($last & 0x7);
+ $diff += 2**25 if $diff < 0;
+ printf("%i\t%i\t%03x\t%i\t%i\n",$v>>30 & 1, $v>>26 & 0xf, ($v & 0x0f), $v>>4 & 0x3fffff, $diff) if $verbose;
+ $last = $v if (($v>>30 & 1)==$invert_trigger) && (($v>>26&0xf) == 8) ;
+ }
+ }
+
sub Cmd {
my ($c) = @_;
return 7 if($v == 0x0ff || $v == 0x100);
return $v;
}
-
-
-if ($help || (defined $ARGV[0] && $ARGV[0] =~ /help/)) {
- exit;
- }
$SIG{"INT"} = \&finish;
$SIG{"QUIT"} = \&stats;
sub finish{
- exit;
+ my $v = Cmd("W0000000000");
stats();
exit;
}
sub stats{
- my $v = Cmd("W0000000000");
print "----------------------\n";
print "Bin\tCnt1\tSize1\tCnt2\tSize2\n";
my @sum;
# main
-my $c = "stty -F $ser_dev 921600";
-#my $c = "stty -F $ser_dev -isig -icanon -iexten speed 921600 time 100";
-my $r = qx($c);
-print $r;
-
-$r = open ($fh, "+<", $ser_dev);
-#$r = sysopen ($fh, $ser_dev, O_RDWR);
-#$r = open ($fh, "+>", "delme2");
-unless ($fh) {
- print "can't open serial interface $ser_dev\n";
- exit;
-}
-
-$|=1;
my $v;
-my $last = 0;
-# for (1..1000) {
-# my $res = Cmd("RFF123456");
-# $res =~ s/(.|\r|\n)/sprintf("%8.8b:",ord($1))/eg;
-# #my @res = $res =~ /\/;
-# print "$res\n";
-# #printf "register R2%d: %s\n", $i, Cmd("R2"."$i");
-# }
-#
-# exit;
-# printf "command RD0: %s\n", Cmd("RD0");
Cmd("W0000000001") unless $poll;
-#exit;
+
print "Edge\tChan\tFine\tCoarse\tDiff to last leading edge in 500ps bins\n";
-while(1) {
-# usleep(1000);
-# printf("%08x\n",$v);
- $v = Cmd("$cmd");
- next if ($v>>16 & 0xffff) == 0xdead;
- unless ($v & 0x80000000) {next;}
- next if $last == $v;
- $counters[($v&0xf) + (($v>>30 & 1) << 8)]++;
- my $diff = ($v>>4 & 0x3fffff)*8+($v & 0x7) - ($last>>4 & 0x3fffff)*8-($last & 0x7);
- $diff += 2**24 if $diff < 0;
- printf("%i\t%i\t%03x\t%i\t%i\n",$v>>30 & 1, $v>>26 & 0xf, ($v & 0x0f), $v>>4 & 0x3fffff, $diff) if $verbose;
- $last = $v if $v>>30 & 1;
+if(!$poll) {Stream();}
+else {
+ while(1) {
+ $v = Cmd("$cmd");
+ next if ($v>>16 & 0xffff) == 0xdead;
+ unless ($v & 0x80000000) {next;}
+ next if $last == $v;
+ $counters[($v&0xf) + (($v>>30 & 1) << 8)]++;
+ my $diff = ($v>>4 & 0x3fffff)*8+($v & 0x7) - ($last>>4 & 0x3fffff)*8-($last & 0x7);
+ $diff += 2**25 if $diff < 0;
+ printf("%i\t%i\t%03x\t%i\t%i\n",$v>>30 & 1, $v>>26 & 0xf, ($v & 0x0f), $v>>4 & 0x3fffff, $diff) if $verbose;
+ $last = $v if $v>>30 & 1;
+ }
}