Every Keck instrument has a testAll shell script to quickly check instrument and server health. It is used by the day crew and SAs as a diagnostic and troubleshooting tool. The script reads telemetries and reports warnings and errors. We will use the HIRES testAll as an example to build the KPF testAll.
Please note that the HIRES testAll script was written in perl which is not standard procedure now. Modern implementations use python and we should do the same.
Download HIRES testAll and output files here. Scroll down to see the script and output texts.
testAll
#!/bin/perl -w #+ # testAll -- check functionality of all HIRES systems # # Purpose: # Test all of the HIRES systems to determine whether they are # working properly. The following checks are made: # - Check that motor and CCD crates are alive # - Check communication with Lantronix # - Check communication with Galil controllers # - Check that all daemons are running # - Check that all keyword libraries (CCD, motor, ACS, DCS) are readable # - Check that guider is powered on # - Check that CCD temp and setpoint are within limits # - Verify air pressure and relative humidity # - Check that cross dispserser brake is engaged (i.e. oscillating?) # - Check that ESTOP and SYSDIS settings are normal # - Check that HIRES is the currently-selected DCS instrument # - Check lights out, door closed # # Usage: # testAll [systems] # # Arguments: # systems = [computers daemons apps keywords stages] # Systems which should be tested. Defeault is all of them. # # Output: # Report written to stdout # # Exit values: # 0 = normal completion # <0 = warnings but no errors # >0 = error # # Example: # 1) To check instrument status: # testAll # # Checking HIRES computers: # Checking hccdvmep................OK (HIRES CCD crate) # Checking hmotcrate...............OK (HIRES motor crate) # Checking tserver1................OK (Lantronix) # Checking HIRES daemons: # Checking dispatcher.hinfo........OK # Checking dispatcher2.............OK # Checking infoman.................OK # Checking lickserv2...............OK # Checking traffic.................OK # Checking watch_ccd...............OK # Checking watch_expo..............WARNING! # Checking watch_hirot_monitor.....OK # Checking HIRES applications: # Checking xhires..................OK # Checking ds9.....................OK # Checking ds9relay................OK # Checking hires_dashboard.........OK # Checking hexpo_dashboard.........OK # Checking write_image.............OK # Checking HIRES keyword libraries: # Checking ACS.....................OK # Checking CCD+infopatcher.........OK # Checking DCS.....................OK # Checking dispatcher 2............OK # Checking HIRES settings: # Checking TV guider power.........WARNING! Current value 'off' should be 'on' # Checking CCD temp setpoint.......OK # Checking CCD temperature.........OK # Checking relative humidity.......OK # Checking Air pressure............OK # Checking current instrument......OK # Checking XD brake status.........OK # Checking ESTOP status............OK # Checking System disable status...OK # --------------------------------------------------------------- # 0 errors and 2 warnings were issued. # --------------------------------------------------------------- #- # Modification history: # 2005-Dec-18 GDW Original version; adapted from DEIMOS # 2005-Dec-21 GMH added XD brake check # 2005-Dec-26 GDW Added cryo lever check # 2005-Dec-27 GMH Added autofill software enable status # 2005-Dec-27 GMH Added lights and exp.meter tube power # 2006-Jan-21 GMH Added the inner door to settings # 2006-Jan-21 GMH Added new section for stage switches # 2006-Jul-12 GMH Changed door comment # 2013-Oct-20 GDW Removed ACS check (not working) #----------------------------------------------------------------------- use strict; # misc definitions... ($X::good, $X::warning, $X::error) = ("OK", "WARNING!", "ERROR!"); my( $n_errors) = 0; # number of errors my( $n_warnings) = 0; # number of errors my( $key, $value); my( $type, $pid); my( $daemon_name); my( $computer); my( @command); my( $system); my( $command); my( $state, $message); my( $show) = "/kroot/bin/show"; my( $status, @owners); # define all possible systems to test... my( @systems) = qw( computers daemons apps keywords power settings switches); # default state for each system is "off"... my( %check); foreach $system ( @systems ) { $check{$system} = 0 } # define usage... my( $cmd) = $0; if ( $cmd =~ m|/(.*)$| ) { $cmd = $1 }; my( $usage) = "Usage: $cmd [" . join( " ", @systems) . "]"; # default: if no args are specified, check all systems... if ( @ARGV < 1 ) { foreach $system ( @systems ) { $check{$system} = 1 } } # if args are specified, turn on certain systems... while ( $#ARGV >= 0 ) { $system = shift; if( defined( $check{$system})){ $check{$system} = 1 } else { die "$usage\n" } } # verify host... if( $ENV{'HOST'} !~ /^lehoula/ ){ die "this command must be run on lehoula\n" } #---------------------------------------- # Check computers #---------------------------------------- if ( $check{"computers"} ) { # see whether programs are running... printf "Checking HIRES computers:\n"; my( %computer_description); $computer_description{'tserver1'} = 'Lantronix'; $computer_description{'hccdvmep'} = 'HIRES CCD crate'; $computer_description{'hmotcrate'} = 'HIRES motor crate'; foreach $computer ( sort keys %computer_description){ print &labelize("Checking $computer"); if( system( "ping $computer 1 > /dev/null") == 0){ print "$X::good (" . $computer_description{$computer} . ")\n" } else { print "$X::error (" . $computer_description{$computer} . ")\n"; $n_errors++; } } } #---------------------------------------- # Check daemons #---------------------------------------- if ( $check{"daemons"} ) { # see whether programs are running... printf "Checking HIRES daemons:\n"; my( %daemons, %command2daemon); # define translation from daemon name to corresponding string in # "hires status daemons" output... $daemons{"traffic"} = { COMMAND=>"traffic", BADSTATUS=>$X::error}; $daemons{"dispatcher.hinfo"} = { COMMAND=>"dispatcher.tcl hires hinfo", BADSTATUS=>$X::error}; $daemons{"infoman"} = { COMMAND=>"infoman", BADSTATUS=>$X::error}; $daemons{"watch_ccd"} = { COMMAND=>"watch_ccd", BADSTATUS=>$X::error}; $daemons{"dispatcher2"} = { COMMAND=>"dispatcher2 -s expo -n 0", BADSTATUS=>$X::error}; $daemons{"watch_hirot_monitor"} = { COMMAND=>"watch_hirot_monitor", BADSTATUS=>$X::error}; $daemons{"lickserv2"} = { COMMAND=>"lickserv2", BADSTATUS=>$X::error}; $daemons{"watch_expo"} = { COMMAND=>"watch_expo", BADSTATUS=>$X::warning}; # create a hash to store the status of daemons, intialize to "bad"... my( %daemon_status); foreach $key ( keys %daemons) { $daemon_status{$key} = $daemons{$key}->{BADSTATUS} } # get info from lehoula... &get_daemon_status( "hires status daemons", \%daemon_status, \%daemons); # print daemon status... foreach $daemon_name ( sort keys %daemon_status){ print labelize( "Checking $daemon_name") . $daemon_status{$daemon_name} . "\n"; if( $daemon_status{$daemon_name} eq $X::warning){ $n_warnings++ } if( $daemon_status{$daemon_name} eq $X::error){ $n_errors++ } } } #---------------------------------------- # Check applications... #---------------------------------------- if ( $check{"apps"} ) { # see whether programs are running... printf "Checking HIRES applications:\n"; my( $item); foreach $item (qw(xhires ds9 ds9relay hires_dashboard hexpo_dashboard write_image)) { print &labelize("Checking $item"); $status = &get_hires_process_status( $item, \@owners); print "$status"; unless ( $status eq $X::good ){ print " got " .scalar(@owners) . " instances"; if ( $status eq $X::warning ) { $n_warnings++; } elsif ( $status eq $X::error ) { $n_errors++; } else { die "ERROR: illegal return value from get_hires_process_status ($status)" } } print "\n"; } } #---------------------------------------- # Check keywords #---------------------------------------- if ( $check{"keywords"} ) { # see whether programs are running... printf "Checking HIRES keyword libraries:\n"; # define things to check... my( %keywords); $keywords{ 'dispatcher 2' } = { LIBRARY => 'hires', KEYWORDS => 'hatclos'}; $keywords{ 'exposure meter' } = { LIBRARY => 'expo', KEYWORDS => 'pmt0mpow'}; $keywords{ 'CCD+infopatcher'}={ LIBRARY => 'hiccd', KEYWORDS => 'tempdet wcrate observer'}; # GDW 2013-Oct-20 Removed ACS check b/c kw lib not working on hiresserver # $keywords{ 'ACS'} = { LIBRARY => 'acs', KEYWORDS => 'mode'}; $keywords{ 'DCS'} = { LIBRARY => 'dcs', KEYWORDS => 'ra'}; # perform checks... foreach $system ( sort keys %keywords){ print &labelize("Checking $system"); $command = join( " ", ("$show -s", $keywords{$system}->{LIBRARY}, $keywords{$system}->{KEYWORDS}, "1>/dev/null", "2>&1") ); if( system($command) == 0){ print "$X::good\n" } else { print "$X::error\n"; $n_errors++; } } } #---------------------------------------- # Check settings... #---------------------------------------- if ( $check{"settings"} ) { # see whether programs are running... printf "Checking HIRES settings:\n"; # get the temperature setpoint... $command = "$show -s hiccd -terse tempset"; my($tempset) = `$command`; chomp( $tempset); # define keywords to test and the corresponding desired values (GOODVALUE)... my( %stage_keywords, $n); $n = 0; $stage_keywords{$n++} = { NAME=>'TV guider power', LIBRARY=>'hires', KEYWORD=>'tvon', GOODVALUE=>'on', BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'Exp.meter power', LIBRARY=>'expo', KEYWORD=>'pmt0mpow', GOODVALUE=>'on', BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'Enclosure lights', LIBRARY=>'hires', KEYWORD=>'lights', GOODVALUE=>'off', BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'All 3 Doors', LIBRARY=>'hires', KEYWORD=>'door', GOODVALUE=>'closed', BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'CCD temp setpoint', LIBRARY=>'hiccd', KEYWORD=>'tempset', MINVALUE=>-131, MAXVALUE=>-129, BADSTATUS=>$X::error}; $stage_keywords{$n++} = { NAME=>'CCD temperature', LIBRARY=>'hiccd', KEYWORD=>'tempdet', MINVALUE=>$tempset-1, MAXVALUE=>$tempset+1, BADSTATUS=>$X::error}; $stage_keywords{$n++} = { NAME=>'relative humidity', LIBRARY=>'hires', KEYWORD=>'relhum', MINVALUE=>0.00, MAXVALUE=>20.00, BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'air pressure', LIBRARY=>'hires', KEYWORD=>'airalarm', GOODVALUE=>'okay', BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'current instrument', LIBRARY=>'dcs', KEYWORD=>'currinst', GOODVALUE=>'HIRES', BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'XD brake status', LIBRARY=>'hires', KEYWORD=>'xdbrak', GOODVALUE=>'engaged', BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'ESTOP status', LIBRARY=>'hires', KEYWORD=>'estop', GOODVALUE=>'false', BADSTATUS=>$X::error}; $stage_keywords{$n++} = { NAME=>'system disable status', LIBRARY=>'hires', KEYWORD=>'sysdis', GOODVALUE=>'enabled', BADSTATUS=>$X::error}; $stage_keywords{$n++} = { NAME=>'cryo lever position', LIBRARY=>'hiccd', KEYWORD=>'dwrxfrsw', GOODVALUE=>'state_0', BADSTATUS=>$X::warning}; $stage_keywords{$n++} = { NAME=>'autofill enable', LIBRARY=>'hiccd', KEYWORD=>'autofill', GOODVALUE=>'1', BADSTATUS=>$X::warning}; # loop over keywords and perform test... foreach $n ( keys %stage_keywords ){ # extract system name from hash... $system = $stage_keywords{$n}->{NAME}; print &labelize("Checking $system"); # build and execute command to return keyword value... $command = "/local/kroot/bin/show -s " . $stage_keywords{$n}->{LIBRARY} . " -terse " . $stage_keywords{$n}->{KEYWORD}; $value = `$command`; chomp( $value); # test the value against the desired... $message = ''; if( defined($stage_keywords{$n}->{GOODVALUE})) { if( $value eq $stage_keywords{$n}->{GOODVALUE}){ $state = $X::good } else { $state = $stage_keywords{$n}->{BADSTATUS}; $message = sprintf( "Current value '%s' should be '%s'", $value, $stage_keywords{$n}->{GOODVALUE}); } } elsif( defined($stage_keywords{$n}->{MINVALUE}) and defined($stage_keywords{$n}->{MAXVALUE})) { if( $value >= $stage_keywords{$n}->{MINVALUE} and $value <= $stage_keywords{$n}->{MAXVALUE}){ $state = $X::good } else { $state = $stage_keywords{$n}->{BADSTATUS}; $message = sprintf( "Current value %s outside of good range %s - %s", $value, $stage_keywords{$n}->{MINVALUE}, $stage_keywords{$n}->{MAXVALUE}); } } else { $state = $X::warning; $message = "No valid comparison defined"; } if( $state eq $X::error) { $n_errors++; } elsif( $state eq $X::warning) { $n_warnings++; } elsif ($state ne $X::good) { die "illegal BADSTATUS value is neither ERROR nor WARNING" } printf "%s %s\n", $state, $message; } } #---------------------------------------- # Check switches... #---------------------------------------- if ( $check{"switches"} ) { # see whether programs are running... printf "Checking HIRES switches:\n"; # # get the temperature setpoint... # $command = "$show -s hiccd -terse tempset"; # my($tempset) = `$command`; # chomp( $tempset); # define keywords to test and the corresponding desired values (GOODVALUE)... my( %switch_keywords, $ns); $ns = 0; $switch_keywords{$ns++} = { NAME=>'camera focus cntrl', LIBRARY=>'hires', KEYWORD=>'cafcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'camera cover cntrl', LIBRARY=>'hires', KEYWORD=>'camcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'collimator focus cntrl', LIBRARY=>'hires', KEYWORD=>'cofcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'collimator cntrl', LIBRARY=>'hires', KEYWORD=>'collcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'decker cntrl', LIBRARY=>'hires', KEYWORD=>'deckcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'echelle cntrl', LIBRARY=>'hires', KEYWORD=>'echcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'filter 1 cntrl', LIBRARY=>'hires', KEYWORD=>'fil1con', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'filter 2 cntrl', LIBRARY=>'hires', KEYWORD=>'fil2con', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'hatch cntrl', LIBRARY=>'hires', KEYWORD=>'hatcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'iodine cell cntrl', LIBRARY=>'hires', KEYWORD=>'iodcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'rotator cntrl', LIBRARY=>'hires', KEYWORD=>'irotcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'lamp filter cntrl', LIBRARY=>'hires', KEYWORD=>'lfilcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'lamp select cntrl', LIBRARY=>'hires', KEYWORD=>'lselcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'slit cntrl', LIBRARY=>'hires', KEYWORD=>'slitcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'tv aperture cntrl', LIBRARY=>'hires', KEYWORD=>'tvacon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'tv focus cntrl', LIBRARY=>'hires', KEYWORD=>'tvfcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'tv filt 1 cntrl', LIBRARY=>'hires', KEYWORD=>'tvf1con', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'tv filt 2 cntrl', LIBRARY=>'hires', KEYWORD=>'tvf2con', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; $switch_keywords{$ns++} = { NAME=>'x-disp cntrl', LIBRARY=>'hires', KEYWORD=>'xdcon', GOODVALUE=>'auto', BADSTATUS=>$X::warning}; # loop over keywords and perform test... foreach $ns ( keys %switch_keywords ){ # extract system name from hash... $system = $switch_keywords{$ns}->{NAME}; print &labelize("Checking $system"); # build and execute command to return keyword value... $command = "/local/kroot/bin/show -s " . $switch_keywords{$ns}->{LIBRARY} . " -terse " . $switch_keywords{$ns}->{KEYWORD}; $value = `$command`; chomp( $value); # test the value against the desired... $message = ''; if( defined($switch_keywords{$ns}->{GOODVALUE})) { if( $value eq $switch_keywords{$ns}->{GOODVALUE}){ $state = $X::good } else { $state = $switch_keywords{$ns}->{BADSTATUS}; $message = sprintf( "Current value '%s' should be '%s'", $value, $switch_keywords{$ns}->{GOODVALUE}); } } elsif( defined($switch_keywords{$ns}->{MINVALUE}) and defined($switch_keywords{$ns}->{MAXVALUE})) { if( $value >= $switch_keywords{$ns}->{MINVALUE} and $value <= $switch_keywords{$ns}->{MAXVALUE}){ $state = $X::good } else { $state = $switch_keywords{$ns}->{BADSTATUS}; $message = sprintf( "Current value %s outside of good range %s - %s", $value, $switch_keywords{$ns}->{MINVALUE}, $switch_keywords{$ns}->{MAXVALUE}); } } else { $state = $X::warning; $message = "No valid comparison defined"; } if( $state eq $X::error) { $n_errors++; } elsif( $state eq $X::warning) { $n_warnings++; } elsif ($state ne $X::good) { die "illegal BADSTATUS value is neither ERROR nor WARNING" } printf "%s %s\n", $state, $message; } } #---------------------------------------- # print final status... #---------------------------------------- printf "---------------------------------------------------------------\n"; if ( $n_errors == 0 and $n_warnings == 0) { printf "\tAll tested HIRES systems tested appear functional.\n" } else { printf "\t%d errors and $n_warnings warnings were issued.\n", $n_errors } printf "---------------------------------------------------------------\n"; if ( $n_errors > 0 ) { exit $n_errors } elsif ( $n_warnings > 0 ) { exit -$n_warnings } #----------------------------------------------------------------------- sub labelize { #----------------------------------------------------------------------- my( $string) = @_; my( $size) = 35; my( $label); $label = " $string"; while( length($label) < $size ){ $label .= "." } return $label } #----------------------------------------------------------------------- sub get_daemon_status { #----------------------------------------------------------------------- my( $status_command, $daemon_status, $daemons) = @_; my( $command, $pid, $daemon_name); my( $found); # get info from host... open STATUS, "$status_command |"; while ( <STATUS> ) { if (m/^(.*) is running .* pid = (\d+)$/) { # extract command and PID from matching string... $command = $1; $pid = $2; # convert command into daemon name... $found = 0; foreach $key ( keys %$daemons) { if ( $command eq $$daemons{$key}->{COMMAND} ){ $$daemon_status{$key} = $X::good; $found++ } } # check for undefined command... unless( $found == 1 ) { warn "unknown daemon command $command"; next; } } } close STATUS; } #----------------------------------------------------------------------- sub get_hires_process_status { #----------------------------------------------------------------------- my( $process, $owners) = @_; my( $status_command) = '/usr/ucb/ps'; my( $n) = 0; my( $debug) = 0; # clear thr owners list... @$owners = (); # define the expected number of processes... my( %stats); $stats{ 'xhires' } = { MIN=>1, MAX=>0, BADSTATUS=>$X::error}; $stats{ 'ds9' } = { MIN=>1, MAX=>0, BADSTATUS=>$X::error}; $stats{ 'ds9relay' } = { MIN=>1, MAX=>0, BADSTATUS=>$X::error}; $stats{ 'hires_dashboard' } = { FLAGS=>'auxww', MIN=>1, MAX=>0, PATTERN=>'wishx.*hires.dbc.*', BADSTATUS=>$X::error}; $stats{ 'hexpo_dashboard' } = { FLAGS=>'auxww', MIN=>1, MAX=>0, PATTERN=>'wishx.*hexpo.dbc.*', BADSTATUS=>$X::warning}; $stats{ 'write_image' } = { MIN=>1, MAX=>1, BADSTATUS=>$X::error}; # check that we know something about this process type... unless (defined( $stats{$process}->{MIN})) { warn "WARNING: unrecognized process type: $process"; return 1 } # define search pattern... my( $pattern) = $stats{$process}->{PATTERN} || $process; $pattern = '^(\S+)\s.*' . $pattern . '$'; my( $flags) = $stats{$process}->{FLAGS} || 'auxc'; my( $min) = $stats{$process}->{MIN}; my( $max) = $stats{$process}->{MAX}; # get info from host... $status_command .= " -$flags"; print "status_command=$status_command\n" if $debug; print "pattern=$pattern\n" if $debug; open STATUS, "$status_command |"; while ( <STATUS> ) { print if $debug; if (m/$pattern/) { $$owners[$n++] = $1; # extract owner from matching string... } } close STATUS; if ( $min > 0 and $n < $min ) { $status = $stats{$process}->{BADSTATUS} } elsif ( $max > 0 and $n > $min ) { $status = $stats{$process}->{BADSTATUS} } else { $status = $X::good; } return $status }
testAll output
Checking HIRES computers:
Checking hccdvmep................OK (HIRES CCD crate)
Checking hmotcrate...............OK (HIRES motor crate)
Checking tserver1................OK (Lantronix)
Checking HIRES daemons:
Checking dispatcher.hinfo........OK
Checking dispatcher2.............OK
Checking infoman.................OK
Checking lickserv2...............OK
Checking traffic.................OK
Checking watch_ccd...............OK
Checking watch_expo..............OK
Checking watch_hirot_monitor.....OK
Checking HIRES applications:
Checking xhires..................ERROR! got 0 instances
Checking ds9.....................ERROR! got 0 instances
Checking ds9relay................ERROR! got 0 instances
Checking hires_dashboard.........ERROR! got 0 instances
Checking hexpo_dashboard.........WARNING! got 0 instances
Checking write_image.............ERROR! got 0 instances
Checking HIRES keyword libraries:
Checking CCD+infopatcher.........OK
Checking DCS.....................OK
Checking dispatcher 2............OK
Checking exposure meter..........OK
Checking HIRES settings:
Checking TV guider power.........WARNING! Current value 'off' should be 'on'
Checking Exp.meter power.........WARNING! Current value 'off' should be 'on'
Checking Enclosure lights........OK
Checking All 3 Doors.............OK
Checking ESTOP status............OK
Checking CCD temp setpoint.......OK
Checking system disable status...OK
Checking CCD temperature.........OK
Checking cryo lever position.....OK
Checking relative humidity.......OK
Checking autofill enable.........OK
Checking air pressure............OK
Checking current instrument......WARNING! Current value 'LRISADC' should be 'HIRES'
Checking XD brake status.........OK
Checking HIRES switches:
Checking camera focus cntrl......OK
Checking camera cover cntrl......OK
Checking collimator focus cntrl..OK
Checking collimator cntrl........OK
Checking decker cntrl............OK
Checking rotator cntrl...........OK
Checking echelle cntrl...........OK
Checking lamp filter cntrl.......OK
Checking filter 1 cntrl..........OK
Checking lamp select cntrl.......OK
Checking filter 2 cntrl..........OK
Checking slit cntrl..............OK
Checking hatch cntrl.............OK
Checking tv aperture cntrl.......OK
Checking iodine cell cntrl.......OK
Checking tv focus cntrl..........OK
Checking tv filt 1 cntrl.........OK
Checking tv filt 2 cntrl.........OK
Checking x-disp cntrl............OK
---------------------------------------------------------------
5 errors and 4 warnings were issued.
---------------------------------------------------------------
Add Comment