1 | LAXSYMBL ;MLD/ABBOTT/SLC/RAF - ABBOTT AxSYM BUILD 'DWNLD' FILE ; 6/12/96 0900;
|
---|
2 | ;;5.2;AUTOMATED LAB INSTRUMENTS;**11,19**;Sep 27, 1994
|
---|
3 | ;
|
---|
4 | Q ; call line tag
|
---|
5 | ;
|
---|
6 | BLDLST ; Build the worklist in prep for dwnlding to AxSYM
|
---|
7 | ; Called from LADOWN with the following set:
|
---|
8 | ; LRLL = load list pointer
|
---|
9 | ; LRCUP1 = starting cup #
|
---|
10 | ; LRTRAY,LRTRAY1 = starting tray #
|
---|
11 | ; LRINST = Auto Instrument pointer
|
---|
12 | ; LRFORCE = 1 if send tray and cup
|
---|
13 | ;
|
---|
14 | N I,D,H,P,O,L,X,STX,ETX,CR,LF,CNT,LATEST,LRAN,LRACC,LRAD,LRFRM,SSN
|
---|
15 | N LRFRAME,LRDFN,LRNAME,INST,LANM,LRTEST
|
---|
16 | ;
|
---|
17 | L +^LA(LRINST,"O") ; get global 1st!
|
---|
18 | S D="|",STX=$C(2),ETX=$C(3),LF=$C(10),CR=$C(13),INST=LRINST
|
---|
19 | S X="ERR^LAXSYMBL",@^%ZOSF("TRAP"),(LRTEST,LRFRAME,I)=0
|
---|
20 | S LRCUP=LRCUP1-1 ; reset for $ORDER
|
---|
21 | ; LATEST array
|
---|
22 | F S I=$O(^LAB(62.4,INST,3,I)) Q:'I S X=$G(^(I,0)) S LATEST(+X)=$P(X,U,4)
|
---|
23 | ;
|
---|
24 | ; Main Loop thru Load/Work List file
|
---|
25 | F S LRCUP=$O(^LRO(68.2,LRLL,1,LRTRAY1,1,LRCUP)) Q:'LRCUP D GETACCN
|
---|
26 | ;
|
---|
27 | K LRCUP1,LRCUP2,LRTRAY1 ; not killed in calling routine (LADOWN)
|
---|
28 | L -^LA(INST,"O") ; release lock
|
---|
29 | S LREND=1,^LA(INST,"Q")="" ; set dwnld-ready flag
|
---|
30 | ;
|
---|
31 | QUIT
|
---|
32 | ;
|
---|
33 | GETACCN ; Get and save work/load list data to downlaod to AxSYM
|
---|
34 | N LRAA
|
---|
35 | S LRAA=$G(^LRO(68.2,LRLL,1,LRTRAY1,1,LRCUP,0)) Q:LRAA=""
|
---|
36 | S LRAN=$P(LRAA,U,3) Q:LRAN="" ; no accn num
|
---|
37 | S LRAD=$P(LRAA,U,2) Q:LRAD="" ; no accn date
|
---|
38 | D PNM Q:LRACC="" ; no accn
|
---|
39 | S LRAN=$E("0000",$L(LRAN),4)_LRAN ; pad with zeros to 4 digits
|
---|
40 | D FRAME
|
---|
41 | Q
|
---|
42 | ;
|
---|
43 | PNM ; Get patient name and last 4 from an accession.
|
---|
44 | N DFN,X,PT S (LRACC,DFN,LRNAME)=""
|
---|
45 | S X=$G(^LRO(68,+LRAA,1,LRAD,1,+LRAN,0)) Q:X="" ; no accn on file
|
---|
46 | S LRACC=$G(^(.2)),X=^LR(+X,0) ;Q:$P(X,U,2)'=2 ; Naked Ref=^LRO(68,LRAA,1,LRAD,1,+LRAN,.2) & ^LRO(68,LRAA,1,LRAD,1,+LRAN,X,0)
|
---|
47 | ; "patient" could be in one of several files: 2, 62.3, 67, 67.1 etc.
|
---|
48 | S DFN=$P(X,U,3),PT=$G(^DIC(+$P(X,U,2),0,"GL"))
|
---|
49 | Q:PT="" ; could not find global ref
|
---|
50 | S PT=PT_+DFN_",0)",PT=$G(@PT),LRNAME=$P(PT,U),SSN=$P(PT,U,9)
|
---|
51 | Q
|
---|
52 | ;
|
---|
53 | FRAME ; Build frame to transmit to AxSYM (stored in ^LA(INST,"O",CNT) nodes)
|
---|
54 | N I,FRM
|
---|
55 | F I="H","P","O","L" D ; loop thru frame types
|
---|
56 | .S LRFRM=$G(LRFRM)+1 S:(LRFRM=8) LRFRM=0 ; increment frame cntr
|
---|
57 | .S FRM=LRFRM_$S(I="H":$$H,I="P":$$P,I="O":$$O,1:$$L)_CR_ETX
|
---|
58 | .S CKSM=$$CKSUM^LAXSYMU(FRM) ; CR_ETX is counted in chksum
|
---|
59 | .; * build msg frame: <STX>~|~msg text~|~<CR><ETX>~checksum~<CR><LF>
|
---|
60 | .S FRM=STX_FRM_CKSM_CR_LF
|
---|
61 | .; set frame to ^LA( "O"utput node
|
---|
62 | .S CNT=$G(^LA(INST,"O"))+1,^LA(INST,"O")=CNT,^LA(INST,"O",CNT)=FRM
|
---|
63 | ;
|
---|
64 | Q
|
---|
65 | ;
|
---|
66 | H() ; Build hdr frame
|
---|
67 | N H S H="H|\^&",$P(H,D,12,13)="P|1"
|
---|
68 | Q H
|
---|
69 | ;
|
---|
70 | P() ; Build Patient frame
|
---|
71 | N P S P="P|1"
|
---|
72 | ; 20 chars is size limit for rev 1.xx 15 will be limit for rev.2!
|
---|
73 | S $P(P,D,4)=$E(LRACC,1,15)_"^" ; see above re: size limits
|
---|
74 | S $P(P,D,5)=$G(SSN)
|
---|
75 | S $P(P,D,6)=$E($P(LRNAME,","),1,20)_U_$E($P($P(LRNAME,",",2)," "),1,20)_U_$E($P(LRNAME," ",2))
|
---|
76 | Q P
|
---|
77 | ;
|
---|
78 | O() ; Build Order frame NOTE:
|
---|
79 | ; a. 10 chars is size limit for rev 1.xx 15 will be limit for rev 2
|
---|
80 | ; b. Potential for REPEAT (multiple) tests to cause the Order frame
|
---|
81 | ; to exceed 247 chars! However, if the AxSYM doesn't offer more
|
---|
82 | ; than about 25 tests, this should not be a problem.
|
---|
83 | ;
|
---|
84 | B N O,CNT,DLM,PRI,LRPRI,LRTEST,LRTST
|
---|
85 | S (CNT,PRI,LRTEST)=0,LRPRI=9,$P(O,D,5)=""
|
---|
86 | F S LRTEST=$O(^LRO(68.2,LRLL,1,LRTRAY1,1,LRCUP,1,LRTEST)) Q:'LRTEST D
|
---|
87 | .S CNT=CNT+1 S DLM=$S(CNT>1:"\",1:"")
|
---|
88 | .S LRTST=$$PNL ; get AxSYM's internal tst #
|
---|
89 | .S:LRTST="" CNT=CNT-1
|
---|
90 | .Q:LRTST="" ; test not in Auto Inst file
|
---|
91 | .S $P(O,D,5)=$P(O,D,5)_DLM_"^^^"_LRTST ; 'repeat' tests use '\'
|
---|
92 | .S PRI=+$P($G(^LRO(68.2,LRLL,1,LRTRAY1,1,LRCUP,1,LRTEST,0)),U,2)
|
---|
93 | .I PRI,(PRI<LRPRI) S LRPRI=PRI ; take 'highest' prio
|
---|
94 | ;
|
---|
95 | S LRPRI=$E($P($G(^LAB(62.05,LRPRI,0)),U)) S:LRPRI="" LRPRI="R"
|
---|
96 | ; 2nd pc is (hardcoded) # of 'O' frames. Change if loop is needed
|
---|
97 | S $P(O,D,1,3)="O|1|"_LRAN
|
---|
98 | S $P(O,D,6)=LRPRI,$P(O,D,12)="A",$P(O,D,26)="O"
|
---|
99 | Q O
|
---|
100 | ;
|
---|
101 | L() ; Build Last (termination) frame
|
---|
102 | Q "L|1"
|
---|
103 | ;
|
---|
104 | PNL() ; Expand panel from load/work list
|
---|
105 | N CT,I,T,TST,DLM S (CT,I,T)=0,TST=""
|
---|
106 | Q:$D(LATEST(LRTEST)) LATEST(LRTEST) ; return single test
|
---|
107 | ; expand panel
|
---|
108 | F S I=$O(^LAB(60,LRTEST,2,I)) Q:'I S T=+$G(^(I,0)) D:T
|
---|
109 | .S CT=CT+1 S DLM=$S(CT>1:"\^^^",1:"")
|
---|
110 | .I $D(LATEST(T)) S TST=TST_DLM_LATEST(T)
|
---|
111 | .I '$D(LATEST(T)) S CT=CT-1
|
---|
112 | .Q
|
---|
113 | ; Return panel tests that should look like: 321\^^^678\^^^452
|
---|
114 | Q TST
|
---|
115 | ;
|
---|
116 | ERR ; Error Trap
|
---|
117 | D ^LABERR H 1
|
---|
118 | K ^LA(INST,"O") ; remove incomplete list
|
---|
119 | L -^LA(INST,"O")
|
---|
120 | Q
|
---|