1 | LAXSYMDL ;MLD/ABBOTT/SLC/RAF - ABBOTT AxSYM 'DWNLD' PGM ; 6/12/96 0900;
|
---|
2 | ;;5.2;AUTOMATED LAB INSTRUMENTS;**11**;Sep 27, 1994
|
---|
3 | ;
|
---|
4 | Q ; enter at proper line tag
|
---|
5 | ;
|
---|
6 | ; ** NOTE **
|
---|
7 | ; This routine must be invoked ONLY by LAPORT33 (LANM) as it
|
---|
8 | ; requires a BI-directional interface with the AxSYM! /mld
|
---|
9 | ;
|
---|
10 | DWNLD ; Download work list to the AxSYM (called by 'LANM' routine)
|
---|
11 | D START
|
---|
12 | S X="TRAP^"_LANM,@^%ZOSF("TRAP") ; reset error trap
|
---|
13 | G @("PH1^"_LANM)
|
---|
14 | ;
|
---|
15 | START ; Call line tag to allow 'NEW' command
|
---|
16 | N CNT,I,X,FRM,LAQUIT,LAREAD,LARETRY,READ,TMOUT
|
---|
17 | S READ="S LAREAD=$$GETCH^"_LANM ; indirect read using i/f routine
|
---|
18 | S (I,LAQUIT,LARETRY)=0,X="ERR^LAXSYMDL",@^%ZOSF("TRAP"),TMOUT=-1
|
---|
19 | ;
|
---|
20 | L +^LA(INST,NODE) ; begin after obtaining global
|
---|
21 | G:'$G(^LA(INST,NODE)) OUT ; nothing to dwnld - get out
|
---|
22 | ;
|
---|
23 | GETACK ; GetACK from AxSYM indicating OK to start dwnld
|
---|
24 | D SEND^LAXSYMU(ENQ),READ ; send wakeup ENQ to machine, get reply
|
---|
25 | I LAREAD'=ACK S LARETRY=LARETRY+1 G:LARETRY<7 GETACK
|
---|
26 | G:LARETRY=7 OUT ; too many attempts - get out
|
---|
27 | ;
|
---|
28 | F S I=$O(^LA(INST,NODE,I)) Q:'I S FRM=^(I) D Q:LAQUIT
|
---|
29 | .S LARETRY=0 ; init counter
|
---|
30 | AGN .W FRM ; send frame
|
---|
31 | .I DEBUG D DEBG^LAXSYMU(FRM,"O")
|
---|
32 | .; get ACK response from AxSYM
|
---|
33 | .D READ
|
---|
34 | .; if machine NAK's, resend (6 times max)
|
---|
35 | .I LAREAD=21,LARETRY<7 S LARETRY=LARETRY+1 G AGN
|
---|
36 | .I LARETRY=7 S LAQUIT=1 Q ; reached max retries
|
---|
37 | .; if machine timed out go to idle
|
---|
38 | .I LAREAD=TMOUT S LAQUIT=1 Q
|
---|
39 | .Q
|
---|
40 | ;
|
---|
41 | G:LAQUIT OUT ; error - don't reset flags
|
---|
42 | K ^LA(INST,NODE) ; remove d/l list
|
---|
43 | K:NODE="O" ^LA(INST,"Q") ; remove dwnld-ready flag
|
---|
44 | ;
|
---|
45 | OUT ; Exit point for excessive # retries
|
---|
46 | D SEND^LAXSYMU(EOT) ; indicate end of transfer
|
---|
47 | L -^LA(INST,NODE) ; release lock
|
---|
48 | ;
|
---|
49 | QUIT
|
---|
50 | ;
|
---|
51 | READ ; Get machine's reply
|
---|
52 | X READ ; READ is set to 'S LAREAD=$$GETCH^LAPORTxx'
|
---|
53 | I DEBUG D DEBG^LAXSYMU(LAREAD,"I")
|
---|
54 | I LAREAD=EOT S LAREAD=ACK ; treat EOTs as ACK
|
---|
55 | I '$F(TMOUT_U_ACK_U_NAK_U_ENQ,LAREAD) S LAREAD=NAK ; Invalid reply=NAK
|
---|
56 | Q:LAREAD=TMOUT ; timed out
|
---|
57 | Q:LAREAD=ACK ; ACK'd if OK
|
---|
58 | Q:LAREAD=NAK ; NAK'd
|
---|
59 | G READ ; read until ACK'd, NAK'd or timed out
|
---|
60 | ;
|
---|
61 | ERR ; Error Trap
|
---|
62 | D ^LABERR
|
---|
63 | K:$G(NODE)="O" ^LA(INST,"Q") ; remove d/l ready flag
|
---|
64 | G OUT
|
---|