next up previous 61
Next: For ``old'' programmers
Up: Cancelling in multi-task subsystems
Previous: Controlling task

Controlled task

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



next up previous 61
Next: For ``old'' programmers
Up: Cancelling in multi-task subsystems
Previous: Controlling task

ADAM Guide to Writing Instrumentation Tasks
Starlink User Note 134
B D Kelly
A J Chipperfield

30 March 1992
E-mail:ussc@star.rl.ac.uk

Copyright © 2000 Council for the Central Laboratory of the Research Councils