open-insight/LSL2/STPROC/COMM_RDS_TEST.txt
Stieber Daniel (CSC FI SPS MESLEO) 87d79edef8 Merged PR 11670: Fixed min row limit issue causing cells to be colored incorrectly. Fixed shee...
Fixed min row limit issue causing cells to be colored incorrectly. Fixed sheet rho units in rds test modules
2025-02-27 00:22:27 +01:00

2380 lines
73 KiB
Plaintext

COMPILE FUNCTION Comm_RDS_Test(Instruction, Parm1, Parm2)
#pragma precomp SRP_PreCompiler
/*
Commuter module for RDS_Test Window
02/17/2006 - John C. Henry, J.C. Henry & Co., Inc.
01/12/2023 - djs - Updated the refresh subroutine to disable TW_USE related controls for EpiPro
RDSs as EpiPro records test wafers at the EpiPro Load Run Configuration dialog.
*/
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, Center_Window,Print_Vend_CofA, SPC_Services
DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, Btree.Extract, obj_AppWindow, Msg,Post_Event
DECLARE SUBROUTINE obj_WO_Mat, obj_TW_Use, Forward_Event, Error_Services, Database_Services, Logging_Services
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Center_Window, Popup, Collect.Ixvals, MemberOf
DECLARE FUNCTION Send_Message, obj_RDS_Test, Send_Message, RDS_Comm, Start_Window, Msg, Create_Dialog, obj_WO_Mat
DECLARE FUNCTION obj_TW_Use, Environment_Services, Get_EventStatus, Logging_Services, Database_Services
DECLARE FUNCTION SPC_Services, Error_Services, RDS_Services
$INSERT RDS_LAYER_EQUATES
$INSERT RDS_EQU
$INSERT RDS_TEST_EQUATES
$INSERT REACT_RUN_EQUATES
$INSERT RECIPE_PARMS_EQU
$INSERT REACT_STATUS_EQUATES
$INSERT POPUP_EQUATES
$INSERT LOGICAL
$INSERT DICT_EQUATES
$INSERT APPCOLORS
$INSERT LSL_USERS_EQU
$INSERT MSG_EQUATES
$INSERT TW_USE_EQUATES
$INSERT SPC_QUEUE_EQUATES
EQU CRLF$ TO \0D0A\
EQU SHEETRHO_SPEC_UNITS$ TO \EA2FDC\
EQU RES_SPEC_UNITS$ TO \EA2D636D\
EQU TAB$ TO CHAR(9)
EQU EDITABLE$ TO 4
EQU PROTECTED$ TO 8
EQU HIDDEN$ TO 32
EQU COL$TW_QTY TO 1
EQU COL$TW_CODE TO 2
EQU COL$TW_USAGE_DESC TO 3
EQU COL$TW_TOOL TO 4
EQU COL$TW_TYPE TO 5
EQU COL$TW_SIG TO 6
EQU COL$TW_SIG_DTM TO 7
EQU COL$TW_HRS_SINCE_PROD TO 8
EQU COL$TW_HRS_ESC TO 9
EQU COL$TW_WAFER_ID TO 10
EQU COL$TW_USE_ID TO 11
EQU COL$USE_NO TO 1
EQU COL$QTY TO 2
EQU COL$CODE TO 3
EQU COL$DESC TO 4
EQU COL$TOOL TO 5
EQU COL$TYPE TO 6
EQU COL$SIGNATURE TO 7
EQU COL$SIG_DTM TO 8
EQU COL$WAFER_ID TO 9
ErrTitle = 'Error in Comm_RDS_Test'
ErrorMsg = ''
Result = ''
BEGIN CASE
CASE Instruction = 'Create' ; GOSUB Create
CASE Instruction = 'Read' ; GOSUB Read
CASE Instruction = 'Clear' ; GOSUB Clear
CASE Instruction = 'Refresh' ; GOSUB Refresh
CASE Instruction = 'Write' ; GOSUB Write
CASE Instruction = 'Delete' ; GOSUB Delete
CASE Instruction = 'Close' ; GOSUB Close
CASE Instruction = 'SYSMSG' ; GOSUB SYSMSG
CASE Instruction = 'ReadingsLF' ; GOSUB ReadingsLF
CASE Instruction = 'ReadingsPC' ; GOSUB ReadingsPC
CASE Instruction = 'ReadingsDel' ; GOSUB ReadingsDel
CASE Instruction = 'ReadingsIns' ; GOSUB ReadingsIns
CASE Instruction = 'TWOptions' ; GOSUB TWOptions
CASE Instruction = 'TWUseDC' ; GOSUB TWUseDC
CASE Instruction = 'TWPC' ; GOSUB TWPC
CASE Instruction = 'TWLF' ; GOSUB TWLF
CASE Instruction = 'TWDel' ; GOSUB TWDel
CASE Instruction = 'OverRide' ; GOSUB OverRide
CASE Instruction = 'CopyTSLine' ; GOSUB CopyTSLine
CASE Instruction = 'AddSRP' ; GOSUB AddSRP
CASE Instruction = 'ViewSRP' ; GOSUB ViewSRP
CASE Instruction = 'InsertSRP' ; GOSUB InsertSRP
CASE Instruction = 'RemoveSRP' ; GOSUB RemoveSRP
CASE Instruction = 'ThickDC' ; GOSUB ThickDC
CASE Instruction = 'SendSPC' ; GOSUB SendSPC
CASE Instruction = 'NewTWUse' ; GOSUB NewTWUse
CASE 1
ErrorMsg = 'Unknown Instruction passed to routine.'
ErrMsg(ErrorMsg)
END CASE
RETURN Result
* * * * * * *
Create:
* * * * * * *
Center_Window(@WINDOW)
IF Parm1 NE '' THEN
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:Parm1)
END
UserGroups = XLATE( 'LSL_USERS', @USER4 , LSL_USERS_GROUPS$, 'X' )
AddNewSRPButton = 0
LOCATE 'ENGINEERING' IN UserGroups USING @VM SETTING Dummy THEN
AddNewSRPButton = 1
END ELSE
LOCATE 'MASTER' IN UserGroups USING @VM SETTING Dummy THEN
AddNewSRPButton = 1
END
END
IF MemberOf(@USER4, 'OI_SUPERUSER') THEN
AddNewSRPButton = 1
Set_Property(@WINDOW:'.TEST_POINT_MAP','VISIBLE',1)
Set_Property(@WINDOW:'.TEST_POINT_MAP_LABEL','VISIBLE',1)
Set_Property(@WINDOW:'.SEND_SPC','VISIBLE',1)
Set_Property(@WINDOW:'.SPC_DTM','VISIBLE',1)
END ELSE
Set_Property(@WINDOW:'.TEST_POINT_MAP','VISIBLE',0)
Set_Property(@WINDOW:'.TEST_POINT_MAP_LABEL','VISIBLE',0)
Set_Property(@WINDOW:'.SEND_SPC','VISIBLE',1) ;* Chad is ready to go live 3/11/2010 JCH
Set_Property(@WINDOW:'.SPC_DTM','VISIBLE',1)
END
// Deprecated control per the information on the form. Preventing button from becoming visible - dmb - 07/03/2018 - [IREPIOI-50]
* Set_Property(@WINDOW:'.ADD_SRP_BUTTON','VISIBLE',AddNewSRPButton)
MeasureUnits = XLATE('LISTBOX_CONFIG','UNITS','','X')
CONVERT @VM TO @FM IN MeasureUnits
Set_Property(@WINDOW:'.SPEC_THICK_UNITS','LIST',MeasureUnits)
Set_Property(@WINDOW:'.SPEC_RES_UNITS','LIST',MeasureUnits)
Set_Property(@WINDOW:'.SPEC_CON_UNITS','LIST',MeasureUnits)
Set_Property(@WINDOW:'.SPEC_CRES_UNITS','LIST',MeasureUnits)
* Build @ET_SYMBOLICS data structure for window
ETSymbolics = ''
EditTables = Utility ('OBJECTLIST', @WINDOW, 'EDITTABLE')
FOR I = 1 TO COUNT(EditTables,@FM) + (EditTables NE '')
EditTable = EditTables<I>
CtrlCols = Get_Property(EditTable,'COLUMN')
CtrlTables = Get_Property(EditTable, 'TABLE')
LastTable = ''
FOR N = 1 TO COUNT(CtrlCols,@SVM) + (CtrlCols NE '')
CtrlCol = CtrlCols<1,1,N>
TableName = CtrlTables<1,1,N>
IF TableName NE '' THEN
IF TableName NE LastTable THEN
DictStruct = XLATE('DICT.':TableName,'%FIELDS%','','X')
LastTable = TableName
END
LOCATE CtrlCol IN DictStruct<FIELDS_NAME$> USING @VM SETTING Pos THEN
IF DictStruct<FIELDS_TYPE$,Pos> = 'S' THEN
LOCATE EditTable IN ETSymbolics<1> USING @VM SETTING ETPos ELSE
ETSymbolics = INSERT(ETSymbolics,1,ETPos,0,EditTable)
END
ETSymbolics<2,ETPos,-1> = N ;* Add Column Number to the list
END
END
END
NEXT N
NEXT I
Set_Property(@WINDOW,'@ET_SYMBOLICS',ETSymbolics)
GOSUB Refresh
RETURN
* * * * * * *
Clear:
* * * * * * *
GOSUB Refresh
RETURN
* * * * * * *
Read:
* * * * * * *
CurrRecord = Get_Property(@WINDOW,'RECORD')
Set_Property(@WINDOW,'@ORG_RECORD',CurrRecord)
* Send_Event(@Window : '.THICK_READINGS', 'POSCHANGED')
* Send_Event(@Window : '.SHEETRHO_READINGS', 'POSCHANGED')
* Send_Event(@Window : '.RES_READINGS', 'POSCHANGED')
* Send_Event(@Window : '.HGCV1_READINGS', 'POSCHANGED')
* IOOptions = Get_Property(@Window, 'IOOPTIONS')
* IOOptions<6> = 1
* Set_Property(@Window, 'IOOPTIONS', IOOptions)
* Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','1')
* Send_Event(@Window, 'WRITE')
* IOOptions<6> = 0
* Set_Property(@Window, 'IOOPTIONS', IOOptions)
* * * * * * *
Refresh:
* * * * * * *
/*
CtrlEntID = @WINDOW:'.WFR_USAGE'
TWArray = Get_Property(CtrlEntID,'DEFPROP')
TestVals = TWArray<COL$TW_USE_ID>
CONVERT @VM TO '' IN TestVals
IF TestVals NE '' THEN
Set_Property(@WINDOW:'.WFR_USAGE','VISIBLE',0)
Set_Property(@WINDOW:'.TW_USE','VISIBLE',1)
END ELSE
Set_Property(@WINDOW:'.WFR_USAGE','VISIBLE',1)
Set_Property(@WINDOW:'.TW_USE','VISIBLE',0)
END
*/
IF MemberOf(@USER4,'OI_ADMIN') THEN
Set_Property(@WINDOW:'.DELETE_BUTTON_FIX','VISIBLE',1)
END ELSE
Set_Property(@WINDOW:'.DELETE_BUTTON_FIX','VISIBLE',0)
END
InjectPcnt = Get_Property(@WINDOW:'.INJECT_PCNT','DEFPROP')
CONVERT '%' TO '' IN InjectPcnt
IF ABS(InjectPcnt) > 4.0 THEN
Set_Property(@WINDOW:'.INJECT_PCNT','BACKCOLOR',KEY_YELLOW$)
END ELSE
Set_Property(@WINDOW:'.INJECT_PCNT','BACKCOLOR',INP_BLUE$)
END
DepTmPcnt = Get_Property(@WINDOW:'.DEP_TM_PCNT','DEFPROP')
CONVERT '%' TO '' IN DepTmPcnt
IF ABS(DepTmPcnt) > 4.0 THEN
Set_Property(@WINDOW:'.DEP_TM_PCNT','BACKCOLOR',KEY_YELLOW$)
END ELSE
Set_Property(@WINDOW:'.DEP_TM_PCNT','BACKCOLOR',INP_BLUE$)
END
IF Get_Property(@WINDOW:'.SPC_DTM','DEFPROP') = '' THEN
Set_Property(@WINDOW:'.SEND_SPC','TEXT','Send to SPC')
END ELSE
Set_Property(@WINDOW:'.SEND_SPC','TEXT','Resend to SPC')
END
LSId = Get_Property(@WINDOW:'.LS_ID','TEXT')
BEGIN CASE
CASE LSId = 'L1'
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',RCV_BLUE$)
CASE LSId = 'L2'
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',PRE_BLUE$)
CASE LSId = '2'
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',INP_BLUE$)
CASE 1
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',GREEN$)
END CASE
DataPointList = Get_Property(@WINDOW:'.TEST_POINTS','DEFPROP')
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE_IN','TEXT') ;* Hidden control without any conversion on it
PSNo = Get_Property(@WINDOW:'.PS_NO','DEFPROP')
ThickFilmMet = Get_Property(@WINDOW:'.THICKFILM_MET','CHECK')
Ctrls = @WINDOW:'.THICK_READINGS':@RM:@WINDOW:'.SHEETRHO_READINGS':@RM:@WINDOW:'.HGCV1_READINGS'
Props = 'BACKCOLOR':@RM:'BACKCOLOR':@RM:'BACKCOLOR'
* * * * *
EpiPROCtrls = @WINDOW:'.INJECT_FLOW_LABEL':@RM ; EpiPROProps = 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.INJECT_FLOW':@RM ; EpiPROProps := 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.SUGG_INJECT_FLOW_LABEL':@RM ; EpiPROProps := 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.SUGG_INJECT_FLOW':@RM ; EpiPROProps := 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.INJECT_PCNT_LABEL':@RM ; EpiPROProps := 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.INJECT_PCNT':@RM ; EpiPROProps := 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.SUGG_DEP_TM_LABEL':@RM ; EpiPROProps := 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.SUGG_DEP_TM':@RM ; EpiPROProps := 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.DEP_TM_PCNT_LABEL':@RM ; EpiPROProps := 'VISIBLE':@RM
EpiPROCtrls := @WINDOW:'.DEP_TM_PCNT' ; EpiPROProps := 'VISIBLE'
IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
EpiPROVals = STR('0':@RM,10)
END ELSE
EpiPROVals = STR('1':@RM,10)
END
EpiPROVals[-1,1]= '' ;* Trim trailing @RM
Set_Property(EpiPROCtrls,EpiPROProps,EpiPROVals)
* * * * *
HalfCtrls = @WINDOW:'.SMALL_DELTA_DP_GROUP':@RM ; HalfProps = 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.HALF_SUGG_DEP_TM':@RM ; HalfProps := 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.HALF_SUGG_DEP_TM_LABEL':@RM ; HalfProps := 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.HALF_DEP_TM_PCNT':@RM ; HalfProps := 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.HALF_DEP_TM_PCNT_LABEL':@RM ; HalfProps := 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.SMALL_DELTA_INJ_GROUP':@RM ; HalfProps := 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.HALF_SUGG_INJECT':@RM ; HalfProps := 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.HALF_SUGG_INJECT_LABEL':@RM ; HalfProps := 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.HALF_INJECT_PCNT':@RM ; HalfProps := 'VISIBLE':@RM
HalfCtrls := @WINDOW:'.HALF_INJECT_PCNT_LABEL' ; HalfProps := 'VISIBLE'
IF Get_Property(@WINDOW:'.SMALL_REACTOR_DELTA','CHECK') = 1 THEN
HalfVals = STR('1':@RM,10)
END ELSE
HalfVals = STR('0':@RM,10)
END
HalfVals[-1,1]= '' ;* Trim trailing @RM
Set_Property(HalfCtrls,HalfProps,HalfVals)
* * * * *
SheetRhoStyles = Send_Message( @WINDOW:'.SHEETRHO_READINGS', "COLSTYLE", 0, '' )
ThickStyles = Send_Message( @WINDOW:'.THICK_READINGS', "COLSTYLE", 0, '' )
HgCv1Styles = Send_Message( @WINDOW:'.HGCV1_READINGS', "COLSTYLE", 0, '' )
IF ReactorType = 'EPP' OR ReactorType = 'P' OR ThickFilmMet = 1 THEN
* EpiPRO Reactor
Vals = GREEN$:@RM:GREEN$:@RM:GREEN$
ThickStyles<1> = BitOr(ThickStyles<1>,PROTECTED$ )
SheetRhoStyles<1> = BitOr(SheetRhoStyles<1>,PROTECTED$ )
HgCv1Styles <1> = BitOr(HgCv1Styles<1>, PROTECTED$ )
HgCvFlag = 0
END ELSE
* Regular Reactor
Vals = WHITE$:@RM ;* Thickness background
ThickStyles<1> = BitAnd(ThickStyles<1> , BitNot(PROTECTED$) ) ;* Thickness enabled
IF Get_Property(@WINDOW:'.SPEC_RES_MTOOL','TEXT') = 'HgCv' Then ;* OR Get_Property(@WINDOW:'.SPEC_CON_MTOOL','TEXT') = 'HgCv'
HgCvFlag = 1
Vals := GREEN$:@RM:WHITE$
SheetRhoStyles<1> = BitOr(SheetRhoStyles<1> , PROTECTED$ ) ;* Disable SheetRho table
HgCv1Styles <1> = BitAnd(HgCv1Styles<1>, BitNot(PROTECTED$) ) ;* Enable HgCv1 table
END ELSE
HgCvFlag = 0
Vals := WHITE$:@RM:GREEN$
SheetRhoStyles<1> = BitAnd(SheetRhoStyles<1> , BitNot(PROTECTED$) ) ;* Enable SheetRho table
HgCv1Styles <1> = BitOr(HgCv1Styles<1>, PROTECTED$ ) ;* Disable HgCv1 table
END
END
Savewarn = Get_Property(@Window, 'SAVEWARN')
If Savewarn EQ False$ then
ThisMetNo = Get_Property(@Window: '.MET_NO', 'TEXT')
ThisMetRec = Database_Services('ReadDataRow', 'RDS_TEST', ThisMetNo)
ResReadings = obj_RDS_Test('Resistivity',ThisMetNo:@RM:ThisMetRec:@RM:1)
for i = 1 to DCount(ResReadings, @VM)
ResReading = ResReadings<1,i>
ResReadings<1,i> = OConv(ResReading,'MD4Z')
Next i
Set_Property(@Window : '.RES_READINGS', 'ARRAY', ResReadings)
end
Set_Property(Ctrls,Props,Vals)
Send_Message( @WINDOW:'.SHEETRHO_READINGS', "COLSTYLE", 1, SheetRhoStyles )
Send_Message( @WINDOW:'.THICK_READINGS', "COLSTYLE", 1, ThickStyles )
Send_Message( @WINDOW:'.HGCV1_READINGS', "COLSTYLE", 1, HgCv1Styles )
LOCATE 'Center' IN DataPointList USING @VM SETTING CenterPoint ELSE
CenterPoint = 9
END
Send_Message(@WINDOW:'.TEST_POINTS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
WaferSize = Get_Property(@WINDOW:'.WAFER_SIZE','DEFPROP')
IF WaferSize NE '' THEN
BEGIN CASE
CASE WaferSize[1,' '] = '75'
FirstValidLine = 6
LastValidLine = 12
CASE WaferSize[1,' '] = '100'
FirstValidLine = 5
LastValidLine = 13
CASE WaferSize[1,' '] = '125'
FirstValidLine = 4
LastValidLine = 14
CASE WaferSize[1,' '] = '150'
FirstValidLine = 3
LastValidLine = 15
CASE 1
FirstValidLine = 1
LastValidLine = 17
END CASE
Set_Property(@Window:'.TEST_POINTS', 'MINROWLIMIT', 17)
Set_Property(@Window:'.THICK_READINGS', 'MINROWLIMIT', 17)
Set_Property(@Window:'.SHEETRHO_READINGS', 'MINROWLIMIT', 17)
Set_Property(@Window:'.RES_READINGS', 'MINROWLIMIT', 17)
IF FirstValidLine > 1 THEN
FOR I = 1 TO (FirstValidLine - 1)
Send_Message(@WINDOW:'.TEST_POINTS','COLOR_BY_POS',1,I,GREY$)
Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,GREY$)
Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,GREY$)
Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,GREY$)
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,GREY$)
NEXT I
FOR I = (LastValidLine + 1) TO 17
Send_Message(@WINDOW:'.TEST_POINTS','COLOR_BY_POS',1,I,GREY$)
Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,GREY$)
Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,GREY$)
Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,GREY$)
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,GREY$)
NEXT I
END
END
SpecType = Get_Property(@WINDOW:'.SPEC_TYPE','TEXT')
Set_Property(@WINDOW:'.SPEC_TYPE_LABEL','TEXT',SpecType)
IF Get_Property(@WINDOW:'.SPEC_RES_MOVERGROW','INVALUE') = 1 THEN
Set_Property(@WINDOW:'.THICK_OVERGROW_AVG','BACKCOLOR',YELLOW$)
END ELSE
Set_Property(@WINDOW:'.THICK_OVERGROW_AVG','BACKCOLOR',WHITE$)
END
SpecResUnits = Get_Property(@WINDOW:'.SPEC_RES_UNITS', 'DEFPROP')
BEGIN CASE
CASE SpecResUnits = SHEETRHO_SPEC_UNITS$
Vals = '0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1'
CASE SpecResUnits = RES_SPEC_UNITS$
Vals = '-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0'
CASE 1
Vals = '0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0'
END CASE
Ctrls = @WINDOW:'.SHEETRHO_AVG':@RM ; Props = 'ENABLED':@RM
Ctrls := @WINDOW:'.SHEETRHO_STDV':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.SHEETRHO_RANGE':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.SHEETRHO_RANGE_PCNT':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.SHEETRHO_UNIF':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.SHEETRHO_MIN':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.SHEETRHO_MAX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.RES_AVG':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.RES_STDV':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.RES_RANGE':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.RES_RANGE_PCNT':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.RES_UNIF':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.RES_MIN':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.RES_MAX' ; Props := 'ENABLED'
Set_Property(Ctrls,Props,Vals)
ReadCtrls = @WINDOW:'.THICK_READINGS':@RM:@WINDOW:'.SHEETRHO_READINGS':@RM:@WINDOW:'.RES_READINGS':@RM:@WINDOW:'.HGCV1_READINGS'
ReadProps = 'INVALUE':@RM:'INVALUE':@RM:'INVALUE':@RM:'INVALUE'
ReadVals = Get_Property(ReadCtrls,ReadProps)
ThickReads = ReadVals[1,@RM]
SheetRhoReads = ReadVals[COL2()+1,@RM]
ResReads = ReadVals[COL2()+1,@RM]
HgCv1Reads = ReadVals[COL2()+1,@RM]
LimitCtrls = @WINDOW:'.SPEC_THICK_MIN':@RM ; LimitProps = 'INVALUE':@RM
LimitCtrls := @WINDOW:'.SPEC_THICK_MAX':@RM ; LimitProps := 'INVALUE':@RM
LimitCtrls := @WINDOW:'.SPEC_RES_MIN':@RM ; LimitProps := 'INVALUE':@RM
LimitCtrls := @WINDOW:'.SPEC_RES_MAX' ; LimitProps := 'INVALUE'
Limits = Get_Property(LimitCtrls,LimitProps)
SpecThickMin = Limits[1,@RM]
SpecThickMax = Limits[COL2()+1,@RM]
SpecResMin = Limits[COL2()+1,@RM]
SpecResMax = Limits[COL2()+1,@RM]
ReadLineCnt = COUNT(ThickReads,@VM) + (ThickReads NE '')
ThickSpecFlag = 0
SheetRhoSpecFlag = 0
ResistivitySpecFlag = 0
HgCv1SpecFlag = 0
FOR I = 1 TO ReadLineCnt
ThickVal = ThickReads<1,I>
IF ThickVal NE '' THEN
ThickVal = IConv(ThickVal, "MD1")
IF ThickVal > SpecThickMax OR ThickVal < SpecThickMin THEN
Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,RED$)
ThickSpecFlag = 1
END ELSE
IF I = CenterPoint THEN
Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,ORANGE$)
END ELSE
Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,WHITE$)
END
END
END
IF SpecResUnits = SHEETRHO_SPEC_UNITS$ THEN
ResVal = SheetRhoReads<1,I>
IF ResVal NE '' THEN
ResVal = ResVal
IF ResVal > SpecResMax OR ResVal < SpecResMin THEN
Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,RED$)
SheetRhoSpecFlag = 1
END ELSE
IF I = CenterPoint THEN
Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,ORANGE$)
END ELSE
Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,WHITE$)
END
END
END
END
IF SpecResUnits = RES_SPEC_UNITS$ THEN
ResVal = ResReads<1,I>
IF ResVal NE '' THEN
* Spec is in MD3, Calculated value is in MD4 -> *10 is a multiplier to make the adjustment
* Added 7/1/2008 JCH
IF ResVal > SpecResMax*10 OR ResVal < SpecResMin*10 THEN
Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,RED$) ;* Changes the reading
ResistivitySpecFlag = 1
END ELSE
IF I = CenterPoint THEN
Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,ORANGE$)
END ELSE
Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,GREEN$)
END
END
END
HgCv1Val = HgCv1Reads<1,I>
IF HgCv1Val NE '' THEN
IF HgCv1Val > SpecResMax OR HgCv1Val < SpecResMin THEN
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,RED$) ;* Changes the reading
ResistivitySpecFlag = 1
END ELSE
IF I = CenterPoint THEN
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,ORANGE$)
END ELSE
IF HgCvFlag = 1 THEN
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,WHITE$)
END ELSE
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,GREEN$)
END
END
END
END
END
IF SpecResUnits = '' THEN
IF I = CenterPoint THEN
Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,ORANGE$)
Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,ORANGE$)
Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,ORANGE$)
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,ORANGE$)
END ELSE
Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,WHITE$)
Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,WHITE$)
Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,GREEN$)
Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,GREEN$)
END
END
NEXT I
ThickMinValue = Get_Property(@WINDOW:'.THICK_MIN','INVALUE')
ThickMaxValue = Get_Property(@WINDOW:'.THICK_MAX','INVALUE')
ThickMinValue = IConv(ThickMinValue, "MD1")
ThickMaxValue = IConv(ThickMaxValue, "MD1")
IF ThickMinValue < SpecThickMin AND ThickMinValue NE '' THEN
Set_Property(@WINDOW:'.THICK_MIN','BACKCOLOR',RED$)
ThickSpecFlag = 1
END ELSE
Set_Property(@WINDOW:'.THICK_MIN','BACKCOLOR',GREEN$)
END
IF ThickMaxValue > SpecThickMax AND ThickMaxValue NE '' THEN
Set_Property(@WINDOW:'.THICK_MAX','BACKCOLOR',RED$)
ThickSpecFlag = 1
END ELSE
Set_Property(@WINDOW:'.THICK_MAX','BACKCOLOR',GREEN$)
END
BEGIN CASE
CASE SpecResUnits = SHEETRHO_SPEC_UNITS$
ResMinValue = Get_Property(@WINDOW:'.SHEETRHO_MIN','INVALUE')
ResMaxValue = Get_Property(@WINDOW:'.SHEETRHO_MAX','INVALUE')
IF ResMinValue < SpecResMin AND ResMinValue NE ''THEN
Set_Property(@WINDOW:'.SHEETRHO_MIN','BACKCOLOR',RED$)
SheetRhoSpecFlag = 1
END ELSE
Set_Property(@WINDOW:'.SHEETRHO_MIN','BACKCOLOR',GREEN$)
END
IF ResMaxValue > SpecResMax AND ResMaxValue NE '' THEN
Set_Property(@WINDOW:'.SHEETRHO_MAX','BACKCOLOR',RED$)
SheetRhoSpecFlag = 1
END ELSE
Set_Property(@WINDOW:'.SHEETRHO_MAX','BACKCOLOR',GREEN$)
END
CASE SpecResUnits = RES_SPEC_UNITS$
ResMinValue = Get_Property(@WINDOW:'.RES_MIN','INVALUE')
ResMaxValue = Get_Property(@WINDOW:'.RES_MAX','INVALUE')
IF ResMinValue < SpecResMin*10 AND ResMinValue NE '' THEN
Set_Property(@WINDOW:'.RES_MIN','BACKCOLOR',RED$)
ResistivitySpecFlag = 1
END ELSE
Set_Property(@WINDOW:'.RES_MIN','BACKCOLOR',GREEN$)
END
IF ResMaxValue > SpecResMax*10 AND ResMaxValue NE '' THEN
Set_Property(@WINDOW:'.RES_MAX','BACKCOLOR',RED$)
ResistivitySpecFlag = 1
END ELSE
Set_Property(@WINDOW:'.RES_MAX','BACKCOLOR',GREEN$)
END
HgCv1MinValue = Get_Property(@WINDOW:'.HGCV1_RES_MIN','INVALUE')
HgCv1MaxValue = Get_Property(@WINDOW:'.HGCV1_RES_MAX','INVALUE')
IF HgCv1MinValue < SpecResMin AND HgCv1MinValue NE '' THEN
Set_Property(@WINDOW:'.HGCV1_RES_MIN','BACKCOLOR',RED$)
HgCv1SpecFlag = 1
END ELSE
Set_Property(@WINDOW:'.HGCV1_RES_MIN','BACKCOLOR',GREEN$)
END
IF HgCv1MaxValue > SpecResMax AND HgCv1MaxValue NE '' THEN
Set_Property(@WINDOW:'.HGCV1_RES_MAX','BACKCOLOR',RED$)
HgCv1SpecFlag = 1
END ELSE
Set_Property(@WINDOW:'.HGCV1_RES_MAX','BACKCOLOR',GREEN$)
END
CASE 1
Set_Property(@WINDOW:'.SHEETRHO_MIN','BACKCOLOR',GREEN$)
Set_Property(@WINDOW:'.SHEETRHO_MAX','BACKCOLOR',GREEN$)
Set_Property(@WINDOW:'.RES_MIN','BACKCOLOR',GREEN$)
Set_Property(@WINDOW:'.RES_MAX','BACKCOLOR',GREEN$)
Set_Property(@WINDOW:'.HGCV1_RES_MIN','BACKCOLOR',GREEN$)
Set_Property(@WINDOW:'.HGCV1_RES_MAX','BACKCOLOR',GREEN$)
END CASE
IF ThickSpecFlag OR SheetRhoSpecFlag OR ResistivitySpecFlag OR HgCv1SpecFlag THEN
Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',1)
END ELSE
Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',0)
END
* Reset OverRide enabled controls
ORCtrls = @WINDOW:'.SPEC_THICK_MIN':@RM:@WINDOW:'.SPEC_THICK_TARGET':@RM:@WINDOW:'.SPEC_THICK_MAX':@RM:@WINDOW:'.SPEC_THICK_UNITS':@RM
ORCtrls := @WINDOW:'.SPEC_RES_MIN':@RM:@WINDOW:'.SPEC_RES_TARGET':@RM:@WINDOW:'.SPEC_RES_MAX':@RM:@WINDOW:'.SPEC_RES_UNITS':@RM
ORCtrls := @WINDOW:'.SPEC_CON_MIN':@RM:@WINDOW:'.SPEC_CON_TARGET':@RM:@WINDOW:'.SPEC_CON_MAX':@RM:@WINDOW:'.SPEC_CON_UNITS':@RM
ORCtrls := @WINDOW:'.SPEC_CRES_MIN':@RM:@WINDOW:'.SPEC_CRES_TARGET':@RM:@WINDOW:'.SPEC_CRES_MAX':@RM:@WINDOW:'.SPEC_CRES_UNITS'
Props = STR('ENABLED':@RM,16) ; Props[-1,1] = ''
Vals = STR('0':@RM,16) ; Vals[-1,1] = ''
Set_Property(ORCtrls,Props,Vals)
Props = STR('BACKCOLOR':@RM,16) ; Props[-1,1] = ''
Vals = STR(GREEN$ :@RM,16) ; Vals[-1,1] = ''
Set_Property(ORCtrls,Props,Vals)
* Disable Test Wafer related controls for EpiPro Runs to eliminate confusion
* around whether or not TW_USE records need to be created in order to account
* for test wafers for SAP purposes. (EpiPro test wafers are accounted for
* at the load run configuration step within the RDS Load EpiPro operation.)
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
ReactType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
TWEnabled = (ReactType NE 'EPP')
Set_Property(@Window:'.NEW_TW_USE', 'ENABLED', TWEnabled)
Set_Property(@Window:'.COPY_TW_LINE', 'ENABLED', TWEnabled)
Set_Property(@Window:'.TW_USE', 'ENABLED', TWEnabled)
* QBF buttons
Ctrls = @WINDOW:'.QBF_FIRST_FIX':@RM ; Props = 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_STOP_FIX' ; Props := 'ENABLED'
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
Vals = 0:@RM:0:@RM:0:@RM:0:@RM:0:@RM:0
END ELSE
Vals = 1:@RM:1:@RM:1:@RM:1:@RM:1:@RM:1
END
Set_Property(Ctrls,Props,Vals)
* Turn edit table symbolic column backgrounds to green
ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow
ETCtrls = ETSymbolics<1>
ETCols = ETSymbolics<2>
FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
ETCtrl = ETCtrls<1,I>
IF ETCtrl NE @WINDOW:'.RES_READINGS' THEN
ETList = Get_Property(ETCtrl,'LIST')
FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
IF ETList<Line,1> NE '' THEN
FOR N = 1 TO COUNT(ETCols<1,I>,@SVM) + (ETCols<1,I> NE '')
stat = Send_Message(ETCtrl,'COLOR_BY_POS',ETCols<1,I,N>,Line,GREEN$)
NEXT N
END
NEXT I
END
NEXT I
RETURN
* * * * * * *
Write:
* * * * * * *
RDSTestKey = Get_Property(@WINDOW,'ID')
CurrRecord = Get_Property(@WINDOW,'RECORD')
OrgRecord = Get_Property(@WINDOW,'@ORG_RECORD')
IF CurrRecord<RDS_TEST_RDS_NO$> = '' OR CurrRecord<RDS_TEST_LS_ID$> = '' THEN
Result = 0
ErrMsg('This record may not be saved.')
RETURN
END
IF CurrRecord NE OrgRecord THEN
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
NewLine = @USER4:@VM:CurrDTM
Send_Message(@WINDOW:'.MODIFY_USER','INSERT',1,NewLine)
*Dummy = Msg(@WINDOW,'','SPC_REMINDER')
* Section added 2/21/2011 JCH - Synchronizes 'TW_USE' table with RDS_TEST
* Made live on 4/2/2011 JCH
END
// Ask the system event handler to attempt to write the row and then come back.
Forward_Event()
// Check to see if the MFS set an FS error. There are conditions that will prevent RDS_TEST data from being modified.
EventCode = ''
Error = Get_EventStatus(EventCode)
If Error then
// If EventCode contains error code FS104 then display our own message box.
ErrorNumber = EventCode[1, @VM]
ErrorMessage = EventCode[Col2() + 1, @VM]
If ErrorNumber EQ 'FS104' then
MsgStruct = ''
MsgStruct<MCOL$> = -1
MsgStruct<MROW$> = -1
// Users belonging to the SPEC_CHANGE security group will be allowed to override the block. However, these
// users must confirm that this is what they want.
If MemberOf(@User4, 'SPEC_CHANGE') then
Override = Msg(@Window, MsgStruct, 'YESNO', '', 'RDS Test' : @FM : ErrorMessage : @TM : @TM : 'Please confirm that you want to override.')
If Override EQ True$ then
Record = Get_Property(@Window, 'ATRECORD')
Record<RDS_TEST_MODIFY_OVERRIDE$> = True$
Database_Services('WriteDataRow', 'RDS_TEST', @ID, Record, True$, False$, False$)
FocusCtrl = Get_Property(@Window, 'FOCUS')
Set_Property(FocusCtrl, 'GOTFOCUS_VALUE', Get_Property(FocusCtrl, 'DEFPROP'))
Set_Property(@Window, 'SAVEWARN', False$)
IF Get_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE') THEN
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','0')
END ELSE
Post_Event(@WINDOW,'CLOSE')
END
end
end else
Msg(@Window, MsgStruct, 'OK', '', 'RDS Test' : @FM : ErrorMessage)
end
end
end else
IF Get_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE') THEN
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','0')
END ELSE
Post_Event(@WINDOW,'CLOSE')
END
end
// Set the result variable to 0 so the event chain does not continue. Both pre- and post-event handlers are done here.
Result = 0
RETURN
* * * * * * *
Delete:
* * * * * * *
IF MemberOf(@USER4,'OI_ADMIN') THEN
Result = Msg(@WINDOW,'','PRE_DELETE')
END ELSE
ErrMsg('Records may not be modified or deleted.')
Result = 0
END
RETURN
* * * * * * *
Close:
* * * * * * *
obj_Appwindow('DetailReturn')
RETURN
SYSMSG:
MsgCode = Parm1[1, @RM]
CancelFlag = Parm1[Col2() + 1, @RM]
StatCode = Parm1[Col2() + 1, @RM]
ErrorNumber = StatCode[1, @VM]
If ErrorNumber EQ 'FS104' then
// This means our custom logic in RDS_TEST_ACTIONS has blocked this row from being written. The WRITE event
// handler will display a custom message instead of the system.
Result = 0
end else
// Allow the system to handle this message (if any).
Result = 1
end
return
* * * * * * *
ReadingsLF:
* * * * * * *
CtrlName = Parm1
IF CtrlName = '' THEN
CurrCtrl = Get_Property(@WINDOW,'FOCUS')
END ELSE
CurrCtrl = @WINDOW:'.':CtrlName
END
FirstColumnData = Get_Property(CurrCtrl,'DEFPROP')
DataPointDist = Get_Property(@WINDOW:'.TEST_POINTS','DEFPROP')
LOCATE 'Center' IN DataPointDist USING @VM SETTING CenterPos ELSE CenterPos = 9 ;* This will break if the number of data points is increased above 17!
Readings = ''
TotalLineCnt = COUNT(FirstColumnData,@VM) + (FirstColumnData NE '')
FOR I = 1 TO TotalLineCnt
IF FirstColumnData<1,I> NE '' THEN Readings<1,-1> = FirstColumnData<1,I>
NEXT I
ReadingCnt = COUNT(Readings,@VM) + (Readings NE '')
IF ReadingCnt > 0 THEN
*IF Mod(ReadingCnt,2) = 0 THEN
* ErrMsg('Incorrect number of readings entered. 1,3,5,7,9,11,13,15 or 17 values must be entered.') ;* Dead on 11/29/2016 Added 10 wafer metrology DKK
* Set_Property('FOCUS',CtrlName,1)
* RETURN
*END ELSE
Set_Property(CurrCtrl,'DEFPROP',STR(@VM,16))
StartPos = CenterPos - (ReadingCnt - 1)*(.5)
Set_Property(@WINDOW,'@FIRST_READING_LINE',StartPos)
FOR I = 1 TO TotalLineCnt
IF I >= StartPos AND Readings NE '' THEN
Set_Property(CurrCtrl,'DEFPROP',Readings<1,1>,1:@FM:I)
Readings = DELETE(Readings,0,1,0)
END ELSE
Set_Property(CurrCtrl,'DEFPROP','',1:@FM:I)
END
NEXT I
*END
END
//Post_Event(@WINDOW:'.RES_READINGS','CALCULATE',1)
UpdatedRec = Get_Property(@Window, 'ATRECORD')
ThisMetNo = Get_Property(@Window: '.MET_NO', 'TEXT')
ResReadings = obj_RDS_Test('Resistivity',ThisMetNo:@RM:UpdatedRec:@RM:1)
for i = 1 to DCount(ResReadings, @VM)
ResReading = ResReadings<1,i>
ResReadings<1,i> = OConv(ResReading,'MD4Z')
Next i
Set_Property(@Window : '.RES_READINGS', 'ARRAY', ResReadings)
Send_Event(@WINDOW:'.GROWTH_RATE','CALCULATE')
* * * * * * *
ReadingsPC:
* * * * * * *
OrigRec = Get_Property(@Window, '@ORG_RECORD')
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
CtrlName = Parm1
IF CtrlName = '' THEN
CurrCtrl = Get_Property(@WINDOW,'FOCUS')
END ELSE
If Index(CtrlName, '.', 1) then
CurrCtrl = CtrlName
end else
CurrCtrl = @WINDOW:'.':CtrlName
end
END
//Problem line here. Removed 10/25/2024
//Send_Event(@WINDOW:'.RES_READINGS','CALCULATE')
UpdatedRec = Get_Property(@Window, 'ATRECORD')
ThisMetNo = Get_Property(@Window: '.MET_NO', 'TEXT')
ResReadings = obj_RDS_Test('Resistivity',ThisMetNo:@RM:UpdatedRec:@RM:1)
for i = 1 to DCount(ResReadings, @VM)
ResReading = ResReadings<1,i>
ResReadings<1,i> = OConv(ResReading,'MD4Z')
Next i
Set_Property(@Window : '.RES_READINGS', 'ARRAY', ResReadings)
Readings = Get_Property(CurrCtrl,'ARRAY')
Conversion = Get_Property(CurrCtrl,'CONV')<1,1,1>
IF CurrCtrl = 'RDS_TEST.SHEETRHO_READINGS' THEN Conversion = 'MD3'
Set_Status(0)
Stats = obj_RDS_Test('CalcStats',Readings:@RM:Conversion)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
UnQualCtrlName = FIELD(CurrCtrl,'.',2)
IF UnQualCtrlName = 'HGCV1_READINGS' THEN
CtrlPref = 'HGCV1_RES'
END ELSE
CtrlPref = UnQualCtrlName[1,'_']
END
Ctrls = @WINDOW:'.':CtrlPref:'_AVG':@RM ; Props = 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_STDV':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_UNIF':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_MIN':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_MAX':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_RANGE':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_RANGE_PCNT' ; Props := 'DEFPROP'
Set_Property(Ctrls,Props,Stats)
ResCtrl = @WINDOW:'.RES_READINGS'
IF CurrCtrl NE ResCtrl THEN
* Update the resistance statistics
Readings = Get_Property(ResCtrl,'ARRAY')
Conversion = Get_Property(ResCtrl,'CONV')<1,1,1>
testReadings = Readings
CONVERT @VM TO '' IN testReadings
Set_Status(0)
Stats = obj_RDS_Test('CalcStats',Readings:@RM:Conversion)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
UnQualCtrlName = FIELD(ResCtrl,'.',2)
CtrlPref = UnQualCtrlName[1,'_']
Ctrls = @WINDOW:'.':CtrlPref:'_AVG':@RM ; Props = 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_STDV':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_UNIF':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_MIN':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_MAX':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_RANGE':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.':CtrlPref:'_RANGE_PCNT' ; Props := 'DEFPROP'
Set_Property(Ctrls,Props,Stats)
END
Send_Event(@WINDOW:'.GROWTH_RATE','CALCULATE')
GOSUB Refresh
CalcRec = Get_Property(@Window, 'ATRECORD')
Savewarn = (OrigRec NE CalcRec)
Set_Property(@Window, 'SAVEWARN', Savewarn)
RETURN
* * * * * * *
ReadingsIns:
* * * * * * *
return
RowIndex = Parm1
CurrCtrl = Get_Property(@WINDOW,'FOCUS')
*Dummy = Send_Message(CurrCtrl, "DELETE", RowIndex) ;* Row Limit of 17 doesn't allow additional lines to be added
//ErrMsg('Rows may not be inserted or deleted.')
RETURN
* * * * * * *
ReadingsDel:
* * * * * * *
DeletedRowIndex = Parm1
DeletedRowText = Parm2
CurrCtrl = Get_Property(@WINDOW,'FOCUS')
Dummy = Send_Message(CurrCtrl, "INSERT",DeletedRowIndex, DeletedRowText)
ErrMsg('Rows may not be inserted or deleted.')
RETURN
* * * * * * *
SyncTestWafers:
* * * * * * *
* * * * * * Conversion routine to match up TW_USE with associated MV's in RDS_TEST * * * * * * * *
* * * * * * This will go away once conversion is completed. * * * * * * * *
ListCnt = COUNT(TWList,@FM) + (TWList NE '')
TWUseCodes = obj_TW_Use('Convert',MetNo:@RM:TWList) ;* Creates new TW_USE records and returns updated list of TWUseCodes
IF TWUseCodes NE TWArray<COL$TW_USE_ID> THEN
;* New TW_USED record created - update RDS_TEST record
TWArray<COL$TW_USE_ID> = TWUseCodes ;* Set Use ID column values
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
Set_Property(CtrlEntID,'DEFPROP',TWArray)
Send_Event (@WINDOW,'WRITE') ;* Write updated Met Rec to disk
Set_Property(@WINDOW:'.MET_NO','DEFPROP',MetNo)
Send_Event(@WINDOW:'.MET_NO','LOSTFOCUS') ;* Read Updated Met Rec From disk
END
RETURN
* * * * * * *
NewTWUse:
* * * * * * *
RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')
FQASigned = RDS_Services('GetFinalQAStatus', RDSNo)
RecordLocked = False$
RDSNo = Get_Property(@WINDOW:'.RDS_NO', 'DEFPROP')
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
* If WOMatKey NE '' then RecordLocked = Database_Services('IsKeyIDLocked', 'WO_MAT', WOMatKey, False$)
Begin Case
Case FQASigned EQ True$
// FQA Signed -> Block TW_USE creation/deletion/modification
ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
ErrMsg(ErrorMsg)
Return 0
Case RecordLocked EQ True$
LockOwner = Xlate('WO_MAT', WOMatKey, 'LOCKED_BY', 'X')
If LockOwner NE '' then
DisplayName = Oconv(LockOwner,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
end else
DisplayName = 'an unknown user'
end
MsgParms = ''
MsgParms<1> = 'Record Locked'
MsgParms<2> = 'The WO_MAT record for this RDS is locked by ':DisplayName:'. Only one user session at a time can edit an RDS.'
Msg(@Window, '', 'OK', '', MsgParms)
Return 0
Case Otherwise$
CtrlEntID = @WINDOW:'.TW_USE'
MetNo = Get_Property(@WINDOW,'ID')
IF MetNo = '' THEN RETURN
TW_UseNos = Get_Property(CtrlEntID,'ARRAY')<1> ;* Just need the first column
LastTW_UseNo = 0
DetItemCnt = COUNT(TW_UseNos,@VM) + (TW_UseNos NE '')
FOR I = 1 TO DetItemCnt
TW_UseNo = TW_UseNos<1,I>
IF TW_UseNo = '' THEN TW_UseNo = 0
IF TW_UseNo > LastTW_UseNo THEN LastTW_UseNo = TW_UseNo
NEXT I
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
Send_Event(@WINDOW,'WRITE')
TW_UseKey = MetNo:'*':LastTW_UseNo + 1
DetWindow = 'TW_USE'
DetKeys = TW_UseKey
DefaultRec = ''
RetKey = MetNo
RetWin = @WINDOW
RetPage = 1
RetCtrl = CtrlEntID
RetPos = 1:@FM:LastTW_UseNo + 1
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
End Case
* If FQASigned EQ False$ then
*
* CtrlEntID = @WINDOW:'.TW_USE'
* MetNo = Get_Property(@WINDOW,'ID')
* IF MetNo = '' THEN RETURN
* TW_UseNos = Get_Property(CtrlEntID,'ARRAY')<1> ;* Just need the first column
* LastTW_UseNo = 0
* DetItemCnt = COUNT(TW_UseNos,@VM) + (TW_UseNos NE '')
*
* FOR I = 1 TO DetItemCnt
* TW_UseNo = TW_UseNos<1,I>
* IF TW_UseNo = '' THEN TW_UseNo = 0
* IF TW_UseNo > LastTW_UseNo THEN LastTW_UseNo = TW_UseNo
* NEXT I
*
* Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
* Send_Event(@WINDOW,'WRITE')
*
* TW_UseKey = MetNo:'*':LastTW_UseNo + 1
* DetWindow = 'TW_USE'
* DetKeys = TW_UseKey
* DefaultRec = ''
* RetKey = MetNo
* RetWin = @WINDOW
* RetPage = 1
* RetCtrl = CtrlEntID
* RetPos = 1:@FM:LastTW_UseNo + 1
* obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
*
* end else
* // FQA Signed -> Block TW_USE creation/deletion/modification
* ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
* ErrMsg(ErrorMsg)
* Return 0
*
* end
RETURN
* * * * * * *
TWUseDC:
* * * * * * *
RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')
FQASigned = RDS_Services('GetFinalQAStatus', RDSNo)
RecordLocked = False$
RDSNo = Get_Property(@WINDOW:'.RDS_NO', 'DEFPROP')
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
* If WOMatKey NE '' then RecordLocked = Database_Services('IsKeyIDLocked', 'WO_MAT', WOMatKey, False$)
Begin Case
Case FQASigned EQ True$
// FQA Signed -> Block TW_USE creation/deletion/modification
ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
ErrMsg(ErrorMsg)
Return 0
Case RecordLocked EQ True$
LockOwner = Xlate('WO_MAT', WOMatKey, 'LOCKED_BY', 'X')
If LockOwner NE '' then
DisplayName = Oconv(LockOwner,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
end else
DisplayName = 'an unknown user'
end
MsgParms = ''
MsgParms<1> = 'Record Locked'
MsgParms<2> = 'The WO_MAT record for this RDS is locked by ':DisplayName:'. Only one user session at a time can edit an RDS.'
Msg(@Window, '', 'OK', '', MsgParms)
Return 0
Case Otherwise$
MetNo = Get_Property(@WINDOW,'ID')
CtrlEntID = @WINDOW:'.TW_USE'
CurrPos = Get_Property(CtrlEntID,'CARETPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
IF CurrCol = COL$USE_NO THEN
UseNo = Get_Property(CtrlEntID,'CELLPOS',COL$USE_NO:@FM:CurrRow)
IF MetNo NE '' AND UseNo NE '' THEN
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','1')
Send_Event(@WINDOW,'WRITE')
END
DetWindow = 'TW_USE'
DetKeys = MetNo:'*':UseNo
DefaultRec = ''
RetKey = MetNo
RetPage = 1
RetCtrl = CtrlEntID
RetPos = CurrPos
oAParms = DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos
obj_AppWindow('ViewNewDetail',oAParms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
END
END ;* End of ItemNo column
End Case
* If FQASigned EQ False$ then
*
* MetNo = Get_Property(@WINDOW,'ID')
* CtrlEntID = @WINDOW:'.TW_USE'
* CurrPos = Get_Property(CtrlEntID,'CARETPOS')
* CurrCol = CurrPos<1>
* CurrRow = CurrPos<2>
* IF CurrCol = COL$USE_NO THEN
* UseNo = Get_Property(CtrlEntID,'CELLPOS',COL$USE_NO:@FM:CurrRow)
* IF MetNo NE '' AND UseNo NE '' THEN
* IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
* Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','1')
* Send_Event(@WINDOW,'WRITE')
* END
* DetWindow = 'TW_USE'
* DetKeys = MetNo:'*':UseNo
* DefaultRec = ''
* RetKey = MetNo
* RetPage = 1
* RetCtrl = CtrlEntID
* RetPos = CurrPos
* oAParms = DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos
* obj_AppWindow('ViewNewDetail',oAParms)
* IF Get_Status(errCode) THEN
* ErrMsg(errCode)
* END
* END
* END ;* End of ItemNo column
*
* end else
*
* // FQA Signed -> Block TW_USE creation/deletion/modification
* ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
* ErrMsg(ErrorMsg)
* Return 0
*
* end
RETURN
* * * * * * *
TWOptions:
* * * * * * *
CtrlEntID = @WINDOW:'.WFR_USAGE'
CurrPos = Get_Property(CtrlEntID,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
MetNo = Get_Property(@WINDOW:'.MET_NO','DEFPROP')
TWList = Get_Property(CtrlEntID,'LIST')
TWArray = Get_Property(CtrlEntID,'DEFPROP')
CurrUseID = TWArray<COL$TW_USE_ID,CurrRow>
IF CurrUseID NE '' THEN
obj_AppWindow('ViewRelated','TW_USE':@RM:CurrUseID)
END
BEGIN CASE
CASE CurrCol = COL$TW_TYPE
Result = Popup(@WINDOW,'','TW_TYPES')
IF Result NE '' THEN
Parms = Result:@RM:CtrlEntId:@RM:CurrPos
obj_Appwindow('LUValReturn',Result:@RM:CtrlEntId:@RM:CurrPos )
END
CASE CurrCol = COL$TW_CODE
Result = Popup(@WINDOW,'','SHOW_TW_CODES')
IF Result NE '' THEN
Parms = Result:@RM:CtrlEntId:@RM:CurrPos
obj_Appwindow('LUValReturn',Result:@RM:CtrlEntId:@RM:CurrPos )
END
CASE CurrCol = COL$TW_TOOL
Result = Popup( @WINDOW, '', 'CHOOSE_TOOL' )
IF Result NE '' THEN
Parms = Result:@RM:CtrlEntId:@RM:CurrPos
obj_Appwindow('LUValReturn',Result:@RM:CtrlEntId:@RM:CurrPos )
END
END CASE
RETURN
* * * * * * *
TWPC:
* * * * * * *
RETURN ;******************************
CtrlEntID = Get_Property(@WINDOW,'FOCUS')
PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS")
PrevCol = PrevSelPos<1>
PrevRow = PrevSelPos<2>
CurrPos = Get_Property(CtrlEntId,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
ListData = Get_Property(CtrlEntId,'LIST')
MetNo = Get_Property(@WINDOW:'.MET_NO','TEXT')
ColCnt = 11
* LostFocus checks
IF ListData<PrevRow,PrevCol> NE '' THEN
BEGIN CASE
CASE PrevCol = COL$TW_CODE
TWCode = ListData<PrevRow,PrevCol>
IF RowExists('TW_CODES', TWCode) THEN
IF TWCode = '99' THEN
Parms = 'NA':@RM:CtrlEntId:@RM:COL$TW_TOOL:@FM:PrevRow ;* Added 'NA' defaults for signature line 11/14/2007 JCH
obj_Appwindow('LUValReturn',Parms)
Parms = 'NA':@RM:CtrlEntId:@RM:COL$TW_TYPE:@FM:PrevRow
obj_Appwindow('LUValReturn',Parms)
END
END ELSE
Mesg = 'Invalid Test Wafer Code Entered.':@TM:@TM
Mesg := 'Code ':QUOTE(TWCode):' not found in':@TM:'TestWafer Code Table!'
ErrMsg(Mesg)
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos) ;* Clear entered field
END
CASE PrevCol = COL$TW_TOOL
TWTool = ListData<PrevRow,PrevCol>
IF TWTool NE 'NA' THEN
AllTools = XLATE('LISTBOX_CONFIG','ALLTOOLS',1,'X')
LOCATE TWTool IN AllTools USING @VM SETTING Dummy ELSE
Mesg = 'Invalid TestWafer Tool Entered.':@TM:@TM
Mesg := 'Tool ':QUOTE(TWTool):' not found in LISTBOX_CONFIG table.':@TM:'ALLTOOLS record.'
ErrMsg(Mesg)
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos) ;* Clear entered field
END
END
CASE PrevCol = COL$TW_TYPE
TWType = ListData<PrevRow,PrevCol>
IF TWType NE 'NA' THEN
TWTypes = XLATE('SYSREPOSPOPUPS','LSL2**TW_TYPES',8,'X')
TypeCnt = COUNT(TWTypes,@VM) + (TWTypes NE '')
Found = 0
FOR N = 1 TO TypeCnt
IF TWTypes<1,N,1> = TWType THEN Found = 1
UNTIL Found
NEXT N
IF NOT(Found) THEN
Mesg = 'Invalid Test Wafer Type Entered.':@TM:@TM
Mesg := 'Tool ':QUOTE(TWType):' not found in TW_TYPES popup.':@TM:'ALLTOOLS record.'
ErrMsg(Mesg)
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos) ;* Clear entered field
END
END
END CASE
END
* Gotfocus checks
IF ListData<CurrRow,CurrCol> = '' AND CurrCol NE COL$TW_USAGE_DESC THEN
ColPointer = CurrCol
LinePointer = CurrRow
* Find the first non-empty cell
LOOP
Test = ListData<LinePointer,(ColPointer) >
UNTIL Test NE '' OR (LinePointer = 0 AND ColPointer = 1)
ColPointer -= 1
IF ColPointer = 0 THEN
ColPointer = ColCnt - 2
LinePointer -= 1
END
REPEAT
* Move one past the non empty cell
BEGIN CASE
CASE LinePointer = 0
* Empty Table
LinePointer = 1
ColPointer = 1
CASE ColPointer = ColCnt - 2
LinePointer += 1
ColPointer = 1
CASE 1
ColPointer += 1
END CASE
Set_Property(CtrlEntId,"SELPOS",ColPointer:@FM:LinePointer)
ToolCtrls = @WINDOW:'.SPEC_THICK_MTOOL':@RM ; ToolProps = 'DEFPROP':@RM
ToolCtrls := @WINDOW:'.SPEC_RES_MTOOL':@RM ; ToolProps := 'DEFPROP':@RM
ToolCtrls := @WINDOW:'.SPEC_CON_MTOOL':@RM ; ToolProps := 'DEFPROP':@RM
ToolCtrls := @WINDOW:'.SPEC_CRES_MTOOL' ; ToolProps := 'DEFPROP'
AvailTools = Get_Property(ToolCtrls,ToolProps)
CONVERT @RM TO @VM IN AvailTools
SWAP @VM:@VM WITH @VM IN AvailTools
TypeCtrls = @WINDOW:'.SPEC_THICK_MTYPE':@RM ; TypeProps = 'DEFPROP':@RM
TypeCtrls := @WINDOW:'.SPEC_RES_MTYPE':@RM ; TypeProps := 'DEFPROP':@RM
TypeCtrls := @WINDOW:'.SPEC_CON_MTYPE':@RM ; TypeProps := 'DEFPROP':@RM
TypeCtrls := @WINDOW:'.SPEC_CRES_MYPE' ; TypeProps := 'DEFPROP'
MTypeCtrls = @WINDOW:'.SPEC_THICK_MPROVEIN':@RM ; MTypeProps = 'DEFPROP':@RM
MTypeCtrls := @WINDOW:'.SPEC_RES_MPROVEIN':@RM ; MTypeProps := 'DEFPROP':@RM
MTypeCtrls := @WINDOW:'.SPEC_CON_MPROVEIN':@RM ; MTypeProps := 'DEFPROP':@RM
MTypeCtrls := @WINDOW:'.SPEC_CRES_MPROVEIN' ; MTypeProps := 'DEFPROP'
AvailTypes = Get_Property(TypeCtrls,TypeProps)
CONVERT @RM TO @VM IN AvailTypes
AvailMTypes = Get_Property(MTypeCtrls,MTypeProps)
CONVERT @RM TO @VM IN AvailMTypes
BEGIN CASE
CASE ColPointer = COL$TW_CODE
* Leave this null for now
CASE ColPointer = COL$TW_TOOL
IF ListData<CurrRow,CurrCol> = '' THEN
* Popup Tools
TypeOver = ''
TypeOver<PDISPLAY$> = AvailTools
Tool = Popup(@WINDOW,TypeOver,'RDS_SPEC_TOOLS')
IF Tool NE '' THEN
Parms = Tool:@RM:CtrlEntId:@RM:ColPointer:@FM:LinePointer
obj_Appwindow('LUValReturn',Parms)
END
END
CASE ColPointer = COL$TW_TYPE
IF ListData<CurrRow,CurrCol> = '' THEN
* Popup WaferTypes on this tools line
TypeCode = Popup(@WINDOW,'','TW_TYPES')
IF TypeCode NE '' THEN
Parms = TypeCode:@RM:CtrlEntId:@RM:ColPointer:@FM:LinePointer
obj_Appwindow('LUValReturn',Parms)
END
END
CASE ColPointer = COL$TW_SIG
IF ListData<CurrRow,CurrCol> = '' THEN
Valid = Dialog_Box( 'QUOTE_SIG_PWD_ENTRY', @WINDOW, @USER4:@VM:XLATE( 'LSL_USERS', @USER4, LSL_USERS_PASSWORD$, 'X' ) )
IF Valid THEN
Parms = @USER4:@RM:CtrlEntId:@RM:ColPointer:@FM:LinePointer ;* Username
obj_Appwindow('LUValReturn',Parms )
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
Parms = CurrDTM:@RM:CtrlEntId:@RM:ColPointer+1:@FM:LinePointer ;* Date-Time Stamp
obj_Appwindow('LUValReturn',Parms )
CurrDTM = ICONV(CurrDTM,'DT')
ReactNo = Get_Property(@WINDOW:'.REACTOR','DEFPROP')
OutOfProdDTM = XLATE('REACT_STATUS',ReactNo,REACT_STATUS_OUT_OF_PROD_DTM$,'X')
HrsSinceProd = OCONV((CurrDTM - OutOfProdDTM)*24,'MD2')
Parms = HrsSinceProd:@RM:CtrlEntId:@RM:ColPointer+2:@FM:LinePointer ;* Hours Since Production
obj_Appwindow('LUValReturn',Parms )
EscHrs = XLATE('REACTOR',ReactNo,'ACT_ESC_HRS','X')
IF EscHrs = '' THEN EscHrs = 0
EscElapsedTime = OCONV(EscHrs,'MD2')
Parms = EscElapsedTime:@RM:CtrlEntId:@RM:ColPointer+3:@FM:LinePointer ;* Hours in Escalation
obj_Appwindow('LUValReturn',Parms )
END
END
CASE 1
NULL
END CASE
RETURN
END
IF CurrCol = COL$TW_USAGE_DESC THEN
Set_Property(CtrlEntId,'SELPOS',CurrCol + 1:@FM:CurrRow)
END
IF CurrCol = COL$TW_QTY OR CurrCol = COL$TW_CODE OR CurrCol = COL$TW_TOOL OR CurrCol = COL$TW_TYPE THEN
IF ListData<CurrRow,CurrCol> NE '' AND ListData<CurrRow,COL$TW_SIG> NE '' THEN
Set_Property(CtrlEntId,'SELPOS',CurrCol + 1:@FM:CurrRow) ;* 11/19/2007 JCH no change in parms once signed
END
END
GOSUB Refresh
RETURN
* * * * * * *
TWLF:
* * * * * * *
RETURN
CtrlEntID = @WINDOW:'.WFR_USAGE' ;***************************************************
MetNo = Get_Property(@WINDOW:'.MET_NO','DEFPROP')
ListData = Get_Property(CtrlEntId,'LIST')
TWArray = Get_Property(CtrlEntID,'ARRAY')
ReactType = Get_Property(@WINDOW:'.REACTOR_TYPE_IN','TEXT')
WriteFlag = 0
ListCnt = COUNT(ListData,@FM) + (ListData NE '')
FOR I = 1 TO ListCnt
Tool = ListData<I,COL$TW_TOOL>
*IF ListData<I,COL$TW_TYPE> = 'PROD' THEN
* IF Tool NE 'SRP' AND Tool NE 'HgCv' THEN
* Mesg = 'The ':Tool:' tool is Non_Destructive to a Product wafer':CRLF$:CRLF$
* Mesg := 'Only tests that are destructive to a product wafer are recorded':CRLF$ ;* Dead 3/31/2009 JCH & DKK
* Mesg := 'in the Test Wafer Usage area.'
* ErrMsg(Mesg)
* Set_Property(CtrlEntID, 'FOCUS', 1)
* RETURN
* END
*END
IF ListData<I,COL$TW_QTY> NE '' THEN
IF ListData<I,COL$TW_CODE> = '' THEN
Mesg = 'Incomplete Test Wafer Line - All Fields must be completed.'
ErrMsg(Mesg)
Set_Property(CtrlEntID, 'FOCUS', 1)
Set_Property(CtrlEntId,"SELPOS",I:@FM:COL$TW_CODE)
RETURN
END ELSE
IF ListData<I,COL$TW_TOOL> = '' THEN
Mesg = 'Incomplete Test Wafer Line - All Fields must be completed.'
ErrMsg(Mesg)
Set_Property(CtrlEntID, 'FOCUS', 1)
Set_Property(CtrlEntId,"SELPOS",I:@FM:COL$TW_TOOL)
RETURN
END ELSE
IF ListData<I,COL$TW_TYPE> = '' THEN
Mesg = 'Incomplete Test Wafer Line - All Fields must be completed.'
ErrMsg(Mesg)
Set_Property(CtrlEntID, 'FOCUS', 1)
Set_Property(CtrlEntId,"SELPOS",I:@FM:COL$TW_TOOL)
RETURN
END
END
END
END
* This section added 8/11/2008 JCH for Test wafer slot maintenance in the WO_MAT table
IF ReactType NE 'P' THEN
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
RRRec = XLATE('REACT_RUN',RDSno,'','X')
WONo = RRRec<REACT_RUN_WO_NO$>
CassNo = RRRec<REACT_RUN_CASS_NO$>
IF ListData<I,COL$TW_TYPE> = 'PROD' AND ListData<I,COL$TW_WAFER_ID> = '' THEN
SlotWaferIDs = obj_WO_Mat('SlotWaferIDs',WONo:'*':CassNo) ;* Get list of available wafers in cassette
WaferIDCnt = COUNT(SlotWaferIDs,@VM) + (SlotWaferIDs NE '')
FOR N = 1 TO WaferIDCnt
SlotWaferIDs<1,N> = N:@SVM:SlotWaferIDs<1,N>
NEXT N
TypeOver = ''
TypeOver<PDISPLAY$> = SlotWaferIDs
ProdTestSlots = Popup(@WINDOW,TypeOver,'SELECT_PROD_TEST') ;* Select from list of available wafers
IF ProdTestSlots NE '' THEN
Set_Status(0)
WaferIDList = obj_WO_Mat('RemProdTW',WONo:@RM:CassNo:@RM:MetNo:@RM:ProdTestSlots) ;* Add metrology number to each selected slot
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END ELSE
IF ListData<I,COL$TW_TYPE> = 'PROD' AND ListData<I,COL$TW_WAFER_ID> = '' THEN
Parms = WaferIDList:@RM:CtrlEntId:@RM:COL$TW_WAFER_ID:@FM:I
obj_Appwindow('LUValReturn',Parms) ;* Add @SVM'd wafer ids to test wafer line
END
END
END
NULL
WriteFlag = 1
END
IF ListData<I,COL$TW_TYPE> NE 'PROD' AND ListData<I,COL$TW_WAFER_ID> NE '' THEN
obj_WO_Mat('RepProdTW',WONo:@RM:CassNo:@RM:MetNo:@RM:ListData<I,COL$TW_WAFER_ID>) ;* Put the test wafers back in the box
Parms = '':@RM:CtrlEntId:@RM:COL$TW_WAFER_ID:@FM:I
obj_Appwindow('LUValReturn',Parms) ;*
WriteFlag = 1
END
END ;* End of check for Non EpiPRO reactor type
NEXT I
IF WriteFlag = 1 THEN
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
Send_Event(@WINDOW,'WRITE')
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:MetNo)
END
RETURN
* * * * * * *
TWDel:
* * * * * * *
RETURN
RowNum = Parm1
RowData = Parm2
CtrlEntID = @WINDOW:'.WFR_USAGE'
UserRec = XLATE( 'LSL_USERS', @USER4, '', 'X' )
Groups = UserRec<LSL_USERS_GROUPS$>
WriteFlag = 0
*Add LEAD to group
LOCATE 'SUPERVISOR' IN Groups USING @VM SETTING DUMMY THEN
MetNo = Get_Property(@WINDOW:'.MET_NO','DEFPROP')
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
RRRec = XLATE('REACT_RUN',RDSno,'','X')
WONo = RRRec<REACT_RUN_WO_NO$>
CassNo = RRRec<REACT_RUN_CASS_NO$>
TWUseID = RowData<1,COL$TW_USE_ID>
IF TWUseID NE '' THEN
obj_TW_Use('Delete',WONo:@RM:CassNo:@RM:MetNo:@RM:TWUseID)
IF Get_Status(errCode) THEN
* * * * * * *
END
END ELSE
IF RowData<1,COL$TW_WAFER_ID> NE '' THEN
obj_WO_Mat('RepProdTW',WONo:@RM:CassNo:@RM:MetNo:@RM:RowData<1,COL$TW_WAFER_ID>) ;* Put the test wafers back in the box
END
END
WriteFlag = 1
END ELSE
Send_Message(CtrlEntID, "INSERT", RowNum, RowData)
ErrMsg('Only supervisors may delete test wafer line items.')
END
IF WriteFlag = 1 THEN
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
Send_Event(@WINDOW,'WRITE')
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:MetNo)
END
RETURN
* * * * * * *
OverRide:
* * * * * * *
IF XLATE( 'LSL_USERS', @USER4, LSL_USERS_RDS_MASTER$, 'X' ) THEN
IF NOT( Dialog_Box( 'PWD_ENTRY', @WINDOW, '' ) ) THEN RETURN
END ELSE
MSGINFO = ''
MSGINFO<MTEXT$> = 'You do not have security rights to override Run Data Sheet information.'
MSGINFO<MICON$> = 'H'
VOID = MSG( '', MSGINFO )
RETURN
END
ORCtrls = @WINDOW:'.SPEC_THICK_MIN':@RM:@WINDOW:'.SPEC_THICK_TARGET':@RM:@WINDOW:'.SPEC_THICK_MAX':@RM:@WINDOW:'.SPEC_THICK_UNITS':@RM
ORCtrls := @WINDOW:'.SPEC_RES_MIN':@RM:@WINDOW:'.SPEC_RES_TARGET':@RM:@WINDOW:'.SPEC_RES_MAX':@RM:@WINDOW:'.SPEC_RES_UNITS':@RM
ORCtrls := @WINDOW:'.SPEC_CON_MIN':@RM:@WINDOW:'.SPEC_CON_TARGET':@RM:@WINDOW:'.SPEC_CON_MAX':@RM:@WINDOW:'.SPEC_CON_UNITS':@RM
ORCtrls := @WINDOW:'.SPEC_CRES_MIN':@RM:@WINDOW:'.SPEC_CRES_TARGET':@RM:@WINDOW:'.SPEC_CRES_MAX':@RM:@WINDOW:'.SPEC_CRES_UNITS'
Props = STR('ENABLED':@RM,16) ; Props[-1,1] = ''
Vals = STR('1':@RM,16) ; Vals[-1,1] = ''
Set_Property(ORCtrls,Props,Vals)
Props = STR('BACKCOLOR':@RM,16) ; Props[-1,1] = ''
Vals = STR(WHITE$ :@RM,16) ; Vals[-1,1] = ''
Set_Property(ORCtrls,Props,Vals)
RETURN
* * * * * * *
CopyTSLine:
* * * * * * *
RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')
FQASigned = RDS_Services('GetFinalQAStatus', RDSNo)
If FQASigned EQ False$ then
CtrlEntID = @WINDOW:'.WFR_USAGE'
CurrPos = Get_Property(CtrlEntId,"SELPOS")
CurrRow = CurrPos<2>
IF CurrPos = '' THEN RETURN ;* No row selected
CtrlEntID = @WINDOW:'.TW_USE'
CurrPos = Get_Property(CtrlEntId,"SELPOS")
CurrRow = CurrPos<2>
IF CurrRow = '' THEN
MText = 'Please select an existing row to copy.'
Msg(@WINDOW,'', 'ERROR','','Copy Test Wafer Use':@FM: MText)
RETURN
END
IF INDEX(CurrRow,@VM,1) THEN
MText = 'Please select a single row to copy.'
Msg(@WINDOW,'', 'ERROR','','Copy Test Wafer Use':@FM: MText)
RETURN
END
CurrWaferIDs = Get_Property(CtrlEntID,'CELLPOS',COL$WAFER_ID:@FM:CurrRow)
IF CurrWaferIDs NE '' THEN
MText = 'Selected Wafer Usage uses Product Test Wafers and may not be copied.'
Msg(@WINDOW,'', 'ERROR','','Copy Test Wafer Use':@FM: MText)
RETURN
END
UseNos = Get_Property(CtrlEntId,'DEFPROP')<COL$USE_NO>
CurrUseNo = UseNos<COL$USE_NO,CurrRow>
IF CurrUseNo = '' THEN
MText = 'No Test Wafer Use line selected to copy.'
Msg(@WINDOW,'', 'ERROR','','Copy Test Wafer Use':@FM: MText)
RETURN
END
LOOP
UNTIL UseNos[-1,1] NE @VM OR UseNos = ''
UseNos[-1,1] = ''
REPEAT
UseCnt = COUNT(UseNos,@VM) + (UseNos NE '')
LastSeq = 0
FOR I = 1 to UseCnt
UseNo =UseNos<1,I>
IF UseNo > LastSeq THEN
LastSeq = UseNo
END
NEXT I
NextSeq = LastSeq + 1
MetNo = Get_Property(@WINDOW:'.MET_NO','DEFPROP')
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','1')
Send_Event('RDS_TEST','WRITE')
Set_Status(0)
obj_TW_Use('Copy',MetNo:@RM:NextSeq:@RM:CurrUseNo)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:MetNo)
RETURN
END
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:MetNo)
obj_AppWindow('ViewRelated','TW_USE':@RM:MetNo:'*':NextSeq)
end else
// FQA Signed -> Block TW_USE creation/deletion/modification
ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
ErrMsg(ErrorMsg)
Return 0
end
RETURN
* * * * * * *
AddSRP:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
SRPPaths = Get_Property(@WINDOW:'.SRP_BITMAPS','ARRAY')<1>
thisSRPPaths = SRPPaths
FirstMTLine = 1
LOOP
thisSRPPath = thisSRPPaths[1,@VM]
UNTIL thisSRPPath = ''
FirstMTLine += 1
thisSRPPaths[1,COL2()] = ''
REPEAT
* Display the Windows Choosefile Dialog with the default filename loaded.
* SRPDirectory = 'N:\Engineering\CommonRW\SRPScans\'
SRPDirectory = Environment_Services('GetUserDataRootPath') : '\Engineering\CommonRW\SRPScans\'
CFOpt = ''
CFOpt<1> = ''
CFOpt<2> = 'Bitmaps (*.bmp)/*.bmp/'
CFOpt<3> = 1
CFOpt<4> = RDSNo:'.bmp'
CFOpt<6> = SRPDirectory
FullPath = Utility('CHOOSEFILE',@WINDOW,CFOpt)
IF FullPath = '' THEN RETURN
LOCATE FullPath IN SRPPaths USING @VM SETTING Pos THEN
ErrMsg('Bitmap is already attached.')
END ELSE
Send_Message(@WINDOW:'.SRP_BITMAPS','INSERT',1,FullPath)
END
RETURN
* * * * * * *
ViewSRP:
* * * * * * *
CtrlEntID = @WINDOW:'.SRP_BITMAPS'
CurrPos = Get_Property(CtrlEntID,'SELPOS')
CurrRow = CurrPos<2>
AllPaths = Get_Property(CtrlEntID,'DEFPROP')<1>
FullPath = AllPaths<1,CurrRow>
IF FullPath NE '' THEN
Void = Start_Window('RDS_SRP',@WINDOW,FullPath,'','')
END
RETURN
* * * * * * *
RemoveSRP:
* * * * * * *
CtrlEntID = @WINDOW:'.SRP_BITMAPS'
DeletedRowIndex = Parm1
DeletedRowText = Parm2
Result = Msg(@WINDOW,'','REMOVE_SRP_POINTER')
IF Result = 0 THEN
Send_Message(CtrlEntID, "INSERT",DeletedRowIndex, DeletedRowText) ;* Put it back in the list
END
RETURN
* * * * * * *
InsertSRP:
* * * * * * *
RowIndex = Parm1
CurrCtrl = Get_Property(@WINDOW,'FOCUS')
Dummy = Send_Message(CurrCtrl, "DELETE", RowIndex)
ErrMsg('Rows may not be inserted.')
RETURN
* * * * * * *
ThickDC:
* * * * * * *
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE_IN','TEXT')
PSNo = Get_Property(@WINDOW:'.PS_NO','DEFPROP')
ThickFilmMet = Get_Property(@WINDOW:'.THICKFILM_MET','CHECK')
IF ReactorType = 'EPP' OR ReactorType = 'P' OR ThickFilmMet = 1 THEN
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
LSID = Get_Property(@WINDOW:'.LS_ID','TEXT')
LSKeys = XLATE('RDS',RDSNo,RDS_RDS_LAYER_KEYS$,'X')
LastLSID = LSKeys[-1,'B*']
IF LSID NE LastLSID THEN
ErrMsg('EpiPRO results may only be entered on the LAST layer set.')
RETURN
END
Ctrls = @WINDOW:'.MET_NO':@RM ; Props = 'TEXT':@RM
Ctrls := @WINDOW:'.ZONE' ; Props := 'TEXT'
Vals = Get_Property(Ctrls,Props)
MetNo = Vals[1,@RM]
Zone = Vals[COL2()+1,@RM]
IF MetNo = '' THEN RETURN
IF Zone = '' AND NOT(ThickFilmMet) THEN ;* Added check for ThickFilmMet 1/15/2009 JCH, J.C. Henry & Co., Inc.
ErrMsg('Zone must be filled in before entering metrology data.')
Set_Property(@WINDOW:'.ZONE','FOCUS',1)
RETURN
END
Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1) ;* Sets a flag to keep the RDS_TEST window from closing on the WRITE event
Send_Event(@WINDOW,'WRITE')
dummy = Create_Dialog('DIALOG_EPI_PRO_MET',@WINDOW,0,MetNo)
END
RETURN
* * * * * * *
SendSPC:
* * * * * * *
// Temporarily disable the "Send SPC" button to avoid duplicate requests from being generated.
Set_Property(@Window : '.SEND_SPC', 'ENABLED', False$)
Send_Event(@WINDOW:'.GROWTH_RATE','CALCULATE')
Ctrls = @WINDOW:'.PS_NO':@RM ; Props = 'DEFPROP':@RM
Ctrls := @WINDOW:'.RDS_NO':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.LS_ID':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.REACTOR':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.ZONE':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.THICK_AVG':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.THICK_STDV':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.SHEETRHO_AVG':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.SHEETRHO_STDV':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.RES_AVG':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.RES_STDV':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.HGCV1_RES_AVG':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.HGCV1_RES_STDV':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.GROWTH_RATE':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.THICK_RANGE':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.THICK_RANGE_PCNT':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.SHEETRHO_RANGE':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.SHEETRHO_RANGE_PCNT':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.RES_RANGE':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.RES_RANGE_PCNT':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.HGCV1_RES_RANGE':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.HGCV1_RES_RANGE_PCNT':@RM ; Props := 'DEFPROP':@RM
Vals = Get_Property(Ctrls,Props)
PSNo = Vals[1,@RM]
RDSNo = Vals[COL2()+1,@RM]
LSId = Vals[COL2()+1,@RM]
Reactor = Vals[COL2()+1,@RM]
Zone = Vals[COL2()+1,@RM]
ThickAvg = Vals[COL2()+1,@RM]
ThickStdv = Vals[COL2()+1,@RM]
SheetRhoAvg = Vals[COL2()+1,@RM]
SheetRhoStdv = Vals[COL2()+1,@RM]
ResAvg = Vals[COL2()+1,@RM]
ResStdv = Vals[COL2()+1,@RM]
HgcvAvg = Vals[COL2()+1,@RM]
HgCvStdv = Vals[COL2()+1,@RM]
GrowthRate = Vals[COL2()+1,@RM]
ThickRange = Vals[COL2()+1,@RM]
ThickRangePcnt = Vals[COL2()+1,@RM]
SheetRhoRange = Vals[COL2()+1,@RM]
SheetRhoRangePcnt = Vals[COL2()+1,@RM]
ResRange = Vals[COL2()+1,@RM]
ResRangePcnt = Vals[COL2()+1,@RM]
Hgcv1ResRange = Vals[COL2()+1,@RM]
Hgcv1ResRangePcnt = Vals[COL2()+1,@RM]
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Set_Property(@WINDOW, '@DONT_CLOSE_ON_WRITE', True$)
Savewarn = Get_Property(@Window, 'SAVEWARN')
If Savewarn EQ True$ then
// User has entered in new data so save before posting SPC request.
Set_Status(0)
Send_Event(@Window, 'WRITE')
If Get_Status(StatusCode) then
ErrMsg('Error saving metrology record. Could not send metrology data to SPC.')
Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
return
end
end
LayerRec = XLATE('RDS_LAYER',RDSNo:'*':LSId,'','X')
DictInfo = XLATE('DICT.RDS_LAYER','%FIELDS%','','X')
GoodData = True$
IF LayerRec<RDS_LAYER_EPI_TIME$> = '' THEN GoodData = False$
IF LayerRec<RDS_LAYER_DOPANT_FLOW$> = '' THEN GoodData = False$
IF NOT(GoodData) THEN
ErrMsg('Incomplete Reactor Parameters (RDS Layer) record.')
Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
RETURN
END
IF Reactor EQ '' THEN
ErrMsg('':@VM:'Process Error':@SVM:'Reactor No. is required on RDS prior to recording test results.')
Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
RETURN
End
KeyID = Get_Property(@Window : '.MET_NO', 'TEXT')
If KeyID NE '' then
SPC_Services('PostToQueue', 'RDS_TEST', KeyID)
If Error_Services('NoError') else
ErrMsg('Error posting Metrology data to SPC queue. Error message: ':Error_Services('GetMessage'))
Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
return
end
end else
ErrMsg('Process Error':@SVM:'Met. No. is required prior to recording test results.')
Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
return
end
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS')
Set_Property(@Window : '.SPC_DTM', 'DEFPROP', CurrDTM)
// Save new sent to SPC datetime.
Send_Event(@Window, 'WRITE')
// Revert IOOptions to previous setting.
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = False$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
// Request posted -> reenable the "Send SPC" button.
Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
return
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CONVERT '%' TO '' IN ThickRangePcnt
CONVERT '%' TO '' IN SheetRhoRangePcnt
CONVERT '%' TO '' IN ResRangePcnt
CONVERT '%' TO '' IN Hgcv1ResRangePcnt
IF NUM(LSId) THEN
DepositTime = ''
DopantFlow = ''
EpiH2Flow = ''
FOffset = ''
ROffset= ''
SOffset = ''
TcsFlow = ''
END ELSE
LayerRec = XLATE('RDS_LAYER',RDSNo:'*':LSId,'','X')
DictInfo = XLATE('DICT.RDS_LAYER','%FIELDS%','','X')
GoodData = 1
IF LayerRec<RDS_LAYER_EPI_TIME$> = '' THEN GoodData = 0
IF LayerRec<RDS_LAYER_DOPANT_FLOW$> = '' THEN GoodData = 0
IF NOT(GoodData) THEN
ErrMsg('Incomplete Reactor Parameters (RDS Layer) record.')
RETURN
END
IF Get_Property(@WINDOW:'.REACTOR','DEFPROP') = '' THEN
ErrMsg('':@VM:'Process Error':@SVM:'Reactor No. is required on RDS prior to recording test results.')
RETURN
End
LOCATE RDS_LAYER_EPI_TIME$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
DepositTime = OCONV(LayerRec<RDS_LAYER_EPI_TIME$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
DepositTime = LayerRec<RDS_LAYER_EPI_TIME$>
END
LOCATE RDS_LAYER_DOPANT_FLOW$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
DopantFlow = OCONV(LayerRec<RDS_LAYER_DOPANT_FLOW$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
DopantFlow = LayerRec<RDS_LAYER_DOPANT_FLOW$>
END
LOCATE RDS_LAYER_EPI_H2_FLOW$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
EpiH2Flow = OCONV(LayerRec<RDS_LAYER_EPI_H2_FLOW$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
EpiH2Flow = LayerRec<RDS_LAYER_EPI_H2_FLOW$>
END
LOCATE RDS_LAYER_F_OFFSET$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
FOffset = OCONV(LayerRec<RDS_LAYER_F_OFFSET$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
FOffset = LayerRec<RDS_LAYER_F_OFFSET$>
END
LOCATE RDS_LAYER_R_OFFSET$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
ROffset = OCONV(LayerRec<RDS_LAYER_R_OFFSET$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
ROffset = LayerRec<RDS_LAYER_R_OFFSET$>
END
LOCATE RDS_LAYER_S_OFFSET$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
SOffset = OCONV(LayerRec<RDS_LAYER_S_OFFSET$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
SOffset = LayerRec<RDS_LAYER_S_OFFSET$>
END
LOCATE RDS_LAYER_TCS_FLOW$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
TcsFlow = OCONV(LayerRec<RDS_LAYER_TCS_FLOW$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
TcsFlow = LayerRec<RDS_LAYER_TCS_FLOW$>
END
END ;* End of check for Numeric Layer Set ID
UserName = OCONV(@USER4,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
DataLine = QUOTE(PSNo):TAB$
DataLine := QUOTE(RDSNo):TAB$
DataLine := QUOTE(LSId):TAB$
DataLine := QUOTE(Reactor):TAB$
DataLine := QUOTE(Zone):TAB$
DataLine := QUOTE(ThickAvg):TAB$
DataLine := QUOTE(ThickStdv):TAB$
DataLine := QUOTE(SheetRhoAvg):TAB$
DataLine := QUOTE(SheetRhoStdv):TAB$
DataLine := QUOTE(ResAvg):TAB$
DataLine := QUOTE(ResStdv):TAB$
DataLine := QUOTE(HgcvAvg):TAB$
DataLine := QUOTE(HgcvStdv):TAB$
DataLine := QUOTE(GrowthRate):TAB$
DataLine := QUOTE(DepositTime):TAB$
DataLine := QUOTE(DopantFlow):TAB$
DataLine := QUOTE(EpiH2Flow):TAB$
DataLine := QUOTE(FOffset):TAB$
DataLine := QUOTE(ROffset):TAB$
DataLine := QUOTE(SOffset):TAB$
DataLine := QUOTE(TcsFlow):TAB$
DataLine := QUOTE(UserName):TAB$
DataLine := QUOTE(ThickRange):TAB$
DataLine := QUOTE(ThickRangePcnt):TAB$
DataLine := QUOTE(SheetRhoRange):TAB$
DataLine := QUOTE(SheetRhoRangePcnt):TAB$
DataLine := QUOTE(ResRange):TAB$
DataLine := QUOTE(ResRangePcnt):TAB$
DataLine := QUOTE(Hgcv1ResRange):TAB$
DataLine := QUOTE(Hgcv1ResRangePcnt):TAB$
* DOSFile = 'N:\IT\CommonRW\OI_SPC_Data_Transfer\SPC_Data.TXT'
* DOSFile = Environment_Services('GetUserDataProductionPath') : '\CommonRW\OI_SPC_Data_Transfer\SPC_Data.TXT'
DOSFile = Environment_Services('GetSPCDataPath') : '\SPC_Data.txt'
* * * * * * *
DosRead:
* * * * * * *
Set_Status(0)
OSRead DOSRecord FROM DOSFile ELSE
ErrCode = Status()
IF ErrCode = 4 THEN
DOSRecord = '' ;* File doesn't exist
END ELSE
ErrMsg('Unable to read DOS file "SPC_Data.TXT" for update. ':ErrCode:' Please try again.')
RETURN
END
END
DOSRecord := DataLine:CRLF$
OSWrite DOSRecord ON DOSFile
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS')
Set_Property(@WINDOW:'.SPC_DTM','DEFPROP',CurrDTM)
RETURN