diff --git a/sis8300bcmApp/Db/sis8300bcm.template b/sis8300bcmApp/Db/sis8300bcm.template index db1894f32050ab30fbe07b83289679143dee4353..6eb38711280660cff9afea5b732bb167dc26a13b 100644 --- a/sis8300bcmApp/Db/sis8300bcm.template +++ b/sis8300bcmApp/Db/sis8300bcm.template @@ -685,3 +685,55 @@ record(ao, "$(P)$(R)CalibrationActualCurrent") field(ASG, "critical") info(autosaveFields, "VAL") } + +record(bo, "$(P)$(R)BeamAbsenceMask-Ch0") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.BEAM_ABSENCE_CHANNEL_0") + field(ZNAM, "Disable") + field(ONAM, "Enable") + field(ASG, "critical") + info(autosaveFields, "VAL") +} +record(bi, "$(P)$(R)BeamAbsenceMask-Ch0R") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.BEAM_ABSENCE_CHANNEL_0") + field(SCAN, "I/O Intr") + field(ZNAM, "Disabled") + field(ONAM, "Enabled") +} +record(bo, "$(P)$(R)BeamAbsenceMask-Ch1") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.BEAM_ABSENCE_CHANNEL_1") + field(ZNAM, "Disable") + field(ONAM, "Enable") + field(ASG, "critical") + info(autosaveFields, "VAL") +} +record(bi, "$(P)$(R)BeamAbsenceMask-Ch1R") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.BEAM_ABSENCE_CHANNEL_1") + field(SCAN, "I/O Intr") + field(ZNAM, "Disabled") + field(ONAM, "Enabled") +} +record(bo, "$(P)$(R)BeamAbsenceMask-Ch2") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.BEAM_ABSENCE_CHANNEL_2") + field(ZNAM, "Disable") + field(ONAM, "Enable") + field(ASG, "critical") + info(autosaveFields, "VAL") +} +record(bi, "$(P)$(R)BeamAbsenceMask-Ch2R") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.BEAM_ABSENCE_CHANNEL_2") + 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..b496e11cb563b191aa3ad9ccf8380ae8343040b0 100644 --- a/sis8300bcmApp/src/sis8300bcm.cpp +++ b/sis8300bcmApp/src/sis8300bcm.cpp @@ -185,6 +185,9 @@ sis8300bcm::sis8300bcm(const char *portName, const char *devicePath, createParam(BCMHighVoltagePresenceString, asynParamInt32, &BCMHighVoltagePresence); createParam(BCMHighVoltageOKString, asynParamInt32, &BCMHighVoltageOK); createParam(BCMEnableCalibrationPulseString, asynParamInt32, &BCMEnableCalibrationPulse); + createParam(BCMBeamAbsenceChannel0String, asynParamInt32, &BCMBeamAbsenceChannel0); + createParam(BCMBeamAbsenceChannel1String, asynParamInt32, &BCMBeamAbsenceChannel1); + createParam(BCMBeamAbsenceChannel2String, asynParamInt32, &BCMBeamAbsenceChannel2); // ACCT block, channel specific createParam(BCMAcctTriggerSourceString, asynParamInt32, &BCMAcctTriggerSource); createParam(BCMAcctPulseChargeString, asynParamFloat64, &BCMAcctPulseCharge); @@ -680,6 +683,27 @@ int sis8300bcm::readbackParameters() } setIntegerParam(BCMBeamTriggerSource, uintValue); + ret = sis8300drvbcm_get_beam_absence_signals(mDeviceHandle, 0, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_beam_absence_signals bit 0 returned %d", ret); + return ret; + } + setIntegerParam(BCMBeamAbsenceChannel0, uintValue); + + ret = sis8300drvbcm_get_beam_absence_signals(mDeviceHandle, 1, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_beam_absence_signals bit 1 returned %d", ret); + return ret; + } + setIntegerParam(BCMBeamAbsenceChannel1, uintValue); + + ret = sis8300drvbcm_get_beam_absence_signals(mDeviceHandle, 2, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_beam_absence_signals bit 2 returned %d", ret); + return ret; + } + setIntegerParam(BCMBeamAbsenceChannel2, uintValue); + // readback channel configuration parameters for (int addr = 0; addr < SIS8300BCM_NUM_CHANNELS; addr++) { asynPrintDeviceInfo(pasynUserSelf, "readback acq %d parameters", addr); @@ -1756,6 +1780,21 @@ asynStatus sis8300bcm::writeInt32(asynUser *pasynUser, epicsInt32 value) if (ret) { asynPrintError(pasynUser, "sis8300drvbcm_set_enable_calibration_pulse returned %d", ret); } + } else if (function == BCMBeamAbsenceChannel0) { + ret = sis8300drvbcm_set_beam_absence_signals(mDeviceHandle, 0, value); + if (ret) { + asynPrintError(pasynUser, "sis8300drvbcm_set_beam_absence_signals bit 0 returned %d", ret); + } + } else if (function == BCMBeamAbsenceChannel1) { + ret = sis8300drvbcm_set_beam_absence_signals(mDeviceHandle, 1, value); + if (ret) { + asynPrintError(pasynUser, "sis8300drvbcm_set_beam_absence_signals bit 1 returned %d", ret); + } + } else if (function == BCMBeamAbsenceChannel2) { + ret = sis8300drvbcm_set_beam_absence_signals(mDeviceHandle, 2, value); + if (ret) { + asynPrintError(pasynUser, "sis8300drvbcm_set_beam_absence_signals bit 2 returned %d", ret); + } } else if (function == SIS8300TriggerSource || function == SIS8300TriggerExternalLine) { // override generic trigger source/line handling from sis8300 } else if (function == BCMAcctDroopCompensating) { diff --git a/sis8300bcmApp/src/sis8300bcm.h b/sis8300bcmApp/src/sis8300bcm.h index a4e9df63052efbffa4ad7d3435b9d01a6ca5a1a8..a1a8940f4eadb69136cae6eefe7f2368ac68cd06 100644 --- a/sis8300bcmApp/src/sis8300bcm.h +++ b/sis8300bcmApp/src/sis8300bcm.h @@ -81,6 +81,9 @@ #define BCMHighVoltagePresenceString "BCM.HIGH_VOLTAGE_PRESENCE" #define BCMHighVoltageOKString "BCM.HIGH_VOLTAGE_OK" #define BCMEnableCalibrationPulseString "BCM.ENABLE_CALIBRATION_PULSE" +#define BCMBeamAbsenceChannel0String "BCM.BEAM_ABSENCE_CHANNEL_0" +#define BCMBeamAbsenceChannel1String "BCM.BEAM_ABSENCE_CHANNEL_1" +#define BCMBeamAbsenceChannel2String "BCM.BEAM_ABSENCE_CHANNEL_2" // ACCT block, channel specific #define BCMAcctTriggerSourceString "BCM.ACCT.TRIGGER_SOURCE" #define BCMAcctPulseChargeString "BCM.ACCT.PULSE_CHARGE" @@ -308,6 +311,9 @@ protected: int BCMHighVoltagePresence; int BCMHighVoltageOK; int BCMEnableCalibrationPulse; + int BCMBeamAbsenceChannel0; + int BCMBeamAbsenceChannel1; + int BCMBeamAbsenceChannel2; // ACCT block, channel specific int BCMAcctTriggerSource; int BCMAcctPulseCharge; diff --git a/vendor/ess/lib/sis8300bcm_reg.h b/vendor/ess/lib/sis8300bcm_reg.h index b3073721fb6f19c2b5caaf018535b6b4e7505bc7..26827bd63e0da5b7fa622a8ae49512f9b10f64d5 100644 --- a/vendor/ess/lib/sis8300bcm_reg.h +++ b/vendor/ess/lib/sis8300bcm_reg.h @@ -70,6 +70,7 @@ extern "C" { #define SIS8300BCM_ACQUITISION_TRIGGER_SOURCE_REG 0x436 #define SIS8300BCM_CRATE_ID_REG 0x437 #define SIS8300BCM_PULSE_WIDTH_FILTER_REG 0x43E +#define SIS8300BCM_BEAM_ABSENCE_SIGNALS_REG 0x43F /* channel specific registers start at 0x500 */ #define SIS8300BCM_CHANNEL_BLOCK_BASE 0x500 diff --git a/vendor/ess/lib/sis8300drvbcm.c b/vendor/ess/lib/sis8300drvbcm.c index 7e51093e88c6044b1157e5e1c9c7fb83edb3ef7c..908ee3e8b8ec6261e97a81f6b7c69f813097b8ba 100644 --- a/vendor/ess/lib/sis8300drvbcm.c +++ b/vendor/ess/lib/sis8300drvbcm.c @@ -145,6 +145,40 @@ int sis8300drvbcm_get_pulse_width_filter(sis8300drv_usr *sisuser, double *width) return ret; } +// used to control beam absence signals +int sis8300drvbcm_set_beam_absence_signals(sis8300drv_usr *sisuser, unsigned int bit, unsigned int mask) +{ + unsigned int value; + // register has lowest 3 bits defined + int ret = sis8300drv_reg_read(sisuser, SIS8300BCM_BEAM_ABSENCE_SIGNALS_REG, &value); + if (ret) { + return ret; + } + value &= 0x7; + // set / clear the desired bit + if (mask) { + value |= (1 << bit); + } else { + value &= ~(1 << bit); + } + ret = sis8300drv_reg_write(sisuser, SIS8300BCM_BEAM_ABSENCE_SIGNALS_REG, value); + printf("%s: beam absence register is 0x%x, bit %d: %d\n", __func__, value, bit, mask); + return ret; +} + +int sis8300drvbcm_get_beam_absence_signals(sis8300drv_usr *sisuser, unsigned int bit, unsigned int *mask) +{ + unsigned int value; + // register has lowest 3 bits defined + int ret = sis8300drv_reg_read(sisuser, SIS8300BCM_BEAM_ABSENCE_SIGNALS_REG, &value); + if (ret) { + return ret; + } + // check the desired bit + *mask = (value & (1 << bit)) ? 1 : 0; + return ret; +} + // used to control trigger selection for beam start for individual ACCTs int sis8300drvbcm_set_channel_trigger_source(sis8300drv_usr *sisuser, unsigned int channel, unsigned int source) { diff --git a/vendor/ess/lib/sis8300drvbcm.h b/vendor/ess/lib/sis8300drvbcm.h index 93b3c59fb2aa5ba3ca2c5f0c7834ed1c21c31428..ad67f43bb6e1816f511277ba9f3a2484241bd192 100644 --- a/vendor/ess/lib/sis8300drvbcm.h +++ b/vendor/ess/lib/sis8300drvbcm.h @@ -95,6 +95,8 @@ int sis8300drvbcm_set_crate_id(sis8300drv_usr *sisuser, unsigned int crate_id); int sis8300drvbcm_get_crate_id(sis8300drv_usr *sisuser, unsigned int *crate_id); int sis8300drvbcm_set_pulse_width_filter(sis8300drv_usr *sisuser, double width); int sis8300drvbcm_get_pulse_width_filter(sis8300drv_usr *sisuser, double *width); +int sis8300drvbcm_set_beam_absence_signals(sis8300drv_usr *sisuser, unsigned int bit, unsigned int mask); +int sis8300drvbcm_get_beam_absence_signals(sis8300drv_usr *sisuser, unsigned int bit, unsigned int *mask); int sis8300drvbcm_set_channel_trigger_source(sis8300drv_usr *sisuser, unsigned int channel, unsigned int source); int sis8300drvbcm_get_channel_trigger_source(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *source); int sis8300drvbcm_set_channel_number_of_samples(sis8300drv_usr *sisuser, unsigned int channel, unsigned int count);