bbabble
author A.M. Thurnherr <athurnherr@yahoo.com>
Fri, 03 Jul 2020 10:25:08 -0400
changeset 12 5e67754f6457
parent 5 f41d45fe7ae9
permissions -rwxr-xr-x
V1.6: no more master/slave terminology
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
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
     5
#                    dlm: Fri Jul  3 10:12:51 2020
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     6
#                    (c) 2004 A.M. Thurnherr
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
     7
#                    uE-Info: 58 0 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
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    10
# Broad Band Babble --- talk to 1--2 RDI ADCPs or other serial instruments
0
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
5
f41d45fe7ae9 V1.5 initial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 4
diff changeset
    48
#  Oct 18, 2010: - added -u option to default ymodem receive call
f41d45fe7ae9 V1.5 initial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 4
diff changeset
    49
#  Dec  1, 2010: - BUG: -y with empty-string option argument did not work
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    50
#  Jun 18, 2018: - explicitly implemented code to disable download on -y ""
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    51
#		 - BUG: one debug message had -s wrong way round
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    52
#		 - added state-change test required when Arduino closes USB connection
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    53
#		 - BUG: non-existing ttys had stupid error messages
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    54
#		 - made -s default and added -a to show async output, which is for debugging only
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    55
#		 - changed default to use -m unless 2 devices are chosen
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    56
#		 - begin implementing non-R)DI mode (currently, upload only)
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    57
#  Jul  3, 2020: - expunged master/slave terminology
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    58
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    59
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    60
# USAGE
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    61
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    62
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    63
use Getopt::Std;
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    64
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    65
$USAGE = "Usage: $0 [-m)onochrome] [-s)uppress async output(default)] [produce -a)sync ouput]" .
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    66
		   "[-y)modem receive <cmd[\"\" for none]>] [non-R)DI mode]" .
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    67
		    "<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
    68
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    69
die($USAGE) unless (getopts("amRsy:"));
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    70
$opt_s = 1 unless ($opt_a);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    71
$opt_m = 1 unless (@ARGV > 1);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    72
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    73
#============================== USER MANUAL ==============================
0
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
# 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
    76
# 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
    77
# 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
    78
# 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
    79
# with The first (second) port is shown in red (blue). For consistency
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    80
# with the color scheme used by the LDEO expect scripts, the instrument
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    81
# sending the sync pulses (downlooker) should be connected to the first
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    82
# tty given on the command line. When only one port is specified, the
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    83
# -m)onochrome option is assumed.
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    84
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    85
# 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
    86
# "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
    87
# These should be largely self explanatory. Initially, bbabble
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    88
# 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
    89
# 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
    90
# 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
    91
# given on the command line.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    92
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    93
# 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
    94
# 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
    95
# is flushed to the screen.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    96
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    97
# ^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
    98
# 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
    99
# 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
   100
# 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
   101
# 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
   102
# "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
   103
# 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
   104
# LDEO cabling with shared ground.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   105
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   106
# ^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
   107
# 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
   108
# 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
   109
# 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
   110
# 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
   111
# 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
   112
# asynchronous messages).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   113
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   114
# 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
   115
# 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
   116
# lines, as well as comments beginning with a semicolon (;).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   117
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   118
#====================== USAGE NOTES ==============================
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   119
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   120
# On some (especially BSD-based) systems there are separate tty
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   121
# device files for dialin and dialout operations. Only the latter work
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   122
# with bbabble. They traditionally have names matching /dev/cu* (e.g.
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   123
# /dev/cuad0 for the first serial # port in FreeBSD).
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   124
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   125
# In order to have read/write access to the device files, the user
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   126
# that is to run bbabble should be added to the group that owns
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   127
# the tty device files (e.g. dialer on FreeBSD).
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   128
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   129
# 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
   130
# (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
   131
# 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
   132
# ^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
   133
# 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
   134
# 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
   135
# 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
   136
# the following steps:
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   137
#	1. start bbabble
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   138
#	2. type ^C to wake the instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   139
#	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
   140
#	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
   141
#	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
   142
#	6. type ^D to exit bbabble
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   143
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
# IMPLEMENTATION NOTES
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   146
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   147
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   148
# DOWNLOAD BAUD RATE
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   149
# 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
   150
# (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
   151
# downloading the communications speed is increased to 115kbps. The
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   152
# 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
   153
# 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
   154
# 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
   155
