#!/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;