bbabble
author A.M. Thurnherr <ant@ldeo.columbia.edu>
Tue, 14 Sep 2010 13:34:39 -0400
changeset 4 fda11de1826e
parent 0 648bde652211
child 5 f41d45fe7ae9
permissions -rwxr-xr-x
version left on Poseidon at end of P403
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     1
#!/usr/bin/perl
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     2
#======================================================================
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     3
#                    B B A B B L E 
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     4
#                    doc: Thu Mar 11 01:00:51 2004
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
     5
#                    dlm: Thu Aug 26 19:11:05 2010
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     6
#                    (c) 2004 A.M. Thurnherr
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
     7
#                    uE-Info: 246 21 NIL 0 0 72 10 2 8 NIL ofnI
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     8
#======================================================================
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     9
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    10
# Broad Band Babble --- talk to 1--2 RDI ADCPs
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    11
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    12
# HISTORY:
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    13
#  Mar  5, 2004: - written first, one-page-long proof-of-concept version
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    14
#  Mar  6, 2004: - added downloading
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    15
#  Mar  7, 2004: - made it portable (linux & MacOSX)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    16
#  Mar  8, 2004: - made stdin rawmode
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    17
#                - colorized
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    18
#  Mar  9, 2004: - added support for 2nd instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    19
#		 - allowed for high-speed wire crosstalk (disallow BREAK
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    20
#		   while download is going on)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    21
#  Mar 10, 2004: - added -m)onochrome to aid expect(1)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    22
#  Mar 11, 2004: - made fully compatible with expect(1) by adding -s
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    23
#		   (disable asyncronous messages)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    24
#  Mar 12, 2004: - various improvements
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    25
#  Mar 18, 2004: - re-added async download errmesg on failed downloads
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    26
#		   to allow aborting 2nd download if one fails
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    27
#  Mar 21, 2004: - added proper syncronization for download (waiting for
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    28
#		   instrument to tell us to start the host)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    29
#  Apr  4, 2004: - added comments
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    30
#  Jun 14, 2004: - added port-open delay for KESPAN 49W multiport adapter
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    31
#		 - BB150 requires \r after commands instead of \n
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    32
#		 - added support for lack of ymodem prompt of BB150
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    33
#  Jan 19, 2006: - added code to determine whether ymodem receiver is
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    34
#		   called rb or lrb
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    35
#  Jan 25, 2006: - removed default download prompt
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    36
#	  	 - re-directed stderr of `which lrb` because of linux
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    37
#  Aug  7, 2006: - added ^U(pload) capability on L'Atalante (DYNAMUCK)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    38
#		 - BUG: length of $DOWNLOAD_SPEED_RDI_COMMAND was hardcoded
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    39
#		 - BUG: $START_DOWNLOAD_RDI_COMMAND was hardcoded
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    40
#		 - BUG: FreeBSD needs a nap between writing baudrate-
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    41
#			change command & setattr()
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    42
#  Aug  8, 2006: - added support for $PROGRAMMING_SPEED_TERMIOS_CONST
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    43
#  Aug 28, 2006: - updated doc
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    44
#  Nov 14, 2006: - added ^B (baud-rate handling)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    45
#		 - changes to task syncronization
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    46
#		 - replace unprintable chars by ? while in ECHO mode (only!)
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    47
#  Aug 26, 2010: - added -y)modem receive
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    48
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    49
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    50
# USAGE
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    51
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    52
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    53
use Getopt::Std;
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    54
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    55
$USAGE = "Usage: $0 [-m)onochrome] [-s)uppress async output] " .
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    56
		   "[-y)modem receive <cmd>] " .
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    57
		    "<tty0_device> [tty1_device]\n";
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    58
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    59
die($USAGE) unless (getopts("msy:"));
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    60
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    61
# bbabble is started with 1 or 2 arguments, which are tty special files.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    62
# On LINUX, /dev/ttyS0 is com1: /dev/ttyS1 is com2: /dev/ttyUSB0 is the
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    63
# first USB tty port, /dev/ttyUSB1 is the 2nd, &c. If two ttys are
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    64
# specified bbabble can talk to two instruments in parallel. Communication
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    65
# with The first (second) port is shown in red (blue). For consistency
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    66
# with the color scheme used by the LDEO expect scripts, the master
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    67
# (downlooker) should be connected to the first tty given on the command
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    68
# line.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    69
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    70
# On some (especially BSD-based) systems there are separate tty
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    71
# device files for dialin and dialout operations. Only the latter work
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    72
# with bbabble. They traditionally have names matching /dev/cu* (e.g.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    73
# /dev/cuad0 for the first serial # port in FreeBSD).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    74
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    75
# In order to have read/write access to the device files, the user
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    76
# that is to run bbabble should be added to the group that owns
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    77
# the tty device files (e.g. dialer on FreeBSD).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    78
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    79
# The -m option suppresses color ouput and -s suppresses the asynchronous
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    80
# messages generated by bbabble and printed in curly braces. Both
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    81
# options should be used if bbabble is run within expect(1).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    82
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    83
# Upon startup, bbabble prints a help message showing the current
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    84
# "foreground" instrument as well as a list of legal keyboard commands.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    85
# These should be largely self explanatory. Initially, bbabble
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    86
# is set up to talk to the instrument connected to the first tty. When
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    87
# 2 ttys are given on the command line, ^T (ctrl-T) can be used to toggle
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    88
# between the instruments --- ^T is not available if only one tty is
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    89
# given on the command line.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    90
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    91
# When bbabble talks to two instrument, the output from the "background"
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    92
# instrument is buffered internally. When ^T is pressed all buffered output
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    93
# is flushed to the screen.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    94
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    95
# ^C sends a BREAK to the currently active instrument, but only if neither
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    96
# of the instruments is currently downloading. If the "foreground" instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    97
# is downloading, ^C aborts the download. If the "background" instrument is
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    98
# downloading an error message is produced but no BREAK is sent. (This 
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    99
# behaviour is necessariy because it was found that a BREAK sent to the
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   100
# "foreground" instrument somtimes aborts a high-speed download in progress
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   101
# from the "background" instrument. Perhaps this is only the case with
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   102
# LDEO cabling with shared ground.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   103
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   104
# ^X starts a high-speed download from the "foreground" instrument.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   105
# Once the download has been started, the "background" instrument can be
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   106
# brought into the foreground with ^T in order to start a parallel download
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   107
# or the user can escape to the shell using ^S. In any case, asyncronous
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   108
# messages are printed (in the corresponding color) whenever one of the two
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   109
# instruments has finished the download (except when -s is used to suppress
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   110
# asynchronous messages).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   111
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   112
# On ^U the user is asked for a command-file-name to be uploaded to the
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   113
# instrument. The command file may contain any valid RDI command, empty
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   114
# lines, as well as comments beginning with a semicolon (;).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   115
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   116
# Upon startup, bbabble expects to communicate with the ADCPs at 9600bps
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   117
# (baud). If the user sends a BREAK (^C) and garbage is produced the
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   118
# instrument's default baud rate is probably set to a different value.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   119
# ^B cycles through all available instrument baud rates by first sending
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   120
# the corresponding command (e.g. CB411) to the instrument and then
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   121
# changing the TTY line characteristics. With this scheme it should be
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   122
# possible to reset the default baudrate of the instrument by executing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   123
# the following steps:
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   124
#	1. start bbabble
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   125
#	2. type ^C to wake the instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   126
#	3. type ^B nine times (wait a couple of seconds between keystrokes)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   127
#	4. issue the command "CK" to save the current baudrate as default
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   128
#	5. issue the command "CZ" to send the instrument to sleep
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   129
#	6. type ^D to exit bbabble
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   130
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   131
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   132
# IMPLEMENTATION NOTES
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   133
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   134
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   135
# DOWNLOAD BAUD RATE
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   136
# Most of the communication is carried out at the default baud rate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   137
# (initially set to 9600baud, but can be changed with ^B). For 
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   138
# downloading the communications speed is increased to 115kbps. The
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   139
# baud rate is dropped to the default on the next BREAK. Unfortunately,
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   140
# the POSIX standard only deals with baud rates up to 38400 bps. Therefore,
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   141
# I had to implement a failry dreadful hack using a call to the c
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   142
# preprocessor to determine the correct argument to set higher
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   143
# baud rates. This works only if gcc is installed...
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   144
#
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   145
# NOTE: After a download has completed the instrument stays in
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   146
#       high-speed mode. When the current parameters are stored in
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   147
#       non-volatile memory (CK command) at this stage the instrument's
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   148
#       default speed is 115kbps and has to be reset explicitly.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   149
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   150
# OTHER COMMUNICATIONS PARAMETERS
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   151
# bbabble assumes the ADCPs to use no parity, 8 data bits and 1 stop bit.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   152
# Other parameters require changes to bbabble.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   153
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   154
# THREADS
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   155
# Writing a dumb terminal with threads is dead easy: one thread reads
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   156
# from the keyboard and writes to the serial device and another reads
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   157
# from the serial devices and writes to the screen. A first version
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   158
# of bbabble was less than 50 lines of perl code. The current version
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   159
# is much longer because the threads must synchronize. This is accomplished
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   160
# by the tty-reader threads (one per active tty) being implemented as
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   161
# finite-state automata. The tty-writer (or keyboard-reader) thread
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   162
# sends commands to the tty-readers by changing the corresponding global
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   163
# state # variable and waiting for a response-change in the same
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   164
# variable.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   165
# NB: bbabble NEEDS A THREADED VERSION OF PERL. DEFAULT VERSIONS, E.G.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   166
#     ON MACOSX ARE NOT THREADED!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   167
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   168
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   169
# TWEAKABLES
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   170
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   171
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   172
# The following defines the command sent to the ADCP to start
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   173
# downloading. (NB: RY0 is more portable than RY, which does not work
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   174
# for BB150 instruments)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   175
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   176
$START_DOWNLOAD_RDI_COMMAND = 'RY0';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   177
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   178
# After a download is initiated with the RY0 command, WorkHorses
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   179
# send a prompt, telling the user to start downloading, while BB150 do not.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   180
# Set the following variables to the prompt returned by the instrument.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   181
# An empty string means that no prompt is expected, but a gratuitous
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   182
# pause of 1s is inserted instead, just in case. This is now made the default,
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   183
# because is it more portable.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   184
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   185
#$ymodem_download_prompt[0] = 'Please start your host now';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   186
#$ymodem_download_prompt[1] = 'Please start your host now';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   187
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   188
$ymodem_download_prompt[0] = '';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   189
$ymodem_download_prompt[1] = '';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   190
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   191
# Downloading should be done at the highest possible speed. 115200 bps has
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   192
# always worked well for me, with a variety of ADCP heads and acquisition
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   193
# computers.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   194
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   195
#$DOWNLOAD_SPEED = 9600;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   196
#$DOWNLOAD_SPEED = 38400;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   197
#$DOWNLOAD_SPEED = 57600;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   198
$DOWNLOAD_SPEED = 115200;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   199
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   200
# I prefer communicating at 9600 bps, except when downloading.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   201
# Other users prefer faster speeds, and the following variable allows
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   202
# selecting the default speed. Note that it must be consistent with the
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   203
# speed saved in the user settings of the ADCP (last CK command).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   204
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   205
my(@DEFAULT_SPEED):shared;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   206
my(@COMMS_SPEED):shared;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   207
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   208
$DEFAULT_SPEED[0] = 9600;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   209
$DEFAULT_SPEED[1] = 9600;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   210
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   211
# bbabble allows an escape to the shell, for example during downloading.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   212
# You can chose which shell it uses. If you chose anything but /bin/ksh
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   213
# you obviously don't know what you're doing. Linux does not come with
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   214
# /bin/ksh by default. They obviously don't know what they're doing.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   215
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   216
$shell = '/bin/sh';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   217
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   218
# Synchronization between the threads is accomplished using spin locks.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   219
# The $naptime variable determines how fast the locks spin and determine
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   220
# the maximum response time in seconds.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   221
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   222
$naptime = 0.1;				# nap time in seconds
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   223
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   224
# If after $timeout seconds thread syncronization has not been achieved,
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   225
# a timeout error is generated.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   226
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   227
$timeout = 10;				# timeout waiting for instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   228
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   229
# The following are the tput(1) colors. They should be set to the standard
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   230
# text color (black), red and blue, respectively. To test them, simply type
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   231
# `tput setaf 1', and you should get red text on whatever background
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   232
# was previously selected.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   233
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   234
$COLOR_RESET = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   235
$COLOR_TTY0  = 1;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   236
$COLOR_TTY1  = 4;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   237
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   238
# RDI instruments use the ymodem protocol to transfer files. There is
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   239
# a public-domain version of ymodem that works very well. Depending on
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   240
# the UNIX version, the ymodem-receiver can be called `rb' or `lrb'.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   241
# It does not have its own manpage but is described in the man page of
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   242
# `rz' (the zmodem receiver). To make matters worse, In the man page
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   243
# the prgram is always called `rb', even on systems where the executable
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   244
# is `lrb'.
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   245
# If -y is not given, bbabble trys to find one of the standard ymodem
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   246
# executables. Using -y allows options to be set.
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   247
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   248
if (defined($opt_y)) {
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   249
	$receive_ymodem = $opt_y;
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   250
} else {
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   251
	chomp($receive_ymodem = `which lrb 2>/dev/null`);
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   252
	chomp($receive_ymodem = `which	rb 2>/dev/null`)
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   253
		if ($receive_ymodem eq '');
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   254
	die("$0: cannot find rb or lrb\n")
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   255
		if ($receive_ymodem eq '');
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   256
}
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   257
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   258
# When uploading command files, each command is sent after a prompt
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   259
# is received from the instrument. The following variable defines the
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   260
# prompt (as a perl regexpr). ANCHOR AT END ONLY!!!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   261
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   262
$RDI_prompt = '>$';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   263
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   264
#======================================================================
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   265
# PROGRAM
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   266
#======================================================================
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   267
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   268
use threads;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   269
use threads::shared;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   270
use IO::Handle;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   271
use POSIX ();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   272
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   273
if (scalar(@ARGV) == 1) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   274
  $TTY0 = $ARGV[0];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   275
} elsif (scalar(@ARGV) == 2) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   276
  $TTY0 = $ARGV[0];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   277
  $TTY1 = $ARGV[1];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   278
} else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   279
  die($USAGE);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   280
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   281
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   282
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   283
# determine baudrate tcsetospeed() arguments
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   284
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   285
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   286
$TERMIOS_SPEED{300}   = &POSIX::B300;	$RDI_SPEED{300}    = 'CB0';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   287
$TERMIOS_SPEED{1200}  = &POSIX::B1200;	$RDI_SPEED{1200}   = 'CB1';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   288
$TERMIOS_SPEED{2400}  = &POSIX::B2400;	$RDI_SPEED{2400}   = 'CB2';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   289
$TERMIOS_SPEED{4800}  = &POSIX::B4800;	$RDI_SPEED{4800}   = 'CB3';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   290
$TERMIOS_SPEED{9600}  = &POSIX::B9600;	$RDI_SPEED{9600}   = 'CB4';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   291
$TERMIOS_SPEED{19200} = &POSIX::B19200;	$RDI_SPEED{19200}  = 'CB5';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   292
$TERMIOS_SPEED{38400} = &POSIX::B38400; $RDI_SPEED{38400}  = 'CB6';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   293
					$RDI_SPEED{57600}  = 'CB7';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   294
					$RDI_SPEED{57600}  = 'CB7';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   295
					$RDI_SPEED{115200} = 'CB8';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   296
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   297
# The following is ugly & slow, but seems fairly portable.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   298
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   299
open(TMP,'>/tmp/tt.c'); print(TMP "#include <termios.h>\nB57600\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   300
close(TMP);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   301
$TERMIOS_SPEED{57600} = `gcc -E /tmp/tt.c | tail -1`;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   302
$TERMIOS_SPEED{57600} = hex($TERMIOS_SPEED{57600})
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   303
	if ($TERMIOS_SPEED{57600} =~ /^0x/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   304
$TERMIOS_SPEED{57600} = oct($TERMIOS_SPEED{57600})
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   305
	if ($TERMIOS_SPEED{57600} =~ /^0/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   306
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   307
open(TMP,'>/tmp/tt.c'); print(TMP "#include <termios.h>\nB115200\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   308
close(TMP);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   309
$TERMIOS_SPEED{115200} = `gcc -E /tmp/tt.c | tail -1`;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   310
$TERMIOS_SPEED{115200} = hex($TERMIOS_SPEED{115200})
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   311
	if ($TERMIOS_SPEED{115200} =~ /^0x/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   312
$TERMIOS_SPEED{115200} = oct($TERMIOS_SPEED{115200})
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   313
	if ($TERMIOS_SPEED{115200} =~ /^0/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   314
unlink('/tmp/tt.c');
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   315
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   316
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   317
# Common Setup
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   318
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   319
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   320
$COMMS_SPEED[0] = $DEFAULT_SPEED[0];		# baud rates
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   321
$COMMS_SPEED[1] = $DEFAULT_SPEED[1];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   322
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   323
unless ($opt_m) {				# colors
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   324
  $RESET = `tput setaf $COLOR_RESET`;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   325
  @COLOR = (`tput setaf $COLOR_TTY0` ,
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   326
            `tput setaf $COLOR_TTY1`);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   327
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   328
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   329
my(@sfd);					# TTYs
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   330
open(TTY0,'+>',$TTY0) || die("$TTY0: $!\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   331
$sfd[0] = fileno(TTY0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   332
if (defined($TTY1)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   333
  select(undef,undef,undef,$naptime);		# KEYSPAN 49W requires this
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   334
  open(TTY1,'+>',$TTY1) || die("$TTY1: $!\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   335
  $sfd[1] = fileno(TTY1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   336
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   337
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   338
STDOUT->autoflush(1);				# flushing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   339
STDERR->autoflush(1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   340
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   341
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   342
# TTY-Reader Threads
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   343
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   344
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   345
# valid states of the receiver FSA; NB: DOWNLOAD can be combined with
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   346
# BUFFER and ECHO; SET_DEFAULT_SPEED (used during BREAK) can be combined
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   347
# with UPLOAD & ECHO (w or w/o DOWNLOAD).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   348
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   349
my($SHUTDOWN):shared	      = 0x00;		# terminate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   350
my($ECHO):shared   	      = 0x01;		# normal state of active instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   351
my($BUFFER):shared  	      = 0x02;		# normal state of inactive instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   352
my($FLUSH):shared  	      = 0x04;		# flush buffered data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   353
my($SET_DOWNLOAD_SPEED):shared= 0x10;		# change baudrate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   354
my($SET_DEFAULT_SPEED):shared = 0x20;		# change baudrate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   355
my($UPLOAD):shared	      = 0x40;		# upload cmd file
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   356
my($DOWNLOAD):shared   	      = 0x80;		# download (using ymodem)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   357
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   358
my(@rcv_state):shared = ($ECHO,$BUFFER);	# initial states
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   359
my(@dld_pid):shared;				# downloader pids
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   360
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   361
sub TTY_receiver($)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   362
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   363
  my($id) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   364
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   365
  my($t) = POSIX::Termios::new();			# setup serial line
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   366
  print(STDERR "$COLOR[$id]tcgetattr: $!\n"),return	# ... N81
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   367
    unless defined($t->getattr($sfd[$id]));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   368
  $t->setiflag($t->getiflag() & ~(POSIX::IGNBRK() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   369
  				  POSIX::BRKINT() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   370
  				  POSIX::PARMRK() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   371
  				  POSIX::ISTRIP() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   372
  				  POSIX::INLCR()  |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   373
  				  POSIX::IGNCR()  |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   374
  				  POSIX::ICRNL()  |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   375
  				  POSIX::IXON()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   376
  $t->setoflag($t->getoflag() & ~POSIX::OPOST());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   377
  $t->setlflag($t->getlflag() & ~(POSIX::ECHO() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   378
  				  POSIX::ECHONL() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   379
  				  POSIX::ICANON() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   380
  				  POSIX::ISIG() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   381
  				  POSIX::IEXTEN()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   382
  $t->setcflag($t->getcflag() & ~(POSIX::CSIZE()|POSIX::PARENB())
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   383
 			      | POSIX::CS8());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   384
  $t->setcc(POSIX::VMIN,1); $t->setcc(POSIX::VTIME,0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   385
  set_speed($t,$id,$DEFAULT_SPEED[$id]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   386
  if ($opt_s) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   387
    print($COLOR[$id]) unless ($opt_m);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   388
    print("{TTY $id READY}");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   389
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   390
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   391
  my(@buf,$rin);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   392
  my($nbi) = 0;						# next buffer
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   393
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   394
  while (1) {						# reader loop
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   395
    vec($rin,$sfd[$id],1) = 1;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   396
    while (!select($rin,undef,undef,$naptime)) {	# wait for data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   397
      return unless ($rcv_state[$id]);			# ... or state change
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   398
      last unless ($rcv_state[$id] == $ECHO ||
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   399
             	   $rcv_state[$id] == $BUFFER);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   400
      vec($rin,$sfd[$id],1) = 1;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   401
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   402
    
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   403
    #------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   404
    # DOWNLOAD DATA FROM INSTRUMENT
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   405
    #------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   406
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   407
    if ($rcv_state[$id] == $DOWNLOAD) {			# initiate download
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   408
      if ($ymodem_download_prompt[$id] eq '') {		# no prompt from instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   409
      	sleep(1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   410
      } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   411
	my($buf,$msg,$nread);				# wait for RDI prompt
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   412
        print(STDERR "$COLOR[$id]\{WAITING FOR RDI DOWNLOAD PROMPT}\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   413
  	  unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   414
	do {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   415
	  $nread = POSIX::read($sfd[$id],$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   416
	  die("$COLOR[$id]read: EOF\n") if ($nread == 0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   417
	  die("$COLOR[$id]read: $!\n") if ($nread < 0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   418
	  POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   419
	  $msg = unpack("a$nread",$buf);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   420
        } until ($msg =~ /$ymodem_download_prompt[$id]/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   421
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   422
      
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   423
      print(STDERR "$COLOR[$id]\{STARTING DOWNLOAD}\n")	# start ymodem receiver
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   424
		unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   425
      my($rfd,$wfd) = POSIX::pipe();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   426
      $dld_pid[$id] = fork();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   427
      if ($dld_pid[$id] == 0) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   428
        POSIX::dup2($sfd[$id],0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   429
        POSIX::dup2($sfd[$id],1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   430
        POSIX::dup2($wfd,2);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   431
        POSIX::close($rfd); POSIX::close($wfd);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   432
        exec($receive_ymodem);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   433
        die("$COLOR[$id]exec: $!$RESET\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   434
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   435
      
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   436
      POSIX::close($wfd);				# handle progress data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   437
      while (1) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   438
        my($buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   439
        $nread = POSIX::read($rfd,$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   440
        $rcv_state[$id] |= $ECHO			# initially, echo tty
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   441
          if ($rcv_state[$id] == $DOWNLOAD);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   442
        last if ($nread == 0);				# EOF => ymodem done
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   443
        if ($rcv_state[$id]&$BUFFER) {			# buffer data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   444
          $nread[$nbi] = $nread;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   445
          $buf[$nbi++] = $buf;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   446
        } elsif ($rcv_state[$id]&$FLUSH) {		# flush buffered data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   447
          print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   448
          for (my($bi)=0; $bi<$nbi; $bi++) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   449
            my($buf) = $buf[$bi];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   450
            my($nread) = $nread[$bi];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   451
            POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   452
          }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   453
          $nbi = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   454
          $rcv_state[$id] = $DOWNLOAD|$ECHO;		# now, continue echoing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   455
          POSIX::write(1,$buf,$nread);			# don't forget!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   456
        } else {					# echo data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   457
          print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   458
          POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   459
        }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   460
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   461
      POSIX::close($rfd);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   462
      
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   463
      my($rip) = waitpid($dld_pid[$id],0);		# ymodem has finished
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   464
      print(STDERR "$COLOR[$id]waitpid($dld_pid[$id]->$rip: $!\n"),return
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   465
        unless ($rip == $dld_pid[$id]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   466
      if (POSIX::WIFEXITED($?)) {			# check exit status
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   467
        if (POSIX::WEXITSTATUS($?)) {			# error
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   468
          print(STDERR $COLOR[$id]) unless ($opt_m);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   469
          printf(STDERR "{DOWNLOAD EXITED ABNORMALLY --- STATUS %d}$RESET",
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   470
                   POSIX::WEXITSTATUS($?));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   471
        } else {					# no error
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   472
          print(STDERR "$COLOR[$id]\{DOWNLOAD INSTRUMENT $id OK}\n$RESET")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   473
          	unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   474
	}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   475
      } elsif (POSIX::WIFSIGNALED($?)) {		# killed by signal
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   476
        print(STDERR $COLOR[$id]) unless ($opt_m);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   477
        printf(STDERR "{DOWNLOAD KILLED BY SIGNAL %d}$RESET",
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   478
                 POSIX::WTERMSIG($?));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   479
      } else {						# should not happen!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   480
        print(STDERR $COLOR[$id]) unless ($opt_m);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   481
        printf(STDERR "{UNKNOWN DOWNLOAD TERMINATION --- STATUS %d}$RESET",$?);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   482
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   483
      $rcv_state[$id] &= ~$DOWNLOAD;			# acknowledge operation
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   484
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   485
    
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   486
    #------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   487
    # SET DOWNLOAD BAUD RATE
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   488
    #------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   489
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   490
    elsif ($rcv_state[$id] == $SET_DOWNLOAD_SPEED) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   491
      print(STDERR "$COLOR[$id]\{SETTING DOWNLOAD SPEED}") unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   492
      POSIX::write($sfd[$id],"$RDI_SPEED{$DOWNLOAD_SPEED}11\r",6);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   493
      select(undef,undef,undef,$naptime);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   494
      set_speed($t,$id,$DOWNLOAD_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   495
      $rcv_state[$id] = $ECHO;				# acknowledge operation
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   496
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   497
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   498
    #------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   499
    # SET NORMAL BAUD RATE
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   500
    #------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   501
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   502
    elsif ($rcv_state[$id]&$SET_DEFAULT_SPEED) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   503
      print(STDERR "$COLOR[$id]\{SETTING DEFAULT SPEED}") unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   504
      set_speed($t,$id,$DEFAULT_SPEED[$id]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   505
      $rcv_state[$id] &= ~$SET_DEFAULT_SPEED;		# acknowledge operation
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   506
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   507
    
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   508
    #-----------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   509
    # INACTIVE INSTRUMENT => BUFFER DATA
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   510
    #-----------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   511
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   512
    elsif ($rcv_state[$id] == $BUFFER) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   513
      my($buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   514
      $nread = POSIX::read($sfd[$id],$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   515
      $nread[$nbi] = $nread; $buf[$nbi++] = $buf;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   516
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   517
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   518
    #---------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   519
    # JUST BEEN MADE ACTIVE => FLUSH BUFFERED DATA
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   520
    #---------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   521
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   522
    elsif ($rcv_state[$id] == $FLUSH) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   523
      if ($nbi) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   524
        print("\n"); print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   525
        for (my($bi)=0; $bi<$nbi; $bi++) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   526
          my($buf) = $buf[$bi];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   527
          my($nread) = $nread[$bi];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   528
          POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   529
        }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   530
        $nbi = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   531
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   532
      $rcv_state[$id] = $ECHO;				# acknowledge action
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   533
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   534
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   535
    #--------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   536
    # UPLOADING COMMAND FILE => ECHO DATA, WAITING FOR PROMPT
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   537
    #--------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   538
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   539
    elsif ($rcv_state[$id] == $UPLOAD) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   540
      my($buf,$nread);					# buffer data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   541
      $nread = POSIX::read($sfd[$id],$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   542
      $nread[$nbi] = $nread; $buf[$nbi++] = $buf;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   543
      if ($buf =~ /$RDI_prompt/) {			# prompt => flush
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   544
        print("\n"); print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   545
        for (my($bi)=0; $bi<$nbi; $bi++) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   546
          POSIX::write(1,$buf[$bi],$nread[$bi]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   547
        }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   548
        $nbi = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   549
        $rcv_state[$id] = $ECHO;			# done
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   550
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   551
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   552
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   553
    #--------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   554
    # (FINALLY) DEFAULT ACTION => ECHO DATA
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   555
    #--------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   556
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   557
    else { # $rcv_state[$id] == $ECHO
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   558
      my($buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   559
      $nread = POSIX::read($sfd[$id],$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   560
      for (my($i)=0; $i<$nread; $i++) {			# clean garbage
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   561
      	my($ascii) = ord(substr($buf,$i));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   562
      	substr($buf,$i,1) = '?'
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   563
      	  unless ($ascii == 10 || $ascii == 13 || $ascii == 9 ||
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   564
		  ($ascii >= 32 && $ascii <= 126));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   565
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   566
      print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   567
      POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   568
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   569
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   570
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   571
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   572
$TTY_receiver[0] = threads->new(\&TTY_receiver,0);	# start threads
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   573
$TTY_receiver[1] = threads->new(\&TTY_receiver,1)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   574
  if defined($TTY1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   575
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   576
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   577
# Controller (reads stdin & writes to serial ports)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   578
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   579
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   580
my($t) = POSIX::Termios::new();				# set raw mode
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   581
die("${RESET}tcgetattr: $!\n") unless defined($t->getattr(0));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   582
@ccc = ($t->getcc(POSIX::VMIN()),$t->getcc(POSIX::VTIME())); @rcc = (1,0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   583
$clf = $t->getlflag(); $cif = $t->getiflag(); $cof = $t->getoflag();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   584
$rlf = $clf &	# linux termios manpage
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   585
	~(POSIX::ECHO()|POSIX::ECHONL()|POSIX::ICANON()|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   586
	  POSIX::IEXTEN()|POSIX::ISIG());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   587
$rif = $cif &
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   588
	~(POSIX::IGNBRK()|POSIX::BRKINT()|POSIX::PARMRK()|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   589
	  POSIX::ISTRIP()|POSIX::INLCR()|POSIX::IGNCR()|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   590
	  POSIX::ICRNL()|POSIX::IXON());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   591
$rof = $cof & ~POSIX::OPOST(); # unused
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   592
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   593
sub croak(@)						# cook and die
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   594
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   595
  $t->setlflag($clf); $t->setiflag($cif); $t->setoflag($cof);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   596
  $t->setcc(POSIX::VMIN(),$ccc[0]); $t->setcc(POSIX::VTIME(),$ccc[1]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   597
  $t->setattr(0,POSIX::TCSANOW());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   598
  die(@_);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   599
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   600
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   601
sub set_speed($$$)					# set baud rate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   602
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   603
  my($t,$id,$speed) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   604
  $t->setispeed($TERMIOS_SPEED{$speed});
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   605
  $t->setospeed($TERMIOS_SPEED{$speed});
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   606
  print(STDERR "tcsetattr: $!\n"),return
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   607
    unless defined($t->setattr($sfd[$id],POSIX::TCSANOW));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   608
  $COMMS_SPEED[$id] = $speed;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   609
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   610
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   611
sub cookedmode()					# cook with errors
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   612
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   613
  $t->setlflag($clf); $t->setiflag($cif); $t->setoflag($cof);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   614
  $t->setcc(POSIX::VMIN(),$ccc[0]); $t->setcc(POSIX::VTIME(),$ccc[1]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   615
  die("${RESET}tcsetattr: $!\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   616
    unless defined($t->setattr(0,POSIX::TCSANOW()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   617
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   618
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   619
sub rawmode()						# set raw mode
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   620
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   621
  $t->setlflag($rlf); $t->setiflag($rif); #$t->setoflag($rof);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   622
  $t->setcc(POSIX::VMIN(),$rcc[0]); $t->setcc(POSIX::VTIME(),$rcc[1]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   623
  croak("${RESET}tcsetattr: $!\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   624
    unless defined($t->setattr(0,POSIX::TCSANOW()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   625
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   626
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   627
sub wait_for_bit_set($$)				# wait for state
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   628
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   629
  my($id,$trgbit) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   630
  for (my($time) = 0; ($rcv_state[$id]&$trgbit)==0; $time+=$naptime) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   631
    croak("$COLOR[$id]Error: timeout waiting for instrument $id" .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   632
	  "$RESET set status bit $trgbit (status is $rcv_state[$id])\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   633
      if ($time >= $timeout);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   634
    select(undef,undef,undef,$naptime);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   635
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   636
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   637
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   638
sub wait_for_bit_cleared($$)				# wait for state
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   639
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   640
  my($id,$trgbit) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   641
  for (my($time) = 0; ($rcv_state[$id]&$trgbit)==$trgbit; $time+=$naptime) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   642
    croak("$COLOR[$id]Error: timeout waiting for instrument $id" .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   643
	  "$RESET clear status bit $trgbit (status is $rcv_state[$id])\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   644
      if ($time >= $timeout);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   645
    select(undef,undef,undef,$naptime);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   646
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   647
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   648
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   649
sub send_BREAK($)					# send simple BREAK
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   650
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   651
  my($id) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   652
  print(STDERR "$COLOR[$id]\{BREAK INSTRUMENT $id}") unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   653
  croak("$COLOR[$id]tcsendbreak: $!$RESET\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   654
    unless defined(POSIX::tcsendbreak($sfd[$id],0));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   655
  $rcv_state[$id] |= $SET_DEFAULT_SPEED;		# ECHO or UPLOAD
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   656
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   657
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   658
sub help()						# print help message
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   659
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   660
  my($toggle) = "^T: toggle instrument; " if defined($TTY1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   661
  print($COLOR[$cid]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   662
  print(STDERR "\n$COLOR[$cid]Instrument $cid ($COMMS_SPEED[$cid]bps)\n$COLOR[$cid]^H: help; " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   663
	       "$toggle^C: BREAK; ^U: upload; ^X: download; ^S: shell; " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   664
	       "^B: change baud rate; ^D: end\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   665
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   666
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   667
sub next_cmd($)						# get next cmd from file
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   668
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   669
  my($f) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   670
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   671
  while (defined($_ = <$f>)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   672
    chomp;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   673
    s/\s*;.*//;						# remove comments
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   674
    next if /^\s*$/;					# empty lines
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   675
    return $_;    
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   676
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   677
  return undef;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   678
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   679
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   680
$cid = 0;						# current instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   681
rawmode();						# setup
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   682
help();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   683
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   684
KEYSTROKE: while (POSIX::read(0,$buf,1)) {		# main tty-writer loop
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   685
  $char = unpack('C',$buf);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   686
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   687
  #-------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   688
  # HANDLE ^B (CHANGE SPEED)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   689
  #-------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   690
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   691
  if ($char == 2) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   692
    if ($rcv_state[$cid] == $ECHO) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   693
      $DEFAULT_SPEED[$cid] *= 2;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   694
      $DEFAULT_SPEED[$cid] = 57600 if ($DEFAULT_SPEED[$cid] == 76800);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   695
      $DEFAULT_SPEED[$cid] =   300 if ($DEFAULT_SPEED[$cid] == 230400);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   696
      $DEFAULT_SPEED[$cid] =  1200 if ($DEFAULT_SPEED[$cid] == 600);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   697
      POSIX::write($sfd[$cid],"\r$RDI_SPEED{$DEFAULT_SPEED[$cid]}11\r",7);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   698
      sleep(1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   699
      $rcv_state[$cid] |= $SET_DEFAULT_SPEED;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   700
      wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   701
    } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   702
      print(STDERR "$COLOR[$cid]\{Can only change speed while in ECHO mode}") unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   703
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   704
    help();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   705
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   706
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   707
  #-----------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   708
  # HANDLE ^C (SEND BREAK)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   709
  #-----------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   710
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   711
  elsif ($char ==  3) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   712
    my($cidkilled) = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   713
    if (($rcv_state[0]&$DOWNLOAD) ||			# currently downloading
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   714
	($rcv_state[1]&$DOWNLOAD)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   715
      if ($rcv_state[$cid]&$DOWNLOAD) {			# active-instrument downloading
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   716
	print(STDERR "$COLOR[$cid]\{KILLING PID $dld_pid[$cid]}") unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   717
	send_BREAK($cid); kill('TERM',$dld_pid[$cid]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   718
        wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   719
        send_BREAK($cid); kill('TERM',$dld_pid[$cid]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   720
        $cidkilled = 1;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   721
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   722
      if ($rcv_state[!$cid]&$DOWNLOAD) {		# inactive-instrument dld'ing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   723
      	if ($cidkilled) {				# active killed as well
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   724
	  $tmp = $rcv_state[$cid]&~$ECHO; $rcv_state[$cid] = $tmp|$BUFFER;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   725
          $cid = 1*!$cid;				# toggle instruments
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   726
    	  $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   727
          wait_for_bit_cleared($cid,$FLUSH);		# flush before killing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   728
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   729
	  print(STDERR "$COLOR[$cid]\{KILLING PID $dld_pid[$cid]}") unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   730
	  send_BREAK($cid); kill('TERM',$dld_pid[$cid]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   731
          wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   732
          send_BREAK($cid);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   733
          wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   734
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   735
	  $tmp = $rcv_state[$cid]&~$ECHO; $rcv_state[$cid] = $tmp|$BUFFER;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   736
          $cid = 1*!$cid;				# toggle back
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   737
    	  $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   738
          wait_for_bit_cleared($cid,$FLUSH);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   739
        } else {					# tried to send BREAK
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   740
          if ($cid == 0) {				# while inactive dld'ing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   741
      	    printf(STDERR "$COLOR[0]\{REFUSE TO SEND BREAK -$COLOR[1]- " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   742
			  "INSTRUMENT 1 DOWNLOAD IN PROGRESS}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   743
      	  } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   744
      	    printf(STDERR "$COLOR[1]\{REFUSE TO SEND BREAK -$COLOR[0]- " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   745
			  "INSTRUMENT 1 DOWNLOAD IN PROGRESS}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   746
          }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   747
        }        	
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   748
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   749
    } else {						# none downloading
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   750
      send_BREAK($cid);					# send BREAK
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   751
      wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   752
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   753
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   754
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   755
  #-----------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   756
  # HANDLE ^D (EXIT)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   757
  #-----------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   758
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   759
  elsif ($char ==  4) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   760
    if (($rcv_state[0]&$DOWNLOAD)|($rcv_state[1]&$DOWNLOAD)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   761
      print(STDERR "$COLOR[$cid]\{DOWNLOAD(S) IN PROGRESS --- ^C TO ABORT}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   762
    } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   763
      last;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   764
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   765
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   766
  
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   767
  #-----------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   768
  # HANDLE ^H (HELP)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   769
  #-----------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   770
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   771
  elsif ($char ==  8) { help(); }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   772
  
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   773
  #-------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   774
  # HANDLE ^S (SHELL ESCAPE)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   775
  #-------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   776
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   777
  elsif ($char == 19) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   778
    $tmp = $rcv_state[$cid]&~$ECHO; $rcv_state[$cid] = $tmp|$BUFFER;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   779
    print($RESET);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   780
    cookedmode();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   781
    system($shell) && print(STDERR "$shell: $!");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   782
    rawmode(); help();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   783
    $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   784
    wait_for_bit_cleared($cid,$FLUSH);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   785
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   786
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   787
  #-------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   788
  # HANDLE ^T (TOGGLE INSTRUMENTS)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   789
  #-------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   790
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   791
  elsif ($char == 20 && defined($TTY1)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   792
    $tmp = $rcv_state[$cid]&~$ECHO; $rcv_state[$cid] = $tmp|$BUFFER;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   793
    $cid = 1*!$cid; print("\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   794
    help();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   795
    $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   796
    wait_for_bit_cleared($cid,$FLUSH);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   797
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   798
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   799
  #----------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   800
  # HANDLE ^U (UPLOAD CMD-FILE)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   801
  #----------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   802
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   803
  elsif ($char == 21) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   804
    if ($rcv_state[$cid]&$DOWNLOAD){
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   805
      print(STDERR "$COLOR[$cid]\{DOWNLOAD IN PROGRESS --- ^C TO ABORT}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   806
    } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   807
      $tmp = $rcv_state[$cid]&~$ECHO; $rcv_state[$cid] = $tmp|$BUFFER;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   808
      print($RESET);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   809
      cookedmode();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   810
      do {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   811
	print("\nCommand File: "); chomp($_ = <STDIN>);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   812
	if ($_ eq '') {				# no file name given
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   813
	  print("{upload canceled}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   814
	  rawmode();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   815
      	  $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   816
      	  wait_for_bit_cleared($cid,$FLUSH);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   817
      	  next KEYSTROKE;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   818
	}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   819
	unless (open(CF,$_)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   820
          print("$_: $!");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   821
          redo;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   822
        } 
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   823
      } while (0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   824
      rawmode();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   825
      $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   826
      wait_for_bit_cleared($cid,$FLUSH);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   827
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   828
      my($cmd) = next_cmd(CF);			# read ahead (last cmd may ...
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   829
      my($next_cmd);				# ... not generate prompt)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   830
      while (defined($next_cmd = next_cmd(CF))) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   831
      	$rcv_state[$cid] = $UPLOAD;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   832
      	if ($cmd eq '<BREAK>') {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   833
      	  send_BREAK($cid);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   834
      	} else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   835
	  POSIX::write($sfd[$cid],"$cmd\r",length($cmd)+1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   836
	}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   837
      	$cmd = $next_cmd;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   838
        wait_for_bit_set($cid,$ECHO); # NOT SURE!!!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   839
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   840
      close(CF);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   841
      POSIX::write($sfd[$cid],"$cmd\r",length($cmd)+1); # last cmd
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   842
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   843
      $tmp = $rcv_state[$cid]&~$ECHO; $rcv_state[$cid] = $tmp|$BUFFER;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   844
      print("\n${RESET}{upload finished}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   845
      $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   846
      wait_for_bit_cleared($cid,$FLUSH);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   847
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   848
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   849
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   850
  #--------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   851
  # HANDLE ^X (DOWNLOAD DATA)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   852
  #--------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   853
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   854
  elsif ($char == 24) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   855
    if ($rcv_state[$cid]&$DOWNLOAD){
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   856
      print(STDERR "$COLOR[$cid]\{DOWNLOAD IN PROGRESS --- ^C TO ABORT}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   857
    } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   858
      $rcv_state[$cid] = $SET_DOWNLOAD_SPEED;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   859
      wait_for_bit_set($cid,$ECHO);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   860
      $rcv_state[$cid] = $DOWNLOAD;		# start waiting for instr. ready
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   861
      POSIX::write($sfd[$cid],"$START_DOWNLOAD_RDI_COMMAND\r",
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   862
			      length($START_DOWNLOAD_RDI_COMMAND)+1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   863
      wait_for_bit_set($cid,$ECHO);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   864
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   865
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   866
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   867
  #------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   868
  # (FINALLY) HANDLE DEFAULT CASE: ECHO KEYBOARD INPUT TO SERIAL PORT
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   869
  #------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   870
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   871
  else { POSIX::write($sfd[$cid],$buf,1); }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   872
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   873
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   874
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   875
#-------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   876
# Exit Received (^D)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   877
#-------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   878
  
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   879
if ($rcv_state[0]&$DOWNLOAD) {			# abort downloads on close
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   880
  send_BREAK(0); kill('TERM',$dld_pid[0]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   881
  wait_for_bit_cleared(0,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   882
  send_BREAK(0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   883
  wait_for_bit_cleared(0,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   884
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   885
if ($rcv_state[1]&$DOWNLOAD) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   886
  send_BREAK(1); kill('TERM',$dld_pid[1]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   887
  wait_for_bit_cleared(1,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   888
  send_BREAK(1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   889
  wait_for_bit_cleared(1,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   890
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   891
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   892
$rcv_state[0] = $rcv_state[1] = $SHUTDOWN;	# tell receivers to stop
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   893
$TTY_receiver[0]->join();			# wait for them
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   894
$TTY_receiver[1]->join() if defined($TTY1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   895
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   896
cookedmode();					# reset keyboard
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   897
print("$RESET\n");				# and screen
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   898
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   899
exit(0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   900