[613] | 1 | LAPORT33 ;MLD/ABBOTT/SLC/RAF - AxSYM BIDRECTIONAL INTERFACE ; 6/12/96 0900
|
---|
| 2 | ;;5.2;AUTOMATED LAB INSTRUMENTS;**11,19**;Sep 27, 1994
|
---|
| 3 | ;
|
---|
| 4 | ; This routine LOOSELY follows the LAPORTXX template. However, this
|
---|
| 5 | ; routine works ONLY for Abbott's AxSYM machine, and should comply
|
---|
| 6 | ; with ASTM communication protocols. This pgm will run continuously
|
---|
| 7 | ; as a background job until the system is taken down OR ^LA("STOP",INST)
|
---|
| 8 | ; global flag is set. /mld
|
---|
| 9 | ;
|
---|
| 10 | N LARETRY,LATOUT,LATEMP,LAFRAME,LAFRAM,LAEND,LACS,LAFRNUM,LADEV
|
---|
| 11 | N LAFRNM,LALINK,LACRLF,LACRETX,LANOCTL1,LANOCTL2,LADATA,LANM
|
---|
| 12 | N I,J,T,X,Y,INST,DEB,HOME,BASE,OUT,TOUT,PAR,TSK,NODE,OK,DEBUG,CNT
|
---|
| 13 | N NUL,SOH,STX,ETX,EOT,ENQ,ACK,NAK,ETB,LF,CR ; *control chars*
|
---|
| 14 | ;
|
---|
| 15 | S LANM=$T(+0),(HOME,T)=+$E(LANM,7,8) Q:+T<1 Q:$D(^LA("LOCK","D"_T))
|
---|
| 16 | ; init req'd params
|
---|
| 17 | D INIT^LAXSYMU I 'OK QUIT ; chk ^LA(INST,"ERR",$H) for err msg
|
---|
| 18 | ;
|
---|
| 19 | PH1 ; PHase1 - idle/establish link (wait for AxSYM to send data)
|
---|
| 20 | S LADATA=$$GETCH I DEBUG D DEBG^LAXSYMU(LADATA,"I")
|
---|
| 21 | I LADATA=-1 G @($$CHK) ; idle - chk flags
|
---|
| 22 | I LADATA'=ENQ G PH1 ; read until ENQ rec'd
|
---|
| 23 | ; AxSYM ready to send data so init vars, ACK and drop to PH2
|
---|
| 24 | S LAFRAME="",LARETRY=0,LATOUT=15,LAFRNM=0,LALINK=1
|
---|
| 25 | D SEND^LAXSYMU(ACK)
|
---|
| 26 | ;
|
---|
| 27 | PH2 ; PHase2 - transfer data (build frame)
|
---|
| 28 | S LADATA=$$GETCH
|
---|
| 29 | I LADATA=-1 D SET G PH1 ; timed out - goto idle
|
---|
| 30 | S LAFRAME=LAFRAME_$C(LADATA) ; build frame
|
---|
| 31 | I $L(LAFRAME)>247 D NAK^LAXSYMU("SIZE") G:LARETRY<7 PH2 D SET G PH1
|
---|
| 32 | I LADATA=LF G PH3 ; LF=complete frame
|
---|
| 33 | I LADATA=EOT G PH3 ; no more data
|
---|
| 34 | G PH2
|
---|
| 35 | ;
|
---|
| 36 | PH3 ; PHase3 (validate frame)
|
---|
| 37 | D:DEBUG DEBG^LAXSYMU(LAFRAME,"I") ; debug
|
---|
| 38 | S X=LAFRAME
|
---|
| 39 | I $F(X,$C(EOT)) D SET G PH1 ; EOT not allowed in txt
|
---|
| 40 | I $A(X)'=STX D SET G PH1 ; 1st char must be STX
|
---|
| 41 | ; txt must end w/ ETX or ETB
|
---|
| 42 | S LAEND=$S($F(X,$C(ETX)):$F(X,$C(ETX)),1:$F(X,$C(ETB)))
|
---|
| 43 | I 'LAEND D NAK^LAXSYMU("LAEND") G PH2:LARETRY<7 D SET G PH1
|
---|
| 44 | ;
|
---|
| 45 | S LAFRAM=$E(X,2,LAEND-1) ; get msg txt
|
---|
| 46 | ; chk frame numbering sequence
|
---|
| 47 | S LAFRNUM=+LAFRAM,LAFRNM=$S(LAFRNM<7:LAFRNM+1,1:0)
|
---|
| 48 | I LAFRNM'=LAFRNUM D NAK^LAXSYMU("NUMSQNC") G PH2:LARETRY<7 D SET G PH1
|
---|
| 49 | I LAFRNUM'=(LAFRNUM#8) D NAK^LAXSYMU("FRNUM") G PH2:LARETRY<7 D SET G PH1
|
---|
| 50 | ; chk restricted control chars in txt
|
---|
| 51 | I LAFRAM'=$TR(LAFRAM,LANOCTL2) D NAK^LAXSYMU("CTL") G PH2:LARETRY<7 D SET G PH1
|
---|
| 52 | ; sent checksum must = received checksum
|
---|
| 53 | S LACS=$E(X,LAEND,LAEND+1) ; get passed cksum
|
---|
| 54 | I LACS'=$$CKSUM^LAXSYMU(LAFRAM) D NAK^LAXSYMU("CKSUM") G PH2:LARETRY<7 D SET G PH1
|
---|
| 55 | ; chk for CR_LF terminating chars - timeout if NULL, NAK for all others
|
---|
| 56 | I $P(X,(LACRETX_LACS),2)="" D SET G PH1
|
---|
| 57 | I $P(X,(LACRETX_LACS),2)'=LACRLF D NAK^LAXSYMU("LACRLF") G PH2
|
---|
| 58 | ;
|
---|
| 59 | D UPDT^LAXSYMU,SEND^LAXSYMU(ACK) ; frame OK - save & ACK
|
---|
| 60 | G PH2 ; get nxt frame
|
---|
| 61 | ;
|
---|
| 62 | GETCH() ; read 1 char at a time. Returns Ascii value of terminating char
|
---|
| 63 | S ^LA(INST,"R")=$H
|
---|
| 64 | R *LATEMP:LATOUT
|
---|
| 65 | S DEBUG=$D(^LA(DEB,0)) ; debug on? (def=off)
|
---|
| 66 | Q LATEMP
|
---|
| 67 | ;
|
---|
| 68 | CHK() ; Chk flags - Returns LINE TAG to branch to
|
---|
| 69 | S ^LA(INST,"R")=$H,LATOUT=30 ; update run-time flag
|
---|
| 70 | I $D(^LA(INST,"HQ")) S NODE="HQ" Q "DWNLD^LAXSYMDL" ; host query
|
---|
| 71 | I $D(^LA(INST,"Q")) S NODE="O" Q "DWNLD^LAXSYMDL" ; d/l l/w list
|
---|
| 72 | I '$D(^LA("STOP",INST)) Q "PH1" ; continue
|
---|
| 73 | Q "OUT" ; STOP = shutdown
|
---|
| 74 | ;
|
---|
| 75 | SET ; Re-init vars
|
---|
| 76 | H 5 ; allow LAXSYM to catch up
|
---|
| 77 | K LAFRAM,X,LALINK,LAFRNM
|
---|
| 78 | S LATOUT=5,LAFRAME=""
|
---|
| 79 | Q:$$CHK["HQ"
|
---|
| 80 | H 13 ; force timeout & return to idle
|
---|
| 81 | Q
|
---|
| 82 | ;
|
---|
| 83 | OUT ; Main Exit - remove flags, close port
|
---|
| 84 | K ^LA("STOP",INST),^LA(INST),^LA("LOCK","D"_INST)
|
---|
| 85 | D ^%ZISC
|
---|
| 86 | Q
|
---|
| 87 | ;
|
---|
| 88 | TRAP ; Error Trap
|
---|
| 89 | D ^LABERR S T=TSK
|
---|
| 90 | D SET^LAB G PH1
|
---|
| 91 | Q
|
---|
| 92 | ;
|
---|
| 93 | DQ ;Entry point to task job
|
---|
| 94 | S LANM=$T(+0),HOME=$E(LANM,7,8) Q:HOME=""!(HOME>99)
|
---|
| 95 | I $D(^LAB(62.4,HOME,0)),$L($P(^(0),"^",2)) S ZTIO=$P(^(0),"^",2),ZTRTN=LANM,ZTDTH=$H,ZTDESC="START LAB DIRECT CONNECT PORT "_HOME K ^LA("LOCK","D"_HOME) D ^%ZTLOAD
|
---|
| 96 | Q
|
---|