Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: ABSPOSAW

ABSPOSAW.m

Go to the documentation of this file.
  1. ABSPOSAW ; IHS/FCS/DRS - Modem - wait for char,str ; [ 09/12/2002 10:06 AM ]
  1. ;;1.0;PHARMACY POINT OF SALE;**3**;JUN 21, 2001;Build 38
  1. Q
  1. ;
  1. ; Utilities for waiting for certain characters or strings
  1. ; Beware, WAITOK, WAITSTR have different return values!
  1. ; WAITOK(DIALOUT,TIMEOUT)
  1. ; WAITSTR(DIALOUT,STRING,TIMEOUT)
  1. ; WAITCHAR(DIALOUT,CHAR,TIMEOUT)
  1. ; WAIT1(STRING,TIMEOUT) ; on current device
  1. ; WAIT2(CHARSTRING,TIMEOUT) ; on current device
  1. ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1. ;
  1. ;
  1. ; WAITOK(DIALOUT,TIMEOUT)
  1. ; Wait for the "OK" response to a modem command
  1. ; Returns true if received, false if timed out.
  1. ;
  1. WAITOK(DIALOUT,TIMEOUT) ; returns 1 if you got "OK", 0 if you didn't,
  1. N IO S IO=$$IO^ABSPOSA(DIALOUT)
  1. N RETVAL
  1. I $$WAITSTR(DIALOUT,"OK",$S($G(TIMEOUT):TIMEOUT,1:20)) D S RETVAL=1
  1. .D LOG^ABSPOSL($T(+0)_" - MODEM - WAITOK - Success",$G(ECHO))
  1. E D S RETVAL=0
  1. .D LOG^ABSPOSL($T(+0)_" - MODEM - WAITOK - Failure",$G(ECHO))
  1. Q:$Q RETVAL Q
  1. ;
  1. ;
  1. ; WAITSTR(DIALOUT,STRING,TIMEOUT)
  1. ; Wait for some expected string.
  1. ; TIMEOUT defaults to 60 seconds.
  1. ; Returns 0 if string was received, success
  1. ; Returns -1 if NOT received, failure.
  1. ;
  1. WAITSTR(DIALOUT,STR,TIMEOUT) ;EP - wait for a given string
  1. ; returns 0 if okay, nonzero if not received
  1. N IO,RETVAL S IO=$$IO^ABSPOSA(DIALOUT) U IO
  1. D LOG^ABSPOSL($T(+0)_" - MODEM - Waiting for string "_STR,$G(ECHO))
  1. N RET S RET=$$WAIT1(STR,$S($G(TIMEOUT):TIMEOUT,1:60))
  1. N X S X=$T(+0)_" - MODEM - WAITSTR - "
  1. I RET D S RETVAL=0
  1. . S X=X_"Received expected "_STR
  1. . D LOG^ABSPOSL(X,$G(ECHO))
  1. E D S RETVAL=-1
  1. . S X=X_"Did NOT receive expected "_STR
  1. . N RECD S RECD=$P(RET,U,2,$L(RET,U))
  1. . I RECD="" S X=X_" - Received nothing"
  1. . D LOG^ABSPOSL(X,$G(ECHO))
  1. . I RECD]"" D
  1. . . N I F I=$L(RECD):-1:1 Q:$L(RECD)>250 D
  1. . . . I $E(RECD,I)?1C D
  1. . . . . S RECD=$E(RECD,1,I-1)_"\"_$A(RECD,I)_"\"_$E(RECD,I+1,$L(RECD))
  1. . . S X=$T(+0)_" - MODEM - WAITSTR - Received instead: "_RECD
  1. . . D LOG^ABSPOSL(X,$G(ECHO))
  1. Q:$Q RETVAL Q
  1. ;
  1. ; WAIT1(STRING,TIMEOUT,MAXCHAR)
  1. ; Wait for the given string.
  1. ; Returns true for success, false for failure.
  1. ; Returns 0^$ZE if error happened (most likely disconnect).
  1. ; (Note! Different return value types than WAITSTR has!)
  1. ;
  1. ; To protect against terminal server overflowing with $C(0),
  1. ; we impose MAXCHAR, default 3000 characters
  1. ;
  1. WAIT1(WAITTXT,TIMEOUT,MAXCHAR) ;
  1. ;returns 1 for success 0 for failure (diff. from WAITSTR)
  1. ; Appended to the return value: "^" and the message it received
  1. N START,END,FLAG,CHAR,MSG,TIMEOUTA,X,NCHAR
  1. I '$D(MAXCHAR) S MAXCHAR=3000
  1. S TIMEOUTA=0 ; counts up to TIMEOUT and then you've got a real timeout
  1. ;Read input buffer until WAITTXT has been received or timeout
  1. S (FLAG,MSG)=""
  1. S X="W1ZE^"_$T(+0),@^%ZOSF("TRAP")
  1. F NCHAR=1:1:MAXCHAR D Q:TIMEOUTA'<TIMEOUT!(FLAG'="")
  1. .S CHAR=""
  1. .R *CHAR:1 S TIMEOUTA=$S($T:0,1:TIMEOUTA+1) Q:TIMEOUTA
  1. .S:CHAR>127 CHAR=CHAR-128 ; 7-Bit communications
  1. .S:$L(MSG)=255 MSG=$E(MSG,1,254)
  1. .S MSG=MSG_$C(CHAR)
  1. .S FLAG=$S(MSG[WAITTXT:1,1:"")
  1. Q $S(MSG[WAITTXT:1,1:0)_U_MSG
  1. W1ZE D LOGZE("WAIT1") Q 0_U_$$ZE^ABSPOS
  1. ;
  1. ; Waiting for a particular control charcter
  1. WAITCHAR(DIALOUT,CHARS,TIMEOUT) ;EP -
  1. ; returns 0 if okay, nonzero if not received
  1. I '$G(TIMEOUT) S TIMEOUT=60
  1. N IO,RETVAL S IO=$$IO^ABSPOSA(DIALOUT) U IO
  1. N X S X=$T(+0)_" - MODEM - Waiting for"
  1. I $L(CHARS)>1 S X=X_" any of"
  1. S X=X_":"
  1. N I F I=1:1:$L(CHARS) S X=X_" $C("_$A(CHARS,I)_")"
  1. S X=X_" timeout "_$G(TIMEOUT)
  1. D LOG^ABSPOSL(X,$G(ECHO))
  1. S RETVAL=$$WAIT2(CHARS,TIMEOUT)
  1. N X S X=$T(+0)_" - MODEM - WAITCHAR - "
  1. I RETVAL]"" D
  1. . S X=X_"Received "_RETVAL
  1. . D LOG^ABSPOSL(X,$G(ECHO))
  1. . I RETVAL="EOT" D D HANGUP^ABSPOSAB(DIALOUT) S RETVAL="+++"
  1. . . D LOG^ABSPOSL($T(+0)_" - MODEM - Received EOT from host")
  1. E D
  1. . S X=X_"Did NOT receive what was expected."
  1. . D LOG^ABSPOSL(X,$G(ECHO))
  1. Q:$Q RETVAL Q
  1. ;---------------------------------------------------------------------
  1. ;Monitors a port and waits for particular control characters within a
  1. ;specified time frame
  1. ; WCHARS - String of control characters
  1. ; TIMEOUT - Time frame (in seconds) - at least 1
  1. ; Returns "STX" or "ETX" or "EOT" or "ENQ" or "ACK" or "NAK" or ""
  1. ; or it may return "RUNAWAY"
  1. ;--------------------------------------------------------------------
  1. WAIT2(WCHARS,TIMEOUT) ;
  1. N I,MAXI,START,END,FLAG,ACH,CCH,EOT,TIMEOUTA,X
  1. S EOT=$C(4),TIMEOUTA=0
  1. I WCHARS'[EOT S WCHARS=WCHARS_EOT ; always be on the lookout for EOT
  1. S FLAG="",MAXI=3000
  1. S X="W2ZE^"_$T(+0),@^%ZOSF("TRAP")
  1. F I=1:1:MAXI D Q:TIMEOUTA'<TIMEOUT!(FLAG'="")
  1. . S (ACH,CCH)=""
  1. . R *ACH:1 S TIMEOUTA=$S($T:0,1:TIMEOUTA+1) Q:TIMEOUTA
  1. . S:ACH>127 ACH=ACH-128 Q:'ACH
  1. . S CCH=$C(ACH)
  1. . S:WCHARS[CCH FLAG=ACH
  1. I I=MAXI Q "RUNAWAY" ; runaway byte stream?!
  1. ;D LOG^ABSPOSL("TEMPORARY: Stopped with END="_END_",$H="_$H_",FLAG="_FLAG)
  1. Q $P(",STX,ETX,EOT,ENQ,ACK,,,,,,,,,,,,,,,NAK",",",FLAG)
  1. W2ZE D LOGZE("WAIT2") Q ""
  1. LOGZE(WHERE) D LOG^ABSPOSL($T(+0)_" - MODEM - "_WHERE_" - $ZE="_$$ZE^ABSPOS) Q