| 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
 | 
|---|