diff --git a/tools/serial-log.pl b/tools/serial-log.pl new file mode 100644 index 000000000..81b49a515 --- /dev/null +++ b/tools/serial-log.pl @@ -0,0 +1,124 @@ +#!/usr/bin/perl -w +#Log serial port to terminal and file with timestamps +#D.Kopf 8/28/2001 +# + +use Device::SerialPort; +use Term::ReadKey; +use Getopt::Long; +use Time::HiRes qw(usleep); + +use strict; + +my $term = '/dev/com1'; +my $baud = '57600'; +my $rts = 'none'; +my $logfile = 'none'; +my $ssss = ''; + +GetOptions ('terminal=s' => \$term, + 'baud=s' => \$baud, + 'rts=s' => \$rts, + 'seconds!' => \$ssss, + 'logfile:s' =>\$logfile +) or goto printhelp; +goto bypass; +printhelp: + print "Example serial-log.pl -t /dev/ttyS0 -b 57600 -r none -l logfile\n"; + print " -t, --terminal\n"; + print " -b, --baud\n"; + print " -r,--rts [none|rts] flow control\n"; + print " -s,--seconds Display ssss instead of hh:mm:ss\n"; + print " -l,--logfile outputfile (.log will be added, -l defaults to serial.log)\n"; + print "\n"; + print "The default is equivalent to serial-log.pl -t /dev/com1 -b 57600 -r none\n"; + exit; +bypass: + +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); +if($rts eq 'rts') { + $ob->handshake('rts'); +} else { + $ob->handshake('none'); +} +$ob->read_const_time(1000); # 1 second per unfulfilled "read" call +$ob->rts_active(1); + +my $c; my $count; +my ($hh,$mm,$ss,$mday,$mon,$year,$wday,$yday,$isdst,$theTime,$seconds,$startseconds); +#use POSIX qw(strftime); + +($ss,$mm,$hh,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; +$theTime = sprintf "on %02d/%02d/%04d at %02d:%02d:%02d\n", $mon+1, $mday, $year+1900, $hh, $mm, $ss; +if($logfile ne 'none') { + if($logfile eq '') {$logfile = 'serial';} + $logfile ="${logfile}.log"; + $c=1; + open LOGFILE, "$logfile" or do {$c=0;}; + if ($c) { + print "File $logfile exists. Restart, append, or quit (r,a,q) (q) ? "; + #$| = 1; # force a flush after print + $_ = ;chomp; + if ($_ eq 'r') { + open LOGFILE, ">$logfile" or die $!; + print "Restarting $logfile $theTime\n"; + print LOGFILE "serial-log.pl logging to $logfile started $theTime\n"; + } else { + if ($_ eq 'a') { + open LOGFILE, ">>$logfile" or die $!; + print "Appending to $logfile $theTime\n"; + print LOGFILE "serial-log.pl appending to $logfile $theTime\n"; + } else { + print "Quitting, file unchanged.\n"; + exit; + } + } + } else { + open LOGFILE, ">$logfile" or die $!; + print LOGFILE "serial-log.pl logging to $logfile started $theTime\n"; + print "Starting $logfile $theTime\n"; + + } + LOGFILE->autoflush(1); +} else { + $logfile=''; + print "Serial logging of $term started $theTime\n"; +} +if($ssss ne '') { + $startseconds=$hh*3600+$mm*60+$ss; +} + +$theTime=''; + +while(1) { + ($count, $c) = $ob->read(1); + if (defined($count) && ($count != 0)) { + if ($theTime eq '') { + ($ss,$mm,$hh) = localtime(time); + if ($ssss ne '') { + $seconds = $hh*3600+$mm*60+$ss-$startseconds; + if ($seconds < 0) {$seconds+=24*60*60;} + $theTime = sprintf("%04d ",$seconds); + } else { + $theTime = sprintf("%02d:%02s:%02d ", $hh,$mm,$ss); + #$theTime = strftime "%H:%M:%S ", localtime; + } + print $theTime ; + if ($logfile) {LOGFILE->autoflush(1);print LOGFILE $theTime;} + } + print $c ; + if ($logfile) { print LOGFILE $c;} + if ($c eq "\n") {$theTime=''}; + } +} +if ($logfile) {close LOGFILE or die $!} +$ob -> close or die "Serial port close failed: $!\n"; +ReadMode 0; +undef $ob; # closes port AND frees memory in perl +exit;