# preprocessor to determine the correct argument to set higher
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   156
# baud rates. This works only if gcc is installed...
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   157
#
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   158
# 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
   159
#       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
   160
#       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
   161
#       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
   162
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   163
# OTHER COMMUNICATIONS PARAMETERS
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   164
# 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
   165
# Other parameters require changes to bbabble.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   166
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   167
# THREADS
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   168
# 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
   169
# 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
   170
# 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
   171
# 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
   172
# 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
   173
# 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
   174
# 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
   175
# 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
   176
# 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
   177
# variable.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   178
# 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
   179
#     ON MACOSX ARE NOT THREADED!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   180
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   181
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   182
# TWEAKABLES
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   183
#----------------------------------------------------------------------
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
# 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
   186
# 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
   187
# for BB150 instruments)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   188
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   189
$START_DOWNLOAD_RDI_COMMAND = 'RY0';
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
# 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
   192
# 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
   193
# 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
   194
# 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
   195
# 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
   196
# because is it more portable.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   197
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   198
#$ymodem_download_prompt[0] = 'Please start your host now';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   199
#$ymodem_download_prompt[1] = 'Please start your host now';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   200
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   201
$ymodem_download_prompt[0] = '';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   202
$ymodem_download_prompt[1] = '';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   203
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   204
# 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
   205
# 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
   206
# computers.
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
#$DOWNLOAD_SPEED = 9600;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   209
#$DOWNLOAD_SPEED = 38400;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   210
#$DOWNLOAD_SPEED = 57600;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   211
$DOWNLOAD_SPEED = 115200;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   212
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   213
# I prefer communicating at 9600 bps, except when downloading.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   214
# 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
   215
# 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
   216
# 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
   217
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   218
my(@DEFAULT_SPEED):shared;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   219
my(@COMMS_SPEED):shared;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   220
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   221
$DEFAULT_SPEED[0] = 9600;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   222
$DEFAULT_SPEED[1] = 9600;
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
# 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
   225
# 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
   226
# 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
   227
# /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
   228
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   229
$shell = '/bin/sh';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   230
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   231
# Synchronization between the threads is accomplished using spin locks.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   232
# 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
   233
# the maximum response time in seconds.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   234
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   235
$naptime = 0.1;				# nap time in seconds
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   236
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   237
# 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
   238
# a timeout error is generated.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   239
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   240
$timeout = 10;				# timeout waiting for instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   241
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   242
# 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
   243
# 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
   244
# `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
   245
# was previously selected.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   246
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   247
$COLOR_RESET = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   248
$COLOR_TTY0  = 1;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   249
$COLOR_TTY1  = 4;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   250
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   251
# 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
   252
# 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
   253
# 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
   254
# 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
   255
# `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
   256
# 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
   257
# is `lrb'.
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   258
# 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
   259
# executables. Using -y allows options to be set.
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   260
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   261
if (defined($opt_y)) {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   262
  if (length($opt_y) > 0) {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   263
    $receive_ymodem = $opt_y;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   264
  }
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   265
} else {
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   266
  chomp($receive_ymodem = `which lrb 2>/dev/null`);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   267
  chomp($receive_ymodem = `which  rb 2>/dev/null`)
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   268
    if ($receive_ymodem eq '');
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   269
  die("$0: cannot find rb or lrb\n")
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   270
    if ($receive_ymodem eq '');
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   271
  $receive_ymodem .= ' -u';		  # keep upper-case filenames
4
fda11de1826e version left on Poseidon at end of P403
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   272
}
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   273
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   274
# 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
   275
# 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
   276
