open-insight/LSL2/STPROC/SPC_SERVICES.txt
Infineon\StieberD 7762b129af pre cutover push
2024-09-04 20:33:41 -07:00

302 lines
13 KiB
Plaintext

Compile function SPC_Services(@Service, @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 : SPC_Services
Description : Handler program for all module related services.
Notes : The generic parameters should contain all the necessary information to process the services. Often
this will be information like the data Record and Key ID.
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)
10/24/18 djs Original programmer. - [EPIOI-8]
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert SPC_QUEUE_EQUATES
$Insert RLIST_EQUATES
$Insert RDS_LAYER_EQUATES
$Insert DICT_EQUATES
Declare function Database_Services, Environment_Services, Status, Error_Services, Get_Status
Declare subroutine Database_Services, Set_Status, Error_Services, RList, Get_Status
GoToService
Return Response or ""
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
// ProcessQueue
//
// Checks the SPC queue to see if any documents need to be written to the SPC directory located within the EC domain.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessQueue()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then
SPCDir = Environment_Services('GetSPCDataPath')
hSPCQueue = Database_Services('GetTableHandle', 'SPC_QUEUE')
If Error_Services('NoError') then
Set_Status(0)
SelectStatement = 'SELECT SPC_QUEUE'
RList(SelectStatement, 5)
StatusCode = ''
If Get_Status(StatusCode) Then
Null
end else
EOF = False$
Loop
Readnext SPCQueueID else EOF = True$
Until EOF
Read QPCQueueRec from hSPCQueue, SPCQueueID then
Filename = QPCQueueRec<SPC_QUEUE.SPC_FILENAME$>
SPCDoc = QPCQueueRec<SPC_QUEUE.SPC_DOC$>
FullDir = SPCDir:'\':Filename
Set_Status(0)
OSWrite SPCDoc on FullDir
If Get_Status(StatusCode) then
ErrMsg = 'Error writing ':Filename:' to ':SPCDir:'. Error code: ':StatusCode
Error_Services('Add', ErrMsg)
end else
Delete hSPCQueue, SPCQueueID else
ErrCode = Status()
ErrMsg = 'Error deleting SPC Record ':SPCQueueID:'from queue. Error code: ':ErrCode
Error_Services('Add', ErrMsg)
end
end
end
Repeat
end
end
ClearSelect 0
Unlock hSysLists, ServiceKeyID else Null
end
end service
//----------------------------------------------------------------------------------------------------------------------
// PostToQueue
//
// Posts an SPC document to the SPC Queue for processing on the EC server.
//----------------------------------------------------------------------------------------------------------------------
Service PostToQueue(Tablename, KeyID)
Username = @USER4
Begin Case
Case Tablename _EQC 'RDS_TEST'
Filename = 'SPC_Data.txt'
SPCQueueKey = Date():'*':Time():'*':Username
DupRequest = RowExists('SPC_QUEUE', SPCQueueKey)
If DupRequest then return
SPCQueueRec = ''
SPCQueueRec<SPC_QUEUE.SPC_FILENAME$> = Filename
Database_Services('ActivateRecord', Tablename, KeyID)
DataLine = ''
PSNo = {PS_NO}
RDSNo = {RDS_NO}
LSId = {LS_ID}
Reactor = {REACTOR}
Zone = {ZONE}
ThickAvg = OConv({THICK_AVG}, 'MD2')
ThickStdv = OConv({THICK_STDV}, 'MD4')
SheetRhoAvg = OConv({SHEETRHO_AVG}, 'MD3')
SheetRhoStdv = OConv({SHEETRHO_STDV}, 'MD4')
ResAvg = OConv({RES_AVG}, 'MD4')
ResStdv = Oconv({RES_STDV}, 'MD4')
HgcvAvg = OConv({HGCV1_RES_AVG}, 'MD3')
HgCvStdv = OConv({HGCV1_RES_STDV}, 'MD3')
GrowthRate = OConv({GROWTH_RATE}, 'MD2')
ThickRange = OConv({THICK_RANGE}, 'MD2')
ThickRangePcnt = OConv({THICK_RANGE_PCNT}, 'MD4')
SheetRhoRange = OConv({SHEETRHO_RANGE}, 'MD3')
SheetRhoRangePcnt = OConv({SHEETRHO_RANGE_PCNT}, 'MD4')
ResRange = OConv({RES_RANGE}, 'MD4')
ResRangePcnt = OConv({RES_RANGE_PCNT}, 'MD4')
Hgcv1ResRange = OConv({HGCV1_RES_RANGE}, 'MD3')
Hgcv1ResRangePcnt = OConv({HGCV1_RES_RANGE_PCNT}, 'MD4')
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')
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(Username,'[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$
SPCQueueRec<SPC_QUEUE.SPC_DOC$> = DataLine:CRLF$
Database_Services('WriteDataRow', 'SPC_QUEUE', SPCQueueKey, SPCQueueRec, True$, False$, True$)
Case Tablename _EQC 'NCR'
Filename = 'NCR_Data.txt'
SPCQueueKey = Date():'*':Time():'*':@USER4
DupRequest = RowExists('SPC_QUEUE', SPCQueueKey)
If DupRequest then return
SPCQueueRec = ''
SPCQueueRec<SPC_QUEUE.SPC_FILENAME$> = Filename
Database_Services('ActivateRecord', TableName, KeyID)
DataLine = ''
NCRNo = KeyID
CustName = {CUST_NAME}
PSNo = {PROD_SPEC_NO}
RDSIDs = {RDS_ID}
RDSReactors = {REACTOR}
RejCnt = {REJ_CNT}
DeptResp = {DEPT_RESP}
LossCode = {LOSS_CODE}
LossDesc = {LOSS_DESC}
LossStage = {LOSS_STAGE}
LossBy = {LOSS_BY}
ACCode = {AC_CODE}
ACDesc = {AC_DESC}
ReactorType = {REACTOR_TYPE}
RDSCnt = DCount(RDSIDs, @VM)
FOR RDSIndex = 1 TO RDSCnt
DataLine = QUOTE(NCRNo):TAB$
DataLine := QUOTE(RDSIDs<1, RDSIndex>):TAB$
IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
* EpiPRO reactors in SPC have "EP" on the front.
DataLine := QUOTE('EP':RDSReactors<1, RDSIndex>):TAB$
END ELSE
DataLine := QUOTE(RDSReactors<1, RDSIndex>):TAB$
END
DataLine := QUOTE(RejCnt<1, RDSIndex>):TAB$
DataLine := QUOTE(PSNo):TAB$
DataLine := QUOTE(DeptResp):TAB$
DataLine := QUOTE(LossCode):TAB$
DataLine := QUOTE(LossDesc):TAB$
DataLine := QUOTE(LossStage):TAB$
DataLine := QUOTE(LossBy):TAB$
DataLine := QUOTE(ACCode):TAB$
DataLine := QUOTE(ACDesc):TAB$
Next RDSIndex
SPCQueueRec<SPC_QUEUE.SPC_DOC$> = DataLine:CRLF$
Database_Services('WriteDataRow', 'SPC_QUEUE', SPCQueueKey, SPCQueueRec, True$, False$, True$)
End Case
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////