- MCARAM ;WASH ISC/JKL-MUSE AUTO INSTRUMENT DATA LOAD INTO DHCP ;5/28/96 14:53
- ;;2.3;Medicine;;09/13/1996
- ;
- ;
- START ; Driver for MUSE-run by task manager
- ; WHERE: LANM,TSK,MCINST,T are required for MCARASE
- ; LANM = routine name, T and TSK = auto instrument IEN,
- ; MCINST = auto instrument name
- ; MCL = data type line number, MCLT = data transmission line number
- ; MCD = one line of lab data, MCA = array of local data,
- ; MCE = internal record number of EKG file where data is stored
- ; MCRD = attempts to read lab data
- ; MCCD= current data transmission number
- ; MCPRO= EKG procedure number from Procedure/Subspecialty file
- N LANM,TSK,MCINST,T,MCL,MCLT,MCA,MCCD,MCCNT,MCE,MCERR,MCRD,MCPRO,MCPRNM
- N MCS,MCTOT,MCTYPE,MCZ,MCREC
- S LANM=$T(+0),TSK=$O(^LAB(62.4,"C",LANM,0)),U="^" I TSK="" Q
- ; Quit if no MUSE data
- I '$D(^LA(TSK,"I",0)) Q
- S MCINST=$P(^LAB(62.4,TSK,0),U) D ^MCARASE I 'TSK Q
- S @TRAP
- ;initial error condition
- S MCA("ERR")=0
- ;get EKG procedure number from Procedure/Subspecialty file
- S MCPRO=$O(^MCAR(697.2,"C","MCAR(691.5",0))
- ;print name for ECG procedure, type of transmission
- S MCPRNM=$$ORPRM(MCPRO),MCTYPE="M"
- ;delay process until record data is complete
- D DELPRO
- ;
- READ S MCRD=0,MCL=0,MCCD=-1,MCA("CONT")="@"
- I ^LA(TSK,"I",0)'=0 S MCLT=^LA(TSK,"I",0)+1,MCCD=MCLT-1
- D IN G QUIT
- IN S MCLT=^LA(TSK,"I",0)+1 I '$D(^(MCLT)) S MCRD=MCRD+1 Q:MCRD>6 H 8 G IN
- S ^LA(TSK,"I",0)=MCLT,MCRD=0,MCERR=0
- I '$D(MCREC) F MCZ=1:1 D:'$D(^LA(TSK,"I",MCLT+MCZ)) DELPRO I ($D(^LA(TSK,"I",MCLT+MCZ))#2),((^LA(TSK,"I",MCLT+MCZ)["EOR")!(^LA(TSK,"I",MCLT+MCZ)["ERR")!(^LA(TSK,"I",MCLT+MCZ)["BYE")) S MCREC="" Q
- I '$D(MCA("ERR")) S MCA("ERR")=0
- ;ignore set if retransmit set of data lines
- I $D(^LA(TSK,"I",MCLT+3)),^LA(TSK,"I",MCLT+3)=^LA(TSK,"I",MCLT),^LA(TSK,"I",MCLT)?.E1.A.E S MCCD=MCCD+3,^LA(TSK,"I",0)=MCLT+2 G IN
- ;check for start of transmission-suppressed H
- I $E(^LA(TSK,"I",MCLT),1,5)="HELLO" S MCCD=MCLT-3
- ;check for start of transmission-IRM
- I $E(^LA(TSK,"I",MCLT),1,3)="IRM" S MCCD=MCLT-3
- ;transfer one line of lab data to local array
- I MCCD+3=MCLT S MCERR=$$RLAB^MCARAM(.MCA,.MCL,MCLT)
- ;transmission error
- I +MCERR=5 K MCA,MCERR,MCREC N MCA,MCERR G IN
- ;transfer local array data into DHCP
- ;record successful or unsuccessful data transfer attempt
- I +MCERR=10 S:$$GRERR^MCARAM7(.MCA)=0 MCERR=$$LDHCP^MCARAM3(.MCA,.MCE) S MCERR=$$KPERR^MCARAM7(.MCA,.MCS) K MCA,MCERR,MCE,MCS,MCREC N MCA,MCERR,MCE,MCS
- G IN
- ;
- DELPRO ;delay process until record data is complete
- S MCCNT=0
- DELP I $D(^LA(TSK,"I")) S MCTOT=^LA(TSK,"I"),MCCNT=MCCNT+1 H 15 I MCTOT=^LA(TSK,"I"),MCCNT<7 G DELP
- K MCTOT,MCCNT
- Q
- ;
- ;
- OUT S MCLT=^LA(TSK,"O")+1,^("O")=MCLT,^("O",MCLT)=OUT
- L +^LA("Q") S Q=^LA("Q")+1,^("Q")=Q,^("Q",Q)=TSK L -^LA("Q") Q
- Q
- ;
- ;
- RLAB(MCA,MCL,MCLT) ; Read Lab data and place in local array
- ; USAGE: S X=$$RLAB^MCARAM(.A,.B,C)
- ; WHERE: .A=Array into which data is placed
- ; .B=Data type line number
- ; C=Data transmission line number
- ;
- ;lab data
- S MCD=^LA(TSK,"I",MCLT)
- I ($E(MCD,1,5)="HELLO")!($E(MCD,1,3)="EOT") S MCL=0,MCA("CONT")="@",MCCD=MCLT-1 Q 0
- I $E(MCD,1,3)="BYE" S MCL=0,MCA("CONT")="@",MCCD=MCLT-2 Q 0
- I $E(MCD,1,3)="IRM" S MCL=0,MCA("CONT")="@",MCCD=MCLT Q 0
- I $E(MCD,1,3)="EOR" S MCERR="10-End of record" S MCCD=MCLT Q MCERR
- I $E(MCD,1,3)="ERR" S MCERR="5-Transmission error-expect retry of record" S MCL=0,MCA("CONT")="@",MCCD=MCLT-1 Q MCERR
- S MCL=MCL+1,MCA("CONT")=$C($A(MCA("CONT"))+1)
- ;transfer lab data to local
- I MCL<13 S MCTR=$S(MCL<7:"S MCERR=$$L"_MCL_"^MCARAM1(.MCA,MCD)",MCL=12:"S MCERR=$$L"_MCL_"^MCARAM3(.MCA,MCD)",MCL>6:"S MCERR=$$L"_MCL_"^MCARAM2(.MCA,MCD)") X MCTR S MCCD=MCLT Q:+MCERR>0 MCERR Q 0
- ;fill diagnosis array
- I MCL>12 S MCERR=$$DGCT^MCARAM4(.MCA,MCD,MCL),MCCD=MCLT I +MCERR>0 Q MCERR
- Q 0
- ;
- TRAP ;entry from MCARASE
- K ^LA("LOCK",TSK) S T=TSK D SET^MCARASE
- S ^LA(TSK,"Q")=0 D ERROR^MCARASE
- G @(U_LANM)
- ;
- ORPRM(MCPRO) ;Get print name for ECG procedure
- ;USAGE: S X=$$ORPRM(MCPRO)
- ;WHERE: X = print name for ECG procedure/subspecialty
- ; MCPRO = EKG procedure number from Procedure/Subspecialty file
- I '$D(MCOEON) D ORDER^MCPARAM I '$D(MCOEON) Q ""
- Q $P(^MCAR(697.2,MCPRO,0),U,8)
- ;
- HSHAKE ; MUSE dialog, called by LAB which executes HANDSHAKE fld of AI file
- ; Does checksum on MUSE input, sets OUT to ACK or NAK
- I IN="BYE" S OUT="" K MCSM Q
- I IN="HELLO" S T=T-BASE,OUT="ACK" K MCSM
- I IN?.E1.A.E N MCI S MCSM=0 F MCI=1:1:$L(IN) S MCSM=MCSM+$A(IN,MCI)
- I IN?1.5N,$D(MCSM) S T=T-BASE S:MCSM'=IN OUT="NAK" S:MCSM=IN OUT="ACK" K MCSM
- K MCI Q
- QUIT L +^LA(TSK) H 1
- K ^LA(TSK)
- L -^LA(TSK)
- K ^LA("LOCK",TSK)
- D DQ^%ZTLOAD
- S:$D(ZTQUEUED) ZTREQ="@" K ZTSK
- Q
- MCARAM ;WASH ISC/JKL-MUSE AUTO INSTRUMENT DATA LOAD INTO DHCP ;5/28/96 14:53
- +1 ;;2.3;Medicine;;09/13/1996
- +2 ;
- +3 ;
- START ; Driver for MUSE-run by task manager
- +1 ; WHERE: LANM,TSK,MCINST,T are required for MCARASE
- +2 ; LANM = routine name, T and TSK = auto instrument IEN,
- +3 ; MCINST = auto instrument name
- +4 ; MCL = data type line number, MCLT = data transmission line number
- +5 ; MCD = one line of lab data, MCA = array of local data,
- +6 ; MCE = internal record number of EKG file where data is stored
- +7 ; MCRD = attempts to read lab data
- +8 ; MCCD= current data transmission number
- +9 ; MCPRO= EKG procedure number from Procedure/Subspecialty file
- +10 NEW LANM,TSK,MCINST,T,MCL,MCLT,MCA,MCCD,MCCNT,MCE,MCERR,MCRD,MCPRO,MCPRNM
- +11 NEW MCS,MCTOT,MCTYPE,MCZ,MCREC
- +12 SET LANM=$TEXT(+0)
- SET TSK=$ORDER(^LAB(62.4,"C",LANM,0))
- SET U="^"
- IF TSK=""
- QUIT
- +13 ; Quit if no MUSE data
- +14 IF '$DATA(^LA(TSK,"I",0))
- QUIT
- +15 SET MCINST=$PIECE(^LAB(62.4,TSK,0),U)
- DO ^MCARASE
- IF 'TSK
- QUIT
- +16 SET @TRAP
- +17 ;initial error condition
- +18 SET MCA("ERR")=0
- +19 ;get EKG procedure number from Procedure/Subspecialty file
- +20 SET MCPRO=$ORDER(^MCAR(697.2,"C","MCAR(691.5",0))
- +21 ;print name for ECG procedure, type of transmission
- +22 SET MCPRNM=$$ORPRM(MCPRO)
- SET MCTYPE="M"
- +23 ;delay process until record data is complete
- +24 DO DELPRO
- +25 ;
- READ SET MCRD=0
- SET MCL=0
- SET MCCD=-1
- SET MCA("CONT")="@"
- +1 IF ^LA(TSK,"I",0)'=0
- SET MCLT=^LA(TSK,"I",0)+1
- SET MCCD=MCLT-1
- +2 DO IN
- GOTO QUIT
- IN SET MCLT=^LA(TSK,"I",0)+1
- IF '$DATA(^(MCLT))
- SET MCRD=MCRD+1
- IF MCRD>6
- QUIT
- HANG 8
- GOTO IN
- +1 SET ^LA(TSK,"I",0)=MCLT
- SET MCRD=0
- SET MCERR=0
- +2 IF '$DATA(MCREC)
- FOR MCZ=1:1
- IF '$DATA(^LA(TSK,"I",MCLT+MCZ))
- DO DELPRO
- IF ($DATA(^LA(TSK,"I",MCLT+MCZ))#2)
- IF ((^LA(TSK,"I",MCLT+MCZ)["EOR")!(^LA(TSK,"I",MCLT+MCZ)["ERR")!(^LA(TSK,"I",MCLT+MCZ)["BYE"))
- SET MCREC=""
- QUIT
- +3 IF '$DATA(MCA("ERR"))
- SET MCA("ERR")=0
- +4 ;ignore set if retransmit set of data lines
- +5 IF $DATA(^LA(TSK,"I",MCLT+3))
- IF ^LA(TSK,"I",MCLT+3)=^LA(TSK,"I",MCLT)
- IF ^LA(TSK,"I",MCLT)?.E1.A.E
- SET MCCD=MCCD+3
- SET ^LA(TSK,"I",0)=MCLT+2
- GOTO IN
- +6 ;check for start of transmission-suppressed H
- +7 IF $EXTRACT(^LA(TSK,"I",MCLT),1,5)="HELLO"
- SET MCCD=MCLT-3
- +8 ;check for start of transmission-IRM
- +9 IF $EXTRACT(^LA(TSK,"I",MCLT),1,3)="IRM"
- SET MCCD=MCLT-3
- +10 ;transfer one line of lab data to local array
- +11 IF MCCD+3=MCLT
- SET MCERR=$$RLAB^MCARAM(.MCA,.MCL,MCLT)
- +12 ;transmission error
- +13 IF +MCERR=5
- KILL MCA,MCERR,MCREC
- NEW MCA,MCERR
- GOTO IN
- +14 ;transfer local array data into DHCP
- +15 ;record successful or unsuccessful data transfer attempt
- +16 IF +MCERR=10
- IF $$GRERR^MCARAM7(.MCA)=0
- SET MCERR=$$LDHCP^MCARAM3(.MCA,.MCE)
- SET MCERR=$$KPERR^MCARAM7(.MCA,.MCS)
- KILL MCA,MCERR,MCE,MCS,MCREC
- NEW MCA,MCERR,MCE,MCS
- +17 GOTO IN
- +18 ;
- DELPRO ;delay process until record data is complete
- +1 SET MCCNT=0
- DELP IF $DATA(^LA(TSK,"I"))
- SET MCTOT=^LA(TSK,"I")
- SET MCCNT=MCCNT+1
- HANG 15
- IF MCTOT=^LA(TSK,"I")
- IF MCCNT<7
- GOTO DELP
- +1 KILL MCTOT,MCCNT
- +2 QUIT
- +3 ;
- +4 ;
- OUT SET MCLT=^LA(TSK,"O")+1
- SET ^("O")=MCLT
- SET ^("O",MCLT)=OUT
- +1 LOCK +^LA("Q")
- SET Q=^LA("Q")+1
- SET ^("Q")=Q
- SET ^("Q",Q)=TSK
- LOCK -^LA("Q")
- QUIT
- +2 QUIT
- +3 ;
- +4 ;
- RLAB(MCA,MCL,MCLT) ; Read Lab data and place in local array
- +1 ; USAGE: S X=$$RLAB^MCARAM(.A,.B,C)
- +2 ; WHERE: .A=Array into which data is placed
- +3 ; .B=Data type line number
- +4 ; C=Data transmission line number
- +5 ;
- +6 ;lab data
- +7 SET MCD=^LA(TSK,"I",MCLT)
- +8 IF ($EXTRACT(MCD,1,5)="HELLO")!($EXTRACT(MCD,1,3)="EOT")
- SET MCL=0
- SET MCA("CONT")="@"
- SET MCCD=MCLT-1
- QUIT 0
- +9 IF $EXTRACT(MCD,1,3)="BYE"
- SET MCL=0
- SET MCA("CONT")="@"
- SET MCCD=MCLT-2
- QUIT 0
- +10 IF $EXTRACT(MCD,1,3)="IRM"
- SET MCL=0
- SET MCA("CONT")="@"
- SET MCCD=MCLT
- QUIT 0
- +11 IF $EXTRACT(MCD,1,3)="EOR"
- SET MCERR="10-End of record"
- SET MCCD=MCLT
- QUIT MCERR
- +12 IF $EXTRACT(MCD,1,3)="ERR"
- SET MCERR="5-Transmission error-expect retry of record"
- SET MCL=0
- SET MCA("CONT")="@"
- SET MCCD=MCLT-1
- QUIT MCERR
- +13 SET MCL=MCL+1
- SET MCA("CONT")=$CHAR($ASCII(MCA("CONT"))+1)
- +14 ;transfer lab data to local
- +15 IF MCL<13
- SET MCTR=$SELECT(MCL<7:"S MCERR=$$L"_MCL_"^MCARAM1(.MCA,MCD)",MCL=12:"S MCERR=$$L"_MCL_"^MCARAM3(.MCA,MCD)",MCL>6:"S MCERR=$$L"_MCL_"^MCARAM2(.MCA,MCD)")
- XECUTE MCTR
- SET MCCD=MCLT
- IF +MCERR>0
- QUIT MCERR
- QUIT 0
- +16 ;fill diagnosis array
- +17 IF MCL>12
- SET MCERR=$$DGCT^MCARAM4(.MCA,MCD,MCL)
- SET MCCD=MCLT
- IF +MCERR>0
- QUIT MCERR
- +18 QUIT 0
- +19 ;
- TRAP ;entry from MCARASE
- +1 KILL ^LA("LOCK",TSK)
- SET T=TSK
- DO SET^MCARASE
- +2 SET ^LA(TSK,"Q")=0
- DO ERROR^MCARASE
- +3 GOTO @(U_LANM)
- +4 ;
- ORPRM(MCPRO) ;Get print name for ECG procedure
- +1 ;USAGE: S X=$$ORPRM(MCPRO)
- +2 ;WHERE: X = print name for ECG procedure/subspecialty
- +3 ; MCPRO = EKG procedure number from Procedure/Subspecialty file
- +4 IF '$DATA(MCOEON)
- DO ORDER^MCPARAM
- IF '$DATA(MCOEON)
- QUIT ""
- +5 QUIT $PIECE(^MCAR(697.2,MCPRO,0),U,8)
- +6 ;
- HSHAKE ; MUSE dialog, called by LAB which executes HANDSHAKE fld of AI file
- +1 ; Does checksum on MUSE input, sets OUT to ACK or NAK
- +2 IF IN="BYE"
- SET OUT=""
- KILL MCSM
- QUIT
- +3 IF IN="HELLO"
- SET T=T-BASE
- SET OUT="ACK"
- KILL MCSM
- +4 IF IN?.E1.A.E
- NEW MCI
- SET MCSM=0
- FOR MCI=1:1:$LENGTH(IN)
- SET MCSM=MCSM+$ASCII(IN,MCI)
- +5 IF IN?1.5N
- IF $DATA(MCSM)
- SET T=T-BASE
- IF MCSM'=IN
- SET OUT="NAK"
- IF MCSM=IN
- SET OUT="ACK"
- KILL MCSM
- +6 KILL MCI
- QUIT
- QUIT LOCK +^LA(TSK)
- HANG 1
- +1 KILL ^LA(TSK)
- +2 LOCK -^LA(TSK)
- +3 KILL ^LA("LOCK",TSK)
- +4 DO DQ^%ZTLOAD
- +5 IF $DATA(ZTQUEUED)
- SET ZTREQ="@"
- KILL ZTSK
- +6 QUIT