#!/usr/bin/perl -w

use Device::SerialPort;
use Term::ReadKey;
use Getopt::Long;
use Time::HiRes qw(usleep gettimeofday);

use strict;

my $filename = '';
my $second = '';
my $term = '/dev/ttyUSB0';
my $baud = '115200';
my $verbose;

GetOptions (
	    'terminal=s' => \$term, 
	    'baud=s' => \$baud,
    );

$| = 1;

# TODO: add help argument
#    print "Example usage: rftestrx2pcap.pl -t /dev/ttyS0 -b 9600\n";
#    exit;

my $ob = Device::SerialPort->new ($term) or die "Can't start $term\n";
    # next test will die at runtime unless $ob

$ob->baudrate($baud);
$ob->parity('none');
$ob->databits(8);
$ob->stopbits(1);
$ob->read_const_time(1000); # 1 second per unfulfilled "read" call

my $str = '';
my ($sec, $usec, $len);
my @frame;

my $magic = 0xa1b2c3d4;
my $major = 2;
my $minor = 4;
my $zone = 0;
my $sig = 0;
my $snaplen = 0xffff;
my $network = 230; # 802.15.4 no FCS

my $newpacket = 0;
my $len = 0;
my $file_empty = 1;

print pack('LSSLLLL',($magic,$major,$minor,$zone,$sig,$snaplen,$network));

while(1) {
    my ($count, $c) = $ob->read(1);

    if (defined($count) && ($count != 0)) {
	$str .= $c;
	# match if ends in \n or \r and process line
	if(($str =~ /\n$/) ||
	   ($str =~ /\r$/)) {
	    if($str =~ /^rftest-rx --- len 0x(\w\w)/) {
		#new packet
		($sec, $usec) = gettimeofday;
		$len = hex($1);
		print STDERR "rftestline: $sec $usec $len $str";		
		$newpacket = 1;
	    } elsif($str =~ /^\w+/) {		
		# dataline, write out pcap entry
		$str =~ /(.+)/;
		chomp $str;
		my @data = split(' ',$1);

		# do header if this is a new packet
		if($newpacket == 1) {
		    $newpacket = 0;
		    print pack('LLLL',($sec,$usec,$len,$len));
		    print STDERR "new packet: $sec $usec $len " . ($len) . "\n\r";
		    # This header starts the file
		    if ($file_empty == 1) {
		    	$file_empty = 0;
		    }
		}
		# packet payload (don't start the file with a payload)
		if ($file_empty == 0) {
		    print STDERR "dataline: ";		
		    print STDERR $str . "\n\r";

		    foreach my $data (@data) {
		    print pack ('C',hex($data));
		    }
		}

	    }
	    $str = '';
	}
    }
}

$ob -> close or die "Close failed: $!\n";
ReadMode 0;
undef $ob;  # closes port AND frees memory in perl
exit;