#!//usr/bin/perl -w

use Getopt::Long;
use IO::Socket;

use strict;

sub mark5_connect ($$);
sub mark5_command ($);


my $mark5port = 2630;

# Options
my $mark4 = 0;
my $tcp = 0;
my $test = 0;
my $port = 2620;
my $host = 'localhost';
my $winsize = 1024; # 1 MB
my $mtu = 1500; # 1 MB
my $ipd = -1; # uSec
my $rate = 0;
my $ntrack = 64;
my $mask = '0xffffffff';
my $bandwidth = 16;

my $config = 0;
my $start=0;
my $stop=0;
my $status=0;

GetOptions('host=s'=>\$host, 'port=i'=>\$port, 'mark4'=>\$mark4,
	   'config'=>\$config, 'start'=>$start, 'stop'=>\$stop, 'status'=>\$status,
	   'tcp'=>\$tcp, 'test'=>\$test,
	   'mtu=i'=>\$mtu, 'ipd=i'=>\$ipd, 'ntrack=i'=>\$ntrack, 'rate=i'=>\$rate,
	   'mask=s'=>\$mask, 'winsize=i'=>\$winsize, 'bandwidth=i'=>\$bandwidth);

die "Cannot start and stop in one command\n" if ($start && $stop);

if (@ARGV!=1) {
  print<<EOF;
Usage: mk5control.pl [options] <mark5>
  'host=s', 'port=i', 'mark4',
	   'config', 'start', 'stop', 'status',
	   'tcp', 'test',
	   'mtu=i', 'ipd=i', 'ntrack=i', 'rate=i',
	   'mask=s', 'winsize=i', 'bandwidth=i'
EOF
  exit(1);
}

my $mark5host = shift @ARGV;

my $mark5 = mark5_connect($mark5host, $mark5port);

if ($rate==0) {
  if ($mark4) {
    $rate=8;
  } else {
    $rate=32;
  }
}

#my $whost = $fa->Entry(-textvariable => \$host, -width => 15, %ePars);

my $donesome = 0;
if ($config) {
  mark5_config();
  $donesome=1;
}
if ($start) {
  mark5_start();
  $donesome=1;
}
if ($stop) {
  mark5_stop();
  $donesome=1;
}
if ($status) {
  mark5_status();
  $donesome=1;
}

sub mark5_command ($) {
  my $cmd = shift;

  print $mark5 "$cmd\n";
  my $response =  <$mark5>;

  print "Returned: $response";
}

sub mark5_connect ($$) {
  my ($host, $port) = @_;

  $mark5 = IO::Socket::INET->new(PeerAddr => $host,
				 PeerPort => $port,
				);
  if (!$mark5) {
    die "Could not connect to $host:$port\n";
  }
  return $mark5;
}

sub mark5_config {
  my $winbytes = $winsize*1024;
  my $protocol;

  if ($tcp) {
    $protocol = 'tcp';
  } else {
    mark5_command("mtu=$mtu");
    $protocol = 'udp';
  }

  if (!$mark4) { # Ie mark5b
    mark5_command("1pps_source=vsi"); 
    if ($test) {
      mark5_command("clock_set=$rate:int:$rate");
    } else {
      mark5_command("clock_set=$rate:ext:$rate");
    }
    mark5_command("dot_set=:force");
    mark5_command("dot?");

    my $decimation = $rate/($bandwidth*2);
    if ($test) {
      mark5_command("mode=tvg:$mask:$decimation");
    } else {
      mark5_command("mode=ext:$mask:$decimation");
    }
  } else {
    if ($test) {
      mark5_command("mode=tvg:$ntrack");
    } else {
      mark5_command("mode=mark4:$ntrack");
    }
    mark5_command("play_rate=data:$rate");
  }

  mark5_command("net_protocol=$protocol:$winbytes:131072:8");
  mark5_command("ipd=$ipd") if (!$tcp);
  mark5_command("port=$port");
}

sub mark5_start {
  mark5_command("in2net=connect:$host");
  mark5_command("in2net=on");
}

sub mark5_stop {
  mark5_command("in2net=disconnect");
}
