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

LAXSYMDL.m

Go to the documentation of this file.
  1. LAXSYMDL ; IHS/DIR/FJE - ABBOTT AxSYM 'DWNLD' PGM 5/10/94 ;
  1. ;;5.2;LA;;NOV 01, 1997
  1. ;;5.2;AUTOMATED LAB INSTRUMENTS;**11**;Sep 27, 1994
  1. ;
  1. Q ; enter at proper line tag
  1. ;
  1. ; ** NOTE **
  1. ; This routine must be invoked ONLY by LAPORT33 (LANM) as it
  1. ; requires a BI-directional interface with the AxSYM! /mld
  1. ;
  1. DWNLD ; Download work list to the AxSYM (called by 'LANM' routine)
  1. D START
  1. S X="TRAP^"_LANM,@^%ZOSF("TRAP") ; reset error trap
  1. G @("PH1^"_LANM)
  1. ;
  1. START ; Call line tag to allow 'NEW' command
  1. N CNT,I,X,FRM,LAQUIT,LAREAD,LARETRY,READ,TMOUT
  1. S READ="S LAREAD=$$GETCH^"_LANM ; indirect read using i/f routine
  1. S (I,LAQUIT,LARETRY)=0,X="ERR^LAXSYMDL",@^%ZOSF("TRAP"),TMOUT=-1
  1. ;
  1. L +^LA(INST,NODE) ; begin after obtaining global
  1. G:'$G(^LA(INST,NODE)) OUT ; nothing to dwnld - get out
  1. ;
  1. GETACK ; GetACK from AxSYM indicating OK to start dwnld
  1. D SEND^LAXSYMU(ENQ),READ ; send wakeup ENQ to machine, get reply
  1. I LAREAD'=ACK S LARETRY=LARETRY+1 G:LARETRY<7 GETACK
  1. G:LARETRY=7 OUT ; too many attempts - get out
  1. ;
  1. F S I=$O(^LA(INST,NODE,I)) Q:'I S FRM=^(I) D Q:LAQUIT
  1. .S LARETRY=0 ; init counter
  1. AGN .W FRM ; send frame
  1. .I DEBUG D DEBG^LAXSYMU(FRM,"O")
  1. .; get ACK response from AxSYM
  1. .D READ
  1. .; if machine NAK's, resend (6 times max)
  1. .I LAREAD=21,LARETRY<7 S LARETRY=LARETRY+1 G AGN
  1. .I LARETRY=7 S LAQUIT=1 Q ; reached max retries
  1. .; if machine timed out go to idle
  1. .I LAREAD=TMOUT S LAQUIT=1 Q
  1. .Q
  1. ;
  1. G:LAQUIT OUT ; error - don't reset flags
  1. K ^LA(INST,NODE) ; remove d/l list
  1. K:NODE="O" ^LA(INST,"Q") ; remove dwnld-ready flag
  1. ;
  1. OUT ; Exit point for excessive # retries
  1. D SEND^LAXSYMU(EOT) ; indicate end of transfer
  1. L -^LA(INST,NODE) ; release lock
  1. ;
  1. QUIT
  1. ;
  1. READ ; Get machine's reply
  1. X READ ; READ is set to 'S LAREAD=$$GETCH^LAPORTxx'
  1. I DEBUG D DEBG^LAXSYMU(LAREAD,"I")
  1. I LAREAD=EOT S LAREAD=ACK ; treat EOTs as ACK
  1. I '$F(TMOUT_U_ACK_U_NAK_U_ENQ,LAREAD) S LAREAD=NAK ; Invalid reply=NAK
  1. Q:LAREAD=TMOUT ; timed out
  1. Q:LAREAD=ACK ; ACK'd if OK
  1. Q:LAREAD=NAK ; NAK'd
  1. G READ ; read until ACK'd, NAK'd or timed out
  1. ;
  1. ERR ; Error Trap
  1. D ^LABERR
  1. K:$G(NODE)="O" ^LA(INST,"Q") ; remove d/l ready flag
  1. G OUT