- PSXACK ;BIR/BAB-Process MSA Segment after Msg Transmits ; [ 04/08/97 2:06 PM ]
- ;;2.0;CMOP;;11 Apr 97
- EN ;This routine processes an MSA segment and returns PSXPOP=1
- ;if there was a problem.
- ;Requires PSXQN = message entry number
- SLAVE ;wait to enter slave mode to receive ACK message
- R *X:PSXDLTD E D
- E D ACK1 G ERROR
- I X'=ENQ D ACK5 G ERROR
- R *X:PSXDLTA
- I ('$T)!(X'=TERM) D ACK4 G ERROR
- W *ACK,0,*TERM
- S BFLAG=0
- S BHST=0
- MSG R *X:PSXDLTD E D ACK1 G ERROR
- I X=STX G READ
- I X=EOT R *X:PSXDLTA I X=TERM G TST
- D ACK5 ;unexpected character received
- ERROR D FLUSH1^PSXUTL
- D LOG^PSXUTL
- S PSXPOP=1
- K PSXHEX,PSXACK,PSXREJ,LOG,PSXSUM
- QUIT
- READ S PSXACK=""
- S PSXTMD=$P($H,",",2)
- GETMSG S AA=0 F %=1:1 D Q:'%
- .R *X:PSXDLTA E D ACK6,LOG^PSXUTL S %=0,X="" Q
- .D CHKD^PSXUTL I PSXTMOUT D ACK6,LOG^PSXUTL S %=0,X="" Q
- .I %>240 D ACK7,LOG^PSXUTL S %=0,X="" Q
- .S PSXACK=PSXACK_$C(X)
- .I (X=ETX)!(X=ETB) S %=0
- I X=ETX S AA=1 G TEST
- I X=ETB S AA=2 G TEST
- I X=EOT R *X:PSXDLTA G:X=TERM TST
- I (X'=ETX)!(X'=ETB)!(X'=EOT) D ACK8 G ERROR
- I PSXACK="" D ACK9 G ERROR
- Q
- TEST R *X:PSXDLTA E D ACK10 G ERROR
- I "0123456789ABCDEF"'[$C(X) D ACK11 G ERROR
- S PSXSUM=$C(X)
- CHKSUM R *X:PSXDLTA E D ACK10 G ERROR
- I "0123456789ABCDEF"'[$C(X) D ACK11 G ERROR
- S PSXSUM=PSXSUM_$C(X)
- S X=PSXACK X ^%ZOSF("LPC") S PSXHEX=Y D HEX^PSXUTL
- R *X:1 I X'=TERM D ACK5
- I PSXHEX'=PSXSUM D ACK12 G ERROR
- I PSXHEX=PSXSUM D FLUSH1^PSXUTL
- ;S:$P(PSXACK,"|",1)["BHS" BHST=1,BFLAG=1,PSXBHS=1
- S:$P(PSXACK,"|",1)["BHS" BHST=1,BFLAG=1
- I (BFLAG=1)&($P(PSXACK,"|",1)["BHS") S PSXMSH=$G(PSXMSH)_"+"_$E(PSXACK,7,$L(PSXACK)-2)
- I (BFLAG=1)&($P(PSXACK,"|",1)["MSA") S PSXMSA=$G(PSXMSA)_"+"_$E(PSXACK,7,$L(PSXACK)-2),BFLAG=0,PSXBHS=1 S:$G(PSXMSA)["|AR|" PSXBHS=0 K:$G(PSXBHS)'>0 PSXMSH,PSXMSA
- I $E(PSXACK,7,10)["MSH|" S TACK=$E(PSXACK,7,$L(PSXACK)-2)
- W *ACK,$S(AA=1:2,AA=2:1,1:""),*TERM D:$P(PSXACK,"|",1)["MSA" FILE G MSG
- Q
- FILE Q:$G(BHST)=1
- I $P($P(PSXACK,"MSA",2),"|",3)'=PSXMSGID D ACK15 G ERROR
- S XXX=$P($P(PSXACK,"MSA",2),"|",3),REC=$O(^PSX(552.2,"B",XXX,""))
- S REC=$G(PSXQN)
- Q:$G(REC)=""
- S ^PSX(552.2,REC,"ACK")=TACK_$E(PSXACK,7,$L(PSXACK)-2)
- S (PSXPOP,PSXREJ)=0
- I (PSXACK["AR") S PSXREJ=1 D ACK13,LOG^PSXUTL
- L +^PSX(552.2,REC):DTIME I $T S DIE="^PSX(552.2,",DA=REC,DR="1///"_$S(PSXREJ:99,'PSXREJ:3,1:0)_";3///^S X=$H" D ^DIE K DIE,DA L -^PSX(552.2,REC)
- K XXX,REC,PSXREJ,PSXACK,TACK
- Q
- TST D FLUSH1^PSXUTL
- K PSXHEX,PSXACK,PSXREJ,LOG,PSXSUM
- Q
- ACK1 K LOG S LOG(1)="ACK1 ACK message never received for order #"_$P($G(^PSX(552.2,PSXQN,0)),"^",1) Q
- ACK2 K LOG S LOG(1)="ACK2 EOT received with no terminator while waiting for ACK message" Q
- ACK3 K LOG S LOG(1)="ACK3 EOT received while waiting for ACK message" Q
- ACK4 K LOG S LOG(1)="ACK4 ENQ received with no terminator while waiting for ACK message" Q
- ACK5 K LOG S LOG(1)="ACK5 Unexpected character received: "_$S(X>31:$C(X),1:"")_" ("_X_") while waiting for ACK message" Q
- ACK6 K LOG S LOG(1)="ACK6 Timeout Timer D reading ACK message" Q
- ACK7 K LOG S LOG(1)="ACK7 ACK message longer than 240 characters" Q
- ACK8 K LOG S LOG(1)="ACK8 ACK message did not end with ETX" Q
- ACK9 K LOG S LOG(1)="ACK9 ACK was null" Q
- ACK10 K LOG S LOG(1)="ACK10 Timeout reading ACK checksum" Q
- ACK11 K LOG S LOG(1)="ACK11 ACK checksum contained an invalid hex digit ("_X_")" Q
- ACK12 K LOG S LOG(1)="ACK12 ACK checksum does not match" Q
- ACK13 K LOG S LOG(1)="ACK13 Order #"_$P($G(^PSX(552.2,PSXQN,0)),"^",1)_" was rejected by CMOP" Q
- ACK14 K LOG S LOG(1)="ACK14 ENQ received with no terminator" Q
- ACK15 K LOG S LOG(1)="ACK15 MSA order # did not match "_$P($G(^PSX(552.2,PSXQN,0)),"^",1)_" # expected" Q
- PSXACK ;BIR/BAB-Process MSA Segment after Msg Transmits ; [ 04/08/97 2:06 PM ]
- +1 ;;2.0;CMOP;;11 Apr 97
- EN ;This routine processes an MSA segment and returns PSXPOP=1
- +1 ;if there was a problem.
- +2 ;Requires PSXQN = message entry number
- SLAVE ;wait to enter slave mode to receive ACK message
- +1 READ *X:PSXDLTD
- IF '$TEST
- Begin DoDot:1
- End DoDot:1
- +2 IF '$TEST
- DO ACK1
- GOTO ERROR
- +3 IF X'=ENQ
- DO ACK5
- GOTO ERROR
- +4 READ *X:PSXDLTA
- +5 IF ('$TEST)!(X'=TERM)
- DO ACK4
- GOTO ERROR
- +6 WRITE *ACK,0,*TERM
- +7 SET BFLAG=0
- +8 SET BHST=0
- MSG READ *X:PSXDLTD
- IF '$TEST
- DO ACK1
- GOTO ERROR
- +1 IF X=STX
- GOTO READ
- +2 IF X=EOT
- READ *X:PSXDLTA
- IF X=TERM
- GOTO TST
- +3 ;unexpected character received
- DO ACK5
- ERROR DO FLUSH1^PSXUTL
- +1 DO LOG^PSXUTL
- +2 SET PSXPOP=1
- +3 KILL PSXHEX,PSXACK,PSXREJ,LOG,PSXSUM
- +4 QUIT
- READ SET PSXACK=""
- +1 SET PSXTMD=$PIECE($HOROLOG,",",2)
- GETMSG SET AA=0
- FOR %=1:1
- Begin DoDot:1
- +1 READ *X:PSXDLTA
- IF '$TEST
- DO ACK6
- DO LOG^PSXUTL
- SET %=0
- SET X=""
- QUIT
- +2 DO CHKD^PSXUTL
- IF PSXTMOUT
- DO ACK6
- DO LOG^PSXUTL
- SET %=0
- SET X=""
- QUIT
- +3 IF %>240
- DO ACK7
- DO LOG^PSXUTL
- SET %=0
- SET X=""
- QUIT
- +4 SET PSXACK=PSXACK_$CHAR(X)
- +5 IF (X=ETX)!(X=ETB)
- SET %=0
- End DoDot:1
- IF '%
- QUIT
- +6 IF X=ETX
- SET AA=1
- GOTO TEST
- +7 IF X=ETB
- SET AA=2
- GOTO TEST
- +8 IF X=EOT
- READ *X:PSXDLTA
- IF X=TERM
- GOTO TST
- +9 IF (X'=ETX)!(X'=ETB)!(X'=EOT)
- DO ACK8
- GOTO ERROR
- +10 IF PSXACK=""
- DO ACK9
- GOTO ERROR
- +11 QUIT
- TEST READ *X:PSXDLTA
- IF '$TEST
- DO ACK10
- GOTO ERROR
- +1 IF "0123456789ABCDEF"'[$CHAR(X)
- DO ACK11
- GOTO ERROR
- +2 SET PSXSUM=$CHAR(X)
- CHKSUM READ *X:PSXDLTA
- IF '$TEST
- DO ACK10
- GOTO ERROR
- +1 IF "0123456789ABCDEF"'[$CHAR(X)
- DO ACK11
- GOTO ERROR
- +2 SET PSXSUM=PSXSUM_$CHAR(X)
- +3 SET X=PSXACK
- XECUTE ^%ZOSF("LPC")
- SET PSXHEX=Y
- DO HEX^PSXUTL
- +4 READ *X:1
- IF X'=TERM
- DO ACK5
- +5 IF PSXHEX'=PSXSUM
- DO ACK12
- GOTO ERROR
- +6 IF PSXHEX=PSXSUM
- DO FLUSH1^PSXUTL
- +7 ;S:$P(PSXACK,"|",1)["BHS" BHST=1,BFLAG=1,PSXBHS=1
- +8 IF $PIECE(PSXACK,"|",1)["BHS"
- SET BHST=1
- SET BFLAG=1
- +9 IF (BFLAG=1)&($PIECE(PSXACK,"|",1)["BHS")
- SET PSXMSH=$GET(PSXMSH)_"+"_$EXTRACT(PSXACK,7,$LENGTH(PSXACK)-2)
- +10 IF (BFLAG=1)&($PIECE(PSXACK,"|",1)["MSA")
- SET PSXMSA=$GET(PSXMSA)_"+"_$EXTRACT(PSXACK,7,$LENGTH(PSXACK)-2)
- SET BFLAG=0
- SET PSXBHS=1
- IF $GET(PSXMSA)["|AR|"
- SET PSXBHS=0
- IF $GET(PSXBHS)'>0
- KILL PSXMSH,PSXMSA
- +11 IF $EXTRACT(PSXACK,7,10)["MSH|"
- SET TACK=$EXTRACT(PSXACK,7,$LENGTH(PSXACK)-2)
- +12 WRITE *ACK,$SELECT(AA=1:2,AA=2:1,1:""),*TERM
- IF $PIECE(PSXACK,"|",1)["MSA"
- DO FILE
- GOTO MSG
- +13 QUIT
- FILE IF $GET(BHST)=1
- QUIT
- +1 IF $PIECE($PIECE(PSXACK,"MSA",2),"|",3)'=PSXMSGID
- DO ACK15
- GOTO ERROR
- +2 SET XXX=$PIECE($PIECE(PSXACK,"MSA",2),"|",3)
- SET REC=$ORDER(^PSX(552.2,"B",XXX,""))
- +3 SET REC=$GET(PSXQN)
- +4 IF $GET(REC)=""
- QUIT
- +5 SET ^PSX(552.2,REC,"ACK")=TACK_$EXTRACT(PSXACK,7,$LENGTH(PSXACK)-2)
- +6 SET (PSXPOP,PSXREJ)=0
- +7 IF (PSXACK["AR")
- SET PSXREJ=1
- DO ACK13
- DO LOG^PSXUTL
- +8 LOCK +^PSX(552.2,REC):DTIME
- IF $TEST
- SET DIE="^PSX(552.2,"
- SET DA=REC
- SET DR="1///"_$SELECT(PSXREJ:99,'PSXREJ:3,1:0)_";3///^S X=$H"
- DO ^DIE
- KILL DIE,DA
- LOCK -^PSX(552.2,REC)
- +9 KILL XXX,REC,PSXREJ,PSXACK,TACK
- +10 QUIT
- TST DO FLUSH1^PSXUTL
- +1 KILL PSXHEX,PSXACK,PSXREJ,LOG,PSXSUM
- +2 QUIT
- ACK1 KILL LOG
- SET LOG(1)="ACK1 ACK message never received for order #"_$PIECE($GET(^PSX(552.2,PSXQN,0)),"^",1)
- QUIT
- ACK2 KILL LOG
- SET LOG(1)="ACK2 EOT received with no terminator while waiting for ACK message"
- QUIT
- ACK3 KILL LOG
- SET LOG(1)="ACK3 EOT received while waiting for ACK message"
- QUIT
- ACK4 KILL LOG
- SET LOG(1)="ACK4 ENQ received with no terminator while waiting for ACK message"
- QUIT
- ACK5 KILL LOG
- SET LOG(1)="ACK5 Unexpected character received: "_$SELECT(X>31:$CHAR(X),1:"")_" ("_X_") while waiting for ACK message"
- QUIT
- ACK6 KILL LOG
- SET LOG(1)="ACK6 Timeout Timer D reading ACK message"
- QUIT
- ACK7 KILL LOG
- SET LOG(1)="ACK7 ACK message longer than 240 characters"
- QUIT
- ACK8 KILL LOG
- SET LOG(1)="ACK8 ACK message did not end with ETX"
- QUIT
- ACK9 KILL LOG
- SET LOG(1)="ACK9 ACK was null"
- QUIT
- ACK10 KILL LOG
- SET LOG(1)="ACK10 Timeout reading ACK checksum"
- QUIT
- ACK11 KILL LOG
- SET LOG(1)="ACK11 ACK checksum contained an invalid hex digit ("_X_")"
- QUIT
- ACK12 KILL LOG
- SET LOG(1)="ACK12 ACK checksum does not match"
- QUIT
- ACK13 KILL LOG
- SET LOG(1)="ACK13 Order #"_$PIECE($GET(^PSX(552.2,PSXQN,0)),"^",1)_" was rejected by CMOP"
- QUIT
- ACK14 KILL LOG
- SET LOG(1)="ACK14 ENQ received with no terminator"
- QUIT
- ACK15 KILL LOG
- SET LOG(1)="ACK15 MSA order # did not match "_$PIECE($GET(^PSX(552.2,PSXQN,0)),"^",1)_" # expected"
- QUIT