diff --git a/sis8300bcmApp/Db/sis8300bcm-acct.template b/sis8300bcmApp/Db/sis8300bcm-acct.template index acf5e6d77f03bcddfe29304b7b533e1fbf991ffc..6139f7f0751b8505622b9498c9fddccbf580e93c 100644 --- a/sis8300bcmApp/Db/sis8300bcm-acct.template +++ b/sis8300bcmApp/Db/sis8300bcm-acct.template @@ -1364,4 +1364,21 @@ record(ao, "$(P)$(R)LIThreshold") info(autosaveFields, "VAL") } +record(bo, "$(P)$(R)BeamAbsenceMask") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.ACCT.BEAM_ABSENCE") + field(ZNAM, "Disable") + field(ONAM, "Enable") + field(ASG, "critical") + info(autosaveFields, "VAL") +} +record(bi, "$(P)$(R)BeamAbsenceMaskR") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.ACCT.BEAM_ABSENCE") + field(SCAN, "I/O Intr") + field(ZNAM, "Disabled") + field(ONAM, "Enabled") +} diff --git a/sis8300bcmApp/src/sis8300bcm.cpp b/sis8300bcmApp/src/sis8300bcm.cpp index fce8414c087b01fbcb96ec0b84210c8ce3ea6e51..6d8715af07fd94b262b77e10cf500b1b01baead4 100644 --- a/sis8300bcmApp/src/sis8300bcm.cpp +++ b/sis8300bcmApp/src/sis8300bcm.cpp @@ -277,6 +277,7 @@ sis8300bcm::sis8300bcm(const char *portName, const char *devicePath, createParam(BCMAcctAutoFlatTopStartString, asynParamFloat64, &BCMAcctAutoFlatTopStart); createParam(BCMAcctAutoFlatTopEndString, asynParamFloat64, &BCMAcctAutoFlatTopEnd); createParam(BCMAcctAutoFlatTopEnableString, asynParamInt32, &BCMAcctAutoFlatTopEnable); + createParam(BCMAcctBeamAbsenceString, asynParamInt32, &BCMAcctBeamAbsence); // DIFF block, channel specific createParam(BCMDiffSourceAString, asynParamInt32, &BCMDiffSourceA); createParam(BCMDiffSourceBString, asynParamInt32, &BCMDiffSourceB); @@ -1397,6 +1398,13 @@ int sis8300bcm::deviceDone() return ret; } setIntegerParam(addr, BCMAcctMaxPulseLength, uintValue); + + ret = sis8300drvbcm_get_channel_beam_absence(mDeviceHandle, addr, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_channel_beam_absence returned %d", ret); + return ret; + } + setIntegerParam(addr, BCMAcctBeamAbsence, uintValue); } // readout DIFF parameters @@ -1998,6 +2006,11 @@ asynStatus sis8300bcm::writeInt32(asynUser *pasynUser, epicsInt32 value) if (ret) { asynPrintError(pasynUser, "sis8300drvbcm_set_channel_auto_flattop_enable returned %d", ret); } + } else if (function == BCMAcctBeamAbsence) { + ret = sis8300drvbcm_set_channel_beam_absence(mDeviceHandle, addr, value); + if (ret) { + asynPrintError(pasynUser, "sis8300drvbcm_set_channel_beam_absence returned %d", ret); + } } else if (function == BCMFiberOutDataSelect) { ret = sis8300drvbcm_set_fiber_out_data_select(mDeviceHandle, addr, value); if (ret) { diff --git a/sis8300bcmApp/src/sis8300bcm.h b/sis8300bcmApp/src/sis8300bcm.h index a4e9df63052efbffa4ad7d3435b9d01a6ca5a1a8..adc4a9b26a947e99a224a29352b65b9b634ebb92 100644 --- a/sis8300bcmApp/src/sis8300bcm.h +++ b/sis8300bcmApp/src/sis8300bcm.h @@ -173,6 +173,7 @@ #define BCMAcctAutoFlatTopStartString "BCM.ACCT.AUTO_FLATTOP_START" #define BCMAcctAutoFlatTopEndString "BCM.ACCT.AUTO_FLATTOP_END" #define BCMAcctAutoFlatTopEnableString "BCM.ACCT.AUTO_FLATTOP_ENABLE" +#define BCMAcctBeamAbsenceString "BCM.ACCT.BEAM_ABSENCE" // DIFF block, channel specific #define BCMDiffSourceAString "BCM.DIFF.SOURCE_A" #define BCMDiffSourceBString "BCM.DIFF.SOURCE_B" @@ -400,6 +401,7 @@ protected: int BCMAcctAutoFlatTopStart; int BCMAcctAutoFlatTopEnd; int BCMAcctAutoFlatTopEnable; + int BCMAcctBeamAbsence; // DIFF block, channel specific int BCMDiffSourceA; int BCMDiffSourceB; diff --git a/vendor/ess/lib/sis8300bcm_reg.h b/vendor/ess/lib/sis8300bcm_reg.h index b3073721fb6f19c2b5caaf018535b6b4e7505bc7..4b9ca9bc608b60e3f4570beb2850ded009168bb4 100644 --- a/vendor/ess/lib/sis8300bcm_reg.h +++ b/vendor/ess/lib/sis8300bcm_reg.h @@ -154,6 +154,7 @@ extern "C" { #define SIS8300BCM_ACCT_X_AUTO_FLATTOP_RISING_OFF 0x036 #define SIS8300BCM_ACCT_X_AUTO_FLATTOP_FALLING_OFF 0x037 #define SIS8300BCM_ACCT_X_AUTO_FLATTOP_ENABLE_OFF 0x038 +#define SIS8300BCM_ACCT_X_BEAM_ABSENCE_OFF 0x039 /* DIFF block registers diff --git a/vendor/ess/lib/sis8300drvbcm.c b/vendor/ess/lib/sis8300drvbcm.c index 7e51093e88c6044b1157e5e1c9c7fb83edb3ef7c..718a06fec94c3c026454c28f2c0730bbb174779c 100644 --- a/vendor/ess/lib/sis8300drvbcm.c +++ b/vendor/ess/lib/sis8300drvbcm.c @@ -2979,6 +2979,26 @@ int sis8300drvbcm_get_channel_auto_flattop_enable(sis8300drv_usr *sisuser, unsig return ret; } +// used to control beam absence enable +int sis8300drvbcm_set_channel_beam_absence(sis8300drv_usr *sisuser, unsigned int channel, unsigned int enable) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_ACCT_BANK_OFF + \ + SIS8300BCM_ACCT_X_BEAM_ABSENCE_OFF; + int ret = sis8300drv_reg_write(sisuser, reg, enable); + return ret; +} +int sis8300drvbcm_get_channel_beam_absence(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *enable) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_ACCT_BANK_OFF + \ + SIS8300BCM_ACCT_X_BEAM_ABSENCE_OFF; + int ret = sis8300drv_reg_read(sisuser, reg, enable); + return ret; +} + // used to control fiber out data select int sis8300drvbcm_set_fiber_out_data_select(sis8300drv_usr *sisuser, unsigned int channel, unsigned int selection) { diff --git a/vendor/ess/lib/sis8300drvbcm.h b/vendor/ess/lib/sis8300drvbcm.h index 93b3c59fb2aa5ba3ca2c5f0c7834ed1c21c31428..278c32435b7841019b6ffb34247b8cbd7a13abd0 100644 --- a/vendor/ess/lib/sis8300drvbcm.h +++ b/vendor/ess/lib/sis8300drvbcm.h @@ -226,6 +226,8 @@ int sis8300drvbcm_set_channel_auto_flattop_end(sis8300drv_usr *sisuser, unsigned int sis8300drvbcm_get_channel_auto_flattop_end(sis8300drv_usr *sisuser, unsigned int channel, double *end); int sis8300drvbcm_set_channel_auto_flattop_enable(sis8300drv_usr *sisuser, unsigned int channel, unsigned int enable); int sis8300drvbcm_get_channel_auto_flattop_enable(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *enable); +int sis8300drvbcm_set_channel_beam_absence(sis8300drv_usr *sisuser, unsigned int channel, unsigned int enable); +int sis8300drvbcm_get_channel_beam_absence(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *enable); int sis8300drvbcm_set_channel_leaky_coefficient(sis8300drv_usr *sisuser, unsigned int channel, double coefficient); int sis8300drvbcm_get_channel_leaky_coefficient(sis8300drv_usr *sisuser, unsigned int channel, double *coefficient); int sis8300drvbcm_set_channel_leaky_threshold(sis8300drv_usr *sisuser, unsigned int channel, double threshold);