| 1 | ACKQAG02        ;DDC/PJU - Module to get data for Audiogram E/E and Transmit to DDC ;07/21/05 | 
|---|
| 2 | ;;3.0;QUASAR AUDIOMETRIC MODULE;**3,12**;11/01/02 | 
|---|
| 3 | ;input: ref to array and DFN | 
|---|
| 4 | ;return: array of VALUES in ACKQARR, ACKQERR if an error was found | 
|---|
| 5 | ;Called by RPC ACKQAUD2 | 
|---|
| 6 | ;Used by the the E/E - One Audiogram at a time | 
|---|
| 7 | ;IEN needed in 1st pc for the Enter/edit program | 
|---|
| 8 | ;ACKQARR(1)=audiogram local ien^name of patient^last date seen^tester1^error msg | 
|---|
| 9 | ;ACKQARR(ctr)=pcs in rest of counter nodes | 
|---|
| 10 | ; 1=Xvalue | 
|---|
| 11 | ; 2=ear[L,R] | 
|---|
| 12 | ; 3= | 
|---|
| 13 | ; 4=iAirY | 
|---|
| 14 | ; 5=iAirMask[0-6]-not used in 3*12 | 
|---|
| 15 | ; 6=iAirMaskL | 
|---|
| 16 | ; 7=iBoneY | 
|---|
| 17 | ; 8=iBoneMask[0-1]-not used in 3*12 | 
|---|
| 18 | ; 9=iBoneMaskL | 
|---|
| 19 | ; 10=IAR | 
|---|
| 20 | ; 11=CAR | 
|---|
| 21 | ; 12=fAirY | 
|---|
| 22 | ; 13=fAirMask[0-6]-not used in 3*12 | 
|---|
| 23 | ; 14=fAirMaskL | 
|---|
| 24 | ; 15=fBoneY | 
|---|
| 25 | ; 16=fBoneMask[0-1]-not used in 3*12 | 
|---|
| 26 | ; 17=fBoneMaskL | 
|---|
| 27 | ; 18=AR DECAY | 
|---|
| 28 | ; 19=HALF LF | 
|---|
| 29 | ;will return to the Delphi app as subscripted array | 
|---|
| 30 | ;subscripts: 1(gen), 2-13(R), 14-25(L), 26(gen) | 
|---|
| 31 | START(ACKQARR,DFN)   ; | 
|---|
| 32 | K ACKQERR | 
|---|
| 33 | ;ACKQN is a number counter, S0 is a node holder | 
|---|
| 34 | ;ACKQERR is an error holder | 
|---|
| 35 | ;ACKQFMD hold dates, ACKQ1IEN  holds the entry number | 
|---|
| 36 | I '$G(DFN) D  G END | 
|---|
| 37 | .S ACKQERR="**ERROR** Must have a DFN to run routine RMPFRPC2 " | 
|---|
| 38 | I '$D(^ACK(509850.9,0)) D  G END | 
|---|
| 39 | .S ACKQERR="**ERROR** QUASAR file 509850.9 (Audiometric Exam Data file) is not available" | 
|---|
| 40 | ;look up DFN in file | 
|---|
| 41 | I '$D(^ACK(509850.9,"DFN",DFN)) D  G END | 
|---|
| 42 | .S ACKQERR="**ERROR** patient not in audiogram file" | 
|---|
| 43 | ;determine if 1 or 2 audiograms - set flag | 
|---|
| 44 | S ACKQFMD="A",ACKQ1IEN="" | 
|---|
| 45 | S1 S ACKQFMD=$O(^ACK(509850.9,"DFN",DFN,ACKQFMD),-1) | 
|---|
| 46 | ;set up array for latest one in file | 
|---|
| 47 | I 'ACKQFMD D  G END | 
|---|
| 48 | .S ACKQERR="**ERROR** No current audiograms for patient in file" | 
|---|
| 49 | S ACKQIEN=0 | 
|---|
| 50 | S2 S ACKQIEN=$O(^ACK(509850.9,"DFN",DFN,ACKQFMD,ACKQIEN)) | 
|---|
| 51 | I 'ACKQIEN D  G S1 | 
|---|
| 52 | .S ACKQERR="**ERROR** No data exists for visit on "_$$FMTE^XLFDT(ACKQFMD) | 
|---|
| 53 | I '$D(^ACK(509850.9,ACKQIEN,0)) D  G S1 | 
|---|
| 54 | .S ACKQERR="**ERROR** Node missing in file for this visit" | 
|---|
| 55 | G EN2 ;to skip following line | 
|---|
| 56 | EN(ACKQARR,ACKQIEN,DFN) ; | 
|---|
| 57 | EN2 ;from S2 | 
|---|
| 58 | N ACK,ACKD,ACKDF,ACKT | 
|---|
| 59 | S ACKQARR(1)=0 ;default | 
|---|
| 60 | K ACKQERR F I=2:1:25 S ACKQARR(I)="" | 
|---|
| 61 | S S0=$S(ACKQIEN="":"",1:$G(^ACK(509850.9,ACKQIEN,0))) ;HD63875 | 
|---|
| 62 | I S0="" S ACKQFMD="A" G S1 ;HD63875 | 
|---|
| 63 | I $P(S0,U,2)'=DFN D  G S2 ;should be already checked in calling routine | 
|---|
| 64 | .S ACKQERR="***URGENT ERROR*** File error - wrong DFN in xref DFN or record: "_DFN | 
|---|
| 65 | S DIC=2,DA=DFN,DIQ="AK",DR=".01" D EN^DIQ1 S ACKD=AK(2,DFN,.01) ;DFN name | 
|---|
| 66 | K DIC,DA,DIQ,DR,AK | 
|---|
| 67 | ;(1)=ien^patient^FM date seen^tester | 
|---|
| 68 | S ACKDF=$P(^ACK(509850.9,ACKQIEN,0),U,1) | 
|---|
| 69 | S ACKQARR(1)=ACKQIEN_U_ACKD_U_ACKDF | 
|---|
| 70 | I '$P(S0,U,3) S $P(ACKQARR(1),U,4)="Unknown" | 
|---|
| 71 | E  D | 
|---|
| 72 | .S Y=$P(S0,U,3),X=$$TITLE^ACKQAG01(Y) K Y | 
|---|
| 73 | .S $P(ACKQARR(1),U,4)=$P(X,U,1) ;tester name | 
|---|
| 74 | D GETDATA(ACKQIEN) | 
|---|
| 75 | END ;if errors, then handle errors and stop | 
|---|
| 76 | S:'$D(ACKQARR(1)) ACKQARR(1)=0 | 
|---|
| 77 | I $G(ACKQERR)'="" D  D WRTERR ;5th pc of 0 node is err msg | 
|---|
| 78 | .F I=2:1:25 S ACKQARR(I)="" | 
|---|
| 79 | K ACKQERR,ACKQFMD,I,S0 | 
|---|
| 80 | Q | 
|---|
| 81 | ; | 
|---|
| 82 | GETDATA(ACKQIEN)    ; | 
|---|
| 83 | ;input the entry number in the Audiometic Exam Data file (ACKQIEN) | 
|---|
| 84 | ;and current return array subscript value(ACKQN) | 
|---|
| 85 | N ACKQA1,ACKQA2,ACKQA1T,ACKQA2T,ACKQA1L,ACKQA2L ;air initial & repeat values, air tags initial & repeat, air Mask Levels | 
|---|
| 86 | N ACKQB1,ACKQB2,ACKQB1T,ACKQB2T,ACKQB1L,ACKQB2L ;bone initial & repeat values, bone masking init & repeat | 
|---|
| 87 | N P,P1 ;P is the piece of the air nodes, P1 is the piece of the bone nodes | 
|---|
| 88 | N X ;X is the Hz | 
|---|
| 89 | S ACKQN=1 ;counter subscript for array - subsc 1 filled in above | 
|---|
| 90 | ;START R ear | 
|---|
| 91 | ; Air | 
|---|
| 92 | F P=1:1:12 D  ;set pcs in ACKQARR node | 
|---|
| 93 | .S ACKQN=ACKQN+1 | 
|---|
| 94 | .S X=$S(P=1:125,P=2:250,P=3:500,P=4:750,P=5:1000,P=6:1500,P=7:2000,1:"") | 
|---|
| 95 | .S:X="" X=$S(P=8:3000,P=9:4000,P=10:6000,P=11:8000,P=12:12000,1:"") | 
|---|
| 96 | .S ACKQARR(ACKQN)=X_U_"R"_U_"" ;X^ear^ien^Y | 
|---|
| 97 | .S ACKQA1=$P($G(^ACK(509850.9,ACKQIEN,10)),U,P) ;init Y val | 
|---|
| 98 | .S ACKQA1T=$P($G(^ACK(509850.9,ACKQIEN,11)),U,P) ;init tag | 
|---|
| 99 | .S ACKQA1L=$P($G(^ACK(509850.9,ACKQIEN,50)),U,P) ;init tag level | 
|---|
| 100 | .S ACKQA2=$P($G(^ACK(509850.9,ACKQIEN,20)),U,P) ;repeat val | 
|---|
| 101 | .S ACKQA2T=$P($G(^ACK(509850.9,ACKQIEN,21)),U,P) ;repeat tag | 
|---|
| 102 | .S ACKQA2L=$P($G(^ACK(509850.9,ACKQIEN,51)),U,P) ;repeat tag level | 
|---|
| 103 | .S $P(ACKQARR(ACKQN),U,4)=ACKQA1,$P(ACKQARR(ACKQN),U,5)=ACKQA1T ;default | 
|---|
| 104 | .S $P(ACKQARR(ACKQN),U,6)=ACKQA1L,$P(ACKQARR(ACKQN),U,12)=ACKQA2 | 
|---|
| 105 | .S $P(ACKQARR(ACKQN),U,13)=ACKQA2T,$P(ACKQARR(ACKQN),U,14)=ACKQA2L | 
|---|
| 106 | .; bone conduction | 
|---|
| 107 | .I X>125,X<7000 D | 
|---|
| 108 | ..S P1=P-1 ;125 not a bone reading so pc's 1 less | 
|---|
| 109 | ..S ACKQB1=$P($G(^ACK(509850.9,ACKQIEN,70)),U,P1) ;init bone | 
|---|
| 110 | ..S ACKQB1T=$P($G(^ACK(509850.9,ACKQIEN,71)),U,P1) ;init bone TAG | 
|---|
| 111 | ..S ACKQB1L=$P($G(^ACK(509850.9,ACKQIEN,90)),U,P1) ;init bone level | 
|---|
| 112 | ..S ACKQB2=$P($G(^ACK(509850.9,ACKQIEN,75)),U,P1) ;repeat bone | 
|---|
| 113 | ..S ACKQB2T=$P($G(^ACK(509850.9,ACKQIEN,76)),U,P1) ;repeat bone TAG | 
|---|
| 114 | ..S ACKQB2L=$P($G(^ACK(509850.9,ACKQIEN,91)),U,P1) ;repeat bone mask | 
|---|
| 115 | ..S $P(ACKQARR(ACKQN),U,7)=ACKQB1,$P(ACKQARR(ACKQN),U,8)=ACKQB1T | 
|---|
| 116 | ..S $P(ACKQARR(ACKQN),U,9)=ACKQB1L,$P(ACKQARR(ACKQN),U,15)=ACKQB2 | 
|---|
| 117 | ..S $P(ACKQARR(ACKQN),U,16)=ACKQB2T,$P(ACKQARR(ACKQN),U,17)=ACKQB2L | 
|---|
| 118 | .;IAR/CAR AR-DECAY AR-HALFLIFE | 
|---|
| 119 | .I (X=500) D | 
|---|
| 120 | ..S $P(ACKQARR(ACKQN),U,10)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,4) | 
|---|
| 121 | ..S $P(ACKQARR(ACKQN),U,11)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,8) | 
|---|
| 122 | ..S $P(ACKQARR(ACKQN),U,18)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,12) | 
|---|
| 123 | ..S $P(ACKQARR(ACKQN),U,19)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,14) | 
|---|
| 124 | .I (X=1000) D | 
|---|
| 125 | ..S $P(ACKQARR(ACKQN),U,10)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,5) | 
|---|
| 126 | ..S $P(ACKQARR(ACKQN),U,11)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,9) | 
|---|
| 127 | ..S $P(ACKQARR(ACKQN),U,18)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,13) | 
|---|
| 128 | ..S $P(ACKQARR(ACKQN),U,19)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,15) | 
|---|
| 129 | .I (X=2000) D | 
|---|
| 130 | ..S $P(ACKQARR(ACKQN),U,10)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,6) | 
|---|
| 131 | ..S $P(ACKQARR(ACKQN),U,11)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,10) | 
|---|
| 132 | .I (X=4000) D | 
|---|
| 133 | ..S $P(ACKQARR(ACKQN),U,10)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,7) | 
|---|
| 134 | ..S $P(ACKQARR(ACKQN),U,11)=$P($G(^ACK(509850.9,ACKQIEN,120)),U,11) | 
|---|
| 135 | ;start L ear | 
|---|
| 136 | ; air | 
|---|
| 137 | F P=1:1:12 D | 
|---|
| 138 | .S ACKQN=ACKQN+1 ;counter subscript for array | 
|---|
| 139 | .S X=$S(P=1:125,P=2:250,P=3:500,P=4:750,P=5:1000,P=6:1500,1:"") | 
|---|
| 140 | .S:X="" X=$S(P=7:2000,P=8:3000,P=9:4000,P=10:6000,P=11:8000,1:12000) | 
|---|
| 141 | .S ACKQARR(ACKQN)=X_U_"L"_U_"" ; X^ear^IEN^Y | 
|---|
| 142 | .S ACKQA1=$P($G(^ACK(509850.9,ACKQIEN,30)),U,P) ;initial read null | 
|---|
| 143 | .S ACKQA1T=$P($G(^ACK(509850.9,ACKQIEN,31)),U,P) ;init tag | 
|---|
| 144 | .S ACKQA1L=$P($G(^ACK(509850.9,ACKQIEN,60)),U,P) ;init level | 
|---|
| 145 | .S ACKQA2=$P($G(^ACK(509850.9,ACKQIEN,40)),U,P) ;repeat val | 
|---|
| 146 | .S ACKQA2T=$P($G(^ACK(509850.9,ACKQIEN,41)),U,P) ;repeat tag | 
|---|
| 147 | .S ACKQA2L=$P($G(^ACK(509850.9,ACKQIEN,61)),U,P) ;repeat level | 
|---|
| 148 | .S $P(ACKQARR(ACKQN),U,4)=ACKQA1,$P(ACKQARR(ACKQN),U,5)=ACKQA1T | 
|---|
| 149 | .; bone conduction | 
|---|
| 150 | .I X>125,X<7000 D | 
|---|
| 151 | ..S P1=P-1 ;125 not a bone reading so pc's 1 less | 
|---|
| 152 | ..S ACKQB1=$P($G(^ACK(509850.9,ACKQIEN,80)),U,P1) ;init val | 
|---|
| 153 | ..S ACKQB1T=$P($G(^ACK(509850.9,ACKQIEN,81)),U,P1) ;init tag | 
|---|
| 154 | ..S ACKQB1L=$P($G(^ACK(509850.9,ACKQIEN,100)),U,P1) ;init mask level | 
|---|
| 155 | ..S ACKQB2=$P($G(^ACK(509850.9,ACKQIEN,85)),U,P1) ;repeat val | 
|---|
| 156 | ..S ACKQB2T=$P($G(^ACK(509850.9,ACKQIEN,86)),U,P1) ;repeat tag | 
|---|
| 157 | ..S ACKQB2L=$P($G(^ACK(509850.9,ACKQIEN,101)),U,P1) ;repeat mask level | 
|---|
| 158 | ..S $P(ACKQARR(ACKQN),U,7)=ACKQB1,$P(ACKQARR(ACKQN),U,8)=ACKQB1T ;default | 
|---|
| 159 | ..S $P(ACKQARR(ACKQN),U,9)=ACKQB1L,$P(ACKQARR(ACKQN),U,15)=ACKQB2 | 
|---|
| 160 | ..S $P(ACKQARR(ACKQN),U,16)=ACKQB2T,$P(ACKQARR(ACKQN),U,17)=ACKQB2L | 
|---|
| 161 | .; IAR/CAR AR-DECAY AR-HALFLIFE | 
|---|
| 162 | .I (X=500) D | 
|---|
| 163 | ..S $P(ACKQARR(ACKQN),U,10)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,4) | 
|---|
| 164 | ..S $P(ACKQARR(ACKQN),U,11)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,8) | 
|---|
| 165 | ..S $P(ACKQARR(ACKQN),U,18)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,12) | 
|---|
| 166 | ..S $P(ACKQARR(ACKQN),U,19)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,14) | 
|---|
| 167 | .I (X=1000) D | 
|---|
| 168 | ..S $P(ACKQARR(ACKQN),U,10)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,5) | 
|---|
| 169 | ..S $P(ACKQARR(ACKQN),U,11)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,9) | 
|---|
| 170 | ..S $P(ACKQARR(ACKQN),U,18)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,12) | 
|---|
| 171 | ..S $P(ACKQARR(ACKQN),U,19)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,14) | 
|---|
| 172 | .I (X=2000) D | 
|---|
| 173 | ..S $P(ACKQARR(ACKQN),U,10)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,6) | 
|---|
| 174 | ..S $P(ACKQARR(ACKQN),U,11)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,10) | 
|---|
| 175 | .I (X=4000) D | 
|---|
| 176 | ..S $P(ACKQARR(ACKQN),U,10)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,7) | 
|---|
| 177 | ..S $P(ACKQARR(ACKQN),U,11)=$P($G(^ACK(509850.9,ACKQIEN,121)),U,11) | 
|---|
| 178 | Q | 
|---|
| 179 | ; | 
|---|
| 180 | WRTERR ; | 
|---|
| 181 | I $L($G(ACKQERR)) D | 
|---|
| 182 | .S $P(ACKQARR(1),U,5)=ACKQERR ; | 
|---|
| 183 | ;W !!,?10,ACKQERR ;used for direct call testing | 
|---|
| 184 | Q | 
|---|