7 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