--- a/libBB.expect Wed Jul 07 13:29:02 2010 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,569 +0,0 @@
-#!/usr/bin/expect -f
-#======================================================================
-# L I B B B . E X P E C T
-# doc: Mon Mar 8 02:57:35 2004
-# dlm: Thu Nov 19 14:48:52 2009
-# (c) 2004 A.M. Thurnherr
-# uE-Info: 41 54 NIL 0 0 72 2 2 8 NIL ofnI
-#======================================================================
-
-# HISTORY:
-# Mar 8, 2004: - incepted (NBP0402)
-# Mar 15, 2004: - released
-# Mar 18, 2004: - improved download-error handling
-# - BUG: set correct color in toggle_instrument
-# - new reset_two_instruments
-# Mar 20, 2004: - increased instrument-toggle timeout to 2s
-# - cleaned-up get_deployment_name
-# - added save_hardware_config to upload_file (just before CS)
-# - renamed continue_logging to resume_logging
-# Mar 21, 2004: - debugged user-interaction routines
-# - generally increased timeouts
-# Apr 4, 2004: - added comments
-# Jun 15, 2004: - changed \n to \r for BB150 (CLIVAR P02)
-# - started adaptation to BB150
-# Jun 18, 2004: - BUG: could not handle station 008 (illegal octal digit)
-# Jun 27, 2004: - doubled wait_for_startup timeouts
-# Sep 28, 2006: - added sleep 1 to wait_for_startup (marked AMARYLIS)
-# Oct 30, 2006: - improved error messages
-# Nov 6, 2006: - added ensure_sleep
-# - BUG: input_int had interpreted 010 as octal
-# Nov 15, 2006: - added next_speed
-# Nov 17, 2006: - added get_serial_number
-# - added save_parameters
-# Oct 22, 2007: - removed erroneous line of code (that did nothing)
-# - changed expect target in next_speed()
-# Oct 23, 2007: - cosmetics
-# Nov 19, 2008: - added load_factory_defaults()
-# - added print_version()
-# Oct 12, 2009: - BUG: load_factory_defaults errmesg used non-existent variable
-# Nov 19, 2009: - get_deployment_name needed a delay (sleep 1) for the
-# instruments sent to the DIMES cruise
-
-# NOTE: after having written this, I am not much of a fan of TCL and and
-# expect(1) syntax any more...
-
-# PS0 ON BB150 NOTE:
-# I AM NOT SURE ABOUT THE FOLLOWING ANY MORE. THE CURRENT CODE
-# MAY THEREFORE NOT RUN WITH BB150s!!!
-# PS0 does not produce any output on the BB150 unless the factory
-# defaults are in effect. (I have not checked exactly which user defaults
-# cause this behaviour.) Therefore, every time before PS0 is sent
-# to the instrument, the current values are stored, the factory
-# defaults restored, PS0 is sent, and then the user values
-# are restored. For safety, I removed PS0 from save_hardware_config
-# code for the BB150; because it would be really bad if the factory
-# defaults would be restored immediately before pinging starts...
-# The behaviour was detected on CPU firmware 5.52.
-
-set NEXT_SPEED \002; # ^B # bbabble commands
-set BREAK \003; # ^C
-set HELP \010; # ^H
-set TOGGLE \024; # ^T
-set DNLOAD \030; # ^X
-
-set cid -1; # current instrument
-
-proc print_version {} {
- send_user "acquire V1.4beta\n"
-}
-
-proc set_color {{cid -1}} { # set instrument color
- if {$cid == 0} {
- send_user [exec tput setaf 1];
- } elseif {$cid == 1} {
- send_user [exec tput setaf 4];
- } else {
- send_user [exec tput setaf 0];
- }
-}
-
-proc error {msg} { # print error & exit
- global cid;
- set_color $cid;
- send_error "\nError: $msg\n";
- set_color;
- exit 1;
-}
-
-proc gobble_prompts {} { # gobble old prompts
- set continue_flushing 1;
- while {$continue_flushing > 0} {
- expect {
- timeout {set continue_flushing 0;}
- -timeout 0 ">";
- }
- }
-}
-
-proc BREAK {} { # send BREAK
- global BREAK;
-
- gobble_prompts;
- send $BREAK; # Wakeup Instrument
- expect {
- timeout {error "Can't wake Instrument"}
- -timeout 8 "RD Instruments (c)"
- }
- expect { # gobble prompt as well
- timeout {error "Can't get wakeup prompt"}
- -timeout 3 ">"
- }
-}
-
-proc no_error_BREAK {} { # send BREAK without errcheck
- global BREAK;
-
- gobble_prompts;
- send $BREAK;
- expect -timeout 8 "RD Instruments (c)"
- expect -timeout 3 ">"
-}
-
-proc next_speed {} { # select next baudrate
- global NEXT_SPEED;
-
- send $NEXT_SPEED;
- expect {
- timeout {error "Cannot change speed"}
- -timeout 5 ": end"
- }
- sleep 1
-}
-
-proc toggle_instrument {} { # select other instrument
- global cid TOGGLE;
- send $TOGGLE; # switch
- expect {
- timeout {error "Can't switch instruments"}
- -timeout 3 "Instrument"
- }
- if {$cid == 0} {set cid 1} else {set cid 0}
-}
-
-proc select_master {{toggle_first 1}} { # select master & check S/N
- global HELP cid master_sn slave_sn;
-
- if {$toggle_first} toggle_instrument;
- gobble_prompts;
- send "\r"; wait_for_prompt; # save current value
- send "PS0\r";
- expect {
- timeout {error "Can't determine serial number"}
- -timeout 8 -re "Instrument S/N: $master_sn.*>|Xducer Ser #: $master_sn.*>|PS0...>" {}
- -timeout 8 -re "Instrument S/N: $slave_sn.*>" {
- toggle_instrument;
- send "PS0\r";
- expect {
- timeout {error "Can't determine serial number"}
- -timeout 8 -re "Instrument S/N: $master_sn.*>|Xducer Ser #: $master_sn.*>|PS0...>" {}
- -timeout 8 -re "Instrument S/N: $slave_sn.*>" {
- error "Can't switch to master"
- }
- }
- }
- }
- set cid 0;
-}
-
-proc select_slave {{toggle_first 1}} { # select slave & check S/N
- global HELP cid master_sn slave_sn;
-
- if {$toggle_first} toggle_instrument;
- gobble_prompts;
- send "\r"; wait_for_prompt; # save current value
- send "PS0\r";
- expect {
- timeout {error "Can't determine master/slave"}
- -timeout 8 -re "Instrument S/N: $slave_sn.*>" {}
- -timeout 8 -re "Instrument S/N: $master_sn.*>|Xducer Ser #: $master_sn.*>|PS0...>" {
- toggle_instrument;
- send "PS0\r";
- expect {
- timeout {error "Can't determine master/slave"}
- -timeout 8 -re "Instrument S/N: $slave_sn.*>" {}
- -timeout 8 -re "Instrument S/N: $master_sn.*>|Xducer Ser #: $master_sn.*>|PS0...>" {
- error "Can't switch to slave"
- }
- }
- }
- }
- set cid 1;
-}
-
-proc wait_for_startup {} { # wait for bbabble startup
- global cid;
- expect {
- timeout {error "bbabble failed to start up"}
- -timeout 10 "device" {
- error "No such device: cables plugged in???"
- }
- -timeout 10 "Instrument 0" {}
- }
- set cid 0;
- sleep 1; # AMARYLIS
-}
-
-proc reset_instrument {} { # reset regardless of state
- no_error_BREAK;
- send "\r"; # send NOP command
- expect {
- timeout {
- send_error ".";
- BREAK; # try again
- }
- -timeout 5 ">"; # instrument reacted
- }
-}
-
-proc reset_two_instruments {} { # reset regardless of state
- set ok 0;
-### toggle_instrument;
- while {$ok < 2} {
- no_error_BREAK;
- send "\r"; expect {
- timeout {
- set ok 0;
- send_error "!";
- }
- -timeout 5 ">" {incr ok}
- }
- toggle_instrument;
- }
- select_master;
-}
-
-proc wait_for_prompt {{tout 5}} { # wait for prompt
- expect {
- timeout {error "Can't get prompt"}
- -timeout $tout "ERR" {
- error "Instrument returned error $expect_out(buffer)";
- }
- -timeout $tout ">"
- }
-}
-
-proc put_to_sleep {} { # send instrument to sleep
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "CZ\r";
- expect {
- timeout {error "Can't put Instrument to sleep"}
- -timeout 5 -re "Powering Down|POWERING DOWN"
- }
-}
-
-proc save_parameters {} { # save parameters
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "CK\r";
- expect {
- timeout {error "Can't put Instrument to sleep"}
- -timeout 5 -re "USER defaults"
- }
-}
-
-proc ensure_sleep {} { # send instrument to sleep...
- gobble_prompts; # unless already sleeping
- send "CZ\r";
- expect {
- timeout {error "Can't put Instrument to sleep"}
- -timeout 5 -re "Powering Down|POWERING DOWN"
- }
-}
-
-proc start_download {} { # start downloading
- global DNLOAD;
-
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send $DNLOAD;
- expect {
- timeout {error "Can't start download (memory empty?)"}
- -timeout 10 "Receiving:"
- }
-}
-
-proc wait_for_download_finish {stn tout} { # wait for timeout to finish
- global BREAK TOGGLE;
- expect {
- timeout {error "Download did not finish ok"}
- -timeout $tout "Transfer complete" {}
- -timeout $tout "ABNORMALLY" {
- send $BREAK; send $TOGGLE; send $BREAK;
- error "Download did not finish ok";
- }
- }
- expect -timeout 5 ">";
-
- global cid master_download_filename slave_download_filename;
- global master_deployment_name_fmt slave_deployment_name_fmt;
- if {$cid == 0} {
- rename_master_download_file [format $master_deployment_name_fmt $stn]000.000;
- } else {
- rename_slave_download_file [format $slave_deployment_name_fmt $stn]000.000;
- }
-}
-
-proc list_dir {} { # list directory
- global cid;
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "RR\r";
- expect {
- -timeout 1 "ERR" { # BB150
- wait_for_prompt;
- send "RS\r";
- log_user 1;
- }
- -timeout 5 "Recorder Directory:";
- }
- set_color $cid; log_user 1;
- wait_for_prompt;
- log_user 0; set_color;
-}
-
-proc erase_memory {} { # erase memory
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "RE ErAsE\r";
- expect {
- timeout {error "Can't erase recorder"}
- -timeout 5 "Erasing..." { # BB150
- sleep 3;
- wait_for_prompt;
- return;
- }
- -timeout 5 "Recorder erased." # Workhorse
- }
- wait_for_prompt;
-}
-
-proc save_hardware_config {filename} { # NB: logging continues in ...
- gobble_prompts; # ... file given as parameter
- send "\r"; wait_for_prompt;
- send "TT?\r"; # BB150
- expect -timeout 1 "ERR" {
- wait_for_prompt;
- set time [exec date +%y/%m/%d,%H:%M:%S];
- set pipe [open "| tr -d \\\r \
- | sed -e s@Time\\ Set.*@LOGGING\\ COMPUTER:\\ $time@ \
- -e /^>/d \
- > $filename" w];
- log_file; log_file -a -open $pipe;
- send "T?\r"; wait_for_prompt;
- send "RA?\r"; wait_for_prompt;
- send "RS?\r"; wait_for_prompt;
- send "W?\r"; wait_for_prompt;
- send "B?\r"; wait_for_prompt;
- send "E?\r"; wait_for_prompt;
- send "CG?\r"; wait_for_prompt;
- send "CL?\r"; wait_for_prompt;
- send "CP?\r"; wait_for_prompt;
- send "CQ?\r"; wait_for_prompt;
- send "CT?\r"; wait_for_prompt;
- send "CX?\r"; wait_for_prompt;
- send "PS3\r"; wait_for_prompt;
- return;
- }
- set time [exec date +%Y/%m/%d,%H:%M:%S];
- set pipe [open "| tr -d \\\r \
- | sed -e s/^Press\\ any\\ key\\ to\\ continue\\ *// \
- -e s@Time\\ Set.*@LOGGING\\ COMPUTER:\\ $time@ \
- > $filename" w];
- log_file;
- log_file -a -open $pipe;
- send "TT?\r"; wait_for_prompt;
- send "RF\r"; wait_for_prompt;
- send "RR\r"; wait_for_prompt;
- send "PS0\r"; wait_for_prompt;
- send "PS3\r"; wait_for_prompt;
- send "AC\r"; wait_for_prompt;
- send "RN?\r"; wait_for_prompt;
- send "DEPLOY?\r";
- expect {
- timeout {error "Can't get DEPLOY? output"}
- -timeout 10 "Press any key to continue"
- }
- send " "; wait_for_prompt;
-}
-
-proc start_logging {{filename "bbabble.log"}} { # write UNIX conformant log file
- set pipe [open "| tr -d \\\r \
- > $filename" w];
- log_file -a -open $pipe;
-}
-
-proc resume_logging {{filename "bbabble.log"}} {# append to UNIX conf. log file
- set pipe [open "| tr -d \\\r \
- >> $filename" w];
- log_file;
- log_file -a -open $pipe;
-}
-
-proc memory_empty {} { # check whether memory is empty
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "RA\r";
- expect {
- timeout {error "Can't get number of deployments"};
- -timeout 3 -re {[1-9]} {
- wait_for_prompt;
- return 0;
- }
- -timeout 3 ">" {
- return 1;
- }
- }
-}
-
-proc set_instrument_clock {} { # set instrument clock
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "TT?\r"; # check for BB150
- expect {
- -timeout 1 "ERR" {
- gobble_prompts;
- set time [exec date +%y/%m/%d,%H:%M:%S];
- send "TS$time\r";
- wait_for_prompt;
- return;
- }
- }
- set time [exec date +%Y/%m/%d,%H:%M:%S];
- send "TT$time\r";
- wait_for_prompt;
-}
-
-proc upload_file {cfn lfn hwfn} { # upload command file
- gobble_prompts; # logging stops in this routine
- send "\r"; wait_for_prompt;
- set cf [open $cfn "r"];
- set lf [open $lfn "w"];
- while {[gets $cf line] >= 0} {
- regsub {[ ]*;.*} $line {} line;
- if {![regexp {^[ ]*$} $line]} {
- puts -nonewline $lf "$line ... ";
- if {$line == "CS" || $line == "cs"} {
- send_error "!";
- save_hardware_config $hwfn;
- send "$line\r";
- expect {
- timeout {};
- -timeout 3 expect ">" {
- error "Got prompt after CS command";
- }
- }
- puts $lf "INSTRUMENT PINGING";
- close $cf; close $lf;
- log_file;
- return;
- }
- send "$line\r";
- send_error ".";
- expect {
- timeout {error "Can't get prompt after sending $line"};
- -timeout 5 "ERR" {
- error "Sending command $line returned $expect_out(buffer)";
- }
- -timeout 5 ">" {
- puts $lf "OK";
- }
- }
- }
- }
- close $cf; close $lf;
-}
-
-proc load_factory_defaults {} { # set default params
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "CR1\r";
- expect {
- timeout {error "Can't get prompt"};
- -timeout 5 "ERR" {
- error "command CR1 returned $expect_out(buffer)";
- }
- -timeout 5 ">"
- }
-}
-
-proc set_deployment_name {{dn UNSET}} { # set deployment name
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "RN$dn\r";
- expect -timeout 1 "ERR"; # BB150
- wait_for_prompt;
-}
-
-proc get_deployment_name {} { # get deployment name
- global stn_format master_deployment_name_fmt;
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "RN?\r"; sleep 1;
- expect {
- timeout {error "Can't get deployment name";}
- -timeout 1 "ERR" { # BB150
- if {![file isfile .last_stn]} {
- error "Can't find .last_stn";
- }
- set stn [exec cat .last_stn];
- set dn [format $master_deployment_name_fmt $stn];
- wait_for_prompt;
- return $dn;
- }
- -timeout 5 -re {Current deployment name = ([^\r]*)}
- }
- set dn $expect_out(1,string);
- wait_for_prompt;
- return $dn;
-}
-
-proc get_serial_number {} { # get serial number
- gobble_prompts;
- send "\r"; wait_for_prompt;
- send "PS0\r";
- expect {
- timeout {error "Can't get serial number";}
- -timeout 5 -re {Instrument S/N: *([0-9]*)}
- }
- set sn $expect_out(1,string);
- wait_for_prompt;
- return $sn;
-}
-
-#======================================================================
-# User-Interation Routines
-#======================================================================
-
-proc affirm {prompt {to -1} {timeout_return 0}} { # yes/no question with timeout
- send_user $prompt; # and default answer
- while {1} {
- expect_user {
- timeout {
- if {$timeout_return == 0} {
- send_user "N\n";
- } else {
- send_user "Y\n";
- }
- return $timeout_return;
- }
- -timeout $to -re "^y.*|^Y.*" {return 1;}
- -timeout $to -re "^n.*|^N.*" {return 0;}
- -re {..*} {send_user "Please answer Y or N..."}
- }
- }
-}
-
-proc input_int {prompt} { # input an integer
- while {1} {
- send_user $prompt;
- expect_user {
- -timeout -1 -re {^[0-9]+\n} {
- regsub {^0*} $expect_out(0,string) {} decimal_val;
- return $decimal_val;
- }
- -timeout -1 -re {.+} {send_user "only integers, please!\n"}
- }
- }
-}