#! perl -w ######################### We start with some black magic to print on failure. BEGIN { $| = 1; print "demo5.plx loaded "; } END {print "not ok 1\n" unless $loaded;} ## use lib './lib'; use Win::SerialPort 0.15; $loaded = 1; print "ok 1\n"; ######################### End of black magic. use Carp; use Win32; use strict; my $ob; my $pass; my @wanted; my $before; my $did_match; sub nextline { my $delay = 0; my $prompt; $delay = shift if (@_); if (@_) { $prompt = shift; } else { $prompt = ""; } my $timeout=$ob->get_tick_count + (1000 * $delay); my $gotit = ""; my $fmatch = ""; my @junk; # this count wraps every 49 days or so $ob->is_prompt($prompt); $prompt =~ s/\n/\r\n/ogs if ($ob->stty_opost && $ob->stty_onlcr); $ob->write($prompt); for (;;) { return unless (defined ($gotit = $ob->lookfor)); if ($gotit ne "") { ($fmatch, @junk) = $ob->lastlook; return ($gotit, $fmatch); } $fmatch = $ob->matchclear; return ("", $fmatch) if ($fmatch); return if ($ob->reset_error); if ( $] >= 5.005 ) { select undef, undef, undef, 0.2; # traditional 5/sec. } elsif ( $] < 5.004 ) { Win32::Sleep (200); # AS 3xx builds } else { sleep 1; # no easy GSAR equivalent } return if ($ob->get_tick_count > $timeout); } } sub waitfor { croak "parameter problem" unless (@_ == 1); $ob->lookclear; nextline ( shift ); } sub stty_char { my $n_char = shift; return '%%%%' if ($n_char eq ""); return $n_char if (2 >= length($n_char)); my $pos = ord $n_char; if ($pos < 32) { $n_char = "^".chr($pos + 64); } if ($pos == 127) { $n_char = "DEL"; } return $n_char; } # starts configuration created by test1.pl my $cfgfile = "COM1_test.cfg"; # =============== execution begins here ======================= # 2: Constructor $ob = Win::SerialPort->start ($cfgfile) or die "Can't start $cfgfile\n"; # next test will die at runtime unless $ob ### setup for dumb terminal, your mileage may vary $ob->stty_echo(1); $ob->stty_icrnl(1); $ob->stty_onlcr(1); $ob->stty_opost(1); ### my $intr = stty_char($ob->stty_intr); my $quit = stty_char($ob->stty_quit); my $eof = stty_char($ob->stty_eof); my $eol = stty_char($ob->stty_eol); my $erase = stty_char($ob->stty_erase); my $kill = stty_char($ob->stty_kill); my $echo = ($ob->stty_echo ? "" : "-")."echo"; my $echoe = ($ob->stty_echoe ? "" : "-")."echoe"; my $echok = ($ob->stty_echok ? "" : "-")."echok"; my $echonl = ($ob->stty_echonl ? "" : "-")."echonl"; my $echoke = ($ob->stty_echoke ? "" : "-")."echoke"; my $echoctl = ($ob->stty_echoctl ? "" : "-")."echoctl"; my $istrip = ($ob->stty_istrip ? "" : "-")."istrip"; my $icrnl = ($ob->stty_icrnl ? "" : "-")."icrnl"; my $ocrnl = ($ob->stty_ocrnl ? "" : "-")."ocrnl"; my $igncr = ($ob->stty_igncr ? "" : "-")."igncr"; my $inlcr = ($ob->stty_inlcr ? "" : "-")."inlcr"; my $onlcr = ($ob->stty_onlcr ? "" : "-")."onlcr"; my $opost = ($ob->stty_opost ? "" : "-")."opost"; my $isig = $ob->stty_isig ? "enabled" : "disabled"; my $icanon = $ob->stty_icanon ? "enabled" : "disabled"; # 3: Prints Prompts to Port and Main Screen my $head = "\r\n\r\n++++++++++++++++++++++++++++++++++++++++++\r\n"; my $e="\r\n....Bye\r\n"; my $tock = <stty_opost && $ob->stty_onlcr); $pass=$ob->write($head); $pass=$ob->write($tock); $ob->error_msg(1); # use built-in error messages $ob->user_msg(1); my $match1 = "YES"; my $match2 = "NO"; my $prompt1 = "Type $match1 or $match2 or exactly to continue\r\n"; $pass=$ob->write($prompt1) if ($ob->stty_echo); $ob->are_match($match1, $match2, "\n"); ($before, $did_match) = waitfor (30); my ($found, $end, $patt, $instead) = $ob->lastlook; if (defined $before) { if ("\n" eq $did_match) { $did_match = "newline"; } print "\ngot: $before...followed by: $did_match...\n"; } else { print "\r\nAborted or Timed Out\r\n"; print "actually received: $instead...\n"; } print $head; $pass=$ob->write($head); $ob->lookclear; ($before, $did_match) = nextline (60, "\nPROMPT:"); if (defined $before) { if ("\n" eq $did_match) { $did_match = "newline"; } print "\ngot: $before...followed by: $did_match...\n"; } else { ($found, $end, $patt, $instead) = $ob->lastlook; print "\r\nAborted or Timed Out\r\n"; print "actually received: $instead...\n"; } sleep 2; ($before, $did_match) = nextline (60, "\nPROMPT2:"); if (defined $before) { if ("\n" eq $did_match) { $did_match = "newline"; } print "\ngot2: $before...followed by: $did_match...\n"; } else { ($found, $end, $patt, $instead) = $ob->lastlook; print "\r\nAborted or Timed Out\r\n"; print "actually received: $instead...\n"; } sleep 2; @wanted = ("BYE"); $ob->are_match(@wanted); ($before, $did_match) = nextline (60, "\ntype 'BYE' to quit:"); if (defined $before) { print "\ngot3: $before...followed by: $did_match...\n"; } else { ($found, $end, $patt, $instead) = $ob->lastlook; print "\r\nAborted or Timed Out\r\n"; print "actually received: $instead...\n"; } ### example from the docs $ob->are_match("text", "\n"); # possible end strings $ob->lookclear; # empty buffers $ob->write("\r\nFeed Me:"); # initial prompt $ob->is_prompt("More Food:"); # new prompt after "kill" char my $gotit = ""; $match1 = ""; until ("" ne $gotit) { $gotit = $ob->lookfor; # poll until data ready die "Aborted without match\n" unless (defined $gotit); last if ($gotit); $match1 = $ob->matchclear; # match is first thing received last if ($match1); sleep 1; # polling sample time } printf "gotit = %s...\n", $gotit; # input BEFORE the match ($found, $end, $patt, $instead) = $ob->lastlook; # input that MATCHED, input AFTER the match, PATTERN that matched # input received INSTEAD when timeout without match if ($match1) { $found = $match1; } print "lastlook-match = $found...\n" if ($found); print "lastlook-after = $end...\n" if ($end); print "lastlook-pattern = $patt...\n" if ($patt); print "lastlook-instead = $instead...\n" if ($instead); ### print $e; $pass=$ob->write($e); sleep 1; undef $ob;