| [613] | 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
 | 
|---|