next up previous 61
Next: Kicking one action from another
Up: ADAM Guide to Writing Instrumentation Tasks
Previous: Completion of a timed interval


Completion of data input

Suppose that your task has to input data from some hardware connected to an RS232 line. You can use the VAX/VMS SYS$QIO system service with your own AST handler to start the input operation, optionally call TASK_PUT_DELAY to set a timeout on the operation, and return to the task fixed-part after having put a request ACT__ASTINT.

When the input completes, VMS hands control to your AST handler which can carry out whatever actions are necessary and then use TASK_ASTMSG(NAME,LENGTH,VALUE,STATUS) to tell the fixed part to call the application again. In this call:

NAME
is the name of the relevant task action
VALUE
is a character string containing any information you want passed
LENGTH
is the number of significant bytes in VALUE

Provided NAME coincides with one of your actions which has requested to be called again, any associated timer is cancelled and your application is called.

TASK_GET_REASON(REASON,STATUS) returns, in REASON, value MESSYS__ASTINT if the message was received from the AST handler, or MESSYS__RESCHED if the timer completed. In the former case, you could use TASK_GET_VALUE(VALUE,STATUS) to get the information passed from the AST handler.

Let us consider an example task called DO_IO with an action called READ.

      SUBROUTINE DO_IO ( STATUS )
      IMPLICIT NONE
      INCLUDE 'SAE_PAR'
      INCLUDE 'ACT_ERR'
      INCLUDE 'MESSYS_ERR'
      INCLUDE 'DDMSG'
      INCLUDE '$IODEF'
      INTEGER ASTPARM
      CHARACTER*(MSG_VAL_LEN) VALUE
      INTEGER CHAN
      CHARACTER*80 INSTRING
      INTEGER REASON
      INTEGER STATUS
      INTEGER SEQ
      EXTERNAL READAST

      IF ( STATUS .NE. SAI__OK ) RETURN
      CALL TASK_GET_SEQ( SEQ, STATUS )
      IF ( SEQ .EQ. 0 ) THEN
         CALL SYS$ASSIGN ( 'TTA5:', CHAN, ,)
         CALL SYS$QIO ( , %VAL(CHAN), IO$_READ,, READAST, ASTPARM, 
     : %REF(INSTRING), %VAL(80),,,,)
         CALL TASK_PUT_DELAY ( 5000, STATUS )
         CALL TASK_PUT_REQUEST ( ACT__ASTINT, STATUS )
      ELSE
         CALL TASK_GET_REASON ( REASON, STATUS )
         IF ( REASON .EQ. MESSYS__ASTINT ) THEN
            CALL TASK_GET_VALUE ( VALUE, STATUS )
            CALL MSG_OUT ( ' ', VALUE, STATUS )
         ELSE IF ( REASON .EQ. MESSYS__RESCHED ) THEN
            CALL MSG_OUT ( ' ', 'timed-out', STATUS )
         ENDIF
         CALL SYS$DASSGN ( %VAL(CHAN) )
      ENDIF
      END

      SUBROUTINE READAST ( ASTPARM )
      IMPLICIT NONE
      INCLUDE 'SAE_PAR'
      INCLUDE 'DDMSG'
      INTEGER ASTPARM
      CHARACTER*(MSG_VAL_LEN) VALUE
      CHARACTER*(PAR__SZNAM) NAME
      INTEGER LENGTH
      INTEGER STATUS

      STATUS = SAI__OK
      NAME = 'READ'
      VALUE = 'input finished'
      LENGTH = 14
      CALL TASK_ASTMSG ( NAME, LENGTH, VALUE, STATUS )
      END



next up previous 61
Next: Kicking one action from another
Up: ADAM Guide to Writing Instrumentation Tasks
Previous: Completion of a timed interval

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