10 ! ----- SEND_OPER_MSG.FUN ----- ! ! ----- Function to Send a Message to the Central Operator ----- ! ! ----- If a REPLY is wanted, an AST will be created which will ----- ! ----- trigger when the mailbox has been written to, although ----- ! ----- the reply message will be ignored. ----- ! ! ---------- PASSED: ---------- ! ! ----- OPER_MSG (STRING) Message (0-255 chars) to be Sent ----- ! ----- to Operator ----- ! ! ----- REPLY_WANTED (WORD) 0 = Send message as a REQUEST ----- ! ----- 1 = Send message as a REQUEST/REPLY ----- ! ----- (even though we don't care ----- ! ----- about the reply) ----- ! ! ---------- RETURNED: ---------- ! ! ----- SEND_OPER_MSG (LONG) VMS SYSTEM STATUS VALUE ----- ! ----- (SS$_NORMAL IF SUCCESSFUL) ----- ! ! ----- Last Change 05/01/89 by Brian Lomasky ----- ! ! ----- Teradyne, Inc., 179 Lincoln Street, Boston, MA 02111 ----- ! ----- (617) 482-2706, x3259 ----- ! ! ----- Neither Brian Lomasky nor Teradyne, Inc. implicitly or ----- ! ----- explicitly implies this program is usable in any way. ----- ! ----- This program is released to the public domain in an ----- ! ----- "AS-IS" condition. ----- ! ! ----- Restrictions: ----- ! ----- 1) Requires VAX BASIC V2.4 or later. ----- ! ----- 2) Must be linked with OPCDEF and WRITE_ATTN_AST ----- ! ----- 3) If a REPLY is wanted, the calling program must first ----- ! ----- have created a mailbox, storing its channel in the ----- ! ----- mapped variable: MAILBOX_CHNL (located in the ----- ! ----- MBXCHAN Map). An example of this follows: ----- ! EXTERNAL LONG CONSTANT SS$_NORMAL ! DECLARE LONG ISTAT ! MAP (MBXCHAN) WORD MAILBOX_CHNL ! EXTERNAL LONG FUNCTION SYS$CREMBX ! ISTAT = SYS$CREMBX(, MAILBOX_CHNL BY REF,,,,, "MY_MBOX") ! CALL LIB$STOP(ISTAT BY VALUE) IF ISTAT <> SS$_NORMAL ! FUNCTION LONG SEND_OPER_MSG(STRING OPER_MSG, WORD REPLY_WANTED) OPTION TYPE = EXPLICIT EXTERNAL LONG CONSTANT IO$_SETMODE ! QIO SETMODE FUNCTION CODE EXTERNAL LONG CONSTANT IO$M_WRTATTN ! QIO WRITE-ATTN AST CODE EXTERNAL LONG CONSTANT OPC$M_NM_CENTRL ! SEND TO CENTRAL OPER EXTERNAL LONG CONSTANT OPC$_RQ_RQST ! SEND A USER REQUEST RECORD OPCBUF ! $SNDOPR RECORD VARIANT CASE STRING WHOLE_MSG = 263% ! WHOLE MESSAGE TO BE SENT CASE BYTE REQUEST_TYPE ! TYPE OF REQUEST BYTE RECIPIENTS(2%) ! 3-BYTE MESSAGE RECIPIENT LONG USER_REQUEST_ID ! USER-SUPPLIED MESSAGE CODE STRING MSG_TO_SEND = 255% ! ACTUAL MESSAGE THAT IS SENT END VARIANT END RECORD OPCBUF ! ----- VARIABLE DECLARATIONS ----- DECLARE LONG FUNC ! QIOW FUNCTION CODE DIM WORD IOSB(3%) ! QIOW I/O STATUS BLOCK DECLARE LONG SYS_STATUS ! SYSTEM SERVICE EXIT STATUS ! ----- MAPPED VARIABLE FOR PASSING MAILBOX I/O CHANNEL ----- MAP (MBXCHAN) WORD MAILBOX_CHNL ! I/O CHANNEL FOR MAILBOX QIO MAP (SOPRMSG) OPCBUF OPC_MSG ! EQUATE $SNDOPR RECORD EXTERNAL LONG FUNCTION SYS$QIOW ! QUEUE I/O REQUEST AND WAIT EXTERNAL LONG FUNCTION SYS$SNDOPR ! SEND MESSAGE TO OPERATOR EXTERNAL LONG WRITE_ATTN_AST ! WRITE-ATTENTION AST ROUTINE ! ----- SEND A USER REQUEST TO OPER ----- OPC_MSG::REQUEST_TYPE = OPC$_RQ_RQST ! ----- SEND TO CENTRAL OPERATOR ----- OPC_MSG::RECIPIENTS(0%) = 0% OPC_MSG::RECIPIENTS(1%) = 0% OPC_MSG::RECIPIENTS(2%) = OPC$M_NM_CENTRL ! ----- NO MESSAGE CODE ----- OPC_MSG::USER_REQUEST_ID = 0% ! ----- STORE ACTUAL MESSAGE TO BE SENT ----- OPC_MSG::MSG_TO_SEND = OPER_MSG ! ----- SEND THE MESSAGE ----- IF REPLY_WANTED = 0% THEN SEND_OPER_MSG = SYS$SNDOPR(OPC_MSG::WHOLE_MSG, ) ELSE ! ----- PLACE WRITE-ATTENTION AST ON THE MAILBOX ----- FUNC = IO$_SETMODE OR IO$M_WRTATTN SYS_STATUS = SYS$QIOW( ,! EVENT FLAG & MAILBOX_CHNL BY & VALUE, ! DEVICE I/O CHANNEL & FUNC BY VALUE, ! DEVICE FUNCTION CODE & IOSB() BY REF, ! I/O STATUS BLOCK & , ! AST ADDRESS & , ! AST PARAMETER & WRITE_ATTN_AST & BY REF, ! WRITE-ATTN AST ADDRESS& , ! WRITE-ATTN AST PARAM & , ! AST ACCESS MODE & , ! & , ! & ) ! IF (SYS_STATUS AND 1%) = 0% THEN SEND_OPER_MSG = SYS_STATUS EXIT FUNCTION END IF IF (IOSB(0%) AND 1%) = 0% THEN ! ----- RETURN VMS ERROR STATUS ----- SEND_OPER_MSG = IOSB(0%) EXIT FUNCTION END IF SEND_OPER_MSG = SYS$SNDOPR(OPC_MSG::WHOLE_MSG, & MAILBOX_CHNL BY VALUE) END IF END FUNCTION