diff --git a/FOFBApp/Db/FOFB.template b/FOFBApp/Db/FOFB.template deleted file mode 100644 index b55d0d2..0000000 --- a/FOFBApp/Db/FOFB.template +++ /dev/null @@ -1,859 +0,0 @@ -# -# FOFB database file -# -# Authors: Melissa Aguiar -# -# Created Dez. 03, 2021 -# - -############################ -# FOFB PRCESSING parameters -############################ - -record(longout,"$(P)$(R)FofbProcessingRamWriteEnable-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set ram enable bit") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_PROCESSING_RAM_WRITE") -} -record(longin,"$(P)$(R)FofbProcessingRamWriteEnable-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get ram enable bit") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_PROCESSING_RAM_WRITE") -} - -record(longout,"$(P)$(R)FofbProcessingRamAddr-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set ram address") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_PROCESSING_RAM_ADDR") -} -record(longin,"$(P)$(R)FofbProcessingRamAddr-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get ram address") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_PROCESSING_RAM_ADDR") -} - -record(longout,"$(P)$(R)FofbProcessingRamDataIn-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set ram data input") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_PROCESSING_RAM_DATA_IN") -} -record(longin,"$(P)$(R)FofbProcessingRamDataIn-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get ram data input") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_PROCESSING_RAM_DATA_IN") -} - -record(longout,"$(P)$(R)FofbProcessingRamDataOut-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set ram data output") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_PROCESSING_RAM_DATA_OUT") -} -record(longin,"$(P)$(R)FofbProcessingRamDataOut-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get ram data output") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_PROCESSING_RAM_DATA_OUT") -} - -############################ -# RTM LAMP parameters -############################ - -record(longout,"$(P)$(R)RtmLampStatus-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set RTM LAMP status register") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_STA") -} -record(longin,"$(P)$(R)RtmLampStatus-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get RTM LAMP status register") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_STA") -} - -record(longout,"$(P)$(R)RtmLampDacDataFromWb-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set data from FPGA or wishbone") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CTL_DAC_DATA_FROM_WB") -} -record(longin,"$(P)$(R)RtmLampDacDataFromWb-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get data from FPGA or wishbone") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CTL_DAC_DATA_FROM_WB") -} - -record(longout,"$(P)$(R)RtmLampAmpIFlagL-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set amplifier left overcurrent flag") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_L") -} -record(longin,"$(P)$(R)RtmLampAmpIFlagL-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get amplifier left overcurrent flag") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_L") -} - -record(longout,"$(P)$(R)RtmLampAmpTFlagL-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set amplifier left overtemperature flag") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_L") -} -record(longin,"$(P)$(R)RtmLampAmpTFlagL-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get amplifier left overtemperature flag") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_L") -} - -record(longout,"$(P)$(R)RtmLampAmpIFlagR-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set amplifier right overcurrent flag") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_R") -} -record(longin,"$(P)$(R)RtmLampAmpIFlagR-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get amplifier right overcurrent flag") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_R") -} - -record(longout,"$(P)$(R)RtmLampAmpTFlagR-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set amplifier right overtemperature flag") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_R") -} -record(longin,"$(P)$(R)RtmLampAmpTFlagR-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get amplifier right overtemperature flag") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_R") -} - -record(longout,"$(P)$(R)RtmLampAmpEn-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set amplifier enable") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_AMP_EN") -} -record(longin,"$(P)$(R)RtmLampAmpEn-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get amplifier enable") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_AMP_EN") -} - -record(longout,"$(P)$(R)RtmLampPIOLTriangEn-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI open-loop triangular wave enable") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_OL_TRIANG_ENABLE") -} -record(longin,"$(P)$(R)RtmLampPIOLTriangEn-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI open-loop triangular wave enable") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_OL_TRIANG_ENABLE") -} - -record(longout,"$(P)$(R)RtmLampPIOLSquareEn-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI open-loop square wave enable") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_OL_SQUARE_ENABLE") -} -record(longin,"$(P)$(R)RtmLampPIOLSquareEn-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI open-loop square wave enable") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_OL_SQUARE_ENABLE") -} - -record(longout,"$(P)$(R)RtmLampPISPSquareEn-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI setpoint closed-loop square wave enable") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_SP_SQUARE_ENABLE") -} -record(longin,"$(P)$(R)RtmLampPISPSquareEn-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI setpoint closed-loop square wave enable") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_SP_SQUARE_ENABLE") -} - -record(longout,"$(P)$(R)RtmLampPIEn-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI enable") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_ENABLE") -} -record(longin,"$(P)$(R)RtmLampPIEn-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI enable") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_ENABLE") -} - -record(longout,"$(P)$(R)RtmLampDacData-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set data to be sent to DAC") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_DAC_DATA") -} -record(longin,"$(P)$(R)RtmLampDacData-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get data to be sent to DAC") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_DAC_DATA") -} - -record(longout,"$(P)$(R)RtmLampDacWr-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set register to write DAC data to external IC") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_DAC_WR") -} -record(longin,"$(P)$(R)RtmLampDacWr-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get register to write DAC data to external IC") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_DAC_WR") -} - -record(longout,"$(P)$(R)RtmLampPIKP-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI KP parameter") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_KP_DATA") -} -record(longin,"$(P)$(R)RtmLampPIKP-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI KP parameter") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_KP_DATA") -} - -record(longout,"$(P)$(R)RtmLampPITI-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI TI parameter") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_TI_DATA") -} -record(longin,"$(P)$(R)RtmLampPITI-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI TI parameter") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_TI_DATA") -} - -record(longout,"$(P)$(R)RtmLampPISP-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI setpoint (also used for PI test modes)") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_SP_DATA") -} -record(longin,"$(P)$(R)RtmLampPISP-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI setpoint (also used for PI test modes)") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_SP_DATA") -} - -record(longout,"$(P)$(R)RtmLampPIOLDacCntMax-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI open-loop counter max (defines PI test mode waveform period)") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_PI_OL_DAC_CNT_MAX_DATA") -} -record(longin,"$(P)$(R)RtmLampPIOLDacCntMax-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI open-loop counter max (defines PI test mode waveform period)") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_PI_OL_DAC_CNT_MAX_DATA") -} - -record(longout,"$(P)$(R)RtmLampPISPLimInf-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI setpoint inferior limit (for PI test modes)") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_PI_SP_LIM_INF_DATA") -} -record(longin,"$(P)$(R)RtmLampPISPLimInf-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get PI setpoint inferior limit (for PI test modes)") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_PI_SP_LIM_INF_DATA") -} - -############################ -# FOFB CTRL parameters -############################ - -record(longout,"$(P)$(R)FofbCtrlActPart-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set FOFB CC configuration register") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CFG_VAL_ACT_PART") -} -record(longin,"$(P)$(R)FofbCtrlActPart-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get FOFB CC configuration register") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CFG_VAL_ACT_PART") -} - -record(longout,"$(P)$(R)FofbCtrlErrClr-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set FOFB CC configuration register") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CFG_VAL_ERR_CLR") -} -record(longin,"$(P)$(R)FofbCtrlErrClr-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get FOFB CC configuration register") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CFG_VAL_ERR_CLR") -} - -record(longout,"$(P)$(R)FofbCtrlCcEnable-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set FOFB CC configuration register") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CFG_VAL_CC_ENABLE") -} -record(longin,"$(P)$(R)FofbCtrlCcEnable-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get FOFB CC configuration register") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CFG_VAL_CC_ENABLE") -} - -record(longout,"$(P)$(R)FofbCtrlTfsOverride-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set FOFB CC configuration register") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CFG_VAL_TFS_OVERRIDE") -} -record(longin,"$(P)$(R)FofbCtrlTfsOverride-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get FOFB CC configuration register") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CFG_VAL_TFS_OVERRIDE") -} - -record(longout,"$(P)$(R)FofbCtrlBpmId-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set FOFB CC BPM ID") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_BPM_ID") -} -record(longin,"$(P)$(R)FofbCtrlBpmId-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get FOFB CC BPM ID") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_BPM_ID") -} - -record(longout,"$(P)$(R)FofbCtrlTimeFrameLen-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set time frame length") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TIME_FRAME_LEN") -} -record(longin,"$(P)$(R)FofbCtrlTimeFrameLen-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get time frame length") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TIME_FRAME_LEN") -} - -record(longout,"$(P)$(R)FofbCtrlMgtPowerdown-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set mgt powerdown") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_MGT_POWERDOWN") -} -record(longin,"$(P)$(R)FofbCtrlMgtPowerdown-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get mgt powerdown") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_MGT_POWERDOWN") -} - -record(longout,"$(P)$(R)FofbCtrlMgtLoopback-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set mgt loopback") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_MGT_LOOPBACK") -} -record(longin,"$(P)$(R)FofbCtrlMgtLoopback-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get mgt loopback") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_MGT_LOOPBACK") -} - -record(longout,"$(P)$(R)FofbCtrlTimeFrameDly-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set time frame dly") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TIME_FRAME_DLY") -} -record(longin,"$(P)$(R)FofbCtrlTimeFrameDly-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get time frame dly") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TIME_FRAME_DLY") -} - -record(longout,"$(P)$(R)FofbCtrlGoldenOrbX-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set golden orbit x") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_GOLDEN_ORB_X") -} -record(longin,"$(P)$(R)FofbCtrlGoldenOrbX-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get golden orbit x") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_GOLDEN_ORB_X") -} - -record(longout,"$(P)$(R)FofbCtrlGoldenOrbY-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set golden orbit y") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_GOLDEN_ORB_Y") -} -record(longin,"$(P)$(R)FofbCtrlGoldenOrbY-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get golden orbit y") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_GOLDEN_ORB_Y") -} - -record(longout,"$(P)$(R)FofbCtrlCustFeature-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set cust feature") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CUST_FEATURE") -} -record(longin,"$(P)$(R)FofbCtrlCustFeature-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get cust feature") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_CUST_FEATURE") -} - -record(longout,"$(P)$(R)FofbCtrlRxPolarity-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set rx polarity") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RXPOLARITY") -} -record(longin,"$(P)$(R)FofbCtrlRxPolarity-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get rx polarity") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RXPOLARITY") -} - -record(longout,"$(P)$(R)FofbCtrlPayloadsel-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set payload sel") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_PAYLOADSEL") -} -record(longin,"$(P)$(R)FofbCtrlPayloadsel-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get payload sel") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_PAYLOADSEL") -} - -record(longout,"$(P)$(R)FofbCtrlFofbdatasel-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set fofb data sel") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FOFBDATASEL") -} -record(longin,"$(P)$(R)FofbCtrlFofbdatasel-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get fofb data sel") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FOFBDATASEL") -} - -record(longout,"$(P)$(R)FofbCtrlFirmwareVer-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set firmware version") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FIRMWARE_VER") -} -record(longin,"$(P)$(R)FofbCtrlFirmwareVer-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get firmware version") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FIRMWARE_VER") -} - -record(longout,"$(P)$(R)FofbCtrlSysStatus-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set system status") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_SYS_STATUS") -} -record(longin,"$(P)$(R)FofbCtrlSysStatus-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get system status") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_SYS_STATUS") -} - -record(longout,"$(P)$(R)FofbCtrlLinkPartner-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set link partner") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_LINK_PARTNER_1") -} -record(longin,"$(P)$(R)FofbCtrlLinkPartner-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get link partner") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_LINK_PARTNER_1") -} - -record(longout,"$(P)$(R)FofbCtrlLinkUp-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set link up") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_LINK_UP") -} -record(longin,"$(P)$(R)FofbCtrlLinkUp-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get link up") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_LINK_UP") -} - -record(longout,"$(P)$(R)FofbCtrlTimeFrameCount-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set time frame count") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TIME_FRAME_COUNT") -} -record(longin,"$(P)$(R)FofbCtrlTimeFrameCount-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get time frame count") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TIME_FRAME_COUNT") -} - -record(longout,"$(P)$(R)FofbCtrlHardErrCnt-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set hard errors count") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_HARD_ERR_CNT_1") -} -record(longin,"$(P)$(R)FofbCtrlHardErrCnt-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get hard errors count") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_HARD_ERR_CNT_1") -} - -record(longout,"$(P)$(R)FofbCtrlSoftErrCnt-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set soft errors count") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_SOFT_ERR_CNT_1") -} -record(longin,"$(P)$(R)FofbCtrlSoftErrCnt-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get soft errors count") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_SOFT_ERR_CNT_1") -} - -record(longout,"$(P)$(R)FofbCtrlFrameErrCnt-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set frame errors count") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FRAME_ERR_CNT_1") -} -record(longin,"$(P)$(R)FofbCtrlFrameErrCnt-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get frame errors count") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FRAME_ERR_CNT_1") -} - -record(longout,"$(P)$(R)FofbCtrlRxPckCnt-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set rx packet count") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RX_PCK_CNT_1") -} -record(longin,"$(P)$(R)FofbCtrlRxPckCnt-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get rx packet count") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RX_PCK_CNT_1") -} - -record(longout,"$(P)$(R)FofbCtrlTxPckCnt-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set PI tx packet count") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TX_PCK_CNT_1") -} -record(longin,"$(P)$(R)FofbCtrlTxPckCnt-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get tx packet count") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TX_PCK_CNT_1") -} - -record(longout,"$(P)$(R)FofbCtrlFodProcessTime-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set fod process time") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FOD_PROCESS_TIME") -} -record(longin,"$(P)$(R)FofbCtrlFodProcessTime-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get fod process time") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FOD_PROCESS_TIME") -} - -record(longout,"$(P)$(R)FofbCtrlBpmCnt-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set bpm count") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_BPM_COUNT") -} -record(longin,"$(P)$(R)FofbCtrlBpmCnt-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get bpm count") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_BPM_COUNT") -} - -record(longout,"$(P)$(R)FofbCtrlBpmIdRdback-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set bpm id readback") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_BPM_ID_RDBACK") -} -record(longin,"$(P)$(R)FofbCtrlBpmIdRdback-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get bpm id readback") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_BPM_ID_RDBACK") -} - -record(longout,"$(P)$(R)FofbCtrlTfLengthRdback-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set time frame length readback") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TF_LENGTH_RDBACK") -} -record(longin,"$(P)$(R)FofbCtrlTfLengthRdback-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get timeframe length readback") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TF_LENGTH_RDBACK") -} - -record(longout,"$(P)$(R)FofbCtrlPowerdownRdback-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set powerdown readback") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_POWERDOWN_RDBACK") -} -record(longin,"$(P)$(R)FofbCtrlPowerdownRdback-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get powerdown readback") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_POWERDOWN_RDBACK") -} - -record(longout,"$(P)$(R)FofbCtrlLoopbackRdback-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set loopback readback") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_LOOPBACK_RDBACK") -} -record(longin,"$(P)$(R)FofbCtrlLoopbackRdback-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get loopback readback") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_LOOPBACK_RDBACK") -} - -record(longout,"$(P)$(R)FofbCtrlFaivalRdback-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set faival readback") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FAIVAL_RDBACK") -} -record(longin,"$(P)$(R)FofbCtrlFaivalRdback-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get faival readback") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_FAIVAL_RDBACK") -} - -record(longout,"$(P)$(R)FofbCtrlToaRdEn-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set toa ctl read enable") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TOA_CTL_RD_EN") -} -record(longin,"$(P)$(R)FofbCtrlToaRdEn-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get toa ctl read enable") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TOA_CTL_RD_EN") -} - -record(longout,"$(P)$(R)FofbCtrlToaRdStr-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set toa ctl read string") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TOA_CTL_RD_STR") -} -record(longin,"$(P)$(R)FofbCtrlToaRdStr-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get toa ctl read string") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TOA_CTL_RD_STR") -} - -record(longout,"$(P)$(R)FofbCtrlToaData-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set toa data") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TOA_DATA_VAL") -} -record(longin,"$(P)$(R)FofbCtrlToaData-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get toa data") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_TOA_DATA_VAL") -} - -record(longout,"$(P)$(R)FofbCtrlRcbRdEn-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set rcb ctl read enable") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RCB_CTL_RD_EN") -} -record(longin,"$(P)$(R)FofbCtrlRcbRdEn-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get rcb ctl read enable") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RCB_CTL_RD_EN") -} - -record(longout,"$(P)$(R)FofbCtrlRcbRdStr-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set rcb ctl read string") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RCB_CTL_RD_STR") -} -record(longin,"$(P)$(R)FofbCtrlRcbRdStr-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get rcb ctl read string") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RCB_CTL_RD_STR") -} -record(longout,"$(P)$(R)FofbCtrlRcbData-SP"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"set rcb data") - field(PINI,"YES") - field(SCAN,"Passive") - field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RCB_DATA_VAL") -} -record(longin,"$(P)$(R)FofbCtrlRcbData-RB"){ - field(DTYP,"asynUInt32Digital") - field(DESC,"get rcb data") - field(SCAN,"I/O Intr") - field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))FOFB_CC_RCB_DATA_VAL") -} - diff --git a/FOFBApp/Db/FOFBAcq.template b/FOFBApp/Db/FOFBAcq.template new file mode 100644 index 0000000..1971230 --- /dev/null +++ b/FOFBApp/Db/FOFBAcq.template @@ -0,0 +1,375 @@ +################################## +# Waveform Acquisition parameters +################################## +record(longout,"$(P)$(R)$(ACQ_NAME)SamplesPre-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set number of pre samples for waveforms") + field(PINI,"YES") + field(DRVH,"100000") + field(DRVL,"0") + field(HOPR,"100000") + field(LOPR,"0") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_SAMPLES_PRE") +} + +record(longin,"$(P)$(R)$(ACQ_NAME)SamplesPre-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get number of pre samples for waveforms") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_SAMPLES_PRE") +} + +record(longout,"$(P)$(R)$(ACQ_NAME)SamplesPost-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set number of post samples for waveforms") + field(PINI,"YES") + field(DRVH,"100000") + field(DRVL,"0") + field(HOPR,"100000") + field(LOPR,"0") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_SAMPLES_POST") +} + +record(longin,"$(P)$(R)$(ACQ_NAME)SamplesPost-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get number of post samples for waveforms") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_SAMPLES_POST") +} + +record(longout,"$(P)$(R)$(ACQ_NAME)Shots-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set number of shots for waveforms") + field(PINI,"YES") + field(DRVH,"100000") + field(DRVL,"1") + field(HOPR,"100000") + field(LOPR,"1") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_NUM_SHOTS") +} + +record(longin,"$(P)$(R)$(ACQ_NAME)Shots-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get number of shots for waveforms") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_NUM_SHOTS") +} + +record(mbbo, "$(P)$(R)$(ACQ_NAME)Channel-Sel"){ + field(DTYP, "asynInt32") + field(DESC, "Set acquisition's channel") + field(PINI,"YES") + field(OUT,"@asyn($(PORT),$(ADDR),$(TIMEOUT))ACQ_CHANNEL") + field(SCAN,"Passive") + field(NOBT,"3") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(THVL,"3") + field(ZRST,"adc") + field(ONST,"tbt") + field(TWST,"fofb") + field(THST,"monit1") +} + +record(mbbi, "$(P)$(R)$(ACQ_NAME)Channel-Sts"){ + field(DTYP, "asynInt32") + field(DESC, "Get acquisition's channel") + field(INP,"@asyn($(PORT),$(ADDR),$(TIMEOUT))ACQ_CHANNEL") + field(SCAN,"I/O Intr") + field(NOBT,"3") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(THVL,"3") + field(ZRST,"adc") + field(ONST,"tbt") + field(TWST,"fofb") + field(THST,"monit1") +} + +# For use with rate seq record defined in FFTRecords.template +record(calc, "$(P)$(R)$(ACQ_NAME)ChannelRateIdx-RB"){ + field(DESC, "get acquisition's channel index") + field(SCAN,"Passive") + field(INPA,"$(P)$(R)$(ACQ_NAME)Channel-Sts.RVAL CP NMS") + field(CALC,"A+1") +} + +record(mbbo, "$(P)$(R)$(ACQ_NAME)Trigger-Sel"){ + field(DTYP, "asynUInt32Digital") + field(DESC, "Set acquisition's trigger") + field(PINI,"YES") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER") + field(SCAN,"Passive") + field(NOBT,"2") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(THVL,"3") + field(ZRST,"now") + field(ONST,"external") + field(TWST,"data") + field(THST,"software") +} + +record(mbbi, "$(P)$(R)$(ACQ_NAME)Trigger-Sts"){ + field(DTYP, "asynUInt32Digital") + field(DESC, "Get acquisition's trigger") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER") + field(SCAN,"I/O Intr") + field(NOBT,"2") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(THVL,"3") + field(ZRST,"now") + field(ONST,"external") + field(TWST,"data") + field(THST,"software") +} + +record(mbbo, "$(P)$(R)$(ACQ_NAME)TriggerEvent-Sel"){ + field(DTYP, "asynUInt32Digital") + field(DESC, "Set acquisition's trigger event") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_EVENT") + field(SCAN,"Passive") + field(NOBT,"2") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(ZRST,"start") + field(ONST,"stop") + field(TWST,"abort") +} + +record(mbbi, "$(P)$(R)$(ACQ_NAME)TriggerEvent-Sts"){ + field(DTYP, "asynUInt32Digital") + field(DESC, "Get acquisition's trigger event") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_EVENT") + field(SCAN,"I/O Intr") + field(NOBT,"2") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(ZRST,"start") + field(ONST,"stop") + field(TWST,"abort") +} + +record(mbbo, "$(P)$(R)$(ACQ_NAME)TriggerRep-Sel"){ + field(DTYP, "asynUInt32Digital") + field(DESC, "Set acquisition's trigger repetitive") + field(PINI,"YES") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_REP") + field(SCAN,"Passive") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"normal") + field(ONST,"repetitive") +} + +record(mbbi, "$(P)$(R)$(ACQ_NAME)TriggerRep-Sts"){ + field(DTYP, "asynUInt32Digital") + field(DESC, "Get acquisition's trigger repetitive") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_REP") + field(SCAN,"I/O Intr") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"normal") + field(ONST,"repetitive") +} + +record(longout,"$(P)$(R)$(ACQ_NAME)TriggerDataThres-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set data trigger threshold") + field(PINI,"YES") + field(DRVH,"2147483647") + field(DRVL,"0") + field(HOPR,"2147483647") + field(LOPR,"0") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_THRES") +} + +record(longin,"$(P)$(R)$(ACQ_NAME)TriggerDataThres-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get data trigger threshold") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_THRES") +} + +record(mbbo,"$(P)$(R)$(ACQ_NAME)TriggerDataPol-Sel"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set data trigger polarity") + field(PINI,"YES") + field(SCAN,"Passive") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"positive") + field(ONST,"negative") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_POL") +} + +record(mbbi,"$(P)$(R)$(ACQ_NAME)TriggerDataPol-Sts"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get data trigger polarity") + field(SCAN,"I/O Intr") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"positive") + field(ONST,"negative") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_POL") +} + +record(longout,"$(P)$(R)$(ACQ_NAME)TriggerDataSel-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set data trigger selection") + field(PINI,"YES") + field(DRVH,"31") + field(DRVL,"0") + field(HOPR,"31") + field(LOPR,"0") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_SEL") +} + +record(longin,"$(P)$(R)$(ACQ_NAME)TriggerDataSel-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get data trigger selection") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_SEL") +} + +record(longout,"$(P)$(R)$(ACQ_NAME)TriggerDataHyst-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set data trigger hysteresis") + field(PINI,"YES") + field(DRVH,"255") + field(DRVL,"0") + field(HOPR,"255") + field(LOPR,"0") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_FILT") +} + +record(longin,"$(P)$(R)$(ACQ_NAME)TriggerDataHyst-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get data trigger hysteresis") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_FILT") +} + +record(longout,"$(P)$(R)$(ACQ_NAME)TriggerHwDly-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set trigger delay") + field(PINI,"YES") + field(DRVH,"2147483647") + field(DRVL,"0") + field(HOPR,"2147483647") + field(LOPR,"0") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_HWDLY") +} + +record(longin,"$(P)$(R)$(ACQ_NAME)TriggerHwDly-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get trigger delay") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_TRIGGER_HWDLY") +} + +record(mbbo,"$(P)$(R)$(ACQ_NAME)DataTrigChan-Sel"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set data-driven trigger channel") + field(PINI,"YES") + field(SCAN,"Passive") + field(NOBT,"3") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(THVL,"3") + field(ZRST,"adc") + field(ONST,"tbt") + field(TWST,"fofb") + field(THST,"monit1") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_DATA_TRIG_CHAN") +} + +record(mbbi,"$(P)$(R)$(ACQ_NAME)DataTrigChan-Sts"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get data-driven trigger channel") + field(SCAN,"I/O Intr") + field(NOBT,"3") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(THVL,"3") + field(ZRST,"adc") + field(ONST,"tbt") + field(TWST,"fofb") + field(THST,"monit1") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_DATA_TRIG_CHAN") +} + +record(mbbi, "$(P)$(R)$(ACQ_NAME)Status-Sts"){ + field(DTYP, "asynInt32") + field(DESC, "Get acquisition's status") + field(INP,"@asyn($(PORT),$(ADDR),$(TIMEOUT))ACQ_STATUS") + field(SCAN,"I/O Intr") + field(NOBT,"4") + field(ZRVL,"0") + field(ONVL,"1") + field(TWVL,"2") + field(THVL,"3") + field(FRVL,"4") + field(FVVL,"5") + field(SXVL,"6") + field(SVVL,"7") + field(EIVL,"8") + field(NIVL,"9") + field(TEVL,"10") + field(ELVL,"11") + field(ZRST,"Idle") + field(ONST,"Waiting") + field(TWST,"External Trig") + field(THST,"Data Trig") + field(FRST,"Software Trig") + field(FVST,"Acquiring") + field(SXST,"Error") + field(SVST,"Aborted") + field(EIST,"Too Many Samples") + field(NIST,"Too Few Samples") + field(TEST,"No Memory") + field(ELST,"Acq. Overflow") +} + +record(ao, "$(P)$(R)$(ACQ_NAME)UpdateTime-SP"){ + field(DTYP, "asynFloat64") + field(DESC, "Set repetitive mode update time") + field(PINI,"YES") + field(DRVH,"100000") + field(DRVL,"0.001") + field(HOPR,"100000") + field(LOPR,"0.001") + field(PREC,"3") + field(OUT,"@asyn($(PORT),$(ADDR),$(TIMEOUT))ACQ_UPDATE_TIME") + field(SCAN,"Passive") + field(EGU, "s") +} + +record(ai, "$(P)$(R)$(ACQ_NAME)UpdateTime-RB"){ + field(DTYP, "asynFloat64") + field(DESC, "Get repetitive mode update time") + field(PREC,"3") + field(SCAN,"I/O Intr") + field(INP,"@asyn($(PORT),$(ADDR),$(TIMEOUT))ACQ_UPDATE_TIME") + field(EGU, "s") +} diff --git a/FOFBApp/Db/FOFBAcq_settings.req b/FOFBApp/Db/FOFBAcq_settings.req new file mode 100644 index 0000000..16b2bf6 --- /dev/null +++ b/FOFBApp/Db/FOFBAcq_settings.req @@ -0,0 +1,16 @@ +$(P)$(R)$(ACQ_NAME)SamplesPre-SP +$(P)$(R)$(ACQ_NAME)SamplesPost-SP +$(P)$(R)$(ACQ_NAME)Shots-SP +$(P)$(R)$(ACQ_NAME)Channel-Sel +$(P)$(R)$(ACQ_NAME)UpdateTime-SP +$(P)$(R)$(ACQ_NAME)Trigger-Sel +$(P)$(R)$(ACQ_NAME)TriggerRep-Sel +$(P)$(R)$(ACQ_NAME)TriggerDataThres-SP +$(P)$(R)$(ACQ_NAME)TriggerDataPol-Sel +$(P)$(R)$(ACQ_NAME)TriggerDataSel-SP +$(P)$(R)$(ACQ_NAME)TriggerDataHyst-SP +$(P)$(R)$(ACQ_NAME)TriggerHwDly-SP +$(P)$(R)$(ACQ_NAME)TriggerRep-Sel +$(P)$(R)$(ACQ_NAME)ArrayDataWvf +$(P)$(R)$(ACQ_NAME)ArrayData +$(P)$(R)$(ACQ_NAME)ArrayDataSeq diff --git a/FOFBApp/Db/FOFBData.template b/FOFBApp/Db/FOFBData.template new file mode 100644 index 0000000..3549a62 --- /dev/null +++ b/FOFBApp/Db/FOFBData.template @@ -0,0 +1,93 @@ +record(waveform,"$(P)$(R)$(ACQ_NAME)ArrayDataWvf") +{ + field(DESC, "Data waveform $(ACQ_NAME)") + field(NELM,"$(NELEMENTS)") + field(FTVL, "LONG") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") + field(FLNK, "$(P)$(R)$(ACQ_NAME)ArrayData") +} + +record(subArray,"$(P)$(R)$(ACQ_NAME)ArrayData") +{ + field(DESC, "Data $(ACQ_NAME)") + field(INP, "$(P)$(R)$(ACQ_NAME)ArrayDataWvf NPP NMS") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") + field(MALM, "$(NELEMENTS)") + field(FTVL, "LONG") + field(FLNK, "$(P)$(R)$(ACQ_NAME)ArrayDataSeq") +} + +# Adjust NELM of subarray so clients get correct monitors when +# number os elements change +record(seq, "$(P)$(R)$(ACQ_NAME)ArrayDataSeq"){ +field(DESC,"Get NORD from $(ACQ_NAME)$ waveform") +field(PINI,"YES") +field(DOL1, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.NORD NPP NMS") +field(LNK1, "$(P)$(R)$(ACQ_NAME)ArrayData.NELM PP NMS") +field(SELM, "All") +} + +# Offset and Gain records + +record(ao,"$(P)$(R)RtmLampWvfOffset$(RTM_CHAN)-SP"){ + field(DESC,"set waveform offset") + field(PINI,"YES") + field(SCAN,"Passive") + field(FLNK,"$(P)$(R)$(ACQ_NAME)ConvArrayDataC$(RTM_CHAN) CPP NMS") +} + +record(ao,"$(P)$(R)RtmLampWvfGain$(RTM_CHAN)-SP"){ + field(DESC,"set waveform gain") + field(PINI,"YES") + field(SCAN,"Passive") + field(PREC,"8") + field(FLNK,"$(P)$(R)$(ACQ_NAME)ConvArrayDataC$(RTM_CHAN) CPP NMS") +} + +# Gain and Offset corrected waveform. +record(acalcout,"$(P)$(R)$(ACQ_NAME)ConvArrayDataC$(RTM_CHAN)") +{ + field(DESC, "gain/offset waveform $(ACQ_NAME)Conv") + field(NELM, "$(NELEMENTS)") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") + field(PINI, "YES") + field(SCAN, "Passive") + field(INPA, "$(P)$(R)RtmLampWvfGain$(RTM_CHAN)-SP") + field(INPB, "$(P)$(R)RtmLampWvfOffset$(RTM_CHAN)-SP") + field(INAA, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.VAL CPP NMS") + field(WAIT, "Wait") + field(OOPT, "Every Time") + field(CALC, "A*(AA-B)") + field(OUT, "$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN) CA NMS") +} + +record(waveform,"$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN)") +{ + field(DESC, "Data calibrated waveform $(ACQ_NAME)$(RTM_CHAN)") + field(NELM, "$(NELEMENTS)") + field(FTVL, "$(FTVL)") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") + field(FLNK, "$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN) PP") + } + +record(subArray,"$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN)") +{ + field(DESC, "Data calibrated $(ACQ_NAME)") + field(NELM, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.NORD") + field(INP, "$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN) NPP NMS") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") + field(MALM, "1000") + field(FTVL, "$(FTVL)") + field(FLNK, "$(P)$(R)$(ACQ_NAME)ConvArrayDataSeq$(RTM_CHAN)") +} + +# Adjust NELM of subarray so clients get correct monitors when +# number os elements change +record(seq, "$(P)$(R)$(ACQ_NAME)ConvArrayDataSeq$(RTM_CHAN)"){ + field(DESC,"Get NORD from $(ACQ_NAME)Raw waveform") + field(PINI,"YES") + field(DOL1, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.NORD NPP NMS") + field(LNK1, "$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN).NELM PP NMS") + field(SELM, "All") +} + diff --git a/FOFBApp/Db/FOFBInfo.template b/FOFBApp/Db/FOFBInfo.template new file mode 100644 index 0000000..68f2fa3 --- /dev/null +++ b/FOFBApp/Db/FOFBInfo.template @@ -0,0 +1,87 @@ +# +# FOFB database file +# +# Authors: Melissa Aguiar +# +# Created Dec. 24, 2021 +# + +###################################### +# General Board information parameters +###################################### + + +record(longout,"$(P)$(R)INFOADCRate-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set ADC rate factor") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_ADCRATE") +} + +record(longin,"$(P)$(R)INFOADCRate-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get ADC rate factor") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_ADCRATE") +} + +record(longout,"$(P)$(R)INFOTBTRate-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set TBT rate factor") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_TBTRATE") +} + +record(longin,"$(P)$(R)INFOTBTRate-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get TBT rate factor") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_TBTRATE") +} + +record(longout,"$(P)$(R)INFOFOFBRate-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set FOFB rate factor") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_FOFBRATE") +} + +record(longin,"$(P)$(R)INFOFOFBRate-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get FOFB rate factor") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_FOFBRATE") +} + +record(longout,"$(P)$(R)INFOMONITRate-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set MONIT rate factor") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_MONITRATE") +} + +record(longin,"$(P)$(R)INFOMONITRate-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get MONIT rate factor") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_MONITRATE") +} + +record(longout,"$(P)$(R)INFOMONIT1Rate-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set MONIT1 rate factor") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_MONIT1RATE") +} + +record(longin,"$(P)$(R)INFOMONIT1Rate-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get MONIT1 rate factor") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))INFO_MONIT1RATE") +} diff --git a/FOFBApp/Db/FOFBInfo_settings.req b/FOFBApp/Db/FOFBInfo_settings.req new file mode 100644 index 0000000..3a405e6 --- /dev/null +++ b/FOFBApp/Db/FOFBInfo_settings.req @@ -0,0 +1,4 @@ +$(P)$(R)INFOTBTRate-SP +$(P)$(R)INFOFOFBRate-SP +$(P)$(R)INFOMONITRate-SP +$(P)$(R)INFOMONIT1Rate-SP diff --git a/FOFBApp/Db/FOFBRtm.template b/FOFBApp/Db/FOFBRtm.template new file mode 100644 index 0000000..d3827ad --- /dev/null +++ b/FOFBApp/Db/FOFBRtm.template @@ -0,0 +1,300 @@ +# +# FOFB database file +# +# Authors: Melissa Aguiar +# +# Created Dez. 03, 2021 +# + +record(longout,"$(P)$(R)RtmLampStatus-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set RTM LAMP status register") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_STA") +} +record(longin,"$(P)$(R)RtmLampStatus-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get RTM LAMP status register") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_STA") +} + +record(longout,"$(P)$(R)RtmLampDacDataFromWb-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set data from FPGA or wishbone") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CTL_DAC_DATA_FROM_WB") +} +record(longin,"$(P)$(R)RtmLampDacDataFromWb-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get data from FPGA or wishbone") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CTL_DAC_DATA_FROM_WB") +} + +record(mbbo,"$(P)$(R)RtmLampAmpIFlagL$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set amplifier left overcurrent flag") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_L") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"over") + field(ONST,"ok") +} +record(mbbi,"$(P)$(R)RtmLampAmpIFlagL$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get amplifier left overcurrent flag") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_L") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"over") + field(ONST,"ok") +} + +record(mbbo,"$(P)$(R)RtmLampAmpTFlagL$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set amplifier left overtemperature flag") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_L") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"over") + field(ONST,"ok") +} +record(mbbi,"$(P)$(R)RtmLampAmpTFlagL$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get amplifier left overtemperature flag") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_L") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"over") + field(ONST,"ok") +} + +record(mbbo,"$(P)$(R)RtmLampAmpIFlagR$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set amplifier right overcurrent flag") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_R") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"over") + field(ONST,"ok") +} +record(mbbi,"$(P)$(R)RtmLampAmpIFlagR$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get amplifier right overcurrent flag") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_R") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"over") + field(ONST,"ok") +} + +record(mbbo,"$(P)$(R)RtmLampAmpTFlagR$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set amplifier right overtemperature flag") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_R") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"over") + field(ONST,"ok") +} +record(mbbi,"$(P)$(R)RtmLampAmpTFlagR$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get amplifier right overtemperature flag") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_R") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"over") + field(ONST,"ok") +} + +record(longout,"$(P)$(R)RtmLampAmpEn$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set amplifier enable") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_AMP_EN") +} +record(longin,"$(P)$(R)RtmLampAmpEn$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get amplifier enable") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_AMP_EN") +} + +record(longout,"$(P)$(R)RtmLampPIOLTriangEn$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI open-loop triangular wave enable") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_OL_TRIANG_ENABLE") +} +record(longin,"$(P)$(R)RtmLampPIOLTriangEn$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI open-loop triangular wave enable") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_OL_TRIANG_ENABLE") +} + +record(longout,"$(P)$(R)RtmLampPIOLSquareEn$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI open-loop square wave enable") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_OL_SQUARE_ENABLE") +} +record(longin,"$(P)$(R)RtmLampPIOLSquareEn$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI open-loop square wave enable") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_OL_SQUARE_ENABLE") +} + +record(longout,"$(P)$(R)RtmLampPISPSquareEn$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI closed-loop square wave enable") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_SP_SQUARE_ENABLE") +} +record(longin,"$(P)$(R)RtmLampPISPSquareEn$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI closed-loop square wave enable") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_SP_SQUARE_ENABLE") +} + +record(longout,"$(P)$(R)RtmLampPIEn$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI enable") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_ENABLE") +} +record(longin,"$(P)$(R)RtmLampPIEn$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI enable") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_CTL_PI_ENABLE") +} + +record(longout,"$(P)$(R)RtmLampDacData$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set data to be sent to DAC") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_DAC_DATA") +} +record(longin,"$(P)$(R)RtmLampDacData$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get data to be sent to DAC") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_DAC_DATA") +} + +record(longout,"$(P)$(R)RtmLampDacWr$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"write DAC data to external IC") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_DAC_WR") +} +record(longin,"$(P)$(R)RtmLampDacWr$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"write DAC data to external IC") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_DAC_WR") +} + +record(longout,"$(P)$(R)RtmLampPIKP$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI KP parameter") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_KP_DATA") +} +record(longin,"$(P)$(R)RtmLampPIKP$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI KP parameter") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_KP_DATA") +} + +record(longout,"$(P)$(R)RtmLampPITI$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI TI parameter") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_TI_DATA") +} +record(longin,"$(P)$(R)RtmLampPITI$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI TI parameter") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_TI_DATA") +} + +record(longout,"$(P)$(R)RtmLampPISP$(RTM_CHAN)-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI setpoint") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_SP_DATA") +} +record(longin,"$(P)$(R)RtmLampPISP$(RTM_CHAN)-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI setpoint") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CH_0_PI_SP_DATA") +} + +record(longout,"$(P)$(R)RtmLampPIOLDacCntMax-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI open-loop counter max") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_PI_OL_DAC_CNT_MAX_DATA") +} +record(longin,"$(P)$(R)RtmLampPIOLDacCntMax-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI open-loop counter max") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_PI_OL_DAC_CNT_MAX_DATA") +} + +record(longout,"$(P)$(R)RtmLampPISPLimInf-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"set PI setpoint inferior limit") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_PI_SP_LIM_INF_DATA") +} +record(longin,"$(P)$(R)RtmLampPISPLimInf-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"get PI setpoint inferior limit") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_PI_SP_LIM_INF_DATA") +} + diff --git a/FOFBApp/Db/FOFBRtm_settings.req b/FOFBApp/Db/FOFBRtm_settings.req new file mode 100644 index 0000000..adf9fc5 --- /dev/null +++ b/FOFBApp/Db/FOFBRtm_settings.req @@ -0,0 +1,15 @@ +$(P)$(R)RtmLampDacDataFromWb-SP +$(P)$(R)RtmLampAmpEn$(RTM_CHAN)-SP +$(P)$(R)RtmLampPIOLTriangEn$(RTM_CHAN)-SP +$(P)$(R)RtmLampPIOLSquareEn$(RTM_CHAN)-SP +$(P)$(R)RtmLampPISPSquareEn$(RTM_CHAN)-SP +$(P)$(R)RtmLampPIEn$(RTM_CHAN)-SP +$(P)$(R)RtmLampDacData$(RTM_CHAN)-SP +$(P)$(R)RtmLampDacWr$(RTM_CHAN)-SP +$(P)$(R)RtmLampPIKP$(RTM_CHAN)-SP +$(P)$(R)RtmLampPITI$(RTM_CHAN)-SP +$(P)$(R)RtmLampPISP$(RTM_CHAN)-SP +$(P)$(R)RtmLampPIOLDacCntMax-SP +$(P)$(R)RtmLampPISPLimInf-SP +$(P)$(R)RtmLampWvfGain$(RTM_CHAN)-SP +$(P)$(R)RtmLampWvfOffset$(RTM_CHAN)-SP diff --git a/FOFBApp/Db/FOFBTrigger.template b/FOFBApp/Db/FOFBTrigger.template new file mode 100644 index 0000000..94c1ee7 --- /dev/null +++ b/FOFBApp/Db/FOFBTrigger.template @@ -0,0 +1,225 @@ +######################### +# Trigger parameters +######################### + +record(longout,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)Chan-SP"){ + field(DTYP,"asynInt32") + field(PINI,"YES") + field(OUT,"@asyn($(PORT),$(ADDR),$(TIMEOUT))TRIGGER_CHAN") + field(VAL, "$(TRIGGER_CHAN)") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)Chan-RB"){ + field(DTYP,"asynInt32") + field(SCAN,"Passive") + field(INP,"@asyn($(PORT),$(ADDR),$(TIMEOUT))TRIGGER_CHAN") +} + +record(mbbo,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)Dir-Sel"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger direction") + field(PINI,"YES") + field(SCAN,"Passive") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"trn") + field(ONST,"rcv") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_DIR") +} + +record(mbbi,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)Dir-Sts"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger direction") + field(SCAN,"I/O Intr") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"trn") + field(ONST,"rcv") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_DIR") +} + +record(mbbo,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)DirPol-Sel"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger direction polarity") + field(PINI,"YES") + field(SCAN,"Passive") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"same") + field(ONST,"rev") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_DIR_POL") +} + +record(mbbi,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)DirPol-Sts"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger direction polarity") + field(SCAN,"I/O Intr") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"same") + field(ONST,"rev") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_DIR_POL") +} + +record(longout,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvCntRst-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger receive counter reset") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_RCV_CNT_RST") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvCntRst-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger receive counter reset") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_RCV_CNT_RST") + field(FLNK,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvCnt-Mon") +} + +record(longout,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnCntRst-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger transmit counter reset") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_TRN_CNT_RST") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnCntRst-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger transmit counter reset") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_TRN_CNT_RST") + field(FLNK,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnCnt-Mon") +} + +record(longout,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvLen-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger receive debounce length") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_RCV_LEN") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvLen-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger receive debounce length") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_RCV_LEN") +} + +record(longout,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnLen-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger transmit extension length") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_TRN_LEN") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnLen-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger transmit extension length") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_TRN_LEN") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvCnt-Mon"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger receive counter") + field(PINI,"YES") + field(SCAN,"5 second") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_CNT_RCV") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnCnt-Mon"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger transmit counter") + field(PINI,"YES") + field(SCAN,"5 second") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_CNT_TRN") +} + +record(mbbo,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvSrc-Sel"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger receive source") + field(PINI,"YES") + field(SCAN,"Passive") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"ext") + field(ONST,"int") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_RCV_SRC") +} + +record(mbbi,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvSrc-Sts"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger receive source") + field(SCAN,"I/O Intr") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"ext") + field(ONST,"int") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_RCV_SRC") +} + +record(mbbo,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnSrc-Sel"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger transmit source") + field(PINI,"YES") + field(SCAN,"Passive") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"ext") + field(ONST,"int") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_TRN_SRC") +} + +record(mbbi,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnSrc-Sts"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger transmit source") + field(SCAN,"I/O Intr") + field(NOBT,"1") + field(ZRVL,"0") + field(ONVL,"1") + field(ZRST,"ext") + field(ONST,"int") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_TRN_SRC") +} + +record(longout,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvInSel-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger receive selection mux") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_RCV_IN_SEL") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvInSel-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger receive selection mux") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_RCV_IN_SEL") +} + +record(longout,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnOutSel-SP"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Set trigger transmit selection mux") + field(PINI,"YES") + field(SCAN,"Passive") + field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_TRN_OUT_SEL") +} + +record(longin,"$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnOutSel-RB"){ + field(DTYP,"asynUInt32Digital") + field(DESC,"Get trigger transmit selection mux") + field(SCAN,"I/O Intr") + field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))TRIGGER_TRN_OUT_SEL") +} + diff --git a/FOFBApp/Db/FOFBTrigger_settings.req b/FOFBApp/Db/FOFBTrigger_settings.req new file mode 100644 index 0000000..9c88682 --- /dev/null +++ b/FOFBApp/Db/FOFBTrigger_settings.req @@ -0,0 +1,8 @@ +$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)Dir-Sel +$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)DirPol-Sel +$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvLen-SP +$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnLen-SP +$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvSrc-Sel +$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnSrc-Sel +$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)RcvInSel-SP +$(P)$(R)$(TRIGGER_NAME)$(TRIGGER_CHAN)TrnOutSel-SP diff --git a/FOFBApp/Db/FOFB_settings.req b/FOFBApp/Db/FOFB_settings.req index a785d21..15eb0a6 100644 --- a/FOFBApp/Db/FOFB_settings.req +++ b/FOFBApp/Db/FOFB_settings.req @@ -1,74 +1,74 @@ -######################### -# FOFB PROCESSING parameters -######################### +file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ_NAME=ACQ +# Don't save ACQ_PM PVs, as we rely on the default values +# to always return Post-Mortem to a safe state. +# file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ_NAME=ACQ_PM -$(P)$(R)FofbProcessingRamWriteEnable-SP -$(P)$(R)FofbProcessingRamAddr-SP -$(P)$(R)FofbProcessingRamDataIn-SP -$(P)$(R)FofbProcessingRamDataOut-SP +file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ=GEN, ARRAY_NAME=CH0 -######################### -# RTM LAMP parameters -######################### +# Regular triggers +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=0, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=1, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=2, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=3, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=4, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=5, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=6, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=7, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=8, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=9, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=10, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=11, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=12, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=13, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=14, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=15, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=16, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=17, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=18, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=19, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=20, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=21, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=22, TRIGGER_NAME=TRIGGER +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=23, TRIGGER_NAME=TRIGGER -$(P)$(R)RtmLampStatus-SP -$(P)$(R)RtmLampDacDataFromWb-SP -$(P)$(R)RtmLampAmpIFlagL-SP -$(P)$(R)RtmLampAmpTFlagL-SP -$(P)$(R)RtmLampAmpIFlagR-SP -$(P)$(R)RtmLampAmpTFlagR-SP -$(P)$(R)RtmLampAmpEn-SP -$(P)$(R)RtmLampPIOLTriangEn-SP -$(P)$(R)RtmLampPIOLSquareEn-SP -$(P)$(R)RtmLampPISPSquareEn-SP -$(P)$(R)RtmLampPIEn-SP -$(P)$(R)RtmLampDacData-SP -$(P)$(R)RtmLampDacWr-SP -$(P)$(R)RtmLampPIKP-SP -$(P)$(R)RtmLampPITI-SP -$(P)$(R)RtmLampPISP-SP -$(P)$(R)RtmLampPIOLDacCntMax-SP -$(P)$(R)RtmLampPISPLimInf-SP +# PM triggers +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=0, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=1, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=2, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=3, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=4, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=5, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=6, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=7, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=8, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=9, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=10, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=11, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=12, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=13, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=14, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=15, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=16, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=17, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=18, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=19, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=20, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=21, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=22, TRIGGER_NAME=TRIGGER_PM +file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=23, TRIGGER_NAME=TRIGGER_PM -############################ -# FOFB CTRL parameters -############################ +# RTM LAMP + +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH0 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH1 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH2 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH3 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH4 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH5 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH6 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH7 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH8 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH9 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH10 +file "FOFBRtm_settings.req", P=$(P), R=$(R), RTM_CHAN=CH11 -$(P)$(R)FofbCtrlActPart-SP -$(P)$(R)FofbCtrlErrClr-SP -$(P)$(R)FofbCtrlCcEnable-SP -$(P)$(R)FofbCtrlTfsOverride-SP -$(P)$(R)FofbCtrlBpmId-SP -$(P)$(R)FofbCtrlTimeFrameLen-SP -$(P)$(R)FofbCtrlMgtPowerdwn-SP -$(P)$(R)FofbCtrlMgtLoopback-SP -$(P)$(R)FofbCtrlTimeFrameDly-SP -$(P)$(R)FofbCtrlGoldenOrbX-SP -$(P)$(R)FofbCtrlGoldenOrbY-SP -$(P)$(R)FofbCtrlCustFeature-SP -$(P)$(R)FofbCtrlRxPolarity-SP -$(P)$(R)FofbCtrlPayloadsel-SP -$(P)$(R)FofbCtrlFofbdatasel-SP -$(P)$(R)FofbCtrlFirmwareVer-SP -$(P)$(R)FofbCtrlSysStatus-SP -$(P)$(R)FofbCtrlLinkPartner-SP -$(P)$(R)FofbCtrlLinkUp-SP -$(P)$(R)FofbCtrlTimeFrameCount-SP -$(P)$(R)FofbCtrlHardErrCnt-SP -$(P)$(R)FofbCtrlSoftErrCnt-SP -$(P)$(R)FofbCtrlFrameErrCnt-SP -$(P)$(R)FofbCtrlRxPckCnt-SP -$(P)$(R)FofbCtrlTxPckCnt-SP -$(P)$(R)FofbCtrlFodProcessTime-SP -$(P)$(R)FofbCtrlBpmCnt-SP -$(P)$(R)FofbCtrlBpmIdRdback-SP -$(P)$(R)FofbCtrlTfLengthRdback-SP -$(P)$(R)FofbCtrlPowerdownRdback-SP -$(P)$(R)FofbCtrlLoopbackRdback-SP -$(P)$(R)FofbCtrlFaivalRdback-SP -$(P)$(R)FofbCtrlToaRdEn-SP -$(P)$(R)FofbCtrlToaRdStr-SP -$(P)$(R)FofbCtrlToaData-SP -$(P)$(R)FofbCtrlRcbRdEn-SP -$(P)$(R)FofbCtrlRcbRdStr-SP -$(P)$(R)FofbCtrlRcbData-SP diff --git a/FOFBApp/Db/NDPluginBase_settings_mod.req b/FOFBApp/Db/NDPluginBase_settings_mod.req new file mode 100644 index 0000000..8d430c2 --- /dev/null +++ b/FOFBApp/Db/NDPluginBase_settings_mod.req @@ -0,0 +1,4 @@ +$(P)$(R)EnableCallbacks +$(P)$(R)MinCallbackTime +$(P)$(R)BlockingCallbacks +$(P)$(R)NDAttributesFile diff --git a/FOFBApp/src/FOFBInclude.dbd b/FOFBApp/src/FOFBInclude.dbd index ef0e924..5988605 100644 --- a/FOFBApp/src/FOFBInclude.dbd +++ b/FOFBApp/src/FOFBInclude.dbd @@ -1,5 +1,11 @@ include "base.dbd" include "asyn.dbd" +include "calc.dbd" include "asSupport.dbd" include "FOFBSupport.dbd" +include "devIocStats.dbd" +include "NDPluginSupport.dbd" +include "NDFileHDF5.dbd" +include "NDFileNetCDF.dbd" +include "busySupport.dbd" diff --git a/FOFBApp/src/Makefile b/FOFBApp/src/Makefile index 6f6b10a..906c9f9 100644 --- a/FOFBApp/src/Makefile +++ b/FOFBApp/src/Makefile @@ -10,6 +10,7 @@ PYTHON=python LIBRARY_IOC += FOFBSupport FOFBSupport_SRCS += drvFOFB.cpp FOFBSupport_LIBS += asyn +FOFBSupport_LIBS += ADBase FOFBSupport_LIBS += $(EPICS_BASE_IOC_LIBS) #============================= @@ -24,6 +25,7 @@ DBD += FOFBSupport.dbd # Include dbd files from all support applications: FOFB_DBD += base.dbd FOFB_DBD += asyn.dbd +FOFB_DBD += devIocStats.dbd # FOFB_registerRecordDeviceDriver.cpp derives from FOFB.dbd FOFB_SRCS += FOFB_registerRecordDeviceDriver.cpp @@ -36,12 +38,17 @@ FOFB_SRCS_vxWorks += -nil- FOFB_LIBS += FOFBSupport FOFB_LIBS += asyn FOFB_LIBS += autosave +FOFB_LIBS += devIocStats # Link to the EPICS Base libraries FOFB_LIBS += $(EPICS_BASE_IOC_LIBS) # Link to system libraries +FOFB_SYS_LIBS += bpmclient +FOFB_SYS_LIBS += acqclient FOFB_SYS_LIBS += halcsclient +FOFB_SYS_LIBS += bpmclient +FOFB_SYS_LIBS += acqclient FOFB_SYS_LIBS += errhand FOFB_SYS_LIBS += hutils FOFB_SYS_LIBS += mlm @@ -63,7 +70,11 @@ PROD += FOFBCheckInit FOFBCheckInit_SRCS += FOFBCheckInit.c # Link to system libraries +FOFBCheckInit_SYS_LIBS += bpmclient +FOFBCheckInit_SYS_LIBS += acqclient FOFBCheckInit_SYS_LIBS += halcsclient +FOFBCheckInit_SYS_LIBS += bpmclient +FOFBCheckInit_SYS_LIBS += acqclient FOFBCheckInit_SYS_LIBS += errhand FOFBCheckInit_SYS_LIBS += hutils FOFBCheckInit_SYS_LIBS += mlm @@ -81,7 +92,7 @@ FOFBCheckInit_SYS_LIBS += gcc USR_CXXFLAGS += -std=gnu++11 -DMLM_BUILD_DRAFT_API -D__BOARD_AFCV3_1__ USR_CFLAGS += -DMLM_BUILD_DRAFT_API -D__BOARD_AFCV3_1__ -# include $(AREA_DETECTOR_COMPAT)/ADApp/commonDriverMakefile +include $(AREA_DETECTOR_COMPAT)/ADApp/commonDriverMakefile # #=========================== diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 4f88778..ef05855 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -1,10 +1,10 @@ /* - * * * drvFOFB.cpp - * * * - * * * Authors: Melissa Aguiar - * * * - * * * Created Dec. 03, 2021 - * * */ + * drvFOFB.cpp + * + * Authors: Melissa Aguiar + * + * Created Dec. 03, 2021 + */ #include #include @@ -24,57 +24,163 @@ #include "drvFOFB.h" #include +/** The polling interval when checking to see if acquisition is complete */ +#define FOFB_POLL_TIME .1 +#define FOFB_PM_POLL_TIME 1 + +#define PI 3.14159265 +#define FREQ_SAMPLE 100.00 /* Hz */ +#define FREQ 1.00 /* Hz */ +#define TEST_LENGTH 4092 + +/* FIXME: This should be read from hardware */ +#define ADC_RATE_FACTOR 1 +#define TBT_RATE_FACTOR 35 +#define FOFB_RATE_FACTOR 980 +#define MONIT_RATE_FACTOR 9800000 +#define MONIT1_RATE_FACTOR 98000 + +#define CH_DFLT_TRIGGER_CHAN 0 +#define CH_DFLT_TRIGGER_SW_CHAN 18 + +#define CH_DFLT_TRIGGER_SEL_PM_CHAN 1 +/* Number fo triggers that are relative to waveform acquisition */ +#define MAX_WAVEFORM_TRIGGERS 17 + +#define CH_DEFAULT_PM CH_TBT +#define SAMPLES_PRE_DEFAULT_PM(maxPoints) \ + (maxPoints/2) +#define SAMPLES_POST_DEFAULT_PM(maxPoints) \ + (maxPoints/2) +#define NUM_SHOTS_DEFAULT_PM 1 +#define TRIG_DEFAULT_PM ACQ_CLIENT_TRIG_EXTERNAL +#define DFLT_SAMPLE_SIZE 8 /* in bytes */ +#define DFLT_NUM_ATOMS 4 +#define DFLT_ATOM_WIDTH 2 /* in bytes */ + #define SERVICE_NAME_SIZE 50 -static const boardMap_t boardMap[MAX_FOFBS+1] = { - /* board, fofb*/ - /* 0 (INVALID) */ {-1, -1}, - /* 1 */ {1, 0}, - /* 2 */ {1, 1}, - /* 3 */ {2, 0}, - /* 4 */ {2, 1}, - /* 5 */ {3, 0}, - /* 6 */ {3, 1}, - /* 7 */ {4, 0}, - /* 8 */ {4, 1}, - /* 9 */ {5, 0}, - /* 10 */ {5, 1}, - /* 11 */ {6, 0}, - /* 12 */ {6, 1}, - /* 13 */ {7, 0}, - /* 14 */ {7, 1}, - /* 15 */ {8, 0}, - /* 16 */ {8, 1}, - /* 17 */ {9, 0}, - /* 18 */ {9, 1}, - /* 19 */ {10, 0}, - /* 20 */ {10, 1}, - /* 21 */ {11, 0}, - /* 22 */ {11, 1}, - /* 23 */ {12, 0}, - /* 24 */ {12, 1} +typedef struct { + drvFOFB *drvFOFBp; + fofb_coreID_types coreID; + double pollTime; + bool autoStart; +} taskParams_t; + +static const channelMap_t channelMap[CH_END] = { + /* [CH_ADC] = */ {CH_HW_ADC, // HwDataChannel + {{WVF_DATA_CH0, // NDArrayData + WVF_DATA_CH1, + WVF_DATA_CH2, + WVF_DATA_CH3, + WVF_DATA_CH4, + WVF_DATA_CH5, + WVF_DATA_CH6, + WVF_DATA_CH7, + WVF_DATA_CH8, + WVF_DATA_CH9, + WVF_DATA_CH10, + WVF_DATA_CH11, + WVF_DATA_CH12, + WVF_DATA_CH13, + WVF_DATA_CH14, + WVF_DATA_CH15, + WVF_DATA_ALL}, + }, + }, + /* [CH_TBT] = */ {CH_HW_TBT, + {{WVF_DATA_CH0, // NDArrayData + WVF_DATA_CH1, + WVF_DATA_CH2, + WVF_DATA_CH3, + WVF_DATA_CH4, + WVF_DATA_CH5, + WVF_DATA_CH6, + WVF_DATA_CH7, + WVF_DATA_CH8, + WVF_DATA_CH9, + WVF_DATA_CH10, + WVF_DATA_CH11, + WVF_DATA_CH12, + WVF_DATA_CH13, + WVF_DATA_CH14, + WVF_DATA_CH15, + WVF_DATA_ALL}, + }, + }, + /* [CH_FOFB] = */ {CH_HW_FOFB, // HwDataChannel + {{-1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1}, + }, + }, + /* [CH_MONIT1] = */ {CH_HW_MONIT1, // HwDataChannel + {{-1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1}, + }, + }, }; +/* FIXME: This reverse mapping must match the maximum hwDataChannel for ChannelMap */ +static const channelRevMap_t channelRevMap[CH_HW_END] = { + /* EPICS channel */ + /* [CH_HW_ADC] = */ {CH_ADC}, + /* 1 = Unavailable */ {-1}, + /* 2 = Unavailable */ {-1}, + /* 3 = Unavailable */ {-1}, + /* 4 = Unavailable */ {-1}, + /* 5 = Unavailable */ {-1}, + /* [CH_HW_TBT] = */ {CH_TBT}, + /* 7 = Unavailable */ {-1}, + /* 8 = Unavailable */ {-1}, + /* 9 = Unavailable */ {-1}, + /* 10 = Unavailable */ {-1}, + /* [CH_HW_FOFB] = */ {CH_FOFB}, + /* 12 = Unavailable */ {-1}, + /* 13 = Unavailable */ {-1}, + /* [CH_HW_MONIT1] = */ {CH_MONIT1}, +}; /* Int32 functions mapping */ -static const functionsAny_t fofbProcessingSetGetRamWriteFunc = {functionsUInt32_t{"FOFB_PROCESSING", halcs_set_fofb_processing_ram_write, - halcs_get_fofb_processing_ram_write}}; -static const functionsAny_t fofbProcessingSetGetRamAddrFunc = {functionsUInt32_t{"FOFB_PROCESSING", halcs_set_fofb_processing_ram_addr, - halcs_get_fofb_processing_ram_addr}}; -static const functionsAny_t fofbProcessingSetGetRamDataInFunc = {functionsUInt32_t{"FOFB_PROCESSING", halcs_set_fofb_processing_ram_data_in, - halcs_get_fofb_processing_ram_data_in}}; -static const functionsAny_t fofbProcessingSetGetRamDataOutFunc = {functionsUInt32_t{"FOFB_PROCESSING", NULL, - halcs_get_fofb_processing_ram_data_out}}; static const functionsAny_t rtmLampSetGetStatusFunc = {functionsUInt32_t{"RTMLAMP_OHWR", NULL , halcs_get_rtmlamp_ohwr_sta}}; static const functionsAny_t rtmLampSetGetDacDataFromWbFunc = {functionsUInt32_t{"RTMLAMP_OHWR", halcs_set_rtmlamp_ohwr_dac_data_from_wb, halcs_get_rtmlamp_ohwr_dac_data_from_wb}}; -static const functionsAny_t rtmLampSetGetAmpIFlagLFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", halcs_set_rtmlamp_ohwr_amp_iflag_l, +static const functionsAny_t rtmLampSetGetAmpIFlagLFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", NULL, halcs_get_rtmlamp_ohwr_amp_iflag_l}}; -static const functionsAny_t rtmLampSetGetAmpTFlagLFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", halcs_set_rtmlamp_ohwr_amp_tflag_l, +static const functionsAny_t rtmLampSetGetAmpTFlagLFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", NULL, halcs_get_rtmlamp_ohwr_amp_tflag_l}}; -static const functionsAny_t rtmLampSetGetAmpIFlagRFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", halcs_set_rtmlamp_ohwr_amp_iflag_r, +static const functionsAny_t rtmLampSetGetAmpIFlagRFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", NULL, halcs_get_rtmlamp_ohwr_amp_iflag_r}}; -static const functionsAny_t rtmLampSetGetAmpTFlagRFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", halcs_set_rtmlamp_ohwr_amp_tflag_r, +static const functionsAny_t rtmLampSetGetAmpTFlagRFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", NULL, halcs_get_rtmlamp_ohwr_amp_tflag_r}}; static const functionsAny_t rtmLampSetGetAmpEnFunc = {functionsUInt32Chan_t{"RTMLAMP_OHWR", halcs_set_rtmlamp_ohwr_amp_en, halcs_get_rtmlamp_ohwr_amp_en}}; @@ -100,85 +206,64 @@ static const functionsAny_t rtmLampSetGetPIOLDacCntMaxFunc = {functio halcs_get_rtmlamp_ohwr_pi_ol_dac_cnt_max}}; static const functionsAny_t rtmLampSetGetPISPLimInfFunc = {functionsUInt32_t{"RTMLAMP_OHWR", halcs_set_rtmlamp_ohwr_pi_sp_lim_inf, halcs_get_rtmlamp_ohwr_pi_sp_lim_inf}}; -static const functionsAny_t fofbCtrlSetGetActPartFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_act_part, - halcs_get_fofb_ctrl_act_part}}; -static const functionsAny_t fofbCtrlSetGeErrClrFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_err_clr, - halcs_get_fofb_ctrl_err_clr}}; -static const functionsAny_t fofbCtrlSetGetCcEnableFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_cc_enable, - halcs_get_fofb_ctrl_cc_enable}}; -static const functionsAny_t fofbCtrlSetGetTfsOverrideFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_tfs_override, - halcs_get_fofb_ctrl_tfs_override}}; -static const functionsAny_t fofbCtrlSetGetBpmIdFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_bpm_id, - halcs_get_fofb_ctrl_bpm_id}}; -static const functionsAny_t fofbCtrlSetGetTimeFrameLenFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_time_frame_len, - halcs_get_fofb_ctrl_time_frame_len}}; -static const functionsAny_t fofbCtrlSetGetMgtPowerdownFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_mgt_powerdown, - halcs_get_fofb_ctrl_mgt_powerdown}}; -static const functionsAny_t fofbCtrlSetGetMgtLoopbackFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_mgt_loopback, - halcs_get_fofb_ctrl_mgt_loopback}}; -static const functionsAny_t fofbCtrlSetGetTimeFrameDlyFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_time_frame_dly, - halcs_get_fofb_ctrl_time_frame_dly}}; -static const functionsAny_t fofbCtrlSetGetGoldenOrbXFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_golden_orb_x, - halcs_get_fofb_ctrl_golden_orb_x}}; -static const functionsAny_t fofbCtrlSetGetGoldenOrbYFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_golden_orb_y, - halcs_get_fofb_ctrl_golden_orb_y}}; -static const functionsAny_t fofbCtrlSetGetCustFeatureFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_cust_feature, - halcs_get_fofb_ctrl_cust_feature}}; -static const functionsAny_t fofbCtrlSetGetRxPolarityFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_rx_polarity, - halcs_get_fofb_ctrl_rx_polarity}}; -static const functionsAny_t fofbCtrlSetGetPayloadselFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_payloadsel, - halcs_get_fofb_ctrl_payloadsel}}; -static const functionsAny_t fofbCtrlSetGetFofbdataselFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_fofbdatasel, - halcs_get_fofb_ctrl_fofbdatasel}}; -static const functionsAny_t fofbCtrlSetGetFirmwareVerFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_firmware_ver}}; -static const functionsAny_t fofbCtrlSetGetSysStatusFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_sys_status}}; -static const functionsAny_t fofbCtrlSetGetLinkPartnerFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_link_partner}}; -static const functionsAny_t fofbCtrlSetGetLinkUpFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_link_up}}; -static const functionsAny_t fofbCtrlSetGetTimeFrameCountFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_time_frame_count}}; -static const functionsAny_t fofbCtrlSetGetHardErrCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_hard_err_cnt}}; -static const functionsAny_t fofbCtrlSetGetSoftErrCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_soft_err_cnt}}; -static const functionsAny_t fofbCtrlSetGetFrameErrCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_frame_err_cnt}}; -static const functionsAny_t fofbCtrlSetGetRxPckCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_rx_pck_cnt}}; -static const functionsAny_t fofbCtrlSetGetTxPckCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_tx_pck_cnt}}; -static const functionsAny_t fofbCtrlSetGetFodProcessTimeFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_fod_process_time}}; -static const functionsAny_t fofbCtrlSetGetBpmCntFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_bpm_count}}; -static const functionsAny_t fofbCtrlSetGetBpmIdRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_bpm_id_rdback}}; -static const functionsAny_t fofbCtrlSetGetTfLengthRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_tf_length_rdback}}; -static const functionsAny_t fofbCtrlSetGetPowerdownRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_powerdown_rdback}}; -static const functionsAny_t fofbCtrlSetGetLoopbackRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_loopback_rdback}}; -static const functionsAny_t fofbCtrlSetGetFaivalRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_faival_rdback}}; -static const functionsAny_t fofbCtrlSetGetToaRdEnFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_toa_rd_en, - halcs_get_fofb_ctrl_toa_rd_en}}; -static const functionsAny_t fofbCtrlSetGetToaRdStrFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_toa_rd_str, - halcs_get_fofb_ctrl_toa_rd_str}}; -static const functionsAny_t fofbCtrlSetGetToaDataFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_toa_data}}; -static const functionsAny_t fofbCtrlSetGetRcbRdEnFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_rcb_rd_en, - halcs_get_fofb_ctrl_rcb_rd_en}}; -static const functionsAny_t fofbCtrlSetGetRcbRdStrFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_rcb_rd_str, - halcs_get_fofb_ctrl_rcb_rd_str}}; -static const functionsAny_t fofbCtrlSetGetRcbDataFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, - halcs_get_fofb_ctrl_rcb_data}}; +static const functionsAny_t fofbSetGetAcqDataTrigThresFunc = {functionsUInt32Acq_t{"ACQ", acq_set_data_trig_thres, + acq_get_data_trig_thres}}; +static const functionsAny_t fofbSetGetAcqDataTrigPolFunc = {functionsUInt32Acq_t{"ACQ", acq_set_data_trig_pol, + acq_get_data_trig_pol}}; +static const functionsAny_t fofbSetGetAcqDataTrigSelFunc = {functionsUInt32Acq_t{"ACQ", acq_set_data_trig_sel, + acq_get_data_trig_sel}}; +static const functionsAny_t fofbSetGetAcqDataTrigFiltFunc = {functionsUInt32Acq_t{"ACQ", acq_set_data_trig_filt, + acq_get_data_trig_filt}}; +static const functionsAny_t fofbSetGetAcqHwDlyFunc = {functionsUInt32Acq_t{"ACQ", acq_set_hw_trig_dly, + acq_get_hw_trig_dly}}; +static const functionsAny_t fofbSetGetAcqDataTrigChanFunc = {functionsUInt32Acq_t{"ACQ", acq_set_data_trig_chan, + acq_get_data_trig_chan}}; +static const functionsAny_t fofbSetGetTrigDirFunc = {functionsUInt32Chan_t{"TRIGGER_IFACE", halcs_set_trigger_dir, + halcs_get_trigger_dir}}; +static const functionsAny_t fofbSetGetTrigDirPolFunc = {functionsUInt32Chan_t{"TRIGGER_IFACE", halcs_set_trigger_dir_pol, + halcs_get_trigger_dir_pol}}; +static const functionsAny_t fofbSetGetTrigRcvCntRstFunc = {functionsUInt32Chan_t{"TRIGGER_IFACE", halcs_set_trigger_rcv_count_rst, + halcs_get_trigger_rcv_count_rst}}; +static const functionsAny_t fofbSetGetTrigTrnCntRstFunc = {functionsUInt32Chan_t{"TRIGGER_IFACE", halcs_set_trigger_transm_count_rst, + halcs_get_trigger_transm_count_rst}}; +static const functionsAny_t fofbSetGetTrigRcvLenFunc = {functionsUInt32Chan_t{"TRIGGER_IFACE", halcs_set_trigger_rcv_len, + halcs_get_trigger_rcv_len}}; +static const functionsAny_t fofbSetGetTrigTrnLenFunc = {functionsUInt32Chan_t{"TRIGGER_IFACE", halcs_set_trigger_transm_len, + halcs_get_trigger_transm_len}}; +static const functionsAny_t fofbSetGetTrigCntRcvFunc = {functionsUInt32Chan_t{"TRIGGER_IFACE", halcs_set_trigger_count_rcv, + halcs_get_trigger_count_rcv}}; +static const functionsAny_t fofbSetGetTrigCntTrnFunc = {functionsUInt32Chan_t{"TRIGGER_IFACE", halcs_set_trigger_count_transm, + halcs_get_trigger_count_transm}}; +static const functionsAny_t fofbSetGetTrigRcvSrcFunc = {functionsUInt32Chan_t{"TRIGGER_MUX", halcs_set_trigger_rcv_src, + halcs_get_trigger_rcv_src}}; +static const functionsAny_t fofbSetGetTrigTrnSrcFunc = {functionsUInt32Chan_t{"TRIGGER_MUX", halcs_set_trigger_transm_src, + halcs_get_trigger_transm_src}}; +static const functionsAny_t fofbSetGetTrigRcvSelFunc = {functionsUInt32Chan_t{"TRIGGER_MUX", halcs_set_trigger_rcv_in_sel, + halcs_get_trigger_rcv_in_sel}}; +static const functionsAny_t fofbSetGetTrigTrnSelFunc = {functionsUInt32Chan_t{"TRIGGER_MUX", halcs_set_trigger_transm_out_sel, + halcs_get_trigger_transm_out_sel}}; static const char *driverName="drvFOFB"; + +static taskParams_t taskParams[NUM_ACQ_CORES_PER_FOFB] = { + /* Regular Core */ + { + NULL, // drvFOFBp + FOFBIDReg, // coreID + FOFB_POLL_TIME, // pollTime + false // autoStart + }, +}; + +static taskParams_t taskMonitParams = { + NULL, // drvFOFBp + FOFBIDReg, // coreID + FOFB_POLL_TIME, // pollTime + false // autoStart +}; + void acqTask(void *drvPvt); +void acqMonitTask(void *drvPvt); static void exitHandlerC(void *pPvt) { @@ -193,7 +278,13 @@ asynStatus drvFOFB::getServiceChan (int fofbNumber, int addr, const char *servic asynStatus status = asynSuccess; epicsUInt32 chan = 0; - chan = addr; + /* Static mapping. FIXME? */ + if (streq(serviceName, "TRIGGER_MUX") || streq(serviceName, "TRIGGER_IFACE")) { + chan = addr % MAX_TRIGGERS; + } + else { + chan = addr; + } *chanArg = chan; return status; @@ -204,9 +295,41 @@ asynStatus drvFOFB::getServiceID (int fofbNumber, int addr, const char *serviceN { static const char *functionName = "getServiceID"; asynStatus status = asynSuccess; + int serviceID = 0; + int addrMod = 0; + + /* Static mapping. FIXME? */ + /* For these services there's only a single core per FPGA, so serviceID is always 0. + * INIT service is always 0 per HALCS instance */ + if (streq(serviceName, "TRIGGER_IFACE") || streq(serviceName, "INIT")) { + *serviceIDArg = 0; + return status; + } + if (streq(serviceName, "ACQ")) { + addrMod = addr; + } + else if (streq(serviceName, "TRIGGER_MUX")) { + addrMod = addr/MAX_TRIGGERS; + } + else { + addrMod = 0; + } + + switch (addrMod) { + case FOFBIDReg: + serviceID = 0; + break; - *serviceIDArg = boardMap[fofbNumber].fofb; + default: + status = asynError; + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error getting serviceID for addr = %d for service = %s\n", + driverName, functionName, addr, serviceName); + goto err_exit; + } + *serviceIDArg = serviceID; +err_exit: return status; } @@ -216,6 +339,10 @@ asynStatus drvFOFB::getFullServiceName (int fofbNumber, int addr, const char *se static const char *functionName = "getFullServiceName"; int coreID = 0; int errs = 0; + /* boardMap structure was removed. FIXME? */ + /* if we want to use board 10, for example, the PV prefix (fofbNumber) will be 10*2-1=19 */ + int board = (fofbNumber+1)/2; + asynStatus status = asynSuccess; status = getServiceID (fofbNumber, addr, serviceName, &coreID); @@ -227,7 +354,7 @@ asynStatus drvFOFB::getFullServiceName (int fofbNumber, int addr, const char *se } errs = snprintf(fullServiceName, fullServiceNameSize, "HALCS%d:DEVIO:%s%d", - boardMap[fofbNumber].board, serviceName, coreID); + board, serviceName, coreID); if (errs < 0 || errs >= fullServiceNameSize){ asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error generating fullServiceName, errs=%d\n", @@ -241,17 +368,19 @@ asynStatus drvFOFB::getFullServiceName (int fofbNumber, int addr, const char *se return status; } -/** Constructor for the drvFOFB class. - * * * Calls constructor for the asynPortDriver base class. - * * * \param[in] portName The name of the asyn port driver to be created. - * * * \param[in] endpoint The device address string ] - * * * */ +/* Constructor for the drvFOFB class. + * Calls constructor for the asynPortDriver base class. + * \param[in] portName The name of the asyn port driver to be created. + * \param[in] endpoint The device address string ] + */ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, - int verbose, int timeout) - : asynPortDriver(portName, + const char *type, int verbose, int timeout, int maxPoints, + int maxBuffers, size_t maxMemory) + : asynNDArrayDriver(portName, MAX_ADDR, /* maxAddr */ - asynUInt32DigitalMask | asynFloat64Mask | asynDrvUserMask, /* Interface mask */ - asynUInt32DigitalMask | asynFloat64Mask , /* Interrupt mask */ + maxBuffers, maxMemory, /* maxBuffers, maxMemory */ + asynUInt32DigitalMask | asynInt32Mask | asynInt16ArrayMask | asynFloat64Mask | asynGenericPointerMask | asynDrvUserMask, /* Interface mask */ + asynUInt32DigitalMask | asynInt32Mask | asynInt16ArrayMask | asynFloat64Mask | asynGenericPointerMask, /* Interrupt mask */ ASYN_CANBLOCK | ASYN_MULTIDEVICE, /* asynFlags. This driver blocks it is multi-device */ 1, /* Autoconnect */ 0, /* Default priority */ @@ -262,11 +391,12 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, /* Create portName so we can create a new AsynUser later */ fofbPortName = epicsStrDup(portName); + fofbMaxPoints = maxPoints; this->endpoint = strdup(endpoint); if (this->endpoint == NULL) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s fofb failure to copy endpoint\n", + "%s:%s drvFOFB failure to copy endpoint\n", driverName, functionName); status = asynError; goto endpoint_dup_err; @@ -274,7 +404,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, if (fofbNumber < FOFB_NUMBER_MIN || fofbNumber > FOFB_NUMBER_MAX) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s drvfofb invalid fofbNumber\n", + "%s:%s drvFOFB invalid fofbNumber\n", driverName, functionName); status = asynError; goto invalid_fofb_number_err; @@ -284,19 +414,61 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, this->verbose = verbose; this->timeout = timeout; + for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { + this->readingActive[j] = 0; + this->repetitiveTrigger[j] = 0; + } + + for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { + /* Create events for signalling acquisition thread */ + this->startAcqEventId[j] = epicsEventCreate(epicsEventEmpty); + if (!this->startAcqEventId[j]) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s epicsEventCreate failure for start event\n", + driverName, functionName); + return; + } + + this->stopAcqEventId[j] = epicsEventCreate(epicsEventEmpty); + if (!this->stopAcqEventId[j]) { + printf("%s:%s: epicsEventCreate failure for stop event\n", + driverName, functionName); + return; + } + + this->abortAcqEventId[j] = epicsEventCreate(epicsEventEmpty); + if (!this->abortAcqEventId[j]) { + printf("%s:%s: epicsEventCreate failure for abort event\n", + driverName, functionName); + return; + } + + this->activeAcqEventId[j] = epicsEventCreate(epicsEventEmpty); + if (!this->activeAcqEventId[j]) { + printf("%s:%s: epicsEventCreate failure for active event\n", + driverName, functionName); + return; + } + } + + this->activeMonitEnableEventId = epicsEventCreate(epicsEventEmpty); + if (!this->activeMonitEnableEventId) { + printf("%s:%s: epicsEventCreate failure for activeMonitEnableEventId\n", + driverName, functionName); + return; + } + /* Create parameters for all addresses without specifying the ones that don't - * * * make sense to be on a specified list. Without this we woudl have to create - * * * different parameterIndex structures to store each index, as they could be - * * * differently if created in just a few lists */ + * make sense to be on a specified list. Without this we woudl have to create + * different parameterIndex structures to store each index, as they could be + * differently if created in just a few lists */ /* CAUTION. The order of craetion must be the same as defined in .h file. - * * * Otherwise, checking for FIRST_PARAM/LAST_PARAM won't work */ + * Otherwise, checking for FIRST_PARAM/LAST_PARAM won't work */ /* Create general parameters */ - createParam(P_FofbProcessingRamWriteString, asynParamUInt32Digital, &P_FofbProcessingRamWrite); - createParam(P_FofbProcessingRamAddrString, asynParamUInt32Digital, &P_FofbProcessingRamAddr); - createParam(P_FofbProcessingRamDataInString, asynParamUInt32Digital, &P_FofbProcessingRamDataIn); - createParam(P_FofbProcessingRamDataOutString, asynParamUInt32Digital, &P_FofbProcessingRamDataOut); + + /* Create rtm_lamp parameters */ createParam(P_RtmLampStatusString, asynParamUInt32Digital, &P_RtmLampStatus); createParam(P_RtmLampDacDataFromWbString, asynParamUInt32Digital, &P_RtmLampDacDataFromWb); createParam(P_RtmLampAmpIFlagLString, asynParamUInt32Digital, &P_RtmLampAmpIFlagL); @@ -315,51 +487,50 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, createParam(P_RtmLampPISPString, asynParamUInt32Digital, &P_RtmLampPISP); createParam(P_RtmLampPIOLDacCntMaxString, asynParamUInt32Digital, &P_RtmLampPIOLDacCntMax); createParam(P_RtmLampPISPLimInfString, asynParamUInt32Digital, &P_RtmLampPISPLimInf); - createParam(P_FofbCtrlActPartString, asynParamUInt32Digital, &P_FofbCtrlActPart); - createParam(P_FofbCtrlErrClrString, asynParamUInt32Digital, &P_FofbCtrlErrClr); - createParam(P_FofbCtrlCcEnableString, asynParamUInt32Digital, &P_FofbCtrlCcEnable); - createParam(P_FofbCtrlTfsOverrideString, asynParamUInt32Digital, &P_FofbCtrlTfsOverride); - createParam(P_FofbCtrlBpmIdString, asynParamUInt32Digital, &P_FofbCtrlBpmId); - createParam(P_FofbCtrlTimeFrameLenString, asynParamUInt32Digital, &P_FofbCtrlTimeFrameLen); - createParam(P_FofbCtrlMgtPowerdownString, asynParamUInt32Digital, &P_FofbCtrlMgtPowerdown); - createParam(P_FofbCtrlMgtLoopbackString, asynParamUInt32Digital, &P_FofbCtrlMgtLoopback); - createParam(P_FofbCtrlTimeFrameDlyString, asynParamUInt32Digital, &P_FofbCtrlTimeFrameDly); - createParam(P_FofbCtrlGoldenOrbXString, asynParamUInt32Digital, &P_FofbCtrlGoldenOrbX); - createParam(P_FofbCtrlGoldenOrbYString, asynParamUInt32Digital, &P_FofbCtrlGoldenOrbY); - createParam(P_FofbCtrlCustFeatureString, asynParamUInt32Digital, &P_FofbCtrlCustFeature); - createParam(P_FofbCtrlRxPolarityString, asynParamUInt32Digital, &P_FofbCtrlRxPolarity); - createParam(P_FofbCtrlPayloadselString, asynParamUInt32Digital, &P_FofbCtrlPayloadsel); - createParam(P_FofbCtrlFofbdataselString, asynParamUInt32Digital, &P_FofbCtrlFofbdatasel); - createParam(P_FofbCtrlFirmwareVerString, asynParamUInt32Digital, &P_FofbCtrlFirmwareVer); - createParam(P_FofbCtrlSysStatusString, asynParamUInt32Digital, &P_FofbCtrlSysStatus); - createParam(P_FofbCtrlLinkPartnerString, asynParamUInt32Digital, &P_FofbCtrlLinkPartner); - createParam(P_FofbCtrlLinkUpString, asynParamUInt32Digital, &P_FofbCtrlLinkUp); - createParam(P_FofbCtrlTimeFrameCountString, asynParamUInt32Digital, &P_FofbCtrlTimeFrameCount); - createParam(P_FofbCtrlHardErrCntString, asynParamUInt32Digital, &P_FofbCtrlHardErrCnt); - createParam(P_FofbCtrlSoftErrCntString, asynParamUInt32Digital, &P_FofbCtrlSoftErrCnt); - createParam(P_FofbCtrlFrameErrCntString, asynParamUInt32Digital, &P_FofbCtrlFrameErrCnt); - createParam(P_FofbCtrlRxPckCntString, asynParamUInt32Digital, &P_FofbCtrlRxPckCnt); - createParam(P_FofbCtrlTxPckCntString, asynParamUInt32Digital, &P_FofbCtrlTxPckCnt); - createParam(P_FofbCtrlFodProcessTimeString, asynParamUInt32Digital, &P_FofbCtrlFodProcessTime); - createParam(P_FofbCtrlBpmCntString, asynParamUInt32Digital, &P_FofbCtrlBpmCnt); - createParam(P_FofbCtrlBpmIdRdbackString, asynParamUInt32Digital, &P_FofbCtrlBpmIdRdback); - createParam(P_FofbCtrlTfLengthRdbackString, asynParamUInt32Digital, &P_FofbCtrlTfLengthRdback); - createParam(P_FofbCtrlPowerdownRdbackString, asynParamUInt32Digital, &P_FofbCtrlPowerdownRdback); - createParam(P_FofbCtrlLoopbackRdbackString, asynParamUInt32Digital, &P_FofbCtrlLoopbackRdback); - createParam(P_FofbCtrlFaivalRdbackString, asynParamUInt32Digital, &P_FofbCtrlFaivalRdback); - createParam(P_FofbCtrlToaRdEnString, asynParamUInt32Digital, &P_FofbCtrlToaRdEn); - createParam(P_FofbCtrlToaRdStrString, asynParamUInt32Digital, &P_FofbCtrlToaRdStr); - createParam(P_FofbCtrlToaDataString, asynParamUInt32Digital, &P_FofbCtrlToaData); - createParam(P_FofbCtrlRcbRdEnString, asynParamUInt32Digital, &P_FofbCtrlRcbRdEn); - createParam(P_FofbCtrlRcbRdStrString, asynParamUInt32Digital, &P_FofbCtrlRcbRdStr); - createParam(P_FofbCtrlRcbDataString, asynParamUInt32Digital, &P_FofbCtrlRcbData); + /* Create ADC/TBT/FOFB/MONIT parameters */ + createParam(P_AdcRateString, asynParamUInt32Digital, &P_AdcRate); + createParam(P_TbtRateString, asynParamUInt32Digital, &P_TbtRate); + createParam(P_FofbRateString, asynParamUInt32Digital, &P_FofbRate); + createParam(P_MonitRateString, asynParamUInt32Digital, &P_MonitRate); + createParam(P_Monit1RateString, asynParamUInt32Digital, &P_Monit1Rate); + createParam(P_MonitPollTimeString, asynParamUInt32Digital, &P_MonitPollTime); + createParam(P_MonitEnableString, asynParamInt32, &P_MonitEnable); + /* Create acquistion parameters */ + createParam(P_FOFBStatusString, asynParamInt32, &P_FOFBStatus); + createParam(P_SamplesPreString, asynParamUInt32Digital, &P_SamplesPre); + createParam(P_SamplesPostString, asynParamUInt32Digital, &P_SamplesPost); + createParam(P_NumShotsString, asynParamUInt32Digital, &P_NumShots); + createParam(P_ChannelString, asynParamInt32, &P_Channel); + createParam(P_UpdateTimeString, asynParamFloat64, &P_UpdateTime); + createParam(P_TriggerString, asynParamUInt32Digital, &P_Trigger); + createParam(P_TriggerEventString, asynParamUInt32Digital, &P_TriggerEvent); + createParam(P_TriggerRepString, asynParamUInt32Digital, &P_TriggerRep); + createParam(P_TriggerDataThresString, asynParamUInt32Digital, &P_TriggerDataThres); + createParam(P_TriggerDataPolString, asynParamUInt32Digital, &P_TriggerDataPol); + createParam(P_TriggerDataSelString, asynParamUInt32Digital, &P_TriggerDataSel); + createParam(P_TriggerDataFiltString, asynParamUInt32Digital, &P_TriggerDataFilt); + createParam(P_TriggerHwDlyString, asynParamUInt32Digital, &P_TriggerHwDly); + createParam(P_DataTrigChanString, asynParamUInt32Digital, &P_DataTrigChan); + createParam(P_ChannelSampleSizeString, asynParamUInt32Digital, &P_ChannelSampleSize); + createParam(P_ChannelNumAtomsString, asynParamUInt32Digital, &P_ChannelNumAtoms); + createParam(P_ChannelAtomWidthString, asynParamUInt32Digital, &P_ChannelAtomWidth); + /* Create Trigger parameters */ + createParam(P_TriggerChanString, asynParamInt32, &P_TriggerChan); + createParam(P_TriggerDirString, asynParamUInt32Digital, &P_TriggerDir); + createParam(P_TriggerDirPolString, asynParamUInt32Digital, &P_TriggerDirPol); + createParam(P_TriggerRcvCntRstString, asynParamUInt32Digital, &P_TriggerRcvCntRst); + createParam(P_TriggerTrnCntRstString, asynParamUInt32Digital, &P_TriggerTrnCntRst); + createParam(P_TriggerRcvLenString, asynParamUInt32Digital, &P_TriggerRcvLen); + createParam(P_TriggerTrnLenString, asynParamUInt32Digital, &P_TriggerTrnLen); + createParam(P_TriggerCntRcvString, asynParamUInt32Digital, &P_TriggerCntRcv); + createParam(P_TriggerCntTrnString, asynParamUInt32Digital, &P_TriggerCntTrn); + createParam(P_TriggerRcvSrcString, asynParamUInt32Digital, &P_TriggerRcvSrc); + createParam(P_TriggerTrnSrcString, asynParamUInt32Digital, &P_TriggerTrnSrc); + createParam(P_TriggerRcvInSelString, asynParamUInt32Digital, &P_TriggerRcvInSel); + createParam(P_TriggerTrnOutSelString, asynParamUInt32Digital, &P_TriggerTrnOutSel); /* FOFB HW Int32 Functions mapping. Functions not mapped here are just written - * * * to the parameter library */ - fofbHwFunc.emplace(P_FofbProcessingRamWrite, fofbProcessingSetGetRamWriteFunc); - fofbHwFunc.emplace(P_FofbProcessingRamAddr, fofbProcessingSetGetRamAddrFunc); - fofbHwFunc.emplace(P_FofbProcessingRamDataIn, fofbProcessingSetGetRamDataInFunc); - fofbHwFunc.emplace(P_FofbProcessingRamDataOut, fofbProcessingSetGetRamDataOutFunc); + * to the parameter library */ fofbHwFunc.emplace(P_RtmLampStatus, rtmLampSetGetStatusFunc); fofbHwFunc.emplace(P_RtmLampDacDataFromWb, rtmLampSetGetDacDataFromWbFunc); fofbHwFunc.emplace(P_RtmLampAmpIFlagL, rtmLampSetGetAmpIFlagLFunc); @@ -378,52 +549,30 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, fofbHwFunc.emplace(P_RtmLampPISP, rtmLampSetGetPISPFunc); fofbHwFunc.emplace(P_RtmLampPIOLDacCntMax, rtmLampSetGetPIOLDacCntMaxFunc); fofbHwFunc.emplace(P_RtmLampPISPLimInf, rtmLampSetGetPISPLimInfFunc); - fofbHwFunc.emplace(P_FofbCtrlActPart, fofbCtrlSetGetActPartFunc); - fofbHwFunc.emplace(P_FofbCtrlErrClr, fofbCtrlSetGeErrClrFunc); - fofbHwFunc.emplace(P_FofbCtrlCcEnable, fofbCtrlSetGetCcEnableFunc); - fofbHwFunc.emplace(P_FofbCtrlTfsOverride, fofbCtrlSetGetTfsOverrideFunc); - fofbHwFunc.emplace(P_FofbCtrlBpmId, fofbCtrlSetGetBpmIdFunc); - fofbHwFunc.emplace(P_FofbCtrlTimeFrameLen, fofbCtrlSetGetTimeFrameLenFunc); - fofbHwFunc.emplace(P_FofbCtrlMgtPowerdown, fofbCtrlSetGetMgtPowerdownFunc); - fofbHwFunc.emplace(P_FofbCtrlMgtLoopback, fofbCtrlSetGetMgtLoopbackFunc); - fofbHwFunc.emplace(P_FofbCtrlTimeFrameDly, fofbCtrlSetGetTimeFrameDlyFunc); - fofbHwFunc.emplace(P_FofbCtrlGoldenOrbX, fofbCtrlSetGetGoldenOrbXFunc); - fofbHwFunc.emplace(P_FofbCtrlGoldenOrbY, fofbCtrlSetGetGoldenOrbYFunc); - fofbHwFunc.emplace(P_FofbCtrlCustFeature, fofbCtrlSetGetCustFeatureFunc); - fofbHwFunc.emplace(P_FofbCtrlRxPolarity, fofbCtrlSetGetRxPolarityFunc); - fofbHwFunc.emplace(P_FofbCtrlPayloadsel, fofbCtrlSetGetPayloadselFunc); - fofbHwFunc.emplace(P_FofbCtrlFofbdatasel, fofbCtrlSetGetFofbdataselFunc); - fofbHwFunc.emplace(P_FofbCtrlFirmwareVer, fofbCtrlSetGetFirmwareVerFunc); - fofbHwFunc.emplace(P_FofbCtrlSysStatus, fofbCtrlSetGetSysStatusFunc); - fofbHwFunc.emplace(P_FofbCtrlLinkPartner, fofbCtrlSetGetLinkPartnerFunc); - fofbHwFunc.emplace(P_FofbCtrlLinkUp, fofbCtrlSetGetLinkUpFunc); - fofbHwFunc.emplace(P_FofbCtrlTimeFrameCount, fofbCtrlSetGetTimeFrameCountFunc); - fofbHwFunc.emplace(P_FofbCtrlHardErrCnt, fofbCtrlSetGetHardErrCntFunc); - fofbHwFunc.emplace(P_FofbCtrlSoftErrCnt, fofbCtrlSetGetSoftErrCntFunc); - fofbHwFunc.emplace(P_FofbCtrlFrameErrCnt, fofbCtrlSetGetFrameErrCntFunc); - fofbHwFunc.emplace(P_FofbCtrlRxPckCnt, fofbCtrlSetGetRxPckCntFunc); - fofbHwFunc.emplace(P_FofbCtrlTxPckCnt, fofbCtrlSetGetTxPckCntFunc); - fofbHwFunc.emplace(P_FofbCtrlFodProcessTime, fofbCtrlSetGetFodProcessTimeFunc); - fofbHwFunc.emplace(P_FofbCtrlBpmCnt, fofbCtrlSetGetBpmCntFunc); - fofbHwFunc.emplace(P_FofbCtrlBpmIdRdback, fofbCtrlSetGetBpmIdRdbackFunc); - fofbHwFunc.emplace(P_FofbCtrlTfLengthRdback, fofbCtrlSetGetTfLengthRdbackFunc); - fofbHwFunc.emplace(P_FofbCtrlPowerdownRdback, fofbCtrlSetGetPowerdownRdbackFunc); - fofbHwFunc.emplace(P_FofbCtrlLoopbackRdback, fofbCtrlSetGetLoopbackRdbackFunc); - fofbHwFunc.emplace(P_FofbCtrlFaivalRdback, fofbCtrlSetGetFaivalRdbackFunc); - fofbHwFunc.emplace(P_FofbCtrlToaRdEn, fofbCtrlSetGetToaRdEnFunc); - fofbHwFunc.emplace(P_FofbCtrlToaRdStr, fofbCtrlSetGetToaRdStrFunc); - fofbHwFunc.emplace(P_FofbCtrlToaData, fofbCtrlSetGetToaDataFunc); - fofbHwFunc.emplace(P_FofbCtrlRcbRdEn, fofbCtrlSetGetRcbRdEnFunc); - fofbHwFunc.emplace(P_FofbCtrlRcbRdStr, fofbCtrlSetGetRcbRdStrFunc); - fofbHwFunc.emplace(P_FofbCtrlRcbData, fofbCtrlSetGetRcbDataFunc); + fofbHwFunc.emplace(P_DataTrigChan, fofbSetGetAcqDataTrigChanFunc); + fofbHwFunc.emplace(P_TriggerDataThres, fofbSetGetAcqDataTrigThresFunc); + fofbHwFunc.emplace(P_TriggerDataPol, fofbSetGetAcqDataTrigPolFunc); + fofbHwFunc.emplace(P_TriggerDataSel, fofbSetGetAcqDataTrigSelFunc); + fofbHwFunc.emplace(P_TriggerDataFilt, fofbSetGetAcqDataTrigFiltFunc); + fofbHwFunc.emplace(P_TriggerHwDly, fofbSetGetAcqHwDlyFunc); + fofbHwFunc.emplace(P_TriggerDir, fofbSetGetTrigDirFunc); + fofbHwFunc.emplace(P_TriggerDirPol, fofbSetGetTrigDirPolFunc); + fofbHwFunc.emplace(P_TriggerRcvCntRst, fofbSetGetTrigRcvCntRstFunc); + fofbHwFunc.emplace(P_TriggerTrnCntRst, fofbSetGetTrigTrnCntRstFunc); + fofbHwFunc.emplace(P_TriggerCntRcv, fofbSetGetTrigCntRcvFunc); + fofbHwFunc.emplace(P_TriggerCntTrn, fofbSetGetTrigCntTrnFunc); + fofbHwFunc.emplace(P_TriggerRcvLen, fofbSetGetTrigRcvLenFunc); + fofbHwFunc.emplace(P_TriggerTrnLen, fofbSetGetTrigTrnLenFunc); + fofbHwFunc.emplace(P_TriggerRcvSrc, fofbSetGetTrigRcvSrcFunc); + fofbHwFunc.emplace(P_TriggerTrnSrc, fofbSetGetTrigTrnSrcFunc); + fofbHwFunc.emplace(P_TriggerRcvInSel, fofbSetGetTrigRcvSelFunc); + fofbHwFunc.emplace(P_TriggerTrnOutSel, fofbSetGetTrigTrnSelFunc); lock(); status = fofbClientConnect(this->pasynUserSelf); unlock(); - /* If we correct connect for this first time, liclient - * * * will ensure the reconnection to server if necessary, but we - * * * must succeed here or we must abort completely */ + /* We must correct connect or we must abort completely */ if (status != asynSuccess) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error calling fofbClientConnect, status=%d\n", @@ -432,74 +581,169 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* Set the initial values of some parameters */ + setUIntDigitalParam(P_AdcRate, ADC_RATE_FACTOR, 0xFFFFFFFF); + setUIntDigitalParam(P_TbtRate, TBT_RATE_FACTOR, 0xFFFFFFFF); + setUIntDigitalParam(P_FofbRate, FOFB_RATE_FACTOR, 0xFFFFFFFF); + setUIntDigitalParam(P_MonitRate, MONIT_RATE_FACTOR, 0xFFFFFFFF); + setUIntDigitalParam(P_Monit1Rate, MONIT1_RATE_FACTOR, 0xFFFFFFFF); + setUIntDigitalParam(P_MonitPollTime, 4, 0xFFFFFFFF); // 4ms = 250 Hz + setIntegerParam(P_MonitEnable, 0); // Disable by default + + setIntegerParam( P_FOFBStatus, FOFBStatusIdle); - setUIntDigitalParam(P_FofbProcessingRamWrite, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbProcessingRamAddr, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbProcessingRamDataIn, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbProcessingRamDataOut, 0, 0xFFFFFFFF); setUIntDigitalParam(P_RtmLampStatus, 0, 0xFFFFFFFF); setUIntDigitalParam(P_RtmLampDacDataFromWb, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampAmpIFlagL, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampAmpTFlagL, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampAmpIFlagR, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampAmpTFlagR, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampAmpEn, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPIOLTriangEn, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPIOLSquareEn, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPISPSquareEn, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPIEn, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampDacData, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampDacWr, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPIKP, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPITI, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPISP, 0, 0xFFFFFFFF); setUIntDigitalParam(P_RtmLampPIOLDacCntMax, 0, 0xFFFFFFFF); setUIntDigitalParam(P_RtmLampPISPLimInf, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlActPart, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlErrClr, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlCcEnable, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlTfsOverride, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlBpmId, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlTimeFrameLen, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlMgtPowerdown, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlMgtLoopback, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlTimeFrameDly, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlGoldenOrbX, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlGoldenOrbY, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlCustFeature, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlRxPolarity, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlPayloadsel, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlFofbdatasel, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlFirmwareVer, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlSysStatus, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlLinkPartner, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlLinkUp, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlTimeFrameCount, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlHardErrCnt, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlSoftErrCnt, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlFrameErrCnt, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlRxPckCnt, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlTxPckCnt, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlFodProcessTime, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlBpmCnt, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlBpmIdRdback, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlTfLengthRdback, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlPowerdownRdback, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlLoopbackRdback, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlFaivalRdback, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlToaRdEn, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlToaRdStr, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlToaData, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlRcbRdEn, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlRcbRdStr, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_FofbCtrlRcbData, 0, 0xFFFFFFFF); + + for (int addr = 0; addr < NUM_ACQ_CORES_PER_FOFB; ++addr) { + setUIntDigitalParam(addr, P_RtmLampAmpEn, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampPIOLTriangEn, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampPIOLSquareEn, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampPISPSquareEn, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampPIEn, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampDacData, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampDacWr, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampPIKP, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampPITI, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampPISP, 0, 0xFFFFFFFF); + } + + for (int addr = 0; addr < MAX_RTM_LAMP_CHANNELS; ++addr) { + setUIntDigitalParam(addr, P_RtmLampAmpIFlagL, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampAmpTFlagL, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampAmpIFlagR, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_RtmLampAmpTFlagR, 0, 0xFFFFFFFF); + } + + /* Set acquisition parameters */ + + for (int addr = 0; addr < NUM_ACQ_CORES_PER_FOFB; ++addr) { + setUIntDigitalParam(addr, P_SamplesPre, 1000, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_SamplesPost, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_NumShots, 1, 0xFFFFFFFF); + setIntegerParam( addr, P_Channel, CH_ADC); + setDoubleParam( addr, P_UpdateTime, 1.0); + setUIntDigitalParam(addr, P_Trigger, ACQ_CLIENT_TRIG_SKIP, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_TriggerEvent, TRIG_ACQ_STOP, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_TriggerRep, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_TriggerDataThres, 100, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_TriggerDataPol, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_TriggerDataSel, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_TriggerDataFilt, 1, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_TriggerHwDly, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_DataTrigChan, 0, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_ChannelSampleSize, DFLT_SAMPLE_SIZE, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_ChannelNumAtoms, DFLT_NUM_ATOMS, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_ChannelAtomWidth, DFLT_ATOM_WIDTH, 0xFFFFFFFF); + } + + /* Set parameters for all triggers, all Acquisition cores. FIXME (Caution): + * We must deal with it at the Database level and be sure we are + * accessing the right parameter! */ + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + for (int addr = 0; addr < MAX_TRIGGERS; ++addr) { + setIntegerParam( i*MAX_TRIGGERS + addr, P_TriggerChan, CH_DFLT_TRIGGER_CHAN); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerDir, 1, 0xFFFFFFFF); /* FPGA Input */ + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerDirPol, 1, 0xFFFFFFFF); /* Reverse Direction Polarity */ + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerRcvCntRst, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerTrnCntRst, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerCntRcv, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerCntTrn, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerRcvLen, 1, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerTrnLen, 1, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerRcvSrc, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerTrnSrc, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerRcvInSel, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + addr, P_TriggerTrnOutSel, 0, 0xFFFFFFFF); + } + } + + /* Set Switching Trigger values */ + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + setIntegerParam( i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerChan, CH_DFLT_TRIGGER_CHAN); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerDir, 1, 0xFFFFFFFF); /* FPGA Input */ + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerDirPol, 1, 0xFFFFFFFF); /* Reverse Direction Polarity */ + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerRcvCntRst, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerTrnCntRst, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerCntRcv, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerCntTrn, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerRcvLen, 1, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerTrnLen, 1, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerRcvSrc, 1, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerTrnSrc, 0, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerRcvInSel, 1, 0xFFFFFFFF); + setUIntDigitalParam(i*MAX_TRIGGERS + CH_DFLT_TRIGGER_SW_CHAN, P_TriggerTrnOutSel, 0, 0xFFFFFFFF); + } + + /* Write to HW */ + for (int trig_core = 0; trig_core < NUM_TRIG_CORES_PER_FOFB; ++trig_core) { + for (int addr = 0; addr < MAX_TRIGGERS; ++addr) { + for (int i = P_TriggerChan; i < P_TriggerTrnOutSel+1; ++i) { + setParamGeneric(i, trig_core*MAX_TRIGGERS + addr); + } + } + } + +#if 0 + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + for (int addr = 0; addr < MAX_TRIGGERS; ++addr) { + readTriggerParams(0xFFFFFFFF, i*MAX_TRIGGERS + addr); + } + } +#endif /* Do callbacks so higher layers see any changes. Call callbacks for every addr */ for (int i = 0; i < MAX_ADDR; ++i) { callParamCallbacks(i); } + /* Create the thread that computes the waveforms in the background */ + for (int i = 0; i < NUM_ACQ_CORES_PER_FOFB; ++i) { + /* Assign task parameters passing the ACQ/Trigger instance ID as parameter. + * The other parameters are already set-up*/ + taskParams[i].drvFOFBp = this; + status = (asynStatus)(epicsThreadCreate("drvFOFBTask", + epicsThreadPriorityMedium, + epicsThreadGetStackSize(epicsThreadStackMedium), + (EPICSTHREADFUNC)::acqTask, + &taskParams[i]) == NULL); + if (status) { + printf("%s:%s: epicsThreadCreate failure\n", driverName, functionName); + return; + } + } + + /* Create monitoring thread */ + taskMonitParams.drvFOFBp = this; + status = (asynStatus)(epicsThreadCreate("drvFOFBMonitTask", + epicsThreadPriorityHigh, + epicsThreadGetStackSize(epicsThreadStackMedium), + (EPICSTHREADFUNC)::acqMonitTask, + &taskMonitParams) == NULL); + if (status) { + printf("%s:%s: epicsThreadCreate failure\n", driverName, functionName); + return; + } + +#if 0 + /* This driver supports MAX_ADDR with autoConnect=1. But there are only records + * connected to addresses 0-3, so addresses 4-11 never show as "connected" + * since nothing ever calls pasynManager->queueRequest. So we do an + * exceptionConnect to each address so asynManager will show them as connected. + * Note that this is NOT necessary for the driver to function correctly, the + * NDPlugins will still get called even for addresses that are not "connected". + * It is just to avoid confusion. + * */ + for (i=0; icreateAsynUser(0,0); + pasynManager->connectDevice(pasynUser, portName, i); + pasynManager->exceptionConnect(pasynUser); + } +#endif + epicsAtExit(exitHandlerC, this); + return; invalid_fofb_number_err: free (this->endpoint); @@ -507,8 +751,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, return; } -/** Destructor for the drvFOFB class. - * * */ +/* Destructor for the drvFOFB class. +*/ drvFOFB::~drvFOFB() { asynStatus status = asynSuccess; @@ -517,6 +761,7 @@ drvFOFB::~drvFOFB() lock(); status = fofbClientDisconnect(this->pasynUserSelf); unlock(); + if (status != asynSuccess) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error calling fofbClientDisconnect, status=%d\n", @@ -552,14 +797,72 @@ asynStatus drvFOFB::fofbClientConnect(asynUser* pasynUser) } } + /* Connect FOFB Monit */ + if (fofbClientMonit == NULL) { + fofbClientMonit = halcs_client_new_time (endpoint, verbose, fofbLogFile, timeout); + if (fofbClientMonit == NULL) { + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s bpmClientConnect failure to create fofbClientMonit instance\n", + driverName, functionName); + status = asynError; + goto create_halcs_client_monit_err; + } + } + + /* Connect ACQ FOFB parameter clients*/ + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + if (fofbClientAcqParam[i] == NULL) { + fofbClientAcqParam[i] = acq_client_new_time (endpoint, verbose, fofbLogFile, timeout); + if (fofbClientAcqParam[i] == NULL) { + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s fofbClientConnect failure to create fofbClientAcqParam[%d] instance\n", + driverName, functionName, i); + status = asynError; + goto create_halcs_client_acq_param_err; + } + } + } + + /* Connect ACQ FOFB clients */ + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + if (fofbClientAcq[i] == NULL) { + fofbClientAcq[i] = acq_client_new_time (endpoint, verbose, fofbLogFile, timeout); + if (fofbClientAcq[i] == NULL) { + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s fofbClientConnect failure to create fofbClientAcq[%d] instance\n", + driverName, functionName, i); + status = asynError; + goto create_halcs_client_acq_err; + } + } + } + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: FOFB Processing client connected\n", + "%s:%s: FOFB client connected\n", driverName, functionName); pasynManager->exceptionConnect(pasynUser); return status; +create_halcs_client_acq_err: + /* Destroy possible uninitialized fofbClientAcq instances */ + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + if (fofbClientAcq[i] != NULL) { + acq_client_destroy (&fofbClientAcq[i]); + } + } +create_halcs_client_acq_param_err: + /* Destroy possible uninitialized fofbClientAcqParam instances */ + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + if (fofbClientAcqParam[i] != NULL) { + acq_client_destroy (&fofbClientAcqParam[i]); + } + } + halcs_client_destroy (&fofbClientMonit); +create_halcs_client_monit_err: + /* Destroy regular fofbClient instance */ + halcs_client_destroy (&fofbClient); create_halcs_client_err: return status; } @@ -580,185 +883,1537 @@ asynStatus drvFOFB::fofbClientDisconnect(asynUser* pasynUser) halcs_client_destroy (&fofbClient); } + if (fofbClientMonit != NULL) { + halcs_client_destroy (&fofbClientMonit); + } + + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + if (fofbClientAcqParam[i] != NULL) { + acq_client_destroy (&fofbClientAcqParam[i]); + } + } + + for (int i = 0; i < NUM_TRIG_CORES_PER_FOFB; ++i) { + if (fofbClientAcq[i] != NULL) { + acq_client_destroy (&fofbClientAcq[i]); + } + } + pasynManager->exceptionDisconnect(pasynUser); return status; } +void acqTask(void *drvPvt) +{ + taskParams_t *pPvt = (taskParams_t *)drvPvt; + pPvt->drvFOFBp->acqTask(pPvt->coreID, pPvt->pollTime, pPvt->autoStart); +} + +void acqMonitTask(void *drvPvt) +{ + taskParams_t *pPvt = (taskParams_t *)drvPvt; + pPvt->drvFOFBp->acqMonitTask(); +} + /********************************************************************/ -/********************* Asyn overrided methods **********************/ +/******************* FOFB Acquisition functions *********************/ /********************************************************************/ -/* - * * * Asyn overrided methods that are called by higher layers - * * */ - -/** Called when asyn clients call pasynUInt32Digital->write(). - * * * For all parameters it sets the value in the parameter library and calls any registered callbacks.. - * * * \param[in] pasynUser pasynUser structure that encodes the reason and address. - * * * \param[in] value Value to write. */ -asynStatus drvFOFB::writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, - epicsUInt32 mask) +asynStatus drvFOFB::initAcqPM(int coreID) { - int function = pasynUser->reason; + static const char *functionName = "initAcqPM"; asynStatus status = asynSuccess; - int addr = 0; - const char *paramName; - const char* functionName = "writeUInt32Digital"; - /* Get channel for possible use */ - status = getAddress(pasynUser, &addr); + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: setting Post-Mortem parameters for coreID = %d\n", + driverName, functionName, coreID); + + /* Set paramters for Post-Mortem */ + setUIntDigitalParam(coreID, P_SamplesPre, SAMPLES_PRE_DEFAULT_PM(fofbMaxPoints), + 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_SamplesPost, SAMPLES_POST_DEFAULT_PM(fofbMaxPoints), + 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_NumShots, NUM_SHOTS_DEFAULT_PM, + 0xFFFFFFFF); + setIntegerParam( coreID, P_Channel, CH_DEFAULT_PM); + setDoubleParam( coreID, P_UpdateTime, 1.0); + setUIntDigitalParam(coreID, P_Trigger, ACQ_CLIENT_TRIG_EXTERNAL, + 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_TriggerEvent, + TRIG_ACQ_START, 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_TriggerRep, 1, 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_TriggerDataThres, + 100, 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_TriggerDataPol, + 0, 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_TriggerDataSel, + 0, 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_TriggerDataFilt, + 1, 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_TriggerHwDly, + 0, 0xFFFFFFFF); + setUIntDigitalParam(coreID, P_DataTrigChan, + 0, 0xFFFFFFFF); + + /* Do callbacks so higher layers see any changes */ + callParamCallbacks(coreID); + + /* Start triggered acquisition */ + status = setAcqEvent(0xFFFFFFFF, coreID); if (status) { - epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, - "%s:%s: status=%d, function=%d, name=%s, value=%d", - driverName, functionName, status, function, paramName, value); - return status; + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling setAcqEvent, status=%d\n", + driverName, functionName, status); + goto set_acq_trig; } + return status; - if (function >= FIRST_COMMAND) { - /* Set the parameter in the parameter library. */ - setUIntDigitalParam(addr, function, value, mask); - /* Fetch the parameter string name for possible use in debugging */ - getParamName(function, ¶mName); +set_acq_trig: + return status; +} - /* Do operation on HW. Some functions do not set anything on hardware */ - status = setParam32(function, mask, addr); - } - else { - /* Call base class */ - status = asynPortDriver::writeUInt32Digital(pasynUser, value, mask); +/* This should only be called by asyn thread, not Acquisition ones */ +asynStatus drvFOFB::setAcqTrig(int coreID, acq_client_trig_e trig) +{ + static const char *functionName = "setAcqTrig"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + asynStatus status = asynSuccess; + char service[SERVICE_NAME_SIZE]; + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, coreID, "ACQ", service, sizeof(service)); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; } - /* Do callbacks so higher layers see any changes */ - callParamCallbacks(addr); + err = acq_set_trig (fofbClientAcqParam[coreID], service, trig); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling halcs_set_acq_trig for service = %s, trigger = %d\n", + driverName, functionName, service, trig); + status = asynError; + goto halcs_acq_trig_err; + } - if (status) - epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, - "%s:%s: status=%d, function=%d, name=%s, value=%d", - driverName, functionName, status, function, paramName, value); - else - asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, - "%s:%s: function=%d, name=%s, value=%d\n", - driverName, functionName, function, paramName, value); +halcs_acq_trig_err: +get_service_err: return status; } -/** Called when asyn clients call pasynUInt32Digital->read(). - * * * For all parameters it gets the value in the parameter library.. - * * * \param[in] pasynUser pasynUser structure that encodes the reason and address. - * * * \param[out] value Value to read. */ -asynStatus drvFOFB::readUInt32Digital(asynUser *pasynUser, epicsUInt32 *value, - epicsUInt32 mask) +/* This can only return if the ACQ engine is IDLE or waiting + * for some trigger (External, Data or Software) */ +/* This should only be called by asyn thread, not Acquisition ones */ +fofb_status_types drvFOFB::getFOFBInitAcqStatus(int coreID) { - int function = pasynUser->reason; + fofb_status_types fofbStatus = FOFBStatusErrAcq; asynStatus status = asynSuccess; - int addr = 0; - const char *functionName = "readUInt32Digital"; - const char *paramName; + halcs_client_err_e herr = HALCS_CLIENT_SUCCESS; + uint32_t trig = 0; + const char* functionName = "getFOFBAcqStatus"; + char service[SERVICE_NAME_SIZE]; - /* Get channel for possible use */ - status = getAddress(pasynUser, &addr); + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, coreID, "ACQ", service, sizeof(service)); if (status) { - epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, - "%s:%s: status=%d, function=%d, name=%s", - driverName, functionName, status, function, paramName); - return status; + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; } - /* Fetch the parameter string name for possible use in debugging */ - getParamName(function, ¶mName); - if (function >= FIRST_COMMAND) { - /* Get parameter, possibly from HW */ - status = getParam32(function, value, mask, addr); + /* Have ACQ engine completed some work or is it still busy? */ + herr = acq_check (fofbClientAcqParam[coreID], service); + if (herr == HALCS_CLIENT_SUCCESS) { + return FOFBStatusIdle; } - else { - /* Call base class */ - status = asynPortDriver::readUInt32Digital(pasynUser, value, mask); + + /* If the ACQ is doing something we need to figure it out what is it */ + herr = acq_get_trig (fofbClientAcqParam[coreID], service, &trig); + if (herr != HALCS_CLIENT_SUCCESS) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling halcs_get_acq_trig, status=%d\n", + driverName, functionName, herr); + goto get_service_err; } - if (status) - epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, - "%s:%s: status=%d, function=%d, name=%s", - driverName, functionName, status, function, paramName); - else - asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, - "%s:%s: function=%d, name=%s\n", - driverName, functionName, function, paramName); + switch (trig) { + case ACQ_CLIENT_TRIG_SKIP: + /* If we are doing something and the trigger is set to SKIP, + * then we are acquiring */ + fofbStatus = FOFBStatusAcquire; + break; - return status; -} + case ACQ_CLIENT_TRIG_EXTERNAL: + fofbStatus = FOFBStatusTriggerHwExtWaiting; + break; -/********************************************************************/ -/************ Function Mapping Overloaded Write functions ***********/ -/********************************************************************/ + case ACQ_CLIENT_TRIG_DATA_DRIVEN: + fofbStatus = FOFBStatusTriggerHwDataWaiting; + break; -asynStatus drvFOFB::doExecuteHwWriteFunction(functionsInt32_t &func, char *service, - int addr, functionsArgs_t &functionParam) const -{ - const char *functionName = "doExecuteHwWriteFunction"; - halcs_client_err_e err = HALCS_CLIENT_SUCCESS; - int status = asynSuccess; + case ACQ_CLIENT_TRIG_SOFTWARE: + fofbStatus = FOFBStatusTriggerSwWaiting; + break; - /* Execute registered function */ - err = func.write(fofbClient, service, functionParam.argUInt32); - if (err != HALCS_CLIENT_SUCCESS) { - asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: failure executing write function for service %s," - "param = %u\n", - driverName, functionName, service, functionParam.argUInt32); - status = asynError; - goto halcs_set_func_param_err; + default: + fofbStatus = FOFBStatusErrAcq; } -halcs_set_func_param_err: - return (asynStatus)status; +get_service_err: + return fofbStatus; } -asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32_t &func, char *service, - int addr, functionsArgs_t &functionParam) const +static bool acqIsFOFBStatusWaitSomeTrigger(int fofbStatus) { - const char *functionName = "doExecuteHwWriteFunction"; - halcs_client_err_e err = HALCS_CLIENT_SUCCESS; - int status = asynSuccess; + if (fofbStatus == FOFBStatusTriggerHwExtWaiting || + fofbStatus == FOFBStatusTriggerHwDataWaiting || + fofbStatus == FOFBStatusTriggerSwWaiting) { + return true; + } - /* Execute registered function */ - err = func.write(fofbClient, service, functionParam.argUInt32); - if (err != HALCS_CLIENT_SUCCESS) { - asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: failure executing write function for service %s," - "param = %u\n", - driverName, functionName, service, functionParam.argUInt32); - status = asynError; - goto halcs_set_func_param_err; + return false; +} + +static bool acqIsFOFBStatusErr(int fofbStatus) +{ + if (fofbStatus == FOFBStatusErrAcq || + fofbStatus == FOFBStatusAborted || + fofbStatus == FOFBStatusErrTooManyPoints || + fofbStatus == FOFBStatusErrTooFewPoints || + fofbStatus == FOFBStatusErrNoMem || + fofbStatus == FOFBStatusErrAcqOFlow) { + return true; } -halcs_set_func_param_err: - return (asynStatus)status; + return false; } -asynStatus drvFOFB::executeHwWriteFunction(int functionId, int addr, - functionsArgs_t &functionParam) +/* + * FOFB acquisition functions + */ + +/* Acquisition task that runs as a separate thread. + */ +void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) { int status = asynSuccess; - const char *functionName = "executeHwWriteFunction"; - const char *funcService = NULL; - char service[SERVICE_NAME_SIZE]; - const char *paramName = NULL; - std::unordered_map::iterator func; - - /* Lookup function on map */ - func = fofbHwFunc.find (functionId); - if (func == fofbHwFunc.end()) { - getParamName(functionId, ¶mName); - /* This is not an error. Exit silently */ - status = asynSuccess; - asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: no registered function for functionID = %d, name %s\n", - driverName, functionName, functionId, paramName); - goto get_reg_func_err; + asynUser *pasynUser = NULL; + epicsUInt32 num_samples_pre; + epicsUInt32 num_samples_post; + epicsUInt32 num_shots; + epicsUInt32 sampleSize = 16; /* bytes */ + epicsUInt32 numAtoms = 4; + epicsUInt32 atomWidth = 32; /* bits */ + int channel; + epicsUInt32 trigger; + double updateTime; + double delay; + int hwDataChannel = 0; + int acqCompleted = 0; + int fofbStatus = 0; + int newAcq = 1; + bool autoStartFirst = autoStart; + epicsTimeStamp now; + epicsFloat64 timeStamp; + NDArray *pArrayAllChannels = NULL; + NDDataType_t NDType = NDInt32; + epicsTimeStamp startTime; + epicsTimeStamp endTime; + double elapsedTime; + int arrayCounter; + size_t dims[MAX_WVF_DIMS]; + static const char *functionName = "acqTask"; + + /* Create an asynUser. FIXME: we should probably create a callback + * for the processCallback, which would be called on a queuePortLock () + * so as to not block all addresses, just the ones related to that + * specific BOARD */ + pasynUser = pasynManager->createAsynUser(0, 0); + pasynUser->timeout = FOFB_TIMEOUT; + status = pasynManager->connectDevice(pasynUser, fofbPortName, 0); + if(status != asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: connectDevice failed, status=%d\n", + driverName, functionName, status); + return; } - /* Get service name from structure */ - funcService = func->second.getServiceName(*this); + /* Loop forever */ + lock (); + while (1) { + /* Free buffers if needed*/ + if (pArrayAllChannels) { + pArrayAllChannels->release (); + pArrayAllChannels = NULL; + } + + getIntegerParam(coreID, P_FOFBStatus, &fofbStatus); + + /* Check if we received a stop event */ + status = epicsEventWaitWithTimeout(this->stopAcqEventId[coreID], pollTime); + if (status == epicsEventWaitOK || !repetitiveTrigger[coreID] || acqIsFOFBStatusErr(fofbStatus)) { + /* We got a stop event, stop repetitive acquisition */ + readingActive[coreID] = 0; + + /* Default to new acquisition. If we are waiting for a trigger + * we will change this */ + newAcq = 1; + + /* Now, we can either be finished with the previous acquisition + * (repetitive or not) or we could be waiting for a trigger armed + * outside this thread (for now, the only option is the case when + * you set a trigger and then exit the IOC for some reason) */ + if (!acqCompleted && acqIsFOFBStatusWaitSomeTrigger(fofbStatus)) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: waiting for trigger\n", driverName, functionName); + newAcq = 0; + } + /* Only change state to IDLE if we are not in a error state and we have just acquired some data */ + else if (!acqIsFOFBStatusErr(fofbStatus)) { + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusIdle); + callParamCallbacks(coreID); + } + + /* We have consumed our data. This is important if we abort the next + * acquisition, as we can detect that the current acquisition is completed, + * which would be wrong */ + acqCompleted = 0; + + /* Only wait for the startEvent if we are waiting for a + * new acquisition */ + if (newAcq && !autoStartFirst) { + unlock(); + /* Release the lock while we wait for an event that says acquire has started, then lock again */ + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: waiting for acquire to start\n", driverName, functionName); + epicsEventWait(startAcqEventId[coreID]); + lock(); + } + readingActive[coreID] = 1; + autoStartFirst = 0; + } + + /* We are acquiring. Get the current time */ + epicsTimeGetCurrent(&startTime); + + /* Set the parameter in the parameter library. */ + getUIntDigitalParam(coreID , P_Trigger , &trigger , 0xFFFFFFFF); + getUIntDigitalParam(coreID , P_SamplesPre , &num_samples_pre , 0xFFFFFFFF); + getUIntDigitalParam(coreID , P_SamplesPost , &num_samples_post , 0xFFFFFFFF); + getUIntDigitalParam(coreID , P_NumShots , &num_shots , 0xFFFFFFFF); + getIntegerParam( coreID , P_Channel , &channel); + getDoubleParam( coreID , P_UpdateTime , &updateTime); + getUIntDigitalParam(coreID, P_ChannelSampleSize, + &sampleSize, 0xFFFFFFFF); + getUIntDigitalParam(coreID, P_ChannelNumAtoms, + &numAtoms, 0xFFFFFFFF); + getUIntDigitalParam(coreID, P_ChannelAtomWidth, + &atomWidth, 0xFFFFFFFF); + + /* Convert bit to byte */ + atomWidth = atomWidth/8; + + if(numAtoms > MAX_WVF_DATA_TYPES) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unsupported numAtoms > %d. Reduce this value in the gateware\n", + driverName, functionName, MAX_WVF_DATA_TYPES); + continue; + } + + /* Convert user channel into hw channel */ + hwDataChannel = channelMap[channel].HwDataChannel; + if(hwDataChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid hwDataChannel channelMap for channel %d\n", + driverName, functionName, hwDataChannel); + continue; + } + + /* Our waveform will have "num_samples_pres + num_samples_post" + * samples in each dimension */ + dims[0] = numAtoms; + dims[1] = (num_samples_pre + num_samples_post)*num_shots; + + /* We can't acquire something with 0 points */ + if (dims[1] == 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid number of points for acquisition (= 0)\n", + driverName, functionName); + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrTooFewPoints); + callParamCallbacks(coreID); + continue; + } + + /* dims[1] must not exceed fofbMaxPoints, as we use this to alloc + * points for the Waveform Plugins */ + if (dims[1] > fofbMaxPoints) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid number of points for acquisition (> %d)\n", + driverName, functionName, fofbMaxPoints); + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrTooManyPoints); + callParamCallbacks(coreID); + continue; + } + + /* Waveform statistics */ + epicsTimeGetCurrent(&now); + getIntegerParam(NDArrayCounter, &arrayCounter); + arrayCounter++; + setIntegerParam(NDArrayCounter, arrayCounter); + + status = getAcqNDArrayType(coreID, hwDataChannel, atomWidth, &NDType); + if (status != asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to determine NDArray type for acquisition, coreID = %d\n", + driverName, functionName, coreID); + continue; + } + + pArrayAllChannels = pNDArrayPool->alloc(MAX_WVF_DIMS, dims, NDType, 0, NULL); + if (pArrayAllChannels == NULL) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to alloc pArrayAllChannels\n", + driverName, functionName); + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrNoMem); + callParamCallbacks(coreID); + continue; + } + pArrayAllChannels->uniqueId = arrayCounter; + timeStamp = now.secPastEpoch + now.nsec / 1.e9; + pArrayAllChannels->timeStamp = timeStamp; + pArrayAllChannels->epicsTS.secPastEpoch = now.secPastEpoch; + pArrayAllChannels->epicsTS.nsec = now.nsec; + getAttributes(pArrayAllChannels->pAttributeList); + + /* Just start the acquisition if we are not already acquiring */ + if (newAcq) { + /* Tell we are acquiring just before we actually start it */ + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusAcquire); + callParamCallbacks(coreID); + + /* Do acquisition */ + unlock(); + pasynManager->lockPort(pasynUser); + status = startAcq(coreID, hwDataChannel, num_samples_pre, num_samples_post, + num_shots); + pasynManager->unlockPort(pasynUser); + lock(); + + if (status == asynSuccess) { + /* FIXME: Improve FOFBStatus trigger waiting. The information + * about waiting for trigger is not totally accurate here. + * Although, we will for SW or HW trigger in a short time, + * we are not actually there yet ... + */ + if (trigger == ACQ_CLIENT_TRIG_EXTERNAL) { + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusTriggerHwExtWaiting); + } + else if (trigger == ACQ_CLIENT_TRIG_DATA_DRIVEN) { + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusTriggerHwDataWaiting); + } + else if (trigger == ACQ_CLIENT_TRIG_SOFTWARE) { + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusTriggerSwWaiting); + } + + callParamCallbacks(coreID); + } + else { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to acquire waveform\n", + driverName, functionName); + /* Could not start acquisition. Invalid parameters */ + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrAcq); + callParamCallbacks(coreID); + continue; + } + } + + /* Wait for acquisition to complete, but allow acquire stop events to be handled */ + while (1) { + unlock(); + status = epicsEventWaitWithTimeout(this->abortAcqEventId[coreID], pollTime); + lock(); + if (status == epicsEventWaitOK) { + /* We got a stop event, abort acquisition */ + abortAcq(coreID); + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusAborted); + callParamCallbacks(coreID); + break; + } + else { + acqCompleted = checkAcqCompletion(coreID); + } + + /* Acquisition overflow */ + if (acqCompleted == -1) { + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrAcqOFlow); + callParamCallbacks(coreID); + break; + } + + if (acqCompleted == 1) { + /* Get curve */ + unlock(); + pasynManager->lockPort(pasynUser); + getAcqCurve(coreID, pArrayAllChannels, hwDataChannel, num_samples_pre, + num_samples_post, num_shots); + pasynManager->unlockPort(pasynUser); + lock(); + break; + } + } + + /* Only do callbacks and calculate position if we could acquire some + * data */ + if (acqCompleted == 1) { + /* Do callbacks on the full waveform (all channels interleaved) */ + doCallbacksGenericPointer(pArrayAllChannels, NDArrayData, + channelMap[channel].NDArrayData[coreID][WVF_ALL]); + + /* Copy data to arrays for each type of data, do callbacks on that */ + status = deinterleaveNDArray(pArrayAllChannels, channelMap[channel].NDArrayData[coreID], + dims[0], arrayCounter, &now); + if (status != asynSuccess) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to deinterleave NDArray\n", + driverName, functionName); + continue; + } + } + + /* Release buffers */ + pArrayAllChannels->release(); + pArrayAllChannels = NULL; + callParamCallbacks(coreID); + + /* If we are in repetitive mode then sleep for the acquire period minus elapsed time. */ + if (repetitiveTrigger[coreID]) { + epicsTimeGetCurrent(&endTime); + elapsedTime = epicsTimeDiffInSeconds(&endTime, &startTime); + delay = updateTime - elapsedTime; + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: delay=%f\n", + driverName, functionName, delay); + if (delay >= 0.0) { + /* We set the status to indicate we are in the period delay */ + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusWaiting); + callParamCallbacks(coreID); + unlock(); + epicsEventWaitWithTimeout(this->stopAcqEventId[coreID], delay); + lock(); + } + } + } +} + +void drvFOFB::acqMonitTask() +{ + asynStatus status = asynSuccess; + int err = HALCS_CLIENT_SUCCESS; + size_t dims[MAX_WVF_DIMS]; + epicsUInt32 mask = 0xFFFFFFFF; + NDArray *pArrayMonitData[MAX_MONIT_DATA]; + double monitData[MAX_MONIT_DATA]; + NDDataType_t NDType = NDFloat64; + int NDArrayAddrInit = WVF_MONIT_CH0; + epicsTimeStamp now; + int monitEnable = 0; + static const char *functionName = "acqMonitTask"; + char service[SERVICE_NAME_SIZE]; + + dims[0] = 1; + for (int i = 0; i < MAX_MONIT_DATA; ++i) { + pArrayMonitData[i] = pNDArrayPool->alloc(1, dims, NDType, 0, 0); + if (pArrayMonitData == NULL) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to alloc pArrayMonitData\n", + driverName, functionName); + status = asynError; + goto alloc_ndarray_err; + } + } + + err = halcs_set_monit_subscription (fofbClientMonit, service, "MONIT_AMP"); + if (err != HALCS_CLIENT_SUCCESS) { + status = asynError; + goto set_monit_subscription_err; + } + + smio_dsp_monit_data_t monit_data; + while (1) { + getIntegerParam(P_MonitEnable, &monitEnable); + if (!monitEnable) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: waiting for monitEnable =true\n", driverName, functionName); + /* remove subscription to avoid burst of old data when enabling */ + halcs_remove_monit_subscription (fofbClientMonit, service); + epicsEventWait(activeMonitEnableEventId); + halcs_set_monit_subscription (fofbClientMonit, service, "MONIT_AMP"); + } + + err = halcs_get_monit_stream (fofbClientMonit, "MONIT_AMP", &monit_data); + + if(err == HALCS_CLIENT_SUCCESS) { + + monitData[0] = 0; + monitData[1] = 0; + monitData[2] = 0; + monitData[3] = 0; + monitData[4] = 0; + monitData[5] = 0; + monitData[6] = 0; + monitData[7] = 0; + monitData[8] = 0; + monitData[9] = 0; + + epicsTimeGetCurrent(&now); + + for (int i = 0; i < MAX_MONIT_DATA; ++i) { + /* NDArray atributtes */ + pArrayMonitData[i]->timeStamp = now.secPastEpoch + now.nsec / 1.e9; + pArrayMonitData[i]->epicsTS.secPastEpoch = now.secPastEpoch; + pArrayMonitData[i]->epicsTS.nsec = now.nsec; + getAttributes(pArrayMonitData[i]->pAttributeList); + /* NDArray data */ + *((epicsFloat64 *)pArrayMonitData[i]->pData) = monitData[i]; + doCallbacksGenericPointer(pArrayMonitData[i], NDArrayData, NDArrayAddrInit+i); + } + } + else { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: Could not get Monit data. Status = %d\n", + driverName, functionName, err); + } + } + +set_monit_subscription_err: + +alloc_ndarray_err: + for (int i = 0; i < MAX_MONIT_DATA; ++i) { + pArrayMonitData[i]->release(); + } +get_service_err: + return; +} +asynStatus drvFOFB::deinterleaveNDArray (NDArray *pArrayAllChannels, const int *pNDArrayAddr, + int pNDArrayAddrSize, int arrayCounter, epicsTimeStamp *timeStamp) +{ + int status = asynSuccess; + size_t dims[MAX_WVF_DIMS]; + NDArrayInfo_t arrayInfo; + NDDataType_t NDType; + NDDataType_t NDTypeSingle; + size_t arrayYStride = 0; + NDArray *pArraySingleChannel; + epicsFloat64 *pInFloat64; + epicsFloat64 *pOutFloat64; + epicsInt32 *pIn32; + epicsInt32 *pOut32; + epicsInt16 *pIn16; + epicsInt8 *pIn8; + int channelAddr; + static const char *functionName = "deinterleaveNDArray"; + + status = pArrayAllChannels->getInfo(&arrayInfo); + if (status != asynSuccess) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to get information about pArrayAllChannels\n", + driverName, functionName); + status = asynError; + goto get_info_array_err; + } + + arrayYStride = arrayInfo.yStride; + dims[0] = arrayInfo.ySize; + NDType = pArrayAllChannels->dataType; + NDTypeSingle = NDType; + /* Convert all integer types to 32-bit */ + if (NDTypeSingle == NDInt8 || NDTypeSingle == NDInt16) { + NDTypeSingle = NDInt32; + } + + for (int i = 0; i < pNDArrayAddrSize; ++i) { + channelAddr = pNDArrayAddr[i]; + pArraySingleChannel = pNDArrayPool->alloc(1, dims, NDTypeSingle, 0, 0); + if (pArraySingleChannel == NULL) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to alloc pArraySingleChannel\n", + driverName, functionName); + status = asynError; + goto alloc_ndarray_err; + } + + pArraySingleChannel->uniqueId = arrayCounter; + pArraySingleChannel->timeStamp = timeStamp->secPastEpoch + timeStamp->nsec / 1.e9; + pArraySingleChannel->epicsTS.secPastEpoch = timeStamp->secPastEpoch; + pArraySingleChannel->epicsTS.nsec = timeStamp->nsec; + getAttributes(pArraySingleChannel->pAttributeList); + + pIn8 = (epicsInt8 *)pArrayAllChannels->pData; + pIn16 = (epicsInt16 *)pArrayAllChannels->pData; + pIn32 = (epicsInt32 *)pArrayAllChannels->pData; + pOut32 = (epicsInt32 *)pArraySingleChannel->pData; + pInFloat64 = (epicsFloat64 *)pArrayAllChannels->pData; + pOutFloat64 = (epicsFloat64 *)pArraySingleChannel->pData; + + /* Get only a single channel samples from a multi-channel + * array */ + switch (NDType) { + case NDInt8: + for (size_t j = 0; j < dims[0]; ++j) { + pOut32[j] = pIn8[i]; + pIn8 += arrayYStride; + } + break; + + case NDInt16: + for (size_t j = 0; j < dims[0]; ++j) { + pOut32[j] = pIn16[i]; + pIn16 += arrayYStride; + } + break; + + case NDInt32: + for (size_t j = 0; j < dims[0]; ++j) { + pOut32[j] = pIn32[i]; + pIn32 += arrayYStride; + } + break; + + case NDFloat64: + for (size_t j = 0; j < dims[0]; ++j) { + pOutFloat64[j] = pInFloat64[i]; + pInFloat64 += arrayYStride; + } + break; + + default: + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unsupported NDType of type: %d\n", + driverName, functionName, NDType); + status = asynError; + goto unsup_ndtype_err; + } + + doCallbacksGenericPointer(pArraySingleChannel, NDArrayData, + channelAddr); + pArraySingleChannel->release(); + } + + return (asynStatus)status; + +unsup_ndtype_err: +alloc_ndarray_err: +get_info_array_err: + return (asynStatus)status; +} + +asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int addr) +{ + asynStatus status = asynSuccess; + const char* functionName = "setAcqEvent"; + epicsUInt32 triggerEvent = 0; + epicsUInt32 triggerType = 0; + epicsUInt32 triggerRep = 0; + epicsUInt32 hwDataChannel = 0; + int channel = 0; + channelProp_t channelProp; + + /* Get the parameter in the parameter library. */ + getUIntDigitalParam(addr, P_TriggerEvent, &triggerEvent, 0xFFFFFFFF); + getUIntDigitalParam(addr, P_Trigger, &triggerType, 0xFFFFFFFF); + getUIntDigitalParam(addr, P_TriggerRep, &triggerRep, 0xFFFFFFFF); + getIntegerParam(addr, P_Channel, &channel); + + /* Convert user channel into hw channel */ + hwDataChannel = channelMap[channel].HwDataChannel; + if(hwDataChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid hwDataChannel channelMap for channel %d\n", + driverName, functionName, hwDataChannel); + status = asynError; + goto halcs_inv_channel; + } + + /* Get channel properties */ + status = getChannelProperties(addr, hwDataChannel, &channelProp); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getChannelProperties, status=%d\n", + driverName, functionName, status); + goto get_chan_prop_err; + } + + setUIntDigitalParam(addr, P_ChannelSampleSize, channelProp.sampleSize, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_ChannelNumAtoms, channelProp.numAtoms, 0xFFFFFFFF); + setUIntDigitalParam(addr, P_ChannelAtomWidth, channelProp.atomWidth, 0xFFFFFFFF); + + switch (triggerEvent) { + case TRIG_ACQ_START: + + /* Don't try to change anything is we are still acquiring. + * We must stop r abort the acquisition first */ + if (readingActive[addr]) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: Not starting acquistion as acqTask is still active\n", + driverName, functionName); + break; + } + + if (triggerRep) { + repetitiveTrigger[addr] = 1; + } + else { + repetitiveTrigger[addr] = 0; + } + + status = setAcqTrig(addr, (acq_client_trig_e) triggerType); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling setAcqTrig, status=%d\n", + driverName, functionName, status); + goto get_set_acq_trig_err; + } + + /* Send event telling the current task to proceed */ + epicsEventSignal(activeAcqEventId[addr]); + /* Signal acq thread to start acquisition with the current parameters */ + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger TRIG_ACQ_START called\n", + driverName, functionName); + epicsEventSignal(startAcqEventId[addr]); + break; + + /* Stop acquisition if we are in repetitive mode and if we are currently + * acquiring. Otherwise, we don't need to do anything, as the acquisition + * task will stop after the current acquisition */ + case TRIG_ACQ_STOP: /* Trigger == Stop */ + stopAcqTask(addr); + break; + + /* Send the abort event if we are reading (repetitive or regular). + * If we want to stop a repetitive trigger, we must send a stop + * event */ + case TRIG_ACQ_ABORT: /* Trigger == Abort */ + /* abort the other acquisition task if needed */ + abortAcqTask(addr, true); + break; + + default: + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: invalid trigger event\n", + driverName, functionName); + status = asynError; + goto trig_unimplemented_err; + } + +trig_unimplemented_err: +get_set_acq_trig_err: +get_chan_prop_err: +halcs_inv_channel: + return status; +} + +asynStatus drvFOFB::abortAcqTask(int addr, bool abortAcqHw) +{ + asynStatus status = asynSuccess; + const char* functionName = "abortAcqTask"; + + /* we are waiting for a trigger */ + if (readingActive[addr]) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger ACQ_ABORT called for acqTask, coreID = %d\n", + driverName, functionName, addr); + epicsEventSignal(this->abortAcqEventId[addr]); + } + else { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger ACQ_ABORT but with acquisition in progress, " + "called for acqTask, coreID = %d\n", + driverName, functionName, addr); + /* If we are not actively waiting for an event on acqTask, + * abort the acquisition anyway, as we might have something + * going on inside the FPGA from a previous acquisition */ + if (abortAcqHw) { + abortAcqFromPortThread(addr); + } + } + + return status; +} + +asynStatus drvFOFB::stopAcqTask(int addr) +{ + asynStatus status = asynSuccess; + const char* functionName = "stopAcqTask"; + + /* We are in repetitive mode */ + if (readingActive[addr]) { + repetitiveTrigger[addr] = 0; + /* Send the stop event */ + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger ACQ_STOP called for acqTask, coreID = %d\n", + driverName, functionName, addr); + epicsEventSignal(this->stopAcqEventId[addr]); + } + + return status; +} + +asynStatus drvFOFB::startAcq(int coreID, int hwChannel, epicsUInt32 num_samples_pre, + epicsUInt32 num_samples_post, epicsUInt32 num_shots) +{ + asynStatus status = asynSuccess; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + const char* functionName = "startAcq"; + char service[SERVICE_NAME_SIZE]; + acq_trans_t acq_trans; + acq_req_t req; + acq_block_t block; + + if (num_samples_pre + num_samples_post > MAX_ARRAY_POINTS) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to select %u pre-trigger samples and\n" + "%u post-trigger samples for acquisition\n", + driverName, functionName, num_samples_pre, num_samples_post); + status = asynError; + goto halcs_samples_sel_err; + } + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, coreID, "ACQ", service, sizeof(service)); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; + } + + req.num_samples_pre = num_samples_pre; + req.num_samples_post = num_samples_post; + req.num_shots = num_shots; + req.chan = (uint32_t) hwChannel; + + /* Fill FOFB acquisition transaction structure */ + acq_trans = {req, block}; + +#ifdef TEST_SYNTH_DATA + double t[TEST_LENGTH]; + for (int i = 0; i < TEST_LENGTH*4; ++i) { + t[i] = (1/FREQ_SAMPLE)*i; + ((int16_t *)pArrayAllChannels->pData)[i] = sin(2*PI*FREQ*t[i])*(1<<15); + } +#else + err = acq_start (fofbClientAcq[coreID], service, &req); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to acquire waveform on hwChannel %d, with %u\n" + "\tpre-trigger samples and %u post-trigger samples\n", + driverName, functionName, hwChannel, num_samples_pre, + num_samples_post); + status = asynError; + goto halcs_acq_err; + } +#endif + +halcs_acq_err: +get_service_err: +halcs_samples_sel_err: + return status; +} + +asynStatus drvFOFB::abortAcqRaw(int coreID, acq_client_t *acq_client) +{ + asynStatus status = asynSuccess; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + const char* functionName = "abortAcq"; + char service[SERVICE_NAME_SIZE]; + uint32_t fsm_stop = 1; + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, coreID, "ACQ", service, sizeof(service)); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; + } + + err = acq_set_fsm_stop (acq_client, service, fsm_stop); + if (err != HALCS_CLIENT_SUCCESS) { + status = asynError; + goto halcs_acq_stop_err; + } + +halcs_acq_stop_err: +get_service_err: + return status; +} + +/* This must be called only acquisition threads */ +asynStatus drvFOFB::abortAcq(int coreID) +{ + return abortAcqRaw(coreID, fofbClientAcq[coreID]); +} + +/* This must be called only from asyn PortThread*/ +asynStatus drvFOFB::abortAcqFromPortThread(int coreID) +{ + return abortAcqRaw(coreID, fofbClientAcqParam[coreID]); +} + +int drvFOFB::checkAcqCompletion(int coreID) +{ + int complete = 0; + asynStatus status = asynSuccess; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + const char* functionName = "checkAcqCompletion"; + char service[SERVICE_NAME_SIZE]; + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, coreID, "ACQ", service, sizeof(service)); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; + } + + err = acq_check (fofbClientAcq[coreID], service); + /* FIFO Full error */ + if (err == HALCS_CLIENT_ERR_MODULE_ERR8) { + complete = -1; + goto halcs_acq_not_finished; + } + + if (err != HALCS_CLIENT_SUCCESS) { + complete = 0; + goto halcs_acq_not_finished; + } + + complete = 1; + +halcs_acq_not_finished: +get_service_err: + return complete; +} + +asynStatus drvFOFB::getAcqCurve(int coreID, NDArray *pArrayAllChannels, int hwChannel, + epicsUInt32 num_samples_pre, epicsUInt32 num_samples_post, + epicsUInt32 num_shots) +{ + asynStatus status = asynSuccess; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + const char* functionName = "getAcqCurve"; + char service[SERVICE_NAME_SIZE]; + acq_trans_t acq_trans; + acq_req_t req; + acq_block_t block; + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, coreID, "ACQ", service, sizeof(service)); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; + } + + req.num_samples_pre = num_samples_pre; + req.num_samples_post = num_samples_post; + req.num_shots = num_shots; + req.chan = (uint32_t) hwChannel; + block.idx = 0; + block.data = (uint32_t *)pArrayAllChannels->pData; + block.data_size = (uint32_t)pArrayAllChannels->dataSize; + block.bytes_read = 0; + + /* Fill FOFB acquisition transaction structure */ + acq_trans = {req, block}; + + /* This just reads the data from memory */ + err = acq_get_curve (fofbClientAcq[coreID], service, &acq_trans); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to read waveform on hwChannel %d, with %u\n" + "\tpre-trigger samples and %u post-trigger samples\n", + driverName, functionName, hwChannel, num_samples_pre, + num_samples_post); + status = asynError; + goto halcs_acq_err; + } + +halcs_acq_err: +get_service_err: + return status; +} + +asynStatus drvFOFB::getAcqNDArrayType(int coreID, int hwChannel, epicsUInt32 atomWidth, NDDataType_t *NDType) +{ + asynStatus status = asynSuccess; + static const char *functionName = "getAcqNDArrayType"; + + /* Determine minimum data size */ + switch (atomWidth) { + case 2: /* bytes */ + *NDType = NDInt16; + break; + case 4: /* bytes */ + *NDType = NDInt32; + break; + default: + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to determine NDType for acquisition with atomWidth = %u\n", + driverName, functionName, atomWidth); + status = asynError; + goto get_ndarray_type_err; + } + +get_ndarray_type_err: + return status; +} + +asynStatus drvFOFB::getChannelProperties(int coreID, int channel, channelProp_t *channelProp) +{ + asynStatus status = asynSuccess; + int err = HALCS_CLIENT_SUCCESS; + const char* functionName = "getChannelProperties"; + char service[SERVICE_NAME_SIZE]; + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, coreID, "ACQ", service, sizeof(service)); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; + } + + err = halcs_get_acq_ch_sample_size (fofbClientAcqParam[coreID], service, + channel, &channelProp->sampleSize); + err |= halcs_get_acq_ch_num_atoms (fofbClientAcqParam[coreID], service, + channel, &channelProp->numAtoms); + err |= halcs_get_acq_ch_atom_width (fofbClientAcqParam[coreID], service, + channel, &channelProp->atomWidth); + if (err != HALCS_CLIENT_SUCCESS) { + status = asynError; + goto halcs_get_sample_size_err; + } + + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: channel properties for coreID = %u, channel = %d:\n" + "\tsampleSize = %u\n" + "\tnumAtoms = %u\n" + "\tatomWidth = %u\n", + driverName, functionName, coreID, channel, + channelProp->sampleSize, channelProp->numAtoms, channelProp->atomWidth); + +halcs_get_sample_size_err: +get_service_err: + return status; +} + +/********************************************************************/ +/********************* Asyn overrided methods **********************/ +/********************************************************************/ + +/* + * Asyn overrided methods that are called by higher layers + */ + +/* Called when asyn clients call pasynUInt32Digital->write(). + * For all parameters it sets the value in the parameter library and calls any registered callbacks.. + * \param[in] pasynUser pasynUser structure that encodes the reason and address. + * \param[in] value Value to write. */ +asynStatus drvFOFB::writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, + epicsUInt32 mask) +{ + int function = pasynUser->reason; + asynStatus status = asynSuccess; + int addr = 0; + const char *paramName = NULL; + const char* functionName = "writeUInt32Digital"; + + /* Get channel for possible use */ + status = getAddress(pasynUser, &addr); + + if (status) { + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s, value=%d", + driverName, functionName, status, function, paramName, value); + return status; + } + + if (function >= FIRST_COMMAND) { + /* Set the parameter in the parameter library. */ + setUIntDigitalParam(addr, function, value, mask); + + /* Some operations need some special handling*/ + if (function == P_TriggerEvent) { + /* If run was set then wake up the simulation task */ + status = setAcqEvent(mask, addr); + } + else if (function == P_DataTrigChan) { + /* Ah... FIXME: ugly static mapping! */ + status = setDataTrigChan(mask, addr); + } + else { + /* Fetch the parameter string name for possible use in debugging */ + getParamName(function, ¶mName); + + /* Do operation on HW. Some functions do not set anything on hardware */ + status = setParam32(function, mask, addr); + } + } + else { + /* Call base class */ +#if 0 + status = asynNDArrayDriver::writeUInt32DigitalInt32(pasynUser, value, mask); +#endif + } + + /* Do callbacks so higher layers see any changes */ + callParamCallbacks(addr); + + if (status) + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s, value=%d", + driverName, functionName, status, function, paramName, value); + else + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, name=%s, value=%d\n", + driverName, functionName, function, paramName, value); + return status; +} + +/* Called when asyn clients call pasynUInt32Digital->read(). + * For all parameters it gets the value in the parameter library.. + * \param[in] pasynUser pasynUser structure that encodes the reason and address. + * \param[out] value Value to read. */ +asynStatus drvFOFB::readUInt32Digital(asynUser *pasynUser, epicsUInt32 *value, + epicsUInt32 mask) +{ + int function = pasynUser->reason; + asynStatus status = asynSuccess; + int addr = 0; + const char *functionName = "readUInt32Digital"; + const char *paramName = NULL; + + /* Fetch the parameter string name for possible use in debugging */ + getParamName(function, ¶mName); + /* Get channel for possible use */ + status = getAddress(pasynUser, &addr); + + if (status) { + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s", + driverName, functionName, status, function, paramName); + return status; + } + + if (function >= FIRST_COMMAND) { + if (function == P_DataTrigChan) { + status = getDataTrigChan(value, mask, addr); + } + else { + /* Get parameter, possibly from HW */ + status = getParam32(function, value, mask, addr); + } + } + else { +#if 0 + /* Call base class */ + status = asynNDArrayDriver::readUIn32Digital(pasynUser, value, mask); +#endif + } + + if (status) + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s", + driverName, functionName, status, function, paramName); + else + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, name=%s\n", + driverName, functionName, function, paramName); + + return status; +} + +/*Called when asyn clients call pasynInt32->write(). + * For all parameters it sets the value in the parameter library and calls any + * registered callbacks.. + * \param[in] pasynUser pasynUser structure that encodes the reason and address. + * \param[in] value Value to write. */ +asynStatus drvFOFB::writeInt32(asynUser *pasynUser, epicsInt32 value) +{ + int function = pasynUser->reason; + asynStatus status = asynSuccess; + int addr = 0; + const char *paramName = NULL; + const char* functionName = "writeInt32"; + + /* Fetch the parameter string name for possible use in debugging */ + getParamName(function, ¶mName); + /* Get channel for possible use */ + status = getAddress(pasynUser, &addr); + + if (status) { + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s, value=%d", + driverName, functionName, status, function, paramName, value); + return status; + } + + if (function >= FIRST_COMMAND) { + /* Set the parameter in the parameter library. */ + setIntegerParam(addr, function, value); + + if (function == P_MonitEnable) { + /* Send the start event if the value is 1 */ + if (value) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: Monit enable task event to be send\n", + driverName, functionName); + epicsEventSignal(this->activeMonitEnableEventId); + } + } + + else { + /* Do operation on HW. Some functions do not set anything on hardware */ + status = setParamInteger(function, addr); + } + } + else { + /* Call base class */ + status = asynNDArrayDriver::writeInt32(pasynUser, value); + } + + /* Do callbacks so higher layers see any changes */ + callParamCallbacks(addr); + + if (status) + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s, value=%d", + driverName, functionName, status, function, paramName, value); + else + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, name=%s, value=%d\n", + driverName, functionName, function, paramName, value); + return status; +} + +/* Called when asyn clients call pasynInt32->read(). + * This does nothing for now and just call the base implementation. If needed, + * add processing before calling the base class implementation + * \param[in] pasynUser pasynUser structure that encodes the reason and address. + * \param[in] value Value to read */ +asynStatus drvFOFB::readInt32(asynUser *pasynUser, epicsInt32 *value) +{ + int function = pasynUser->reason; + asynStatus status = asynSuccess; + int addr = 0; + const char *paramName = NULL; + const char* functionName = "readInt32"; + + /* Fetch the parameter string name for possible use in debugging */ + getParamName(function, ¶mName); + /* Get channel for possible use */ + status = getAddress(pasynUser, &addr); + + if (status) { + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s", + driverName, functionName, status, function, paramName); + return status; + } + + if (function >= FIRST_COMMAND) { + /* Get parameter in library, as some parameters are not written in HW */ + status = getParamInteger(function, value, addr); + } + else { + /* Call base class */ + status = asynNDArrayDriver::readInt32(pasynUser, value); + } + + if (status) + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s", + driverName, functionName, status, function, paramName); + else + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, name=%s\n", + driverName, functionName, function, paramName); + return status; +} + +/* Called when asyn clients call pasynFloat64->write(). + * \param[in] pasynUser pasynUser structure that encodes the reason and address. + * \param[in] value Value to read */ +asynStatus drvFOFB::writeFloat64(asynUser *pasynUser, epicsFloat64 value) +{ + int function = pasynUser->reason; + asynStatus status = asynSuccess; + int addr = 0; + const char *paramName = NULL; + const char* functionName = "writeFloat64"; + + /* Fetch the parameter string name for possible use in debugging */ + getParamName(function, ¶mName); + /* Get channel for possible use */ + status = getAddress(pasynUser, &addr); + + if (status) { + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s, value=%f", + driverName, functionName, status, function, paramName, value); + return status; + } + + if (function >= FIRST_COMMAND) { + /* Set the parameter in the parameter library. */ + setDoubleParam(addr, function, value); + + /* Do operation on HW. Some functions do not set anything on hardware */ + status = setParamDouble(function, addr); + } + else { + /* Call base class */ + status = asynNDArrayDriver::writeFloat64(pasynUser, value); + } + + /* Do callbacks so higher layers see any changes */ + callParamCallbacks(addr); + + if (status) + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s, value=%f", + driverName, functionName, status, function, paramName, value); + else + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, name=%s, value=%f\n", + driverName, functionName, function, paramName, value); + return status; +} + +/* Called when asyn clients call pasynFloat64->read(). + * \param[in] pasynUser pasynUser structure that encodes the reason and address. + * \param[in] value Value to read */ +asynStatus drvFOFB::readFloat64(asynUser *pasynUser, epicsFloat64 *value) +{ + int function = pasynUser->reason; + asynStatus status = asynSuccess; + int addr = 0; + const char *paramName = NULL; + const char* functionName = "readFloat64"; + + /* Fetch the parameter string name for possible use in debugging */ + getParamName(function, ¶mName); + /* Get channel for possible use */ + status = getAddress(pasynUser, &addr); + + if (status) { + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s", + driverName, functionName, status, function, paramName); + return status; + } + + /* Get double param, possibly from HW */ + if (function >= FIRST_COMMAND) { + status = getParamDouble(function, value, addr); + } + else { + /* Call base class */ + status = asynNDArrayDriver::readFloat64(pasynUser, value); + } + + if (status) + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s", + driverName, functionName, status, function, paramName); + else + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, name=%s\n", + driverName, functionName, function, paramName); + return status; +} + +/********************************************************************/ +/************ Function Mapping Overloaded Write functions ***********/ +/********************************************************************/ + +asynStatus drvFOFB::doExecuteHwWriteFunction(functionsInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const +{ + const char *functionName = "doExecuteHwWriteFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; + + /* Execute registered function */ + err = func.write(fofbClient, service, functionParam.argUInt32); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing write function for service %s," + "param = %u\n", + driverName, functionName, service, functionParam.argUInt32); + status = asynError; + goto halcs_set_func_param_err; + } + +halcs_set_func_param_err: + return (asynStatus)status; +} + +asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const +{ + const char *functionName = "doExecuteHwWriteFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; + + /* Execute registered function */ + err = func.write(fofbClient, service, functionParam.argUInt32); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing write function for service %s," + "param = %u\n", + driverName, functionName, service, functionParam.argUInt32); + status = asynError; + goto halcs_set_func_param_err; + } + +halcs_set_func_param_err: + return (asynStatus)status; +} + +asynStatus drvFOFB::executeHwWriteFunction(int functionId, int addr, + functionsArgs_t &functionParam) +{ + int status = asynSuccess; + const char *functionName = "executeHwWriteFunction"; + const char *funcService = NULL; + char service[SERVICE_NAME_SIZE]; + const char *paramName = NULL; + std::unordered_map::iterator func; + + /* Lookup function on map */ + func = fofbHwFunc.find (functionId); + if (func == fofbHwFunc.end()) { + getParamName(functionId, ¶mName); + /* This is not an error. Exit silently */ + status = asynSuccess; + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: no registered function for functionID = %d, name %s\n", + driverName, functionName, functionId, paramName); + goto get_reg_func_err; + } + + /* Get service name from structure */ + funcService = func->second.getServiceName(*this); /* Create full service name*/ status = getFullServiceName (this->fofbNumber, addr, funcService, service, sizeof(service)); @@ -784,7 +2439,6 @@ asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char * halcs_client_err_e err = HALCS_CLIENT_SUCCESS; int status = asynSuccess; char serviceChanStr[SERVICE_NAME_SIZE]; - int serviceID = 0; epicsUInt32 serviceChan = 0; /* Create full service name*/ @@ -813,7 +2467,112 @@ asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char * } halcs_set_func_param_err: -get_service_err: +get_service_err: + return (asynStatus) status; +} + +asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32Acq_t &func, char *service, + int addr, functionsArgs_t &functionParam) const +{ + const char *functionName = "doExecuteHwWriteFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; + int serviceID = 0; + + /* Get service ID for correct use with acquisition instance */ + status = getServiceID (this->fofbNumber, addr, func.serviceName, + &serviceID); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getServiceID, status=%d\n", + driverName, functionName, status); + goto get_service_id_err; + } + + /* Execute registered function */ + err = func.write(fofbClientAcqParam[serviceID], service, functionParam.argUInt32); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing write function for service %s," + "param = %u\n", + driverName, functionName, service, functionParam.argUInt32); + status = asynError; + goto halcs_set_func_param_err; + } + +halcs_set_func_param_err: +get_service_id_err: + return (asynStatus) status; +} + +asynStatus drvFOFB::doExecuteHwWriteFunction(functions2UInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const +{ + const char *functionName = "doExecuteHwWriteFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; + epicsUInt32 param1 = 0; + epicsUInt32 param2 = 0; + + /* Silently exit if no function is registered */ + if(!func.read) { + status = asynSuccess; + goto no_registered_read_func_err; + } + + /* Read the HW values first as we need to update + only one of the parameters */ + err = func.read(fofbClient, service, ¶m1, ¶m2); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing read function for service %s\n", + driverName, functionName, service); + status = asynError; + goto halcs_get_func_param_err; + } + + /* Determine if we want to change the first or second parameter in HW */ + if (func.parameterPos == 1) { + err = func.write(fofbClient, service, functionParam.argUInt32, param2); + } + else if (func.parameterPos == 2) { + err = func.write(fofbClient, service, param1, functionParam.argUInt32); + } + + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing write function for service %s," + "param = %u\n", + driverName, functionName, service, functionParam.argUInt32); + status = asynError; + goto halcs_set_func_param_err; + } + +halcs_set_func_param_err: +halcs_get_func_param_err: +no_registered_read_func_err: + return (asynStatus) status; +} + +asynStatus drvFOFB::doExecuteHwWriteFunction(functionsFloat64_t &func, char *service, + int addr, functionsArgs_t &functionParam) const +{ + const char *functionName = "doExecuteHwWriteFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; + + /* Execute registered function */ + err = func.write(fofbClient, service, functionParam.argFloat64); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing write function for service %s," + "param = %f\n", + driverName, functionName, service, functionParam.argFloat64); + status = asynError; + goto halcs_set_func_param_err; + } + +halcs_set_func_param_err: return (asynStatus) status; } @@ -911,7 +2670,6 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functionsUInt32Chan_t &func, char *s halcs_client_err_e err = HALCS_CLIENT_SUCCESS; char serviceChanStr[SERVICE_NAME_SIZE]; int status = asynSuccess; - int serviceID = 0; epicsUInt32 serviceChan = 0; /* Create full service name*/ @@ -942,15 +2700,101 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functionsUInt32Chan_t &func, char *s return (asynStatus) status; } +asynStatus drvFOFB::doExecuteHwReadFunction(functionsUInt32Acq_t &func, char *service, + int addr, functionsArgs_t &functionParam) const +{ + const char *functionName = "doExecuteHwReadFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; + int serviceID = 0; + + /* Get service ID for correct use with acquisition instance */ + status = getServiceID (this->fofbNumber, addr, func.serviceName, + &serviceID); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getServiceID, status=%d\n", + driverName, functionName, status); + goto get_service_id_err; + } + + /* Execute registered function */ + err = func.read(fofbClientAcqParam[serviceID], service, &functionParam.argUInt32); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing read function for service %s\n", + driverName, functionName, service); + status = asynError; + goto halcs_get_func_param_err; + } + +halcs_get_func_param_err: +get_service_id_err: + return (asynStatus) status; +} + +asynStatus drvFOFB::doExecuteHwReadFunction(functions2UInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const +{ + const char *functionName = "doExecuteHwReadFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; + epicsUInt32 param1 = 0; + epicsUInt32 param2 = 0; + + /* Read the HW values first as we need to update + only one of the parameters */ + err = func.read(fofbClient, service, ¶m1, ¶m2); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing read function for service %s\n", + driverName, functionName, service); + status = asynError; + goto halcs_get_func_param_err; + } + + /* Determine if we want to read the first or second parameter */ + if (func.parameterPos == 1) { + functionParam.argUInt32 = param1; + } + else if (func.parameterPos == 2) { + functionParam.argUInt32 = param2; + } + +halcs_get_func_param_err: + return (asynStatus) status; +} + +asynStatus drvFOFB::doExecuteHwReadFunction(functionsFloat64_t &func, char *service, + int addr, functionsArgs_t &functionParam) const +{ + const char *functionName = "doExecuteHwReadFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; + + /* Execute registered function */ + err = func.read(fofbClient, service, &functionParam.argFloat64); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: failure executing read function for service %s\n", + driverName, functionName, service); + status = asynError; + goto halcs_get_func_param_err; + } + +halcs_get_func_param_err: + return (asynStatus) status; +} + /********************************************************************/ /********* Generic 32-bit/Double FOFB Processing Operations *********/ /********************************************************************/ /* - * * * 32-bit/Double generic FOFB Processing operations. These will map to real - * * * functions defined in the structures. e.g., functionsInt32_t - * * * and functionsFloat64_t - * * */ + * 32-bit/Double generic FOFB Processing operations. These will map to real + * functions defined in the structures. e.g., functionsInt32_t + * and functionsFloat64_t + */ asynStatus drvFOFB::setParamGeneric(int functionId, int addr) { @@ -970,10 +2814,18 @@ asynStatus drvFOFB::setParamGeneric(int functionId, int addr) } switch (asynType) { + case asynParamInt32: + status = setParamInteger(functionId, addr); + break; + case asynParamUInt32Digital: status = setParam32(functionId, 0xFFFFFFFF, addr); break; + case asynParamFloat64: + status = setParamDouble(functionId, addr); + break; + default: asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: unsupported type for asynParamType: %d, " @@ -997,7 +2849,6 @@ asynStatus drvFOFB::setParamGeneric(int functionId, int addr) return (asynStatus)status; } - asynStatus drvFOFB::setParam32(int functionId, epicsUInt32 mask, int addr) { int status = asynSuccess; @@ -1046,7 +2897,61 @@ asynStatus drvFOFB::getParam32(int functionId, epicsUInt32 *param, *param = functionArgs.argUInt32; } /* We recover from asynDisabled just by retrieving - * * * the parameter from the list */ + * * * * * the parameter from the list */ + else if (status == asynDisabled){ + status = asynSuccess; + } + +get_param_err: + return (asynStatus)status; +} + +asynStatus drvFOFB::setParamInteger(int functionId, int addr) +{ + int status = asynSuccess; + functionsArgs_t functionArgs = {0}; + const char *functionName = "setParamInteger"; + + status = getIntegerParam(addr, functionId, &functionArgs.argInt32); + if (status != asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: getIntegerParam failure for retrieving Parameter\n", + driverName, functionName); + goto get_param_err; + } + + status = executeHwWriteFunction(functionId, addr, functionArgs); + +get_param_err: + return (asynStatus)status; +} + +asynStatus drvFOFB::getParamInteger(int functionId, epicsInt32 *param, + int addr) +{ + int status = asynSuccess; + functionsArgs_t functionArgs = {0}; + const char *functionName = "getParamInteger"; + const char *paramName; + + /* Get parameter in library, as some parameters are not written in HW */ + status = getIntegerParam(addr, functionId, param); + if (status != asynSuccess) { + if (status != asynParamUndefined) { + getParamName(functionId, ¶mName); + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: getIntegerParam failure for retrieving parameter %s, status = %d\n", + driverName, functionName, paramName, status); + } + goto get_param_err; + } + + status = executeHwReadFunction(functionId, addr, functionArgs); + if (status == asynSuccess) { + *param = functionArgs.argInt32; + } + /* We recover from asynDisabled just by retrieving + * the parameter from the list */ else if (status == asynDisabled){ status = asynSuccess; } @@ -1055,26 +2960,301 @@ asynStatus drvFOFB::getParam32(int functionId, epicsUInt32 *param, return (asynStatus)status; } +asynStatus drvFOFB::setParamDouble(int functionId, int addr) +{ + asynStatus status = asynSuccess; + functionsArgs_t functionArgs = {0}; + const char *functionName = "setParamDouble"; + + status = getDoubleParam(addr, functionId, &functionArgs.argFloat64); + if (status != asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: getUIntDigitalParam failure for retrieving Parameter\n", + driverName, functionName); + goto get_param_err; + } + + status = executeHwWriteFunction(functionId, addr, functionArgs); + +get_param_err: + return status; +} + +asynStatus drvFOFB::getParamDouble(int functionId, epicsFloat64 *param, int addr) +{ + asynStatus status = asynSuccess; + functionsArgs_t functionArgs = {0}; + const char *functionName = "getParamDouble"; + const char *paramName; + + /* Get parameter in library, as some parameters are not written in HW */ + status = getDoubleParam(addr, functionId, param); + if (status != asynSuccess) { + if (status != asynParamUndefined) { + getParamName(functionId, ¶mName); + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: getDoubleParam failure for retrieving parameter %s\n", + driverName, functionName, paramName); + } + goto get_param_err; + } + + status = executeHwReadFunction(functionId, addr, functionArgs); + if (status == asynSuccess) { + *param = functionArgs.argFloat64; + } + /* We recover from asynDisabled just by retrieving + * the parameter from the list */ + else if (status == asynDisabled){ + status = asynSuccess; + } + +get_param_err: + return status; +} + /********************************************************************/ -/*********************** Misc BPM Operations ************************/ +/*********************** Misc FOFB Operations ***********************/ /********************************************************************/ /* - * * * Miscellaneous functions that don't map easily - * * * to our generic handlers get/setParam[32/Double] - * * */ + * Miscellaneous functions that don't map easily + * to our generic handlers get/setParam[32/Double] + */ + +asynStatus drvFOFB::setDataTrigChan(epicsUInt32 mask, int addr) +{ + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + char service[SERVICE_NAME_SIZE]; + int status = asynSuccess; + const char* functionName = "setDataTrigChan"; + epicsUInt32 dataTrigChan = 0; + int hwDataChannel = 0; + int serviceID = 0; + + /* Set the parameter in the parameter library. */ + getUIntDigitalParam(addr, P_DataTrigChan, &dataTrigChan, mask); + + /* Convert user channel into hw channel */ + hwDataChannel = channelMap[dataTrigChan].HwDataChannel; + if(hwDataChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid hwDataChannel channelMap for channel %d\n", + driverName, functionName, hwDataChannel); + status = asynError; + goto halcs_inv_channel; + } + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, addr, "ACQ", + service, sizeof(service)); + status |= getServiceID (this->fofbNumber, addr, "ACQ", &serviceID); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; + } + + err = acq_set_data_trig_chan (fofbClientAcqParam[serviceID], service, hwDataChannel); + if (err != HALCS_CLIENT_SUCCESS) { + status = asynError; + goto halcs_set_data_trig_chan_err; + } + +halcs_set_data_trig_chan_err: +get_service_err: +halcs_inv_channel: + return (asynStatus)status; +} + +asynStatus drvFOFB::getDataTrigChan(epicsUInt32 *channel, epicsUInt32 mask, int addr) +{ + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + char service[SERVICE_NAME_SIZE]; + int status = asynSuccess; + const char* functionName = "getDataTrigChan"; + epicsUInt32 dataTrigChan = 0; + epicsUInt32 hwDataChannel = 0; + int serviceID = 0; + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, addr, "ACQ", + service, sizeof(service)); + status |= getServiceID (this->fofbNumber, addr, "ACQ", &serviceID); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; + } + + /* Clear parameter in case of an error occurs */ + *channel = 0; + + err = acq_get_data_trig_chan (fofbClientAcqParam[serviceID], service, &hwDataChannel); + if (err != HALCS_CLIENT_SUCCESS) { + status = asynError; + goto halcs_get_data_trig_chan_err; + } + + if (hwDataChannel > CH_HW_END-1) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid hwDataChannel channelRevMap for channel %d\n", + driverName, functionName, hwDataChannel); + status = asynError; + goto halcs_inv_hw_channel; + } + + /* Convert user channel into hw channel */ + dataTrigChan = channelRevMap[hwDataChannel].epicsChannel; + if(dataTrigChan < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid channel channelRevMap for channel %d\n", + driverName, functionName, dataTrigChan); + status = asynError; + goto halcs_inv_channel; + } + + /* Mask parameter according to the received mask */ + dataTrigChan &= mask; + *channel = dataTrigChan; + +halcs_inv_channel: +halcs_inv_hw_channel: +halcs_get_data_trig_chan_err: +get_service_err: + return (asynStatus)status; +} + +asynStatus drvFOFB::updateUInt32Params(epicsUInt32 mask, int addr, int firstParam, + int lastParam, bool acceptErrors) +{ + int status = asynSuccess; + int errs = 0; + const char* functionName = "updateUInt32Params"; + epicsUInt32 param = 0; + + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: updating UInt32 parameters with firstParam = %d, lastParam = %d, " + "addr = %d\n", + driverName, functionName, firstParam, lastParam, addr); + + for (int i = firstParam; i < lastParam+1; ++i) { + status = getParam32(i, ¶m, mask, addr); + /* Only write values if there is no error */ + if (status) { + if (status != asynParamUndefined) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error getting UInt32 parameter for function = %d, " + "addr = %d status = %d\n", + driverName, functionName, i, addr, status); + } + ++errs; + } + else { + setUIntDigitalParam(addr, i, param, mask); + } + } + if (acceptErrors) { + return asynSuccess; + } + + return (errs == 0)? asynSuccess : asynError; +} + +asynStatus drvFOFB::updateIntegerParams(int addr, int firstParam, + int lastParam, bool acceptErrors) +{ + int status = asynSuccess; + int errs = 0; + const char* functionName = "updateIntegerParams"; + epicsInt32 param = 0; + + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: updating Int32 parameters with firstParam = %d, lastParam = %d, " + "addr = %d\n", + driverName, functionName, firstParam, lastParam, addr); + + for (int i = firstParam; i < lastParam+1; ++i) { + status = getParamInteger(i, ¶m, addr); + /* Only write values if there is no error */ + if (status) { + if (status != asynParamUndefined) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error getting Int32 parameter for function = %d, " + "addr = %d status = %d\n", + driverName, functionName, i, addr, status); + } + ++errs; + } + else { + setIntegerParam(addr, i, param); + } + } + + if (acceptErrors) { + return asynSuccess; + } + + return (errs == 0)? asynSuccess : asynError; +} + +asynStatus drvFOFB::updateDoubleParams(int addr, int firstParam, int lastParam, + bool acceptErrors) +{ + int status = asynSuccess; + int errs = 0; + const char* functionName = "updateDoubleParams"; + epicsFloat64 param = 0.0; + + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: updating Double parameters with firstParam = %d, lastParam = %d, " + "addr = %d\n", + driverName, functionName, firstParam, lastParam, addr); + + for (int i = firstParam; i < lastParam+1; ++i) { + status = getParamDouble(i, ¶m, addr); + /* Only write values is there is no error */ + if (status) { + if (status != asynParamUndefined) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error getting Double parameter for function = %d, " + "addr = %d status = %d\n", + driverName, functionName, i, addr, status); + } + ++errs; + } + else { + setDoubleParam(addr, i, param); + } + } + + if (acceptErrors) { + return asynSuccess; + } + + return (errs == 0)? asynSuccess : asynError; +} + +asynStatus drvFOFB::readTriggerParams(epicsUInt32 mask, int addr) +{ + return updateUInt32Params(mask, addr, P_TriggerDir, P_TriggerTrnOutSel, false); +} /* Configuration routine. Called directly, or from the iocsh function below */ extern "C" { - /** EPICS iocsh callable function to call constructor for the drvFOFB class. - * * * \param[in] portName The name of the asyn port driver to be created. - * * * \param[in] endpoint The address device string */ + /* EPICS iocsh callable function to call constructor for the drvFOFB class. + * \param[in] portName The name of the asyn port driver to be created. + * \param[in] endpoint The address device string */ int drvFOFBConfigure(const char *portName, const char *endpoint, - int fofbNumber, int verbose, int timeout) + int fofbNumber, const char *type, int verbose, int timeout, + int maxPoints, int maxBuffers, size_t maxMemory) { - new drvFOFB(portName, endpoint, fofbNumber, verbose, timeout); + new drvFOFB(portName, endpoint, fofbNumber, type, verbose, + timeout, maxPoints, maxBuffers, maxMemory); return(asynSuccess); } @@ -1082,18 +3262,27 @@ extern "C" { static const iocshArg initArg0 = { "portName", iocshArgString}; static const iocshArg initArg1 = { "endpoint", iocshArgString}; static const iocshArg initArg2 = { "fofbNumber", iocshArgInt}; - static const iocshArg initArg3 = { "verbose", iocshArgInt}; - static const iocshArg initArg4 = { "timeout", iocshArgInt}; + static const iocshArg initArg3 = { "type", iocshArgString}; + static const iocshArg initArg4 = { "verbose", iocshArgInt}; + static const iocshArg initArg5 = { "timeout", iocshArgInt}; + static const iocshArg initArg6 = { "maxPoints", iocshArgInt}; + static const iocshArg initArg7 = { "maxBuffers", iocshArgInt}; + static const iocshArg initArg8 = { "maxMemory", iocshArgInt}; static const iocshArg * const initArgs[] = {&initArg0, &initArg1, &initArg2, &initArg3, - &initArg4}; - static const iocshFuncDef initFuncDef = {"drvFOFBConfigure",5,initArgs}; + &initArg4, + &initArg5, + &initArg6, + &initArg7, + &initArg8}; + static const iocshFuncDef initFuncDef = {"drvFOFBConfigure",9,initArgs}; static void initCallFunc(const iocshArgBuf *args) { drvFOFBConfigure(args[0].sval, args[1].sval, args[2].ival, - args[3].ival, args[4].ival); + args[3].sval, args[4].ival, args[5].ival, args[6].ival, + args[7].ival, args[8].ival); } void drvFOFBRegister(void) diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index 29122b8..6f039aa 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -1,17 +1,20 @@ /* - * * * drvFOFB.h - * * * - * * * Authors: Melissa Aguiar - * * * - * * * Created Dec. 03, 2021 - * * */ - -#include "asynPortDriver.h" + * drvFOFB.h + * + * Authors: Melissa Aguiar + * + * Created Dec. 03, 2021 + */ + +#include "asynNDArrayDriver.h" #include +#include #include +#include /* Third-party libraries */ #include #include +#include /* any implementation for non c++-17 compilers */ #include "any.hpp" @@ -21,6 +24,124 @@ using linb::any_cast; using linb::bad_any_cast; #define ARRAY_SIZE(ARRAY) (sizeof(ARRAY)/sizeof((ARRAY)[0])) +#define MAX_ARRAY_POINTS 200000 +#define FOFB_TIMEOUT 1.0 + +typedef enum { + FOFBIDReg = 0, + FOFBIDEnd, +} fofb_coreID_types; + +#define NUM_ACQ_CORES_PER_FOFB FOFBIDEnd /* Regular Acquisition core and Post-Mortem */ +#define NUM_TRIG_CORES_PER_FOFB NUM_ACQ_CORES_PER_FOFB /* Trigger core for regular Acquisition and Post-Mortem */ + +/* FOFB acquisition status */ +typedef enum { + FOFBStatusIdle = 0, + FOFBStatusWaiting, + FOFBStatusTriggerHwExtWaiting, + FOFBStatusTriggerHwDataWaiting, + FOFBStatusTriggerSwWaiting, + FOFBStatusAcquire, + FOFBStatusErrAcq, + FOFBStatusAborted, + FOFBStatusErrTooManyPoints, + FOFBStatusErrTooFewPoints, + FOFBStatusErrNoMem, + FOFBStatusErrAcqOFlow, +} fofb_status_types; + +/* Waveform IDs */ +typedef enum { + WVF_DATA_CH0 = 0, + WVF_DATA_CH1, + WVF_DATA_CH2, + WVF_DATA_CH3, + WVF_DATA_CH4, + WVF_DATA_CH5, + WVF_DATA_CH6, + WVF_DATA_CH7, + WVF_DATA_CH8, + WVF_DATA_CH9, + WVF_DATA_CH10, + WVF_DATA_CH11, + WVF_DATA_CH12, + WVF_DATA_CH13, + WVF_DATA_CH14, + WVF_DATA_CH15, + WVF_DATA_ALL, + WVF_MONIT_CH0, + WVF_END +} wvf_types; + +/* FIXME: This number must be at least the number of triggers + * available on the FPGA. Although this is used to alloc the number + * of waveforms, it's not used by getAddress () by the NDArray plugins, + * as this function returns the address that is declared on plugin startup + * (NDStdArraysConfigure function, NDArrayAddr). So, we are free to use all + * of the addresses that are set by the database. + * In summary, we use the different addresses to call different trigger channel + * functions */ +#define MAX_WAVEFORMS WVF_END +/* FIXME FIXME: This should be read from HW. Also, this is actually less than 24, + * but we let space for extra room */ +#define MAX_TRIGGERS 24 +/* This is needed so we have EPICS Asyn addresses sufficient for all of the + * Triggers, from either ACQ core */ +#define MAX_TRIGGERS_ALL_ACQ (NUM_ACQ_CORES_PER_FOFB*MAX_TRIGGERS) +/* Get the greater between them */ +#define MAX_ADDR MAX(MAX_WAVEFORMS,MAX_TRIGGERS_ALL_ACQ) +/* Number of Monitoring waveforms */ +#define MAX_MONIT_DATA 10 + +/* Channel IDs */ +typedef enum { + CH_ADC = 0, + CH_TBT = 1, + CH_FOFB = 2, + CH_MONIT1 = 3, + CH_END +} ch_types; + +#define MAX_CHANNELS CH_END + +typedef enum { + CH_HW_ADC = 0, + CH_HW_TBT = 6, + CH_HW_FOFB = 11, + CH_HW_MONIT1 = 14, + CH_HW_END +} ch_hw_types; + +#define MAX_HW_CHANNELS CH_HW_END + +/* Waveform DATA types IDs */ +typedef enum { + WVF_CH0 = 0, + WVF_CH1, + WVF_CH2, + WVF_CH3, + WVF_CH4, + WVF_CH5, + WVF_CH6, + WVF_CH7, + WVF_CH8, + WVF_CH9, + WVF_CH10, + WVF_CH11, + WVF_CH12, + WVF_CH13, + WVF_CH14, + WVF_CH15, + WVF_ALL, + WVF_DATA_END +} wvf_data_types; + +#define MAX_WVF_DATA_SINGLE (WVF_CH0+1) +#define MAX_WVF_DATA_TYPES WVF_DATA_END + +/* One dimension for each point */ +#define MAX_WVF_DIMS 2 #define MAX_SLOTS 12 #define MAX_FOFB_PER_SLOT 2 @@ -29,13 +150,28 @@ using linb::bad_any_cast; #define FOFB_NUMBER_MIN 1 #define FOFB_NUMBER_MAX MAX_FOFBS -#define MAX_ADDR 8 +#define MAX_RTM_LAMP_CHANNELS 12 -/* FOFB Mappping structure */ +/* FOFB Channel structure */ typedef struct { - int board; - int fofb; -} boardMap_t; + /* HW channel mapping. -1 means not available */ + int HwDataChannel; + /* NDArray addresses mapping */ + int NDArrayData[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_DATA_TYPES]; +} channelMap_t; + +/* FOFB Reverse channel mapping structure */ +typedef struct { + /* EPICS channel. -1 means not available */ + int epicsChannel; +} channelRevMap_t; + +/* FOFB Acq Channel properties structure */ +typedef struct { + epicsUInt32 sampleSize; + epicsUInt32 numAtoms; + epicsUInt32 atomWidth; +} channelProp_t; /* Write 32-bit function pointer */ typedef halcs_client_err_e (*writeInt32Fp)(halcs_client_t *self, char *service, @@ -79,6 +215,51 @@ typedef struct { readUInt32ChanFp read; } functionsUInt32Chan_t; +/* Write 32-bit function pointer with acq_client structure */ +typedef halcs_client_err_e (*writeUInt32AcqFp)(acq_client_t *self, char *service, + uint32_t param); +/* Read 32-bit function pointer with acq_client structure */ +typedef halcs_client_err_e (*readUInt32AcqFp)(acq_client_t *self, char *service, + uint32_t *param); + +/* FOFB command dispatch table */ +typedef struct { + const char *serviceName; + writeUInt32AcqFp write; + readUInt32AcqFp read; +} functionsUInt32Acq_t; + +/* Write 2 32-bit function pointer */ +typedef halcs_client_err_e (*write2UInt32Fp)(halcs_client_t *self, char *service, + uint32_t param1, uint32_t param2); +/* Read 32-bit function pointer */ +typedef halcs_client_err_e (*read2UInt32Fp)(halcs_client_t *self, char *service, + uint32_t *param1, uint32_t *param2); + +/* FOFB command dispatch table */ +typedef struct { + const char *serviceName; + write2UInt32Fp write; + read2UInt32Fp read; + /* Which parameter (first or second) would trigger this function to be + * * * * executed on hardware (the other one won't be changed) */ + int parameterPos; +} functions2UInt32_t; + +/* Write 64-bit float function pointer */ +typedef halcs_client_err_e (*writeFloat64Fp)(halcs_client_t *self, char *service, + double param); +/* Read 32-bit function pointer */ +typedef halcs_client_err_e (*readFloat64Fp)(halcs_client_t *self, char *service, + double *param); + +/* FOFB command dispatch table */ +typedef struct { + const char *serviceName; + writeFloat64Fp write; + readFloat64Fp read; +} functionsFloat64_t; + typedef struct { union { epicsInt32 argInt32; @@ -157,17 +338,13 @@ struct functionsAny_t { }; /* These are the drvInfo strings that are used to identify the parameters. - * * * They are used by asyn clients, including standard asyn device support */ -#define P_FofbProcessingRamWriteString "FOFB_PROCESSING_RAM_WRITE" /* asynUInt32Digital, r/w */ -#define P_FofbProcessingRamAddrString "FOFB_PROCESSING_RAM_ADDR" /* asynUInt32Digital, r/w */ -#define P_FofbProcessingRamDataInString "FOFB_PROCESSING_RAM_DATA_IN" /* asynUInt32Digital, r/w */ -#define P_FofbProcessingRamDataOutString "FOFB_PROCESSING_RAM_DATA_OUT" /* asynUInt32Digital, r/o */ + * They are used by asyn clients, including standard asyn device support */ #define P_RtmLampStatusString "RTMLAMP_OHWR_STA" /* asynUInt32Digital, r/o */ #define P_RtmLampDacDataFromWbString "RTMLAMP_OHWR_CTL_DAC_DATA_FROM_WB" /* asynUInt32Digital, r/w */ -#define P_RtmLampAmpIFlagLString "RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_L" /* asynUInt32Digital, r/w */ -#define P_RtmLampAmpTFlagLString "RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_L" /* asynUInt32Digital, r/w */ -#define P_RtmLampAmpIFlagRString "RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_R" /* asynUInt32Digital, r/w */ -#define P_RtmLampAmpTFlagRString "RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_R" /* asynUInt32Digital, r/w */ +#define P_RtmLampAmpIFlagLString "RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_L" /* asynUInt32Digital, r/o */ +#define P_RtmLampAmpTFlagLString "RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_L" /* asynUInt32Digital, r/o */ +#define P_RtmLampAmpIFlagRString "RTMLAMP_OHWR_CH_0_STA_AMP_IFLAG_R" /* asynUInt32Digital, r/o */ +#define P_RtmLampAmpTFlagRString "RTMLAMP_OHWR_CH_0_STA_AMP_TFLAG_R" /* asynUInt32Digital, r/o */ #define P_RtmLampAmpEnString "RTMLAMP_OHWR_CH_0_CTL_AMP_EN" /* asynUInt32Digital, r/w */ #define P_RtmLampPIOLTriangEnString "RTMLAMP_OHWR_CH_0_CTL_PI_OL_TRIANG_ENABLE" /* asynUInt32Digital, r/w */ #define P_RtmLampPIOLSquareEnString "RTMLAMP_OHWR_CH_0_CTL_PI_OL_SQUARE_ENABLE" /* asynUInt32Digital, r/w */ @@ -180,61 +357,75 @@ struct functionsAny_t { #define P_RtmLampPISPString "RTMLAMP_OHWR_CH_0_PI_SP_DATA" /* asynUInt32Digital, r/w */ #define P_RtmLampPIOLDacCntMaxString "RTMLAMP_OHWR_PI_OL_DAC_CNT_MAX_DATA" /* asynUInt32Digital, r/w */ #define P_RtmLampPISPLimInfString "RTMLAMP_OHWR_PI_SP_LIM_INF_DATA" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlActPartString "FOFB_CC_CFG_VAL_ACT_PART" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlErrClrString "FOFB_CC_CFG_VAL_ERR_CLR" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlCcEnableString "FOFB_CC_CFG_VAL_CC_ENABLE" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlTfsOverrideString "FOFB_CC_CFG_VAL_TFS_OVERRIDE" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlBpmIdString "FOFB_CC_BPM_ID" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlTimeFrameLenString "FOFB_CC_TIME_FRAME_LEN" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlMgtPowerdownString "FOFB_CC_MGT_POWERDOWN" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlMgtLoopbackString "FOFB_CC_MGT_LOOPBACK" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlTimeFrameDlyString "FOFB_CC_TIME_FRAME_DLY" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlGoldenOrbXString "FOFB_CC_GOLDEN_ORB_X" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlGoldenOrbYString "FOFB_CC_GOLDEN_ORB_Y" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlCustFeatureString "FOFB_CC_CUST_FEATURE" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlRxPolarityString "FOFB_CC_RXPOLARITY" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlPayloadselString "FOFB_CC_PAYLOADSEL" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlFofbdataselString "FOFB_CC_FOFBDATASEL" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlFirmwareVerString "FOFB_CC_FIRMWARE_VER" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlSysStatusString "FOFB_CC_SYS_STATUS" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlLinkPartnerString "FOFB_CC_LINK_PARTNER_1" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlLinkUpString "FOFB_CC_LINK_UP" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlTimeFrameCountString "FOFB_CC_TIME_FRAME_COUNT" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlHardErrCntString "FOFB_CC_HARD_ERR_CNT_1" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlSoftErrCntString "FOFB_CC_SOFT_ERR_CNT_1" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlFrameErrCntString "FOFB_CC_FRAME_ERR_CNT_1" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlRxPckCntString "FOFB_CC_RX_PCK_CNT_1" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlTxPckCntString "FOFB_CC_TX_PCK_CNT_1" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlFodProcessTimeString "FOFB_CC_FOD_PROCESS_TIME" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlBpmCntString "FOFB_CC_BPM_COUNT" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlBpmIdRdbackString "FOFB_CC_BPM_ID_RDBACK" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlTfLengthRdbackString "FOFB_CC_TF_LENGTH_RDBACK" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlPowerdownRdbackString "FOFB_CC_POWERDOWN_RDBACK" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlLoopbackRdbackString "FOFB_CC_LOOPBACK_RDBACK" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlFaivalRdbackString "FOFB_CC_FAIVAL_RDBACK" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlToaRdEnString "FOFB_CC_TOA_CTL_RD_EN" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlToaRdStrString "FOFB_CC_TOA_CTL_RD_STR" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlToaDataString "FOFB_CC_TOA_DATA_VAL" /* asynUInt32Digital, r/o */ -#define P_FofbCtrlRcbRdEnString "FOFB_CC_RCB_CTL_RD_EN" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlRcbRdStrString "FOFB_CC_RCB_CTL_RD_STR" /* asynUInt32Digital, r/w */ -#define P_FofbCtrlRcbDataString "FOFB_CC_RCB_DATA_VAL" /* asynUInt32Digital, r/o */ - -class drvFOFB : public asynPortDriver { +#define P_AdcRateString "INFO_ADCRATE" /* asynUInt32Digital, r/o */ +#define P_TbtRateString "INFO_TBTRATE" /* asynUInt32Digital, r/o */ +#define P_FofbRateString "INFO_FOFBRATE" /* asynUInt32Digital, r/o */ +#define P_MonitRateString "INFO_MONITRATE" /* asynUInt32Digital, r/o */ +#define P_Monit1RateString "INFO_MONIT1RATE" /* asynUInt32Digital, r/o */ +#define P_MonitUpdtString "MONIT_UPDT" /* asynUInt32Digital, r/w */ +#define P_MonitPollTimeString "MONIT_POLL_TIME" /* asynUInt32Digital, r/w */ +#define P_MonitEnableString "MONIT_ENABLE" /* asynInt32, r/w */ +#define P_FOFBStatusString "ACQ_STATUS" /* asynInt32, r/o */ +#define P_SamplesPreString "ACQ_SAMPLES_PRE" /* asynUInt32Digital, r/w */ +#define P_SamplesPostString "ACQ_SAMPLES_POST" /* asynUInt32Digital, r/w */ +#define P_NumShotsString "ACQ_NUM_SHOTS" /* asynUInt32Digital, r/w */ +#define P_ChannelString "ACQ_CHANNEL" /* asynInt32, r/w */ +#define P_TriggerString "ACQ_TRIGGER" /* asynUInt32Digital, r/w */ +#define P_TriggerEventString "ACQ_TRIGGER_EVENT" /* asynUInt32Digital, r/w */ +#define P_TriggerRepString "ACQ_TRIGGER_REP" /* asynUInt32Digital, r/w */ +#define P_UpdateTimeString "ACQ_UPDATE_TIME" /* asynFloat64, r/w */ +#define P_TriggerDataThresString "ACQ_TRIGGER_THRES" /* asynInt32, r/w */ +#define P_TriggerDataPolString "ACQ_TRIGGER_POL" /* asynInt32, r/w */ +#define P_TriggerDataSelString "ACQ_TRIGGER_SEL" /* asynInt32, r/w */ +#define P_TriggerDataFiltString "ACQ_TRIGGER_FILT" /* asynInt32, r/w */ +#define P_TriggerHwDlyString "ACQ_TRIGGER_HWDLY" /* asynInt32, r/w */ +#define P_DataTrigChanString "ACQ_DATA_TRIG_CHAN" /* asynuint32digital, r/w */ +#define P_ChannelSampleSizeString "ACQ_CH_SAMPLE_SIZE" /* asynUInt32Digital, r/o */ +#define P_ChannelNumAtomsString "ACQ_CH_NUM_ATOMS" /* asynUInt32Digital, r/o */ +#define P_ChannelAtomWidthString "ACQ_CH_ATOM_WIDTH" /* asynUInt32Digital, r/o */ +#define P_TriggerChanString "TRIGGER_CHAN" /* asynUInt32Digital, r/w */ +#define P_TriggerDirString "TRIGGER_DIR" /* asynUInt32Digital, r/w */ +#define P_TriggerDirPolString "TRIGGER_DIR_POL" /* asynUInt32Digital, r/w */ +#define P_TriggerRcvCntRstString "TRIGGER_RCV_CNT_RST" /* asynUInt32Digital, r/w */ +#define P_TriggerTrnCntRstString "TRIGGER_TRN_CNT_RST" /* asynUInt32Digital, r/w */ +#define P_TriggerRcvLenString "TRIGGER_RCV_LEN" /* asynUInt32Digital, r/w */ +#define P_TriggerTrnLenString "TRIGGER_TRN_LEN" /* asynUInt32Digital, r/w */ +#define P_TriggerCntRcvString "TRIGGER_CNT_RCV" /* asynUInt32Digital, r/w */ +#define P_TriggerCntTrnString "TRIGGER_CNT_TRN" /* asynUInt32Digital, r/w */ +#define P_TriggerRcvSrcString "TRIGGER_RCV_SRC" /* asynUInt32Digital, r/w */ +#define P_TriggerTrnSrcString "TRIGGER_TRN_SRC" /* asynUInt32Digital, r/w */ +#define P_TriggerRcvInSelString "TRIGGER_RCV_IN_SEL" /* asynUInt32Digital, r/w */ +#define P_TriggerTrnOutSelString "TRIGGER_TRN_OUT_SEL" /* asynUInt32Digital, r/w */ + +typedef enum { + TRIG_ACQ_START, + TRIG_ACQ_STOP, + TRIG_ACQ_ABORT, +} trigEvent_e; + +class drvFOFB : public asynNDArrayDriver { public: - drvFOFB(const char *portName, const char *endpoint, - int FOFBNumber, int verbose, int timeout); + drvFOFB(const char *portName, const char *endpoint, int fofbNumber, + const char *type, int verbose, int timeout, + int maxPoints, int maxBuffers, size_t maxMemory); ~drvFOFB(); /* These are the methods that we override from asynPortDriver */ - virtual asynStatus writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, - epicsUInt32 mask); - virtual asynStatus readUInt32Digital(asynUser *pasynUser, epicsUInt32 *value, - epicsUInt32 mask); + virtual asynStatus writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, epicsUInt32 mask); + virtual asynStatus readUInt32Digital(asynUser *pasynUser, epicsUInt32 *value, epicsUInt32 mask); + virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); + virtual asynStatus readInt32(asynUser *pasynUser, epicsInt32 *value); + virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); + virtual asynStatus readFloat64(asynUser *pasynUser, epicsFloat64 *value); /* These methods are overwritten from asynPortDriver */ virtual asynStatus connect(asynUser* pasynUser); virtual asynStatus disconnect(asynUser* pasynUser); + /* These are the methods that are new to this class */ + void acqTask(int coreID, double pollTime, bool autoStart); + void acqMonitTask(); + /* Overloaded functions for extracting service name*/ const char *doGetServiceNameFromFunc (functionsInt32_t &func) const { @@ -251,6 +442,21 @@ class drvFOFB : public asynPortDriver { return func.serviceName; } + const char *doGetServiceNameFromFunc (functionsUInt32Acq_t &func) const + { + return func.serviceName; + } + + const char *doGetServiceNameFromFunc (functions2UInt32_t &func) const + { + return func.serviceName; + } + + const char *doGetServiceNameFromFunc (functionsFloat64_t &func) const + { + return func.serviceName; + } + /* Overloaded function mappings called by functionsAny_t */ asynStatus doExecuteHwWriteFunction(functionsInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const; @@ -260,6 +466,12 @@ class drvFOFB : public asynPortDriver { functionsArgs_t &functionParam); asynStatus doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char *service, int addr, functionsArgs_t &functionParam) const; + asynStatus doExecuteHwWriteFunction(functionsUInt32Acq_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; + asynStatus doExecuteHwWriteFunction(functions2UInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; + asynStatus doExecuteHwWriteFunction(functionsFloat64_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; asynStatus doExecuteHwReadFunction(functionsInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const; @@ -269,6 +481,12 @@ class drvFOFB : public asynPortDriver { functionsArgs_t &functionParam); asynStatus doExecuteHwReadFunction(functionsUInt32Chan_t &func, char *service, int addr, functionsArgs_t &functionParam) const; + asynStatus doExecuteHwReadFunction(functionsUInt32Acq_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; + asynStatus doExecuteHwReadFunction(functions2UInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; + asynStatus doExecuteHwReadFunction(functionsFloat64_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; /* General service name handling utilities */ asynStatus getServiceChan (int fofbNumber, int addr, const char *serviceName, @@ -280,12 +498,8 @@ class drvFOFB : public asynPortDriver { protected: /** Values used for pasynUser->reason, and indexes into the parameter library. */ - int P_FofbProcessingRamWrite; -#define FIRST_COMMAND P_FofbProcessingRamWrite - int P_FofbProcessingRamAddr; - int P_FofbProcessingRamDataIn; - int P_FofbProcessingRamDataOut; int P_RtmLampStatus; + #define FIRST_COMMAND P_RtmLampStatus int P_RtmLampDacDataFromWb; int P_RtmLampAmpIFlagL; int P_RtmLampAmpTFlagL; @@ -303,54 +517,67 @@ class drvFOFB : public asynPortDriver { int P_RtmLampPISP; int P_RtmLampPIOLDacCntMax; int P_RtmLampPISPLimInf; - int P_FofbCtrlActPart; - int P_FofbCtrlErrClr; - int P_FofbCtrlCcEnable; - int P_FofbCtrlTfsOverride; - int P_FofbCtrlBpmId; - int P_FofbCtrlTimeFrameLen; - int P_FofbCtrlMgtPowerdown; - int P_FofbCtrlMgtLoopback; - int P_FofbCtrlTimeFrameDly; - int P_FofbCtrlGoldenOrbX; - int P_FofbCtrlGoldenOrbY; - int P_FofbCtrlCustFeature; - int P_FofbCtrlRxPolarity; - int P_FofbCtrlPayloadsel; - int P_FofbCtrlFofbdatasel; - int P_FofbCtrlFirmwareVer; - int P_FofbCtrlSysStatus; - int P_FofbCtrlLinkPartner; - int P_FofbCtrlLinkUp; - int P_FofbCtrlTimeFrameCount; - int P_FofbCtrlHardErrCnt; - int P_FofbCtrlSoftErrCnt; - int P_FofbCtrlFrameErrCnt; - int P_FofbCtrlRxPckCnt; - int P_FofbCtrlTxPckCnt; - int P_FofbCtrlFodProcessTime; - int P_FofbCtrlBpmCnt; - int P_FofbCtrlBpmIdRdback; - int P_FofbCtrlTfLengthRdback; - int P_FofbCtrlPowerdownRdback; - int P_FofbCtrlLoopbackRdback; - int P_FofbCtrlFaivalRdback; - int P_FofbCtrlToaRdEn; - int P_FofbCtrlToaRdStr; - int P_FofbCtrlToaData; - int P_FofbCtrlRcbRdEn; - int P_FofbCtrlRcbRdStr; - int P_FofbCtrlRcbData; -#define LAST_COMMAND P_FofbCtrlRcbData + int P_FOFBStatus; + int P_AdcRate; + int P_TbtRate; + int P_FofbRate; + int P_MonitRate; + int P_Monit1Rate; + int P_MonitUpdt; + int P_MonitPollTime; + int P_MonitEnable; + int P_SamplesPre; + int P_SamplesPost; + int P_NumShots; + int P_Channel; + int P_UpdateTime; + int P_Trigger; + int P_TriggerEvent; + int P_TriggerRep; + int P_TriggerDataThres; + int P_TriggerDataPol; + int P_TriggerDataSel; + int P_TriggerDataFilt; + int P_TriggerHwDly; + int P_DataTrigChan; + int P_ChannelSampleSize; + int P_ChannelNumAtoms; + int P_ChannelAtomWidth; + int P_TriggerChan; + int P_TriggerDir; + int P_TriggerDirPol; + int P_TriggerRcvCntRst; + int P_TriggerTrnCntRst; + int P_TriggerRcvLen; + int P_TriggerTrnLen; + int P_TriggerCntRcv; + int P_TriggerCntTrn; + int P_TriggerRcvSrc; + int P_TriggerTrnSrc; + int P_TriggerRcvInSel; + int P_TriggerTrnOutSel; +#define LAST_COMMAND P_TriggerTrnOutSel private: /* Our data */ halcs_client_t *fofbClient; + halcs_client_t *fofbClientMonit; + acq_client_t *fofbClientAcqParam[NUM_ACQ_CORES_PER_FOFB]; + acq_client_t *fofbClientAcq[NUM_ACQ_CORES_PER_FOFB]; char *endpoint; int fofbNumber; + int fofbMaxPoints; int verbose; int timeout; char *fofbPortName; + int readingActive[NUM_ACQ_CORES_PER_FOFB]; + int repetitiveTrigger[NUM_ACQ_CORES_PER_FOFB]; + epicsEventId startAcqEventId[NUM_ACQ_CORES_PER_FOFB]; + epicsEventId stopAcqEventId[NUM_ACQ_CORES_PER_FOFB]; + epicsEventId abortAcqEventId[NUM_ACQ_CORES_PER_FOFB]; + epicsEventId reconfSPassAcqEventId[NUM_ACQ_CORES_PER_FOFB]; + epicsEventId activeAcqEventId[NUM_ACQ_CORES_PER_FOFB]; + epicsEventId activeMonitEnableEventId; std::unordered_map fofbHwFunc; /* Our private methods */ @@ -359,17 +586,48 @@ class drvFOFB : public asynPortDriver { asynStatus fofbClientConnect(asynUser* pasynUser); asynStatus fofbClientDisconnect(asynUser* pasynUser); + /* Acquisition functions */ + asynStatus setAcqEvent(epicsUInt32 mask, int addr); + asynStatus getAcqNDArrayType(int coreID, int channel, epicsUInt32 atomWidth, NDDataType_t *NDType); + asynStatus getChannelProperties(int coreID, int channel, channelProp_t *channelProp); + fofb_status_types getFOFBInitAcqStatus(int coreID); + asynStatus startAcq(int coreID, int hwChannel, epicsUInt32 num_samples_pre, + epicsUInt32 num_samples_post, epicsUInt32 num_shots); + asynStatus setAcqTrig(int coreID, acq_client_trig_e trig); + asynStatus initAcqPM(int coreID); + asynStatus abortAcqRaw(int coreID, acq_client_t *acq_client); + asynStatus abortAcq(int coreID); + asynStatus abortAcqFromPortThread(int coreID); + asynStatus abortAcqTask(int addr, bool abortAcqHw = false); + asynStatus stopAcqTask(int addr); + int checkAcqCompletion(int coreID); + asynStatus getAcqCurve(int coreID, NDArray *pArrayAllChannels, int hwChannel, + epicsUInt32 num_samples_pre, epicsUInt32 num_samples_post, + epicsUInt32 num_shots); + asynStatus deinterleaveNDArray (NDArray *pArrayAllChannels, const int *pNDArrayAddr, + int pNDArrayAddrSize, int arrayCounter, epicsTimeStamp *timeStamp); + /* General set/get hardware functions */ asynStatus setParamGeneric(int funcionId, int addr); asynStatus setParam32(int functionId, epicsUInt32 mask, int addr); asynStatus getParam32(int functionId, epicsUInt32 *param, epicsUInt32 mask, int addr); + asynStatus setParamInteger(int functionId, int addr); + asynStatus getParamInteger(int functionId, epicsInt32 *param, int addr); asynStatus setParamDouble(int functionId, int addr); asynStatus getParamDouble(int functionId, epicsFloat64 *param, int addr); /* Specific hardware functions that need extra processing and don't - * * * fit into the general set/get template */ - + * fit into the general set/get template */ + asynStatus setDataTrigChan(epicsUInt32 mask, int addr); + asynStatus getDataTrigChan(epicsUInt32 *channel, epicsUInt32 mask, int addr); + asynStatus updateUInt32Params(epicsUInt32 mask, int addr, int firstParam, + int lastParam, bool acceptErrors); + asynStatus updateIntegerParams(int addr, int firstParam, + int lastParam, bool acceptErrors); + asynStatus updateDoubleParams(int addr, int firstParam, int lastParam, + bool acceptErrors); + asynStatus readTriggerParams(epicsUInt32 mask, int addr); }; #define NUM_PARAMS (&LAST_COMMAND - &FIRST_COMMAND + 1) diff --git a/iocBoot/iocFOFB/FOFB.config b/iocBoot/iocFOFB/FOFB.config index c190fe6..4499d3e 100644 --- a/iocBoot/iocFOFB/FOFB.config +++ b/iocBoot/iocFOFB/FOFB.config @@ -4,6 +4,15 @@ epicsEnvSet("FOFB_VERBOSE","0") epicsEnvSet("FOFB_TIMEOUT","2000") +epicsEnvSet("WAVEFORM_MAX_POINTS", "100000") +epicsEnvSet("QSIZE", "20") +epicsEnvSet("NCHANS", "10") +epicsEnvSet("RING_SIZE", "10000") +epicsEnvSet("MAXBUFFERS", "0") +# 50MB limit for NDArrays +epicsEnvSet("MAXMEMORY", "50000000") +epicsEnvSet("COEFF_ARRAY_SIZE", "20") + # PV prefixes epicsEnvSet("P", "${EPICS_PV_AREA_PREFIX}") epicsEnvSet("R", "${EPICS_PV_DEVICE_PREFIX}") diff --git a/iocBoot/iocFOFB/FOFBCheckInitTries.sh b/iocBoot/iocFOFB/FOFBCheckInitTries.sh index cc207b7..45215f1 100755 --- a/iocBoot/iocFOFB/FOFBCheckInitTries.sh +++ b/iocBoot/iocFOFB/FOFBCheckInitTries.sh @@ -37,7 +37,7 @@ fi for i in `seq 1 ${TRIES}`; do - ../../bin/${EPICS_HOST_ARCH}/FOFBCheckInit -b ipc:///tmp/malamute -board ${BOARD_NUMBER} -halcs ${HALCS_NUMBER} + ../../bin/${EPICS_HOST_ARCH}/FOFBCheckInit -b ipc:///tmp/malamute -board ${BOARD_NUMBER} -halcs ${HALCS_NUMBER} -devio_name "DEVIO" if [ $? -eq 0 ]; then exit 0 fi diff --git a/iocBoot/iocFOFB/auto_settings.req b/iocBoot/iocFOFB/auto_settings.req index cfc2aeb..bbd6188 100644 --- a/iocBoot/iocFOFB/auto_settings.req +++ b/iocBoot/iocFOFB/auto_settings.req @@ -1 +1,67 @@ -file "FOFB_settings.req", P=$(P), R=$(R) +file "FOFB_settings.req", P=$(P), R=$(R) + +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH0 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH0 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH1 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH1 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH2 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH2 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH3 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH3 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH4 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH4 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH5 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH5 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH6 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH6 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH7 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH7 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH8 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH8 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH9 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH9 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH10 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH10 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH11 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH11 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH12 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH12 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH13 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH13 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH14 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH14 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_CH15 +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH15 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH0 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH0 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH1 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH1 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH2 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH2 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH3 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH3 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH4 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH4 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH5 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH5 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH6 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH6 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH7 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH7 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH8 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH8 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH9 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH9 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH10 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH10 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH11 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH11 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH12 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH12 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH13 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH13 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH14 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH14 +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH15 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH15 + diff --git a/iocBoot/iocFOFB/initCommonCommands b/iocBoot/iocFOFB/initCommonCommands new file mode 100644 index 0000000..3fa30b1 --- /dev/null +++ b/iocBoot/iocFOFB/initCommonCommands @@ -0,0 +1,112 @@ +# Waveform Plugin + +dbpf "${P}${R}GEN_CH0EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH0ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH1EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH1ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH2EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH2ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH3EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH3ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH4EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH4ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH5EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH5ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH6EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH6ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH7EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH7ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH8EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH8ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH9EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH9ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH10EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH10ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH11EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH11ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH12EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH12ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH13EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH13ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH14EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH14ArrayData.TSE" -2 + +dbpf "${P}${R}GEN_CH15EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH15ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH0EnableCallbacks" 1 +dbpf "${P}${R}PM_CH0ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH1EnableCallbacks" 1 +dbpf "${P}${R}PM_CH1ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH2EnableCallbacks" 1 +dbpf "${P}${R}PM_CH2ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH3EnableCallbacks" 1 +dbpf "${P}${R}PM_CH3ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH4EnableCallbacks" 1 +dbpf "${P}${R}PM_CH4ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH5EnableCallbacks" 1 +dbpf "${P}${R}PM_CH5ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH6EnableCallbacks" 1 +dbpf "${P}${R}PM_CH6ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH7EnableCallbacks" 1 +dbpf "${P}${R}PM_CH7ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH8EnableCallbacks" 1 +dbpf "${P}${R}PM_CH8ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH9EnableCallbacks" 1 +dbpf "${P}${R}PM_CH9ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH10EnableCallbacks" 1 +dbpf "${P}${R}PM_CH10ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH11EnableCallbacks" 1 +dbpf "${P}${R}PM_CH11ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH12EnableCallbacks" 1 +dbpf "${P}${R}PM_CH12ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH13EnableCallbacks" 1 +dbpf "${P}${R}PM_CH13ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH14EnableCallbacks" 1 +dbpf "${P}${R}PM_CH14ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH15EnableCallbacks" 1 +dbpf "${P}${R}PM_CH15ArrayData.TSE" -2 + +#dbpf "${P}${R}MONIT_CH0EnableCallbacks" 1 +#dbpf "${P}${R}MONIT_CH0ArrayData.TSE" -2 + +# STATS Plugin + +#dbpf "${P}${R}GEN_CH0_STATSEnableCallbacks" 1 + +#dbpf "${P}${R}GEN_CH0_STATSComputeHistogram" No +#dbpf "${P}${R}GEN_CH0_STATSComputeStatistics" Yes + +#dbpf "${P}${R}PM_CH0_STATSEnableCallbacks" 1 + +#dbpf "${P}${R}PM_CH0_STATSComputeHistogram" No +#dbpf "${P}${R}PM_CH0_STATSComputeStatistics" Yes diff --git a/iocBoot/iocFOFB/initFOFBCommands b/iocBoot/iocFOFB/initFOFBCommands index 139597f..be223c8 100644 --- a/iocBoot/iocFOFB/initFOFBCommands +++ b/iocBoot/iocFOFB/initFOFBCommands @@ -1,2 +1,5 @@ +# Load common commands +< initCommonCommands - +# Enable Monit Task +# dbpf "${P}${R}MonitEnable-Sel" Yes diff --git a/iocBoot/iocFOFB/save_restore.cmd b/iocBoot/iocFOFB/save_restore.cmd index a0472dd..687f3c7 100644 --- a/iocBoot/iocFOFB/save_restore.cmd +++ b/iocBoot/iocFOFB/save_restore.cmd @@ -37,5 +37,7 @@ set_requestfile_path("$(TOP)/iocBoot/$(IOC)", "") set_requestfile_path("$(TOP)/iocBoot/$(IOC)", "autosave") set_requestfile_path("$(TOP)", "FOFBApp/Db") set_requestfile_path("$(AUTOSAVE)", "asApp/Db") +set_requestfile_path("$(AREA_DETECTOR_COMPAT)", "ADApp/Db") +set_requestfile_path("$(AUTOSAVE)", "asApp/Db") dbLoadRecords("$(AUTOSAVE)/asApp/Db/save_restoreStatus.db", "P=${P}${R}") diff --git a/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index 1a7664d..f61f398 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -2,10 +2,15 @@ # Override default TOP variable epicsEnvSet("TOP","../..") +epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(ADCORE)/db") + +epicsEnvSet("FOFB_TYPE", "FOFB") # devIOCStats vars epicsEnvSet("ENGINEER","$(ENGINEER=Melissa Aguiar)") epicsEnvSet("LOCATION","$(LOCATION=GCA)") +epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(ADCORE)/db") +epicsEnvSet("STARTUP","$(TOP)") < FOFB.config @@ -13,13 +18,56 @@ epicsEnvSet("LOCATION","$(LOCATION=GCA)") dbLoadDatabase("${TOP}/dbd/FOFB.dbd") FOFB_registerRecordDeviceDriver (pdbbase) -drvFOFBConfigure("$(FOFB_NAME)", "$(FOFB_ENDPOINT)", "$(FOFB_NUMBER)", "$(FOFB_VERBOSE)", "$(FOFB_TIMEOUT)") +drvFOFBConfigure("$(FOFB_NAME)", "$(FOFB_ENDPOINT)", "$(FOFB_NUMBER)", "$(FOFB_TYPE)", "$(FOFB_VERBOSE)", "$(FOFB_TIMEOUT)", "$(WAVEFORM_MAX_POINTS)", "$(MAXBUFFERS)", "$(MAXMEMORY)") ## Load record instances -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, PORT=$(PORT), ADDR=0, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH0, PORT=$(PORT), ADDR=0, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH1, PORT=$(PORT), ADDR=1, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH2, PORT=$(PORT), ADDR=2, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH3, PORT=$(PORT), ADDR=3, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH4, PORT=$(PORT), ADDR=4, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH5, PORT=$(PORT), ADDR=5, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH6, PORT=$(PORT), ADDR=6, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH7, PORT=$(PORT), ADDR=7, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH8, PORT=$(PORT), ADDR=8, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH9, PORT=$(PORT), ADDR=9, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH10, PORT=$(PORT), ADDR=10, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH11, PORT=$(PORT), ADDR=11, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH12, PORT=$(PORT), ADDR=11, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH13, PORT=$(PORT), ADDR=11, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH14, PORT=$(PORT), ADDR=11, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH15, PORT=$(PORT), ADDR=11, TIMEOUT=1") + +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH0, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH1, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH2, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH3, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH4, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH5, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH6, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH7, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH8, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH9, FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH10,FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH11,FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH12,FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH13,FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH14,FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH15,FTVL=FLOAT,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + dbLoadRecords("$(ASYN)/db/asynRecord.db","P=${P}, R=${R}asyn,PORT=$(PORT),ADDR=0,OMAX=80,IMAX=80") +dbLoadRecords("${TOP}/db/FOFBAcq.template", "P=${P}, R=${R}, ACQ_NAME=ACQ, PORT=$(PORT), ADDR=0, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBAcq.template", "P=${P}, R=${R}, ACQ_NAME=ACQ_PM, PORT=$(PORT), ADDR=1, TIMEOUT=1") + +# devIOCStats records +dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db","IOC=${P}${R}Stats") +dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminScanMon.db","IOC=${P}${R}Stats") < save_restore.cmd +< triggerFOFB.cmd +< waveformPlugins.cmd +< waveformFilePlugins.cmd +< statsPlugins.cmd # Turn on asynTraceFlow and asynTraceError for global trace, i.e. no connected asynUser. asynSetTraceIOMask("$(FOFB_NAME)",0,0x2) @@ -35,6 +83,8 @@ var dbThreadRealtimeLock 0 iocInit() +< initFOFBCommands + # save things every thirty seconds create_monitor_set("auto_settings.req", 30,"P=${P}, R=${R}") set_savefile_name("auto_settings.req", "auto_settings_${P}${R}.sav") diff --git a/iocBoot/iocFOFB/statsPlugins.cmd b/iocBoot/iocFOFB/statsPlugins.cmd new file mode 100644 index 0000000..8d3c8bf --- /dev/null +++ b/iocBoot/iocFOFB/statsPlugins.cmd @@ -0,0 +1,15 @@ +# Create statistics plugins + +##################### GEN Data Statistics ########################## + +#NDStatsConfigure("STATSGEN_CH0", $(QSIZE), 0, "$(PORT)", 0, 0, 0) +#dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_CH0_STATS, PORT=STATSGEN_CH0,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +#NDTimeSeriesConfigure("STATSGEN_CH0_TS", $(QSIZE), 0, "STATSGEN_CH0", 0, 27) +#dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_CH0_TS_STATS, PORT=STATSGEN_CH0_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_CH0,NDARRAY_ADDR=0,NCHANS=$(NCHANS),ENABLED=0") + +##################### PM Data Statistics ########################### + +#NDStatsConfigure("STATSPM_CH0", $(QSIZE), 0, "$(PORT)", 1, 0, 0) +#dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_CH0_STATS, PORT=STATSPM_CH0,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=12,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +#NDTimeSeriesConfigure("STATSPM_CH0_TS", $(QSIZE), 0, "STATSPM_CH0", 1, 27) +#dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_CH0_TS_STATS, PORT=STATSPM_CH0_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_CH0,NDARRAY_ADDR=12,NCHANS=$(NCHANS),ENABLED=0") diff --git a/iocBoot/iocFOFB/triggerFOFB.cmd b/iocBoot/iocFOFB/triggerFOFB.cmd new file mode 100644 index 0000000..e6d6947 --- /dev/null +++ b/iocBoot/iocFOFB/triggerFOFB.cmd @@ -0,0 +1,27 @@ +##################### Trigger Channels ########################## + +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=0, ADDR=0, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=1, ADDR=1, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=2, ADDR=2, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=3, ADDR=3, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=4, ADDR=4, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=5, ADDR=5, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=6, ADDR=6, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=7, ADDR=7, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=8, ADDR=8, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=9, ADDR=9, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=10, ADDR=10, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=11, ADDR=11, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=12, ADDR=12, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=13, ADDR=13, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=14, ADDR=14, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=15, ADDR=15, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=16, ADDR=16, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=17, ADDR=17, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=18, ADDR=18, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=19, ADDR=19, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=20, ADDR=20, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=21, ADDR=21, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=22, ADDR=22, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER, TRIGGER_CHAN=23, ADDR=23, TIMEOUT=1") + diff --git a/iocBoot/iocFOFB/waveformFilePlugins.cmd b/iocBoot/iocFOFB/waveformFilePlugins.cmd new file mode 100644 index 0000000..139597f --- /dev/null +++ b/iocBoot/iocFOFB/waveformFilePlugins.cmd @@ -0,0 +1,2 @@ + + diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd new file mode 100644 index 0000000..37985d5 --- /dev/null +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -0,0 +1,49 @@ +##################### GEN Data Waveforms ########################### + +NDStdArraysConfigure("GEN_CH0_Array", $(QSIZE), 0, "$(PORT)", 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH0,PORT=GEN_CH0_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH1_Array", $(QSIZE), 0, "$(PORT)", 1) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH1,PORT=GEN_CH1_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=1,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH2_Array", $(QSIZE), 0, "$(PORT)", 2) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH2,PORT=GEN_CH2_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=2,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH3_Array", $(QSIZE), 0, "$(PORT)", 3) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH3,PORT=GEN_CH3_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=3,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH4_Array", $(QSIZE), 0, "$(PORT)", 4) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH4,PORT=GEN_CH4_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH5_Array", $(QSIZE), 0, "$(PORT)", 5) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH5,PORT=GEN_CH5_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=5,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH6_Array", $(QSIZE), 0, "$(PORT)", 6) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH6,PORT=GEN_CH6_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=6,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH7_Array", $(QSIZE), 0, "$(PORT)", 7) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH7,PORT=GEN_CH7_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=7,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH8_Array", $(QSIZE), 0, "$(PORT)", 8) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH8,PORT=GEN_CH8_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=8,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH9_Array", $(QSIZE), 0, "$(PORT)", 9) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH9,PORT=GEN_CH9_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=9,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH10_Array", $(QSIZE), 0, "$(PORT)", 10) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH10,PORT=GEN_CH10_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH11_Array", $(QSIZE), 0, "$(PORT)", 11) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH11,PORT=GEN_CH11_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=11,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH12_Array", $(QSIZE), 0, "$(PORT)", 12) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH12,PORT=GEN_CH12_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=12,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH13_Array", $(QSIZE), 0, "$(PORT)", 13) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH13,PORT=GEN_CH13_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=13,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH14_Array", $(QSIZE), 0, "$(PORT)", 14) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH14,PORT=GEN_CH14_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=14,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_CH15_Array", $(QSIZE), 0, "$(PORT)", 15) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_CH15,PORT=GEN_CH15_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=15,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") diff --git a/scripts/Makefile b/scripts/Makefile index 32feb15..d8dae08 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -10,6 +10,7 @@ SED = sed # Prefixes IOC_NAME ?= INSTALL_PREFIX ?= +FOFB_USER ?= $(shell basename $(realpath ${TOP})) # OS information SERVICE_NAME = $(shell basename $(realpath ${TOP})) @@ -18,12 +19,15 @@ SCRIPTS_FULL_NAME := $(shell cd $(INIT_SYSTEM) && find . -type f \ \( -iname "*" ! -iname "*.service.in" \)) SCRIPTS_SERVICE_IN_FULL_NAME := $(shell cd $(INIT_SYSTEM) && find . -type f \ \( -iname "*.service.in" \)) + # Strip .in suffix SCRIPTS_SERVICE_FULL_NAME := $(SCRIPTS_SERVICE_IN_FULL_NAME:%.in=%) + # Strip off a leading ./ SCRIPTS=$(SCRIPTS_FULL_NAME:./%=%) SCRIPTS_SERVICE_IN=$(SCRIPTS_SERVICE_IN_FULL_NAME:./%=%) SCRIPTS_SERVICE=$(SCRIPTS_SERVICE_FULL_NAME:./%=%) + .PHONY: all clean mrproper install uninstall all: diff --git a/scripts/pydm_test/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui new file mode 100644 index 0000000..49bccd8 --- /dev/null +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -0,0 +1,5393 @@ + + + Dialog + + + + 0 + 0 + 1390 + 808 + + + + Dialog + + + + + 450 + 10 + 931 + 791 + + + + 0 + + + + Current | Voltage [Channels 0~3] + + + + + 700 + 50 + 249 + 161 + + + + + + + Amplifier Overcurrent + + + + + + + [CH0] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 78 + 154 + 6 + + + + + + + + + 0 + 0 + 0 + + + + + + + 78 + 154 + 6 + + + + + + + + + 190 + 190 + 190 + + + + + + + 0 + 0 + 0 + + + + + + + + + + + false + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH0-RB + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH0-RB + + + + + + + Amplifier Overtermp + + + + + + + [CH0] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH0-RB + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH0-RB + + + + + + + + + 700 + 230 + 249 + 161 + + + + + + + Amplifier Overcurrent + + + + + + + [CH1] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH1-RB + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH1-RB + + + + + + + Amplifier Overtermp + + + + + + + [CH1] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH1-RB + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH1-RB + + + + + + + + + 700 + 410 + 249 + 161 + + + + + + + Amplifier Overcurrent + + + + + + + [CH2] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH2-RB + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH2-RB + + + + + + + Amplifier Overtermp + + + + + + + [CH2] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH2-RB + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH2-RB + + + + + + + + + 700 + 590 + 249 + 161 + + + + + + + Amplifier Overcurrent + + + + + + + [CH3] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH3-RB + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH3-RB + + + + + + + Amplifier Overtermp + + + + + + + [CH3] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH3-RB + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH3-RB + + + + + + + + + 0 + 0 + 691 + 761 + + + + 1 + + + + Counts + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Current [CH 0] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Voltage [CH 0] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH8ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Voltage [CH 1] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH9ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Current [CH 1] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Current [CH 2] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 550 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Current [CH 3] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 550 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Voltage [CH 3] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH11ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Voltage [CH 2] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH10ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + Converted + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Current [CH 0] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH0", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Current [CH 1] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH1", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Current [CH 2] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH2", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 550 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Current [CH 3] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH3", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Voltage [CH 0] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH8", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Voltage [CH 1] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH9", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Voltage [CH 2] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH10", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 550 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Voltage [CH 3] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH11", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + + + Current | Voltage [Channels 4~7] + + + + + 700 + 50 + 249 + 161 + + + + + + + Amplifier Overcurrent + + + + + + + [CH4] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH4-RB + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH4-RB + + + + + + + Amplifier Overtermp + + + + + + + [CH4] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH4-RB + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH4-RB + + + + + + + + + 700 + 230 + 249 + 161 + + + + + + + Amplifier Overcurrent + + + + + + + [CH5] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH5-RB + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH5-RB + + + + + + + Amplifier Overtermp + + + + + + + [CH5] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH5-RB + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH5-RB + + + + + + + + + 700 + 410 + 249 + 161 + + + + + + + Amplifier Overcurrent + + + + + + + [CH6] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH6-RB + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH6-RB + + + + + + + Amplifier Overtermp + + + + + + + [CH6] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH6-RB + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH6-RB + + + + + + + + + 700 + 590 + 249 + 161 + + + + + + + Amplifier Overcurrent + + + + + + + [CH7] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH7-RB + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH7-RB + + + + + + + Amplifier Overtermp + + + + + + + [CH7] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH7-RB + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH7-RB + + + + + + + + + 0 + 0 + 691 + 761 + + + + 0 + + + + Counts + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Current [CH 4] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH4ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Current [CH 5] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Current [CH 6] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 550 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Current [CH 7] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Voltage [CH 4] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH12ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Voltage [CH 5] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH13ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Voltage [CH 6] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH14ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 550 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Voltage [CH 7] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + Converted + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Current [CH 4] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH4", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Current [CH 5] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH5", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Current [CH 6] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH6", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 10 + 550 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Current [CH 7] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH7", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Voltage [CH 4] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH12", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Voltage [CH 5] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH13", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Voltage [CH 6] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH14", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 350 + 550 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + Converted Voltage [CH 7] + + + + {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataCH15", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + + + + + 10 + 10 + 421 + 306 + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + + + + + + + ACQSamplesPost: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQShots-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + ACQTriggerEvent: + + + + + + + RtmLampDacDataFromWb: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-RB + + + + + + + ACQTrigger: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + RtmLampPISPLimInf: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQShots-RB + + + + + + + ACQTriggerRep: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + + + + + + + RtmLampPIOLDacCntMax: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-RB + + + + + + + ACQSamplesPre: + + + + + + + ACQShots: + + + + + + + ACQChannel: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-RB + + + + + + + + + 10 + 330 + 431 + 471 + + + + 0 + + + + CH0 + + + + + 0 + 0 + 421 + 430 + + + + + + + RtmLampDacWr: + + + + + + + RtmLampCurrentGain: + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-RB + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP + + + + + + + RtmLampCurrentOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-RB + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-RB + + + + + + + RtmLampPIEn: + + + + + + + RtmLampVoltageGain: + + + + + + + RtmLampPITI: + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-RB + + + + + + + RtmLampPISPSquareEn: + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-RB + + + + + + + RtmLampVoltageOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH8-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH8-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH8-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH8-SP + + + + + + + + + CH1 + + + + + 0 + 0 + 421 + 430 + + + + + + + RtmLampDacWr: + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-RB + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP + + + + + + + RtmLampCurrentGain: + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-RB + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-RB + + + + + + + RtmLampPIKP: + + + + + + + RtmLampPITI: + + + + + + + RtmLampPIOLSquareEn: + + + + + + + RtmLampPIEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-RB + + + + + + + RtmLampCurrentOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP + + + + + + + RtmLampVoltageGain: + + + + + + + RtmLampVoltageOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH9-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH9-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH9-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH9-SP + + + + + + + + + CH2 + + + + + 0 + 0 + 421 + 430 + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-RB + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-RB + + + + + + + RtmLampCurrentGain: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP + + + + + + + RtmLampDacData: + + + + + + + RtmLampPIEn: + + + + + + + RtmLampVoltageGain: + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-RB + + + + + + + RtmLampCurrentOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampVoltageOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH10-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH10-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH10-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH10-SP + + + + + + + + + CH3 + + + + + 0 + 0 + 421 + 430 + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP + + + + + + + RtmLampVoltageOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-RB + + + + + + + RtmLampCurrentGain: + + + + + + + RtmLampAmpEn: + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-RB + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-RB + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-RB + + + + + + + RtmLampPIKP: + + + + + + + RtmLampPITI: + + + + + + + RtmLampCurrentOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-RB + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP + + + + + + + RtmLampVoltageGain: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH11-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH11-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH11-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH11-SP + + + + + + + + + CH4 + + + + + 0 + 0 + 421 + 430 + + + + + + + RtmLampVoltageOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-RB + + + + + + + RtmLampPITI: + + + + + + + RtmLampCurrentOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP + + + + + + + RtmLampDacWr: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP + + + + + + + RtmLampCurrentGain: + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-SP + + + + + + + RtmLampAmpEn: + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-RB + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLSquareEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-RB + + + + + + + RtmLampVoltageGain: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH12-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH12-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH12-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH12-SP + + + + + + + + + CH5 + + + + + 0 + 0 + 421 + 430 + + + + + + + RtmLampPIOLSquareEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP + + + + + + + RtmLampDacWr: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-RB + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-RB + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP + + + + + + + RtmLampCurrentOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP + + + + + + + RtmLampPISP: + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-RB + + + + + + + RtmLampCurrentGain: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-RB + + + + + + + RtmLampVoltageGain: + + + + + + + RtmLampVoltageOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH13-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH13-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH13-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH13-SP + + + + + + + + + CH6 + + + + + 0 + 0 + 421 + 430 + + + + + + + RtmLampCurrentOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-RB + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-RB + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-RB + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-RB + + + + + + + RtmLampVoltageGain: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-RB + + + + + + + RtmLampDacWr: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP + + + + + + + RtmLampVoltageOffset: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-RB + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-RB + + + + + + + RtmLampCurrentGain: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH14-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH14-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH14-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH14-SP + + + + + + + + + CH7 + + + + + 0 + 0 + 421 + 430 + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-RB + + + + + + + RtmLampCurrentOffset: + + + + + + + RtmLampDacWr: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-SP + + + + + + + RtmLampAmpEn: + + + + + + + RtmLampPIKP: + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-RB + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-RB + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-RB + + + + + + + RtmLampCurrentGain: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-RB + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP + + + + + + + RtmLampVoltageGain: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-RB + + + + + + + RtmLampVoltageOffset: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH15-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH15-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH15-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH15-SP + + + + + + + + + + + 970 + 40 + 81 + 21 + + + + ACQStatus: + + + + + + 1050 + 40 + 101 + 21 + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQStatus-Sts + + + + + + 1230 + 40 + 121 + 21 + + + + RtmLampStatus: + + + + + + 1350 + 40 + 20 + 21 + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampStatus-RB + + + tabWidget + tabWidget_2 + gridLayoutWidget + label_3 + PyDMLabel_3 + label_9 + PyDMLabel_9 + + + + PyDMLabel + QLabel +
pydm.widgets.label
+
+ + PyDMWaveformPlot + QGraphicsView +
pydm.widgets.waveformplot
+
+ + PyDMEnumComboBox + QComboBox +
pydm.widgets.enum_combo_box
+
+ + PyDMLineEdit + QLineEdit +
pydm.widgets.line_edit
+
+
+ + +
diff --git a/scripts/pydm_test/run_test_minicrate.sh b/scripts/pydm_test/run_test_minicrate.sh new file mode 100755 index 0000000..6bd1666 --- /dev/null +++ b/scripts/pydm_test/run_test_minicrate.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +pydm --hide-nav-bar --hide-menu-bar --hide-status-bar rtm_test_minicrate.ui diff --git a/scripts/systemd/etc/sysconfig/fofb-epics-ioc b/scripts/systemd/etc/sysconfig/fofb-epics-ioc index f8d872b..d47a378 100644 --- a/scripts/systemd/etc/sysconfig/fofb-epics-ioc +++ b/scripts/systemd/etc/sysconfig/fofb-epics-ioc @@ -4,6 +4,6 @@ EPICS_HOST_ARCH=linux-x86_64 PROCSERV_PORT_PREFIX=170 # EPICS_PV_AREA_PREFIX="SI-XXYY:" # EPICS_PV_DEVICE_PREFIX="DI-FOFB:" -EPICS_PV_CRATE_PREFIX="CRATE_22" +EPICS_PV_CRATE_PREFIX="CRATE_99" EPICS_CA_MAX_ARRAY_BYTES=50000000 PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/epics/base/bin/linux-x86_64 diff --git a/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping b/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping new file mode 100644 index 0000000..b603ff4 --- /dev/null +++ b/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping @@ -0,0 +1,2277 @@ + +# --- CRATE 1 --- + +# Crate 1 - FOFB slot 1 - XX-01SL01:DI-FOFBCtrl +CRATE_1_FOFB_1_PV_AREA_PREFIX=XX-01SL01: +CRATE_1_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 2 - XX-01SL02:DI-FOFBCtrl +CRATE_1_FOFB_2_PV_AREA_PREFIX=XX-01SL02: +CRATE_1_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 3 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_3_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 4 - XX-01SL04:DI-FOFBCtrl +CRATE_1_FOFB_4_PV_AREA_PREFIX=XX-01SL04: +CRATE_1_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 5 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_5_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 6 - XX-01SL06:DI-FOFBCtrl +CRATE_1_FOFB_6_PV_AREA_PREFIX=XX-01SL06: +CRATE_1_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 7 - XX-01SL07:DI-FOFBCtrl +CRATE_1_FOFB_7_PV_AREA_PREFIX=XX-01SL07: +CRATE_1_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 8 - XX-01SL08:DI-FOFBCtrl +CRATE_1_FOFB_8_PV_AREA_PREFIX=XX-01SL08: +CRATE_1_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 9 - XX-01SL09:DI-FOFBCtrl +CRATE_1_FOFB_9_PV_AREA_PREFIX=XX-01SL09: +CRATE_1_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 10 - XX-01SL10:DI-FOFBCtrl +CRATE_1_FOFB_10_PV_AREA_PREFIX=XX-01SL10: +CRATE_1_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 11 - XX-01SL11:DI-FOFBCtrl +CRATE_1_FOFB_11_PV_AREA_PREFIX=XX-01SL11: +CRATE_1_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 12 - XX-01SL12:DI-FOFBCtrl +CRATE_1_FOFB_12_PV_AREA_PREFIX=XX-01SL12: +CRATE_1_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 13 - XX-01SL13:DI-FOFBCtrl +CRATE_1_FOFB_13_PV_AREA_PREFIX=XX-01SL13: +CRATE_1_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 14 - XX-01SL14:DI-FOFBCtrl +CRATE_1_FOFB_14_PV_AREA_PREFIX=XX-01SL14: +CRATE_1_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 15 - XX-01SL15:DI-FOFBCtrl +CRATE_1_FOFB_15_PV_AREA_PREFIX=XX-01SL15: +CRATE_1_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 16 - XX-01SL16:DI-FOFBCtrl +CRATE_1_FOFB_16_PV_AREA_PREFIX=XX-01SL16: +CRATE_1_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 17 - XX-01SL17:DI-FOFBCtrl +CRATE_1_FOFB_17_PV_AREA_PREFIX=XX-01SL17: +CRATE_1_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 18 - XX-01SL18:DI-FOFBCtrl +CRATE_1_FOFB_18_PV_AREA_PREFIX=XX-01SL18: +CRATE_1_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 19 - XX-01SL19:DI-FOFBCtrl +CRATE_1_FOFB_19_PV_AREA_PREFIX=XX-01SL19: +CRATE_1_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 20 - XX-01SL20:DI-FOFBCtrl +CRATE_1_FOFB_20_PV_AREA_PREFIX=XX-01SL20: +CRATE_1_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 21 - XX-01SL21:DI-FOFBCtrl +CRATE_1_FOFB_21_PV_AREA_PREFIX=XX-01SL21: +CRATE_1_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 22 - XX-01SL22:DI-FOFBCtrl +CRATE_1_FOFB_22_PV_AREA_PREFIX=XX-01SL22: +CRATE_1_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 23 - XX-01SL23:DI-FOFBCtrl +CRATE_1_FOFB_23_PV_AREA_PREFIX=XX-01SL23: +CRATE_1_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 1 - FOFB slot 24 - XX-01SL24:DI-FOFBCtrl +CRATE_1_FOFB_24_PV_AREA_PREFIX=XX-01SL24: +CRATE_1_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 2 --- + +# Crate 2 - FOFB slot 1 - XX-02SL01:DI-FOFBCtrl +CRATE_2_FOFB_1_PV_AREA_PREFIX=XX-02SL01: +CRATE_2_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 2 - XX-02SL02:DI-FOFBCtrl +CRATE_2_FOFB_2_PV_AREA_PREFIX=XX-02SL02: +CRATE_2_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 3 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_3_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 4 - XX-02SL04:DI-FOFBCtrl +CRATE_2_FOFB_4_PV_AREA_PREFIX=XX-02SL04: +CRATE_2_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 5 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_5_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 6 - XX-02SL06:DI-FOFBCtrl +CRATE_2_FOFB_6_PV_AREA_PREFIX=XX-02SL06: +CRATE_2_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 7 - XX-02SL07:DI-FOFBCtrl +CRATE_2_FOFB_7_PV_AREA_PREFIX=XX-02SL07: +CRATE_2_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 8 - XX-02SL08:DI-FOFBCtrl +CRATE_2_FOFB_8_PV_AREA_PREFIX=XX-02SL08: +CRATE_2_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 9 - XX-02SL09:DI-FOFBCtrl +CRATE_2_FOFB_9_PV_AREA_PREFIX=XX-02SL09: +CRATE_2_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 10 - XX-02SL10:DI-FOFBCtrl +CRATE_2_FOFB_10_PV_AREA_PREFIX=XX-02SL10: +CRATE_2_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 11 - XX-02SL11:DI-FOFBCtrl +CRATE_2_FOFB_11_PV_AREA_PREFIX=XX-02SL11: +CRATE_2_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 12 - XX-02SL12:DI-FOFBCtrl +CRATE_2_FOFB_12_PV_AREA_PREFIX=XX-02SL12: +CRATE_2_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 13 - XX-02SL13:DI-FOFBCtrl +CRATE_2_FOFB_13_PV_AREA_PREFIX=XX-02SL13: +CRATE_2_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 14 - XX-02SL14:DI-FOFBCtrl +CRATE_2_FOFB_14_PV_AREA_PREFIX=XX-02SL14: +CRATE_2_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 15 - XX-02SL15:DI-FOFBCtrl +CRATE_2_FOFB_15_PV_AREA_PREFIX=XX-02SL15: +CRATE_2_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 16 - XX-02SL16:DI-FOFBCtrl +CRATE_2_FOFB_16_PV_AREA_PREFIX=XX-02SL16: +CRATE_2_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 17 - XX-02SL17:DI-FOFBCtrl +CRATE_2_FOFB_17_PV_AREA_PREFIX=XX-02SL17: +CRATE_2_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 18 - XX-02SL18:DI-FOFBCtrl +CRATE_2_FOFB_18_PV_AREA_PREFIX=XX-02SL18: +CRATE_2_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 19 - XX-02SL19:DI-FOFBCtrl +CRATE_2_FOFB_19_PV_AREA_PREFIX=XX-02SL19: +CRATE_2_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 20 - XX-02SL20:DI-FOFBCtrl +CRATE_2_FOFB_20_PV_AREA_PREFIX=XX-02SL20: +CRATE_2_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 21 - XX-02SL21:DI-FOFBCtrl +CRATE_2_FOFB_21_PV_AREA_PREFIX=XX-02SL21: +CRATE_2_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 22 - XX-02SL22:DI-FOFBCtrl +CRATE_2_FOFB_22_PV_AREA_PREFIX=XX-02SL22: +CRATE_2_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 23 - XX-02SL23:DI-FOFBCtrl +CRATE_2_FOFB_23_PV_AREA_PREFIX=XX-02SL23: +CRATE_2_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 2 - FOFB slot 24 - XX-02SL24:DI-FOFBCtrl +CRATE_2_FOFB_24_PV_AREA_PREFIX=XX-02SL24: +CRATE_2_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 3 --- + +# Crate 3 - FOFB slot 1 - XX-03SL01:DI-FOFBCtrl +CRATE_3_FOFB_1_PV_AREA_PREFIX=XX-03SL01: +CRATE_3_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 2 - XX-03SL02:DI-FOFBCtrl +CRATE_3_FOFB_2_PV_AREA_PREFIX=XX-03SL02: +CRATE_3_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 3 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_3_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 4 - XX-03SL04:DI-FOFBCtrl +CRATE_3_FOFB_4_PV_AREA_PREFIX=XX-03SL04: +CRATE_3_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 5 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_5_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 6 - XX-03SL06:DI-FOFBCtrl +CRATE_3_FOFB_6_PV_AREA_PREFIX=XX-03SL06: +CRATE_3_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 7 - XX-03SL07:DI-FOFBCtrl +CRATE_3_FOFB_7_PV_AREA_PREFIX=XX-03SL07: +CRATE_3_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 8 - XX-03SL08:DI-FOFBCtrl +CRATE_3_FOFB_8_PV_AREA_PREFIX=XX-03SL08: +CRATE_3_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 9 - XX-03SL09:DI-FOFBCtrl +CRATE_3_FOFB_9_PV_AREA_PREFIX=XX-03SL09: +CRATE_3_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 10 - XX-03SL10:DI-FOFBCtrl +CRATE_3_FOFB_10_PV_AREA_PREFIX=XX-03SL10: +CRATE_3_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 11 - XX-03SL11:DI-FOFBCtrl +CRATE_3_FOFB_11_PV_AREA_PREFIX=XX-03SL11: +CRATE_3_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 12 - XX-03SL12:DI-FOFBCtrl +CRATE_3_FOFB_12_PV_AREA_PREFIX=XX-03SL12: +CRATE_3_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 13 - XX-03SL13:DI-FOFBCtrl +CRATE_3_FOFB_13_PV_AREA_PREFIX=XX-03SL13: +CRATE_3_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 14 - XX-03SL14:DI-FOFBCtrl +CRATE_3_FOFB_14_PV_AREA_PREFIX=XX-03SL14: +CRATE_3_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 15 - XX-03SL15:DI-FOFBCtrl +CRATE_3_FOFB_15_PV_AREA_PREFIX=XX-03SL15: +CRATE_3_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 16 - XX-03SL16:DI-FOFBCtrl +CRATE_3_FOFB_16_PV_AREA_PREFIX=XX-03SL16: +CRATE_3_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 17 - XX-03SL17:DI-FOFBCtrl +CRATE_3_FOFB_17_PV_AREA_PREFIX=XX-03SL17: +CRATE_3_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 18 - XX-03SL18:DI-FOFBCtrl +CRATE_3_FOFB_18_PV_AREA_PREFIX=XX-03SL18: +CRATE_3_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 19 - XX-03SL19:DI-FOFBCtrl +CRATE_3_FOFB_19_PV_AREA_PREFIX=XX-03SL19: +CRATE_3_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 20 - XX-03SL20:DI-FOFBCtrl +CRATE_3_FOFB_20_PV_AREA_PREFIX=XX-03SL20: +CRATE_3_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 21 - XX-03SL21:DI-FOFBCtrl +CRATE_3_FOFB_21_PV_AREA_PREFIX=XX-03SL21: +CRATE_3_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 22 - XX-03SL22:DI-FOFBCtrl +CRATE_3_FOFB_22_PV_AREA_PREFIX=XX-03SL22: +CRATE_3_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 23 - XX-03SL23:DI-FOFBCtrl +CRATE_3_FOFB_23_PV_AREA_PREFIX=XX-03SL23: +CRATE_3_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 3 - FOFB slot 24 - XX-03SL24:DI-FOFBCtrl +CRATE_3_FOFB_24_PV_AREA_PREFIX=XX-03SL24: +CRATE_3_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 4 --- + +# Crate 4 - FOFB slot 1 - XX-04SL01:DI-FOFBCtrl +CRATE_4_FOFB_1_PV_AREA_PREFIX=XX-04SL01: +CRATE_4_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 2 - XX-04SL02:DI-FOFBCtrl +CRATE_4_FOFB_2_PV_AREA_PREFIX=XX-04SL02: +CRATE_4_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 3 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_3_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 4 - XX-04SL04:DI-FOFBCtrl +CRATE_4_FOFB_4_PV_AREA_PREFIX=XX-04SL04: +CRATE_4_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 5 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_5_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 6 - XX-04SL06:DI-FOFBCtrl +CRATE_4_FOFB_6_PV_AREA_PREFIX=XX-04SL06: +CRATE_4_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 7 - XX-04SL07:DI-FOFBCtrl +CRATE_4_FOFB_7_PV_AREA_PREFIX=XX-04SL07: +CRATE_4_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 8 - XX-04SL08:DI-FOFBCtrl +CRATE_4_FOFB_8_PV_AREA_PREFIX=XX-04SL08: +CRATE_4_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 9 - XX-04SL09:DI-FOFBCtrl +CRATE_4_FOFB_9_PV_AREA_PREFIX=XX-04SL09: +CRATE_4_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 10 - XX-04SL10:DI-FOFBCtrl +CRATE_4_FOFB_10_PV_AREA_PREFIX=XX-04SL10: +CRATE_4_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 11 - XX-04SL11:DI-FOFBCtrl +CRATE_4_FOFB_11_PV_AREA_PREFIX=XX-04SL11: +CRATE_4_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 12 - XX-04SL12:DI-FOFBCtrl +CRATE_4_FOFB_12_PV_AREA_PREFIX=XX-04SL12: +CRATE_4_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 13 - XX-04SL13:DI-FOFBCtrl +CRATE_4_FOFB_13_PV_AREA_PREFIX=XX-04SL13: +CRATE_4_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 14 - XX-04SL14:DI-FOFBCtrl +CRATE_4_FOFB_14_PV_AREA_PREFIX=XX-04SL14: +CRATE_4_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 15 - XX-04SL15:DI-FOFBCtrl +CRATE_4_FOFB_15_PV_AREA_PREFIX=XX-04SL15: +CRATE_4_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 16 - XX-04SL16:DI-FOFBCtrl +CRATE_4_FOFB_16_PV_AREA_PREFIX=XX-04SL16: +CRATE_4_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 17 - XX-04SL17:DI-FOFBCtrl +CRATE_4_FOFB_17_PV_AREA_PREFIX=XX-04SL17: +CRATE_4_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 18 - XX-04SL18:DI-FOFBCtrl +CRATE_4_FOFB_18_PV_AREA_PREFIX=XX-04SL18: +CRATE_4_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 19 - XX-04SL19:DI-FOFBCtrl +CRATE_4_FOFB_19_PV_AREA_PREFIX=XX-04SL19: +CRATE_4_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 20 - XX-04SL20:DI-FOFBCtrl +CRATE_4_FOFB_20_PV_AREA_PREFIX=XX-04SL20: +CRATE_4_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 21 - XX-04SL21:DI-FOFBCtrl +CRATE_4_FOFB_21_PV_AREA_PREFIX=XX-04SL21: +CRATE_4_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 22 - XX-04SL22:DI-FOFBCtrl +CRATE_4_FOFB_22_PV_AREA_PREFIX=XX-04SL22: +CRATE_4_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 23 - XX-04SL23:DI-FOFBCtrl +CRATE_4_FOFB_23_PV_AREA_PREFIX=XX-04SL23: +CRATE_4_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 4 - FOFB slot 24 - XX-04SL24:DI-FOFBCtrl +CRATE_4_FOFB_24_PV_AREA_PREFIX=XX-04SL24: +CRATE_4_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 5 --- + +# Crate 5 - FOFB slot 1 - XX-05SL01:DI-FOFBCtrl +CRATE_5_FOFB_1_PV_AREA_PREFIX=XX-05SL01: +CRATE_5_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 2 - XX-05SL02:DI-FOFBCtrl +CRATE_5_FOFB_2_PV_AREA_PREFIX=XX-05SL02: +CRATE_5_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 3 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_3_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 4 - XX-05SL04:DI-FOFBCtrl +CRATE_5_FOFB_4_PV_AREA_PREFIX=XX-05SL04: +CRATE_5_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 5 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_5_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 6 - XX-05SL06:DI-FOFBCtrl +CRATE_5_FOFB_6_PV_AREA_PREFIX=XX-05SL06: +CRATE_5_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 7 - XX-05SL07:DI-FOFBCtrl +CRATE_5_FOFB_7_PV_AREA_PREFIX=XX-05SL07: +CRATE_5_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 8 - XX-05SL08:DI-FOFBCtrl +CRATE_5_FOFB_8_PV_AREA_PREFIX=XX-05SL08: +CRATE_5_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 9 - XX-05SL09:DI-FOFBCtrl +CRATE_5_FOFB_9_PV_AREA_PREFIX=XX-05SL09: +CRATE_5_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 10 - XX-05SL10:DI-FOFBCtrl +CRATE_5_FOFB_10_PV_AREA_PREFIX=XX-05SL10: +CRATE_5_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 11 - XX-05SL11:DI-FOFBCtrl +CRATE_5_FOFB_11_PV_AREA_PREFIX=XX-05SL11: +CRATE_5_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 12 - XX-05SL12:DI-FOFBCtrl +CRATE_5_FOFB_12_PV_AREA_PREFIX=XX-05SL12: +CRATE_5_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 13 - XX-05SL13:DI-FOFBCtrl +CRATE_5_FOFB_13_PV_AREA_PREFIX=XX-05SL13: +CRATE_5_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 14 - XX-05SL14:DI-FOFBCtrl +CRATE_5_FOFB_14_PV_AREA_PREFIX=XX-05SL14: +CRATE_5_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 15 - XX-05SL15:DI-FOFBCtrl +CRATE_5_FOFB_15_PV_AREA_PREFIX=XX-05SL15: +CRATE_5_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 16 - XX-05SL16:DI-FOFBCtrl +CRATE_5_FOFB_16_PV_AREA_PREFIX=XX-05SL16: +CRATE_5_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 17 - XX-05SL17:DI-FOFBCtrl +CRATE_5_FOFB_17_PV_AREA_PREFIX=XX-05SL17: +CRATE_5_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 18 - XX-05SL18:DI-FOFBCtrl +CRATE_5_FOFB_18_PV_AREA_PREFIX=XX-05SL18: +CRATE_5_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 19 - XX-05SL19:DI-FOFBCtrl +CRATE_5_FOFB_19_PV_AREA_PREFIX=XX-05SL19: +CRATE_5_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 20 - XX-05SL20:DI-FOFBCtrl +CRATE_5_FOFB_20_PV_AREA_PREFIX=XX-05SL20: +CRATE_5_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 21 - XX-05SL21:DI-FOFBCtrl +CRATE_5_FOFB_21_PV_AREA_PREFIX=XX-05SL21: +CRATE_5_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 22 - XX-05SL22:DI-FOFBCtrl +CRATE_5_FOFB_22_PV_AREA_PREFIX=XX-05SL22: +CRATE_5_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 23 - XX-05SL23:DI-FOFBCtrl +CRATE_5_FOFB_23_PV_AREA_PREFIX=XX-05SL23: +CRATE_5_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 5 - FOFB slot 24 - XX-05SL24:DI-FOFBCtrl +CRATE_5_FOFB_24_PV_AREA_PREFIX=XX-05SL24: +CRATE_5_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 6 --- + +# Crate 6 - FOFB slot 1 - XX-06SL01:DI-FOFBCtrl +CRATE_6_FOFB_1_PV_AREA_PREFIX=XX-06SL01: +CRATE_6_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 2 - XX-06SL02:DI-FOFBCtrl +CRATE_6_FOFB_2_PV_AREA_PREFIX=XX-06SL02: +CRATE_6_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 3 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_3_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 4 - XX-06SL04:DI-FOFBCtrl +CRATE_6_FOFB_4_PV_AREA_PREFIX=XX-06SL04: +CRATE_6_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 5 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_5_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 6 - XX-06SL06:DI-FOFBCtrl +CRATE_6_FOFB_6_PV_AREA_PREFIX=XX-06SL06: +CRATE_6_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 7 - XX-06SL07:DI-FOFBCtrl +CRATE_6_FOFB_7_PV_AREA_PREFIX=XX-06SL07: +CRATE_6_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 8 - XX-06SL08:DI-FOFBCtrl +CRATE_6_FOFB_8_PV_AREA_PREFIX=XX-06SL08: +CRATE_6_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 9 - XX-06SL09:DI-FOFBCtrl +CRATE_6_FOFB_9_PV_AREA_PREFIX=XX-06SL09: +CRATE_6_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 10 - XX-06SL10:DI-FOFBCtrl +CRATE_6_FOFB_10_PV_AREA_PREFIX=XX-06SL10: +CRATE_6_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 11 - XX-06SL11:DI-FOFBCtrl +CRATE_6_FOFB_11_PV_AREA_PREFIX=XX-06SL11: +CRATE_6_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 12 - XX-06SL12:DI-FOFBCtrl +CRATE_6_FOFB_12_PV_AREA_PREFIX=XX-06SL12: +CRATE_6_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 13 - XX-06SL13:DI-FOFBCtrl +CRATE_6_FOFB_13_PV_AREA_PREFIX=XX-06SL13: +CRATE_6_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 14 - XX-06SL14:DI-FOFBCtrl +CRATE_6_FOFB_14_PV_AREA_PREFIX=XX-06SL14: +CRATE_6_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 15 - XX-06SL15:DI-FOFBCtrl +CRATE_6_FOFB_15_PV_AREA_PREFIX=XX-06SL15: +CRATE_6_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 16 - XX-06SL16:DI-FOFBCtrl +CRATE_6_FOFB_16_PV_AREA_PREFIX=XX-06SL16: +CRATE_6_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 17 - XX-06SL17:DI-FOFBCtrl +CRATE_6_FOFB_17_PV_AREA_PREFIX=XX-06SL17: +CRATE_6_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 18 - XX-06SL18:DI-FOFBCtrl +CRATE_6_FOFB_18_PV_AREA_PREFIX=XX-06SL18: +CRATE_6_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 19 - XX-06SL19:DI-FOFBCtrl +CRATE_6_FOFB_19_PV_AREA_PREFIX=XX-06SL19: +CRATE_6_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 20 - XX-06SL20:DI-FOFBCtrl +CRATE_6_FOFB_20_PV_AREA_PREFIX=XX-06SL20: +CRATE_6_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 21 - XX-06SL21:DI-FOFBCtrl +CRATE_6_FOFB_21_PV_AREA_PREFIX=XX-06SL21: +CRATE_6_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 22 - XX-06SL22:DI-FOFBCtrl +CRATE_6_FOFB_22_PV_AREA_PREFIX=XX-06SL22: +CRATE_6_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 23 - XX-06SL23:DI-FOFBCtrl +CRATE_6_FOFB_23_PV_AREA_PREFIX=XX-06SL23: +CRATE_6_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 6 - FOFB slot 24 - XX-06SL24:DI-FOFBCtrl +CRATE_6_FOFB_24_PV_AREA_PREFIX=XX-06SL24: +CRATE_6_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 7 --- + +# Crate 7 - FOFB slot 1 - XX-07SL01:DI-FOFBCtrl +CRATE_7_FOFB_1_PV_AREA_PREFIX=XX-07SL01: +CRATE_7_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 2 - XX-07SL02:DI-FOFBCtrl +CRATE_7_FOFB_2_PV_AREA_PREFIX=XX-07SL02: +CRATE_7_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 3 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_3_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 4 - XX-07SL04:DI-FOFBCtrl +CRATE_7_FOFB_4_PV_AREA_PREFIX=XX-07SL04: +CRATE_7_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 5 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_5_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 6 - XX-07SL06:DI-FOFBCtrl +CRATE_7_FOFB_6_PV_AREA_PREFIX=XX-07SL06: +CRATE_7_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 7 - XX-07SL07:DI-FOFBCtrl +CRATE_7_FOFB_7_PV_AREA_PREFIX=XX-07SL07: +CRATE_7_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 8 - XX-07SL08:DI-FOFBCtrl +CRATE_7_FOFB_8_PV_AREA_PREFIX=XX-07SL08: +CRATE_7_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 9 - XX-07SL09:DI-FOFBCtrl +CRATE_7_FOFB_9_PV_AREA_PREFIX=XX-07SL09: +CRATE_7_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 10 - XX-07SL10:DI-FOFBCtrl +CRATE_7_FOFB_10_PV_AREA_PREFIX=XX-07SL10: +CRATE_7_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 11 - XX-07SL11:DI-FOFBCtrl +CRATE_7_FOFB_11_PV_AREA_PREFIX=XX-07SL11: +CRATE_7_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 12 - XX-07SL12:DI-FOFBCtrl +CRATE_7_FOFB_12_PV_AREA_PREFIX=XX-07SL12: +CRATE_7_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 13 - XX-07SL13:DI-FOFBCtrl +CRATE_7_FOFB_13_PV_AREA_PREFIX=XX-07SL13: +CRATE_7_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 14 - XX-07SL14:DI-FOFBCtrl +CRATE_7_FOFB_14_PV_AREA_PREFIX=XX-07SL14: +CRATE_7_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 15 - XX-07SL15:DI-FOFBCtrl +CRATE_7_FOFB_15_PV_AREA_PREFIX=XX-07SL15: +CRATE_7_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 16 - XX-07SL16:DI-FOFBCtrl +CRATE_7_FOFB_16_PV_AREA_PREFIX=XX-07SL16: +CRATE_7_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 17 - XX-07SL17:DI-FOFBCtrl +CRATE_7_FOFB_17_PV_AREA_PREFIX=XX-07SL17: +CRATE_7_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 18 - XX-07SL18:DI-FOFBCtrl +CRATE_7_FOFB_18_PV_AREA_PREFIX=XX-07SL18: +CRATE_7_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 19 - XX-07SL19:DI-FOFBCtrl +CRATE_7_FOFB_19_PV_AREA_PREFIX=XX-07SL19: +CRATE_7_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 20 - XX-07SL20:DI-FOFBCtrl +CRATE_7_FOFB_20_PV_AREA_PREFIX=XX-07SL20: +CRATE_7_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 21 - XX-07SL21:DI-FOFBCtrl +CRATE_7_FOFB_21_PV_AREA_PREFIX=XX-07SL21: +CRATE_7_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 22 - XX-07SL22:DI-FOFBCtrl +CRATE_7_FOFB_22_PV_AREA_PREFIX=XX-07SL22: +CRATE_7_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 23 - XX-07SL23:DI-FOFBCtrl +CRATE_7_FOFB_23_PV_AREA_PREFIX=XX-07SL23: +CRATE_7_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 7 - FOFB slot 24 - XX-07SL24:DI-FOFBCtrl +CRATE_7_FOFB_24_PV_AREA_PREFIX=XX-07SL24: +CRATE_7_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 8 --- + +# Crate 8 - FOFB slot 1 - XX-08SL01:DI-FOFBCtrl +CRATE_8_FOFB_1_PV_AREA_PREFIX=XX-08SL01: +CRATE_8_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 2 - XX-08SL02:DI-FOFBCtrl +CRATE_8_FOFB_2_PV_AREA_PREFIX=XX-08SL02: +CRATE_8_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 3 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_3_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 4 - XX-08SL04:DI-FOFBCtrl +CRATE_8_FOFB_4_PV_AREA_PREFIX=XX-08SL04: +CRATE_8_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 5 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_5_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 6 - XX-08SL06:DI-FOFBCtrl +CRATE_8_FOFB_6_PV_AREA_PREFIX=XX-08SL06: +CRATE_8_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 7 - XX-08SL07:DI-FOFBCtrl +CRATE_8_FOFB_7_PV_AREA_PREFIX=XX-08SL07: +CRATE_8_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 8 - XX-08SL08:DI-FOFBCtrl +CRATE_8_FOFB_8_PV_AREA_PREFIX=XX-08SL08: +CRATE_8_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 9 - XX-08SL09:DI-FOFBCtrl +CRATE_8_FOFB_9_PV_AREA_PREFIX=XX-08SL09: +CRATE_8_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 10 - XX-08SL10:DI-FOFBCtrl +CRATE_8_FOFB_10_PV_AREA_PREFIX=XX-08SL10: +CRATE_8_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 11 - XX-08SL11:DI-FOFBCtrl +CRATE_8_FOFB_11_PV_AREA_PREFIX=XX-08SL11: +CRATE_8_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 12 - XX-08SL12:DI-FOFBCtrl +CRATE_8_FOFB_12_PV_AREA_PREFIX=XX-08SL12: +CRATE_8_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 13 - XX-08SL13:DI-FOFBCtrl +CRATE_8_FOFB_13_PV_AREA_PREFIX=XX-08SL13: +CRATE_8_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 14 - XX-08SL14:DI-FOFBCtrl +CRATE_8_FOFB_14_PV_AREA_PREFIX=XX-08SL14: +CRATE_8_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 15 - XX-08SL15:DI-FOFBCtrl +CRATE_8_FOFB_15_PV_AREA_PREFIX=XX-08SL15: +CRATE_8_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 16 - XX-08SL16:DI-FOFBCtrl +CRATE_8_FOFB_16_PV_AREA_PREFIX=XX-08SL16: +CRATE_8_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 17 - XX-08SL17:DI-FOFBCtrl +CRATE_8_FOFB_17_PV_AREA_PREFIX=XX-08SL17: +CRATE_8_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 18 - XX-08SL18:DI-FOFBCtrl +CRATE_8_FOFB_18_PV_AREA_PREFIX=XX-08SL18: +CRATE_8_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 19 - XX-08SL19:DI-FOFBCtrl +CRATE_8_FOFB_19_PV_AREA_PREFIX=XX-08SL19: +CRATE_8_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 20 - XX-08SL20:DI-FOFBCtrl +CRATE_8_FOFB_20_PV_AREA_PREFIX=XX-08SL20: +CRATE_8_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 21 - XX-08SL21:DI-FOFBCtrl +CRATE_8_FOFB_21_PV_AREA_PREFIX=XX-08SL21: +CRATE_8_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 22 - XX-08SL22:DI-FOFBCtrl +CRATE_8_FOFB_22_PV_AREA_PREFIX=XX-08SL22: +CRATE_8_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 23 - XX-08SL23:DI-FOFBCtrl +CRATE_8_FOFB_23_PV_AREA_PREFIX=XX-08SL23: +CRATE_8_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 8 - FOFB slot 24 - XX-08SL24:DI-FOFBCtrl +CRATE_8_FOFB_24_PV_AREA_PREFIX=XX-08SL24: +CRATE_8_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 9 --- + +# Crate 9 - FOFB slot 1 - XX-09SL01:DI-FOFBCtrl +CRATE_9_FOFB_1_PV_AREA_PREFIX=XX-09SL01: +CRATE_9_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 2 - XX-09SL02:DI-FOFBCtrl +CRATE_9_FOFB_2_PV_AREA_PREFIX=XX-09SL02: +CRATE_9_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 3 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_3_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 4 - XX-09SL04:DI-FOFBCtrl +CRATE_9_FOFB_4_PV_AREA_PREFIX=XX-09SL04: +CRATE_9_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 5 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_5_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 6 - XX-09SL06:DI-FOFBCtrl +CRATE_9_FOFB_6_PV_AREA_PREFIX=XX-09SL06: +CRATE_9_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 7 - XX-09SL07:DI-FOFBCtrl +CRATE_9_FOFB_7_PV_AREA_PREFIX=XX-09SL07: +CRATE_9_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 8 - XX-09SL08:DI-FOFBCtrl +CRATE_9_FOFB_8_PV_AREA_PREFIX=XX-09SL08: +CRATE_9_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 9 - XX-09SL09:DI-FOFBCtrl +CRATE_9_FOFB_9_PV_AREA_PREFIX=XX-09SL09: +CRATE_9_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 10 - XX-09SL10:DI-FOFBCtrl +CRATE_9_FOFB_10_PV_AREA_PREFIX=XX-09SL10: +CRATE_9_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 11 - XX-09SL11:DI-FOFBCtrl +CRATE_9_FOFB_11_PV_AREA_PREFIX=XX-09SL11: +CRATE_9_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 12 - XX-09SL12:DI-FOFBCtrl +CRATE_9_FOFB_12_PV_AREA_PREFIX=XX-09SL12: +CRATE_9_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 13 - XX-09SL13:DI-FOFBCtrl +CRATE_9_FOFB_13_PV_AREA_PREFIX=XX-09SL13: +CRATE_9_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 14 - XX-09SL14:DI-FOFBCtrl +CRATE_9_FOFB_14_PV_AREA_PREFIX=XX-09SL14: +CRATE_9_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 15 - XX-09SL15:DI-FOFBCtrl +CRATE_9_FOFB_15_PV_AREA_PREFIX=XX-09SL15: +CRATE_9_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 16 - XX-09SL16:DI-FOFBCtrl +CRATE_9_FOFB_16_PV_AREA_PREFIX=XX-09SL16: +CRATE_9_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 17 - XX-09SL17:DI-FOFBCtrl +CRATE_9_FOFB_17_PV_AREA_PREFIX=XX-09SL17: +CRATE_9_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 18 - XX-09SL18:DI-FOFBCtrl +CRATE_9_FOFB_18_PV_AREA_PREFIX=XX-09SL18: +CRATE_9_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 19 - XX-09SL19:DI-FOFBCtrl +CRATE_9_FOFB_19_PV_AREA_PREFIX=XX-09SL19: +CRATE_9_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 20 - XX-09SL20:DI-FOFBCtrl +CRATE_9_FOFB_20_PV_AREA_PREFIX=XX-09SL20: +CRATE_9_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 21 - XX-09SL21:DI-FOFBCtrl +CRATE_9_FOFB_21_PV_AREA_PREFIX=XX-09SL21: +CRATE_9_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 22 - XX-09SL22:DI-FOFBCtrl +CRATE_9_FOFB_22_PV_AREA_PREFIX=XX-09SL22: +CRATE_9_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 23 - XX-09SL23:DI-FOFBCtrl +CRATE_9_FOFB_23_PV_AREA_PREFIX=XX-09SL23: +CRATE_9_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 9 - FOFB slot 24 - XX-09SL24:DI-FOFBCtrl +CRATE_9_FOFB_24_PV_AREA_PREFIX=XX-09SL24: +CRATE_9_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 10 --- + +# Crate 10 - FOFB slot 1 - XX-10SL01:DI-FOFBCtrl +CRATE_10_FOFB_1_PV_AREA_PREFIX=XX-10SL01: +CRATE_10_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 2 - XX-10SL02:DI-FOFBCtrl +CRATE_10_FOFB_2_PV_AREA_PREFIX=XX-10SL02: +CRATE_10_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 3 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_3_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 4 - XX-10SL04:DI-FOFBCtrl +CRATE_10_FOFB_4_PV_AREA_PREFIX=XX-10SL04: +CRATE_10_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 5 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_5_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 6 - XX-10SL06:DI-FOFBCtrl +CRATE_10_FOFB_6_PV_AREA_PREFIX=XX-10SL06: +CRATE_10_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 7 - XX-10SL07:DI-FOFBCtrl +CRATE_10_FOFB_7_PV_AREA_PREFIX=XX-10SL07: +CRATE_10_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 8 - XX-10SL08:DI-FOFBCtrl +CRATE_10_FOFB_8_PV_AREA_PREFIX=XX-10SL08: +CRATE_10_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 9 - XX-10SL09:DI-FOFBCtrl +CRATE_10_FOFB_9_PV_AREA_PREFIX=XX-10SL09: +CRATE_10_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 10 - XX-10SL10:DI-FOFBCtrl +CRATE_10_FOFB_10_PV_AREA_PREFIX=XX-10SL10: +CRATE_10_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 11 - XX-10SL11:DI-FOFBCtrl +CRATE_10_FOFB_11_PV_AREA_PREFIX=XX-10SL11: +CRATE_10_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 12 - XX-10SL12:DI-FOFBCtrl +CRATE_10_FOFB_12_PV_AREA_PREFIX=XX-10SL12: +CRATE_10_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 13 - XX-10SL13:DI-FOFBCtrl +CRATE_10_FOFB_13_PV_AREA_PREFIX=XX-10SL13: +CRATE_10_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 14 - XX-10SL14:DI-FOFBCtrl +CRATE_10_FOFB_14_PV_AREA_PREFIX=XX-10SL14: +CRATE_10_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 15 - XX-10SL15:DI-FOFBCtrl +CRATE_10_FOFB_15_PV_AREA_PREFIX=XX-10SL15: +CRATE_10_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 16 - XX-10SL16:DI-FOFBCtrl +CRATE_10_FOFB_16_PV_AREA_PREFIX=XX-10SL16: +CRATE_10_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 17 - XX-10SL17:DI-FOFBCtrl +CRATE_10_FOFB_17_PV_AREA_PREFIX=XX-10SL17: +CRATE_10_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 18 - XX-10SL18:DI-FOFBCtrl +CRATE_10_FOFB_18_PV_AREA_PREFIX=XX-10SL18: +CRATE_10_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 19 - XX-10SL19:DI-FOFBCtrl +CRATE_10_FOFB_19_PV_AREA_PREFIX=XX-10SL19: +CRATE_10_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 20 - XX-10SL20:DI-FOFBCtrl +CRATE_10_FOFB_20_PV_AREA_PREFIX=XX-10SL20: +CRATE_10_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 21 - XX-10SL21:DI-FOFBCtrl +CRATE_10_FOFB_21_PV_AREA_PREFIX=XX-10SL21: +CRATE_10_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 22 - XX-10SL22:DI-FOFBCtrl +CRATE_10_FOFB_22_PV_AREA_PREFIX=XX-10SL22: +CRATE_10_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 23 - XX-10SL23:DI-FOFBCtrl +CRATE_10_FOFB_23_PV_AREA_PREFIX=XX-10SL23: +CRATE_10_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 10 - FOFB slot 24 - XX-10SL24:DI-FOFBCtrl +CRATE_10_FOFB_24_PV_AREA_PREFIX=XX-10SL24: +CRATE_10_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 11 --- + +# Crate 11 - FOFB slot 1 - XX-11SL01:DI-FOFBCtrl +CRATE_11_FOFB_1_PV_AREA_PREFIX=XX-11SL01: +CRATE_11_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 2 - XX-11SL02:DI-FOFBCtrl +CRATE_11_FOFB_2_PV_AREA_PREFIX=XX-11SL02: +CRATE_11_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 3 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_3_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 4 - XX-11SL04:DI-FOFBCtrl +CRATE_11_FOFB_4_PV_AREA_PREFIX=XX-11SL04: +CRATE_11_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 5 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_5_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 6 - XX-11SL06:DI-FOFBCtrl +CRATE_11_FOFB_6_PV_AREA_PREFIX=XX-11SL06: +CRATE_11_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 7 - XX-11SL07:DI-FOFBCtrl +CRATE_11_FOFB_7_PV_AREA_PREFIX=XX-11SL07: +CRATE_11_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 8 - XX-11SL08:DI-FOFBCtrl +CRATE_11_FOFB_8_PV_AREA_PREFIX=XX-11SL08: +CRATE_11_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 9 - XX-11SL09:DI-FOFBCtrl +CRATE_11_FOFB_9_PV_AREA_PREFIX=XX-11SL09: +CRATE_11_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 10 - XX-11SL10:DI-FOFBCtrl +CRATE_11_FOFB_10_PV_AREA_PREFIX=XX-11SL10: +CRATE_11_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 11 - XX-11SL11:DI-FOFBCtrl +CRATE_11_FOFB_11_PV_AREA_PREFIX=XX-11SL11: +CRATE_11_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 12 - XX-11SL12:DI-FOFBCtrl +CRATE_11_FOFB_12_PV_AREA_PREFIX=XX-11SL12: +CRATE_11_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 13 - XX-11SL13:DI-FOFBCtrl +CRATE_11_FOFB_13_PV_AREA_PREFIX=XX-11SL13: +CRATE_11_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 14 - XX-11SL14:DI-FOFBCtrl +CRATE_11_FOFB_14_PV_AREA_PREFIX=XX-11SL14: +CRATE_11_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 15 - XX-11SL15:DI-FOFBCtrl +CRATE_11_FOFB_15_PV_AREA_PREFIX=XX-11SL15: +CRATE_11_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 16 - XX-11SL16:DI-FOFBCtrl +CRATE_11_FOFB_16_PV_AREA_PREFIX=XX-11SL16: +CRATE_11_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 17 - XX-11SL17:DI-FOFBCtrl +CRATE_11_FOFB_17_PV_AREA_PREFIX=XX-11SL17: +CRATE_11_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 18 - XX-11SL18:DI-FOFBCtrl +CRATE_11_FOFB_18_PV_AREA_PREFIX=XX-11SL18: +CRATE_11_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 19 - XX-11SL19:DI-FOFBCtrl +CRATE_11_FOFB_19_PV_AREA_PREFIX=XX-11SL19: +CRATE_11_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 20 - XX-11SL20:DI-FOFBCtrl +CRATE_11_FOFB_20_PV_AREA_PREFIX=XX-11SL20: +CRATE_11_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 21 - XX-11SL21:DI-FOFBCtrl +CRATE_11_FOFB_21_PV_AREA_PREFIX=XX-11SL21: +CRATE_11_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 22 - XX-11SL22:DI-FOFBCtrl +CRATE_11_FOFB_22_PV_AREA_PREFIX=XX-11SL22: +CRATE_11_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 23 - XX-11SL23:DI-FOFBCtrl +CRATE_11_FOFB_23_PV_AREA_PREFIX=XX-11SL23: +CRATE_11_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 11 - FOFB slot 24 - XX-11SL24:DI-FOFBCtrl +CRATE_11_FOFB_24_PV_AREA_PREFIX=XX-11SL24: +CRATE_11_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 12 --- + +# Crate 12 - FOFB slot 1 - XX-12SL01:DI-FOFBCtrl +CRATE_12_FOFB_1_PV_AREA_PREFIX=XX-12SL01: +CRATE_12_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 2 - XX-12SL02:DI-FOFBCtrl +CRATE_12_FOFB_2_PV_AREA_PREFIX=XX-12SL02: +CRATE_12_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 3 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_3_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 4 - XX-12SL04:DI-FOFBCtrl +CRATE_12_FOFB_4_PV_AREA_PREFIX=XX-12SL04: +CRATE_12_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 5 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_5_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 6 - XX-12SL06:DI-FOFBCtrl +CRATE_12_FOFB_6_PV_AREA_PREFIX=XX-12SL06: +CRATE_12_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 7 - XX-12SL07:DI-FOFBCtrl +CRATE_12_FOFB_7_PV_AREA_PREFIX=XX-12SL07: +CRATE_12_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 8 - XX-12SL08:DI-FOFBCtrl +CRATE_12_FOFB_8_PV_AREA_PREFIX=XX-12SL08: +CRATE_12_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 9 - XX-12SL09:DI-FOFBCtrl +CRATE_12_FOFB_9_PV_AREA_PREFIX=XX-12SL09: +CRATE_12_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 10 - XX-12SL10:DI-FOFBCtrl +CRATE_12_FOFB_10_PV_AREA_PREFIX=XX-12SL10: +CRATE_12_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 11 - XX-12SL11:DI-FOFBCtrl +CRATE_12_FOFB_11_PV_AREA_PREFIX=XX-12SL11: +CRATE_12_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 12 - XX-12SL12:DI-FOFBCtrl +CRATE_12_FOFB_12_PV_AREA_PREFIX=XX-12SL12: +CRATE_12_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 13 - XX-12SL13:DI-FOFBCtrl +CRATE_12_FOFB_13_PV_AREA_PREFIX=XX-12SL13: +CRATE_12_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 14 - XX-12SL14:DI-FOFBCtrl +CRATE_12_FOFB_14_PV_AREA_PREFIX=XX-12SL14: +CRATE_12_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 15 - XX-12SL15:DI-FOFBCtrl +CRATE_12_FOFB_15_PV_AREA_PREFIX=XX-12SL15: +CRATE_12_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 16 - XX-12SL16:DI-FOFBCtrl +CRATE_12_FOFB_16_PV_AREA_PREFIX=XX-12SL16: +CRATE_12_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 17 - XX-12SL17:DI-FOFBCtrl +CRATE_12_FOFB_17_PV_AREA_PREFIX=XX-12SL17: +CRATE_12_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 18 - XX-12SL18:DI-FOFBCtrl +CRATE_12_FOFB_18_PV_AREA_PREFIX=XX-12SL18: +CRATE_12_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 19 - XX-12SL19:DI-FOFBCtrl +CRATE_12_FOFB_19_PV_AREA_PREFIX=XX-12SL19: +CRATE_12_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 20 - XX-12SL20:DI-FOFBCtrl +CRATE_12_FOFB_20_PV_AREA_PREFIX=XX-12SL20: +CRATE_12_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 21 - XX-12SL21:DI-FOFBCtrl +CRATE_12_FOFB_21_PV_AREA_PREFIX=XX-12SL21: +CRATE_12_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 22 - XX-12SL22:DI-FOFBCtrl +CRATE_12_FOFB_22_PV_AREA_PREFIX=XX-12SL22: +CRATE_12_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 23 - XX-12SL23:DI-FOFBCtrl +CRATE_12_FOFB_23_PV_AREA_PREFIX=XX-12SL23: +CRATE_12_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 12 - FOFB slot 24 - XX-12SL24:DI-FOFBCtrl +CRATE_12_FOFB_24_PV_AREA_PREFIX=XX-12SL24: +CRATE_12_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 13 --- + +# Crate 13 - FOFB slot 1 - XX-13SL01:DI-FOFBCtrl +CRATE_13_FOFB_1_PV_AREA_PREFIX=XX-13SL01: +CRATE_13_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 2 - XX-13SL02:DI-FOFBCtrl +CRATE_13_FOFB_2_PV_AREA_PREFIX=XX-13SL02: +CRATE_13_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 3 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_3_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 4 - XX-13SL04:DI-FOFBCtrl +CRATE_13_FOFB_4_PV_AREA_PREFIX=XX-13SL04: +CRATE_13_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 5 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_5_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 6 - XX-13SL06:DI-FOFBCtrl +CRATE_13_FOFB_6_PV_AREA_PREFIX=XX-13SL06: +CRATE_13_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 7 - XX-13SL07:DI-FOFBCtrl +CRATE_13_FOFB_7_PV_AREA_PREFIX=XX-13SL07: +CRATE_13_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 8 - XX-13SL08:DI-FOFBCtrl +CRATE_13_FOFB_8_PV_AREA_PREFIX=XX-13SL08: +CRATE_13_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 9 - XX-13SL09:DI-FOFBCtrl +CRATE_13_FOFB_9_PV_AREA_PREFIX=XX-13SL09: +CRATE_13_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 10 - XX-13SL10:DI-FOFBCtrl +CRATE_13_FOFB_10_PV_AREA_PREFIX=XX-13SL10: +CRATE_13_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 11 - XX-13SL11:DI-FOFBCtrl +CRATE_13_FOFB_11_PV_AREA_PREFIX=XX-13SL11: +CRATE_13_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 12 - XX-13SL12:DI-FOFBCtrl +CRATE_13_FOFB_12_PV_AREA_PREFIX=XX-13SL12: +CRATE_13_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 13 - XX-13SL13:DI-FOFBCtrl +CRATE_13_FOFB_13_PV_AREA_PREFIX=XX-13SL13: +CRATE_13_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 14 - XX-13SL14:DI-FOFBCtrl +CRATE_13_FOFB_14_PV_AREA_PREFIX=XX-13SL14: +CRATE_13_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 15 - XX-13SL15:DI-FOFBCtrl +CRATE_13_FOFB_15_PV_AREA_PREFIX=XX-13SL15: +CRATE_13_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 16 - XX-13SL16:DI-FOFBCtrl +CRATE_13_FOFB_16_PV_AREA_PREFIX=XX-13SL16: +CRATE_13_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 17 - XX-13SL17:DI-FOFBCtrl +CRATE_13_FOFB_17_PV_AREA_PREFIX=XX-13SL17: +CRATE_13_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 18 - XX-13SL18:DI-FOFBCtrl +CRATE_13_FOFB_18_PV_AREA_PREFIX=XX-13SL18: +CRATE_13_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 19 - XX-13SL19:DI-FOFBCtrl +CRATE_13_FOFB_19_PV_AREA_PREFIX=XX-13SL19: +CRATE_13_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 20 - XX-13SL20:DI-FOFBCtrl +CRATE_13_FOFB_20_PV_AREA_PREFIX=XX-13SL20: +CRATE_13_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 21 - XX-13SL21:DI-FOFBCtrl +CRATE_13_FOFB_21_PV_AREA_PREFIX=XX-13SL21: +CRATE_13_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 22 - XX-13SL22:DI-FOFBCtrl +CRATE_13_FOFB_22_PV_AREA_PREFIX=XX-13SL22: +CRATE_13_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 23 - XX-13SL23:DI-FOFBCtrl +CRATE_13_FOFB_23_PV_AREA_PREFIX=XX-13SL23: +CRATE_13_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 13 - FOFB slot 24 - XX-13SL24:DI-FOFBCtrl +CRATE_13_FOFB_24_PV_AREA_PREFIX=XX-13SL24: +CRATE_13_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 14 --- + +# Crate 14 - FOFB slot 1 - XX-14SL01:DI-FOFBCtrl +CRATE_14_FOFB_1_PV_AREA_PREFIX=XX-14SL01: +CRATE_14_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 2 - XX-14SL02:DI-FOFBCtrl +CRATE_14_FOFB_2_PV_AREA_PREFIX=XX-14SL02: +CRATE_14_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 3 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_3_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 4 - XX-14SL04:DI-FOFBCtrl +CRATE_14_FOFB_4_PV_AREA_PREFIX=XX-14SL04: +CRATE_14_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 5 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_5_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 6 - XX-14SL06:DI-FOFBCtrl +CRATE_14_FOFB_6_PV_AREA_PREFIX=XX-14SL06: +CRATE_14_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 7 - XX-14SL07:DI-FOFBCtrl +CRATE_14_FOFB_7_PV_AREA_PREFIX=XX-14SL07: +CRATE_14_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 8 - XX-14SL08:DI-FOFBCtrl +CRATE_14_FOFB_8_PV_AREA_PREFIX=XX-14SL08: +CRATE_14_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 9 - XX-14SL09:DI-FOFBCtrl +CRATE_14_FOFB_9_PV_AREA_PREFIX=XX-14SL09: +CRATE_14_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 10 - XX-14SL10:DI-FOFBCtrl +CRATE_14_FOFB_10_PV_AREA_PREFIX=XX-14SL10: +CRATE_14_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 11 - XX-14SL11:DI-FOFBCtrl +CRATE_14_FOFB_11_PV_AREA_PREFIX=XX-14SL11: +CRATE_14_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 12 - XX-14SL12:DI-FOFBCtrl +CRATE_14_FOFB_12_PV_AREA_PREFIX=XX-14SL12: +CRATE_14_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 13 - XX-14SL13:DI-FOFBCtrl +CRATE_14_FOFB_13_PV_AREA_PREFIX=XX-14SL13: +CRATE_14_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 14 - XX-14SL14:DI-FOFBCtrl +CRATE_14_FOFB_14_PV_AREA_PREFIX=XX-14SL14: +CRATE_14_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 15 - XX-14SL15:DI-FOFBCtrl +CRATE_14_FOFB_15_PV_AREA_PREFIX=XX-14SL15: +CRATE_14_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 16 - XX-14SL16:DI-FOFBCtrl +CRATE_14_FOFB_16_PV_AREA_PREFIX=XX-14SL16: +CRATE_14_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 17 - XX-14SL17:DI-FOFBCtrl +CRATE_14_FOFB_17_PV_AREA_PREFIX=XX-14SL17: +CRATE_14_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 18 - XX-14SL18:DI-FOFBCtrl +CRATE_14_FOFB_18_PV_AREA_PREFIX=XX-14SL18: +CRATE_14_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 19 - XX-14SL19:DI-FOFBCtrl +CRATE_14_FOFB_19_PV_AREA_PREFIX=XX-14SL19: +CRATE_14_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 20 - XX-14SL20:DI-FOFBCtrl +CRATE_14_FOFB_20_PV_AREA_PREFIX=XX-14SL20: +CRATE_14_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 21 - XX-14SL21:DI-FOFBCtrl +CRATE_14_FOFB_21_PV_AREA_PREFIX=XX-14SL21: +CRATE_14_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 22 - XX-14SL22:DI-FOFBCtrl +CRATE_14_FOFB_22_PV_AREA_PREFIX=XX-14SL22: +CRATE_14_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 23 - XX-14SL23:DI-FOFBCtrl +CRATE_14_FOFB_23_PV_AREA_PREFIX=XX-14SL23: +CRATE_14_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 14 - FOFB slot 24 - XX-14SL24:DI-FOFBCtrl +CRATE_14_FOFB_24_PV_AREA_PREFIX=XX-14SL24: +CRATE_14_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 15 --- + +# Crate 15 - FOFB slot 1 - XX-15SL01:DI-FOFBCtrl +CRATE_15_FOFB_1_PV_AREA_PREFIX=XX-15SL01: +CRATE_15_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 2 - XX-15SL02:DI-FOFBCtrl +CRATE_15_FOFB_2_PV_AREA_PREFIX=XX-15SL02: +CRATE_15_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 3 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_3_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 4 - XX-15SL04:DI-FOFBCtrl +CRATE_15_FOFB_4_PV_AREA_PREFIX=XX-15SL04: +CRATE_15_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 5 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_5_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 6 - XX-15SL06:DI-FOFBCtrl +CRATE_15_FOFB_6_PV_AREA_PREFIX=XX-15SL06: +CRATE_15_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 7 - XX-15SL07:DI-FOFBCtrl +CRATE_15_FOFB_7_PV_AREA_PREFIX=XX-15SL07: +CRATE_15_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 8 - XX-15SL08:DI-FOFBCtrl +CRATE_15_FOFB_8_PV_AREA_PREFIX=XX-15SL08: +CRATE_15_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 9 - XX-15SL09:DI-FOFBCtrl +CRATE_15_FOFB_9_PV_AREA_PREFIX=XX-15SL09: +CRATE_15_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 10 - XX-15SL10:DI-FOFBCtrl +CRATE_15_FOFB_10_PV_AREA_PREFIX=XX-15SL10: +CRATE_15_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 11 - XX-15SL11:DI-FOFBCtrl +CRATE_15_FOFB_11_PV_AREA_PREFIX=XX-15SL11: +CRATE_15_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 12 - XX-15SL12:DI-FOFBCtrl +CRATE_15_FOFB_12_PV_AREA_PREFIX=XX-15SL12: +CRATE_15_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 13 - XX-15SL13:DI-FOFBCtrl +CRATE_15_FOFB_13_PV_AREA_PREFIX=XX-15SL13: +CRATE_15_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 14 - XX-15SL14:DI-FOFBCtrl +CRATE_15_FOFB_14_PV_AREA_PREFIX=XX-15SL14: +CRATE_15_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 15 - XX-15SL15:DI-FOFBCtrl +CRATE_15_FOFB_15_PV_AREA_PREFIX=XX-15SL15: +CRATE_15_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 16 - XX-15SL16:DI-FOFBCtrl +CRATE_15_FOFB_16_PV_AREA_PREFIX=XX-15SL16: +CRATE_15_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 17 - XX-15SL17:DI-FOFBCtrl +CRATE_15_FOFB_17_PV_AREA_PREFIX=XX-15SL17: +CRATE_15_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 18 - XX-15SL18:DI-FOFBCtrl +CRATE_15_FOFB_18_PV_AREA_PREFIX=XX-15SL18: +CRATE_15_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 19 - XX-15SL19:DI-FOFBCtrl +CRATE_15_FOFB_19_PV_AREA_PREFIX=XX-15SL19: +CRATE_15_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 20 - XX-15SL20:DI-FOFBCtrl +CRATE_15_FOFB_20_PV_AREA_PREFIX=XX-15SL20: +CRATE_15_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 21 - XX-15SL21:DI-FOFBCtrl +CRATE_15_FOFB_21_PV_AREA_PREFIX=XX-15SL21: +CRATE_15_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 22 - XX-15SL22:DI-FOFBCtrl +CRATE_15_FOFB_22_PV_AREA_PREFIX=XX-15SL22: +CRATE_15_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 23 - XX-15SL23:DI-FOFBCtrl +CRATE_15_FOFB_23_PV_AREA_PREFIX=XX-15SL23: +CRATE_15_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 15 - FOFB slot 24 - XX-15SL24:DI-FOFBCtrl +CRATE_15_FOFB_24_PV_AREA_PREFIX=XX-15SL24: +CRATE_15_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 16 --- + +# Crate 16 - FOFB slot 1 - XX-16SL01:DI-FOFBCtrl +CRATE_16_FOFB_1_PV_AREA_PREFIX=XX-16SL01: +CRATE_16_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 2 - XX-16SL02:DI-FOFBCtrl +CRATE_16_FOFB_2_PV_AREA_PREFIX=XX-16SL02: +CRATE_16_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 3 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_3_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 4 - XX-16SL04:DI-FOFBCtrl +CRATE_16_FOFB_4_PV_AREA_PREFIX=XX-16SL04: +CRATE_16_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 5 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_5_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 6 - XX-16SL06:DI-FOFBCtrl +CRATE_16_FOFB_6_PV_AREA_PREFIX=XX-16SL06: +CRATE_16_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 7 - XX-16SL07:DI-FOFBCtrl +CRATE_16_FOFB_7_PV_AREA_PREFIX=XX-16SL07: +CRATE_16_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 8 - XX-16SL08:DI-FOFBCtrl +CRATE_16_FOFB_8_PV_AREA_PREFIX=XX-16SL08: +CRATE_16_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 9 - XX-16SL09:DI-FOFBCtrl +CRATE_16_FOFB_9_PV_AREA_PREFIX=XX-16SL09: +CRATE_16_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 10 - XX-16SL10:DI-FOFBCtrl +CRATE_16_FOFB_10_PV_AREA_PREFIX=XX-16SL10: +CRATE_16_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 11 - XX-16SL11:DI-FOFBCtrl +CRATE_16_FOFB_11_PV_AREA_PREFIX=XX-16SL11: +CRATE_16_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 12 - XX-16SL12:DI-FOFBCtrl +CRATE_16_FOFB_12_PV_AREA_PREFIX=XX-16SL12: +CRATE_16_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 13 - XX-16SL13:DI-FOFBCtrl +CRATE_16_FOFB_13_PV_AREA_PREFIX=XX-16SL13: +CRATE_16_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 14 - XX-16SL14:DI-FOFBCtrl +CRATE_16_FOFB_14_PV_AREA_PREFIX=XX-16SL14: +CRATE_16_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 15 - XX-16SL15:DI-FOFBCtrl +CRATE_16_FOFB_15_PV_AREA_PREFIX=XX-16SL15: +CRATE_16_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 16 - XX-16SL16:DI-FOFBCtrl +CRATE_16_FOFB_16_PV_AREA_PREFIX=XX-16SL16: +CRATE_16_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 17 - XX-16SL17:DI-FOFBCtrl +CRATE_16_FOFB_17_PV_AREA_PREFIX=XX-16SL17: +CRATE_16_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 18 - XX-16SL18:DI-FOFBCtrl +CRATE_16_FOFB_18_PV_AREA_PREFIX=XX-16SL18: +CRATE_16_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 19 - XX-16SL19:DI-FOFBCtrl +CRATE_16_FOFB_19_PV_AREA_PREFIX=XX-16SL19: +CRATE_16_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 20 - XX-16SL20:DI-FOFBCtrl +CRATE_16_FOFB_20_PV_AREA_PREFIX=XX-16SL20: +CRATE_16_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 21 - XX-16SL21:DI-FOFBCtrl +CRATE_16_FOFB_21_PV_AREA_PREFIX=XX-16SL21: +CRATE_16_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 22 - XX-16SL22:DI-FOFBCtrl +CRATE_16_FOFB_22_PV_AREA_PREFIX=XX-16SL22: +CRATE_16_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 23 - XX-16SL23:DI-FOFBCtrl +CRATE_16_FOFB_23_PV_AREA_PREFIX=XX-16SL23: +CRATE_16_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 16 - FOFB slot 24 - XX-16SL24:DI-FOFBCtrl +CRATE_16_FOFB_24_PV_AREA_PREFIX=XX-16SL24: +CRATE_16_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 17 --- + +# Crate 17 - FOFB slot 1 - XX-17SL01:DI-FOFBCtrl +CRATE_17_FOFB_1_PV_AREA_PREFIX=XX-17SL01: +CRATE_17_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 2 - XX-17SL02:DI-FOFBCtrl +CRATE_17_FOFB_2_PV_AREA_PREFIX=XX-17SL02: +CRATE_17_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 3 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_3_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 4 - XX-17SL04:DI-FOFBCtrl +CRATE_17_FOFB_4_PV_AREA_PREFIX=XX-17SL04: +CRATE_17_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 5 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_5_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 6 - XX-17SL06:DI-FOFBCtrl +CRATE_17_FOFB_6_PV_AREA_PREFIX=XX-17SL06: +CRATE_17_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 7 - XX-17SL07:DI-FOFBCtrl +CRATE_17_FOFB_7_PV_AREA_PREFIX=XX-17SL07: +CRATE_17_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 8 - XX-17SL08:DI-FOFBCtrl +CRATE_17_FOFB_8_PV_AREA_PREFIX=XX-17SL08: +CRATE_17_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 9 - XX-17SL09:DI-FOFBCtrl +CRATE_17_FOFB_9_PV_AREA_PREFIX=XX-17SL09: +CRATE_17_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 10 - XX-17SL10:DI-FOFBCtrl +CRATE_17_FOFB_10_PV_AREA_PREFIX=XX-17SL10: +CRATE_17_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 11 - XX-17SL11:DI-FOFBCtrl +CRATE_17_FOFB_11_PV_AREA_PREFIX=XX-17SL11: +CRATE_17_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 12 - XX-17SL12:DI-FOFBCtrl +CRATE_17_FOFB_12_PV_AREA_PREFIX=XX-17SL12: +CRATE_17_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 13 - XX-17SL13:DI-FOFBCtrl +CRATE_17_FOFB_13_PV_AREA_PREFIX=XX-17SL13: +CRATE_17_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 14 - XX-17SL14:DI-FOFBCtrl +CRATE_17_FOFB_14_PV_AREA_PREFIX=XX-17SL14: +CRATE_17_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 15 - XX-17SL15:DI-FOFBCtrl +CRATE_17_FOFB_15_PV_AREA_PREFIX=XX-17SL15: +CRATE_17_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 16 - XX-17SL16:DI-FOFBCtrl +CRATE_17_FOFB_16_PV_AREA_PREFIX=XX-17SL16: +CRATE_17_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 17 - XX-17SL17:DI-FOFBCtrl +CRATE_17_FOFB_17_PV_AREA_PREFIX=XX-17SL17: +CRATE_17_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 18 - XX-17SL18:DI-FOFBCtrl +CRATE_17_FOFB_18_PV_AREA_PREFIX=XX-17SL18: +CRATE_17_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 19 - XX-17SL19:DI-FOFBCtrl +CRATE_17_FOFB_19_PV_AREA_PREFIX=XX-17SL19: +CRATE_17_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 20 - XX-17SL20:DI-FOFBCtrl +CRATE_17_FOFB_20_PV_AREA_PREFIX=XX-17SL20: +CRATE_17_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 21 - XX-17SL21:DI-FOFBCtrl +CRATE_17_FOFB_21_PV_AREA_PREFIX=XX-17SL21: +CRATE_17_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 22 - XX-17SL22:DI-FOFBCtrl +CRATE_17_FOFB_22_PV_AREA_PREFIX=XX-17SL22: +CRATE_17_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 23 - XX-17SL23:DI-FOFBCtrl +CRATE_17_FOFB_23_PV_AREA_PREFIX=XX-17SL23: +CRATE_17_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 17 - FOFB slot 24 - XX-17SL24:DI-FOFBCtrl +CRATE_17_FOFB_24_PV_AREA_PREFIX=XX-17SL24: +CRATE_17_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 18 --- + +# Crate 18 - FOFB slot 1 - XX-18SL01:DI-FOFBCtrl +CRATE_18_FOFB_1_PV_AREA_PREFIX=XX-18SL01: +CRATE_18_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 2 - XX-18SL02:DI-FOFBCtrl +CRATE_18_FOFB_2_PV_AREA_PREFIX=XX-18SL02: +CRATE_18_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 3 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_3_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 4 - XX-18SL04:DI-FOFBCtrl +CRATE_18_FOFB_4_PV_AREA_PREFIX=XX-18SL04: +CRATE_18_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 5 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_5_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 6 - XX-18SL06:DI-FOFBCtrl +CRATE_18_FOFB_6_PV_AREA_PREFIX=XX-18SL06: +CRATE_18_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 7 - XX-18SL07:DI-FOFBCtrl +CRATE_18_FOFB_7_PV_AREA_PREFIX=XX-18SL07: +CRATE_18_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 8 - XX-18SL08:DI-FOFBCtrl +CRATE_18_FOFB_8_PV_AREA_PREFIX=XX-18SL08: +CRATE_18_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 9 - XX-18SL09:DI-FOFBCtrl +CRATE_18_FOFB_9_PV_AREA_PREFIX=XX-18SL09: +CRATE_18_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 10 - XX-18SL10:DI-FOFBCtrl +CRATE_18_FOFB_10_PV_AREA_PREFIX=XX-18SL10: +CRATE_18_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 11 - XX-18SL11:DI-FOFBCtrl +CRATE_18_FOFB_11_PV_AREA_PREFIX=XX-18SL11: +CRATE_18_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 12 - XX-18SL12:DI-FOFBCtrl +CRATE_18_FOFB_12_PV_AREA_PREFIX=XX-18SL12: +CRATE_18_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 13 - XX-18SL13:DI-FOFBCtrl +CRATE_18_FOFB_13_PV_AREA_PREFIX=XX-18SL13: +CRATE_18_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 14 - XX-18SL14:DI-FOFBCtrl +CRATE_18_FOFB_14_PV_AREA_PREFIX=XX-18SL14: +CRATE_18_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 15 - XX-18SL15:DI-FOFBCtrl +CRATE_18_FOFB_15_PV_AREA_PREFIX=XX-18SL15: +CRATE_18_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 16 - XX-18SL16:DI-FOFBCtrl +CRATE_18_FOFB_16_PV_AREA_PREFIX=XX-18SL16: +CRATE_18_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 17 - XX-18SL17:DI-FOFBCtrl +CRATE_18_FOFB_17_PV_AREA_PREFIX=XX-18SL17: +CRATE_18_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 18 - XX-18SL18:DI-FOFBCtrl +CRATE_18_FOFB_18_PV_AREA_PREFIX=XX-18SL18: +CRATE_18_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 19 - XX-18SL19:DI-FOFBCtrl +CRATE_18_FOFB_19_PV_AREA_PREFIX=XX-18SL19: +CRATE_18_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 20 - XX-18SL20:DI-FOFBCtrl +CRATE_18_FOFB_20_PV_AREA_PREFIX=XX-18SL20: +CRATE_18_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 21 - XX-18SL21:DI-FOFBCtrl +CRATE_18_FOFB_21_PV_AREA_PREFIX=XX-18SL21: +CRATE_18_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 22 - XX-18SL22:DI-FOFBCtrl +CRATE_18_FOFB_22_PV_AREA_PREFIX=XX-18SL22: +CRATE_18_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 23 - XX-18SL23:DI-FOFBCtrl +CRATE_18_FOFB_23_PV_AREA_PREFIX=XX-18SL23: +CRATE_18_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 18 - FOFB slot 24 - XX-18SL24:DI-FOFBCtrl +CRATE_18_FOFB_24_PV_AREA_PREFIX=XX-18SL24: +CRATE_18_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 19 --- + +# Crate 19 - FOFB slot 1 - XX-19SL01:DI-FOFBCtrl +CRATE_19_FOFB_1_PV_AREA_PREFIX=XX-19SL01: +CRATE_19_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 2 - XX-19SL02:DI-FOFBCtrl +CRATE_19_FOFB_2_PV_AREA_PREFIX=XX-19SL02: +CRATE_19_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 3 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_3_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 4 - XX-19SL04:DI-FOFBCtrl +CRATE_19_FOFB_4_PV_AREA_PREFIX=XX-19SL04: +CRATE_19_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 5 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_5_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 6 - XX-19SL06:DI-FOFBCtrl +CRATE_19_FOFB_6_PV_AREA_PREFIX=XX-19SL06: +CRATE_19_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 7 - XX-19SL07:DI-FOFBCtrl +CRATE_19_FOFB_7_PV_AREA_PREFIX=XX-19SL07: +CRATE_19_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 8 - XX-19SL08:DI-FOFBCtrl +CRATE_19_FOFB_8_PV_AREA_PREFIX=XX-19SL08: +CRATE_19_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 9 - XX-19SL09:DI-FOFBCtrl +CRATE_19_FOFB_9_PV_AREA_PREFIX=XX-19SL09: +CRATE_19_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 10 - XX-19SL10:DI-FOFBCtrl +CRATE_19_FOFB_10_PV_AREA_PREFIX=XX-19SL10: +CRATE_19_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 11 - XX-19SL11:DI-FOFBCtrl +CRATE_19_FOFB_11_PV_AREA_PREFIX=XX-19SL11: +CRATE_19_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 12 - XX-19SL12:DI-FOFBCtrl +CRATE_19_FOFB_12_PV_AREA_PREFIX=XX-19SL12: +CRATE_19_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 13 - XX-19SL13:DI-FOFBCtrl +CRATE_19_FOFB_13_PV_AREA_PREFIX=XX-19SL13: +CRATE_19_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 14 - XX-19SL14:DI-FOFBCtrl +CRATE_19_FOFB_14_PV_AREA_PREFIX=XX-19SL14: +CRATE_19_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 15 - XX-19SL15:DI-FOFBCtrl +CRATE_19_FOFB_15_PV_AREA_PREFIX=XX-19SL15: +CRATE_19_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 16 - XX-19SL16:DI-FOFBCtrl +CRATE_19_FOFB_16_PV_AREA_PREFIX=XX-19SL16: +CRATE_19_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 17 - XX-19SL17:DI-FOFBCtrl +CRATE_19_FOFB_17_PV_AREA_PREFIX=XX-19SL17: +CRATE_19_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 18 - XX-19SL18:DI-FOFBCtrl +CRATE_19_FOFB_18_PV_AREA_PREFIX=XX-19SL18: +CRATE_19_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 19 - XX-19SL19:DI-FOFBCtrl +CRATE_19_FOFB_19_PV_AREA_PREFIX=XX-19SL19: +CRATE_19_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 20 - XX-19SL20:DI-FOFBCtrl +CRATE_19_FOFB_20_PV_AREA_PREFIX=XX-19SL20: +CRATE_19_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 21 - XX-19SL21:DI-FOFBCtrl +CRATE_19_FOFB_21_PV_AREA_PREFIX=XX-19SL21: +CRATE_19_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 22 - XX-19SL22:DI-FOFBCtrl +CRATE_19_FOFB_22_PV_AREA_PREFIX=XX-19SL22: +CRATE_19_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 23 - XX-19SL23:DI-FOFBCtrl +CRATE_19_FOFB_23_PV_AREA_PREFIX=XX-19SL23: +CRATE_19_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 19 - FOFB slot 24 - XX-19SL24:DI-FOFBCtrl +CRATE_19_FOFB_24_PV_AREA_PREFIX=XX-19SL24: +CRATE_19_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 20 --- + +# Crate 20 - FOFB slot 1 - XX-20SL01:DI-FOFBCtrl +CRATE_20_FOFB_1_PV_AREA_PREFIX=XX-20SL01: +CRATE_20_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 2 - XX-20SL02:DI-FOFBCtrl +CRATE_20_FOFB_2_PV_AREA_PREFIX=XX-20SL02: +CRATE_20_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 3 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_3_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 4 - XX-20SL04:DI-FOFBCtrl +CRATE_20_FOFB_4_PV_AREA_PREFIX=XX-20SL04: +CRATE_20_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 5 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_5_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 6 - XX-20SL06:DI-FOFBCtrl +CRATE_20_FOFB_6_PV_AREA_PREFIX=XX-20SL06: +CRATE_20_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 7 - XX-20SL07:DI-FOFBCtrl +CRATE_20_FOFB_7_PV_AREA_PREFIX=XX-20SL07: +CRATE_20_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 8 - XX-20SL08:DI-FOFBCtrl +CRATE_20_FOFB_8_PV_AREA_PREFIX=XX-20SL08: +CRATE_20_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 9 - XX-20SL09:DI-FOFBCtrl +CRATE_20_FOFB_9_PV_AREA_PREFIX=XX-20SL09: +CRATE_20_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 10 - XX-20SL10:DI-FOFBCtrl +CRATE_20_FOFB_10_PV_AREA_PREFIX=XX-20SL10: +CRATE_20_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 11 - XX-20SL11:DI-FOFBCtrl +CRATE_20_FOFB_11_PV_AREA_PREFIX=XX-20SL11: +CRATE_20_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 12 - XX-20SL12:DI-FOFBCtrl +CRATE_20_FOFB_12_PV_AREA_PREFIX=XX-20SL12: +CRATE_20_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 13 - XX-20SL13:DI-FOFBCtrl +CRATE_20_FOFB_13_PV_AREA_PREFIX=XX-20SL13: +CRATE_20_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 14 - XX-20SL14:DI-FOFBCtrl +CRATE_20_FOFB_14_PV_AREA_PREFIX=XX-20SL14: +CRATE_20_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 15 - XX-20SL15:DI-FOFBCtrl +CRATE_20_FOFB_15_PV_AREA_PREFIX=XX-20SL15: +CRATE_20_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 16 - XX-20SL16:DI-FOFBCtrl +CRATE_20_FOFB_16_PV_AREA_PREFIX=XX-20SL16: +CRATE_20_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 17 - XX-20SL17:DI-FOFBCtrl +CRATE_20_FOFB_17_PV_AREA_PREFIX=XX-20SL17: +CRATE_20_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 18 - XX-20SL18:DI-FOFBCtrl +CRATE_20_FOFB_18_PV_AREA_PREFIX=XX-20SL18: +CRATE_20_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 19 - XX-20SL19:DI-FOFBCtrl +CRATE_20_FOFB_19_PV_AREA_PREFIX=XX-20SL19: +CRATE_20_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 20 - XX-20SL20:DI-FOFBCtrl +CRATE_20_FOFB_20_PV_AREA_PREFIX=XX-20SL20: +CRATE_20_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 21 - XX-20SL21:DI-FOFBCtrl +CRATE_20_FOFB_21_PV_AREA_PREFIX=XX-20SL21: +CRATE_20_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 22 - XX-20SL22:DI-FOFBCtrl +CRATE_20_FOFB_22_PV_AREA_PREFIX=XX-20SL22: +CRATE_20_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 23 - XX-20SL23:DI-FOFBCtrl +CRATE_20_FOFB_23_PV_AREA_PREFIX=XX-20SL23: +CRATE_20_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 20 - FOFB slot 24 - XX-20SL24:DI-FOFBCtrl +CRATE_20_FOFB_24_PV_AREA_PREFIX=XX-20SL24: +CRATE_20_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 21 --- + +# Crate 21 - FOFB slot 1 - XX-21SL01:DI-FOFBCtrl +CRATE_21_FOFB_1_PV_AREA_PREFIX=XX-21SL01: +CRATE_21_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 2 - XX-21SL02:DI-FOFBCtrl +CRATE_21_FOFB_2_PV_AREA_PREFIX=XX-21SL02: +CRATE_21_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 3 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_3_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 4 - XX-21SL04:DI-FOFBCtrl +CRATE_21_FOFB_4_PV_AREA_PREFIX=XX-21SL04: +CRATE_21_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 5 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_5_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 6 - XX-21SL06:DI-FOFBCtrl +CRATE_21_FOFB_6_PV_AREA_PREFIX=XX-21SL06: +CRATE_21_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 7 - XX-21SL07:DI-FOFBCtrl +CRATE_21_FOFB_7_PV_AREA_PREFIX=XX-21SL07: +CRATE_21_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 8 - XX-21SL08:DI-FOFBCtrl +CRATE_21_FOFB_8_PV_AREA_PREFIX=XX-21SL08: +CRATE_21_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 9 - XX-21SL09:DI-FOFBCtrl +CRATE_21_FOFB_9_PV_AREA_PREFIX=XX-21SL09: +CRATE_21_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 10 - XX-21SL10:DI-FOFBCtrl +CRATE_21_FOFB_10_PV_AREA_PREFIX=XX-21SL10: +CRATE_21_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 11 - XX-21SL11:DI-FOFBCtrl +CRATE_21_FOFB_11_PV_AREA_PREFIX=XX-21SL11: +CRATE_21_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 12 - XX-21SL12:DI-FOFBCtrl +CRATE_21_FOFB_12_PV_AREA_PREFIX=XX-21SL12: +CRATE_21_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 13 - XX-21SL13:DI-FOFBCtrl +CRATE_21_FOFB_13_PV_AREA_PREFIX=XX-21SL13: +CRATE_21_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 14 - XX-21SL14:DI-FOFBCtrl +CRATE_21_FOFB_14_PV_AREA_PREFIX=XX-21SL14: +CRATE_21_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 15 - XX-21SL15:DI-FOFBCtrl +CRATE_21_FOFB_15_PV_AREA_PREFIX=XX-21SL15: +CRATE_21_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 16 - XX-21SL16:DI-FOFBCtrl +CRATE_21_FOFB_16_PV_AREA_PREFIX=XX-21SL16: +CRATE_21_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 17 - XX-21SL17:DI-FOFBCtrl +CRATE_21_FOFB_17_PV_AREA_PREFIX=XX-21SL17: +CRATE_21_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 18 - XX-21SL18:DI-FOFBCtrl +CRATE_21_FOFB_18_PV_AREA_PREFIX=XX-21SL18: +CRATE_21_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 19 - XX-21SL19:DI-FOFBCtrl +CRATE_21_FOFB_19_PV_AREA_PREFIX=XX-21SL19: +CRATE_21_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 20 - XX-21SL20:DI-FOFBCtrl +CRATE_21_FOFB_20_PV_AREA_PREFIX=XX-21SL20: +CRATE_21_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 21 - XX-21SL21:DI-FOFBCtrl +CRATE_21_FOFB_21_PV_AREA_PREFIX=XX-21SL21: +CRATE_21_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 22 - XX-21SL22:DI-FOFBCtrl +CRATE_21_FOFB_22_PV_AREA_PREFIX=XX-21SL22: +CRATE_21_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 23 - XX-21SL23:DI-FOFBCtrl +CRATE_21_FOFB_23_PV_AREA_PREFIX=XX-21SL23: +CRATE_21_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 21 - FOFB slot 24 - XX-21SL24:DI-FOFBCtrl +CRATE_21_FOFB_24_PV_AREA_PREFIX=XX-21SL24: +CRATE_21_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 22 --- + +# Crate 22 - FOFB slot 1 - XX-22SL01:DI-FOFBCtrl +CRATE_22_FOFB_1_PV_AREA_PREFIX=XX-22SL01: +CRATE_22_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 2 - XX-22SL02:DI-FOFBCtrl +CRATE_22_FOFB_2_PV_AREA_PREFIX=XX-22SL02: +CRATE_22_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 3 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_3_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 4 - XX-22SL04:DI-FOFBCtrl +CRATE_22_FOFB_4_PV_AREA_PREFIX=XX-22SL04: +CRATE_22_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 5 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_5_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 6 - XX-22SL06:DI-FOFBCtrl +CRATE_22_FOFB_6_PV_AREA_PREFIX=XX-22SL06: +CRATE_22_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 7 - XX-22SL07:DI-FOFBCtrl +CRATE_22_FOFB_7_PV_AREA_PREFIX=XX-22SL07: +CRATE_22_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 8 - XX-22SL08:DI-FOFBCtrl +CRATE_22_FOFB_8_PV_AREA_PREFIX=XX-22SL08: +CRATE_22_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 9 - XX-22SL09:DI-FOFBCtrl +CRATE_22_FOFB_9_PV_AREA_PREFIX=XX-22SL09: +CRATE_22_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 10 - XX-22SL10:DI-FOFBCtrl +CRATE_22_FOFB_10_PV_AREA_PREFIX=XX-22SL10: +CRATE_22_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 11 - XX-22SL11:DI-FOFBCtrl +CRATE_22_FOFB_11_PV_AREA_PREFIX=XX-22SL11: +CRATE_22_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 12 - XX-22SL12:DI-FOFBCtrl +CRATE_22_FOFB_12_PV_AREA_PREFIX=XX-22SL12: +CRATE_22_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 13 - XX-22SL13:DI-FOFBCtrl +CRATE_22_FOFB_13_PV_AREA_PREFIX=XX-22SL13: +CRATE_22_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 14 - XX-22SL14:DI-FOFBCtrl +CRATE_22_FOFB_14_PV_AREA_PREFIX=XX-22SL14: +CRATE_22_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 15 - XX-22SL15:DI-FOFBCtrl +CRATE_22_FOFB_15_PV_AREA_PREFIX=XX-22SL15: +CRATE_22_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 16 - XX-22SL16:DI-FOFBCtrl +CRATE_22_FOFB_16_PV_AREA_PREFIX=XX-22SL16: +CRATE_22_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 17 - XX-22SL17:DI-FOFBCtrl +CRATE_22_FOFB_17_PV_AREA_PREFIX=XX-22SL17: +CRATE_22_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 18 - XX-22SL18:DI-FOFBCtrl +CRATE_22_FOFB_18_PV_AREA_PREFIX=XX-22SL18: +CRATE_22_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 19 - XX-22SL19:DI-FOFBCtrl +CRATE_22_FOFB_19_PV_AREA_PREFIX=XX-22SL19: +CRATE_22_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 20 - XX-22SL20:DI-FOFBCtrl +CRATE_22_FOFB_20_PV_AREA_PREFIX=XX-22SL20: +CRATE_22_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 21 - XX-22SL21:DI-FOFBCtrl +CRATE_22_FOFB_21_PV_AREA_PREFIX=XX-22SL21: +CRATE_22_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 22 - XX-22SL22:DI-FOFBCtrl +CRATE_22_FOFB_22_PV_AREA_PREFIX=XX-22SL22: +CRATE_22_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 23 - XX-22SL23:DI-FOFBCtrl +CRATE_22_FOFB_23_PV_AREA_PREFIX=XX-22SL23: +CRATE_22_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 24 - XX-22SL24:DI-FOFBCtrl +CRATE_22_FOFB_24_PV_AREA_PREFIX=XX-22SL24: +CRATE_22_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 99 (minicrate) --- + +# Crate 99 - FOFB slot 1 - XX-99SL01:DI-FOFBCtrl +CRATE_99_FOFB_1_PV_AREA_PREFIX=XX-99SL01: +CRATE_99_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 2 - XX-99SL02:DI-FOFBCtrl +CRATE_99_FOFB_2_PV_AREA_PREFIX=XX-99SL02: +CRATE_99_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 3 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_3_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_3_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 4 - XX-99SL04:DI-FOFBCtrl +CRATE_99_FOFB_4_PV_AREA_PREFIX=XX-99SL04: +CRATE_99_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 5 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_5_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_5_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 6 - XX-99SL06:DI-FOFBCtrl +CRATE_99_FOFB_6_PV_AREA_PREFIX=XX-99SL06: +CRATE_99_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 7 - XX-99SL07:DI-FOFBCtrl +CRATE_99_FOFB_7_PV_AREA_PREFIX=XX-99SL07: +CRATE_99_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 8 - XX-99SL08:DI-FOFBCtrl +CRATE_99_FOFB_8_PV_AREA_PREFIX=XX-99SL08: +CRATE_99_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 9 - XX-99SL09:DI-FOFBCtrl +CRATE_99_FOFB_9_PV_AREA_PREFIX=XX-99SL09: +CRATE_99_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 10 - XX-99SL10:DI-FOFBCtrl +CRATE_99_FOFB_10_PV_AREA_PREFIX=XX-99SL10: +CRATE_99_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 11 - XX-99SL11:DI-FOFBCtrl +CRATE_99_FOFB_11_PV_AREA_PREFIX=XX-99SL11: +CRATE_99_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 12 - XX-99SL12:DI-FOFBCtrl +CRATE_99_FOFB_12_PV_AREA_PREFIX=XX-99SL12: +CRATE_99_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 13 - XX-99SL13:DI-FOFBCtrl +CRATE_99_FOFB_13_PV_AREA_PREFIX=XX-99SL13: +CRATE_99_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 14 - XX-99SL14:DI-FOFBCtrl +CRATE_99_FOFB_14_PV_AREA_PREFIX=XX-99SL14: +CRATE_99_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 15 - XX-99SL15:DI-FOFBCtrl +CRATE_99_FOFB_15_PV_AREA_PREFIX=XX-99SL15: +CRATE_99_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 16 - XX-99SL16:DI-FOFBCtrl +CRATE_99_FOFB_16_PV_AREA_PREFIX=XX-99SL16: +CRATE_99_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 17 - XX-99SL17:DI-FOFBCtrl +CRATE_99_FOFB_17_PV_AREA_PREFIX=XX-99SL17: +CRATE_99_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 18 - XX-99SL18:DI-FOFBCtrl +CRATE_99_FOFB_18_PV_AREA_PREFIX=XX-99SL18: +CRATE_99_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 19 - XX-99SL19:DI-FOFBCtrl +CRATE_99_FOFB_19_PV_AREA_PREFIX=XX-99SL19: +CRATE_99_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 20 - XX-99SL20:DI-FOFBCtrl +CRATE_99_FOFB_20_PV_AREA_PREFIX=XX-99SL20: +CRATE_99_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 21 - XX-99SL21:DI-FOFBCtrl +CRATE_99_FOFB_21_PV_AREA_PREFIX=XX-99SL21: +CRATE_99_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 22 - XX-99SL22:DI-FOFBCtrl +CRATE_99_FOFB_22_PV_AREA_PREFIX=XX-99SL22: +CRATE_99_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 23 - XX-99SL23:DI-FOFBCtrl +CRATE_99_FOFB_23_PV_AREA_PREFIX=XX-99SL23: +CRATE_99_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 99 - FOFB slot 24 - XX-99SL24:DI-FOFBCtrl +CRATE_99_FOFB_24_PV_AREA_PREFIX=XX-99SL24: +CRATE_99_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + diff --git a/scripts/systemd/etc/sysconfig/fofb-epics-slot-mapping b/scripts/systemd/etc/sysconfig/fofb-epics-slot-mapping deleted file mode 100644 index 66b2955..0000000 --- a/scripts/systemd/etc/sysconfig/fofb-epics-slot-mapping +++ /dev/null @@ -1,2183 +0,0 @@ -# --- CRATE 1 --- - -# Crate 1 - FOFB slot 1 - XX-01SL01:DI-FOFB -CRATE_1_FOFB_1_PV_AREA_PREFIX=XX-01SL01: -CRATE_1_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 2 - XX-01SL02:DI-FOFB -CRATE_1_FOFB_2_PV_AREA_PREFIX=XX-01SL02: -CRATE_1_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 3 - XX-01SL03:DI-FOFB -CRATE_1_FOFB_3_PV_AREA_PREFIX=XX-01SL03: -CRATE_1_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 4 - XX-01SL04:DI-FOFB -CRATE_1_FOFB_4_PV_AREA_PREFIX=XX-01SL04: -CRATE_1_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 5 - XX-01SL05:DI-FOFB -CRATE_1_FOFB_5_PV_AREA_PREFIX=XX-01SL05: -CRATE_1_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 6 - XX-01SL06:DI-FOFB -CRATE_1_FOFB_6_PV_AREA_PREFIX=XX-01SL06: -CRATE_1_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 7 - SI-01SAFE:DI-PFOFB-1 -CRATE_1_FOFB_7_PV_AREA_PREFIX=SI-01SAFE: -CRATE_1_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 1 - FOFB slot 8 - SI-01SAFE:DI-PFOFB-2 -CRATE_1_FOFB_8_PV_AREA_PREFIX=SI-01SAFE: -CRATE_1_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 1 - FOFB slot 9 - SI-01BCFE:DI-PFOFB-1 -CRATE_1_FOFB_9_PV_AREA_PREFIX=SI-01BCFE: -CRATE_1_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 1 - FOFB slot 10 - SI-01BCFE:DI-PFOFB-2 -CRATE_1_FOFB_10_PV_AREA_PREFIX=SI-01BCFE: -CRATE_1_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 1 - FOFB slot 11 - SI-01SA:DI-FOFB-1 -CRATE_1_FOFB_11_PV_AREA_PREFIX=SI-01SA: -CRATE_1_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 1 - FOFB slot 12 - SI-01SA:DI-FOFB-2 -CRATE_1_FOFB_12_PV_AREA_PREFIX=SI-01SA: -CRATE_1_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 1 - FOFB slot 13 - SI-01M1:DI-FOFB -CRATE_1_FOFB_13_PV_AREA_PREFIX=SI-01M1: -CRATE_1_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 14 - SI-01M2:DI-FOFB -CRATE_1_FOFB_14_PV_AREA_PREFIX=SI-01M2: -CRATE_1_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 15 - SI-01C1:DI-FOFB-1 -CRATE_1_FOFB_15_PV_AREA_PREFIX=SI-01C1: -CRATE_1_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 1 - FOFB slot 16 - SI-01C1:DI-FOFB-2 -CRATE_1_FOFB_16_PV_AREA_PREFIX=SI-01C1: -CRATE_1_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 1 - FOFB slot 17 - SI-01C2:DI-FOFB -CRATE_1_FOFB_17_PV_AREA_PREFIX=SI-01C2: -CRATE_1_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 18 - SI-01C3:DI-FOFB-1 -CRATE_1_FOFB_18_PV_AREA_PREFIX=SI-01C3: -CRATE_1_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 1 - FOFB slot 19 - SI-01C3:DI-FOFB-2 -CRATE_1_FOFB_19_PV_AREA_PREFIX=SI-01C3: -CRATE_1_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 1 - FOFB slot 20 - SI-01C4:DI-FOFB -CRATE_1_FOFB_20_PV_AREA_PREFIX=SI-01C4: -CRATE_1_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 21 - BO-01U:DI-FOFB -CRATE_1_FOFB_21_PV_AREA_PREFIX=BO-01U: -CRATE_1_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 22 - BO-02U:DI-FOFB -CRATE_1_FOFB_22_PV_AREA_PREFIX=BO-02U: -CRATE_1_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 23 - XX-01SL23:DI-FOFB -CRATE_1_FOFB_23_PV_AREA_PREFIX=XX-01SL23: -CRATE_1_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 1 - FOFB slot 24 - XX-01SL24:DI-FOFB -CRATE_1_FOFB_24_PV_AREA_PREFIX=XX-01SL24: -CRATE_1_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 2 --- - -# Crate 2 - FOFB slot 1 - XX-02SL01:DI-FOFB -CRATE_2_FOFB_1_PV_AREA_PREFIX=XX-02SL01: -CRATE_2_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 2 - XX-02SL02:DI-FOFB -CRATE_2_FOFB_2_PV_AREA_PREFIX=XX-02SL02: -CRATE_2_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 3 - XX-02SL03:DI-FOFB -CRATE_2_FOFB_3_PV_AREA_PREFIX=XX-02SL03: -CRATE_2_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 4 - XX-02SL04:DI-FOFB -CRATE_2_FOFB_4_PV_AREA_PREFIX=XX-02SL04: -CRATE_2_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 5 - XX-02SL05:DI-FOFB -CRATE_2_FOFB_5_PV_AREA_PREFIX=XX-02SL05: -CRATE_2_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 6 - XX-02SL06:DI-FOFB -CRATE_2_FOFB_6_PV_AREA_PREFIX=XX-02SL06: -CRATE_2_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 7 - SI-02SBFE:DI-PFOFB-1 -CRATE_2_FOFB_7_PV_AREA_PREFIX=SI-02SBFE: -CRATE_2_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 2 - FOFB slot 8 - SI-02SBFE:DI-PFOFB-2 -CRATE_2_FOFB_8_PV_AREA_PREFIX=SI-02SBFE: -CRATE_2_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 2 - FOFB slot 9 - SI-02BCFE:DI-PFOFB-1 -CRATE_2_FOFB_9_PV_AREA_PREFIX=SI-02BCFE: -CRATE_2_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 2 - FOFB slot 10 - SI-02BCFE:DI-PFOFB-2 -CRATE_2_FOFB_10_PV_AREA_PREFIX=SI-02BCFE: -CRATE_2_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 2 - FOFB slot 11 - SI-02SB:DI-FOFB-1 -CRATE_2_FOFB_11_PV_AREA_PREFIX=SI-02SB: -CRATE_2_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 2 - FOFB slot 12 - SI-02SB:DI-FOFB-2 -CRATE_2_FOFB_12_PV_AREA_PREFIX=SI-02SB: -CRATE_2_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 2 - FOFB slot 13 - SI-02M1:DI-FOFB -CRATE_2_FOFB_13_PV_AREA_PREFIX=SI-02M1: -CRATE_2_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 14 - SI-02M2:DI-FOFB -CRATE_2_FOFB_14_PV_AREA_PREFIX=SI-02M2: -CRATE_2_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 15 - SI-02C1:DI-FOFB-1 -CRATE_2_FOFB_15_PV_AREA_PREFIX=SI-02C1: -CRATE_2_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 2 - FOFB slot 16 - SI-02C1:DI-FOFB-2 -CRATE_2_FOFB_16_PV_AREA_PREFIX=SI-02C1: -CRATE_2_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 2 - FOFB slot 17 - SI-02C2:DI-FOFB -CRATE_2_FOFB_17_PV_AREA_PREFIX=SI-02C2: -CRATE_2_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 18 - SI-02C3:DI-FOFB-1 -CRATE_2_FOFB_18_PV_AREA_PREFIX=SI-02C3: -CRATE_2_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 2 - FOFB slot 19 - SI-02C3:DI-FOFB-2 -CRATE_2_FOFB_19_PV_AREA_PREFIX=SI-02C3: -CRATE_2_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 2 - FOFB slot 20 - SI-02C4:DI-FOFB -CRATE_2_FOFB_20_PV_AREA_PREFIX=SI-02C4: -CRATE_2_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 21 - BO-03U:DI-FOFB -CRATE_2_FOFB_21_PV_AREA_PREFIX=BO-03U: -CRATE_2_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 22 - BO-04U:DI-FOFB -CRATE_2_FOFB_22_PV_AREA_PREFIX=BO-04U: -CRATE_2_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 23 - BO-05U:DI-FOFB -CRATE_2_FOFB_23_PV_AREA_PREFIX=BO-05U: -CRATE_2_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 2 - FOFB slot 24 - XX-02SL24:DI-FOFB -CRATE_2_FOFB_24_PV_AREA_PREFIX=XX-02SL24: -CRATE_2_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 3 --- - -# Crate 3 - FOFB slot 1 - XX-03SL01:DI-FOFB -CRATE_3_FOFB_1_PV_AREA_PREFIX=XX-03SL01: -CRATE_3_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 2 - XX-03SL02:DI-FOFB -CRATE_3_FOFB_2_PV_AREA_PREFIX=XX-03SL02: -CRATE_3_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 3 - XX-03SL03:DI-FOFB -CRATE_3_FOFB_3_PV_AREA_PREFIX=XX-03SL03: -CRATE_3_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 4 - XX-03SL04:DI-FOFB -CRATE_3_FOFB_4_PV_AREA_PREFIX=XX-03SL04: -CRATE_3_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 5 - XX-03SL05:DI-FOFB -CRATE_3_FOFB_5_PV_AREA_PREFIX=XX-03SL05: -CRATE_3_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 6 - XX-03SL06:DI-FOFB -CRATE_3_FOFB_6_PV_AREA_PREFIX=XX-03SL06: -CRATE_3_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 7 - SI-03SPFE:DI-PFOFB-1 -CRATE_3_FOFB_7_PV_AREA_PREFIX=SI-03SPFE: -CRATE_3_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 3 - FOFB slot 8 - SI-03SPFE:DI-PFOFB-2 -CRATE_3_FOFB_8_PV_AREA_PREFIX=SI-03SPFE: -CRATE_3_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 3 - FOFB slot 9 - SI-03BCFE:DI-PFOFB-1 -CRATE_3_FOFB_9_PV_AREA_PREFIX=SI-03BCFE: -CRATE_3_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 3 - FOFB slot 10 - SI-03BCFE:DI-PFOFB-2 -CRATE_3_FOFB_10_PV_AREA_PREFIX=SI-03BCFE: -CRATE_3_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 3 - FOFB slot 11 - SI-03SP:DI-FOFB-1 -CRATE_3_FOFB_11_PV_AREA_PREFIX=SI-03SP: -CRATE_3_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 3 - FOFB slot 12 - SI-03SP:DI-FOFB-2 -CRATE_3_FOFB_12_PV_AREA_PREFIX=SI-03SP: -CRATE_3_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 3 - FOFB slot 13 - SI-03M1:DI-FOFB -CRATE_3_FOFB_13_PV_AREA_PREFIX=SI-03M1: -CRATE_3_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 14 - SI-03M2:DI-FOFB -CRATE_3_FOFB_14_PV_AREA_PREFIX=SI-03M2: -CRATE_3_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 15 - SI-03C1:DI-FOFB-1 -CRATE_3_FOFB_15_PV_AREA_PREFIX=SI-03C1: -CRATE_3_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 3 - FOFB slot 16 - SI-03C1:DI-FOFB-2 -CRATE_3_FOFB_16_PV_AREA_PREFIX=SI-03C1: -CRATE_3_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 3 - FOFB slot 17 - SI-03C2:DI-FOFB -CRATE_3_FOFB_17_PV_AREA_PREFIX=SI-03C2: -CRATE_3_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 18 - SI-03C3:DI-FOFB-1 -CRATE_3_FOFB_18_PV_AREA_PREFIX=SI-03C3: -CRATE_3_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 3 - FOFB slot 19 - SI-03C3:DI-FOFB-2 -CRATE_3_FOFB_19_PV_AREA_PREFIX=SI-03C3: -CRATE_3_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 3 - FOFB slot 20 - SI-03C4:DI-FOFB -CRATE_3_FOFB_20_PV_AREA_PREFIX=SI-03C4: -CRATE_3_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 21 - BO-06U:DI-FOFB -CRATE_3_FOFB_21_PV_AREA_PREFIX=BO-06U: -CRATE_3_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 22 - BO-07U:DI-FOFB -CRATE_3_FOFB_22_PV_AREA_PREFIX=BO-07U: -CRATE_3_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 23 - XX-03SL23:DI-FOFB -CRATE_3_FOFB_23_PV_AREA_PREFIX=XX-03SL23: -CRATE_3_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 3 - FOFB slot 24 - XX-03SL24:DI-FOFB -CRATE_3_FOFB_24_PV_AREA_PREFIX=XX-03SL24: -CRATE_3_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 4 --- - -# Crate 4 - FOFB slot 1 - XX-04SL01:DI-FOFB -CRATE_4_FOFB_1_PV_AREA_PREFIX=XX-04SL01: -CRATE_4_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 2 - XX-04SL02:DI-FOFB -CRATE_4_FOFB_2_PV_AREA_PREFIX=XX-04SL02: -CRATE_4_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 3 - XX-04SL03:DI-FOFB -CRATE_4_FOFB_3_PV_AREA_PREFIX=XX-04SL03: -CRATE_4_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 4 - XX-04SL04:DI-FOFB -CRATE_4_FOFB_4_PV_AREA_PREFIX=XX-04SL04: -CRATE_4_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 5 - XX-04SL05:DI-FOFB -CRATE_4_FOFB_5_PV_AREA_PREFIX=XX-04SL05: -CRATE_4_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 6 - XX-04SL06:DI-FOFB -CRATE_4_FOFB_6_PV_AREA_PREFIX=XX-04SL06: -CRATE_4_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 7 - SI-04SBFE:DI-PFOFB-1 -CRATE_4_FOFB_7_PV_AREA_PREFIX=SI-04SBFE: -CRATE_4_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 4 - FOFB slot 8 - SI-04SBFE:DI-PFOFB-2 -CRATE_4_FOFB_8_PV_AREA_PREFIX=SI-04SBFE: -CRATE_4_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 4 - FOFB slot 9 - SI-04BCFE:DI-PFOFB-1 -CRATE_4_FOFB_9_PV_AREA_PREFIX=SI-04BCFE: -CRATE_4_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 4 - FOFB slot 10 - SI-04BCFE:DI-PFOFB-2 -CRATE_4_FOFB_10_PV_AREA_PREFIX=SI-04BCFE: -CRATE_4_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 4 - FOFB slot 11 - SI-04SB:DI-FOFB-1 -CRATE_4_FOFB_11_PV_AREA_PREFIX=SI-04SB: -CRATE_4_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 4 - FOFB slot 12 - SI-04SB:DI-FOFB-2 -CRATE_4_FOFB_12_PV_AREA_PREFIX=SI-04SB: -CRATE_4_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 4 - FOFB slot 13 - SI-04M1:DI-FOFB -CRATE_4_FOFB_13_PV_AREA_PREFIX=SI-04M1: -CRATE_4_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 14 - SI-04M2:DI-FOFB -CRATE_4_FOFB_14_PV_AREA_PREFIX=SI-04M2: -CRATE_4_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 15 - SI-04C1:DI-FOFB-1 -CRATE_4_FOFB_15_PV_AREA_PREFIX=SI-04C1: -CRATE_4_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 4 - FOFB slot 16 - SI-04C1:DI-FOFB-2 -CRATE_4_FOFB_16_PV_AREA_PREFIX=SI-04C1: -CRATE_4_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 4 - FOFB slot 17 - SI-04C2:DI-FOFB -CRATE_4_FOFB_17_PV_AREA_PREFIX=SI-04C2: -CRATE_4_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 18 - SI-04C3:DI-FOFB-1 -CRATE_4_FOFB_18_PV_AREA_PREFIX=SI-04C3: -CRATE_4_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 4 - FOFB slot 19 - SI-04C3:DI-FOFB-2 -CRATE_4_FOFB_19_PV_AREA_PREFIX=SI-04C3: -CRATE_4_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 4 - FOFB slot 20 - SI-04C4:DI-FOFB -CRATE_4_FOFB_20_PV_AREA_PREFIX=SI-04C4: -CRATE_4_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 21 - BO-08U:DI-FOFB -CRATE_4_FOFB_21_PV_AREA_PREFIX=BO-08U: -CRATE_4_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 22 - BO-09U:DI-FOFB -CRATE_4_FOFB_22_PV_AREA_PREFIX=BO-09U: -CRATE_4_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 23 - BO-10U:DI-FOFB -CRATE_4_FOFB_23_PV_AREA_PREFIX=BO-10U: -CRATE_4_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 4 - FOFB slot 24 - XX-04SL24:DI-FOFB -CRATE_4_FOFB_24_PV_AREA_PREFIX=XX-04SL24: -CRATE_4_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 5 --- - -# Crate 5 - FOFB slot 1 - XX-05SL01:DI-FOFB -CRATE_5_FOFB_1_PV_AREA_PREFIX=XX-05SL01: -CRATE_5_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 2 - XX-05SL02:DI-FOFB -CRATE_5_FOFB_2_PV_AREA_PREFIX=XX-05SL02: -CRATE_5_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 3 - XX-05SL03:DI-FOFB -CRATE_5_FOFB_3_PV_AREA_PREFIX=XX-05SL03: -CRATE_5_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 4 - XX-05SL04:DI-FOFB -CRATE_5_FOFB_4_PV_AREA_PREFIX=XX-05SL04: -CRATE_5_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 5 - XX-05SL05:DI-FOFB -CRATE_5_FOFB_5_PV_AREA_PREFIX=XX-05SL05: -CRATE_5_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 6 - XX-05SL06:DI-FOFB -CRATE_5_FOFB_6_PV_AREA_PREFIX=XX-05SL06: -CRATE_5_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 7 - SI-05SAFE:DI-PFOFB-1 -CRATE_5_FOFB_7_PV_AREA_PREFIX=SI-05SAFE: -CRATE_5_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 5 - FOFB slot 8 - SI-05SAFE:DI-PFOFB-2 -CRATE_5_FOFB_8_PV_AREA_PREFIX=SI-05SAFE: -CRATE_5_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 5 - FOFB slot 9 - SI-05BCFE:DI-PFOFB-1 -CRATE_5_FOFB_9_PV_AREA_PREFIX=SI-05BCFE: -CRATE_5_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 5 - FOFB slot 10 - SI-05BCFE:DI-PFOFB-2 -CRATE_5_FOFB_10_PV_AREA_PREFIX=SI-05BCFE: -CRATE_5_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 5 - FOFB slot 11 - SI-05SA:DI-FOFB-1 -CRATE_5_FOFB_11_PV_AREA_PREFIX=SI-05SA: -CRATE_5_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 5 - FOFB slot 12 - SI-05SA:DI-FOFB-2 -CRATE_5_FOFB_12_PV_AREA_PREFIX=SI-05SA: -CRATE_5_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 5 - FOFB slot 13 - SI-05M1:DI-FOFB -CRATE_5_FOFB_13_PV_AREA_PREFIX=SI-05M1: -CRATE_5_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 14 - SI-05M2:DI-FOFB -CRATE_5_FOFB_14_PV_AREA_PREFIX=SI-05M2: -CRATE_5_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 15 - SI-05C1:DI-FOFB-1 -CRATE_5_FOFB_15_PV_AREA_PREFIX=SI-05C1: -CRATE_5_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 5 - FOFB slot 16 - SI-05C1:DI-FOFB-2 -CRATE_5_FOFB_16_PV_AREA_PREFIX=SI-05C1: -CRATE_5_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 5 - FOFB slot 17 - SI-05C2:DI-FOFB -CRATE_5_FOFB_17_PV_AREA_PREFIX=SI-05C2: -CRATE_5_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 18 - SI-05C3:DI-FOFB-1 -CRATE_5_FOFB_18_PV_AREA_PREFIX=SI-05C3: -CRATE_5_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 5 - FOFB slot 19 - SI-05C3:DI-FOFB-2 -CRATE_5_FOFB_19_PV_AREA_PREFIX=SI-05C3: -CRATE_5_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 5 - FOFB slot 20 - SI-05C4:DI-FOFB -CRATE_5_FOFB_20_PV_AREA_PREFIX=SI-05C4: -CRATE_5_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 21 - BO-11U:DI-FOFB -CRATE_5_FOFB_21_PV_AREA_PREFIX=BO-11U: -CRATE_5_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 22 - BO-12U:DI-FOFB -CRATE_5_FOFB_22_PV_AREA_PREFIX=BO-12U: -CRATE_5_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 23 - XX-05SL23:DI-FOFB -CRATE_5_FOFB_23_PV_AREA_PREFIX=XX-05SL23: -CRATE_5_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 5 - FOFB slot 24 - XX-05SL24:DI-FOFB -CRATE_5_FOFB_24_PV_AREA_PREFIX=XX-05SL24: -CRATE_5_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 6 --- - -# Crate 6 - FOFB slot 1 - XX-06SL01:DI-FOFB -CRATE_6_FOFB_1_PV_AREA_PREFIX=XX-06SL01: -CRATE_6_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 2 - XX-06SL02:DI-FOFB -CRATE_6_FOFB_2_PV_AREA_PREFIX=XX-06SL02: -CRATE_6_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 3 - XX-06SL03:DI-FOFB -CRATE_6_FOFB_3_PV_AREA_PREFIX=XX-06SL03: -CRATE_6_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 4 - XX-06SL04:DI-FOFB -CRATE_6_FOFB_4_PV_AREA_PREFIX=XX-06SL04: -CRATE_6_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 5 - XX-06SL05:DI-FOFB -CRATE_6_FOFB_5_PV_AREA_PREFIX=XX-06SL05: -CRATE_6_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 6 - XX-06SL06:DI-FOFB -CRATE_6_FOFB_6_PV_AREA_PREFIX=XX-06SL06: -CRATE_6_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 7 - SI-06SBFE:DI-PFOFB-1 -CRATE_6_FOFB_7_PV_AREA_PREFIX=SI-06SBFE: -CRATE_6_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 6 - FOFB slot 8 - SI-06SBFE:DI-PFOFB-2 -CRATE_6_FOFB_8_PV_AREA_PREFIX=SI-06SBFE: -CRATE_6_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 6 - FOFB slot 9 - SI-06BCFE:DI-PFOFB-1 -CRATE_6_FOFB_9_PV_AREA_PREFIX=SI-06BCFE: -CRATE_6_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 6 - FOFB slot 10 - SI-06BCFE:DI-PFOFB-2 -CRATE_6_FOFB_10_PV_AREA_PREFIX=SI-06BCFE: -CRATE_6_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 6 - FOFB slot 11 - SI-06SB:DI-FOFB-1 -CRATE_6_FOFB_11_PV_AREA_PREFIX=SI-06SB: -CRATE_6_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 6 - FOFB slot 12 - SI-06SB:DI-FOFB-2 -CRATE_6_FOFB_12_PV_AREA_PREFIX=SI-06SB: -CRATE_6_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 6 - FOFB slot 13 - SI-06M1:DI-FOFB -CRATE_6_FOFB_13_PV_AREA_PREFIX=SI-06M1: -CRATE_6_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 14 - SI-06M2:DI-FOFB -CRATE_6_FOFB_14_PV_AREA_PREFIX=SI-06M2: -CRATE_6_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 15 - SI-06C1:DI-FOFB-1 -CRATE_6_FOFB_15_PV_AREA_PREFIX=SI-06C1: -CRATE_6_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 6 - FOFB slot 16 - SI-06C1:DI-FOFB-2 -CRATE_6_FOFB_16_PV_AREA_PREFIX=SI-06C1: -CRATE_6_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 6 - FOFB slot 17 - SI-06C2:DI-FOFB -CRATE_6_FOFB_17_PV_AREA_PREFIX=SI-06C2: -CRATE_6_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 18 - SI-06C3:DI-FOFB-1 -CRATE_6_FOFB_18_PV_AREA_PREFIX=SI-06C3: -CRATE_6_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 6 - FOFB slot 19 - SI-06C3:DI-FOFB-2 -CRATE_6_FOFB_19_PV_AREA_PREFIX=SI-06C3: -CRATE_6_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 6 - FOFB slot 20 - SI-06C4:DI-FOFB -CRATE_6_FOFB_20_PV_AREA_PREFIX=SI-06C4: -CRATE_6_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 21 - BO-13U:DI-FOFB -CRATE_6_FOFB_21_PV_AREA_PREFIX=BO-13U: -CRATE_6_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 22 - BO-14U:DI-FOFB -CRATE_6_FOFB_22_PV_AREA_PREFIX=BO-14U: -CRATE_6_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 23 - BO-15U:DI-FOFB -CRATE_6_FOFB_23_PV_AREA_PREFIX=BO-15U: -CRATE_6_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 6 - FOFB slot 24 - XX-06SL24:DI-FOFB -CRATE_6_FOFB_24_PV_AREA_PREFIX=XX-06SL24: -CRATE_6_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 7 --- - -# Crate 7 - FOFB slot 1 - XX-07SL01:DI-FOFB -CRATE_7_FOFB_1_PV_AREA_PREFIX=XX-07SL01: -CRATE_7_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 2 - XX-07SL02:DI-FOFB -CRATE_7_FOFB_2_PV_AREA_PREFIX=XX-07SL02: -CRATE_7_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 3 - XX-07SL03:DI-FOFB -CRATE_7_FOFB_3_PV_AREA_PREFIX=XX-07SL03: -CRATE_7_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 4 - XX-07SL04:DI-FOFB -CRATE_7_FOFB_4_PV_AREA_PREFIX=XX-07SL04: -CRATE_7_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 5 - XX-07SL05:DI-FOFB -CRATE_7_FOFB_5_PV_AREA_PREFIX=XX-07SL05: -CRATE_7_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 6 - XX-07SL06:DI-FOFB -CRATE_7_FOFB_6_PV_AREA_PREFIX=XX-07SL06: -CRATE_7_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 7 - SI-07SPFE:DI-PFOFB-1 -CRATE_7_FOFB_7_PV_AREA_PREFIX=SI-07SPFE: -CRATE_7_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 7 - FOFB slot 8 - SI-07SPFE:DI-PFOFB-2 -CRATE_7_FOFB_8_PV_AREA_PREFIX=SI-07SPFE: -CRATE_7_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 7 - FOFB slot 9 - SI-07BCFE:DI-PFOFB-1 -CRATE_7_FOFB_9_PV_AREA_PREFIX=SI-07BCFE: -CRATE_7_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 7 - FOFB slot 10 - SI-07BCFE:DI-PFOFB-2 -CRATE_7_FOFB_10_PV_AREA_PREFIX=SI-07BCFE: -CRATE_7_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 7 - FOFB slot 11 - SI-07SP:DI-FOFB-1 -CRATE_7_FOFB_11_PV_AREA_PREFIX=SI-07SP: -CRATE_7_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 7 - FOFB slot 12 - SI-07SP:DI-FOFB-2 -CRATE_7_FOFB_12_PV_AREA_PREFIX=SI-07SP: -CRATE_7_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 7 - FOFB slot 13 - SI-07M1:DI-FOFB -CRATE_7_FOFB_13_PV_AREA_PREFIX=SI-07M1: -CRATE_7_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 14 - SI-07M2:DI-FOFB -CRATE_7_FOFB_14_PV_AREA_PREFIX=SI-07M2: -CRATE_7_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 15 - SI-07C1:DI-FOFB-1 -CRATE_7_FOFB_15_PV_AREA_PREFIX=SI-07C1: -CRATE_7_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 7 - FOFB slot 16 - SI-07C1:DI-FOFB-2 -CRATE_7_FOFB_16_PV_AREA_PREFIX=SI-07C1: -CRATE_7_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 7 - FOFB slot 17 - SI-07C2:DI-FOFB -CRATE_7_FOFB_17_PV_AREA_PREFIX=SI-07C2: -CRATE_7_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 18 - SI-07C3:DI-FOFB-1 -CRATE_7_FOFB_18_PV_AREA_PREFIX=SI-07C3: -CRATE_7_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 7 - FOFB slot 19 - SI-07C3:DI-FOFB-2 -CRATE_7_FOFB_19_PV_AREA_PREFIX=SI-07C3: -CRATE_7_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 7 - FOFB slot 20 - SI-07C4:DI-FOFB -CRATE_7_FOFB_20_PV_AREA_PREFIX=SI-07C4: -CRATE_7_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 21 - BO-16U:DI-FOFB -CRATE_7_FOFB_21_PV_AREA_PREFIX=BO-16U: -CRATE_7_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 22 - BO-17U:DI-FOFB -CRATE_7_FOFB_22_PV_AREA_PREFIX=BO-17U: -CRATE_7_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 23 - XX-07SL23:DI-FOFB -CRATE_7_FOFB_23_PV_AREA_PREFIX=XX-07SL23: -CRATE_7_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 7 - FOFB slot 24 - XX-07SL24:DI-FOFB -CRATE_7_FOFB_24_PV_AREA_PREFIX=XX-07SL24: -CRATE_7_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 8 --- - -# Crate 8 - FOFB slot 1 - XX-08SL01:DI-FOFB -CRATE_8_FOFB_1_PV_AREA_PREFIX=XX-08SL01: -CRATE_8_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 2 - XX-08SL02:DI-FOFB -CRATE_8_FOFB_2_PV_AREA_PREFIX=XX-08SL02: -CRATE_8_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 3 - XX-08SL03:DI-FOFB -CRATE_8_FOFB_3_PV_AREA_PREFIX=XX-08SL03: -CRATE_8_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 4 - XX-08SL04:DI-FOFB -CRATE_8_FOFB_4_PV_AREA_PREFIX=XX-08SL04: -CRATE_8_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 5 - XX-08SL05:DI-FOFB -CRATE_8_FOFB_5_PV_AREA_PREFIX=XX-08SL05: -CRATE_8_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 6 - XX-08SL06:DI-FOFB -CRATE_8_FOFB_6_PV_AREA_PREFIX=XX-08SL06: -CRATE_8_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 7 - SI-08SBFE:DI-PFOFB-1 -CRATE_8_FOFB_7_PV_AREA_PREFIX=SI-08SBFE: -CRATE_8_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 8 - FOFB slot 8 - SI-08SBFE:DI-PFOFB-2 -CRATE_8_FOFB_8_PV_AREA_PREFIX=SI-08SBFE: -CRATE_8_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 8 - FOFB slot 9 - SI-08BCFE:DI-PFOFB-1 -CRATE_8_FOFB_9_PV_AREA_PREFIX=SI-08BCFE: -CRATE_8_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 8 - FOFB slot 10 - SI-08BCFE:DI-PFOFB-2 -CRATE_8_FOFB_10_PV_AREA_PREFIX=SI-08BCFE: -CRATE_8_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 8 - FOFB slot 11 - SI-08SB:DI-FOFB-1 -CRATE_8_FOFB_11_PV_AREA_PREFIX=SI-08SB: -CRATE_8_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 8 - FOFB slot 12 - SI-08SB:DI-FOFB-2 -CRATE_8_FOFB_12_PV_AREA_PREFIX=SI-08SB: -CRATE_8_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 8 - FOFB slot 13 - SI-08M1:DI-FOFB -CRATE_8_FOFB_13_PV_AREA_PREFIX=SI-08M1: -CRATE_8_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 14 - SI-08M2:DI-FOFB -CRATE_8_FOFB_14_PV_AREA_PREFIX=SI-08M2: -CRATE_8_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 15 - SI-08C1:DI-FOFB-1 -CRATE_8_FOFB_15_PV_AREA_PREFIX=SI-08C1: -CRATE_8_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 8 - FOFB slot 16 - SI-08C1:DI-FOFB-2 -CRATE_8_FOFB_16_PV_AREA_PREFIX=SI-08C1: -CRATE_8_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 8 - FOFB slot 17 - SI-08C2:DI-FOFB -CRATE_8_FOFB_17_PV_AREA_PREFIX=SI-08C2: -CRATE_8_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 18 - SI-08C3:DI-FOFB-1 -CRATE_8_FOFB_18_PV_AREA_PREFIX=SI-08C3: -CRATE_8_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 8 - FOFB slot 19 - SI-08C3:DI-FOFB-2 -CRATE_8_FOFB_19_PV_AREA_PREFIX=SI-08C3: -CRATE_8_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 8 - FOFB slot 20 - SI-08C4:DI-FOFB -CRATE_8_FOFB_20_PV_AREA_PREFIX=SI-08C4: -CRATE_8_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 21 - BO-18U:DI-FOFB -CRATE_8_FOFB_21_PV_AREA_PREFIX=BO-18U: -CRATE_8_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 22 - BO-19U:DI-FOFB -CRATE_8_FOFB_22_PV_AREA_PREFIX=BO-19U: -CRATE_8_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 23 - BO-20U:DI-FOFB -CRATE_8_FOFB_23_PV_AREA_PREFIX=BO-20U: -CRATE_8_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 8 - FOFB slot 24 - XX-08SL24:DI-FOFB -CRATE_8_FOFB_24_PV_AREA_PREFIX=XX-08SL24: -CRATE_8_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 9 --- - -# Crate 9 - FOFB slot 1 - XX-09SL01:DI-FOFB -CRATE_9_FOFB_1_PV_AREA_PREFIX=XX-09SL01: -CRATE_9_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 2 - XX-09SL02:DI-FOFB -CRATE_9_FOFB_2_PV_AREA_PREFIX=XX-09SL02: -CRATE_9_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 3 - XX-09SL03:DI-FOFB -CRATE_9_FOFB_3_PV_AREA_PREFIX=XX-09SL03: -CRATE_9_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 4 - XX-09SL04:DI-FOFB -CRATE_9_FOFB_4_PV_AREA_PREFIX=XX-09SL04: -CRATE_9_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 5 - XX-09SL05:DI-FOFB -CRATE_9_FOFB_5_PV_AREA_PREFIX=XX-09SL05: -CRATE_9_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 6 - XX-09SL06:DI-FOFB -CRATE_9_FOFB_6_PV_AREA_PREFIX=XX-09SL06: -CRATE_9_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 7 - SI-09SAFE:DI-PFOFB-1 -CRATE_9_FOFB_7_PV_AREA_PREFIX=SI-09SAFE: -CRATE_9_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 9 - FOFB slot 8 - SI-09SAFE:DI-PFOFB-2 -CRATE_9_FOFB_8_PV_AREA_PREFIX=SI-09SAFE: -CRATE_9_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 9 - FOFB slot 9 - SI-09BCFE:DI-PFOFB-1 -CRATE_9_FOFB_9_PV_AREA_PREFIX=SI-09BCFE: -CRATE_9_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 9 - FOFB slot 10 - SI-09BCFE:DI-PFOFB-2 -CRATE_9_FOFB_10_PV_AREA_PREFIX=SI-09BCFE: -CRATE_9_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 9 - FOFB slot 11 - SI-09SA:DI-FOFB-1 -CRATE_9_FOFB_11_PV_AREA_PREFIX=SI-09SA: -CRATE_9_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 9 - FOFB slot 12 - SI-09SA:DI-FOFB-2 -CRATE_9_FOFB_12_PV_AREA_PREFIX=SI-09SA: -CRATE_9_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 9 - FOFB slot 13 - SI-09M1:DI-FOFB -CRATE_9_FOFB_13_PV_AREA_PREFIX=SI-09M1: -CRATE_9_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 14 - SI-09M2:DI-FOFB -CRATE_9_FOFB_14_PV_AREA_PREFIX=SI-09M2: -CRATE_9_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 15 - SI-09C1:DI-FOFB-1 -CRATE_9_FOFB_15_PV_AREA_PREFIX=SI-09C1: -CRATE_9_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 9 - FOFB slot 16 - SI-09C1:DI-FOFB-2 -CRATE_9_FOFB_16_PV_AREA_PREFIX=SI-09C1: -CRATE_9_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 9 - FOFB slot 17 - SI-09C2:DI-FOFB -CRATE_9_FOFB_17_PV_AREA_PREFIX=SI-09C2: -CRATE_9_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 18 - SI-09C3:DI-FOFB-1 -CRATE_9_FOFB_18_PV_AREA_PREFIX=SI-09C3: -CRATE_9_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 9 - FOFB slot 19 - SI-09C3:DI-FOFB-2 -CRATE_9_FOFB_19_PV_AREA_PREFIX=SI-09C3: -CRATE_9_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 9 - FOFB slot 20 - SI-09C4:DI-FOFB -CRATE_9_FOFB_20_PV_AREA_PREFIX=SI-09C4: -CRATE_9_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 21 - BO-21U:DI-FOFB -CRATE_9_FOFB_21_PV_AREA_PREFIX=BO-21U: -CRATE_9_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 22 - BO-22U:DI-FOFB -CRATE_9_FOFB_22_PV_AREA_PREFIX=BO-22U: -CRATE_9_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 23 - XX-09SL23:DI-FOFB -CRATE_9_FOFB_23_PV_AREA_PREFIX=XX-09SL23: -CRATE_9_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 9 - FOFB slot 24 - XX-09SL24:DI-FOFB -CRATE_9_FOFB_24_PV_AREA_PREFIX=XX-09SL24: -CRATE_9_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 10 --- - -# Crate 10 - FOFB slot 1 - XX-10SL01:DI-FOFB -CRATE_10_FOFB_1_PV_AREA_PREFIX=XX-10SL01: -CRATE_10_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 2 - XX-10SL02:DI-FOFB -CRATE_10_FOFB_2_PV_AREA_PREFIX=XX-10SL02: -CRATE_10_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 3 - XX-10SL03:DI-FOFB -CRATE_10_FOFB_3_PV_AREA_PREFIX=XX-10SL03: -CRATE_10_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 4 - XX-10SL04:DI-FOFB -CRATE_10_FOFB_4_PV_AREA_PREFIX=XX-10SL04: -CRATE_10_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 5 - XX-10SL05:DI-FOFB -CRATE_10_FOFB_5_PV_AREA_PREFIX=XX-10SL05: -CRATE_10_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 6 - XX-10SL06:DI-FOFB -CRATE_10_FOFB_6_PV_AREA_PREFIX=XX-10SL06: -CRATE_10_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 7 - SI-10SBFE:DI-PFOFB-1 -CRATE_10_FOFB_7_PV_AREA_PREFIX=SI-10SBFE: -CRATE_10_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 10 - FOFB slot 8 - SI-10SBFE:DI-PFOFB-2 -CRATE_10_FOFB_8_PV_AREA_PREFIX=SI-10SBFE: -CRATE_10_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 10 - FOFB slot 9 - SI-10BCFE:DI-PFOFB-1 -CRATE_10_FOFB_9_PV_AREA_PREFIX=SI-10BCFE: -CRATE_10_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 10 - FOFB slot 10 - SI-10BCFE:DI-PFOFB-2 -CRATE_10_FOFB_10_PV_AREA_PREFIX=SI-10BCFE: -CRATE_10_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 10 - FOFB slot 11 - SI-10SB:DI-FOFB-1 -CRATE_10_FOFB_11_PV_AREA_PREFIX=SI-10SB: -CRATE_10_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 10 - FOFB slot 12 - SI-10SB:DI-FOFB-2 -CRATE_10_FOFB_12_PV_AREA_PREFIX=SI-10SB: -CRATE_10_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 10 - FOFB slot 13 - SI-10M1:DI-FOFB -CRATE_10_FOFB_13_PV_AREA_PREFIX=SI-10M1: -CRATE_10_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 14 - SI-10M2:DI-FOFB -CRATE_10_FOFB_14_PV_AREA_PREFIX=SI-10M2: -CRATE_10_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 15 - SI-10C1:DI-FOFB-1 -CRATE_10_FOFB_15_PV_AREA_PREFIX=SI-10C1: -CRATE_10_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 10 - FOFB slot 16 - SI-10C1:DI-FOFB-2 -CRATE_10_FOFB_16_PV_AREA_PREFIX=SI-10C1: -CRATE_10_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 10 - FOFB slot 17 - SI-10C2:DI-FOFB -CRATE_10_FOFB_17_PV_AREA_PREFIX=SI-10C2: -CRATE_10_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 18 - SI-10C3:DI-FOFB-1 -CRATE_10_FOFB_18_PV_AREA_PREFIX=SI-10C3: -CRATE_10_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 10 - FOFB slot 19 - SI-10C3:DI-FOFB-2 -CRATE_10_FOFB_19_PV_AREA_PREFIX=SI-10C3: -CRATE_10_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 10 - FOFB slot 20 - SI-10C4:DI-FOFB -CRATE_10_FOFB_20_PV_AREA_PREFIX=SI-10C4: -CRATE_10_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 21 - BO-23U:DI-FOFB -CRATE_10_FOFB_21_PV_AREA_PREFIX=BO-23U: -CRATE_10_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 22 - BO-24U:DI-FOFB -CRATE_10_FOFB_22_PV_AREA_PREFIX=BO-24U: -CRATE_10_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 23 - BO-25U:DI-FOFB -CRATE_10_FOFB_23_PV_AREA_PREFIX=BO-25U: -CRATE_10_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 10 - FOFB slot 24 - XX-10SL24:DI-FOFB -CRATE_10_FOFB_24_PV_AREA_PREFIX=XX-10SL24: -CRATE_10_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 11 --- - -# Crate 11 - FOFB slot 1 - XX-11SL01:DI-FOFB -CRATE_11_FOFB_1_PV_AREA_PREFIX=XX-11SL01: -CRATE_11_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 2 - XX-11SL02:DI-FOFB -CRATE_11_FOFB_2_PV_AREA_PREFIX=XX-11SL02: -CRATE_11_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 3 - XX-11SL03:DI-FOFB -CRATE_11_FOFB_3_PV_AREA_PREFIX=XX-11SL03: -CRATE_11_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 4 - XX-11SL04:DI-FOFB -CRATE_11_FOFB_4_PV_AREA_PREFIX=XX-11SL04: -CRATE_11_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 5 - XX-11SL05:DI-FOFB -CRATE_11_FOFB_5_PV_AREA_PREFIX=XX-11SL05: -CRATE_11_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 6 - XX-11SL06:DI-FOFB -CRATE_11_FOFB_6_PV_AREA_PREFIX=XX-11SL06: -CRATE_11_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 7 - SI-11SPFE:DI-PFOFB-1 -CRATE_11_FOFB_7_PV_AREA_PREFIX=SI-11SPFE: -CRATE_11_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 11 - FOFB slot 8 - SI-11SPFE:DI-PFOFB-2 -CRATE_11_FOFB_8_PV_AREA_PREFIX=SI-11SPFE: -CRATE_11_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 11 - FOFB slot 9 - SI-11BCFE:DI-PFOFB-1 -CRATE_11_FOFB_9_PV_AREA_PREFIX=SI-11BCFE: -CRATE_11_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 11 - FOFB slot 10 - SI-11BCFE:DI-PFOFB-2 -CRATE_11_FOFB_10_PV_AREA_PREFIX=SI-11BCFE: -CRATE_11_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 11 - FOFB slot 11 - SI-11SP:DI-FOFB-1 -CRATE_11_FOFB_11_PV_AREA_PREFIX=SI-11SP: -CRATE_11_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 11 - FOFB slot 12 - SI-11SP:DI-FOFB-2 -CRATE_11_FOFB_12_PV_AREA_PREFIX=SI-11SP: -CRATE_11_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 11 - FOFB slot 13 - SI-11M1:DI-FOFB -CRATE_11_FOFB_13_PV_AREA_PREFIX=SI-11M1: -CRATE_11_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 14 - SI-11M2:DI-FOFB -CRATE_11_FOFB_14_PV_AREA_PREFIX=SI-11M2: -CRATE_11_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 15 - SI-11C1:DI-FOFB-1 -CRATE_11_FOFB_15_PV_AREA_PREFIX=SI-11C1: -CRATE_11_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 11 - FOFB slot 16 - SI-11C1:DI-FOFB-2 -CRATE_11_FOFB_16_PV_AREA_PREFIX=SI-11C1: -CRATE_11_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 11 - FOFB slot 17 - SI-11C2:DI-FOFB -CRATE_11_FOFB_17_PV_AREA_PREFIX=SI-11C2: -CRATE_11_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 18 - SI-11C3:DI-FOFB-1 -CRATE_11_FOFB_18_PV_AREA_PREFIX=SI-11C3: -CRATE_11_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 11 - FOFB slot 19 - SI-11C3:DI-FOFB-2 -CRATE_11_FOFB_19_PV_AREA_PREFIX=SI-11C3: -CRATE_11_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 11 - FOFB slot 20 - SI-11C4:DI-FOFB -CRATE_11_FOFB_20_PV_AREA_PREFIX=SI-11C4: -CRATE_11_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 21 - BO-26U:DI-FOFB -CRATE_11_FOFB_21_PV_AREA_PREFIX=BO-26U: -CRATE_11_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 22 - BO-27U:DI-FOFB -CRATE_11_FOFB_22_PV_AREA_PREFIX=BO-27U: -CRATE_11_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 23 - XX-11SL23:DI-FOFB -CRATE_11_FOFB_23_PV_AREA_PREFIX=XX-11SL23: -CRATE_11_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 11 - FOFB slot 24 - XX-11SL24:DI-FOFB -CRATE_11_FOFB_24_PV_AREA_PREFIX=XX-11SL24: -CRATE_11_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 12 --- - -# Crate 12 - FOFB slot 1 - XX-12SL01:DI-FOFB -CRATE_12_FOFB_1_PV_AREA_PREFIX=XX-12SL01: -CRATE_12_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 2 - XX-12SL02:DI-FOFB -CRATE_12_FOFB_2_PV_AREA_PREFIX=XX-12SL02: -CRATE_12_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 3 - XX-12SL03:DI-FOFB -CRATE_12_FOFB_3_PV_AREA_PREFIX=XX-12SL03: -CRATE_12_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 4 - XX-12SL04:DI-FOFB -CRATE_12_FOFB_4_PV_AREA_PREFIX=XX-12SL04: -CRATE_12_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 5 - XX-12SL05:DI-FOFB -CRATE_12_FOFB_5_PV_AREA_PREFIX=XX-12SL05: -CRATE_12_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 6 - XX-12SL06:DI-FOFB -CRATE_12_FOFB_6_PV_AREA_PREFIX=XX-12SL06: -CRATE_12_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 7 - SI-12SBFE:DI-PFOFB-1 -CRATE_12_FOFB_7_PV_AREA_PREFIX=SI-12SBFE: -CRATE_12_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 12 - FOFB slot 8 - SI-12SBFE:DI-PFOFB-2 -CRATE_12_FOFB_8_PV_AREA_PREFIX=SI-12SBFE: -CRATE_12_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 12 - FOFB slot 9 - SI-12BCFE:DI-PFOFB-1 -CRATE_12_FOFB_9_PV_AREA_PREFIX=SI-12BCFE: -CRATE_12_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 12 - FOFB slot 10 - SI-12BCFE:DI-PFOFB-2 -CRATE_12_FOFB_10_PV_AREA_PREFIX=SI-12BCFE: -CRATE_12_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 12 - FOFB slot 11 - SI-12SB:DI-FOFB-1 -CRATE_12_FOFB_11_PV_AREA_PREFIX=SI-12SB: -CRATE_12_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 12 - FOFB slot 12 - SI-12SB:DI-FOFB-2 -CRATE_12_FOFB_12_PV_AREA_PREFIX=SI-12SB: -CRATE_12_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 12 - FOFB slot 13 - SI-12M1:DI-FOFB -CRATE_12_FOFB_13_PV_AREA_PREFIX=SI-12M1: -CRATE_12_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 14 - SI-12M2:DI-FOFB -CRATE_12_FOFB_14_PV_AREA_PREFIX=SI-12M2: -CRATE_12_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 15 - SI-12C1:DI-FOFB-1 -CRATE_12_FOFB_15_PV_AREA_PREFIX=SI-12C1: -CRATE_12_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 12 - FOFB slot 16 - SI-12C1:DI-FOFB-2 -CRATE_12_FOFB_16_PV_AREA_PREFIX=SI-12C1: -CRATE_12_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 12 - FOFB slot 17 - SI-12C2:DI-FOFB -CRATE_12_FOFB_17_PV_AREA_PREFIX=SI-12C2: -CRATE_12_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 18 - SI-12C3:DI-FOFB-1 -CRATE_12_FOFB_18_PV_AREA_PREFIX=SI-12C3: -CRATE_12_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 12 - FOFB slot 19 - SI-12C3:DI-FOFB-2 -CRATE_12_FOFB_19_PV_AREA_PREFIX=SI-12C3: -CRATE_12_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 12 - FOFB slot 20 - SI-12C4:DI-FOFB -CRATE_12_FOFB_20_PV_AREA_PREFIX=SI-12C4: -CRATE_12_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 21 - BO-28U:DI-FOFB -CRATE_12_FOFB_21_PV_AREA_PREFIX=BO-28U: -CRATE_12_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 22 - BO-29U:DI-FOFB -CRATE_12_FOFB_22_PV_AREA_PREFIX=BO-29U: -CRATE_12_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 23 - BO-30U:DI-FOFB -CRATE_12_FOFB_23_PV_AREA_PREFIX=BO-30U: -CRATE_12_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 12 - FOFB slot 24 - XX-12SL24:DI-FOFB -CRATE_12_FOFB_24_PV_AREA_PREFIX=XX-12SL24: -CRATE_12_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 13 --- - -# Crate 13 - FOFB slot 1 - XX-13SL01:DI-FOFB -CRATE_13_FOFB_1_PV_AREA_PREFIX=XX-13SL01: -CRATE_13_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 2 - XX-13SL02:DI-FOFB -CRATE_13_FOFB_2_PV_AREA_PREFIX=XX-13SL02: -CRATE_13_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 3 - XX-13SL03:DI-FOFB -CRATE_13_FOFB_3_PV_AREA_PREFIX=XX-13SL03: -CRATE_13_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 4 - XX-13SL04:DI-FOFB -CRATE_13_FOFB_4_PV_AREA_PREFIX=XX-13SL04: -CRATE_13_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 5 - XX-13SL05:DI-FOFB -CRATE_13_FOFB_5_PV_AREA_PREFIX=XX-13SL05: -CRATE_13_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 6 - XX-13SL06:DI-FOFB -CRATE_13_FOFB_6_PV_AREA_PREFIX=XX-13SL06: -CRATE_13_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 7 - SI-13SAFE:DI-PFOFB-1 -CRATE_13_FOFB_7_PV_AREA_PREFIX=SI-13SAFE: -CRATE_13_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 13 - FOFB slot 8 - SI-13SAFE:DI-PFOFB-2 -CRATE_13_FOFB_8_PV_AREA_PREFIX=SI-13SAFE: -CRATE_13_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 13 - FOFB slot 9 - SI-13BCFE:DI-PFOFB-1 -CRATE_13_FOFB_9_PV_AREA_PREFIX=SI-13BCFE: -CRATE_13_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 13 - FOFB slot 10 - SI-13BCFE:DI-PFOFB-2 -CRATE_13_FOFB_10_PV_AREA_PREFIX=SI-13BCFE: -CRATE_13_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 13 - FOFB slot 11 - SI-13SA:DI-FOFB-1 -CRATE_13_FOFB_11_PV_AREA_PREFIX=SI-13SA: -CRATE_13_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 13 - FOFB slot 12 - SI-13SA:DI-FOFB-2 -CRATE_13_FOFB_12_PV_AREA_PREFIX=SI-13SA: -CRATE_13_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 13 - FOFB slot 13 - SI-13M1:DI-FOFB -CRATE_13_FOFB_13_PV_AREA_PREFIX=SI-13M1: -CRATE_13_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 14 - SI-13M2:DI-FOFB -CRATE_13_FOFB_14_PV_AREA_PREFIX=SI-13M2: -CRATE_13_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 15 - SI-13C1:DI-FOFB-1 -CRATE_13_FOFB_15_PV_AREA_PREFIX=SI-13C1: -CRATE_13_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 13 - FOFB slot 16 - SI-13C1:DI-FOFB-2 -CRATE_13_FOFB_16_PV_AREA_PREFIX=SI-13C1: -CRATE_13_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 13 - FOFB slot 17 - SI-13C2:DI-FOFB -CRATE_13_FOFB_17_PV_AREA_PREFIX=SI-13C2: -CRATE_13_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 18 - SI-13C3:DI-FOFB-1 -CRATE_13_FOFB_18_PV_AREA_PREFIX=SI-13C3: -CRATE_13_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 13 - FOFB slot 19 - SI-13C3:DI-FOFB-2 -CRATE_13_FOFB_19_PV_AREA_PREFIX=SI-13C3: -CRATE_13_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 13 - FOFB slot 20 - SI-13C4:DI-FOFB -CRATE_13_FOFB_20_PV_AREA_PREFIX=SI-13C4: -CRATE_13_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 21 - BO-31U:DI-FOFB -CRATE_13_FOFB_21_PV_AREA_PREFIX=BO-31U: -CRATE_13_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 22 - BO-32U:DI-FOFB -CRATE_13_FOFB_22_PV_AREA_PREFIX=BO-32U: -CRATE_13_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 23 - XX-13SL23:DI-FOFB -CRATE_13_FOFB_23_PV_AREA_PREFIX=XX-13SL23: -CRATE_13_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 13 - FOFB slot 24 - XX-13SL24:DI-FOFB -CRATE_13_FOFB_24_PV_AREA_PREFIX=XX-13SL24: -CRATE_13_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 14 --- - -# Crate 14 - FOFB slot 1 - XX-14SL01:DI-FOFB -CRATE_14_FOFB_1_PV_AREA_PREFIX=XX-14SL01: -CRATE_14_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 2 - XX-14SL02:DI-FOFB -CRATE_14_FOFB_2_PV_AREA_PREFIX=XX-14SL02: -CRATE_14_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 3 - XX-14SL03:DI-FOFB -CRATE_14_FOFB_3_PV_AREA_PREFIX=XX-14SL03: -CRATE_14_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 4 - XX-14SL04:DI-FOFB -CRATE_14_FOFB_4_PV_AREA_PREFIX=XX-14SL04: -CRATE_14_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 5 - XX-14SL05:DI-FOFB -CRATE_14_FOFB_5_PV_AREA_PREFIX=XX-14SL05: -CRATE_14_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 6 - XX-14SL06:DI-FOFB -CRATE_14_FOFB_6_PV_AREA_PREFIX=XX-14SL06: -CRATE_14_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 7 - SI-14SBFE:DI-PFOFB-1 -CRATE_14_FOFB_7_PV_AREA_PREFIX=SI-14SBFE: -CRATE_14_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 14 - FOFB slot 8 - SI-14SBFE:DI-PFOFB-2 -CRATE_14_FOFB_8_PV_AREA_PREFIX=SI-14SBFE: -CRATE_14_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 14 - FOFB slot 9 - SI-14BCFE:DI-PFOFB-1 -CRATE_14_FOFB_9_PV_AREA_PREFIX=SI-14BCFE: -CRATE_14_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 14 - FOFB slot 10 - SI-14BCFE:DI-PFOFB-2 -CRATE_14_FOFB_10_PV_AREA_PREFIX=SI-14BCFE: -CRATE_14_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 14 - FOFB slot 11 - SI-14SB:DI-FOFB-1 -CRATE_14_FOFB_11_PV_AREA_PREFIX=SI-14SB: -CRATE_14_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 14 - FOFB slot 12 - SI-14SB:DI-FOFB-2 -CRATE_14_FOFB_12_PV_AREA_PREFIX=SI-14SB: -CRATE_14_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 14 - FOFB slot 13 - SI-14M1:DI-FOFB -CRATE_14_FOFB_13_PV_AREA_PREFIX=SI-14M1: -CRATE_14_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 14 - SI-14M2:DI-FOFB -CRATE_14_FOFB_14_PV_AREA_PREFIX=SI-14M2: -CRATE_14_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 15 - SI-14C1:DI-FOFB-1 -CRATE_14_FOFB_15_PV_AREA_PREFIX=SI-14C1: -CRATE_14_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 14 - FOFB slot 16 - SI-14C1:DI-FOFB-2 -CRATE_14_FOFB_16_PV_AREA_PREFIX=SI-14C1: -CRATE_14_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 14 - FOFB slot 17 - SI-14C2:DI-FOFB -CRATE_14_FOFB_17_PV_AREA_PREFIX=SI-14C2: -CRATE_14_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 18 - SI-14C3:DI-FOFB-1 -CRATE_14_FOFB_18_PV_AREA_PREFIX=SI-14C3: -CRATE_14_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 14 - FOFB slot 19 - SI-14C3:DI-FOFB-2 -CRATE_14_FOFB_19_PV_AREA_PREFIX=SI-14C3: -CRATE_14_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 14 - FOFB slot 20 - SI-14C4:DI-FOFB -CRATE_14_FOFB_20_PV_AREA_PREFIX=SI-14C4: -CRATE_14_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 21 - BO-33U:DI-FOFB -CRATE_14_FOFB_21_PV_AREA_PREFIX=BO-33U: -CRATE_14_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 22 - BO-34U:DI-FOFB -CRATE_14_FOFB_22_PV_AREA_PREFIX=BO-34U: -CRATE_14_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 23 - BO-35U:DI-FOFB -CRATE_14_FOFB_23_PV_AREA_PREFIX=BO-35U: -CRATE_14_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 14 - FOFB slot 24 - XX-14SL24:DI-FOFB -CRATE_14_FOFB_24_PV_AREA_PREFIX=XX-14SL24: -CRATE_14_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 15 --- - -# Crate 15 - FOFB slot 1 - XX-15SL01:DI-FOFB -CRATE_15_FOFB_1_PV_AREA_PREFIX=XX-15SL01: -CRATE_15_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 2 - XX-15SL02:DI-FOFB -CRATE_15_FOFB_2_PV_AREA_PREFIX=XX-15SL02: -CRATE_15_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 3 - XX-15SL03:DI-FOFB -CRATE_15_FOFB_3_PV_AREA_PREFIX=XX-15SL03: -CRATE_15_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 4 - XX-15SL04:DI-FOFB -CRATE_15_FOFB_4_PV_AREA_PREFIX=XX-15SL04: -CRATE_15_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 5 - XX-15SL05:DI-FOFB -CRATE_15_FOFB_5_PV_AREA_PREFIX=XX-15SL05: -CRATE_15_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 6 - XX-15SL06:DI-FOFB -CRATE_15_FOFB_6_PV_AREA_PREFIX=XX-15SL06: -CRATE_15_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 7 - SI-15SPFE:DI-PFOFB-1 -CRATE_15_FOFB_7_PV_AREA_PREFIX=SI-15SPFE: -CRATE_15_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 15 - FOFB slot 8 - SI-15SPFE:DI-PFOFB-2 -CRATE_15_FOFB_8_PV_AREA_PREFIX=SI-15SPFE: -CRATE_15_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 15 - FOFB slot 9 - SI-15BCFE:DI-PFOFB-1 -CRATE_15_FOFB_9_PV_AREA_PREFIX=SI-15BCFE: -CRATE_15_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 15 - FOFB slot 10 - SI-15BCFE:DI-PFOFB-2 -CRATE_15_FOFB_10_PV_AREA_PREFIX=SI-15BCFE: -CRATE_15_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 15 - FOFB slot 11 - SI-15SP:DI-FOFB-1 -CRATE_15_FOFB_11_PV_AREA_PREFIX=SI-15SP: -CRATE_15_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 15 - FOFB slot 12 - SI-15SP:DI-FOFB-2 -CRATE_15_FOFB_12_PV_AREA_PREFIX=SI-15SP: -CRATE_15_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 15 - FOFB slot 13 - SI-15M1:DI-FOFB -CRATE_15_FOFB_13_PV_AREA_PREFIX=SI-15M1: -CRATE_15_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 14 - SI-15M2:DI-FOFB -CRATE_15_FOFB_14_PV_AREA_PREFIX=SI-15M2: -CRATE_15_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 15 - SI-15C1:DI-FOFB-1 -CRATE_15_FOFB_15_PV_AREA_PREFIX=SI-15C1: -CRATE_15_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 15 - FOFB slot 16 - SI-15C1:DI-FOFB-2 -CRATE_15_FOFB_16_PV_AREA_PREFIX=SI-15C1: -CRATE_15_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 15 - FOFB slot 17 - SI-15C2:DI-FOFB -CRATE_15_FOFB_17_PV_AREA_PREFIX=SI-15C2: -CRATE_15_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 18 - SI-15C3:DI-FOFB-1 -CRATE_15_FOFB_18_PV_AREA_PREFIX=SI-15C3: -CRATE_15_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 15 - FOFB slot 19 - SI-15C3:DI-FOFB-2 -CRATE_15_FOFB_19_PV_AREA_PREFIX=SI-15C3: -CRATE_15_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 15 - FOFB slot 20 - SI-15C4:DI-FOFB -CRATE_15_FOFB_20_PV_AREA_PREFIX=SI-15C4: -CRATE_15_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 21 - BO-36U:DI-FOFB -CRATE_15_FOFB_21_PV_AREA_PREFIX=BO-36U: -CRATE_15_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 22 - BO-37U:DI-FOFB -CRATE_15_FOFB_22_PV_AREA_PREFIX=BO-37U: -CRATE_15_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 23 - XX-15SL23:DI-FOFB -CRATE_15_FOFB_23_PV_AREA_PREFIX=XX-15SL23: -CRATE_15_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 15 - FOFB slot 24 - XX-15SL24:DI-FOFB -CRATE_15_FOFB_24_PV_AREA_PREFIX=XX-15SL24: -CRATE_15_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 16 --- - -# Crate 16 - FOFB slot 1 - XX-16SL01:DI-FOFB -CRATE_16_FOFB_1_PV_AREA_PREFIX=XX-16SL01: -CRATE_16_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 2 - XX-16SL02:DI-FOFB -CRATE_16_FOFB_2_PV_AREA_PREFIX=XX-16SL02: -CRATE_16_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 3 - XX-16SL03:DI-FOFB -CRATE_16_FOFB_3_PV_AREA_PREFIX=XX-16SL03: -CRATE_16_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 4 - XX-16SL04:DI-FOFB -CRATE_16_FOFB_4_PV_AREA_PREFIX=XX-16SL04: -CRATE_16_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 5 - XX-16SL05:DI-FOFB -#CRATE_16_FOFB_5_PV_AREA_PREFIX=XX-16SL05: -#CRATE_16_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: -CRATE_16_FOFB_5_PV_AREA_PREFIX=SI-16C3: -CRATE_16_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 16 - FOFB slot 6 - XX-16SL06:DI-FOFB -#CRATE_16_FOFB_6_PV_AREA_PREFIX=XX-16SL06: -#CRATE_16_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: -CRATE_16_FOFB_6_PV_AREA_PREFIX=SI-16C4: -CRATE_16_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 7 - SI-16SBFE:DI-PFOFB-1 -CRATE_16_FOFB_7_PV_AREA_PREFIX=SI-16SBFE: -CRATE_16_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 16 - FOFB slot 8 - SI-16SBFE:DI-PFOFB-2 -CRATE_16_FOFB_8_PV_AREA_PREFIX=SI-16SBFE: -CRATE_16_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 16 - FOFB slot 9 - SI-16BCFE:DI-PFOFB-1 -CRATE_16_FOFB_9_PV_AREA_PREFIX=SI-16BCFE: -CRATE_16_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 16 - FOFB slot 10 - SI-16BCFE:DI-PFOFB-2 -CRATE_16_FOFB_10_PV_AREA_PREFIX=SI-16BCFE: -CRATE_16_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 16 - FOFB slot 11 - SI-16SB:DI-FOFB-1 -CRATE_16_FOFB_11_PV_AREA_PREFIX=SI-16SB: -CRATE_16_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 16 - FOFB slot 12 - SI-16SB:DI-FOFB-2 -CRATE_16_FOFB_12_PV_AREA_PREFIX=SI-16SB: -CRATE_16_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 16 - FOFB slot 13 - SI-16M1:DI-FOFB -CRATE_16_FOFB_13_PV_AREA_PREFIX=SI-16M1: -CRATE_16_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 14 - SI-16M2:DI-FOFB -CRATE_16_FOFB_14_PV_AREA_PREFIX=SI-16M2: -CRATE_16_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 15 - SI-16C1:DI-FOFB-1 -CRATE_16_FOFB_15_PV_AREA_PREFIX=SI-16C1: -CRATE_16_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 16 - FOFB slot 16 - SI-16C1:DI-FOFB-2 -CRATE_16_FOFB_16_PV_AREA_PREFIX=SI-16C1: -CRATE_16_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 16 - FOFB slot 17 - SI-16C2:DI-FOFB -CRATE_16_FOFB_17_PV_AREA_PREFIX=SI-16C2: -CRATE_16_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 18 - SI-16C3:DI-FOFB-1 -CRATE_16_FOFB_18_PV_AREA_PREFIX=SI-16C3: -CRATE_16_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 16 - FOFB slot 19 - SI-16C3:DI-FOFB-2 -#CRATE_16_FOFB_19_PV_AREA_PREFIX=SI-16C3: -#CRATE_16_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: -CRATE_16_FOFB_19_PV_AREA_PREFIX=XX-16SL05: -CRATE_16_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 20 - SI-16C4:DI-FOFB -#CRATE_16_FOFB_20_PV_AREA_PREFIX=SI-16C4: -#CRATE_16_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: -CRATE_16_FOFB_20_PV_AREA_PREFIX=XX-16SL06: -CRATE_16_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 21 - BO-38U:DI-FOFB -CRATE_16_FOFB_21_PV_AREA_PREFIX=BO-38U: -CRATE_16_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 22 - BO-39U:DI-FOFB -CRATE_16_FOFB_22_PV_AREA_PREFIX=BO-39U: -CRATE_16_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 23 - BO-40U:DI-FOFB -CRATE_16_FOFB_23_PV_AREA_PREFIX=BO-40U: -CRATE_16_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 16 - FOFB slot 24 - XX-16SL24:DI-FOFB -CRATE_16_FOFB_24_PV_AREA_PREFIX=XX-16SL24: -CRATE_16_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 17 --- - -# Crate 17 - FOFB slot 1 - XX-17SL01:DI-FOFB -CRATE_17_FOFB_1_PV_AREA_PREFIX=XX-17SL01: -CRATE_17_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 2 - XX-17SL02:DI-FOFB -CRATE_17_FOFB_2_PV_AREA_PREFIX=XX-17SL02: -CRATE_17_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 3 - XX-17SL03:DI-FOFB -CRATE_17_FOFB_3_PV_AREA_PREFIX=XX-17SL03: -CRATE_17_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 4 - XX-17SL04:DI-FOFB -CRATE_17_FOFB_4_PV_AREA_PREFIX=XX-17SL04: -CRATE_17_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 5 - XX-17SL05:DI-FOFB -CRATE_17_FOFB_5_PV_AREA_PREFIX=XX-17SL05: -CRATE_17_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 6 - XX-17SL06:DI-FOFB -CRATE_17_FOFB_6_PV_AREA_PREFIX=XX-17SL06: -CRATE_17_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 7 - SI-17SAFE:DI-PFOFB-1 -CRATE_17_FOFB_7_PV_AREA_PREFIX=SI-17SAFE: -CRATE_17_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 17 - FOFB slot 8 - SI-17SAFE:DI-PFOFB-2 -CRATE_17_FOFB_8_PV_AREA_PREFIX=SI-17SAFE: -CRATE_17_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 17 - FOFB slot 9 - SI-17BCFE:DI-PFOFB-1 -CRATE_17_FOFB_9_PV_AREA_PREFIX=SI-17BCFE: -CRATE_17_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 17 - FOFB slot 10 - SI-17BCFE:DI-PFOFB-2 -CRATE_17_FOFB_10_PV_AREA_PREFIX=SI-17BCFE: -CRATE_17_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 17 - FOFB slot 11 - SI-17SA:DI-FOFB-1 -CRATE_17_FOFB_11_PV_AREA_PREFIX=SI-17SA: -CRATE_17_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 17 - FOFB slot 12 - SI-17SA:DI-FOFB-2 -CRATE_17_FOFB_12_PV_AREA_PREFIX=SI-17SA: -CRATE_17_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 17 - FOFB slot 13 - SI-17M1:DI-FOFB -CRATE_17_FOFB_13_PV_AREA_PREFIX=SI-17M1: -CRATE_17_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 14 - SI-17M2:DI-FOFB -CRATE_17_FOFB_14_PV_AREA_PREFIX=SI-17M2: -CRATE_17_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 15 - SI-17C1:DI-FOFB-1 -CRATE_17_FOFB_15_PV_AREA_PREFIX=SI-17C1: -CRATE_17_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 17 - FOFB slot 16 - SI-17C1:DI-FOFB-2 -CRATE_17_FOFB_16_PV_AREA_PREFIX=SI-17C1: -CRATE_17_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 17 - FOFB slot 17 - SI-17C2:DI-FOFB -CRATE_17_FOFB_17_PV_AREA_PREFIX=SI-17C2: -CRATE_17_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 18 - SI-17C3:DI-FOFB-1 -CRATE_17_FOFB_18_PV_AREA_PREFIX=SI-17C3: -CRATE_17_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 17 - FOFB slot 19 - SI-17C3:DI-FOFB-2 -CRATE_17_FOFB_19_PV_AREA_PREFIX=SI-17C3: -CRATE_17_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 17 - FOFB slot 20 - SI-17C4:DI-FOFB -CRATE_17_FOFB_20_PV_AREA_PREFIX=SI-17C4: -CRATE_17_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 21 - BO-41U:DI-FOFB -CRATE_17_FOFB_21_PV_AREA_PREFIX=BO-41U: -CRATE_17_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 22 - BO-42U:DI-FOFB -CRATE_17_FOFB_22_PV_AREA_PREFIX=BO-42U: -CRATE_17_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 23 - XX-17SL23:DI-FOFB -CRATE_17_FOFB_23_PV_AREA_PREFIX=XX-17SL23: -CRATE_17_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 17 - FOFB slot 24 - XX-17SL24:DI-FOFB -CRATE_17_FOFB_24_PV_AREA_PREFIX=XX-17SL24: -CRATE_17_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 18 --- - -# Crate 18 - FOFB slot 1 - XX-18SL01:DI-FOFB -CRATE_18_FOFB_1_PV_AREA_PREFIX=XX-18SL01: -CRATE_18_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 2 - XX-18SL02:DI-FOFB -CRATE_18_FOFB_2_PV_AREA_PREFIX=XX-18SL02: -CRATE_18_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 3 - XX-18SL03:DI-FOFB -CRATE_18_FOFB_3_PV_AREA_PREFIX=XX-18SL03: -CRATE_18_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 4 - XX-18SL04:DI-FOFB -CRATE_18_FOFB_4_PV_AREA_PREFIX=XX-18SL04: -CRATE_18_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 5 - XX-18SL05:DI-FOFB -CRATE_18_FOFB_5_PV_AREA_PREFIX=XX-18SL05: -CRATE_18_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 6 - XX-18SL06:DI-FOFB -CRATE_18_FOFB_6_PV_AREA_PREFIX=XX-18SL06: -CRATE_18_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 7 - SI-18SBFE:DI-PFOFB-1 -CRATE_18_FOFB_7_PV_AREA_PREFIX=SI-18SBFE: -CRATE_18_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 18 - FOFB slot 8 - SI-18SBFE:DI-PFOFB-2 -CRATE_18_FOFB_8_PV_AREA_PREFIX=SI-18SBFE: -CRATE_18_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 18 - FOFB slot 9 - SI-18BCFE:DI-PFOFB-1 -CRATE_18_FOFB_9_PV_AREA_PREFIX=SI-18BCFE: -CRATE_18_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 18 - FOFB slot 10 - SI-18BCFE:DI-PFOFB-2 -CRATE_18_FOFB_10_PV_AREA_PREFIX=SI-18BCFE: -CRATE_18_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 18 - FOFB slot 11 - SI-18SB:DI-FOFB-1 -CRATE_18_FOFB_11_PV_AREA_PREFIX=SI-18SB: -CRATE_18_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 18 - FOFB slot 12 - SI-18SB:DI-FOFB-2 -CRATE_18_FOFB_12_PV_AREA_PREFIX=SI-18SB: -CRATE_18_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 18 - FOFB slot 13 - SI-18M1:DI-FOFB -CRATE_18_FOFB_13_PV_AREA_PREFIX=SI-18M1: -CRATE_18_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 14 - SI-18M2:DI-FOFB -CRATE_18_FOFB_14_PV_AREA_PREFIX=SI-18M2: -CRATE_18_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 15 - SI-18C1:DI-FOFB-1 -CRATE_18_FOFB_15_PV_AREA_PREFIX=SI-18C1: -CRATE_18_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 18 - FOFB slot 16 - SI-18C1:DI-FOFB-2 -CRATE_18_FOFB_16_PV_AREA_PREFIX=SI-18C1: -CRATE_18_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 18 - FOFB slot 17 - SI-18C2:DI-FOFB -CRATE_18_FOFB_17_PV_AREA_PREFIX=SI-18C2: -CRATE_18_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 18 - SI-18C3:DI-FOFB-1 -CRATE_18_FOFB_18_PV_AREA_PREFIX=SI-18C3: -CRATE_18_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 18 - FOFB slot 19 - SI-18C3:DI-FOFB-2 -CRATE_18_FOFB_19_PV_AREA_PREFIX=SI-18C3: -CRATE_18_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 18 - FOFB slot 20 - SI-18C4:DI-FOFB -CRATE_18_FOFB_20_PV_AREA_PREFIX=SI-18C4: -CRATE_18_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 21 - BO-43U:DI-FOFB -CRATE_18_FOFB_21_PV_AREA_PREFIX=BO-43U: -CRATE_18_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 22 - BO-44U:DI-FOFB -CRATE_18_FOFB_22_PV_AREA_PREFIX=BO-44U: -CRATE_18_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 23 - BO-45U:DI-FOFB -CRATE_18_FOFB_23_PV_AREA_PREFIX=BO-45U: -CRATE_18_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 18 - FOFB slot 24 - XX-18SL24:DI-FOFB -CRATE_18_FOFB_24_PV_AREA_PREFIX=XX-18SL24: -CRATE_18_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 19 --- - -# Crate 19 - FOFB slot 1 - XX-19SL01:DI-FOFB -CRATE_19_FOFB_1_PV_AREA_PREFIX=XX-19SL01: -CRATE_19_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 2 - XX-19SL02:DI-FOFB -CRATE_19_FOFB_2_PV_AREA_PREFIX=XX-19SL02: -CRATE_19_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 3 - XX-19SL03:DI-FOFB -CRATE_19_FOFB_3_PV_AREA_PREFIX=XX-19SL03: -CRATE_19_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 4 - XX-19SL04:DI-FOFB -CRATE_19_FOFB_4_PV_AREA_PREFIX=XX-19SL04: -CRATE_19_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 5 - XX-19SL05:DI-FOFB -CRATE_19_FOFB_5_PV_AREA_PREFIX=XX-19SL05: -CRATE_19_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 6 - XX-19SL06:DI-FOFB -CRATE_19_FOFB_6_PV_AREA_PREFIX=XX-19SL06: -CRATE_19_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 7 - SI-19SPFE:DI-PFOFB-1 -CRATE_19_FOFB_7_PV_AREA_PREFIX=SI-19SPFE: -CRATE_19_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 19 - FOFB slot 8 - SI-19SPFE:DI-PFOFB-2 -CRATE_19_FOFB_8_PV_AREA_PREFIX=SI-19SPFE: -CRATE_19_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 19 - FOFB slot 9 - SI-19BCFE:DI-PFOFB-1 -CRATE_19_FOFB_9_PV_AREA_PREFIX=SI-19BCFE: -CRATE_19_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 19 - FOFB slot 10 - SI-19BCFE:DI-PFOFB-2 -CRATE_19_FOFB_10_PV_AREA_PREFIX=SI-19BCFE: -CRATE_19_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 19 - FOFB slot 11 - SI-19SP:DI-FOFB-1 -CRATE_19_FOFB_11_PV_AREA_PREFIX=SI-19SP: -CRATE_19_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 19 - FOFB slot 12 - SI-19SP:DI-FOFB-2 -CRATE_19_FOFB_12_PV_AREA_PREFIX=SI-19SP: -CRATE_19_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 19 - FOFB slot 13 - SI-19M1:DI-FOFB -CRATE_19_FOFB_13_PV_AREA_PREFIX=SI-19M1: -CRATE_19_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 14 - SI-19M2:DI-FOFB -CRATE_19_FOFB_14_PV_AREA_PREFIX=SI-19M2: -CRATE_19_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 15 - SI-19C1:DI-FOFB-1 -CRATE_19_FOFB_15_PV_AREA_PREFIX=SI-19C1: -CRATE_19_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 19 - FOFB slot 16 - SI-19C1:DI-FOFB-2 -CRATE_19_FOFB_16_PV_AREA_PREFIX=SI-19C1: -CRATE_19_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 19 - FOFB slot 17 - SI-19C2:DI-FOFB -CRATE_19_FOFB_17_PV_AREA_PREFIX=SI-19C2: -CRATE_19_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 18 - SI-19C3:DI-FOFB-1 -CRATE_19_FOFB_18_PV_AREA_PREFIX=SI-19C3: -CRATE_19_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 19 - FOFB slot 19 - SI-19C3:DI-FOFB-2 -CRATE_19_FOFB_19_PV_AREA_PREFIX=SI-19C3: -CRATE_19_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 19 - FOFB slot 20 - SI-19C4:DI-FOFB -CRATE_19_FOFB_20_PV_AREA_PREFIX=SI-19C4: -CRATE_19_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 21 - BO-46U:DI-FOFB -CRATE_19_FOFB_21_PV_AREA_PREFIX=BO-46U: -CRATE_19_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 22 - BO-47U:DI-FOFB -CRATE_19_FOFB_22_PV_AREA_PREFIX=BO-47U: -CRATE_19_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 23 - XX-19SL23:DI-FOFB -CRATE_19_FOFB_23_PV_AREA_PREFIX=XX-19SL23: -CRATE_19_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 19 - FOFB slot 24 - XX-19SL24:DI-FOFB -CRATE_19_FOFB_24_PV_AREA_PREFIX=XX-19SL24: -CRATE_19_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 20 --- - -# Crate 20 - FOFB slot 1 - XX-20SL01:DI-FOFB -CRATE_20_FOFB_1_PV_AREA_PREFIX=XX-20SL01: -CRATE_20_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 2 - XX-20SL02:DI-FOFB -CRATE_20_FOFB_2_PV_AREA_PREFIX=XX-20SL02: -CRATE_20_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 3 - XX-20SL03:DI-FOFB -CRATE_20_FOFB_3_PV_AREA_PREFIX=XX-20SL03: -CRATE_20_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 4 - XX-20SL04:DI-FOFB -CRATE_20_FOFB_4_PV_AREA_PREFIX=XX-20SL04: -CRATE_20_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 5 - XX-20SL05:DI-FOFB -CRATE_20_FOFB_5_PV_AREA_PREFIX=XX-20SL05: -CRATE_20_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 6 - XX-20SL06:DI-FOFB -CRATE_20_FOFB_6_PV_AREA_PREFIX=XX-20SL06: -CRATE_20_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 7 - SI-20SBFE:DI-PFOFB-1 -CRATE_20_FOFB_7_PV_AREA_PREFIX=SI-20SBFE: -CRATE_20_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 20 - FOFB slot 8 - SI-20SBFE:DI-PFOFB-2 -CRATE_20_FOFB_8_PV_AREA_PREFIX=SI-20SBFE: -CRATE_20_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 20 - FOFB slot 9 - SI-20BCFE:DI-PFOFB-1 -CRATE_20_FOFB_9_PV_AREA_PREFIX=SI-20BCFE: -CRATE_20_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB-1: - -# Crate 20 - FOFB slot 10 - SI-20BCFE:DI-PFOFB-2 -CRATE_20_FOFB_10_PV_AREA_PREFIX=SI-20BCFE: -CRATE_20_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB-2: - -# Crate 20 - FOFB slot 11 - SI-20SB:DI-FOFB-1 -CRATE_20_FOFB_11_PV_AREA_PREFIX=SI-20SB: -CRATE_20_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 20 - FOFB slot 12 - SI-20SB:DI-FOFB-2 -CRATE_20_FOFB_12_PV_AREA_PREFIX=SI-20SB: -CRATE_20_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 20 - FOFB slot 13 - SI-20M1:DI-FOFB -CRATE_20_FOFB_13_PV_AREA_PREFIX=SI-20M1: -CRATE_20_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 14 - SI-20M2:DI-FOFB -CRATE_20_FOFB_14_PV_AREA_PREFIX=SI-20M2: -CRATE_20_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 15 - SI-20C1:DI-FOFB-1 -CRATE_20_FOFB_15_PV_AREA_PREFIX=SI-20C1: -CRATE_20_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 20 - FOFB slot 16 - SI-20C1:DI-FOFB-2 -CRATE_20_FOFB_16_PV_AREA_PREFIX=SI-20C1: -CRATE_20_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 20 - FOFB slot 17 - SI-20C2:DI-FOFB -CRATE_20_FOFB_17_PV_AREA_PREFIX=SI-20C2: -CRATE_20_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 18 - SI-20C3:DI-FOFB-1 -CRATE_20_FOFB_18_PV_AREA_PREFIX=SI-20C3: -CRATE_20_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 20 - FOFB slot 19 - SI-20C3:DI-FOFB-2 -CRATE_20_FOFB_19_PV_AREA_PREFIX=SI-20C3: -CRATE_20_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 20 - FOFB slot 20 - SI-20C4:DI-FOFB -CRATE_20_FOFB_20_PV_AREA_PREFIX=SI-20C4: -CRATE_20_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 21 - BO-48U:DI-FOFB -CRATE_20_FOFB_21_PV_AREA_PREFIX=BO-48U: -CRATE_20_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 22 - BO-49U:DI-FOFB -CRATE_20_FOFB_22_PV_AREA_PREFIX=BO-49U: -CRATE_20_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 23 - BO-50U:DI-FOFB -CRATE_20_FOFB_23_PV_AREA_PREFIX=BO-50U: -CRATE_20_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 20 - FOFB slot 24 - XX-20SL24:DI-FOFB -CRATE_20_FOFB_24_PV_AREA_PREFIX=XX-20SL24: -CRATE_20_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - - -# --- CRATE 21 --- - -# Crate 21 - FOFB slot 1 - XX-21SL01:DI-FOFB -CRATE_21_FOFB_1_PV_AREA_PREFIX=XX-21SL01: -CRATE_21_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 2 - XX-21SL02:DI-FOFB -CRATE_21_FOFB_2_PV_AREA_PREFIX=XX-21SL02: -CRATE_21_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 3 - XX-21SL03:DI-FOFB -CRATE_21_FOFB_3_PV_AREA_PREFIX=XX-21SL03: -CRATE_21_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 4 - XX-21SL04:DI-FOFB -CRATE_21_FOFB_4_PV_AREA_PREFIX=XX-21SL04: -CRATE_21_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 5 - XX-21SL05:DI-FOFB -CRATE_21_FOFB_5_PV_AREA_PREFIX=XX-21SL05: -CRATE_21_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 6 - XX-21SL06:DI-FOFB -CRATE_21_FOFB_6_PV_AREA_PREFIX=XX-21SL06: -CRATE_21_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 7 - XX-21SL07:DI-FOFB -CRATE_21_FOFB_7_PV_AREA_PREFIX=XX-21SL07: -CRATE_21_FOFB_7_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 8 - XX-21SL08:DI-FOFB -CRATE_21_FOFB_8_PV_AREA_PREFIX=XX-21SL08: -CRATE_21_FOFB_8_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 9 - XX-21SL09:DI-FOFB -CRATE_21_FOFB_9_PV_AREA_PREFIX=XX-21SL09: -CRATE_21_FOFB_9_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 10 - XX-21SL10:DI-FOFB -CRATE_21_FOFB_10_PV_AREA_PREFIX=XX-21SL10: -CRATE_21_FOFB_10_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 11 - TB-01:DI-FOFB-1 -CRATE_21_FOFB_11_PV_AREA_PREFIX=TB-01: -CRATE_21_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 21 - FOFB slot 12 - TB-01:DI-FOFB-2 -CRATE_21_FOFB_12_PV_AREA_PREFIX=TB-01: -CRATE_21_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 21 - FOFB slot 13 - TB-02:DI-FOFB-1 -CRATE_21_FOFB_13_PV_AREA_PREFIX=TB-02: -CRATE_21_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 21 - FOFB slot 14 - TB-02:DI-FOFB-2 -CRATE_21_FOFB_14_PV_AREA_PREFIX=TB-02: -CRATE_21_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 21 - FOFB slot 15 - TB-03:DI-FOFB -CRATE_21_FOFB_15_PV_AREA_PREFIX=TB-03: -CRATE_21_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 16 - TB-04:DI-FOFB -CRATE_21_FOFB_16_PV_AREA_PREFIX=TB-04: -CRATE_21_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 17 - TS-01:DI-FOFB -CRATE_21_FOFB_17_PV_AREA_PREFIX=TS-01: -CRATE_21_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 18 - TS-02:DI-FOFB -CRATE_21_FOFB_18_PV_AREA_PREFIX=TS-02: -CRATE_21_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 19 - TS-03:DI-FOFB -CRATE_21_FOFB_19_PV_AREA_PREFIX=TS-03: -CRATE_21_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 20 - TS-04:DI-FOFB-1 -CRATE_21_FOFB_20_PV_AREA_PREFIX=TS-04: -CRATE_21_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB-1: - -# Crate 21 - FOFB slot 21 - TS-04:DI-FOFB-2 -CRATE_21_FOFB_21_PV_AREA_PREFIX=TS-04: -CRATE_21_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB-2: - -# Crate 21 - FOFB slot 22 - XX-21SL22:DI-FOFB -CRATE_21_FOFB_22_PV_AREA_PREFIX=XX-21SL22: -CRATE_21_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 23 - XX-21SL23:DI-FOFB -CRATE_21_FOFB_23_PV_AREA_PREFIX=XX-21SL23: -CRATE_21_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 21 - FOFB slot 24 - XX-21SL24:DI-FOFB -CRATE_21_FOFB_24_PV_AREA_PREFIX=XX-21SL24: -CRATE_21_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: - -# --- CRATE 22 --- - -# Crate 22 - FOFB slot 1 - XX-22SL01:DI-FOFB -CRATE_22_FOFB_1_PV_AREA_PREFIX=XX-22SL01: -CRATE_22_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 2 - XX-22SL02:DI-FOFB -CRATE_22_FOFB_2_PV_AREA_PREFIX=XX-22SL02: -CRATE_22_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 3 - XX-22SL03:DI-FOFB -CRATE_22_FOFB_3_PV_AREA_PREFIX=XX-22SL03: -CRATE_22_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 4 - XX-22SL04:DI-FOFB -CRATE_22_FOFB_4_PV_AREA_PREFIX=XX-22SL04: -CRATE_22_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 5 - XX-22SL05:DI-FOFB -CRATE_22_FOFB_5_PV_AREA_PREFIX=XX-22SL05: -CRATE_22_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 6 - XX-22SL06:DI-FOFB -CRATE_22_FOFB_6_PV_AREA_PREFIX=XX-22SL06: -CRATE_22_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 7 - XX-22SL07:DI-PFOFB -CRATE_22_FOFB_7_PV_AREA_PREFIX=XX-22SL07: -CRATE_22_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB: - -# Crate 22 - FOFB slot 8 - XX-22SL08:DI-PFOFB -CRATE_22_FOFB_8_PV_AREA_PREFIX=XX-22SL08: -CRATE_22_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB: - -# Crate 22 - FOFB slot 9 - XX-22SL09:DI-PFOFB -CRATE_22_FOFB_9_PV_AREA_PREFIX=XX-22SL09: -CRATE_22_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB: - -# Crate 22 - FOFB slot 10 - XX-22SL10:DI-PFOFB -CRATE_22_FOFB_10_PV_AREA_PREFIX=XX-22SL10: -CRATE_22_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB: - -# Crate 22 - FOFB slot 11 - XX-22SL11:DI-FOFB -CRATE_22_FOFB_11_PV_AREA_PREFIX=XX-22SL11: -CRATE_22_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 12 - XX-22SL12:DI-FOFB -CRATE_22_FOFB_12_PV_AREA_PREFIX=XX-22SL12: -CRATE_22_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 13 - XX-22SL13:DI-FOFB -CRATE_22_FOFB_13_PV_AREA_PREFIX=XX-22SL13: -CRATE_22_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 14 - XX-22SL14:DI-FOFB -CRATE_22_FOFB_14_PV_AREA_PREFIX=XX-22SL14: -CRATE_22_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 15 - XX-22SL15:DI-FOFB -CRATE_22_FOFB_15_PV_AREA_PREFIX=XX-22SL15: -CRATE_22_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 16 - XX-22SL16:DI-FOFB -CRATE_22_FOFB_16_PV_AREA_PREFIX=XX-22SL16: -CRATE_22_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 17 - XX-22SL17:DI-FOFB -CRATE_22_FOFB_17_PV_AREA_PREFIX=XX-22SL17: -CRATE_22_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 18 - XX-22SL18:DI-FOFB -CRATE_22_FOFB_18_PV_AREA_PREFIX=XX-22SL18: -CRATE_22_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 19 - XX-22SL19:DI-FOFB -CRATE_22_FOFB_19_PV_AREA_PREFIX=XX-22SL19: -CRATE_22_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 20 - XX-22SL20:DI-FOFB -CRATE_22_FOFB_20_PV_AREA_PREFIX=XX-22SL20: -CRATE_22_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 21 - XX-22SL21:DI-FOFB -CRATE_22_FOFB_21_PV_AREA_PREFIX=XX-22SL21: -CRATE_22_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 22 - XX-22SL22:DI-FOFB -CRATE_22_FOFB_22_PV_AREA_PREFIX=XX-22SL22: -CRATE_22_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 23 - XX-22SL23:DI-FOFB -CRATE_22_FOFB_23_PV_AREA_PREFIX=XX-22SL23: -CRATE_22_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: - -# Crate 22 - FOFB slot 24 - XX-22SL24:DI-FOFB -CRATE_22_FOFB_24_PV_AREA_PREFIX=XX-22SL24: -CRATE_22_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: