#!/usr/bin/perl -w # perl script for talk to Gaw # take an ascii file as argument and load it to gaw use Socket; use IO::Socket; $progname = "pttg"; $debug = 0; $remote_host = "olix"; $remote_port = "1946"; $ifile = ""; $ofile = ""; @prelines = ( "table_new hqdata" ); @postlines = ( "panel 4", "copyvar sample p0", "copyvar in_win p1", "copyvar zero_l p2", "color_bg #ffffff", "export_img hqimg png", "export_data hqdata ascii", ); for ( $i = 0; $i <= $#ARGV ; $i++ ) { if ( $ARGV[$i] eq "-d" ) { $debug++; } elsif ( $ARGV[$i] eq "-h" ) { print_help(); } elsif ( $ARGV[$i] eq "-p" ) { $i++; $remote_port = $ARGV[$i]; } elsif ( $ARGV[$i] eq "-f" ) { $i++; $ifile = $ARGV[$i]; } elsif ( $ARGV[$i] eq "-o" ) { $i++; $ofile = $ARGV[$i]; } else { $remote_host = $ARGV[$i]; } } if ( $ofile ne "" ) { unless (open( $ofd, ">$ofile")) { print STDERR "Can't open $ofile: $!\n"; return; } } $remote = open_cnx($remote_host, $remote_port); sendLines(\@prelines, $remote); modify_ascii_file($ifile, $remote); sendLines(\@postlines, $remote); add_col($ifile, $remote); if ( $ofile ne "" ) { close($ofd); } sleep(2); close $remote; sub sendLines { my($refList, $remote) = @_; foreach $line ( @{$refList} ) { send_cnx( $remote, "$line\n"); } } sub add_col { my($filename, $remote) = @_; my($first) = 1; # print "$filename\n"; unless (open(INPUT, "<$filename")) { print STDERR "Can't open $filename: $!\n"; return; } while () { chomp(); @fields = split(" ", $_); if ( $first ) { $first = 0; send_cnx( $remote, "coladd col10 voltage\n"); send_cnx( $remote, "coldatas col10\n"); $i = $#fields ; next; } send_cnx( $remote, "$fields[$i]\n"); } send_cnx ( $remote, "enddata\n"); send_cnx ( $remote, "copyvar col10 p3\n"); close(INPUT); } sub modify_ascii_file { my($filename, $remote) = @_; my($first) = 1; # print "$filename\n"; unless (open(INPUT, "<$filename")) { print STDERR "Can't open $filename: $!\n"; return; } while () { if ( $first ) { $first = 0; send_cnx( $remote, "variables "); send_cnx( $remote, $_ ) ; send_cnx( $remote, "rowdatas\n"); next; } send_cnx( $remote, "$_"); } send_cnx ( $remote, "enddata\n"); close(INPUT); } sub send_cnx { my($remote, $line) = @_; my($bytes); # check if socket is closed if (!defined($remote)) { die "closed\n"; } if ( $ofile ne "" ) { print $ofd "$line"; } print $remote "$line" ; $n = recv ($remote, $bytes, 1000, MSG_DONTWAIT ); if ( defined($n) ) { $bytes =~ s/\n//g; if ( $bytes ne "" ){ print STDERR "$bytes\n"; } } } sub getReply { my($remote) = @_; my $byte; print STDOUT "sysread "; if (sysread($remote, $byte, 1) == 1) { print STDOUT "Read $byte"; } } # open connection to host sub open_cnx { my($host, $port) = @_; if ( ! defined($host)){ die ( "host not defined\n"); } # print "$host $port\n"; my($remote); $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => $port ); # Blocking => 1 ); # no blocking unless ($remote) { die "$progname: cannot connect to daemon on $host"; } $remote->autoflush(1); # binmode($remote); return $remote; } sub print_help { print STDERR ("pttg [options] : connect to host and send a data file.\n"); print STDERR (" -f : send the data of this ascii file.\n"); print STDERR (" -o : save a copy in file of what is sent to host.\n"); print STDERR (" -p : change port number instead of default 1946.\n"); print STDERR (" -h : this message.\n"); print STDERR (" -d : debug, force local host.\n"); exit(0); }