added LSL2 stored procedures
This commit is contained in:
344
LSL2/STPROC/NDW_ROTR_WAFER_DETAILS_EVENTS.txt
Normal file
344
LSL2/STPROC/NDW_ROTR_WAFER_DETAILS_EVENTS.txt
Normal file
@ -0,0 +1,344 @@
|
||||
Function NDW_ROTR_WAFER_DETAILS_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from Infineon.
|
||||
|
||||
Name : NDW_ROTR_WAFER_DETAILS_EVENTS
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
09/17/18 djs Created initial commuter module.
|
||||
11/20/18 djs Updated the BTN_VIEW_WAFER_IMAGE.CLICK event to support the new ROTR wafer image naming
|
||||
convention, which includes the tencor recipe in the name.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#Window NDW_ROTR_WAFER_DETAILS
|
||||
|
||||
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, obj_WO_Mat, Btree.Extract, Utility
|
||||
DECLARE SUBROUTINE ErrMsg, Set_Property, obj_AppWindow, Send_Event, obj_WO_Mat_QA, obj_Tables
|
||||
DECLARE SUBROUTINE Start_Window, End_Window, Database_Services, QA_Services, Form_Services, Forward_Event
|
||||
DECLARE SUBROUTINE SRP_EditTable_Manager, SRP_Show_Window, Rds_Services, Post_Event, Yield
|
||||
|
||||
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, obj_WM_Out, set_WinMsgVal, Form_Services, Environment_Services
|
||||
DECLARE FUNCTION Msg, obj_WO_Mat, Send_Message, obj_Tables, Start_Window, End_Window, QA_Services, Utility
|
||||
DECLARE FUNCTION SRP_EditTable_Manager, Database_Services, Material_Services, Rds_Services, RGB, Min, Max
|
||||
|
||||
$INSERT LOGICAL
|
||||
$INSERT EVENT_SETUP
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT LSL_USERS_EQU
|
||||
$INSERT APPCOLORS
|
||||
$INSERT CLEAN_INSP_EQUATES
|
||||
|
||||
Equ Tab$ to \09\
|
||||
Equ CRLF$ to \0D0A\
|
||||
Equ LF$ to \0A\
|
||||
Equ Comma$ to ','
|
||||
|
||||
ErrTitle = 'Error in NDW_ROTR_Wafer_Details_Events'
|
||||
ErrorMsg = ''
|
||||
|
||||
Result = ''
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
* Transfer Param4 to Param3
|
||||
* Transfer Param5 to Param4
|
||||
* Transfer Param6 to Param5
|
||||
* Transfer Param7 to Param6
|
||||
* Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Events
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
CleanInspKey = CreateParam<1>
|
||||
ScanIndex = CreateParam<2>
|
||||
Set_Property(@Window, '@SCANINDEX', ScanIndex)
|
||||
CleanInspRec = Database_Services('ReadDataRow', 'CLEAN_INSP', CleanInspKey)
|
||||
RDSNo = CleanInspRec<CLEAN_INSP_RDS_NO$>
|
||||
ScanRecipe = CleanInspRec<CLEAN_INSP_SCAN_RECIPE$, ScanIndex>
|
||||
SODReadings = CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$, ScanIndex>
|
||||
SortReadings = CleanInspRec<CLEAN_INSP_SCAN_SORT_PER_WAFER$, ScanIndex>
|
||||
ScanDTM = CleanInspRec<CLEAN_INSP_INSP_TEST_RUN_DTM$, ScanIndex>
|
||||
ScanMin = CleanInspRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$, ScanIndex>
|
||||
ScanMax = CleanInspRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, ScanIndex>
|
||||
ScanAvg = CleanInspRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, ScanIndex>
|
||||
SpecRecipes = CleanInspRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
|
||||
SpecMaxVals = CleanInspRec<CLEAN_INSP_SPEC_SURF_DEFECTS$>
|
||||
SpecMax = ''
|
||||
Locate ScanRecipe in SpecRecipes using @VM setting vPos then
|
||||
SpecMax = SpecMaxVals<1, vPos>
|
||||
end
|
||||
|
||||
If SODReadings EQ '' then
|
||||
// Check metrology for individual SOD values again. (This is initially done within Metrology_Services
|
||||
// when the run data is first imported into OpenInsight.)
|
||||
SODWaferArray = ''
|
||||
SODWaferArray = QA_Services('GetSODPerWafer', RDSNo, ScanRecipe, ScanDTM)
|
||||
If SODWaferArray NE '' then
|
||||
WaferNos = SODWaferArray<1>
|
||||
SODVals = SODWaferArray<2>
|
||||
SortVals = SODWaferArray<3>
|
||||
For each WaferNo in WaferNos using @VM
|
||||
If WaferNo NE '' then
|
||||
CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$, ScanIndex, WaferNo> = SODVals<1, WaferNo>
|
||||
CleanInspRec<CLEAN_INSP_SCAN_SORT_PER_WAFER$, ScanIndex, WaferNo> = SortVals<1, WaferNo>
|
||||
end
|
||||
Next Wafer
|
||||
Database_Services('WriteDataRow', 'CLEAN_INSP', CleanInspKey, CleanInspRec, True$, False$, True$)
|
||||
SODReadings = CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$, ScanIndex>
|
||||
SortReadings = CleanInspRec<CLEAN_INSP_SCAN_SORT_PER_WAFER$, ScanIndex>
|
||||
end else
|
||||
MsgDef = ''
|
||||
MsgDef<MTEXT$> = 'Individual wafer information not available for the selected scan. ' |
|
||||
: 'Please contact FI admin for additional assistance.'
|
||||
MsgDef<MTYPE$> = 'BO'
|
||||
MsgDef<MICON$> = '!'
|
||||
MsgDef<MMODAL$> = 'W'
|
||||
PrevCursor = Set_Property("SYSTEM", "CURSOR", "A")
|
||||
Yield()
|
||||
Response = Msg(@Window, MsgDef)
|
||||
Send_Event(@Window, 'CLOSE')
|
||||
end
|
||||
end
|
||||
Convert @SVM to @VM in SODReadings
|
||||
Convert @SVM to @VM in SortReadings
|
||||
DataArray = ''
|
||||
DataArray<1> = SODReadings
|
||||
DataArray<2> = SortReadings
|
||||
Set_Property(@Window : '.EDL_CLEAN_INSP_KEY', 'TEXT', CleanInspKey)
|
||||
Set_Property(@Window : '.EDL_RDS_NO', 'TEXT', RDSNo)
|
||||
Set_Property(@Window : '.EDL_SCAN_RECIPE', 'TEXT', ScanRecipe)
|
||||
Set_Property(@Window : '.EDL_SCAN_DTM', 'TEXT', OConv(ScanDTM, 'DT/4^HS'))
|
||||
Set_Property(@Window : '.EDL_SOD_SPEC_MAX', 'TEXT', SpecMax)
|
||||
Set_Property(@Window : '.EDT_SOD_READINGS', 'ARRAY', DataArray)
|
||||
Set_Property(@Window : '.EDL_SOD_MIN', 'TEXT', ScanMin)
|
||||
Set_Property(@Window : '.EDL_SOD_MAX', 'TEXT', ScanMax)
|
||||
Set_Property(@Window : '.EDL_SOD_AVG', 'TEXT', OConv(ScanAvg, 'MD3'))
|
||||
GoSub ColorCells
|
||||
FormSize = ''
|
||||
PrevCursor = Set_Property("SYSTEM", "CURSOR", "A")
|
||||
Yield()
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
|
||||
End_Dialog(@Window)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event EDT_SOD_READINGS.CHANGED(NewData)
|
||||
|
||||
SODReadings = Get_Property(@Window : '.EDT_SOD_READINGS', 'LIST')
|
||||
MinSOD = SODReadings<1>
|
||||
MaxSOD = SODReadings<1>
|
||||
AvgSOD = 0
|
||||
NumWafers = 0
|
||||
For each SODVal in SODReadings using @FM
|
||||
If SODVal NE '' then
|
||||
MinSOD = Min(MinSOD, SODVal)
|
||||
MaxSOD = Max(MaxSOD, SODVal)
|
||||
AvgSOD += SODVal
|
||||
NumWafers += 1
|
||||
end
|
||||
Next SODVal
|
||||
If NumWafers NE 0 then AvgSOD = AvgSOD / NumWafers
|
||||
Set_Property(@Window : '.EDL_SOD_MIN', 'TEXT', MinSOD)
|
||||
Set_Property(@Window : '.EDL_SOD_MAX', 'TEXT', MaxSOD)
|
||||
Set_Property(@Window : '.EDL_SOD_AVG', 'TEXT', AvgSOD)
|
||||
GoSub ColorCells
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event BTN_SAVE.CLICK()
|
||||
|
||||
CleanInspKey = Get_Property(@Window : '.EDL_CLEAN_INSP_KEY', 'TEXT')
|
||||
CleanInspRec = Database_Services('ReadDataRow', 'CLEAN_INSP', CleanInspKey)
|
||||
SODReadings = Get_Property(@Window : '.EDT_SOD_READINGS', 'LIST')
|
||||
SODMin = Get_Property(@Window : '.EDL_SOD_MIN', 'TEXT')
|
||||
SODMax = Get_Property(@Window : '.EDL_SOD_MAX', 'TEXT')
|
||||
SODAvg = Get_Property(@Window : '.EDL_SOD_AVG', 'TEXT')
|
||||
ScanIndex = Get_Property(@Window, '@SCANINDEX')
|
||||
CleanInspRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$, ScanIndex> = SODMin
|
||||
CleanInspRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, ScanIndex> = SODMax
|
||||
CleanInspRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, ScanIndex> = IConv(SODAvg, 'MD3')
|
||||
Convert @FM to @SVM in SODReadings
|
||||
CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$, ScanIndex> = SODReadings
|
||||
Database_Services('WriteDataRow', 'CLEAN_INSP', CleanInspKey, CleanInspRec, True$, False$, False$)
|
||||
Send_Event('CLEAN_INSP', 'READ')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event BTN_VIEW_WAFER_IMAGE.CLICK()
|
||||
|
||||
PrevCursor = Set_Property('SYSTEM', 'CURSOR', 'H')
|
||||
Yield()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS_NO', 'TEXT')
|
||||
Sel = Get_Property(@Window : '.EDT_SOD_READINGS', 'SELPOS')
|
||||
TencorRecipe = Get_Property(@Window : '.EDL_SCAN_RECIPE', 'TEXT')
|
||||
WaferNo = Sel<2>
|
||||
OIAppPath = Environment_Services('GetApplicationRootPath')
|
||||
SearchPath = OIAppPath:'\Wafer_Images\*.*'
|
||||
WaferImagePath = OIAppPath:'\Wafer_Images\'
|
||||
FileName = 'WaferMap_RDSNo_':RDSNo:'_Recipe_':TencorRecipe:'_WaferNo_':WaferNo:'.pdf'
|
||||
InitDir SearchPath
|
||||
FileList = DirList()
|
||||
Locate FileName in FileList using @FM setting fPos then
|
||||
Utility('RUNWIN', Quote(WaferImagePath:FileName))
|
||||
end else
|
||||
WaferMap = QA_Services('GetWaferImage', RDSNo, WaferNo, TencorRecipe)
|
||||
Status = ''
|
||||
If WaferMap NE '' then
|
||||
Set_Status(0)
|
||||
OSWrite WaferMap to WaferImagePath:FileName
|
||||
Status = Get_Status()
|
||||
Mode = 5 ; // Show
|
||||
Utility('RUNWIN', Quote(WaferImagePath:FileName), Mode)
|
||||
PrevCursor = Set_Property("SYSTEM", "CURSOR", "A")
|
||||
Yield()
|
||||
end else
|
||||
MsgDef = ''
|
||||
MsgDef<MTEXT$> = 'Individual wafer information not available for the selected scan. ' |
|
||||
: 'Please contact FI admin for additional assistance.'
|
||||
MsgDef<MTYPE$> = 'BO'
|
||||
MsgDef<MICON$> = '!'
|
||||
MsgDef<MMODAL$> = 'W'
|
||||
PrevCursor = Set_Property("SYSTEM", "CURSOR", "A")
|
||||
Yield()
|
||||
Response = Msg(@Window, MsgDef)
|
||||
end
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event EDT_SOD_READINGS.POSCHANGED(NextColumn, NextRow)
|
||||
|
||||
SODData = Get_Property(@Window : '.EDT_SOD_READINGS', 'TEXT')
|
||||
If SODData EQ '' then
|
||||
Set_Property(@Window : '.BTN_VIEW_WAFER_IMAGE', 'ENABLED', False$)
|
||||
end else
|
||||
Set_Property(@Window : '.BTN_VIEW_WAFER_IMAGE', 'ENABLED', True$)
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event EDT_SOD_READINGS.GOTFOCUS(PrevFocusID)
|
||||
|
||||
SODData = Get_Property(@Window : '.EDT_SOD_READINGS', 'TEXT')
|
||||
If SODData EQ '' then
|
||||
Set_Property(@Window : '.BTN_VIEW_WAFER_IMAGE', 'ENABLED', False$)
|
||||
end else
|
||||
Set_Property(@Window : '.BTN_VIEW_WAFER_IMAGE', 'ENABLED', True$)
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event OLE_SUBCLASS.OnComboClick(CtrlId, Sel, Value)
|
||||
|
||||
Send_Event(CtrlId, 'LOSTFOCUS')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
Qualify = ''
|
||||
Qualify<1> = 1
|
||||
Qualify<4> = 0
|
||||
|
||||
return
|
||||
|
||||
|
||||
ColorCells:
|
||||
|
||||
OutofSpecColorArray = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
InSpecColorArray = GREEN$:@FM:'':@FM:POS_BLUE$:@FM:''
|
||||
SODReadingsCtrl = @Window : '.EDT_SOD_READINGS'
|
||||
DataArray = Get_Property(@Window : '.EDT_SOD_READINGS', 'ARRAY')
|
||||
SODReadings = DataArray<1>
|
||||
SortReadings = DataArray<2>
|
||||
SODSpecMax = Get_Property(@Window : '.EDL_SOD_SPEC_MAX', 'TEXT')
|
||||
SODMin = Get_Property(@Window : '.EDL_SOD_MIN', 'TEXT')
|
||||
SODMax = Get_Property(@Window : '.EDL_SOD_MAX', 'TEXT')
|
||||
SODAvg = Get_Property(@Window : '.EDL_SOD_AVG', 'TEXT')
|
||||
For each SOD in SODReadings using @VM setting vPos
|
||||
Sort = SortReadings<0, vPos>
|
||||
Begin Case
|
||||
Case ( (SOD GT SODSpecMax) and (Sort EQ 'FAIL') )
|
||||
stat = Send_Message(SODReadingsCtrl, 'COLOR_BY_POS', 0, vPos, OutofSpecColorArray)
|
||||
Case SOD GT SODSpecMax
|
||||
stat = Send_Message(SODReadingsCtrl, 'COLOR_BY_POS', 1, vPos, OutofSpecColorArray)
|
||||
Case Sort EQ 'FAIL'
|
||||
stat = Send_Message(SODReadingsCtrl, 'COLOR_BY_POS', 2, vPos, OutofSpecColorArray)
|
||||
Case Otherwise$
|
||||
stat = Send_Message(SODReadingsCtrl, 'COLOR_BY_POS', 0, vPos, InSpecColorArray)
|
||||
End Case
|
||||
Next SOD
|
||||
If SODMin GT SODSpecMax then
|
||||
Set_Property(@Window : '.EDL_SOD_MIN', 'BACKCOLOR', RED$)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_SOD_MIN', 'BACKCOLOR', GREEN$)
|
||||
end
|
||||
If SODMax GT SODSpecMax then
|
||||
Set_Property(@Window : '.EDL_SOD_MAX', 'BACKCOLOR', RED$)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_SOD_MAX', 'BACKCOLOR', GREEN$)
|
||||
end
|
||||
If SODAvg GT SODSpecMax then
|
||||
Set_Property(@Window : '.EDL_SOD_AVG', 'BACKCOLOR', RED$)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_SOD_AVG', 'BACKCOLOR', GREEN$)
|
||||
end
|
||||
|
||||
return
|
||||
|
Reference in New Issue
Block a user