#!/usr/bin/perl

use lib 'd:/Programs/Perl/lib';
use lib 'd:/Programs/Perl/lib2.0';
use lib '.';

use strict;
use Win32API::CommPort;
use Win32API::CommPort qw(:RAW :PARAM :STAT 0.19 );
use Win32::SerialPort;

my $WL = 600;
if($ARGV[0] > 0) {
	$WL = $ARGV[0];
}

my $quiet = 0;
my $PortName = "COM1";
my $PortObj = new Win32API::CommPort($PortName, $quiet)
       || die "Can't open $PortName: $^E\n";

$PortObj->is_handshake("rts");           # set parameter
$PortObj->is_baudrate(9600);
$PortObj->is_parity("none");
$PortObj->is_databits(8);
$PortObj->is_stopbits(1);
$PortObj->debug_comm(0);
#$PortObj->is_xon_limit(100);      # bytes left in buffer
#$PortObj->is_xoff_limit(100);     # space left in buffer
#$PortObj->is_xon_char(0x11);
#$PortObj->is_xoff_char(0x13);
#$PortObj->is_eof_char(0x0);
#$PortObj->is_event_char(0x0);
#$PortObj->is_error_char(0);       # for parity errors
$PortObj->is_buffers(4096, 4096);  # read, write
$PortObj->is_read_interval(50);    # max time between read char (millisec)
$PortObj->is_read_char_time(5);     # avg time between read char
$PortObj->is_read_const_time(5);  # total = (avg * bytes) + const 
$PortObj->is_write_char_time(100);
$PortObj->is_write_const_time(1000);
#$PortObj->is_binary("T");               # just say Yes (Win 3.x option)
#$PortObj->is_parity_enable("F");        # faults during input

my @required = qw( BAUD DATA STOP );
my $faults = $PortObj->initialize(@required);
if ($faults) { die "Required parameters not set before initialize\n"; }

my $rbuf = $PortObj->is_read_buf;
print "rbuf: $rbuf\n";
my $milliseconds = $PortObj->get_tick_count;
print "TickCount: $milliseconds\n";

my ($BlockingFlags, $InBytes, $OutBytes, $LatchErrorFlags) = $PortObj->is_status
        || warn "could not get port status\n";
print "BlockingFlags: $BlockingFlags  InBytes: $InBytes  OutBytes: $OutBytes\n";

if ($BlockingFlags) { warn "Port is blocked"; }
if ($BlockingFlags & BM_fCtsHold) { warn "Waiting for CTS"; }
if ($LatchErrorFlags & CE_FRAME) { warn "Framing Error"; }

#my $ClearedErrorFlags = $PortObj->reset_error;
#print "ClearedErrorFlags: $ClearedErrorFlags\n";
#        # The API resets errors when reading status, $LatchErrorFlags
#        # is all $ErrorFlags since they were last explicitly cleared

if(1) {
	print "\n";
	my $output_string = "GOWAVE $WL\n";
#	print "OUT: $output_string";
	my $count_out = $PortObj->write_bg($output_string);      # background write
	print "count_out: $count_out\n";
	my ($done, $count_out) = $PortObj->write_done(0);
	print "done: $done  count_out: $count_out  s: $output_string\n";

	($BlockingFlags, $InBytes, $OutBytes, $LatchErrorFlags) = $PortObj->is_status
        	|| warn "could not get port status\n";
	print "BlockingFlags: $BlockingFlags  InBytes: $InBytes  OutBytes: $OutBytes  LatchErrorFlags: $LatchErrorFlags\n";
}

if(1) {
	print "\n";
	my $output_string = "WAVE?\n";
	print "OUT: $output_string";
	my $count_out = $PortObj->write_bg($output_string);      # background write
#	print "count_out: $count_out\n";
	my ($done, $count_out) = $PortObj->write_done(0);
	print "done: $done  count_out: $count_out  s: $output_string";

	($BlockingFlags, $InBytes, $OutBytes, $LatchErrorFlags) = $PortObj->is_status
        	|| warn "could not get port status\n";
	print "BlockingFlags: $BlockingFlags  InBytes: $InBytes  OutBytes: $OutBytes  LatchErrorFlags: $LatchErrorFlags\n";

	my $InBytes = 1024;
	for(my $i = 0 ; $i < 10 ; $i++) {
		my $count_in = $PortObj->read_bg($InBytes);
#		print "count_in[$i]: $count_in\n";
		my ($done, $count_in, $string_in) = $PortObj->read_done(1);
		        # background read with wait until done
		print "done: $done  count_in: $count_in  s: $string_in\n";
		last if($count_in == 0);
	}
}

$PortObj->close || die;
      # "undef $PortObj" preferred unless reopening port
      # "close" should precede "undef" if both used



#my $result = ClearCommBreak($PortObj);
#print "res: $result\n";
