interface motask
parameter filter
type '_integer'
range 1,100
endparameter
parameter focus
type '_integer'
range 1,100
endparameter
action filter_wheel
obey
needs filter
endobey
cancel
endcancel
endaction
action focus_wheel
obey
needs focus
endobey
cancel
endcancel
endaction
endinterface
SUBROUTINE MOTASK( STATUS )
* Task to drive 2 dummy motors. One called FILTER_WHEEL
* and the other FOCUS. Each invocation requires 1 parameter
* relating to requested position but will be used in the call to the
* delay routine for a delay of n seconds
IMPLICIT NONE ! No implicit typing
INCLUDE 'SAE_PAR'
INCLUDE 'ACT_ERR'
INCLUDE 'ADAMDEFNS'
INTEGER STATUS
INTEGER CONTEXT
INTEGER SEQ
INTEGER FILTER
INTEGER FOCUS
INTEGER PERIOD
CHARACTER*(PAR__SZNAM) NAME
SAVE FILTER
SAVE FOCUS
IF ( STATUS .NE. SAI__OK ) RETURN
CALL TASK_GET_NAME ( NAME, STATUS )
IF ( NAME .EQ. 'FILTER_WHEEL' ) THEN
CALL TASK_GET_CONTEXT ( CONTEXT, STATUS )
IF ( CONTEXT .EQ. OBEY ) THEN
CALL TASK_GET_SEQ ( SEQ, STATUS )
IF ( SEQ .EQ. 0 ) THEN
CALL PAR_GET0I ( 'FILTER', FILTER, STATUS )
PERIOD = FILTER * 1000
CALL MSG_SETI ( 'FILTER', FILTER )
CALL MSG_OUT ( ' ', 'moving to filter ^FILTER...',
: STATUS )
CALL TASK_PUT_DELAY ( PERIOD, STATUS )
CALL PAR_CANCL ( 'FILTER', STATUS )
CALL TASK_PUT_REQUEST ( ACT__WAIT, STATUS )
ELSE
CALL MSG_SETI ( 'FILTER', FILTER )
CALL MSG_OUT( ' ', 'filter position ^FILTER reached',
: STATUS )
END IF
ELSE IF ( CONTEXT .EQ. CANCEL ) THEN
CALL TASK_PUT_REQUEST ( ACT__CANCEL, STATUS )
END IF
ELSE IF ( NAME .EQ. 'FOCUS_WHEEL' ) THEN
CALL TASK_GET_CONTEXT ( CONTEXT, STATUS )
IF ( CONTEXT .EQ. OBEY ) THEN
CALL TASK_GET_SEQ ( SEQ, STATUS )
IF ( SEQ .EQ. 0 ) THEN
CALL PAR_GET0I ( 'FOCUS', FOCUS, STATUS )
PERIOD = FOCUS * 1000
CALL MSG_SETI ( 'FOCUS', FOCUS )
CALL MSG_OUT ( ' ', 'moving to focus ^FOCUS...', STATUS )
CALL TASK_PUT_DELAY ( PERIOD, STATUS )
CALL PAR_CANCL ( 'FOCUS', STATUS )
CALL TASK_PUT_REQUEST ( ACT__WAIT, STATUS )
ELSE
CALL MSG_SETI ( 'FOCUS', FOCUS )
CALL MSG_OUT ( ' ', 'focus position ^FOCUS reached',
: STATUS)
END IF
ELSE IF ( CONTEXT .EQ. CANCEL ) THEN
CALL TASK_PUT_REQUEST ( ACT__CANCEL, STATUS )
END IF
END IF
END
ADAM Guide to Writing Instrumentation Tasks