Sweep with outer loop motor, P10

#!/bin/env perl
#
# this script executes sweeps at different positions
# of an outer loop motor. It switches an output 
# register when the sweep motor passes the start point
# 
use Spectra;
use strict;
my $status = 1;

my ($sweepTime) = @ARGV; 

if( !defined( $sweepTime))
{
    print "Usage: contScan.pl <sweepTime> \n";
    $status = 0;
    goto finish;
}

my $sweepStart = 0; 
my $sweepDistance = 1.;
my $sweepMotor = "exp_mot65"; 

my $outerStart = 0; 
my $outerStop = 1; 
my $outerDelta = 0.5; 
my $outerMotor = "exp_mot66"; 

my $oldSlew = Spectra::gms( $sweepMotor); 
my $moveTime = Spectra::get_move_time( $sweepMotor, $sweepDistance); 
# ramp units for default slew rate
my $rampUnits = Spectra::get_motor_ramp_units( $sweepMotor); 
my $sweepSlew = $oldSlew*$moveTime/$sweepTime; 
# ramp units for sweep slew rate
my $rampSweepUnits = $rampUnits*$sweepSlew/$oldSlew; 

if( $sweepSlew > $oldSlew ||
    $sweepSlew < Spectra::gmb( $sweepMotor))
{
    Util::log( sprintf( "contScan: slew rate out of range [%d, %d]", 
                        Spectra::gmb( $sweepMotor), Spectra::gms( $sweepMotor))); 
}
Util::log( "contScan: slew $oldSlew"); 
Util::log( "contScan: sweepSlew $sweepSlew"); 
Util::log( "contScan: rampUnits $rampUnits"); 
Util::log( "contScan: moveTime $moveTime"); 

$Spectra::SYM{ flag_tki_stop} = 0;

Spectra::move( $outerMotor => $outerStart); 
my $count = 0; 
#
# use 'sweep' as a prefix
#
my $logFileName = Spectra::create_scan_name( "sweep") . ".log";
if( !open( LOG, ">$logFileName"))
{
    Util::log( "contScan: failed to open $logFileName"); 
    goto finish;
}
Util::log( "contScan: opened $logFileName"); 
print LOG "sequence started at " . Spectra::date_and_time() . "\n"; 
print LOG "sweepMotor $sweepMotor, start $sweepStart, distance $sweepDistance, sweep time $sweepTime\n"; 
print LOG "outerMotor $outerMotor, start $outerStart, stop $outerStop, delta $outerDelta\n"; 
while(1)
{
    Spectra::set_motor_slew( $sweepMotor, $oldSlew); 
      if( !Spectra::move( $sweepMotor => ($sweepStart - $rampSweepUnits)))
      {
          goto finish;
      }
      
      Spectra::sms( $sweepMotor, $sweepSlew); 
      Util::log( sprintf( "contScan: starting sweep, $outerMotor at %g", Spectra::gmup( $outerMotor))); 
      Spectra::amove( $sweepMotor => ($sweepStart + $sweepDistance)); 
      my $startTime = Spectra::secnds(); 
      print LOG "sweep starts with $outerMotor at " . Spectra::gmup( $outerMotor) . "\n";
      my $flag = 0; 
      while( Spectra::check_move( $sweepMotor))
      {
          if( !$flag && (Spectra::gmup( $sweepMotor) > $sweepStart))
          {
              $flag = 1;
              print LOG "raise trigger at " . Spectra::date_and_time() .
                                  " $sweepMotor at " . Spectra::gmup( $sweepMotor) . "\n";
              Util::log( "switching OREG to ON "); 
              # Spectra::wor( $oreg, 1); 
          }
          
          Spectra::start_and_wait_for_timer( "exp_t01", 0.1); 
          #
          # space bar and STOP button terminate move
          #
          if( $Spectra::SYM{ flag_tki_stop} || 
              Spectra::key() == 32)
          {
              $Spectra::SYM{ flag_tki_stop} = 0;
              Util::log( "contScan.pl interrupted");
                Spectra::stop_move( $sweepMotor);
                while( Spectra::check_move( $sweepMotor))
                {
                    Spectra::wait( 0.1); 
                }
                goto finish;
            }
      }
      Util::log( "switching OREG to OFF"); 
      print LOG "disable trigger at " . Spectra::date_and_time() .
          " $sweepMotor at " . Spectra::gmup( $sweepMotor) . "\n";
      # Spectra::wor( $oreg, 0); 
      Util::log( sprintf( "%s at %g dT %g ", 
                          $sweepMotor,  Spectra::gmup( $sweepMotor), (Spectra::secnds() - $startTime))); 

      $count++;
      if( ($outerStart + $count*$outerDelta) > $outerStop)
      {
          last;
      }
      if( !Spectra::move( $outerMotor => ($outerStart + $count*$outerDelta)))
      {
          goto finish;
      }

}
finish:
close( LOG);
Spectra::set_motor_slew( $sweepMotor, $oldSlew); 
    $status;