Compile function RDS_LAYER_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 : RDS_LAYER_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) 10/04/18 djs Created initial commuter module. 10/12/18 djs Added a check to see if PSN and Reactor are set before attempting to set current run parameters. If a Reactor has not yet been assigned to this RDS, then the code fetches the scheduled reactor for this work order. ***********************************************************************************************************************/ #pragma precomp SRP_PreCompiler #window RDS_LAYER $Insert RDS_EQUATES $Insert APP_INSERTS $Insert RLIST_EQUATES $Insert SECURITY_RIGHTS_EQU $Insert DICT_EQUATES EQU COL$MET_NO TO 1 EQU COL$ZONE TO 2 EQU COL$THICK_AVG TO 3 EQU COL$THICK_STDV TO 4 EQU COL$RES_AVG TO 5 EQU COL$RES_STDV TO 6 EQU COL$RES_UNITS TO 7 EQU COL$OUT_OF_SPEC TO 8 EQU HIDDEN$ TO 32 Declare subroutine Comm_RDS_Layer, Tool_Parms_Services, Set_Status, RList, Errmsg, Database_Services, Msg Declare subroutine PlaceDialog, obj_RDS_Layer, Security_Err_Msg Declare function Tool_Parms_Services, Get_Property, Database_Services, Security_Check, MemberOf GoToEvent Event for CtrlEntId else // Event not implemented end Return EventFlow or 1 //----------------------------------------------------------------------------- // EVENT HANDLERS //----------------------------------------------------------------------------- Event WINDOW.CREATE(CreateParam) RDSLayerID = CreateParam RDSNo = Field(RDSLayerID, '*', 1, 1) LayerID = Field(RDSLayerID, '*', 2, 1) Set_Property(@Window:'.RDS_NO', 'TEXT', RDSNo) Set_Property(@Window:'.LS_ID', 'TEXT', LayerID) // Center window in middle of user's screen PlaceDialog( -2, -2 ) Send_Event(@Window, 'READ') GoSub Refresh end event Event WINDOW.READ() CurrRecord = Get_Property(@WINDOW,'RECORD') Set_Property(@WINDOW,'@ORG_RECORD',CurrRecord) end event Event WINDOW.WRITE() CurrRecord = Get_Property(@WINDOW,'RECORD') OrgRecord = Get_Property(@WINDOW,'@ORG_RECORD') IF CurrRecord NE OrgRecord THEN CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') NewLine = @USER4:@VM:CurrDTM Send_Message(@WINDOW:'.MODIFY_USER','INSERT',1,NewLine) END IOOptions = Get_Property(@Window, 'IOOPTIONS') IOOptions<6> = 1 Set_Property(@Window, 'IOOPTIONS', IOOptions) Set_Status(0) Forward_Event() errCode = '' If Get_Status(errCode) then ErrMsg('Save failed. Error code: ':errCode) Post_Event(@WINDOW,'CLOSE') * end else * * MsgHead = 'Default Run Parameters' * MsgText = 'Would you like to use these parameters as the default for future lots?' * * Response = Msg(@WINDOW,'','YESNO','',MsgHead:@FM:MsgText) * * IF Response EQ True$ THEN * * RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT') * Database_Services('ActivateRecord', 'RDS', RDSNo) * WorkOrder = {WO} * ReactorNo = {REACTOR} * PSN = {PROD_SPEC_ID} * If PSN NE '' then * If ReactorNo EQ '' then * ReactorNo = {SCHED_REACTOR} * If ReactorNo EQ '' then * ErrorMsg = 'No scheduled reactor found for work order: ':WorkOrder:'. Could not apply current ':@SVM | * : 'run parameters. Please assign a reactor to this RDS first.' * ErrMsg(ErrorMsg) * return * end * end * // Create a new TOOL_PARMS record, which is the "master" parameter record. * Tool_Parms_Services('CreateToolParmsRec', PSN, ReactorNo, RDSNo) * If Error_Services('NoError') then * Msg(@Window, '', 'SUCCESS', '', 'Run parameters have been set for reactor ':ReactorNo) * end else * Errmsg('Error setting run parameters. Error message: ':Error_Services('GetMessage')) * end * end else * ErrorMsg = 'No PSN assigned to this RDS. Could not apply current ':@SVM | * : 'run parameters. Please assign a PSN to this RDS first.' * ErrMsg(ErrorMsg) * return * end * end * end end event * Event BTN_SET_CURR_RUN_PARMS.CLICK() * * // Use new RDS_LAYER parameters to create a new TOOL_PARMS record. * // Then apply the new TOOL_PARMS to all RDS records in this work order on this reactor. * // Note: If a reactor has not yet been assigned to an RDS in this work order, then * // the TOOL_PARMS will be applied anyways as a convenience. Should the RDS be * // reassigned to another reactor later, the appropriate TOOL_PARMS will be applied * // by the RDS_ACTIONS MFS. * * Savewarn = Get_Property(@Window, 'SAVEWARN') * Set_Property(@Window, '@SKIPSCRIPT', True$) * If Savewarn EQ True$ then * IOOptions = Get_Property(@Window, 'IOOPTIONS') * IOOptions<6> = 1 * Set_Property(@Window, 'IOOPTIONS', IOOptions) * Send_Event(@Window, 'WRITE') * end * RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT') * Database_Services('ActivateRecord', 'RDS', RDSNo) * WorkOrder = {WO} * ReactorNo = {REACTOR} * PSN = {PROD_SPEC_ID} * If PSN NE '' then * If ReactorNo EQ '' then * ReactorNo = {SCHED_REACTOR} * If ReactorNo EQ '' then * ErrorMsg = 'No scheduled reactor found for work order: ':WorkOrder:'. Could not apply current ':@SVM | * : 'run parameters. Please assign a reactor to this RDS first.' * ErrMsg(ErrorMsg) * return * end * end * // Create a new TOOL_PARMS record, which is the "master" parameter record. * Tool_Parms_Services('CreateToolParmsRec', PSN, ReactorNo, RDSNo) * // Apply new TOOL_PARMS record to all RDS_LAYERS in this run without an unload signature. * Tool_Parms_Services('ApplyCurrentRunParms', PSN, ReactorNo) * If Error_Services('NoError') then * Msg(@Window, '', 'SUCCESS', '', 'Run parameters have been set for reactor ':ReactorNo) * end else * Errmsg('Error setting run parameters. Error message: ':Error_Services('GetMessage')) * end * end else * ErrorMsg = 'No PSN assigned to this RDS. Could not apply current ':@SVM | * : 'run parameters. Please assign a PSN to this RDS first.' * ErrMsg(ErrorMsg) * return * end * * end event Event PUB_CONFIRM_PARMS.CLICK() RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT') RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = True$ Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) Set_Property(@Window:'.PUB_CONFIRM_PARMS', 'ENABLED', False$) Set_Property(@Window:'.PUB_CONFIRM_PARMS', 'HELPTEXT', 'Confirmation not required.') Post_Event(@Window, 'CLOSE') end event Event PUB_UPDATE_LIMITS.CLICK() IF Security_Check( 'Recipe', Write$ ) or MemberOf(@User4, 'ENGINEERING_LEAD') or MemberOf(@User4, 'ENGINEERING') THEN RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') LSId = Get_Property(@WINDOW:'.LS_ID','DEFPROP') IF RDSNo EQ '' OR LSId EQ '' THEN RETURN IOOptions = Get_Property(@Window, 'IOOPTIONS') IOOptions<6> = 1 Set_Property(@Window, 'IOOPTIONS', IOOptions) Send_Event(@WINDOW,'WRITE') obj_RDS_Layer('UpdateLimits',RDSNo:@RM:LSId) IF Get_Status(errCode) THEN ErrMsg(errCode) Send_Event(@Window, 'READ') END ELSE Security_Err_Msg( 'Recipe', Write$ ) END end event //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ClearCursors: For counter = 0 to 8 ClearSelect counter Next counter return Refresh: 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',KEY_YELLOW$) END CASE Set_Property(@WINDOW:'.OVERRIDE_LIMITS_GROUP','ENABLED',0) RDSNo = Get_Property( @WINDOW:'.RDS_NO', 'DEFPROP' ) RDSRec = XLATE('RDS',RDSNo,'','X') LayerSetID = Get_Property(@WINDOW:'.LS_ID','DEFPROP') PSNId = RDSRec< RDS_PROD_SPEC_ID$ > RecipeNo = Get_Property(@WINDOW:'.RECIPE_NO','DEFPROP') RecipeParms = Get_Property(@WINDOW:'.RECIPE_PARMS','ARRAY') ;* Entered by user RecipeLimits = Get_Property(@WINDOW:'.RECIPE_LIMITS','LIST')<1> CONVERT @VM TO @FM IN RecipeLimits ColCnt = COUNT(RecipeLimits,@FM) + (RecipeLimits NE '') ;* This is 16 columns as of the development of this window RecipeParms = Get_Property(@WINDOW:'.RECIPE_PARMS','ARRAY') ParameterStyles = Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, '' ) LimitStyles = Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, '' ) CONVERT @VM TO '' IN RecipeParms ColNames = Get_Property( @WINDOW:'.RECIPE_PARMS', 'COLUMN' ) OutOfSpecCols = '' FOR Col = 1 TO ColCnt IF RecipeLimits = '' AND RecipeParms = '' THEN ParameterStyles = BitOr( ParameterStyles, HIDDEN$ ) ;* Column not used -> Hide LimitStyles = BitOr( LimitStyles, HIDDEN$ ) END ELSE ParameterStyles = BitAnd( ParameterStyles, BitNot(HIDDEN$) ) ;* Column used -> Show LimitStyles = BitAnd( LimitStyles, BitNot(HIDDEN$) ) LimitData = RecipeLimits ParamData = RecipeParms ColName = ColNames<1,1,Col> Conversion = XLATE('DICT.RDS_LAYER',ColName,DICT_CONV$,'X') SWAP ' ~ ' WITH @VM IN LimitData IF Conversion NE '' THEN ParamData = ICONV(ParamData,Conversion) LimitData = ICONV(LimitData,Conversion) END Minimum = LimitData<1,1> Maximum = LimitData<1,2> IF ParamData NE '' THEN IF ParamData < Minimum OR ParamData > Maximum THEN Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,RED$) OutOfSpecCols = INSERT(OutOfSpecCols,Col,0,0,1) END ELSE Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,WHITE$) END END ELSE Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,WHITE$) END END NEXT Col LOCATE '1' IN OutOfSpecCols USING @FM SETTING Pos THEN Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',1) END ELSE Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',0) END Parameter_Styles = Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, ParameterStyles ) LimitStyles = Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, LimitStyles ) * Set_Property( @WINDOW:'.RECIPE_INFO', "AUTOSIZECOL", 16 ) * Set_Property( @WINDOW:'.RECIPE_LIMITS', "AUTOSIZECOL", 16 ) * 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> ETList = Get_Property(ETCtrl,'LIST') FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '') IF ETList 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 NEXT I TestList = Get_Property(@WINDOW:'.RDS_TEST_KEYS','LIST') FOR I = 1 TO COUNT(TestList,@FM) + (TestList NE '') IF ICONV(TestList,'B') = 1 THEN Send_Message(@WINDOW:'.RDS_TEST_KEYS','COLOR_BY_POS',0,I,RED$) END ELSE Send_Message(@WINDOW:'.RDS_TEST_KEYS','COLOR_BY_POS',0,I,WHITE$) END NEXT I * RPCopy = RecipeParms * Convert @FM to '' in RPCopy * If RPCopy EQ '' then * Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', False$) * end else * Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', True$) * end IsTestWafer = Xlate('RDS', RDSNo, 'ON_TW_FREQ', 'X') RDSLayerAck = RDSRec If ( (IsTestWafer EQ True$) and ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) ) then Set_Property(@Window:'.PUB_CONFIRM_PARMS', 'ENABLED', True$) end else Set_Property(@Window:'.PUB_CONFIRM_PARMS', 'ENABLED', False$) Set_Property(@Window:'.PUB_CONFIRM_PARMS', 'HELPTEXT', 'Confirmation not required.') end RETURN