304 lines
14 KiB
Plaintext
304 lines
14 KiB
Plaintext
Compile function NDW_GAN_RETAIN_MANAGER_TASK_RETAIN_EVENTS(CtrlEntId, Event, @PARAMS)
|
|
/***********************************************************************************************************************
|
|
|
|
Name : NDW_GAN_RETAIN_MANAGER_TASK_RETAIN_EVENTS
|
|
|
|
Description : Commuter module for the NDW_GAN_RETAIN_MANAGER_TASK_RETAIN_EVENTS form.
|
|
|
|
Notes : Application errors should be logged using the Error Services module. There are a few methodological
|
|
assumptions built into way errors are managed which are important to understand in order to properly
|
|
work with Error Services:
|
|
|
|
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
|
|
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
|
|
this will appear backwards since the originating procedure always appears at the bottom of the
|
|
list and the current routine appears at the top of the list. We are using this orientation because
|
|
it is common to refer to the process of calling other procedures as 'drilling down'.
|
|
|
|
- The reason for defining the orientation of the call stack is because Error_Services allows for
|
|
multiple error conditions to be appended to an original error. In most cases this will happen when
|
|
a procedure at the bottom of the stack generates an error condition and then returns to its
|
|
calling procedure. This higher level procedure can optionally add more information relevant to
|
|
itself. This continues as the call stack 'bubbles' its way back to the top to where the
|
|
originating procedure is waiting.
|
|
|
|
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
|
|
preserve their error state until explicitly cleared. This can hinder the normal execution of code
|
|
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
|
|
Our philosophy is that error conditions should automatically be cleared before a new procedure
|
|
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
|
|
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
|
|
philosophy then it should include a call into the 'Clear' service request at the top of the
|
|
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
|
|
|
|
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
|
|
error conditions that were set before.
|
|
|
|
Parameters :
|
|
Service [in] -- Name of the service being requested
|
|
Param1-10 [in/out] -- Additional request parameter holders
|
|
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
|
|
|
Metadata :
|
|
|
|
History : (Date, Initials, Notes)
|
|
05/14/20 cn Original programmer.
|
|
06/22/20 cn Split Retain and Destroy forms into separate forms
|
|
|
|
***********************************************************************************************************************/
|
|
#pragma precomp SRP_PreCompiler
|
|
#window NDW_GAN_RETAIN_MANAGER_TASK_RETAIN
|
|
|
|
$Insert LOGICAL
|
|
$Insert APPCOLORS
|
|
$Insert RETAINED_WAFERS_EQUATES
|
|
$Insert MSG_EQUATES
|
|
|
|
// Control Name equates
|
|
Equ RetainedTable$ To @Window : '.OLE_EDT_RETAINED'
|
|
Equ StatusBar$ To @Window : '.OLE_STATUSBAR'
|
|
|
|
// Reduce modes (for Select statement)
|
|
Equ NEW_EXIST$ To 0
|
|
Equ NEXT_CUR$ To 1
|
|
Equ ADD_EXIST$ To 2
|
|
|
|
|
|
// OLE Edit Table Columns
|
|
Equ RUN_ID$ To 1
|
|
Equ POCKET$ To 2
|
|
Equ SCRIBE$ To 3
|
|
Equ WO_NO$ To 4
|
|
Equ RETAIN_BOX$ To 5
|
|
Equ RETAIN_SLOT$ To 6
|
|
Equ Selection$ To 7
|
|
Equ WAFER_ID$ To 8
|
|
|
|
Declare Function Form_Services, Get_Property, Send_Message, SRP_Array, SRP_Sort_Array
|
|
Declare Function Gan_Services, Retain_Manager_Services, MSG, MemberOf
|
|
Declare Subroutine SRP_Show_Window, Set_Property, Send_Message, SRP_Set_MinMaxInfo
|
|
Declare Subroutine SRP_Edittable_Manager, Form_Services, Gan_Services, Retain_Manager_Services
|
|
|
|
SubclassInfo = Form_Services('FindSubclassControl')
|
|
Subclass = SubclassInfo<1>
|
|
|
|
If Assigned(Param8) else Param8 = ''
|
|
|
|
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
|
|
|
|
Type = Get_Property(CtrlEntId, 'TYPE')
|
|
If Type EQ 'RADIOBUTTON' then
|
|
Convert ' ' to '_' in CtrlEntID
|
|
end
|
|
|
|
GoToEvent Event for CtrlEntId else
|
|
// Event not implemented
|
|
end
|
|
|
|
Return EventFlow or 1
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// EVENT HANDLERS
|
|
//-----------------------------------------------------------------------------
|
|
|
|
Event WINDOW.CREATE(CreateParam)
|
|
GoSub SetupOLEControls
|
|
Set_Property(@Window, 'TIMER', 30000 : @FM : 30000)
|
|
SRP_Set_MinMaxInfo(@Window, 'DEF', 'DEF', 'DEF')
|
|
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, '', 1)
|
|
End Event
|
|
|
|
|
|
Event WINDOW.TIMER()
|
|
GoSub UpdateServiceLastRunTime
|
|
end event
|
|
|
|
|
|
Event RAG_WAFER_TYPE.150_MM_6_IN.CLICK()
|
|
Event RAG_WAFER_TYPE.200_MM_8_IN.CLICK()
|
|
GoSub UpdateServiceLastRunTime
|
|
Form_Services('DisplayWaitScreen', '', 'Refreshing Data')
|
|
GoSub LoadRetainedWaferData
|
|
Form_Services('CloseWaitScreen')
|
|
end event
|
|
|
|
|
|
Event PUB_RETAIN.CLICK()
|
|
GoSub SignRetainedWafers
|
|
GoSub UpdateServiceLastRunTime
|
|
Set_Property(@Window, '@RETAINEDCHECKCOUNTER', '')
|
|
Set_Property(@Window : '.PUB_RETAIN', 'ENABLED', False$)
|
|
end event
|
|
|
|
|
|
Event OLE_EDT_RETAINED.OnCheckChanged(Cell, OldValue, NewValue)
|
|
RetainedCheckCounter = Get_Property(@Window, '@RETAINEDCHECKCOUNTER')
|
|
If OldValue EQ True$ then
|
|
RetainedCheckCounter -= 1
|
|
end else
|
|
RetainedCheckCounter += 1
|
|
end
|
|
|
|
Set_Property(@Window, '@RETAINEDCHECKCOUNTER', RetainedCheckCounter)
|
|
|
|
If RetainedCheckCounter GT 0 then
|
|
Set_Property(@Window : '.PUB_RETAIN', 'ENABLED', True$)
|
|
end else
|
|
Set_Property(@Window : '.PUB_RETAIN', 'ENABLED', False$)
|
|
end
|
|
end event
|
|
|
|
|
|
Event WINDOW.CLOSE(CancelFlag)
|
|
end event
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Internal GoSubs
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
SetupOLEControls:
|
|
ArrayDimension = 8 : @FM : 50
|
|
TitleList = 'Run ID' : @VM : 'Pocket' : @VM : 'Scribe' : @VM : 'WO' : @VM : 'Retain Box' : @VM : 'Slot' : @VM : 'Select' : @VM : 'Wafer ID' : @VM
|
|
ColumnWidths = 'A' : @FM : '45' : @FM : '70' : @FM : '65' : @FM : '75' : @FM : '40' : @FM : '40' : @FM : '45' : @FM
|
|
ColumnAlignments = 'L' : @FM : 'C' : @FM : 'C' : @FM : 'C' : @FM : 'C' : @FM : 'C' : @FM : 'C' : @FM : 'L' : @FM
|
|
|
|
VirtualPos = ''
|
|
RowsAsColumns = ''
|
|
CellsAsFields = ''
|
|
ClearFill = ''
|
|
OIEditTable = ''
|
|
SRP_EditTable_Manager('Setup1', RetainedTable$, ArrayDimension, TitleList, ColumnWidths, ColumnAlignments, VirtualPos, RowsAsColumns, CellsAsFields, ClearFill, OIEditTable)
|
|
Set_Property(RetainedTable$, 'OLE.SelectionStyle', 'Black' : @VM : OI_HOT_BLUE$ : ' L=70' : @FM : 'Black' : @VM : OI_HOT_BLUE$) ; // Automatically highlight the current row with one color and highlight the current row with another color.
|
|
Set_Property(RetainedTable$, 'OLE.HeaderFont[All; All]', 'Segoe UI' : @SVM : 8)
|
|
Set_Property(RetainedTable$, 'OLE.CellFont[All; All]', 'Segoe UI' : @SVM : 8)
|
|
Set_Property(RetainedTable$, 'OLE.HeaderColumn[1]', '' : @FM : False$ : @FM : False$ : @FM)
|
|
Set_Property(RetainedTable$, 'OLE.CellProtection[ALL; All]', 'SEL')
|
|
Set_Property(RetainedTable$, 'OLE.NewRowCount', 0)
|
|
Set_Property(RetainedTable$, 'OLE.HeaderRow[ALL]', '' : @FM : '' : @FM : False$ : @FM)
|
|
Set_Property(RetainedTable$, 'OLE.DataColumn[ALL]', '' : @FM : '' : @FM : False$ : @FM)
|
|
Set_Property(RetainedTable$, 'OLE.DataRow[ALL]', '' : @FM : '' : @FM : False$ : @FM)
|
|
Set_Property(RetainedTable$, 'OLE.HeaderColors[All; All]', 'Auto' : @FM : 'None' : @FM : 'None' : @FM : OI_HOT_BLUE$ : @FM : False$)
|
|
Set_Property(RetainedTable$, 'OLE.ResetSelPos', False$)
|
|
Set_Property(RetainedTable$, 'OLE.AllowDeletions', False$)
|
|
Set_Property(RetainedTable$, 'OLE.AllowInserts', False$)
|
|
Set_Property(RetainedTable$, 'OLE.CellType[' : Selection$ : ';ALL]', 'Check Box' : @FM : 0 : @VM : 1)
|
|
// Begin with hidden destroyed sig and date
|
|
Set_Property(RetainedTable$, 'OLE.DataColumn[' : WAFER_ID$ : ']', '' : @FM : False$)
|
|
|
|
// Qualify OLE events that we want to intercept
|
|
Qualifier = ''
|
|
Qualifier<1> = 1
|
|
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.AfterUpdate', Qualifier)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.OnClick', Qualifier)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.OnButtonClick', Qualifier)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', Qualifier)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.PosChanged', Qualifier)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.OnComboClicked', Qualifier)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.OnHeaderClick', Qualifier)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
|
|
Send_Message(RetainedTable$, 'QUALIFY_EVENT', 'OLE.OnDblClick', Qualifier)
|
|
|
|
// APP_INFO RETAINED_WAFER Fields
|
|
Equ RETAIN_WAFER_RUN_ID$ To 1
|
|
Equ RETAIN_WAFER_RECIPE$ To 2
|
|
Equ RETAIN_WAFER_POCKET$ To 3
|
|
Equ RETAIN_WAFER_SCRIBE$ To 4
|
|
Equ RETAIN_WAFER_GRADE$ To 5
|
|
Equ RETAIN_WAFER_PART$ To 6
|
|
Equ RETAIN_WAFER_WO_NO$ To 7
|
|
Equ RETAIN_WAFER_RETAIN_BOX$ To 8
|
|
Equ RETAIN_WAFER_RETAIN_SLOT$ To 9
|
|
Equ RETAIN_WAFER_RETAIN_LOC$ To 10
|
|
Equ RETAIN_WAFER_STATUS$ To 11
|
|
Equ RETAIN_WAFER_COMMENT$ To 12
|
|
Equ RETAIN_WAFER_OPERATOR$ To 13
|
|
Equ RETAIN_WAFER_RETAIN_DATE$ To 14
|
|
Equ RETAIN_WAFER_DESTROY_SIG$ To 15
|
|
Equ RETAIN_WAFER_DESTROY_DATE$ To 16
|
|
Equ RETAIN_WAFER_WAFER_ID$ To 17
|
|
|
|
GoSub LoadRetainedWaferData
|
|
|
|
Set_Property(StatusBar$, 'OLE.PaneCount', 1)
|
|
Set_Property(StatusBar$, 'OLE.Resizable', False$)
|
|
Set_Property(StatusBar$, 'OLE.PaneType[1]', 'NOR')
|
|
GoSub UpdateServiceLastRunTime
|
|
return
|
|
|
|
|
|
SignRetainedWafers:
|
|
Set_Property(RetainedTable$, 'OLE.Redraw', False$)
|
|
WaferList = Get_Property(RetainedTable$, 'OLE.ARRAY')
|
|
WaferList = SRP_Array('Rotate', WaferList, @FM, @VM)
|
|
RemoveWaferList = ''
|
|
|
|
For Each Wafer in WaferList using @FM setting WaferPos then
|
|
SelectedWafer = Wafer<1, Selection$>
|
|
If SelectedWafer EQ True$ then
|
|
RemoveWaferList := WaferPos : @FM
|
|
InboundWfrID = Wafer<1, WAFER_ID$>
|
|
Gan_Services('SignRetainedWafer', InboundWfrID)
|
|
end
|
|
Next Wafer
|
|
|
|
RemoveWaferList[-1, 1] = ''
|
|
RemoveWaferList = SRP_Sort_Array(RemoveWaferList, 'DN1', 1)
|
|
|
|
For Each RemoveWaferPos in RemoveWaferList using @FM setting dummypos then
|
|
Send_Message(RetainedTable$, 'OLE.DeleteRecords', RemoveWaferPos, 1)
|
|
Next RemoveWaferPos
|
|
Set_Property(RetainedTable$, 'OLE.Redraw', True$)
|
|
return
|
|
|
|
|
|
LoadRetainedWaferData:
|
|
Set_Property(RetainedTable$, 'OLE.Redraw', False$)
|
|
WaferSize = Get_Property(@Window : '.RAG_WAFER_TYPE', 'VALUE')
|
|
RetainedWaferList = ''
|
|
FullWaferList = Retain_Manager_Services('GetWaferData', WaferSize)
|
|
|
|
For Each Wafer in FullWaferList using @FM setting WaferPos then
|
|
Convert @VM to @FM in Wafer
|
|
Location = Wafer<RETAIN_WAFER_RETAIN_LOC$>
|
|
Status = Wafer<RETAIN_WAFER_STATUS$>
|
|
RetainSig = Wafer<RETAIN_WAFER_OPERATOR$>
|
|
|
|
If Location _NEC 'Wafer Destroyed' AND Status _NEC 'do not destroy' then
|
|
RetainBox = Wafer<RETAIN_WAFER_RETAIN_BOX$>
|
|
RetainedSlot = Wafer<RETAIN_WAFER_RETAIN_SLOT$>
|
|
RetainedDate = Wafer<RETAIN_WAFER_RETAIN_DATE$>
|
|
If RetainBox NE '' AND RetainedSlot NE '' AND RetainedDate EQ '' then
|
|
RetainedWaferList := Wafer<RETAIN_WAFER_RUN_ID$> : @VM : Wafer<RETAIN_WAFER_POCKET$> : @VM : Wafer<RETAIN_WAFER_SCRIBE$> : @VM
|
|
RetainedWaferList := Wafer<RETAIN_WAFER_WO_NO$> : @VM : Wafer<RETAIN_WAFER_RETAIN_BOX$> : @VM : Wafer<RETAIN_WAFER_RETAIN_SLOT$> : @VM
|
|
RetainedWaferList := False$ : @VM : Wafer<RETAIN_WAFER_WAFER_ID$> : @FM
|
|
end
|
|
end
|
|
Next Wafer
|
|
|
|
RetainedWaferList[-1, 1] = ''
|
|
RetainedWaferList = SRP_Array('Rotate', RetainedWaferList, @FM, @VM)
|
|
RetainedWaferList = SRP_Sort_Array(RetainedWaferList, 'AL1' : @FM : 'AN6', 0)
|
|
|
|
Set_Property(RetainedTable$, 'OLE.ARRAY', RetainedWaferList)
|
|
Set_Property(RetainedTable$, 'OLE.Redraw', True$)
|
|
return
|
|
|
|
|
|
UpdateServiceLastRunTime:
|
|
LastRunDTM = Retain_Manager_Services('GetRetainServiceLastRunTime')
|
|
Set_Property(StatusBar$, 'OLE.PaneCaption[1]', 'Retain Wafer Service last ran at: ' : LastRunDTM)
|
|
return
|
|
|