#! perl -w

use Win32::SerialPort 0.08;
package COM1demo3;
use strict;
use Win32;

sub get_tf {
    my $result = shift;
    if ($result) { return "T"; }
    return "F";
}

my $file = "COM1";
my $ob;
my $full_cfg = 0;

# Constructor

if (@ARGV) {
    $file = $ARGV[0];
    $ob = Win32::SerialPort->start ($file) or
        die "could not open port from configuration $file\n";
    # next test would die at runtime without $ob
    $full_cfg++;
}
else {
    $ob = Win32::SerialPort->new ($file) or
        die "could not open port from $file\n";
    # next test would die at runtime without $ob
}

my @carp_off_please = Win32::SerialPort->set_test_mode_active(1);

#### Check Port Settings

my $baud=$ob->baudrate;
my $par=$ob->parity;
my $data=$ob->databits;
my $stop=$ob->stopbits;
my $hshake=$ob->handshake;
my $rint=$ob->read_interval;
my $rconst=$ob->read_const_time;
my $rchar=$ob->read_char_time;
my $wconst=$ob->write_const_time;
my $wchar=$ob->write_char_time;
my ($rbuf, $wbuf)= $ob->buffers;
my $alias=$ob->alias;
my $xof_l=$ob->xoff_limit;
my $xon_l=$ob->xon_limit;

my $user=get_tf(scalar $ob->user_msg);
my $error=get_tf(scalar $ob->error_msg);
my $debug=get_tf(scalar $ob->debug);
my $bin=get_tf(scalar $ob->binary);
my $par_e=get_tf(scalar $ob->parity_enable);

my $xon_c=sprintf("0x%x", scalar $ob->xon_char);
my $xof_c=sprintf("0x%x", scalar $ob->xoff_char);
my $eof_c=sprintf("0x%x", scalar $ob->eof_char);
my $evt_c=sprintf("0x%x", scalar $ob->event_char);
my $err_c=sprintf("0x%x", scalar $ob->error_char);

if ($rint == 0xffffffff) { $rint = "OFF "; }

sub update_menu {
	$baud=$ob->baudrate;
	$par=$ob->parity;
	$data=$ob->databits;
	$stop=$ob->stopbits;
	$hshake=$ob->handshake;
	$rint=$ob->read_interval;
	$rconst=$ob->read_const_time;
	$rchar=$ob->read_char_time;
	$wconst=$ob->write_const_time;
	$wchar=$ob->write_char_time;
	($rbuf, $wbuf)= $ob->buffers;
	$alias=$ob->alias;
	$xof_l=$ob->xoff_limit;
	$xon_l=$ob->xon_limit;

	$user=get_tf(scalar $ob->user_msg);
	$error=get_tf(scalar $ob->error_msg);
	$debug=get_tf(scalar $ob->debug);
	$bin=get_tf(scalar $ob->binary);
	$par_e=get_tf(scalar $ob->parity_enable);

	$xon_c=sprintf("0x%x", scalar $ob->xon_char);
	$xof_c=sprintf("0x%x", scalar $ob->xoff_char);
	$eof_c=sprintf("0x%x", scalar $ob->eof_char);
	$evt_c=sprintf("0x%x", scalar $ob->event_char);
	$err_c=sprintf("0x%x", scalar $ob->error_char);

	if ($rint == 0xffffffff) { $rint = "OFF "; }

	$-=0;
	write;
}

format STDOUT_TOP =

========================  Serial Port Setup ===========================

.

format STDOUT =
A  Alias:      @<<<<<<<<<<<<      M  Read Interval Time     @>>>>>>> MS
               $alias,                                      $rint
B  Baud:       @<<<<<<            N  Read Char. Time        @>>>>>>> MS
               $baud,                                       $rchar
C  Binary:     @<                 O  Read Constant Time     @>>>>>>> MS
               $bin,                                        $rconst
D  Databits:   @<                 P  Write Char. Time       @>>>>>>> MS
               $data,                                       $wchar
E  Parity_En:  @<                 Q  Write Const. Time      @>>>>>>> MS
               $par_e,                                      $wconst
F  Parity:     @<<<<              R  Read Buffer Size       @>>>>>>>
               $par,                                        $rbuf
G  Error Msg:  @<<                S  Write Buffer Size      @>>>>>>>
               $error,                                      $wbuf
H  Handshake:  @<<<<              T  Buffer Send Xon  (top)   @>>>>>
               $hshake,                                       $xon_l
I  User Msg:   @<<<<              U  Buffer Send Xoff (bot)   @>>>>>
               $user,                                         $xof_l
J  Error Char: @<<<<              V  Xoff Character           @>>>>>
               $err_c,                                        $xof_c
K  Event Char: @<<<<              W  Xon Character            @>>>>>
               $evt_c,                                        $xon_c
L  Debug:      @<<<<              X  Eof Character            @>>>>>
               $debug,                                        $eof_c
.

write;

print "\nWaiting 5 seconds before continuing\n";
sleep 5;

$ob->user_msg(1);
$ob->parity("odd");
$ob->parity_enable(1);

update_menu;

unless ($full_cfg) {
    print "\nParity settings will not update until write_settings complete\n";
}

undef $ob;