# prompt (as a perl regexpr). ANCHOR AT END ONLY!!!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   277
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   278
$RDI_prompt = '>$';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   279
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
# PROGRAM
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
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   284
use threads;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   285
use threads::shared;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   286
use IO::Handle;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   287
use POSIX ();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   288
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   289
if (scalar(@ARGV) == 1) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   290
  $TTY0 = $ARGV[0];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   291
} elsif (scalar(@ARGV) == 2) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   292
  $TTY0 = $ARGV[0];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   293
  $TTY1 = $ARGV[1];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   294
} else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   295
  die($USAGE);
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
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
# determine baudrate tcsetospeed() arguments
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   300
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   301
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   302
$TERMIOS_SPEED{300}   = &POSIX::B300;	$RDI_SPEED{300}    = 'CB0';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   303
$TERMIOS_SPEED{1200}  = &POSIX::B1200;	$RDI_SPEED{1200}   = 'CB1';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   304
$TERMIOS_SPEED{2400}  = &POSIX::B2400;	$RDI_SPEED{2400}   = 'CB2';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   305
$TERMIOS_SPEED{4800}  = &POSIX::B4800;	$RDI_SPEED{4800}   = 'CB3';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   306
$TERMIOS_SPEED{9600}  = &POSIX::B9600;	$RDI_SPEED{9600}   = 'CB4';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   307
$TERMIOS_SPEED{19200} = &POSIX::B19200;	$RDI_SPEED{19200}  = 'CB5';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   308
$TERMIOS_SPEED{38400} = &POSIX::B38400; $RDI_SPEED{38400}  = 'CB6';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   309
					$RDI_SPEED{57600}  = 'CB7';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   310
					$RDI_SPEED{57600}  = 'CB7';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   311
					$RDI_SPEED{115200} = 'CB8';
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   312
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   313
# The following is ugly & slow, but seems fairly portable.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   314
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   315
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
   316
close(TMP);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   317
$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
   318
