PE image series, incl. loop over SDD positions, P02

#!/bin/env perl
use strict; 
use Spectra; 

sub test_abort
{
    my $status = 0; 
    my $k = Spectra::key();
    if( $k == 32)
    {
        $status = 1;
        goto finish;
    }
    if( Spectra::flag( "perltk"))
    {
        #
        # ... we call the refresh routine to look whether
        # the user pressed the Stop button
        #
        Util::refresh();
        #
        # Util::refresh() take some time, if many motor positions are updated.
        # The following call is fast because it updates the Stop button
        # of the toplevel widget only. 
        #
        Util::update_toplevel_stop_button();
    }
    if( $Spectra::SYM{ flag_tki_stop})
    {              
        $status = 1;
        goto finish;
    }
    $Spectra::SYM{ flag_tki_stop} = 0; 
    return $status;
}

sub _mylog
{
    my ( $string) = @_; 
    Util::log( $string); 
    Spectra::log( $string); 
}
my $sample_time = 2; 

my @capillary_pos = ( 0.01, -0.13); 

my @sdd_positions_x = ( 270, 260, 250);
my @sdd_positions_z = ( 2600, 2500, 2400);
    
_mylog( ">>> p02_demo START"); 
                      
my $total = scalar( @sdd_positions_x); 
foreach my $i ( 0 .. ( $total - 1))
{
    my $sdd_pos_x = $sdd_positions_x[$i];
    my $sdd_pos_z = $sdd_positions_z[$i];
    my $j = $i + 1; 
    _mylog( "> sdd to x $sdd_pos_x, z $sdd_pos_z, $j/$total");   
    if( !Spectra::move( "eh1b_mot16" => $sdd_pos_x))
    {
        goto finish;
    }
    Spectra::gra_command( "sdd $sdd_pos_z");
    _mylog( "collect $sample_time (Dark)"); 
    Spectra::gra_command( "collect_pe $sample_time 1");
    if( !Spectra::wait( 1.)) 
    {
        _mylog( " script aborted"); 
        goto finish;
    }    
    foreach my $pos ( @capillary_pos)
    {
        _mylog( "moving eh1a_mot13 to $pos "); 
        if( !Spectra::move( "eh1a_mot13" => $pos))
        {
            goto finish;
        }
        if( !Spectra::wait( 1.)) 
        {
            _mylog( " script aborted"); 
            goto finish;
        }
        _mylog( "collect $sample_time"); 
        Spectra::gra_command( "collect_pe $sample_time");
        if( !Spectra::wait( 1.)) 
        {
            _mylog( " script aborted"); 
            goto finish;
        }
        if( test_abort())
        {
            _mylog( " script aborted"); 
            goto finish;
        }
    }
}
_mylog( "<<< p02_demo DONE"); 
finish:
    $Spectra::SYM{ flag_tki_stop} = 0; 
    1;