With pause() and resume()

The script below uses the state from an input register to sense whether the MoveLoop() should be paused() or resumed().

#!/usr/bin/env python

import time, sys
import HasyUtils, Spectra
import PyTango

def main():
    #
    # x - the sweep motor
    #
    (nameX, startX, stopX, sweepTime)  = ("d1_mot66", 0., 0.2, 2.)
    (nameY, startY, stopY, deltaY)  = ("d1_mot67", 0.1, 0.21, 0.01)

    #
    # use sleepTime and sweepTime to estimate the no. of points in x
    #
    sleepTime = 0.1
    overHead = 0.1
    npX = 2.*sweepTime/(sleepTime + overHead)

    npY = abs(int((stopY - startY)/deltaY + 1)) + 10

    iregProxy = PyTango.DeviceProxy( "p09/register/d1.in01")

    try:
        o = HasyUtils.moveLoop( nameX, startX, stopX, sweepTime, 
                      nameY, startY, stopY, deltaY)
    except Exception, e:
        print "Exception from moveLoop() constructor"
        print repr( e)
        sys.exit( 255)

    try:
        o.toStart()
    except Exception, e:
        print "Exception from ToStart"
        print repr( e)
        sys.exit( 255)

    while o.state() == PyTango.DevState.MOVING:
        print "toStart: posX %g, posY %g" % ( o.proxyX.Position, o.proxyY.Position)
        time.sleep( 1.0)
    startTime = time.time()
    o.runNormal()
    print "runNormal takes %gs" % (time.time() - startTime)

    scanMesh = HasyUtils.scanMesh( nameX = nameX, nameY = nameY,
                                   comment = "%s: (%g, %g, %g), %s: (%g, %g, %g)" %\
                                   (nameX, startX, stopX, sweepTime, nameY, startY, stopY, deltaY), 
                                   startX = min( startX, stopX), stopX = max( startX, stopX), 
                                   npX = npX, 
                                   startY = min( startY, stopY) , stopY = max( startY, stopY), 
                                   npY = npY)

    try:
        o.toStart()
    except Exception, e:
        print "Exception from ToStart"
        print repr( e)
        sys.exit( 255)

    while o.state() == PyTango.DevState.MOVING:
        print "toStart: posX %g, posY %g" % ( o.proxyX.Position, o.proxyY.Position)
        time.sleep( 1.0)

    o.run()
    startTime = time.time()
    count = 0
    paused = False
    while paused or o.state() == PyTango.DevState.MOVING:
        if not paused:
            scanMesh.setX( count, o.proxyX.Position)
            scanMesh.setY( count, o.proxyY.Position)
            scanMesh.display()
            count += 1
            time.sleep( sleepTime)
        else:
            time.sleep( 1.0)
        if not paused and iregProxy.Value == 1:
            o.pause()
            paused = True
        elif paused and iregProxy.Value == 0:
            o.resume()
            paused = False

    print "run takes %gs" % (time.time() - startTime)

    (sts, result) = Spectra.gra_yesno( "Enter Spectra")
    if result == 1:
        Spectra.gra_input()

if __name__ == "__main__":
    main()