$TERMIOS_SPEED{57600} = hex($TERMIOS_SPEED{57600})
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   319
	if ($TERMIOS_SPEED{57600} =~ /^0x/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   320
$TERMIOS_SPEED{57600} = oct($TERMIOS_SPEED{57600})
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   321
	if ($TERMIOS_SPEED{57600} =~ /^0/);
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
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
   324
close(TMP);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   325
$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
   326
$TERMIOS_SPEED{115200} = hex($TERMIOS_SPEED{115200})
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   327
	if ($TERMIOS_SPEED{115200} =~ /^0x/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   328
$TERMIOS_SPEED{115200} = oct($TERMIOS_SPEED{115200})
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   329
	if ($TERMIOS_SPEED{115200} =~ /^0/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   330
unlink('/tmp/tt.c');
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   331
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   332
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   333
# Common Setup
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   334
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   335
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   336
$COMMS_SPEED[0] = $DEFAULT_SPEED[0];		# baud rates
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   337
$COMMS_SPEED[1] = $DEFAULT_SPEED[1];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   338
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   339
unless ($opt_m) {				# colors
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   340
  $RESET = `tput setaf $COLOR_RESET`;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   341
  @COLOR = (`tput setaf $COLOR_TTY0` ,
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   342
            `tput setaf $COLOR_TTY1`);
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
my(@sfd);					# TTYs
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   346
-c $TTY0 || die("$TTY0: no such file or directory\n");
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   347
open(TTY0,'+>',$TTY0) || die("$TTY0: $!\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   348
$sfd[0] = fileno(TTY0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   349
if (defined($TTY1)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   350
  select(undef,undef,undef,$naptime);		# KEYSPAN 49W requires this
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   351
  -c $TTY1 || die("$TTY1: no such file or directory\n");
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   352
  open(TTY1,'+>',$TTY1) || die("$TTY1: $!\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   353
  $sfd[1] = fileno(TTY1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   354
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   355
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   356
STDOUT->autoflush(1);				# flushing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   357
STDERR->autoflush(1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   358
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   359
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   360
# TTY-Reader Threads
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   361
#----------------------------------------------------------------------
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
# 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
   364
# 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
   365
# with UPLOAD & ECHO (w or w/o DOWNLOAD).
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   366
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   367
my($SHUTDOWN):shared	      = 0x00;		# terminate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   368
my($ECHO):shared   	      = 0x01;		# normal state of active instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   369
my($BUFFER):shared  	      = 0x02;		# normal state of inactive instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   370
my($FLUSH):shared  	      = 0x04;		# flush buffered data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   371
my($SET_DOWNLOAD_SPEED):shared= 0x10;		# change baudrate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   372
my($SET_DEFAULT_SPEED):shared = 0x20;		# change baudrate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   373
my($UPLOAD):shared	      = 0x40;		# upload cmd file
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   374
my($DOWNLOAD):shared   	      = 0x80;		# download (using ymodem)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   375
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   376
my(@rcv_state):shared = ($ECHO,$BUFFER);	# initial states
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   377
my(@dld_pid):shared;				# downloader pids
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   378
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   379
sub TTY_receiver($)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   380
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   381
  my($id) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   382
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   383
  my($t) = POSIX::Termios::new();			# setup serial line
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   384
  print(STDERR "$COLOR[$id]tcgetattr: $!\n"),return	# ... N81
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   385
    unless defined($t->getattr($sfd[$id]));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   386
  $t->setiflag($t->getiflag() & ~(POSIX::IGNBRK() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   387
  				  POSIX::BRKINT() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   388
  				  POSIX::PARMRK() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   389
  				  POSIX::ISTRIP() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   390
  				  POSIX::INLCR()  |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   391
  				  POSIX::IGNCR()  |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   392
  				  POSIX::ICRNL()  |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   393
  				  POSIX::IXON()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   394
  $t->setoflag($t->getoflag() & ~POSIX::OPOST());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   395
  $t->setlflag($t->getlflag() & ~(POSIX::ECHO() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   396
  				  POSIX::ECHONL() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   397
  				  POSIX::ICANON() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   398
  				  POSIX::ISIG() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   399
  				  POSIX::IEXTEN()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   400
  $t->setcflag($t->getcflag() & ~(POSIX::CSIZE()|POSIX::PARENB())
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   401
 			      | POSIX::CS8());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   402
  $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
   403
  set_speed($t,$id,$DEFAULT_SPEED[$id]);
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   404
  unless ($opt_s) {
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   405
    print($COLOR[$id]) unless ($opt_m);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   406
    print("{TTY $id READY}");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   407
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   408
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   409
  my(@buf,$rin);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   410
  my($nbi) = 0;						# next buffer
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   411
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   412
  while (1) {						# reader loop
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   413
    vec($rin,$sfd[$id],1) = 1;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   414
    while (!select($rin,undef,undef,$naptime)) {	# wait for data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   415
      return unless ($rcv_state[$id]);			# ... or state change
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   416
      last unless ($rcv_state[$id] == $ECHO ||
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   417
             	   $rcv_state[$id] == $BUFFER);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   418
      vec($rin,$sfd[$id],1) = 1;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   419
    }
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   420
    last unless ($rcv_state[$id] == $ECHO ||		# needed when Arduino USB interface is closed at other end
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   421
                 $rcv_state[$id] == $BUFFER);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   422
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   423
    #------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   424
    # DOWNLOAD DATA FROM INSTRUMENT
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   425
    #------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   426
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   427
    if ($rcv_state[$id] == $DOWNLOAD) {			# initiate download
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   428
      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
   429
      	sleep(1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   430
      } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   431
	my($buf,$msg,$nread);				# wait for RDI prompt
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   432
        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
   433
  	  unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   434
	do {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   435
	  $nread = POSIX::read($sfd[$id],$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   436
	  die("$COLOR[$id]read: EOF\n") if ($nread == 0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   437
	  die("$COLOR[$id]read: $!\n") if ($nread < 0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   438
	  POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   439
	  $msg = unpack("a$nread",$buf);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   440
        } until ($msg =~ /$ymodem_download_prompt[$id]/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   441
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   442
      
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   443
      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
   444
		unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   445
      my($rfd,$wfd) = POSIX::pipe();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   446
      $dld_pid[$id] = fork();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   447
      if ($dld_pid[$id] == 0) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   448
        POSIX::dup2($sfd[$id],0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   449
        POSIX::dup2($sfd[$id],1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   450
        POSIX::dup2($wfd,2);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   451
        POSIX::close($rfd); POSIX::close($wfd);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   452
        exec($receive_ymodem);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   453
        die("$COLOR[$id]exec: $!$RESET\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   454
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   455
      
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   456
      POSIX::close($wfd);				# handle progress data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   457
      while (1) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   458
        my($buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   459
        $nread = POSIX::read($rfd,$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   460
        $rcv_state[$id] |= $ECHO			# initially, echo tty
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   461
          if ($rcv_state[$id] == $DOWNLOAD);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   462
        last if ($nread == 0);				# EOF => ymodem done
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   463
        if ($rcv_state[$id]&$BUFFER) {			# buffer data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   464
          $nread[$nbi] = $nread;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   465
          $buf[$nbi++] = $buf;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   466
        } elsif ($rcv_state[$id]&$FLUSH) {		# flush buffered data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   467
          print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   468
          for (my($bi)=0; $bi<$nbi; $bi++) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   469
            my($buf) = $buf[$bi];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   470
            my($nread) = $nread[$bi];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   471
            POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   472
          }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   473
          $nbi = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   474
          $rcv_state[$id] = $DOWNLOAD|$ECHO;		# now, continue echoing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   475
          POSIX::write(1,$buf,$nread);			# don't forget!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   476
        } else {					# echo data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   477
          print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   478
          POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   479
        }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   480
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   481
      POSIX::close($rfd);
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
      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
   484
      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
   485
        unless ($rip == $dld_pid[$id]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   486
      if (POSIX::WIFEXITED($?)) {			# check exit status
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   487
        if (POSIX::WEXITSTATUS($?)) {			# error
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   488
          print(STDERR $COLOR[$id]) unless ($opt_m);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   489
          printf(STDERR "{DOWNLOAD EXITED ABNORMALLY --- STATUS %d}$RESET",
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   490
                   POSIX::WEXITSTATUS($?));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   491
        } else {					# no error
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   492
          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
   493
          	unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   494
	}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   495
      } elsif (POSIX::WIFSIGNALED($?)) {		# killed by signal
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   496
        print(STDERR $COLOR[$id]) unless ($opt_m);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   497
        printf(STDERR "{DOWNLOAD KILLED BY SIGNAL %d}$RESET",
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   498
                 POSIX::WTERMSIG($?));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   499
      } else {						# should not happen!
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   500
        print(STDERR $COLOR[$id]) unless ($opt_m);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   501
        printf(STDERR "{UNKNOWN DOWNLOAD TERMINATION --- STATUS %d}$RESET",$?);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   502
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   503
      $rcv_state[$id] &= ~$DOWNLOAD;			# acknowledge operation
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   504
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   505
    
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
    # SET DOWNLOAD BAUD RATE
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
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   510
    elsif ($rcv_state[$id] == $SET_DOWNLOAD_SPEED) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   511
      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
   512
      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
   513
      select(undef,undef,undef,$naptime);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   514
      set_speed($t,$id,$DOWNLOAD_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   515
      $rcv_state[$id] = $ECHO;				# acknowledge operation
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
    # SET NORMAL BAUD RATE
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]&$SET_DEFAULT_SPEED) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   523
      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
   524
      set_speed($t,$id,$DEFAULT_SPEED[$id]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   525
      $rcv_state[$id] &= ~$SET_DEFAULT_SPEED;		# acknowledge operation
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   526
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   527
    
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   528
    #-----------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   529
    # INACTIVE INSTRUMENT => BUFFER DATA
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   530
    #-----------------------------------
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
    elsif ($rcv_state[$id] == $BUFFER) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   533
      my($buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   534
      $nread = POSIX::read($sfd[$id],$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   535
      $nread[$nbi] = $nread; $buf[$nbi++] = $buf;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   536
    }
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
    # JUST BEEN MADE ACTIVE => FLUSH BUFFERED DATA
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   540
    #---------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   541
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   542
    elsif ($rcv_state[$id] == $FLUSH) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   543
      if ($nbi) {
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
          my($buf) = $buf[$bi];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   547
          my($nread) = $nread[$bi];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   548
          POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   549
        }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   550
        $nbi = 0;
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
      $rcv_state[$id] = $ECHO;				# acknowledge action
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
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
    # UPLOADING COMMAND FILE => ECHO DATA, WAITING FOR PROMPT
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   557
    #--------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   558
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   559
    elsif ($rcv_state[$id] == $UPLOAD) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   560
      my($buf,$nread);					# buffer data
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   561
      $nread = POSIX::read($sfd[$id],$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   562
      $nread[$nbi] = $nread; $buf[$nbi++] = $buf;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   563
      if ($buf =~ /$RDI_prompt/) {			# prompt => flush
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   564
        print("\n"); print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   565
        for (my($bi)=0; $bi<$nbi; $bi++) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   566
          POSIX::write(1,$buf[$bi],$nread[$bi]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   567
        }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   568
        $nbi = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   569
        $rcv_state[$id] = $ECHO;			# done
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
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   573
    #--------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   574
    # (FINALLY) DEFAULT ACTION => ECHO DATA
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
    else { # $rcv_state[$id] == $ECHO
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   578
      my($buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   579
      $nread = POSIX::read($sfd[$id],$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   580
      for (my($i)=0; $i<$nread; $i++) {			# clean garbage
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   581
      	my($ascii) = ord(substr($buf,$i));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   582
      	substr($buf,$i,1) = '?'
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   583
      	  unless ($ascii == 10 || $ascii == 13 || $ascii == 9 ||
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   584
		  ($ascii >= 32 && $ascii <= 126));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   585
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   586
      print($COLOR[$id]) unless ($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   587
      POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   588
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   589
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   590
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   591
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   592
$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
   593
$TTY_receiver[1] = threads->new(\&TTY_receiver,1)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   594
  if defined($TTY1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   595
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   596
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   597
# Controller (reads stdin & writes to serial ports)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   598
#----------------------------------------------------------------------
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
my($t) = POSIX::Termios::new();				# set raw mode
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   601
die("${RESET}tcgetattr: $!\n") unless defined($t->getattr(0));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   602
@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
   603
$clf = $t->getlflag(); $cif = $t->getiflag(); $cof = $t->getoflag();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   604
$rlf = $clf &	# linux termios manpage
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   605
	~(POSIX::ECHO()|POSIX::ECHONL()|POSIX::ICANON()|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   606
	  POSIX::IEXTEN()|POSIX::ISIG());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   607
$rif = $cif &
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   608
	~(POSIX::IGNBRK()|POSIX::BRKINT()|POSIX::PARMRK()|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   609
	  POSIX::ISTRIP()|POSIX::INLCR()|POSIX::IGNCR()|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   610
	  POSIX::ICRNL()|POSIX::IXON());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   611
$rof = $cof & ~POSIX::OPOST(); # unused
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
sub croak(@)						# cook and die
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   614
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   615
  $t->setlflag($clf); $t->setiflag($cif); $t->setoflag($cof);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   616
  $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
   617
  $t->setattr(0,POSIX::TCSANOW());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   618
  die(@_);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   619
}
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
sub set_speed($$$)					# set baud rate
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   622
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   623
  my($t,$id,$speed) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   624
  $t->setispeed($TERMIOS_SPEED{$speed});
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   625
  $t->setospeed($TERMIOS_SPEED{$speed});
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   626
  print(STDERR "tcsetattr: $!\n"),return
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   627
    unless defined($t->setattr($sfd[$id],POSIX::TCSANOW));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   628
  $COMMS_SPEED[$id] = $speed;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   629
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   630
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   631
sub cookedmode()					# cook with errors
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   632
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   633
  $t->setlflag($clf); $t->setiflag($cif); $t->setoflag($cof);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   634
  $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
   635
  die("${RESET}tcsetattr: $!\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   636
    unless defined($t->setattr(0,POSIX::TCSANOW()));
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
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   639
sub rawmode()						# set raw mode
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   640
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   641
  $t->setlflag($rlf); $t->setiflag($rif); #$t->setoflag($rof);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   642
  $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
   643
  croak("${RESET}tcsetattr: $!\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   644
    unless defined($t->setattr(0,POSIX::TCSANOW()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   645
}
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
sub wait_for_bit_set($$)				# wait for state
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
  my($id,$trgbit) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   650
  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
   651
    croak("$COLOR[$id]Error: timeout waiting for instrument $id" .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   652
	  "$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
   653
      if ($time >= $timeout);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   654
    select(undef,undef,undef,$naptime);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   655
  }
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 wait_for_bit_cleared($$)				# wait for state
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($id,$trgbit) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   661
  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
   662
    croak("$COLOR[$id]Error: timeout waiting for instrument $id" .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   663
	  "$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
   664
      if ($time >= $timeout);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   665
    select(undef,undef,undef,$naptime);
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
}
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
sub send_BREAK($)					# send simple BREAK
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
  my($id) = @_;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   672
  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
   673
  croak("$COLOR[$id]tcsendbreak: $!$RESET\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   674
    unless defined(POSIX::tcsendbreak($sfd[$id],0));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   675
  $rcv_state[$id] |= $SET_DEFAULT_SPEED;		# ECHO or UPLOAD
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
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   678
sub help()						# print help message
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
  my($toggle) = "^T: toggle instrument; " if defined($TTY1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   681
  print($COLOR[$cid]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   682
  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
   683
	       "$toggle^C: BREAK; ^U: upload; ^X: download; ^S: shell; " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   684
	       "^B: change baud rate; ^D: end\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   685
}
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
sub next_cmd($)						# get next cmd from file
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   688
{
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   689
  my($f) = @_;
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
  while (defined($_ = <$f>)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   692
    chomp;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   693
    s/\s*;.*//;						# remove comments
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   694
    next if /^\s*$/;					# empty lines
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   695
    return $_;    
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   696
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   697
  return undef;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   698
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   699
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   700
$cid = 0;						# current instrument
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   701
rawmode();						# setup
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   702
help();
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
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
   705
  $char = unpack('C',$buf);
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 ^B (CHANGE SPEED)
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
  if ($char == 2) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   712
    if ($rcv_state[$cid] == $ECHO) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   713
      $DEFAULT_SPEED[$cid] *= 2;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   714
      $DEFAULT_SPEED[$cid] = 57600 if ($DEFAULT_SPEED[$cid] == 76800);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   715
      $DEFAULT_SPEED[$cid] =   300 if ($DEFAULT_SPEED[$cid] == 230400);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   716
      $DEFAULT_SPEED[$cid] =  1200 if ($DEFAULT_SPEED[$cid] == 600);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   717
      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
   718
      sleep(1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   719
      $rcv_state[$cid] |= $SET_DEFAULT_SPEED;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   720
      wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   721
    } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   722
      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
   723
    }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   724
    help();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   725
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   726
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   727
  #-----------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   728
  # HANDLE ^C (SEND BREAK)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   729
  #-----------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   730
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   731
  elsif ($char ==  3) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   732
    my($cidkilled) = 0;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   733
    if (($rcv_state[0]&$DOWNLOAD) ||			# currently downloading
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   734
	($rcv_state[1]&$DOWNLOAD)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   735
      if ($rcv_state[$cid]&$DOWNLOAD) {			# active-instrument downloading
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   736
	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
   737
	send_BREAK($cid); kill('TERM',$dld_pid[$cid]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   738
        wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   739
        send_BREAK($cid); kill('TERM',$dld_pid[$cid]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   740
        $cidkilled = 1;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   741
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   742
      if ($rcv_state[!$cid]&$DOWNLOAD) {		# inactive-instrument dld'ing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   743
      	if ($cidkilled) {				# active killed as well
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   744
	  $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
   745
          $cid = 1*!$cid;				# toggle instruments
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   746
    	  $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
   747
          wait_for_bit_cleared($cid,$FLUSH);		# flush before killing
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
	  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
   750
	  send_BREAK($cid); kill('TERM',$dld_pid[$cid]);
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
          send_BREAK($cid);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   753
          wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
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
	  $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
   756
          $cid = 1*!$cid;				# toggle back
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   757
    	  $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
   758
          wait_for_bit_cleared($cid,$FLUSH);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   759
        } else {					# tried to send BREAK
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   760
          if ($cid == 0) {				# while inactive dld'ing
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   761
      	    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
   762
			  "INSTRUMENT 1 DOWNLOAD IN PROGRESS}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   763
      	  } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   764
      	    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
   765
			  "INSTRUMENT 1 DOWNLOAD IN PROGRESS}\n");
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
      }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   769
    } else {						# none downloading
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   770
      send_BREAK($cid);					# send BREAK
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   771
      wait_for_bit_cleared($cid,$SET_DEFAULT_SPEED);
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
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
  # HANDLE ^D (EXIT)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   777
  #-----------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   778
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   779
  elsif ($char ==  4) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   780
    if (($rcv_state[0]&$DOWNLOAD)|($rcv_state[1]&$DOWNLOAD)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   781
      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
   782
    } else {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   783
      last;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   784
    }
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 ^H (HELP)
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 ==  8) { help(); }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   792
  
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   793
  #-------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   794
  # HANDLE ^S (SHELL ESCAPE)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   795
  #-------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   796
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   797
  elsif ($char == 19) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   798
    $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
   799
    print($RESET);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   800
    cookedmode();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   801
    system($shell) && print(STDERR "$shell: $!");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   802
    rawmode(); help();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   803
    $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
   804
    wait_for_bit_cleared($cid,$FLUSH);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   805
  }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   806
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   807
  #-------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   808
  # HANDLE ^T (TOGGLE INSTRUMENTS)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   809
  #-------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   810
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   811
  elsif ($char == 20 && defined($TTY1)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   812
    $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
   813
    $cid = 1*!$cid; print("\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   814
    help();
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
  }
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
  #----------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   820
  # HANDLE ^U (UPLOAD CMD-FILE)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   821
  #----------------------------
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
  elsif ($char == 21) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   824
    if ($rcv_state[$cid]&$DOWNLOAD){
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   825
      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
   826
    } else {
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   827
      unless ($opt_R) {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   828
        $tmp = $rcv_state[$cid]&~$ECHO; $rcv_state[$cid] = $tmp|$BUFFER;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   829
      }
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   830
      print($RESET);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   831
      cookedmode();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   832
      do {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   833
	print("\nCommand File: "); chomp($_ = <STDIN>);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   834
	if ($_ eq '') {				# no file name given
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   835
	  print("{upload canceled}\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   836
	  rawmode();
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   837
	  unless ($opt_R) {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   838
       	    $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   839
      	    wait_for_bit_cleared($cid,$FLUSH);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   840
      	  }
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   841
      	  next KEYSTROKE;
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
	unless (open(CF,$_)) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   844
          print("$_: $!");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   845
          redo;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   846
        } 
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   847
      } while (0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   848
      rawmode();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   849
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   850
      if ($opt_R) {				# non-RDI mode: dump entire file contents raw
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   851
      	my($buf,$nread);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   852
      	while (($nread = read(CF,$buf,1)) > 0) {	# nice small chunks
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   853
      	  POSIX::write($sfd[$cid],$buf,$nread);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   854
      	}
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   855
      } else {					# RDI mode: parse command file and send command by command
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   856
        $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   857
        wait_for_bit_cleared($cid,$FLUSH);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   858
	my($cmd) = next_cmd(CF);		  # read ahead (last cmd may ...
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   859
	my($next_cmd);				  # ... not generate prompt)
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   860
	while (defined($next_cmd = next_cmd(CF))) {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   861
	  $rcv_state[$cid] = $UPLOAD;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   862
	  if ($cmd eq '<BREAK>') {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   863
	    send_BREAK($cid);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   864
	  } else {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   865
	    POSIX::write($sfd[$cid],"$cmd\r",length($cmd)+1);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   866
	  }
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   867
	  $cmd = $next_cmd;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   868
	  wait_for_bit_set($cid,$ECHO); # NOT SURE!!!
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   869
	  $tmp = $rcv_state[$cid]&~$ECHO; $rcv_state[$cid] = $tmp|$BUFFER;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   870
	  print("\n${RESET}{upload finished}\n");
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   871
          $tmp = $rcv_state[$cid]&~$BUFFER; $rcv_state[$cid] = $tmp|$FLUSH;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   872
	  wait_for_bit_cleared($cid,$FLUSH);
0
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
      close(CF);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   876
    }
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
  #--------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   880
  # HANDLE ^X (DOWNLOAD DATA)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   881
  #--------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   882
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   883
  elsif ($char == 24) {
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   884
    if (defined($receive_ymodem)) {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   885
      if ($rcv_state[$cid]&$DOWNLOAD){
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   886
	print(STDERR "$COLOR[$cid]\{DOWNLOAD IN PROGRESS --- ^C TO ABORT}\n");
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   887
      } else {
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   888
	$rcv_state[$cid] = $SET_DOWNLOAD_SPEED;
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   889
	wait_for_bit_set($cid,$ECHO);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   890
	$rcv_state[$cid] = $DOWNLOAD;		  # start waiting for instr. ready
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   891
	POSIX::write($sfd[$cid],"$START_DOWNLOAD_RDI_COMMAND\r",
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   892
				length($START_DOWNLOAD_RDI_COMMAND)+1);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   893
	wait_for_bit_set($cid,$ECHO);
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   894
      }
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   895
    } else {
12
5e67754f6457 V1.6: no more master/slave terminology
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   896
    	print(STDERR "$COLOR[$cid]\{NO YMODEM RECEIVER PROGRAM SPECIFIED}\n");
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   897
    }
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
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   900
  #------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   901
  # (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
   902
  #------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   903
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   904
  else { POSIX::write($sfd[$cid],$buf,1); }
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   905
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   906
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   907
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   908
#-------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   909
# Exit Received (^D)
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   910
#-------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   911
  
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   912
if ($rcv_state[0]&$DOWNLOAD) {			# abort downloads on close
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   913
  send_BREAK(0); kill('TERM',$dld_pid[0]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   914
  wait_for_bit_cleared(0,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   915
  send_BREAK(0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   916
  wait_for_bit_cleared(0,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   917
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   918
if ($rcv_state[1]&$DOWNLOAD) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   919
  send_BREAK(1); kill('TERM',$dld_pid[1]);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   920
  wait_for_bit_cleared(1,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   921
  send_BREAK(1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   922
  wait_for_bit_cleared(1,$SET_DEFAULT_SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   923
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   924
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   925
$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
   926
$TTY_receiver[0]->join();			# wait for them
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   927
$TTY_receiver[1]->join() if defined($TTY1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   928
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   929
cookedmode();					# reset keyboard
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   930
print("$RESET\n");				# and screen
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   931
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   932
exit(0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   933