From ff4cbcc35c28c1bfed43a508651aaeeea883aecc Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Fri, 10 Dec 2021 17:07:20 -0200 Subject: [PATCH 01/42] FOFBApp/src: acq functions added --- FOFBApp/src/drvFOFB.cpp | 3165 ++++++++++++++++++++++++++++++++++++--- FOFBApp/src/drvFOFB.h | 279 +++- 2 files changed, 3218 insertions(+), 226 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 4f88778..750d81f 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,38 +24,81 @@ #include "drvFOFB.h" #include +/** The polling interval when checking to see if acquisition is complete */ +#define FOFB_POLL_TIME .1 +#define FOFB_SP_POLL_TIME .01 +#define FOFB_PM_POLL_TIME 1 + #define SERVICE_NAME_SIZE 50 +typedef struct { + drvFOFB *drvFOFBp; + fofb_coreID_types coreID; + double pollTime; + bool autoStart; +} taskParams_t; + 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} + /* 0 (INVALID) */ {-1, -1, -1}, + /* 1 */ {1, 0, 2}, + /* 2 */ {1, 1, 3}, + /* 3 */ {2, 0, 2}, + /* 4 */ {2, 1, 3}, + /* 5 */ {3, 0, 2}, + /* 6 */ {3, 1, 3}, + /* 7 */ {4, 0, 2}, + /* 8 */ {4, 1, 3}, + /* 9 */ {5, 0, 2}, + /* 10 */ {5, 1, 3}, + /* 11 */ {6, 0, 2}, + /* 12 */ {6, 1, 3}, + /* 13 */ {7, 0, 2}, + /* 14 */ {7, 1, 3}, + /* 15 */ {8, 0, 2}, + /* 16 */ {8, 1, 3}, + /* 17 */ {9, 0, 2}, + /* 18 */ {9, 1, 3}, + /* 19 */ {10, 0, 2}, + /* 20 */ {10, 1, 3}, + /* 21 */ {11, 0, 2}, + /* 22 */ {11, 1, 3}, + /* 23 */ {12, 0, 2}, + /* 24 */ {12, 1, 3} }; +/* This function should not be called, as there is no client function to replace it and + * * * the EPICS Db should not export PVs that maps here. + * * * FIXME: not sure why, but some unavailable functions are called even with no + * * * "apperently" Db record mapped to it. When this happens, segfault occurs. So, + * * * until we figure out what s happening we keep "NULL" function mapped to this dummy + * * * fcuntions */ +static halcs_client_err_e halcs_dummy_read_32 (halcs_client_t *self, char *service, uint32_t *param) +{ + (void) self; + (void) service; + (void) param; + return HALCS_CLIENT_ERR_INV_FUNCTION; +} + +static halcs_client_err_e halcs_dummy_read_chan_32 (halcs_client_t *self, char *service, + uint32_t chan, uint32_t *param) +{ + (void) self; + (void) service; + (void) chan; + (void) param; + return HALCS_CLIENT_ERR_INV_FUNCTION; +} + /* Int32 functions mapping */ +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 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, @@ -178,7 +221,51 @@ static const functionsAny_t fofbCtrlSetGetRcbDataFunc = {functio halcs_get_fofb_ctrl_rcb_data}}; 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 + }, + /* Post-Mortem Core */ + { + NULL, // drvFOFBp + FOFBIDPM, // coreID + FOFB_PM_POLL_TIME, // pollTime + true // autoStart + }, +}; +static taskParams_t taskSPParams[NUM_ACQ_CORES_PER_FOFB] = { + /* Regular Core */ + { + NULL, // drvFOFBp + FOFBIDReg, // coreID + FOFB_SP_POLL_TIME, // pollTime + false // autoStart + }, +#if 0 + /* Post-Mortem Core */ + { + NULL, // drvFOFBp + FOFBIDPM, // coreID + FOFB_PM_POLL_TIME, // pollTime + false // autoStart + }, +#endif +}; +static taskParams_t taskMonitParams = { + NULL, // drvFOFBp + FOFBIDReg, // coreID + FOFB_POLL_TIME, // pollTime + false // autoStart +}; + void acqTask(void *drvPvt); +void acqSPTask(void *drvPvt); +void acqMonitTask(void *drvPvt); static void exitHandlerC(void *pPvt) { @@ -204,9 +291,35 @@ asynStatus drvFOFB::getServiceID (int fofbNumber, int addr, const char *serviceN { static const char *functionName = "getServiceID"; asynStatus status = asynSuccess; + int serviceID = 0; + int addrMod = 0; + + if (streq(serviceName, "ACQ")) { + addrMod = addr; + } + else { + addrMod = 0; + } + + switch (addrMod) { + case FOFBIDReg: + serviceID = boardMap[fofbNumber].fofb; + break; - *serviceIDArg = boardMap[fofbNumber].fofb; + case FOFBIDPM: + serviceID = boardMap[fofbNumber].core_id; + break; + 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; } @@ -242,16 +355,18 @@ asynStatus drvFOFB::getFullServiceName (int fofbNumber, int addr, const char *se } /** 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 ] - * * * */ + * * * * 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 */ @@ -260,8 +375,12 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, asynStatus status; const char *functionName = "drvFOFB"; + srand(time(NULL)); + /* Create portName so we can create a new AsynUser later */ fofbPortName = epicsStrDup(portName); + fofbType = epicsStrDup(type); + fofbMaxPoints = maxPoints; this->endpoint = strdup(endpoint); if (this->endpoint == NULL) { @@ -284,15 +403,72 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, this->verbose = verbose; this->timeout = timeout; + for (int i = 0; i < NUM_FOFB_MODES; ++i) { + for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { + this->readingActive[i][j] = 0; + this->repetitiveTrigger[i][j] = 0; + } + } + + for (int i = 0; i < NUM_FOFB_MODES; ++i) { + + this->reconfSPassAcqEventId[i] = epicsEventCreate(epicsEventEmpty); + if (!this->reconfSPassAcqEventId[i]) { + printf("%s:%s: epicsEventCreate[%d] failure for SP reconfig. event\n", + driverName, functionName, i); + return; + } + + for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { + /* Create events for signalling acquisition thread */ + this->startAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); + if (!this->startAcqEventId[i][j]) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s epicsEventCreate[%d] failure for start event\n", + driverName, functionName, i); + return; + } + + this->stopAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); + if (!this->stopAcqEventId[i][j]) { + printf("%s:%s: epicsEventCreate[%d] failure for stop event\n", + driverName, functionName, i); + return; + } + + this->abortAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); + if (!this->abortAcqEventId[i][j]) { + printf("%s:%s: epicsEventCreate[%d] failure for abort event\n", + driverName, functionName, i); + return; + } + + this->activeAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); + if (!this->activeAcqEventId[i][j]) { + printf("%s:%s: epicsEventCreate[%d] failure for active event\n", + driverName, functionName, i); + 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 */ + /* CAUTION. The order of creation must be the same as defined in .h file. + * * * * 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); @@ -354,8 +530,31 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, createParam(P_FofbCtrlRcbRdStrString, asynParamUInt32Digital, &P_FofbCtrlRcbRdStr); createParam(P_FofbCtrlRcbDataString, asynParamUInt32Digital, &P_FofbCtrlRcbData); + /* Create acquistion parameters */ + 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 FOFB Status parameters */ + createParam(P_FOFBModeString, asynParamInt32, &P_FOFBMode); + createParam(P_FOFBStatusString, asynParamInt32, &P_FOFBStatus); + /* FOFB HW Int32 Functions mapping. Functions not mapped here are just written - * * * to the parameter library */ + * * * * to the parameter library */ fofbHwFunc.emplace(P_FofbProcessingRamWrite, fofbProcessingSetGetRamWriteFunc); fofbHwFunc.emplace(P_FofbProcessingRamAddr, fofbProcessingSetGetRamAddrFunc); fofbHwFunc.emplace(P_FofbProcessingRamDataIn, fofbProcessingSetGetRamDataInFunc); @@ -422,8 +621,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, 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 */ + * * * * will ensure the reconnection to server if necessary, but we + * * * * must succeed here or we must abort completely */ if (status != asynSuccess) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error calling fofbClientConnect, status=%d\n", @@ -432,7 +631,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* Set the initial values of some parameters */ - setUIntDigitalParam(P_FofbProcessingRamWrite, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbProcessingRamAddr, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbProcessingRamDataIn, 0, 0xFFFFFFFF); @@ -494,11 +692,135 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, setUIntDigitalParam(P_FofbCtrlRcbRdStr, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbCtrlRcbData, 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); + } + + /* Acquisition PM parameters */ + setUIntDigitalParam(FOFBIDPM, P_SamplesPre, SAMPLES_PRE_DEFAULT_PM(fofbMaxPoints), + 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_SamplesPost, SAMPLES_POST_DEFAULT_PM(fofbMaxPoints), + 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_NumShots, NUM_SHOTS_DEFAULT_PM, + 0xFFFFFFFF); + setIntegerParam( FOFBIDPM, P_Channel, CH_DEFAULT_PM); + setDoubleParam( FOFBIDPM, P_UpdateTime, 1.0); + setUIntDigitalParam(FOFBIDPM, P_Trigger, ACQ_CLIENT_TRIG_EXTERNAL, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerEvent, + TRIG_ACQ_START, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerRep, 1, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerDataThres, + 100, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerDataPol, + 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerDataSel, + 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerDataFilt, + 1, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerHwDly, + 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_DataTrigChan, + 0, 0xFFFFFFFF); + + /* Write to HW */ + for (int i = P_SamplesPre; i < P_DataTrigChan+1; ++i) { + setParamGeneric(i, FOFBIDPM); + } + + /* Do callbacks so higher layers see any changes. Call callbacks for every addr */ + for (int i = 0; i < MAX_ADDR; ++i) { + callParamCallbacks(i); + } + /* 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 the thread that computes the SP waveforms in the background */ + /* Assign task parameters passing the ACQ/Trigger instance ID as parameter. + * * * The other parameters are already set-up*/ + taskSPParams[FOFBIDReg].drvFOFBp = this; + status = (asynStatus)(epicsThreadCreate("drvFOFBSPTask", + epicsThreadPriorityMedium, + epicsThreadGetStackSize(epicsThreadStackMedium), + (EPICSTHREADFUNC)::acqSPTask, + &taskSPParams[FOFBIDReg]) == 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); invalid_fofb_number_err: @@ -508,7 +830,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /** Destructor for the drvFOFB class. - * * */ + * * * */ drvFOFB::~drvFOFB() { asynStatus status = asynSuccess; @@ -525,6 +847,8 @@ drvFOFB::~drvFOFB() free (this->endpoint); this->endpoint = NULL; + free (this->fofbType); + this->fofbType = NULL; free (this->fofbPortName); this->fofbPortName = NULL; } @@ -552,6 +876,47 @@ 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 fofbClientConnect 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", driverName, functionName); @@ -560,6 +925,24 @@ asynStatus drvFOFB::fofbClientConnect(asynUser* 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,175 +963,2103 @@ 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 acqSPTask(void *drvPvt) +{ + taskParams_t *pPvt = (taskParams_t *)drvPvt; + pPvt->drvFOFBp->acqSPTask(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. + * * * CAUTION. FIXME? Only one acquisition task is working at any given time: MultiMode or SinglePass + * * */ +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; + 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; + int fofbMode; + epicsUInt32 trigger; + double updateTime; + double delay; + int hwAmpChannel = 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; + } - /* Lookup function on map */ - func = fofbHwFunc.find (functionId); - if (func == fofbHwFunc.end()) { - getParamName(functionId, ¶mName); + /* 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[FOFBModeMultiBunch][coreID], pollTime); + if (status == epicsEventWaitOK || !repetitiveTrigger[FOFBModeMultiBunch][coreID] || acqIsFOFBStatusErr(fofbStatus)) { + /* We got a stop event, stop repetitive acquisition */ + readingActive[FOFBModeMultiBunch][coreID] = 0; + + /* Wait until we are in MultiBunch mode */ + getIntegerParam(coreID, P_FOFBMode, &fofbMode); + if (fofbMode != FOFBModeMultiBunch) { + unlock (); + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: waiting for FOFBMode = MultiBunch\n", driverName, functionName); + epicsEventWait(activeAcqEventId[FOFBModeMultiBunch][coreID]); + lock (); + } + + /* 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[FOFBModeMultiBunch][coreID]); + lock(); + } + readingActive[FOFBModeMultiBunch][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_AMP_TYPES) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unsupported numAtoms > %d. Reduce this value in the gateware\n", + driverName, functionName, MAX_WVF_AMP_TYPES); + continue; + } + + /* Convert user channel into hw channel */ + hwAmpChannel = channelMap[channel].HwAmpChannel; + if(hwAmpChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", + driverName, functionName, hwAmpChannel); + 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, hwAmpChannel, 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, hwAmpChannel, 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[FOFBModeMultiBunch][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, hwAmpChannel, 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].NDArrayAmp[coreID][WVF_AMP_ALL]); + + /* Copy AMP data to arrays for each type of data, do callbacks on that */ + status = deinterleaveNDArray(pArrayAllChannels, channelMap[channel].NDArrayAmp[coreID], + dims[0], arrayCounter, &now); + if (status != asynSuccess) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to deinterleave NDArray\n", + driverName, functionName); + continue; + } + + /* Calculate positions and call callbacks */ + status = computePositions(coreID, pArrayAllChannels, channel, &now); + if (status != asynSuccess) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to compute positions\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[FOFBModeMultiBunch][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[FOFBModeMultiBunch][coreID], delay); + lock(); + } + } + } +} + +/** Acquisition task for Single Pass FOFB mode that runs as a separate thread. + * * * CAUTION. FIXME? Only one acquisition task is working at any given time: MultiMode or SinglePass + * * */ +void drvFOFB::acqSPTask(int coreID, double pollTime, bool autoStart) +{ + int status = asynSuccess; + 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; + int fofbMode; + epicsUInt32 trigger; + epicsUInt32 TriggerDataThres; + epicsUInt32 TriggerDataPol; + epicsUInt32 TriggerDataSel; + epicsUInt32 TriggerDataFilt; + epicsUInt32 TriggerHwDly; + epicsUInt32 DataTrigChan; + fofb_sample_t fofb_sample = {0}; + char service[SERVICE_NAME_SIZE]; + char service_board[SERVICE_NAME_SIZE]; + int hwAmpChannel = 0; + int acqCompleted = 0; + int fofbStatus = 0; + int interrupted = 0; + bool autoStartFirst = autoStart; + epicsTimeStamp now; + epicsFloat64 timeStamp; + NDArray *pArrayAllChannels = NULL; + NDDataType_t NDType = NDInt32; + epicsTimeStamp startTime; + int arrayCounter; + size_t dims[MAX_WVF_DIMS]; + fofb_single_pass_t *fofb_single_pass = NULL; + static const char *functionName = "acqSPTask"; + + /* 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; + } + + /* Loop forever */ + lock (); + while (1) { + /* Free buffers if needed*/ + if (pArrayAllChannels) { + pArrayAllChannels->release (); + pArrayAllChannels = NULL; + } + + /* Clear out any flags*/ + interrupted = 0; + + /* We got a stop event, stop acquisition */ + readingActive[FOFBModeSinglePass][coreID] = 0; + + /* Wait until we are in SinglePass mode */ + getIntegerParam(coreID, P_FOFBMode, &fofbMode); + if (fofbMode != FOFBModeSinglePass) { + unlock (); + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: waiting for FOFBMode = SinglePass\n", driverName, functionName); + epicsEventWait(activeAcqEventId[FOFBModeSinglePass][coreID]); + lock (); + } + + getIntegerParam(coreID, P_FOFBStatus, &fofbStatus); + + /* Only change state to IDLE if we are not in a error state and we have just acquired some data */ + 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 (!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[FOFBModeSinglePass][coreID]); + lock(); + } + readingActive[FOFBModeSinglePass][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); + 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_AMP_TYPES) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unsupported numAtoms > %d. Reduce this value in the gateware\n", + driverName, functionName, MAX_WVF_AMP_TYPES); + continue; + } + + /* Select our "fake" channel if we are in single pass mode. + * * * This is done so we can the same flow as FOFBModeMultiBunch mode, + * * * without having to separate the implementations */ + channel = CH_SP; + + /* Convert user channel into hw channel */ + hwAmpChannel = channelMap[channel].HwAmpChannel; + if(hwAmpChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", + driverName, functionName, hwAmpChannel); + 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; + } + + status = getAcqNDArrayType(coreID, hwAmpChannel, 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; + } + + /* Tell we are acquiring just before we actually start it */ + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusAcquire); + callParamCallbacks(coreID); + + getUIntDigitalParam(coreID, P_TriggerDataThres, &TriggerDataThres, 0xFFFFFFFF); + getUIntDigitalParam(coreID, P_TriggerDataPol, &TriggerDataPol, 0xFFFFFFFF); + getUIntDigitalParam(coreID, P_TriggerDataSel, &TriggerDataSel, 0xFFFFFFFF); + getUIntDigitalParam(coreID, P_TriggerDataFilt, &TriggerDataFilt, 0xFFFFFFFF); + getUIntDigitalParam(coreID, P_TriggerHwDly, &TriggerHwDly, 0xFFFFFFFF); + getUIntDigitalParam(coreID, P_DataTrigChan, &DataTrigChan, 0xFFFFFFFF); + + /* 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); + continue; + } + + status = getFullServiceName (this->fofbNumber, coreID, "INIT", service_board, + sizeof(service_board)); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName for INIT service, status=%d\n", + driverName, functionName, status); + continue; + } + + /* Reconfigure acquisition */ + status = epicsEventTryWait(this->reconfSPassAcqEventId[coreID]); + if (status == epicsEventWaitOK) { + if (fofb_single_pass != NULL) { + fofb_single_pass_destroy (&fofb_single_pass); + } + } + + if (fofb_single_pass == NULL) { + fofb_single_pass = fofb_single_pass_new (this->endpoint, + this->verbose, NULL, service, service_board, + &fofb_parameters, num_samples_pre, num_samples_post, + num_shots); + if (fofb_single_pass == NULL) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: fofb_single_pass could not be created, status=%d\n", + driverName, functionName, status); + continue; + } + } + + fofb_single_pass_configure_trigger (fofb_single_pass, TriggerDataFilt, + TriggerDataPol, TriggerHwDly); + if (trigger == ACQ_CLIENT_TRIG_DATA_DRIVEN) { + fofb_single_pass_configure_data_trigger (fofb_single_pass, + TriggerDataThres, TriggerDataSel); + } + else if (trigger == ACQ_CLIENT_TRIG_EXTERNAL) { + fofb_single_pass_configure_external_trigger (fofb_single_pass); + } + else { + /* Invalid trigger for SP*/ + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: Invalid trigger for Single Pass\n", + driverName, functionName); + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrAcq); + callParamCallbacks(coreID); + continue; + } + + /* Do acquisition until a stop event arrives */ + while (1) { + /* If we were interrupted, jut go back to waiting the start event */ + if (interrupted) { + break; + } + + /* Waveform statistics */ + epicsTimeGetCurrent(&now); + getIntegerParam(NDArrayCounter, &arrayCounter); + arrayCounter++; + setIntegerParam(NDArrayCounter, arrayCounter); + 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); + + unlock(); + pasynManager->lockPort(pasynUser); + status = startSPAcq(fofb_single_pass); + 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); + break; + } + + /* Wait for acquisition to complete, but allow acquire stop events to be handled */ + while (1) { + unlock(); + status = epicsEventWaitWithTimeout(this->abortAcqEventId[FOFBModeSinglePass][coreID], pollTime); + lock(); + if (status == epicsEventWaitOK) { + /* We got a stop event, abort acquisition */ + abortAcq(coreID); + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusAborted); + callParamCallbacks(coreID); + interrupted = 1; + break; + } + else { + acqCompleted = checkSPAcqCompletion (fofb_single_pass); + } + + if (acqCompleted == -1) { + setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrAcqOFlow); + callParamCallbacks(coreID); + break; + } + + if (acqCompleted == 1) { + /* Get curve */ + getAcqSPSamples(fofb_single_pass, &fofb_sample); + break; + } + } + + /* Only do callbacks and calculate position if we could acquire some + * * * data */ + if (acqCompleted == 1) { + /* Get SinglePass Raw Data for the user */ + getAcqSPCurve(fofb_single_pass, pArrayAllChannels); + /* Do callbacks on the full waveform (all channels interleaved) */ + doCallbacksGenericPointer(pArrayAllChannels, NDArrayData, + channelMap[channel].NDArrayAmp[coreID][WVF_AMP_ALL]); + + /* Copy AMP data to arrays for each type of data, do callbacks on that */ + status = deinterleaveNDArray(pArrayAllChannels, channelMap[channel].NDArrayAmp[coreID], + dims[0], arrayCounter, &now); + if (status != asynSuccess) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to deinterleave NDArray\n", + driverName, functionName); + continue; + } + } + + callParamCallbacks(coreID); + } + + /* Release buffers */ + pArrayAllChannels->release(); + pArrayAllChannels = NULL; + } + + if (fofb_single_pass != NULL) { + fofb_single_pass_destroy (&fofb_single_pass); + } +} + +void drvFOFB::acqMonitTask() +{ + asynStatus status = asynSuccess; + int err = HALCS_CLIENT_SUCCESS; + size_t dims[MAX_WVF_DIMS]; + epicsUInt32 mask = 0xFFFFFFFF; + ABCD_ROW abcdRow; + XYQS_ROW xyqsRow; + XYQS_ROW xyqsFakeRow; + NDArray *pArrayMonitData[MAX_MONIT_DATA]; + double monitData[MAX_MONIT_DATA]; + NDDataType_t NDType = NDFloat64; + int NDArrayAddrInit = WVF_MONIT_AMP_A; + epicsTimeStamp now; + int monitEnable = 0; + static const char *functionName = "acqMonitTask"; + char service[SERVICE_NAME_SIZE]; + + /* Get correct service name*/ + status = getFullServiceName (this->fofbNumber, 0, "DSP", 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; + } + + /* Format channel name */ + strncat (service, ":DATA_PRODUCER", sizeof(service)); + + 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) { + /* Prepare for position calculation */ + abcdRow.A = monit_data.amp_ch0; + abcdRow.B = monit_data.amp_ch1; + abcdRow.C = monit_data.amp_ch2; + abcdRow.D = monit_data.amp_ch3; + + ABCDtoXYQS(&abcdRow, &xyqsRow, 1, true); + ABCDtoXYQS(&abcdRow, &xyqsFakeRow, 1, false); + + monitData[0] = monit_data.amp_ch0; + monitData[1] = monit_data.amp_ch1; + monitData[2] = monit_data.amp_ch2; + monitData[3] = monit_data.amp_ch3; + monitData[4] = xyqsRow.X; + monitData[5] = xyqsRow.Y; + monitData[6] = xyqsRow.Q; + monitData[7] = xyqsRow.S; + monitData[8] = xyqsFakeRow.X; + monitData[9] = xyqsFakeRow.Y; + + 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. AMP/POS 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 hwAmpChannel = 0; + int channel = 0; + int fofbMode = 0; + int fofbModeOther = 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_FOFBMode, &fofbMode); + getIntegerParam( addr, P_Channel, &channel); + + /* Convert user channel into hw channel */ + hwAmpChannel = channelMap[channel].HwAmpChannel; + if(hwAmpChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", + driverName, functionName, hwAmpChannel); + status = asynError; + goto halcs_inv_channel; + } + + /* Get channel properties */ + status = getChannelProperties(addr, hwAmpChannel, &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); + + /* Get the other acquisition task mode */ + if (fofbMode == FOFBModeSinglePass) { + fofbModeOther = FOFBModeMultiBunch; + } + else { + fofbModeOther = FOFBModeSinglePass; + } + + switch (triggerEvent) { + case TRIG_ACQ_START: + /* Abort the other acquisition task if needed */ + stopAcqTask(addr, fofbModeOther); + abortAcqTask(addr, fofbModeOther, false); + + /* Don't try to change anything is we are still acquiring. + * * * We must stop r abort the acquisition first */ + if (readingActive[fofbMode][addr]) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: Not starting acquistion as acqTask is still active\n", + driverName, functionName); + break; + } + + if (triggerRep) { + repetitiveTrigger[fofbMode][addr] = 1; + } + else { + repetitiveTrigger[fofbMode][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[fofbMode][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[fofbMode][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, fofbMode); + 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, fofbMode, 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, int fofbMode, bool abortAcqHw) +{ + asynStatus status = asynSuccess; + const char* functionName = "abortAcqTask"; + + /* we are waiting for a trigger */ + if (readingActive[fofbMode][addr]) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger ACQ_ABORT called for acqTask = %d, coreID = %d\n", + driverName, functionName, fofbMode, addr); + epicsEventSignal(this->abortAcqEventId[fofbMode][addr]); + } + else { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger ACQ_ABORT but with acquisition in progress, " + "called for acqTask = %d, coreID = %d\n", + driverName, functionName, fofbMode, 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::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::startSPAcq(fofb_single_pass_t *fofb_single_pass) +{ + asynStatus status = asynSuccess; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + const char* functionName = "startSPAcq"; + + err = fofb_single_pass_start (fofb_single_pass); + if (err != HALCS_CLIENT_SUCCESS) { + status = asynError; + } + else { + status = asynSuccess; + } + + 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; +} + +int drvFOFB::checkSPAcqCompletion(fofb_single_pass_t *fofb_single_pass) +{ + int complete = 0; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + const char* functionName = "checkSPAcqCompletion"; + + err = fofb_single_pass_check (fofb_single_pass); + /* 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: + 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::getAcqSPCurve(fofb_single_pass_t *fofb_single_pass, NDArray *pArrayAllChannels) +{ + asynStatus status = asynSuccess; + const char* functionName = "getAcqSPCurve"; + + /* Copy data to NDArray */ + const acq_trans_t * acq_trans = fofb_single_pass_get_acq_transaction (fofb_single_pass); + memcpy (pArrayAllChannels->pData, acq_trans->block.data, acq_trans->block.data_size); + pArrayAllChannels->dataSize = acq_trans->block.data_size; + + return status; +} + +asynStatus drvFOFB::getAcqSPSamples(fofb_single_pass_t *fofb_single_pass, fofb_sample_t *fofb_sample) +{ + asynStatus status = asynSuccess; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + const char* functionName = "getAcqSPSamples"; + + err = fofb_single_pass_sample (fofb_single_pass, fofb_sample); + if (err != HALCS_CLIENT_SUCCESS) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unable to read Single Pass samples\n", + driverName, functionName); + status = asynError; + goto halcs_acq_err; + } + +halcs_acq_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; + 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); + /* 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 */ + status = asynPortDriver::writeUInt32Digital(pasynUser, value, mask); + } + + /* 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; + + /* 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; + } + /* 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); + } + else { + /* Call base class */ + status = asynPortDriver::readUInt32Digital(pasynUser, value, mask); + } + + 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. */ + status = 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 if (function == P_FOFBMode) { + status = setFOFBMode(addr, function); + } + else { + /* Do operation on HW. Some functions do not set anything on hardware */ + status = setParamInteger(function, addr); + /* Readback all parameters from Hw */ + readIntegerParams(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); + /* Readback all parameters from Hw */ + readFloat64Params(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(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(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::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; +} + +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, @@ -809,18 +3120,51 @@ asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char * driverName, functionName, serviceChanStr, functionParam.argUInt32); status = asynError; - goto halcs_set_func_param_err; + goto halcs_set_func_param_err; + } + +halcs_set_func_param_err: +get_service_err: + return (asynStatus) status; +} + +/********************************************************************/ +/************ Function Mapping Overloaded Read functions ************/ +/********************************************************************/ + +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_set_func_param_err: -get_service_err: +halcs_get_func_param_err: +get_service_id_err: return (asynStatus) status; } -/********************************************************************/ -/************ Function Mapping Overloaded Read functions ************/ -/********************************************************************/ - asynStatus drvFOFB::doExecuteHwReadFunction(functionsInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const { @@ -862,6 +3206,59 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functionsUInt32_t &func, char *servi 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; +} + asynStatus drvFOFB::executeHwReadFunction(int functionId, int addr, functionsArgs_t &functionParam) { @@ -947,10 +3344,10 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functionsUInt32Chan_t &func, char *s /********************************************************************/ /* - * * * 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) { @@ -1046,6 +3443,60 @@ asynStatus drvFOFB::getParam32(int functionId, epicsUInt32 *param, *param = functionArgs.argUInt32; } /* We recover from asynDisabled just by retrieving + * * * * 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 +3506,334 @@ 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::setFOFBMode(int addr, int function) +{ + int status = asynSuccess; + int fofbMode = 0; + int fofbModeOther = 0; + + /* Get FOFBMode previously set */ + getIntegerParam(addr, P_FOFBMode, &fofbMode); + + /* Throw an error if we are acquiring in the other mode + * * * and we tried to change FOFB mode */ + if (fofbMode == FOFBModeSinglePass) { + fofbModeOther = FOFBModeMultiBunch; + } + else { + fofbModeOther = FOFBModeSinglePass; + } + + /* Check if an acquisition is running while trying to change mode */ + if (readingActive[fofbModeOther][addr]) { + setIntegerParam(addr, function, fofbModeOther); + status = asynError; + goto other_acq_acquiring_err; + } + +other_acq_acquiring_err: + return (asynStatus) status; +} + +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 hwAmpChannel = 0; + int serviceID = 0; + + /* Set the parameter in the parameter library. */ + getUIntDigitalParam(addr, P_DataTrigChan, &dataTrigChan, mask); + + /* Convert user channel into hw channel */ + hwAmpChannel = channelMap[dataTrigChan].HwAmpChannel; + if(hwAmpChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", + driverName, functionName, hwAmpChannel); + 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, hwAmpChannel); + 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 hwAmpChannel = 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, &hwAmpChannel); + if (err != HALCS_CLIENT_SUCCESS) { + status = asynError; + goto halcs_get_data_trig_chan_err; + } + + if (hwAmpChannel > CH_HW_END-1) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelRevMap for channel %d\n", + driverName, functionName, hwAmpChannel); + status = asynError; + goto halcs_inv_hw_channel; + } + + /* Convert user channel into hw channel */ + dataTrigChan = channelRevMap[hwAmpChannel].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::readIntegerParams(int addr) +{ + int status = 0; + + status = readOffsetParams(addr); + + return (asynStatus) status; +} /* 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 */ + * * * * \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 +3841,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) @@ -1101,5 +3869,6 @@ extern "C" { iocshRegister(&initFuncDef,initCallFunc); } - epicsExportRegistrar(drvFOFBRegister); + epicsExportRegistrar(drvFOFBRegister); } + diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index 29122b8..9ae4568 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -1,17 +1,21 @@ /* - * * * drvFOFB.h - * * * - * * * Authors: Melissa Aguiar - * * * - * * * Created Dec. 03, 2021 - * * */ + * * * * drvFOFB.h + * * * * + * * * * Authors: Melissa Aguiar + * * * * + * * * * Created Dec. 03, 2021 + * * * */ #include "asynPortDriver.h" #include +#include #include +#include /* Third-party libraries */ #include #include +#include +#include /* any implementation for non c++-17 compilers */ #include "any.hpp" @@ -21,6 +25,43 @@ using linb::any_cast; using linb::bad_any_cast; #define ARRAY_SIZE(ARRAY) (sizeof(ARRAY)/sizeof((ARRAY)[0])) +/* Waveforms: RAW data, ADC SWAP data, TBT Amp, TBT Phase, FOFB Amp, FOFB Phase */ +#define MAX_ARRAY_POINTS 200000 +#define FOFB_TIMEOUT 1.0 + +typedef enum { + FOFBIDReg = 0, + FOFBIDPM = 1, + 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 modes */ +typedef enum { + FOFBModeMultiBunch = 0, + FOFBModeSinglePass = 1, + FOFBModeEnd, +} fofb_mode_types; + +#define NUM_FOFB_MODES FOFBModeEnd + +/* FOFB acquisition status */ +typedef enum { + FOFBStatusIdle = 0, + FOFBStatusWaiting, + FOFBStatusTriggerHwExtWaiting, + FOFBStatusTriggerHwDataWaiting, + FOFBStatusTriggerSwWaiting, + FOFBStatusAcquire, + FOFBStatusErrAcq, + FOFBStatusAborted, + FOFBStatusErrTooManyPoints, + FOFBStatusErrTooFewPoints, + FOFBStatusErrNoMem, + FOFBStatusErrAcqOFlow, +} fofb_status_types; #define MAX_SLOTS 12 #define MAX_FOFB_PER_SLOT 2 @@ -35,14 +76,42 @@ using linb::bad_any_cast; typedef struct { int board; int fofb; + int core_id; /* Acquisition and Trigger core IDs */ } boardMap_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 (*writeUInt32Fp)(halcs_client_t *self, char *service, + uint32_t param); +/* Read 32-bit function pointer */ +typedef halcs_client_err_e (*readUInt32Fp)(halcs_client_t *self, char *service, + uint32_t *param); + +/* FOFB command dispatch table */ +typedef struct { + const char *serviceName; + writeUInt32Fp write; + readUInt32Fp read; +} functionsUInt32_t; + /* Write 32-bit function pointer */ typedef halcs_client_err_e (*writeInt32Fp)(halcs_client_t *self, char *service, - uint32_t param); + int32_t param); /* Read 32-bit function pointer */ typedef halcs_client_err_e (*readInt32Fp)(halcs_client_t *self, char *service, - uint32_t *param); + int32_t *param); /* FOFB command dispatch table */ typedef struct { @@ -51,19 +120,50 @@ typedef struct { readInt32Fp read; } functionsInt32_t; -/* Write 32-bit function pointer */ -typedef halcs_client_err_e (*writeUInt32Fp)(halcs_client_t *self, char *service, +/* 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 */ -typedef halcs_client_err_e (*readUInt32Fp)(halcs_client_t *self, char *service, +/* 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; - writeUInt32Fp write; - readUInt32Fp read; -} functionsUInt32_t; + 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; /* Write 32-bit function pointer with channel selection */ typedef halcs_client_err_e (*writeUInt32ChanFp)(halcs_client_t *self, char *service, @@ -90,6 +190,8 @@ typedef struct { /* Forward declaration as struct functionsAny_t needs it */ class drvFOFB; +/* Idea based on https://stackoverflow.com/questions/15102139/boostany-and-templates*/ + /* Generic Function Structure for "any" function pointer */ struct functionsAny_t { template @@ -157,7 +259,24 @@ 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 */ + * * * * They are used by asyn clients, including standard asyn device support */ +#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_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 */ @@ -219,10 +338,17 @@ struct functionsAny_t { #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 { +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 */ @@ -230,18 +356,42 @@ class drvFOFB : public asynPortDriver { 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 acqSPTask(int coreID, double pollTime, bool autoStart); + void acqMonitTask(); + /* Overloaded functions for extracting service name*/ + const char *doGetServiceNameFromFunc (functionsUInt32_t &func) const + { + return func.serviceName; + } + const char *doGetServiceNameFromFunc (functionsInt32_t &func) const { return func.serviceName; } - const char *doGetServiceNameFromFunc (functionsUInt32_t &func) const + 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; } @@ -252,23 +402,35 @@ class drvFOFB : public asynPortDriver { } /* Overloaded function mappings called by functionsAny_t */ - asynStatus doExecuteHwWriteFunction(functionsInt32_t &func, char *service, + 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 doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char *service, int addr, functionsArgs_t &functionParam) const; asynStatus doExecuteHwWriteFunction(functionsUInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const; + asynStatus doExecuteHwWriteFunction(functionsInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; asynStatus executeHwWriteFunction(int functionId, int addr, functionsArgs_t &functionParam); - asynStatus doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char *service, - int addr, functionsArgs_t &functionParam) const; - asynStatus doExecuteHwReadFunction(functionsInt32_t &func, char *service, + 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; + asynStatus doExecuteHwReadFunction(functionsUInt32Chan_t &func, char *service, int addr, functionsArgs_t &functionParam) const; asynStatus doExecuteHwReadFunction(functionsUInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const; + asynStatus doExecuteHwReadFunction(functionsInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; asynStatus executeHwReadFunction(int functionId, int addr, functionsArgs_t &functionParam); - asynStatus doExecuteHwReadFunction(functionsUInt32Chan_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,8 +442,25 @@ class drvFOFB : public asynPortDriver { protected: /** Values used for pasynUser->reason, and indexes into the parameter library. */ + int P_SamplesPre; +#define FIRST_COMMAND 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_FofbProcessingRamWrite; -#define FIRST_COMMAND P_FofbProcessingRamWrite int P_FofbProcessingRamAddr; int P_FofbProcessingRamDataIn; int P_FofbProcessingRamDataOut; @@ -346,11 +525,25 @@ class drvFOFB : public asynPortDriver { 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]; + fofb_single_pass_t *fofbSinglePass[NUM_ACQ_CORES_PER_FOFB]; char *endpoint; int fofbNumber; + int fofbMaxPoints; int verbose; int timeout; char *fofbPortName; + char *fofbType; + int readingActive[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + int repetitiveTrigger[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId startAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId stopAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId abortAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId reconfSPassAcqEventId[NUM_ACQ_CORES_PER_FOFB]; + epicsEventId activeAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId activeMonitEnableEventId; std::unordered_map fofbHwFunc; /* Our private methods */ @@ -359,16 +552,45 @@ 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 startSPAcq(fofb_single_pass_t *fofb_single_pass); + 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, int fofbMode, bool abortAcqHw = false); + asynStatus stopAcqTask(int addr, int fofbMode); + int checkAcqCompletion(int coreID); + int checkSPAcqCompletion(fofb_single_pass_t *fofb_single_pass); + asynStatus getAcqCurve(int coreID, NDArray *pArrayAllChannels, int hwChannel, + epicsUInt32 num_samples_pre, epicsUInt32 num_samples_post, + epicsUInt32 num_shots); + asynStatus getAcqSPCurve(fofb_single_pass_t *fofb_single_pass, NDArray *pArrayAllChannels); + asynStatus getAcqSPSamples(fofb_single_pass_t *fofb_single_pass, fofb_sample_t *fofb_sample); + asynStatus deinterleaveNDArray (NDArray *pArrayAllChannels, const int *pNDArrayAddr, + int pNDArrayAddrSize, int arrayCounter, epicsTimeStamp *timeStamp); + /* General set/get hardware functions */ + asynStatus computePositions(int coreID, NDArray *pArrayAllChannels, int channel, + epicsTimeStamp *timeStamp); 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 */ }; @@ -412,3 +634,4 @@ const char *functionsAny_t::getServiceNameFromFunc(const drvFOFB& drvFOFB, auto functionFpCast = any_cast(functionFp); return drvFOFB.doGetServiceNameFromFunc(functionFpCast); } + From b4a446caf929eb6640e96e46e522a20f9a2b11bd Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 14 Dec 2021 09:14:59 -0200 Subject: [PATCH 02/42] Revert "FOFBApp/src: fix fofb_ctrl SDB name in function arguments" This reverts commit 512f8650bac0f93a023728991e255a94c6475bb0. --- FOFBApp/src/drvFOFB.cpp | 76 ++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 750d81f..c4d7f3c 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -143,81 +143,81 @@ 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, +static const functionsAny_t fofbCtrlSetGetActPartFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGeErrClrFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetCcEnableFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetTfsOverrideFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetBpmIdFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetTimeFrameLenFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetMgtPowerdownFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetMgtLoopbackFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetTimeFrameDlyFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetGoldenOrbXFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetGoldenOrbYFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetCustFeatureFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetRxPolarityFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetPayloadselFunc = {functionsUInt32_t{"FOFB_CC", halcs_set_fofb_ctrl_payloadsel, halcs_get_fofb_ctrl_payloadsel}}; -static const functionsAny_t fofbCtrlSetGetFofbdataselFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_fofbdatasel, +static const functionsAny_t fofbCtrlSetGetFofbdataselFunc = {functionsUInt32_t{"FOFB_CC", halcs_set_fofb_ctrl_fofbdatasel, halcs_get_fofb_ctrl_fofbdatasel}}; -static const functionsAny_t fofbCtrlSetGetFirmwareVerFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetFirmwareVerFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_firmware_ver}}; -static const functionsAny_t fofbCtrlSetGetSysStatusFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetSysStatusFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_sys_status}}; -static const functionsAny_t fofbCtrlSetGetLinkPartnerFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetLinkPartnerFunc = {functionsUInt32Chan_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_link_partner}}; -static const functionsAny_t fofbCtrlSetGetLinkUpFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetLinkUpFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_link_up}}; -static const functionsAny_t fofbCtrlSetGetTimeFrameCountFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetTimeFrameCountFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_time_frame_count}}; -static const functionsAny_t fofbCtrlSetGetHardErrCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetHardErrCntFunc = {functionsUInt32Chan_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_hard_err_cnt}}; -static const functionsAny_t fofbCtrlSetGetSoftErrCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetSoftErrCntFunc = {functionsUInt32Chan_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_soft_err_cnt}}; -static const functionsAny_t fofbCtrlSetGetFrameErrCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetFrameErrCntFunc = {functionsUInt32Chan_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_frame_err_cnt}}; -static const functionsAny_t fofbCtrlSetGetRxPckCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetRxPckCntFunc = {functionsUInt32Chan_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_rx_pck_cnt}}; -static const functionsAny_t fofbCtrlSetGetTxPckCntFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetTxPckCntFunc = {functionsUInt32Chan_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_tx_pck_cnt}}; -static const functionsAny_t fofbCtrlSetGetFodProcessTimeFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetFodProcessTimeFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_fod_process_time}}; -static const functionsAny_t fofbCtrlSetGetBpmCntFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetBpmCntFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_bpm_count}}; -static const functionsAny_t fofbCtrlSetGetBpmIdRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetBpmIdRdbackFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_bpm_id_rdback}}; -static const functionsAny_t fofbCtrlSetGetTfLengthRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetTfLengthRdbackFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_tf_length_rdback}}; -static const functionsAny_t fofbCtrlSetGetPowerdownRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetPowerdownRdbackFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_powerdown_rdback}}; -static const functionsAny_t fofbCtrlSetGetLoopbackRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetLoopbackRdbackFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_loopback_rdback}}; -static const functionsAny_t fofbCtrlSetGetFaivalRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetFaivalRdbackFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_faival_rdback}}; -static const functionsAny_t fofbCtrlSetGetToaRdEnFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_toa_rd_en, +static const functionsAny_t fofbCtrlSetGetToaRdEnFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetToaRdStrFunc = {functionsUInt32_t{"FOFB_CC", halcs_set_fofb_ctrl_toa_rd_str, halcs_get_fofb_ctrl_toa_rd_str}}; -static const functionsAny_t fofbCtrlSetGetToaDataFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetToaDataFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_toa_data}}; -static const functionsAny_t fofbCtrlSetGetRcbRdEnFunc = {functionsUInt32_t{"FOFB_CTRL", halcs_set_fofb_ctrl_rcb_rd_en, +static const functionsAny_t fofbCtrlSetGetRcbRdEnFunc = {functionsUInt32_t{"FOFB_CC", 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, +static const functionsAny_t fofbCtrlSetGetRcbRdStrFunc = {functionsUInt32_t{"FOFB_CC", halcs_set_fofb_ctrl_rcb_rd_str, halcs_get_fofb_ctrl_rcb_rd_str}}; -static const functionsAny_t fofbCtrlSetGetRcbDataFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, +static const functionsAny_t fofbCtrlSetGetRcbDataFunc = {functionsUInt32_t{"FOFB_CC", NULL, halcs_get_fofb_ctrl_rcb_data}}; static const char *driverName="drvFOFB"; From bad435be43922591eef3cd9c3636615113e5ae16 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 14 Dec 2021 09:27:43 -0200 Subject: [PATCH 03/42] Revert "FOFBApp/src: acq functions added" This reverts commit ff4cbcc35c28c1bfed43a508651aaeeea883aecc. --- FOFBApp/src/drvFOFB.cpp | 3165 +++------------------------------------ FOFBApp/src/drvFOFB.h | 279 +--- 2 files changed, 226 insertions(+), 3218 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index c4d7f3c..ca4e3c4 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,81 +24,38 @@ #include "drvFOFB.h" #include -/** The polling interval when checking to see if acquisition is complete */ -#define FOFB_POLL_TIME .1 -#define FOFB_SP_POLL_TIME .01 -#define FOFB_PM_POLL_TIME 1 - #define SERVICE_NAME_SIZE 50 -typedef struct { - drvFOFB *drvFOFBp; - fofb_coreID_types coreID; - double pollTime; - bool autoStart; -} taskParams_t; - static const boardMap_t boardMap[MAX_FOFBS+1] = { /* board, fofb*/ - /* 0 (INVALID) */ {-1, -1, -1}, - /* 1 */ {1, 0, 2}, - /* 2 */ {1, 1, 3}, - /* 3 */ {2, 0, 2}, - /* 4 */ {2, 1, 3}, - /* 5 */ {3, 0, 2}, - /* 6 */ {3, 1, 3}, - /* 7 */ {4, 0, 2}, - /* 8 */ {4, 1, 3}, - /* 9 */ {5, 0, 2}, - /* 10 */ {5, 1, 3}, - /* 11 */ {6, 0, 2}, - /* 12 */ {6, 1, 3}, - /* 13 */ {7, 0, 2}, - /* 14 */ {7, 1, 3}, - /* 15 */ {8, 0, 2}, - /* 16 */ {8, 1, 3}, - /* 17 */ {9, 0, 2}, - /* 18 */ {9, 1, 3}, - /* 19 */ {10, 0, 2}, - /* 20 */ {10, 1, 3}, - /* 21 */ {11, 0, 2}, - /* 22 */ {11, 1, 3}, - /* 23 */ {12, 0, 2}, - /* 24 */ {12, 1, 3} + /* 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} }; -/* This function should not be called, as there is no client function to replace it and - * * * the EPICS Db should not export PVs that maps here. - * * * FIXME: not sure why, but some unavailable functions are called even with no - * * * "apperently" Db record mapped to it. When this happens, segfault occurs. So, - * * * until we figure out what s happening we keep "NULL" function mapped to this dummy - * * * fcuntions */ -static halcs_client_err_e halcs_dummy_read_32 (halcs_client_t *self, char *service, uint32_t *param) -{ - (void) self; - (void) service; - (void) param; - return HALCS_CLIENT_ERR_INV_FUNCTION; -} - -static halcs_client_err_e halcs_dummy_read_chan_32 (halcs_client_t *self, char *service, - uint32_t chan, uint32_t *param) -{ - (void) self; - (void) service; - (void) chan; - (void) param; - return HALCS_CLIENT_ERR_INV_FUNCTION; -} - /* Int32 functions mapping */ -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 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, @@ -221,51 +178,7 @@ static const functionsAny_t fofbCtrlSetGetRcbDataFunc = {functio halcs_get_fofb_ctrl_rcb_data}}; 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 - }, - /* Post-Mortem Core */ - { - NULL, // drvFOFBp - FOFBIDPM, // coreID - FOFB_PM_POLL_TIME, // pollTime - true // autoStart - }, -}; -static taskParams_t taskSPParams[NUM_ACQ_CORES_PER_FOFB] = { - /* Regular Core */ - { - NULL, // drvFOFBp - FOFBIDReg, // coreID - FOFB_SP_POLL_TIME, // pollTime - false // autoStart - }, -#if 0 - /* Post-Mortem Core */ - { - NULL, // drvFOFBp - FOFBIDPM, // coreID - FOFB_PM_POLL_TIME, // pollTime - false // autoStart - }, -#endif -}; -static taskParams_t taskMonitParams = { - NULL, // drvFOFBp - FOFBIDReg, // coreID - FOFB_POLL_TIME, // pollTime - false // autoStart -}; - void acqTask(void *drvPvt); -void acqSPTask(void *drvPvt); -void acqMonitTask(void *drvPvt); static void exitHandlerC(void *pPvt) { @@ -291,35 +204,9 @@ asynStatus drvFOFB::getServiceID (int fofbNumber, int addr, const char *serviceN { static const char *functionName = "getServiceID"; asynStatus status = asynSuccess; - int serviceID = 0; - int addrMod = 0; - - if (streq(serviceName, "ACQ")) { - addrMod = addr; - } - else { - addrMod = 0; - } - - switch (addrMod) { - case FOFBIDReg: - serviceID = boardMap[fofbNumber].fofb; - break; - case FOFBIDPM: - serviceID = boardMap[fofbNumber].core_id; - 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; } @@ -355,18 +242,16 @@ asynStatus drvFOFB::getFullServiceName (int fofbNumber, int addr, const char *se } /** 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 ] - * * * * */ + * * * 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, - const char *type, int verbose, int timeout, int maxPoints, - int maxBuffers, size_t maxMemory) - : asynNDArrayDriver(portName, + int verbose, int timeout) + : asynPortDriver(portName, MAX_ADDR, /* maxAddr */ - maxBuffers, maxMemory, /* maxBuffers, maxMemory */ - asynUInt32DigitalMask | asynInt32Mask | asynInt16ArrayMask | asynFloat64Mask | asynGenericPointerMask | asynDrvUserMask, /* Interface mask */ - asynUInt32DigitalMask | asynInt32Mask | asynInt16ArrayMask | asynFloat64Mask | asynGenericPointerMask, /* Interrupt mask */ + asynUInt32DigitalMask | asynFloat64Mask | asynDrvUserMask, /* Interface mask */ + asynUInt32DigitalMask | asynFloat64Mask , /* Interrupt mask */ ASYN_CANBLOCK | ASYN_MULTIDEVICE, /* asynFlags. This driver blocks it is multi-device */ 1, /* Autoconnect */ 0, /* Default priority */ @@ -375,12 +260,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, asynStatus status; const char *functionName = "drvFOFB"; - srand(time(NULL)); - /* Create portName so we can create a new AsynUser later */ fofbPortName = epicsStrDup(portName); - fofbType = epicsStrDup(type); - fofbMaxPoints = maxPoints; this->endpoint = strdup(endpoint); if (this->endpoint == NULL) { @@ -403,72 +284,15 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, this->verbose = verbose; this->timeout = timeout; - for (int i = 0; i < NUM_FOFB_MODES; ++i) { - for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { - this->readingActive[i][j] = 0; - this->repetitiveTrigger[i][j] = 0; - } - } - - for (int i = 0; i < NUM_FOFB_MODES; ++i) { - - this->reconfSPassAcqEventId[i] = epicsEventCreate(epicsEventEmpty); - if (!this->reconfSPassAcqEventId[i]) { - printf("%s:%s: epicsEventCreate[%d] failure for SP reconfig. event\n", - driverName, functionName, i); - return; - } - - for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { - /* Create events for signalling acquisition thread */ - this->startAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); - if (!this->startAcqEventId[i][j]) { - asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s epicsEventCreate[%d] failure for start event\n", - driverName, functionName, i); - return; - } - - this->stopAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); - if (!this->stopAcqEventId[i][j]) { - printf("%s:%s: epicsEventCreate[%d] failure for stop event\n", - driverName, functionName, i); - return; - } - - this->abortAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); - if (!this->abortAcqEventId[i][j]) { - printf("%s:%s: epicsEventCreate[%d] failure for abort event\n", - driverName, functionName, i); - return; - } - - this->activeAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); - if (!this->activeAcqEventId[i][j]) { - printf("%s:%s: epicsEventCreate[%d] failure for active event\n", - driverName, functionName, i); - 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 creation must be the same as defined in .h file. - * * * * Otherwise, checking for FIRST_PARAM/LAST_PARAM won't work */ + /* CAUTION. The order of craetion must be the same as defined in .h file. + * * * 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); @@ -530,31 +354,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, createParam(P_FofbCtrlRcbRdStrString, asynParamUInt32Digital, &P_FofbCtrlRcbRdStr); createParam(P_FofbCtrlRcbDataString, asynParamUInt32Digital, &P_FofbCtrlRcbData); - /* Create acquistion parameters */ - 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 FOFB Status parameters */ - createParam(P_FOFBModeString, asynParamInt32, &P_FOFBMode); - createParam(P_FOFBStatusString, asynParamInt32, &P_FOFBStatus); - /* FOFB HW Int32 Functions mapping. Functions not mapped here are just written - * * * * to the parameter library */ + * * * to the parameter library */ fofbHwFunc.emplace(P_FofbProcessingRamWrite, fofbProcessingSetGetRamWriteFunc); fofbHwFunc.emplace(P_FofbProcessingRamAddr, fofbProcessingSetGetRamAddrFunc); fofbHwFunc.emplace(P_FofbProcessingRamDataIn, fofbProcessingSetGetRamDataInFunc); @@ -621,8 +422,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, 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 */ + * * * will ensure the reconnection to server if necessary, but we + * * * must succeed here or we must abort completely */ if (status != asynSuccess) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error calling fofbClientConnect, status=%d\n", @@ -631,6 +432,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* Set the initial values of some parameters */ + setUIntDigitalParam(P_FofbProcessingRamWrite, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbProcessingRamAddr, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbProcessingRamDataIn, 0, 0xFFFFFFFF); @@ -692,135 +494,11 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, setUIntDigitalParam(P_FofbCtrlRcbRdStr, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbCtrlRcbData, 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); - } - - /* Acquisition PM parameters */ - setUIntDigitalParam(FOFBIDPM, P_SamplesPre, SAMPLES_PRE_DEFAULT_PM(fofbMaxPoints), - 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_SamplesPost, SAMPLES_POST_DEFAULT_PM(fofbMaxPoints), - 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_NumShots, NUM_SHOTS_DEFAULT_PM, - 0xFFFFFFFF); - setIntegerParam( FOFBIDPM, P_Channel, CH_DEFAULT_PM); - setDoubleParam( FOFBIDPM, P_UpdateTime, 1.0); - setUIntDigitalParam(FOFBIDPM, P_Trigger, ACQ_CLIENT_TRIG_EXTERNAL, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerEvent, - TRIG_ACQ_START, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerRep, 1, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerDataThres, - 100, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerDataPol, - 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerDataSel, - 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerDataFilt, - 1, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerHwDly, - 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_DataTrigChan, - 0, 0xFFFFFFFF); - - /* Write to HW */ - for (int i = P_SamplesPre; i < P_DataTrigChan+1; ++i) { - setParamGeneric(i, FOFBIDPM); - } - - /* Do callbacks so higher layers see any changes. Call callbacks for every addr */ - for (int i = 0; i < MAX_ADDR; ++i) { - callParamCallbacks(i); - } - /* 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 the thread that computes the SP waveforms in the background */ - /* Assign task parameters passing the ACQ/Trigger instance ID as parameter. - * * * The other parameters are already set-up*/ - taskSPParams[FOFBIDReg].drvFOFBp = this; - status = (asynStatus)(epicsThreadCreate("drvFOFBSPTask", - epicsThreadPriorityMedium, - epicsThreadGetStackSize(epicsThreadStackMedium), - (EPICSTHREADFUNC)::acqSPTask, - &taskSPParams[FOFBIDReg]) == 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); invalid_fofb_number_err: @@ -830,7 +508,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /** Destructor for the drvFOFB class. - * * * */ + * * */ drvFOFB::~drvFOFB() { asynStatus status = asynSuccess; @@ -847,8 +525,6 @@ drvFOFB::~drvFOFB() free (this->endpoint); this->endpoint = NULL; - free (this->fofbType); - this->fofbType = NULL; free (this->fofbPortName); this->fofbPortName = NULL; } @@ -876,47 +552,6 @@ 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 fofbClientConnect 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", driverName, functionName); @@ -925,24 +560,6 @@ asynStatus drvFOFB::fofbClientConnect(asynUser* 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; } @@ -963,2098 +580,170 @@ 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 acqSPTask(void *drvPvt) -{ - taskParams_t *pPvt = (taskParams_t *)drvPvt; - pPvt->drvFOFBp->acqSPTask(pPvt->coreID, pPvt->pollTime, pPvt->autoStart); -} - -void acqMonitTask(void *drvPvt) -{ - taskParams_t *pPvt = (taskParams_t *)drvPvt; - pPvt->drvFOFBp->acqMonitTask(); -} - /********************************************************************/ -/******************* FOFB Acquisition functions **********************/ +/********************* Asyn overrided methods **********************/ /********************************************************************/ -asynStatus drvFOFB::initAcqPM(int coreID) +/* + * * * 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) { - static const char *functionName = "initAcqPM"; + int function = pasynUser->reason; asynStatus status = asynSuccess; + int addr = 0; + const char *paramName; + const char* functionName = "writeUInt32Digital"; - 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); + /* Get channel for possible use */ + status = getAddress(pasynUser, &addr); if (status) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: error calling setAcqEvent, status=%d\n", - driverName, functionName, status); - goto set_acq_trig; + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s, value=%d", + driverName, functionName, status, function, paramName, value); + return status; } - return status; - -set_acq_trig: - return status; -} -/* 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]; + 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); - /* 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 operation on HW. Some functions do not set anything on hardware */ + status = setParam32(function, mask, 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; + else { + /* Call base class */ + status = asynPortDriver::writeUInt32Digital(pasynUser, value, mask); } -halcs_acq_trig_err: -get_service_err: + /* 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; } -/* 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) +/** 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) { - fofb_status_types fofbStatus = FOFBStatusErrAcq; + int function = pasynUser->reason; asynStatus status = asynSuccess; - halcs_client_err_e herr = HALCS_CLIENT_SUCCESS; - uint32_t trig = 0; - const char* functionName = "getFOFBAcqStatus"; - char service[SERVICE_NAME_SIZE]; + int addr = 0; + const char *functionName = "readUInt32Digital"; + const char *paramName; - /* Get correct service name*/ - status = getFullServiceName (this->fofbNumber, coreID, "ACQ", service, sizeof(service)); + /* Get channel for possible use */ + status = getAddress(pasynUser, &addr); if (status) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: error calling getFullServiceName, status=%d\n", - driverName, functionName, status); - goto get_service_err; + epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, + "%s:%s: status=%d, function=%d, name=%s", + driverName, functionName, status, function, paramName); + return status; } + /* Fetch the parameter string name for possible use in debugging */ + getParamName(function, ¶mName); - /* Have ACQ engine completed some work or is it still busy? */ - herr = acq_check (fofbClientAcqParam[coreID], service); - if (herr == HALCS_CLIENT_SUCCESS) { - return FOFBStatusIdle; + if (function >= FIRST_COMMAND) { + /* Get parameter, possibly from HW */ + status = getParam32(function, value, mask, addr); } - - /* 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; + else { + /* Call base class */ + status = asynPortDriver::readUInt32Digital(pasynUser, value, mask); } - 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; + 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); - case ACQ_CLIENT_TRIG_EXTERNAL: - fofbStatus = FOFBStatusTriggerHwExtWaiting; - break; + return status; +} - case ACQ_CLIENT_TRIG_DATA_DRIVEN: - fofbStatus = FOFBStatusTriggerHwDataWaiting; - break; +/********************************************************************/ +/************ Function Mapping Overloaded Write functions ***********/ +/********************************************************************/ - case ACQ_CLIENT_TRIG_SOFTWARE: - fofbStatus = FOFBStatusTriggerSwWaiting; - 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; - default: - fofbStatus = FOFBStatusErrAcq; + /* 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; } -get_service_err: - return fofbStatus; +halcs_set_func_param_err: + return (asynStatus)status; } -static bool acqIsFOFBStatusWaitSomeTrigger(int fofbStatus) +asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32_t &func, char *service, + int addr, functionsArgs_t &functionParam) const { - if (fofbStatus == FOFBStatusTriggerHwExtWaiting || - fofbStatus == FOFBStatusTriggerHwDataWaiting || - fofbStatus == FOFBStatusTriggerSwWaiting) { - return true; - } - - return false; -} + const char *functionName = "doExecuteHwWriteFunction"; + halcs_client_err_e err = HALCS_CLIENT_SUCCESS; + int status = asynSuccess; -static bool acqIsFOFBStatusErr(int fofbStatus) -{ - if (fofbStatus == FOFBStatusErrAcq || - fofbStatus == FOFBStatusAborted || - fofbStatus == FOFBStatusErrTooManyPoints || - fofbStatus == FOFBStatusErrTooFewPoints || - fofbStatus == FOFBStatusErrNoMem || - fofbStatus == FOFBStatusErrAcqOFlow) { - 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; +halcs_set_func_param_err: + return (asynStatus)status; } -/* - * * * FOFB acquisition functions - * * */ - -/** Acquisition task that runs as a separate thread. - * * * CAUTION. FIXME? Only one acquisition task is working at any given time: MultiMode or SinglePass - * * */ -void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) +asynStatus drvFOFB::executeHwWriteFunction(int functionId, int addr, + functionsArgs_t &functionParam) { int status = asynSuccess; - 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; - int fofbMode; - epicsUInt32 trigger; - double updateTime; - double delay; - int hwAmpChannel = 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; - } - - /* 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[FOFBModeMultiBunch][coreID], pollTime); - if (status == epicsEventWaitOK || !repetitiveTrigger[FOFBModeMultiBunch][coreID] || acqIsFOFBStatusErr(fofbStatus)) { - /* We got a stop event, stop repetitive acquisition */ - readingActive[FOFBModeMultiBunch][coreID] = 0; - - /* Wait until we are in MultiBunch mode */ - getIntegerParam(coreID, P_FOFBMode, &fofbMode); - if (fofbMode != FOFBModeMultiBunch) { - unlock (); - asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: waiting for FOFBMode = MultiBunch\n", driverName, functionName); - epicsEventWait(activeAcqEventId[FOFBModeMultiBunch][coreID]); - lock (); - } - - /* 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[FOFBModeMultiBunch][coreID]); - lock(); - } - readingActive[FOFBModeMultiBunch][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_AMP_TYPES) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: unsupported numAtoms > %d. Reduce this value in the gateware\n", - driverName, functionName, MAX_WVF_AMP_TYPES); - continue; - } - - /* Convert user channel into hw channel */ - hwAmpChannel = channelMap[channel].HwAmpChannel; - if(hwAmpChannel < 0) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", - driverName, functionName, hwAmpChannel); - 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, hwAmpChannel, 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, hwAmpChannel, 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[FOFBModeMultiBunch][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, hwAmpChannel, 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].NDArrayAmp[coreID][WVF_AMP_ALL]); - - /* Copy AMP data to arrays for each type of data, do callbacks on that */ - status = deinterleaveNDArray(pArrayAllChannels, channelMap[channel].NDArrayAmp[coreID], - dims[0], arrayCounter, &now); - if (status != asynSuccess) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: unable to deinterleave NDArray\n", - driverName, functionName); - continue; - } - - /* Calculate positions and call callbacks */ - status = computePositions(coreID, pArrayAllChannels, channel, &now); - if (status != asynSuccess) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: unable to compute positions\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[FOFBModeMultiBunch][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[FOFBModeMultiBunch][coreID], delay); - lock(); - } - } - } -} - -/** Acquisition task for Single Pass FOFB mode that runs as a separate thread. - * * * CAUTION. FIXME? Only one acquisition task is working at any given time: MultiMode or SinglePass - * * */ -void drvFOFB::acqSPTask(int coreID, double pollTime, bool autoStart) -{ - int status = asynSuccess; - 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; - int fofbMode; - epicsUInt32 trigger; - epicsUInt32 TriggerDataThres; - epicsUInt32 TriggerDataPol; - epicsUInt32 TriggerDataSel; - epicsUInt32 TriggerDataFilt; - epicsUInt32 TriggerHwDly; - epicsUInt32 DataTrigChan; - fofb_sample_t fofb_sample = {0}; - char service[SERVICE_NAME_SIZE]; - char service_board[SERVICE_NAME_SIZE]; - int hwAmpChannel = 0; - int acqCompleted = 0; - int fofbStatus = 0; - int interrupted = 0; - bool autoStartFirst = autoStart; - epicsTimeStamp now; - epicsFloat64 timeStamp; - NDArray *pArrayAllChannels = NULL; - NDDataType_t NDType = NDInt32; - epicsTimeStamp startTime; - int arrayCounter; - size_t dims[MAX_WVF_DIMS]; - fofb_single_pass_t *fofb_single_pass = NULL; - static const char *functionName = "acqSPTask"; - - /* 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; - } - - /* Loop forever */ - lock (); - while (1) { - /* Free buffers if needed*/ - if (pArrayAllChannels) { - pArrayAllChannels->release (); - pArrayAllChannels = NULL; - } - - /* Clear out any flags*/ - interrupted = 0; - - /* We got a stop event, stop acquisition */ - readingActive[FOFBModeSinglePass][coreID] = 0; - - /* Wait until we are in SinglePass mode */ - getIntegerParam(coreID, P_FOFBMode, &fofbMode); - if (fofbMode != FOFBModeSinglePass) { - unlock (); - asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: waiting for FOFBMode = SinglePass\n", driverName, functionName); - epicsEventWait(activeAcqEventId[FOFBModeSinglePass][coreID]); - lock (); - } - - getIntegerParam(coreID, P_FOFBStatus, &fofbStatus); - - /* Only change state to IDLE if we are not in a error state and we have just acquired some data */ - 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 (!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[FOFBModeSinglePass][coreID]); - lock(); - } - readingActive[FOFBModeSinglePass][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); - 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_AMP_TYPES) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: unsupported numAtoms > %d. Reduce this value in the gateware\n", - driverName, functionName, MAX_WVF_AMP_TYPES); - continue; - } - - /* Select our "fake" channel if we are in single pass mode. - * * * This is done so we can the same flow as FOFBModeMultiBunch mode, - * * * without having to separate the implementations */ - channel = CH_SP; - - /* Convert user channel into hw channel */ - hwAmpChannel = channelMap[channel].HwAmpChannel; - if(hwAmpChannel < 0) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", - driverName, functionName, hwAmpChannel); - 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; - } - - status = getAcqNDArrayType(coreID, hwAmpChannel, 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; - } - - /* Tell we are acquiring just before we actually start it */ - setIntegerParam(coreID, P_FOFBStatus, FOFBStatusAcquire); - callParamCallbacks(coreID); - - getUIntDigitalParam(coreID, P_TriggerDataThres, &TriggerDataThres, 0xFFFFFFFF); - getUIntDigitalParam(coreID, P_TriggerDataPol, &TriggerDataPol, 0xFFFFFFFF); - getUIntDigitalParam(coreID, P_TriggerDataSel, &TriggerDataSel, 0xFFFFFFFF); - getUIntDigitalParam(coreID, P_TriggerDataFilt, &TriggerDataFilt, 0xFFFFFFFF); - getUIntDigitalParam(coreID, P_TriggerHwDly, &TriggerHwDly, 0xFFFFFFFF); - getUIntDigitalParam(coreID, P_DataTrigChan, &DataTrigChan, 0xFFFFFFFF); - - /* 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); - continue; - } - - status = getFullServiceName (this->fofbNumber, coreID, "INIT", service_board, - sizeof(service_board)); - if (status) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: error calling getFullServiceName for INIT service, status=%d\n", - driverName, functionName, status); - continue; - } - - /* Reconfigure acquisition */ - status = epicsEventTryWait(this->reconfSPassAcqEventId[coreID]); - if (status == epicsEventWaitOK) { - if (fofb_single_pass != NULL) { - fofb_single_pass_destroy (&fofb_single_pass); - } - } - - if (fofb_single_pass == NULL) { - fofb_single_pass = fofb_single_pass_new (this->endpoint, - this->verbose, NULL, service, service_board, - &fofb_parameters, num_samples_pre, num_samples_post, - num_shots); - if (fofb_single_pass == NULL) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: fofb_single_pass could not be created, status=%d\n", - driverName, functionName, status); - continue; - } - } - - fofb_single_pass_configure_trigger (fofb_single_pass, TriggerDataFilt, - TriggerDataPol, TriggerHwDly); - if (trigger == ACQ_CLIENT_TRIG_DATA_DRIVEN) { - fofb_single_pass_configure_data_trigger (fofb_single_pass, - TriggerDataThres, TriggerDataSel); - } - else if (trigger == ACQ_CLIENT_TRIG_EXTERNAL) { - fofb_single_pass_configure_external_trigger (fofb_single_pass); - } - else { - /* Invalid trigger for SP*/ - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: Invalid trigger for Single Pass\n", - driverName, functionName); - setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrAcq); - callParamCallbacks(coreID); - continue; - } - - /* Do acquisition until a stop event arrives */ - while (1) { - /* If we were interrupted, jut go back to waiting the start event */ - if (interrupted) { - break; - } - - /* Waveform statistics */ - epicsTimeGetCurrent(&now); - getIntegerParam(NDArrayCounter, &arrayCounter); - arrayCounter++; - setIntegerParam(NDArrayCounter, arrayCounter); - 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); - - unlock(); - pasynManager->lockPort(pasynUser); - status = startSPAcq(fofb_single_pass); - 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); - break; - } - - /* Wait for acquisition to complete, but allow acquire stop events to be handled */ - while (1) { - unlock(); - status = epicsEventWaitWithTimeout(this->abortAcqEventId[FOFBModeSinglePass][coreID], pollTime); - lock(); - if (status == epicsEventWaitOK) { - /* We got a stop event, abort acquisition */ - abortAcq(coreID); - setIntegerParam(coreID, P_FOFBStatus, FOFBStatusAborted); - callParamCallbacks(coreID); - interrupted = 1; - break; - } - else { - acqCompleted = checkSPAcqCompletion (fofb_single_pass); - } - - if (acqCompleted == -1) { - setIntegerParam(coreID, P_FOFBStatus, FOFBStatusErrAcqOFlow); - callParamCallbacks(coreID); - break; - } - - if (acqCompleted == 1) { - /* Get curve */ - getAcqSPSamples(fofb_single_pass, &fofb_sample); - break; - } - } - - /* Only do callbacks and calculate position if we could acquire some - * * * data */ - if (acqCompleted == 1) { - /* Get SinglePass Raw Data for the user */ - getAcqSPCurve(fofb_single_pass, pArrayAllChannels); - /* Do callbacks on the full waveform (all channels interleaved) */ - doCallbacksGenericPointer(pArrayAllChannels, NDArrayData, - channelMap[channel].NDArrayAmp[coreID][WVF_AMP_ALL]); - - /* Copy AMP data to arrays for each type of data, do callbacks on that */ - status = deinterleaveNDArray(pArrayAllChannels, channelMap[channel].NDArrayAmp[coreID], - dims[0], arrayCounter, &now); - if (status != asynSuccess) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: unable to deinterleave NDArray\n", - driverName, functionName); - continue; - } - } - - callParamCallbacks(coreID); - } - - /* Release buffers */ - pArrayAllChannels->release(); - pArrayAllChannels = NULL; - } - - if (fofb_single_pass != NULL) { - fofb_single_pass_destroy (&fofb_single_pass); - } -} - -void drvFOFB::acqMonitTask() -{ - asynStatus status = asynSuccess; - int err = HALCS_CLIENT_SUCCESS; - size_t dims[MAX_WVF_DIMS]; - epicsUInt32 mask = 0xFFFFFFFF; - ABCD_ROW abcdRow; - XYQS_ROW xyqsRow; - XYQS_ROW xyqsFakeRow; - NDArray *pArrayMonitData[MAX_MONIT_DATA]; - double monitData[MAX_MONIT_DATA]; - NDDataType_t NDType = NDFloat64; - int NDArrayAddrInit = WVF_MONIT_AMP_A; - epicsTimeStamp now; - int monitEnable = 0; - static const char *functionName = "acqMonitTask"; - char service[SERVICE_NAME_SIZE]; - - /* Get correct service name*/ - status = getFullServiceName (this->fofbNumber, 0, "DSP", 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; - } - - /* Format channel name */ - strncat (service, ":DATA_PRODUCER", sizeof(service)); - - 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) { - /* Prepare for position calculation */ - abcdRow.A = monit_data.amp_ch0; - abcdRow.B = monit_data.amp_ch1; - abcdRow.C = monit_data.amp_ch2; - abcdRow.D = monit_data.amp_ch3; - - ABCDtoXYQS(&abcdRow, &xyqsRow, 1, true); - ABCDtoXYQS(&abcdRow, &xyqsFakeRow, 1, false); - - monitData[0] = monit_data.amp_ch0; - monitData[1] = monit_data.amp_ch1; - monitData[2] = monit_data.amp_ch2; - monitData[3] = monit_data.amp_ch3; - monitData[4] = xyqsRow.X; - monitData[5] = xyqsRow.Y; - monitData[6] = xyqsRow.Q; - monitData[7] = xyqsRow.S; - monitData[8] = xyqsFakeRow.X; - monitData[9] = xyqsFakeRow.Y; - - 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. AMP/POS 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 hwAmpChannel = 0; - int channel = 0; - int fofbMode = 0; - int fofbModeOther = 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_FOFBMode, &fofbMode); - getIntegerParam( addr, P_Channel, &channel); - - /* Convert user channel into hw channel */ - hwAmpChannel = channelMap[channel].HwAmpChannel; - if(hwAmpChannel < 0) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", - driverName, functionName, hwAmpChannel); - status = asynError; - goto halcs_inv_channel; - } - - /* Get channel properties */ - status = getChannelProperties(addr, hwAmpChannel, &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); - - /* Get the other acquisition task mode */ - if (fofbMode == FOFBModeSinglePass) { - fofbModeOther = FOFBModeMultiBunch; - } - else { - fofbModeOther = FOFBModeSinglePass; - } - - switch (triggerEvent) { - case TRIG_ACQ_START: - /* Abort the other acquisition task if needed */ - stopAcqTask(addr, fofbModeOther); - abortAcqTask(addr, fofbModeOther, false); - - /* Don't try to change anything is we are still acquiring. - * * * We must stop r abort the acquisition first */ - if (readingActive[fofbMode][addr]) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: Not starting acquistion as acqTask is still active\n", - driverName, functionName); - break; - } - - if (triggerRep) { - repetitiveTrigger[fofbMode][addr] = 1; - } - else { - repetitiveTrigger[fofbMode][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[fofbMode][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[fofbMode][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, fofbMode); - 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, fofbMode, 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, int fofbMode, bool abortAcqHw) -{ - asynStatus status = asynSuccess; - const char* functionName = "abortAcqTask"; - - /* we are waiting for a trigger */ - if (readingActive[fofbMode][addr]) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: trigger ACQ_ABORT called for acqTask = %d, coreID = %d\n", - driverName, functionName, fofbMode, addr); - epicsEventSignal(this->abortAcqEventId[fofbMode][addr]); - } - else { - asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: trigger ACQ_ABORT but with acquisition in progress, " - "called for acqTask = %d, coreID = %d\n", - driverName, functionName, fofbMode, 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::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::startSPAcq(fofb_single_pass_t *fofb_single_pass) -{ - asynStatus status = asynSuccess; - halcs_client_err_e err = HALCS_CLIENT_SUCCESS; - const char* functionName = "startSPAcq"; - - err = fofb_single_pass_start (fofb_single_pass); - if (err != HALCS_CLIENT_SUCCESS) { - status = asynError; - } - else { - status = asynSuccess; - } - - 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; -} - -int drvFOFB::checkSPAcqCompletion(fofb_single_pass_t *fofb_single_pass) -{ - int complete = 0; - halcs_client_err_e err = HALCS_CLIENT_SUCCESS; - const char* functionName = "checkSPAcqCompletion"; - - err = fofb_single_pass_check (fofb_single_pass); - /* 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: - 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::getAcqSPCurve(fofb_single_pass_t *fofb_single_pass, NDArray *pArrayAllChannels) -{ - asynStatus status = asynSuccess; - const char* functionName = "getAcqSPCurve"; - - /* Copy data to NDArray */ - const acq_trans_t * acq_trans = fofb_single_pass_get_acq_transaction (fofb_single_pass); - memcpy (pArrayAllChannels->pData, acq_trans->block.data, acq_trans->block.data_size); - pArrayAllChannels->dataSize = acq_trans->block.data_size; - - return status; -} - -asynStatus drvFOFB::getAcqSPSamples(fofb_single_pass_t *fofb_single_pass, fofb_sample_t *fofb_sample) -{ - asynStatus status = asynSuccess; - halcs_client_err_e err = HALCS_CLIENT_SUCCESS; - const char* functionName = "getAcqSPSamples"; - - err = fofb_single_pass_sample (fofb_single_pass, fofb_sample); - if (err != HALCS_CLIENT_SUCCESS) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: unable to read Single Pass samples\n", - driverName, functionName); - status = asynError; - goto halcs_acq_err; - } - -halcs_acq_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; - 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); - /* 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 */ - status = asynPortDriver::writeUInt32Digital(pasynUser, value, mask); - } - - /* 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; - - /* 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; - } - /* 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); - } - else { - /* Call base class */ - status = asynPortDriver::readUInt32Digital(pasynUser, value, mask); - } - - 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. */ - status = 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 if (function == P_FOFBMode) { - status = setFOFBMode(addr, function); - } - else { - /* Do operation on HW. Some functions do not set anything on hardware */ - status = setParamInteger(function, addr); - /* Readback all parameters from Hw */ - readIntegerParams(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); - /* Readback all parameters from Hw */ - readFloat64Params(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(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(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::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; -} - -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; + 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); @@ -3115,56 +804,23 @@ asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char * err = func.write(fofbClient, serviceChanStr, serviceChan, 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, serviceChanStr, - functionParam.argUInt32); - status = asynError; - goto halcs_set_func_param_err; - } - -halcs_set_func_param_err: -get_service_err: - return (asynStatus) status; -} - -/********************************************************************/ -/************ Function Mapping Overloaded Read functions ************/ -/********************************************************************/ - -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); + "%s:%s: failure executing write function for service %s," + "param = %u\n", + driverName, functionName, serviceChanStr, + functionParam.argUInt32); status = asynError; - goto halcs_get_func_param_err; + goto halcs_set_func_param_err; } -halcs_get_func_param_err: -get_service_id_err: +halcs_set_func_param_err: +get_service_err: return (asynStatus) status; } +/********************************************************************/ +/************ Function Mapping Overloaded Read functions ************/ +/********************************************************************/ + asynStatus drvFOFB::doExecuteHwReadFunction(functionsInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const { @@ -3206,59 +862,6 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functionsUInt32_t &func, char *servi 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; -} - asynStatus drvFOFB::executeHwReadFunction(int functionId, int addr, functionsArgs_t &functionParam) { @@ -3344,10 +947,10 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functionsUInt32Chan_t &func, char *s /********************************************************************/ /* - * * * * 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) { @@ -3443,60 +1046,6 @@ asynStatus drvFOFB::getParam32(int functionId, epicsUInt32 *param, *param = functionArgs.argUInt32; } /* We recover from asynDisabled just by retrieving - * * * * 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; @@ -3506,334 +1055,26 @@ asynStatus drvFOFB::getParamInteger(int functionId, epicsInt32 *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 FOFB Operations ***********************/ +/*********************** Misc BPM Operations ************************/ /********************************************************************/ /* - * * * * Miscellaneous functions that don't map easily - * * * * to our generic handlers get/setParam[32/Double] - * * * */ - -asynStatus drvFOFB::setFOFBMode(int addr, int function) -{ - int status = asynSuccess; - int fofbMode = 0; - int fofbModeOther = 0; - - /* Get FOFBMode previously set */ - getIntegerParam(addr, P_FOFBMode, &fofbMode); - - /* Throw an error if we are acquiring in the other mode - * * * and we tried to change FOFB mode */ - if (fofbMode == FOFBModeSinglePass) { - fofbModeOther = FOFBModeMultiBunch; - } - else { - fofbModeOther = FOFBModeSinglePass; - } - - /* Check if an acquisition is running while trying to change mode */ - if (readingActive[fofbModeOther][addr]) { - setIntegerParam(addr, function, fofbModeOther); - status = asynError; - goto other_acq_acquiring_err; - } - -other_acq_acquiring_err: - return (asynStatus) status; -} - -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 hwAmpChannel = 0; - int serviceID = 0; - - /* Set the parameter in the parameter library. */ - getUIntDigitalParam(addr, P_DataTrigChan, &dataTrigChan, mask); - - /* Convert user channel into hw channel */ - hwAmpChannel = channelMap[dataTrigChan].HwAmpChannel; - if(hwAmpChannel < 0) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", - driverName, functionName, hwAmpChannel); - 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, hwAmpChannel); - 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 hwAmpChannel = 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, &hwAmpChannel); - if (err != HALCS_CLIENT_SUCCESS) { - status = asynError; - goto halcs_get_data_trig_chan_err; - } - - if (hwAmpChannel > CH_HW_END-1) { - asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelRevMap for channel %d\n", - driverName, functionName, hwAmpChannel); - status = asynError; - goto halcs_inv_hw_channel; - } - - /* Convert user channel into hw channel */ - dataTrigChan = channelRevMap[hwAmpChannel].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; -} + * * * Miscellaneous functions that don't map easily + * * * to our generic handlers get/setParam[32/Double] + * * */ -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::readIntegerParams(int addr) -{ - int status = 0; - - status = readOffsetParams(addr); - - return (asynStatus) status; -} /* 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 */ + * * * \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, const char *type, int verbose, int timeout, - int maxPoints, int maxBuffers, size_t maxMemory) + int fofbNumber, int verbose, int timeout) { - new drvFOFB(portName, endpoint, fofbNumber, type, verbose, - timeout, maxPoints, maxBuffers, maxMemory); + new drvFOFB(portName, endpoint, fofbNumber, verbose, timeout); return(asynSuccess); } @@ -3841,27 +1082,18 @@ extern "C" { static const iocshArg initArg0 = { "portName", iocshArgString}; static const iocshArg initArg1 = { "endpoint", iocshArgString}; static const iocshArg initArg2 = { "fofbNumber", 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 initArg3 = { "verbose", iocshArgInt}; + static const iocshArg initArg4 = { "timeout", iocshArgInt}; static const iocshArg * const initArgs[] = {&initArg0, &initArg1, &initArg2, &initArg3, - &initArg4, - &initArg5, - &initArg6, - &initArg7, - &initArg8}; - static const iocshFuncDef initFuncDef = {"drvFOFBConfigure",9,initArgs}; + &initArg4}; + static const iocshFuncDef initFuncDef = {"drvFOFBConfigure",5,initArgs}; static void initCallFunc(const iocshArgBuf *args) { drvFOFBConfigure(args[0].sval, args[1].sval, args[2].ival, - args[3].sval, args[4].ival, args[5].ival, args[6].ival, - args[7].ival, args[8].ival); + args[3].ival, args[4].ival); } void drvFOFBRegister(void) @@ -3869,6 +1101,5 @@ extern "C" { iocshRegister(&initFuncDef,initCallFunc); } - epicsExportRegistrar(drvFOFBRegister); + epicsExportRegistrar(drvFOFBRegister); } - diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index 9ae4568..29122b8 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -1,21 +1,17 @@ /* - * * * * drvFOFB.h - * * * * - * * * * Authors: Melissa Aguiar - * * * * - * * * * Created Dec. 03, 2021 - * * * */ + * * * drvFOFB.h + * * * + * * * Authors: Melissa Aguiar + * * * + * * * Created Dec. 03, 2021 + * * */ #include "asynPortDriver.h" #include -#include #include -#include /* Third-party libraries */ #include #include -#include -#include /* any implementation for non c++-17 compilers */ #include "any.hpp" @@ -25,43 +21,6 @@ using linb::any_cast; using linb::bad_any_cast; #define ARRAY_SIZE(ARRAY) (sizeof(ARRAY)/sizeof((ARRAY)[0])) -/* Waveforms: RAW data, ADC SWAP data, TBT Amp, TBT Phase, FOFB Amp, FOFB Phase */ -#define MAX_ARRAY_POINTS 200000 -#define FOFB_TIMEOUT 1.0 - -typedef enum { - FOFBIDReg = 0, - FOFBIDPM = 1, - 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 modes */ -typedef enum { - FOFBModeMultiBunch = 0, - FOFBModeSinglePass = 1, - FOFBModeEnd, -} fofb_mode_types; - -#define NUM_FOFB_MODES FOFBModeEnd - -/* FOFB acquisition status */ -typedef enum { - FOFBStatusIdle = 0, - FOFBStatusWaiting, - FOFBStatusTriggerHwExtWaiting, - FOFBStatusTriggerHwDataWaiting, - FOFBStatusTriggerSwWaiting, - FOFBStatusAcquire, - FOFBStatusErrAcq, - FOFBStatusAborted, - FOFBStatusErrTooManyPoints, - FOFBStatusErrTooFewPoints, - FOFBStatusErrNoMem, - FOFBStatusErrAcqOFlow, -} fofb_status_types; #define MAX_SLOTS 12 #define MAX_FOFB_PER_SLOT 2 @@ -76,42 +35,14 @@ typedef enum { typedef struct { int board; int fofb; - int core_id; /* Acquisition and Trigger core IDs */ } boardMap_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 (*writeUInt32Fp)(halcs_client_t *self, char *service, - uint32_t param); -/* Read 32-bit function pointer */ -typedef halcs_client_err_e (*readUInt32Fp)(halcs_client_t *self, char *service, - uint32_t *param); - -/* FOFB command dispatch table */ -typedef struct { - const char *serviceName; - writeUInt32Fp write; - readUInt32Fp read; -} functionsUInt32_t; - /* Write 32-bit function pointer */ typedef halcs_client_err_e (*writeInt32Fp)(halcs_client_t *self, char *service, - int32_t param); + uint32_t param); /* Read 32-bit function pointer */ typedef halcs_client_err_e (*readInt32Fp)(halcs_client_t *self, char *service, - int32_t *param); + uint32_t *param); /* FOFB command dispatch table */ typedef struct { @@ -120,50 +51,19 @@ typedef struct { readInt32Fp read; } functionsInt32_t; -/* Write 32-bit function pointer with acq_client structure */ -typedef halcs_client_err_e (*writeUInt32AcqFp)(acq_client_t *self, char *service, +/* Write 32-bit function pointer */ +typedef halcs_client_err_e (*writeUInt32Fp)(halcs_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); +typedef halcs_client_err_e (*readUInt32Fp)(halcs_client_t *self, char *service, + uint32_t *param); /* FOFB command dispatch table */ typedef struct { const char *serviceName; - writeFloat64Fp write; - readFloat64Fp read; -} functionsFloat64_t; + writeUInt32Fp write; + readUInt32Fp read; +} functionsUInt32_t; /* Write 32-bit function pointer with channel selection */ typedef halcs_client_err_e (*writeUInt32ChanFp)(halcs_client_t *self, char *service, @@ -190,8 +90,6 @@ typedef struct { /* Forward declaration as struct functionsAny_t needs it */ class drvFOFB; -/* Idea based on https://stackoverflow.com/questions/15102139/boostany-and-templates*/ - /* Generic Function Structure for "any" function pointer */ struct functionsAny_t { template @@ -259,24 +157,7 @@ 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_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 */ + * * * 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 */ @@ -338,17 +219,10 @@ struct functionsAny_t { #define P_FofbCtrlRcbRdStrString "FOFB_CC_RCB_CTL_RD_STR" /* asynUInt32Digital, r/w */ #define P_FofbCtrlRcbDataString "FOFB_CC_RCB_DATA_VAL" /* asynUInt32Digital, r/o */ -typedef enum { - TRIG_ACQ_START, - TRIG_ACQ_STOP, - TRIG_ACQ_ABORT, -} trigEvent_e; - -class drvFOFB : public asynNDArrayDriver { +class drvFOFB : public asynPortDriver { public: - drvFOFB(const char *portName, const char *endpoint, int fofbNumber, - const char *type, int verbose, int timeout, - int maxPoints, int maxBuffers, size_t maxMemory); + drvFOFB(const char *portName, const char *endpoint, + int FOFBNumber, int verbose, int timeout); ~drvFOFB(); /* These are the methods that we override from asynPortDriver */ @@ -356,42 +230,18 @@ class drvFOFB : public asynNDArrayDriver { 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 acqSPTask(int coreID, double pollTime, bool autoStart); - void acqMonitTask(); - /* Overloaded functions for extracting service name*/ - const char *doGetServiceNameFromFunc (functionsUInt32_t &func) const - { - return func.serviceName; - } - const char *doGetServiceNameFromFunc (functionsInt32_t &func) const { 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 + const char *doGetServiceNameFromFunc (functionsUInt32_t &func) const { return func.serviceName; } @@ -402,35 +252,23 @@ class drvFOFB : public asynNDArrayDriver { } /* Overloaded function mappings called by functionsAny_t */ - 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 doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char *service, + asynStatus doExecuteHwWriteFunction(functionsInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const; asynStatus doExecuteHwWriteFunction(functionsUInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const; - asynStatus doExecuteHwWriteFunction(functionsInt32_t &func, char *service, - int addr, functionsArgs_t &functionParam) const; asynStatus executeHwWriteFunction(int functionId, int addr, functionsArgs_t &functionParam); - - 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, + asynStatus doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char *service, int addr, functionsArgs_t &functionParam) const; - asynStatus doExecuteHwReadFunction(functionsUInt32Chan_t &func, char *service, + + asynStatus doExecuteHwReadFunction(functionsInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const; asynStatus doExecuteHwReadFunction(functionsUInt32_t &func, char *service, int addr, functionsArgs_t &functionParam) const; - asynStatus doExecuteHwReadFunction(functionsInt32_t &func, char *service, - int addr, functionsArgs_t &functionParam) const; asynStatus executeHwReadFunction(int functionId, int addr, functionsArgs_t &functionParam); + asynStatus doExecuteHwReadFunction(functionsUInt32Chan_t &func, char *service, + int addr, functionsArgs_t &functionParam) const; /* General service name handling utilities */ asynStatus getServiceChan (int fofbNumber, int addr, const char *serviceName, @@ -442,25 +280,8 @@ class drvFOFB : public asynNDArrayDriver { protected: /** Values used for pasynUser->reason, and indexes into the parameter library. */ - int P_SamplesPre; -#define FIRST_COMMAND 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_FofbProcessingRamWrite; +#define FIRST_COMMAND P_FofbProcessingRamWrite int P_FofbProcessingRamAddr; int P_FofbProcessingRamDataIn; int P_FofbProcessingRamDataOut; @@ -525,25 +346,11 @@ class drvFOFB : public asynNDArrayDriver { 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]; - fofb_single_pass_t *fofbSinglePass[NUM_ACQ_CORES_PER_FOFB]; char *endpoint; int fofbNumber; - int fofbMaxPoints; int verbose; int timeout; char *fofbPortName; - char *fofbType; - int readingActive[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - int repetitiveTrigger[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - epicsEventId startAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - epicsEventId stopAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - epicsEventId abortAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - epicsEventId reconfSPassAcqEventId[NUM_ACQ_CORES_PER_FOFB]; - epicsEventId activeAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - epicsEventId activeMonitEnableEventId; std::unordered_map fofbHwFunc; /* Our private methods */ @@ -552,45 +359,16 @@ class drvFOFB : public asynNDArrayDriver { 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 startSPAcq(fofb_single_pass_t *fofb_single_pass); - 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, int fofbMode, bool abortAcqHw = false); - asynStatus stopAcqTask(int addr, int fofbMode); - int checkAcqCompletion(int coreID); - int checkSPAcqCompletion(fofb_single_pass_t *fofb_single_pass); - asynStatus getAcqCurve(int coreID, NDArray *pArrayAllChannels, int hwChannel, - epicsUInt32 num_samples_pre, epicsUInt32 num_samples_post, - epicsUInt32 num_shots); - asynStatus getAcqSPCurve(fofb_single_pass_t *fofb_single_pass, NDArray *pArrayAllChannels); - asynStatus getAcqSPSamples(fofb_single_pass_t *fofb_single_pass, fofb_sample_t *fofb_sample); - asynStatus deinterleaveNDArray (NDArray *pArrayAllChannels, const int *pNDArrayAddr, - int pNDArrayAddrSize, int arrayCounter, epicsTimeStamp *timeStamp); - /* General set/get hardware functions */ - asynStatus computePositions(int coreID, NDArray *pArrayAllChannels, int channel, - epicsTimeStamp *timeStamp); 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 */ }; @@ -634,4 +412,3 @@ const char *functionsAny_t::getServiceNameFromFunc(const drvFOFB& drvFOFB, auto functionFpCast = any_cast(functionFp); return drvFOFB.doGetServiceNameFromFunc(functionFpCast); } - From 2c65dc9e17d5ff87e954b2720473946d88c79797 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 14 Dec 2021 09:28:20 -0200 Subject: [PATCH 04/42] Revert "Revert "FOFBApp/src: fix fofb_ctrl SDB name in function arguments"" This reverts commit b4a446caf929eb6640e96e46e522a20f9a2b11bd. --- FOFBApp/src/drvFOFB.cpp | 76 ++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index ca4e3c4..4f88778 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -100,81 +100,81 @@ 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_CC", halcs_set_fofb_ctrl_act_part, +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_CC", halcs_set_fofb_ctrl_err_clr, +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_CC", halcs_set_fofb_ctrl_cc_enable, +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_CC", halcs_set_fofb_ctrl_tfs_override, +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_CC", halcs_set_fofb_ctrl_bpm_id, +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_CC", halcs_set_fofb_ctrl_time_frame_len, +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_CC", halcs_set_fofb_ctrl_mgt_powerdown, +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_CC", halcs_set_fofb_ctrl_mgt_loopback, +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_CC", halcs_set_fofb_ctrl_time_frame_dly, +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_CC", halcs_set_fofb_ctrl_golden_orb_x, +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_CC", halcs_set_fofb_ctrl_golden_orb_y, +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_CC", halcs_set_fofb_ctrl_cust_feature, +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_CC", halcs_set_fofb_ctrl_rx_polarity, +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_CC", halcs_set_fofb_ctrl_payloadsel, +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_CC", halcs_set_fofb_ctrl_fofbdatasel, +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_CC", NULL, +static const functionsAny_t fofbCtrlSetGetFirmwareVerFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_firmware_ver}}; -static const functionsAny_t fofbCtrlSetGetSysStatusFunc = {functionsUInt32_t{"FOFB_CC", NULL, +static const functionsAny_t fofbCtrlSetGetSysStatusFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_sys_status}}; -static const functionsAny_t fofbCtrlSetGetLinkPartnerFunc = {functionsUInt32Chan_t{"FOFB_CC", NULL, +static const functionsAny_t fofbCtrlSetGetLinkPartnerFunc = {functionsUInt32Chan_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_link_partner}}; -static const functionsAny_t fofbCtrlSetGetLinkUpFunc = {functionsUInt32_t{"FOFB_CC", NULL, +static const functionsAny_t fofbCtrlSetGetLinkUpFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_link_up}}; -static const functionsAny_t fofbCtrlSetGetTimeFrameCountFunc = {functionsUInt32_t{"FOFB_CC", NULL, +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_CC", NULL, +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_CC", NULL, +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_CC", NULL, +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_CC", NULL, +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_CC", NULL, +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_CC", NULL, +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_CC", NULL, +static const functionsAny_t fofbCtrlSetGetBpmCntFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_bpm_count}}; -static const functionsAny_t fofbCtrlSetGetBpmIdRdbackFunc = {functionsUInt32_t{"FOFB_CC", NULL, +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_CC", NULL, +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_CC", NULL, +static const functionsAny_t fofbCtrlSetGetPowerdownRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_powerdown_rdback}}; -static const functionsAny_t fofbCtrlSetGetLoopbackRdbackFunc = {functionsUInt32_t{"FOFB_CC", NULL, +static const functionsAny_t fofbCtrlSetGetLoopbackRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_loopback_rdback}}; -static const functionsAny_t fofbCtrlSetGetFaivalRdbackFunc = {functionsUInt32_t{"FOFB_CC", NULL, +static const functionsAny_t fofbCtrlSetGetFaivalRdbackFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_faival_rdback}}; -static const functionsAny_t fofbCtrlSetGetToaRdEnFunc = {functionsUInt32_t{"FOFB_CC", halcs_set_fofb_ctrl_toa_rd_en, +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_CC", halcs_set_fofb_ctrl_toa_rd_str, +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_CC", NULL, +static const functionsAny_t fofbCtrlSetGetToaDataFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_toa_data}}; -static const functionsAny_t fofbCtrlSetGetRcbRdEnFunc = {functionsUInt32_t{"FOFB_CC", halcs_set_fofb_ctrl_rcb_rd_en, +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_CC", halcs_set_fofb_ctrl_rcb_rd_str, +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_CC", NULL, +static const functionsAny_t fofbCtrlSetGetRcbDataFunc = {functionsUInt32_t{"FOFB_CTRL", NULL, halcs_get_fofb_ctrl_rcb_data}}; static const char *driverName="drvFOFB"; From 852b20aa507844aaad6388cff3758975fb48cf81 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 14 Dec 2021 17:15:02 -0200 Subject: [PATCH 05/42] iocFOFB: acq and waveform files added --- iocBoot/iocFOFB/auto_settings.req | 48 ++++++++++ iocBoot/iocFOFB/stFOFB.cmd | 14 ++- iocBoot/iocFOFB/statsPlugins.cmd | 119 ++++++++++++++++++++++++ iocBoot/iocFOFB/triggerFOFB.cmd | 53 +++++++++++ iocBoot/iocFOFB/waveformFilePlugins.cmd | 40 ++++++++ iocBoot/iocFOFB/waveformPlugins.cmd | 84 +++++++++++++++++ 6 files changed, 357 insertions(+), 1 deletion(-) create mode 100644 iocBoot/iocFOFB/statsPlugins.cmd create mode 100644 iocBoot/iocFOFB/triggerFOFB.cmd create mode 100644 iocBoot/iocFOFB/waveformFilePlugins.cmd create mode 100644 iocBoot/iocFOFB/waveformPlugins.cmd diff --git a/iocBoot/iocFOFB/auto_settings.req b/iocBoot/iocFOFB/auto_settings.req index cfc2aeb..1b4617b 100644 --- a/iocBoot/iocFOFB/auto_settings.req +++ b/iocBoot/iocFOFB/auto_settings.req @@ -1 +1,49 @@ file "FOFB_settings.req", P=$(P), R=$(R) + +file "NDFile_settings.req", P=$(P), R=$(R)GEN_ABCD_NETCDF +file "NDFile_settings.req", P=$(P), R=$(R)GEN_ABCD_HDF5 +file "NDFile_settings.req", P=$(P), R=$(R)GEN_XYQS_NETCDF +file "NDFile_settings.req", P=$(P), R=$(R)GEN_XYQS_HDF5 + +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_A +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_B +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_C +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_D +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_UncalX +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_UncalY +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_UncalQ +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_UncalSUM +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_A +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_B +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_C +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_D +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_UncalX +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_UncalY +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_UncalQ +file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_UncalSUM + +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_A +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_B +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_C +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_D +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_UncalX +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_UncalY +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_UncalQ +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_UncalSUM +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_A +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_B +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_C +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_D +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_UncalX +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_UncalY +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_UncalQ +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_UncalSUM + +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)SP_A +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)SP_B +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)SP_C +file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)SP_D +file "NDStdArrays_settings.req", P=$(P), R=$(R)SP_A +file "NDStdArrays_settings.req", P=$(P), R=$(R)SP_B +file "NDStdArrays_settings.req", P=$(P), R=$(R)SP_C +file "NDStdArrays_settings.req", P=$(P), R=$(R)SP_D diff --git a/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index 1a7664d..edaa777 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -2,10 +2,12 @@ # Override default TOP variable epicsEnvSet("TOP","../..") +epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(ADCORE)/db") # devIOCStats vars epicsEnvSet("ENGINEER","$(ENGINEER=Melissa Aguiar)") epicsEnvSet("LOCATION","$(LOCATION=GCA)") +epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(ADCORE)/db") < FOFB.config @@ -13,14 +15,24 @@ 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("$(ASYN)/db/asynRecord.db","P=${P}, R=${R}asyn,PORT=$(PORT),ADDR=0,OMAX=80,IMAX=80") +# devIOCStats records +dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db","IOC=${P}${R}Stats") +dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminScanMon.db","IOC=${P}${R}Stats") + < save_restore.cmd +< triggerBPM.cmd +< fmc250m_4ch.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) #asynSetTraceMask("", 0, 17) diff --git a/iocBoot/iocFOFB/statsPlugins.cmd b/iocBoot/iocFOFB/statsPlugins.cmd new file mode 100644 index 0000000..8df0418 --- /dev/null +++ b/iocBoot/iocFOFB/statsPlugins.cmd @@ -0,0 +1,119 @@ +# Create statistics plugins + +##################### GEN AMP Statistics ########################## + +NDStatsConfigure("STATSGEN_A", $(QSIZE), 0, "$(PORT)", 0, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_A_STATS, PORT=STATSGEN_A,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSGEN_A_TS", $(QSIZE), 0, "STATSGEN_A", 0, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_A_TS_STATS, PORT=STATSGEN_A_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_A,NDARRAY_ADDR=0,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSGEN_B", $(QSIZE), 0, "$(PORT)", 1, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_B_STATS, PORT=STATSGEN_B,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=1,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSGEN_B_TS", $(QSIZE), 0, "STATSGEN_B", 1, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_B_TS_STATS, PORT=STATSGEN_B_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_B,NDARRAY_ADDR=1,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSGEN_C", $(QSIZE), 0, "$(PORT)", 2, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_C_STATS, PORT=STATSGEN_C,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=2,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSGEN_C_TS", $(QSIZE), 0, "STATSGEN_C", 2, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_C_TS_STATS, PORT=STATSGEN_C_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_C,NDARRAY_ADDR=2,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSGEN_D", $(QSIZE), 0, "$(PORT)", 3, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_D_STATS, PORT=STATSGEN_D,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=3,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSGEN_D_TS", $(QSIZE), 0, "STATSGEN_D", 3, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_D_TS_STATS, PORT=STATSGEN_D_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_D,NDARRAY_ADDR=3,NCHANS=$(NCHANS),ENABLED=0") + +##################### GEN POS Statistics ########################## + +NDStatsConfigure("STATSGEN_X", $(QSIZE), 0, "$(PORT)", 6, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_X_STATS, PORT=STATSGEN_X,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=6,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSGEN_X_TS", $(QSIZE), 0, "STATSGEN_X", 6, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_X_TS_STATS, PORT=STATSGEN_X_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_X,NDARRAY_ADDR=6,NCHANS=$(NCHANS),ENABLED=0") +# Alias +dbLoadRecords("${TOP}/db/FOFBStatsPluginAliases.template", "P=${P}, R=${R}, STATS_P=GEN_X_STATS, NEW_P=${P}, NEW_R=${R}, NEW_FIELD=ACQPosX-Mon") + +NDStatsConfigure("STATSGEN_Y", $(QSIZE), 0, "$(PORT)", 7, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_Y_STATS, PORT=STATSGEN_Y,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=7,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSGEN_Y_TS", $(QSIZE), 0, "STATSGEN_Y", 7, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_Y_TS_STATS, PORT=STATSGEN_Y_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_Y,NDARRAY_ADDR=7,NCHANS=$(NCHANS),ENABLED=0") +# Alias +dbLoadRecords("${TOP}/db/FOFBStatsPluginAliases.template", "P=${P}, R=${R}, STATS_P=GEN_Y_STATS, NEW_P=${P}, NEW_R=${R}, NEW_FIELD=ACQPosY-Mon") + +NDStatsConfigure("STATSGEN_Q", $(QSIZE), 0, "$(PORT)", 8, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_Q_STATS, PORT=STATSGEN_Q,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=8,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSGEN_Q_TS", $(QSIZE), 0, "STATSGEN_Q", 8, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_Q_TS_STATS, PORT=STATSGEN_Q_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_Q,NDARRAY_ADDR=8,NCHANS=$(NCHANS),ENABLED=0") +# Alias +dbLoadRecords("${TOP}/db/FOFBStatsPluginAliases.template", "P=${P}, R=${R}, STATS_P=GEN_Q_STATS, NEW_P=${P}, NEW_R=${R}, NEW_FIELD=ACQPosQ-Mon") + +NDStatsConfigure("STATSGEN_SUM", $(QSIZE), 0, "$(PORT)", 9, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_SUM_STATS, PORT=STATSGEN_SUM,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=9,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSGEN_SUM_TS", $(QSIZE), 0, "STATSGEN_SUM", 9, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_SUM_TS_STATS, PORT=STATSGEN_SUM_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_SUM,NDARRAY_ADDR=9,NCHANS=$(NCHANS),ENABLED=0") +# Alias +dbLoadRecords("${TOP}/db/FOFBStatsPluginAliases.template", "P=${P}, R=${R}, STATS_P=GEN_SUM_STATS, NEW_P=${P}, NEW_R=${R}, NEW_FIELD=ACQSum-Mon") + +##################### PM AMP Statistics ########################## + +NDStatsConfigure("STATSPM_A", $(QSIZE), 0, "$(PORT)", 12, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_A_STATS, PORT=STATSPM_A,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=12,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSPM_A_TS", $(QSIZE), 0, "STATSPM_A", 12, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_A_TS_STATS, PORT=STATSPM_A_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_A,NDARRAY_ADDR=12,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSPM_B", $(QSIZE), 0, "$(PORT)", 13, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_B_STATS, PORT=STATSPM_B,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=13,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSPM_B_TS", $(QSIZE), 0, "STATSPM_B", 13, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_B_TS_STATS, PORT=STATSPM_B_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_B,NDARRAY_ADDR=13,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSPM_C", $(QSIZE), 0, "$(PORT)", 14, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_C_STATS, PORT=STATSPM_C,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=14,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSPM_C_TS", $(QSIZE), 0, "STATSPM_C", 14, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_C_TS_STATS, PORT=STATSPM_C_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_C,NDARRAY_ADDR=14,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSPM_D", $(QSIZE), 0, "$(PORT)", 15, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_D_STATS, PORT=STATSPM_D,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=15,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSPM_D_TS", $(QSIZE), 0, "STATSPM_D", 15, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_D_TS_STATS, PORT=STATSPM_D_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_D,NDARRAY_ADDR=15,NCHANS=$(NCHANS),ENABLED=0") + +##################### PM POS Statistics ########################## + +NDStatsConfigure("STATSPM_X", $(QSIZE), 0, "$(PORT)", 18, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_X_STATS, PORT=STATSPM_X,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=18,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSPM_X_TS", $(QSIZE), 0, "STATSPM_X", 18, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_X_TS_STATS, PORT=STATSPM_X_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_X,NDARRAY_ADDR=18,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSPM_Y", $(QSIZE), 0, "$(PORT)", 19, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_Y_STATS, PORT=STATSPM_Y,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=19,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSPM_Y_TS", $(QSIZE), 0, "STATSPM_Y", 19, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_Y_TS_STATS, PORT=STATSPM_Y_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_Y,NDARRAY_ADDR=19,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSPM_Q", $(QSIZE), 0, "$(PORT)", 20, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_Q_STATS, PORT=STATSPM_Q,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=20,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSPM_Q_TS", $(QSIZE), 0, "STATSPM_Q", 20, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_Q_TS_STATS, PORT=STATSPM_Q_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_Q,NDARRAY_ADDR=20,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSPM_SUM", $(QSIZE), 0, "$(PORT)", 21, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_SUM_STATS, PORT=STATSPM_SUM,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=21,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSPM_SUM_TS", $(QSIZE), 0, "STATSPM_SUM", 21, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_SUM_TS_STATS, PORT=STATSPM_SUM_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_SUM,NDARRAY_ADDR=21,NCHANS=$(NCHANS),ENABLED=0") + +##################### SP AMP Statistics ########################## + +NDStatsConfigure("STATSSP_A", $(QSIZE), 0, "$(PORT)", 24, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}SP_A_STATS, PORT=STATSSP_A,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=24,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSSP_A_TS", $(QSIZE), 0, "STATSSP_A", 24, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}SP_A_TS_STATS, PORT=STATSSP_A_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSSP_A,NDARRAY_ADDR=24,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSSP_B", $(QSIZE), 0, "$(PORT)", 25, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}SP_B_STATS, PORT=STATSSP_B,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=25,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSSP_B_TS", $(QSIZE), 0, "STATSSP_B", 25, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}SP_B_TS_STATS, PORT=STATSSP_B_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSSP_B,NDARRAY_ADDR=25,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSSP_C", $(QSIZE), 0, "$(PORT)", 26, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}SP_C_STATS, PORT=STATSSP_C,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=26,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSSP_C_TS", $(QSIZE), 0, "STATSSP_C", 26, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}SP_C_TS_STATS, PORT=STATSSP_C_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSSP_C,NDARRAY_ADDR=26,NCHANS=$(NCHANS),ENABLED=0") + +NDStatsConfigure("STATSSP_D", $(QSIZE), 0, "$(PORT)", 27, 0, 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}SP_D_STATS, PORT=STATSSP_D,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=27,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") +NDTimeSeriesConfigure("STATSSP_D_TS", $(QSIZE), 0, "STATSSP_D", 27, 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}SP_D_TS_STATS, PORT=STATSSP_D_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSSP_D,NDARRAY_ADDR=27,NCHANS=$(NCHANS),ENABLED=0") diff --git a/iocBoot/iocFOFB/triggerFOFB.cmd b/iocBoot/iocFOFB/triggerFOFB.cmd new file mode 100644 index 0000000..eac2dd3 --- /dev/null +++ b/iocBoot/iocFOFB/triggerFOFB.cmd @@ -0,0 +1,53 @@ +##################### 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") + +# Second instance of the TRIGGER module + +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=0, ADDR=24, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=1, ADDR=25, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=2, ADDR=26, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=3, ADDR=27, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=4, ADDR=28, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=5, ADDR=29, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=6, ADDR=30, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=7, ADDR=31, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=8, ADDR=32, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=9, ADDR=33, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=10, ADDR=34, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=11, ADDR=35, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=12, ADDR=36, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=13, ADDR=37, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=14, ADDR=38, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=15, ADDR=39, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=16, ADDR=40, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=17, ADDR=41, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=18, ADDR=42, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=19, ADDR=43, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=20, ADDR=44, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=21, ADDR=45, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=22, ADDR=46, TIMEOUT=1") +dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=23, ADDR=47, TIMEOUT=1") diff --git a/iocBoot/iocFOFB/waveformFilePlugins.cmd b/iocBoot/iocFOFB/waveformFilePlugins.cmd new file mode 100644 index 0000000..c23bc1d --- /dev/null +++ b/iocBoot/iocFOFB/waveformFilePlugins.cmd @@ -0,0 +1,40 @@ +##################### GEN AMP File Saving ########################## + +NDFileNetCDFConfigure("GEN_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 4) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}GEN_ABCD_NETCDF,PORT=GEN_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4") + +NDFileHDF5Configure("GEN_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 4) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}GEN_ABCD_HDF5,PORT=GEN_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4") + +##################### GEN POS File Saving ########################## + +NDFileNetCDFConfigure("GEN_XYQS_FileNetCDF", $(QSIZE), 0, "$(PORT)", 10) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}GEN_XYQS_NETCDF,PORT=GEN_XYQS_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10") + +NDFileHDF5Configure("GEN_XYQS_FileHDF5", $(QSIZE), 0, "$(PORT)", 10) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}GEN_XYQS_HDF5,PORT=GEN_XYQS_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10") + +##################### PM Amp File Saving ########################## + +NDFileNetCDFConfigure("PM_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 16) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}PM_ABCD_NETCDF,PORT=PM_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=16") + +NDFileHDF5Configure("PM_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 16) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}PM_ABCD_HDF5,PORT=PM_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=16") + +##################### PM POS File Saving ########################## + +NDFileNetCDFConfigure("PM_XYQS_FileNetCDF", $(QSIZE), 0, "$(PORT)", 22) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}PM_XYQS_NETCDF,PORT=PM_XYQS_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=22") + +NDFileHDF5Configure("PM_XYQS_FileHDF5", $(QSIZE), 0, "$(PORT)", 22) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}PM_XYQS_HDF5,PORT=PM_XYQS_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=22") + +##################### SP File Saving ########################## + +NDFileNetCDFConfigure("SP_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 28) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}SP_ABCD_NETCDF,PORT=SP_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=28") + +NDFileHDF5Configure("SP_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 28) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}SP_ABCD_HDF5,PORT=SP_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=28") + diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd new file mode 100644 index 0000000..65d35e8 --- /dev/null +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -0,0 +1,84 @@ +##################### GEN AMP Waveforms ########################## + +NDStdArraysConfigure("GEN_A_Array", $(QSIZE), 0, "$(PORT)", 0) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_A,PORT=GEN_A_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_B_Array", $(QSIZE), 0, "$(PORT)", 1) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_B,PORT=GEN_B_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=1,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_C_Array", $(QSIZE), 0, "$(PORT)", 2) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_C,PORT=GEN_C_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=2,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("GEN_D_Array", $(QSIZE), 0, "$(PORT)", 3) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_D,PORT=GEN_D_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=3,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +##################### AMP PM Waveforms ########################## + +NDStdArraysConfigure("PM_A_Array", $(QSIZE), 0, "$(PORT)", 12) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_A,PORT=PM_A_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=12,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_B_Array", $(QSIZE), 0, "$(PORT)", 13) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_B,PORT=PM_B_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=13,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_C_Array", $(QSIZE), 0, "$(PORT)", 14) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_C,PORT=PM_C_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=14,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_D_Array", $(QSIZE), 0, "$(PORT)", 15) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_D,PORT=PM_D_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=15,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +##################### Raw Data Single Pass Waveforms ########################## + +NDStdArraysConfigure("SP_A_Array", $(QSIZE), 0, "$(PORT)", 24) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}SP_A,PORT=SP_A_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=24,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("SP_B_Array", $(QSIZE), 0, "$(PORT)", 25) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}SP_B,PORT=SP_B_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=25,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("SP_C_Array", $(QSIZE), 0, "$(PORT)", 26) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}SP_C,PORT=SP_C_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=26,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("SP_D_Array", $(QSIZE), 0, "$(PORT)", 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}SP_D,PORT=SP_D_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=27,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +##################### Monit AMP/POS/POSFake Waveforms ########################## + +NDStdArraysConfigure("MONIT_A_Array", $(QSIZE), 0, "$(PORT)", 30) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_A,PORT=MONIT_A_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=30,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +#alias( "${P}${R}MONIT_AArrayData", "$(P)$(R)AmplA-Mon") + +NDStdArraysConfigure("MONIT_B_Array", $(QSIZE), 0, "$(PORT)", 31) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_B,PORT=MONIT_B_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=31,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +#alias( "${P}${R}MONIT_BArrayData", "$(P)$(R)AmplB-Mon") + +NDStdArraysConfigure("MONIT_C_Array", $(QSIZE), 0, "$(PORT)", 32) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_C,PORT=MONIT_C_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=32,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +#alias( "${P}${R}MONIT_CArrayData", "$(P)$(R)AmplC-Mon") + +NDStdArraysConfigure("MONIT_D_Array", $(QSIZE), 0, "$(PORT)", 33) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_D,PORT=MONIT_D_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=33,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +# alias( "${P}${R}MONIT_DArrayData", "$(P)$(R)AmplD-Mon") + +NDStdArraysConfigure("MONIT_X_Array", $(QSIZE), 0, "$(PORT)", 34) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_X,PORT=MONIT_X_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=34,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +# alias( "${P}${R}MONIT_XArrayData", "$(P)$(R)PosX-Mon") + +NDStdArraysConfigure("MONIT_Y_Array", $(QSIZE), 0, "$(PORT)", 35) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_Y,PORT=MONIT_Y_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=35,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +# alias( "${P}${R}MONIT_YArrayData", "$(P)$(R)PosY-Mon") + +NDStdArraysConfigure("MONIT_Q_Array", $(QSIZE), 0, "$(PORT)", 36) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_Q,PORT=MONIT_Q_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=36,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +# alias( "${P}${R}MONIT_QArrayData", "$(P)$(R)PosQ-Mon") + +NDStdArraysConfigure("MONIT_SUM_Array", $(QSIZE), 0, "$(PORT)", 37) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_SUM,PORT=MONIT_SUM_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=37,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +# alias( "${P}${R}MONIT_SUMArrayData", "$(P)$(R)Sum-Mon") + +NDStdArraysConfigure("MONIT_FAKEX_Array", $(QSIZE), 0, "$(PORT)", 38) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_FAKEX,PORT=MONIT_FAKEX_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=38,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +# alias( "${P}${R}MONIT_FAKEXArrayData", "$(P)$(R)PosXFake-Mon") + +NDStdArraysConfigure("MONIT_FAKEY_Array", $(QSIZE), 0, "$(PORT)", 39) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_FAKEY,PORT=MONIT_FAKEY_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=39,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") +# alias( "${P}${R}MONIT_FAKEYArrayData", "$(P)$(R)PosYFake-Mon") + From 4c25a9d620143ec9489c68c29e5df3ed270ea6ae Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 14 Dec 2021 17:15:46 -0200 Subject: [PATCH 06/42] FOFBApp: acquisition and trigger functions added --- FOFBApp/Db/FOFBAcq.template | 401 +++ FOFBApp/Db/FOFBTrigger.template | 225 ++ FOFBApp/Db/FOFB_settings.req | 57 + FOFBApp/Db/NDPluginBase_settings_mod.req | 4 + FOFBApp/src/FOFBInclude.dbd | 6 +- FOFBApp/src/Makefile | 7 + FOFBApp/src/drvFOFB.cpp | 2961 ++++++++++++++++++++-- FOFBApp/src/drvFOFB.h | 425 +++- 8 files changed, 3848 insertions(+), 238 deletions(-) create mode 100644 FOFBApp/Db/FOFBAcq.template create mode 100644 FOFBApp/Db/FOFBTrigger.template create mode 100644 FOFBApp/Db/NDPluginBase_settings_mod.req diff --git a/FOFBApp/Db/FOFBAcq.template b/FOFBApp/Db/FOFBAcq.template new file mode 100644 index 0000000..8175893 --- /dev/null +++ b/FOFBApp/Db/FOFBAcq.template @@ -0,0 +1,401 @@ +######################### +# 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(FRVL,"4") + field(FVVL,"5") + field(SXVL,"6") + field(ZRST,"adc") + field(ONST,"adcswap") + field(TWST,"tbt") + field(THST,"fofb") + field(FRST,"tbtpha") + field(FVST,"fofbpha") + field(SXST,"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(FRVL,"4") + field(FVVL,"5") + field(SXVL,"6") + field(ZRST,"adc") + field(ONST,"adcswap") + field(TWST,"tbt") + field(THST,"fofb") + field(FRST,"tbtpha") + field(FVST,"fofbpha") + field(SXST,"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(FRVL,"4") + field(FVVL,"5") + field(SXVL,"6") + field(ZRST,"adc") + field(ONST,"adcswap") + field(TWST,"tbt") + field(THST,"fofb") + field(FRST,"tbtpha") + field(FVST,"fofbpha") + field(SXST,"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(FRVL,"4") + field(FVVL,"5") + field(SXVL,"6") + field(ZRST,"adc") + field(ONST,"adcswap") + field(TWST,"tbt") + field(THST,"fofb") + field(FRST,"tbtpha") + field(FVST,"fofbpha") + field(SXST,"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/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/FOFB_settings.req b/FOFBApp/Db/FOFB_settings.req index a785d21..e382821 100644 --- a/FOFBApp/Db/FOFB_settings.req +++ b/FOFBApp/Db/FOFB_settings.req @@ -1,3 +1,60 @@ +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 + +# 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 + +# 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 PROCESSING parameters ######################### 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..1ef3948 100644 --- a/FOFBApp/src/FOFBInclude.dbd +++ b/FOFBApp/src/FOFBInclude.dbd @@ -2,4 +2,8 @@ include "base.dbd" include "asyn.dbd" include "asSupport.dbd" include "FOFBSupport.dbd" - +include "devIocStats.dbd" +#include "NDPluginSupport.dbd" +#include "busySupport.dbd" +#include "NDFileNetCDF.dbd" +#include "NDFileHDF5.dbd" diff --git a/FOFBApp/src/Makefile b/FOFBApp/src/Makefile index 6f6b10a..5c40ee1 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,11 +38,14 @@ 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 += errhand FOFB_SYS_LIBS += hutils @@ -63,6 +68,8 @@ 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 += errhand FOFBCheckInit_SYS_LIBS += hutils diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 4f88778..6827456 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,37 +24,424 @@ #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 + +#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 +typedef struct { + drvFOFB *drvFOFBp; + fofb_coreID_types coreID; + double pollTime; + bool autoStart; +} taskParams_t; + 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} + /* board, fofb, core_id*/ + /* 0 (INVALID) */ {-1, -1, -1}, + /* 1 */ {1, 0, 2}, + /* 2 */ {1, 1, 3}, + /* 3 */ {2, 0, 2}, + /* 4 */ {2, 1, 3}, + /* 5 */ {3, 0, 2}, + /* 6 */ {3, 1, 3}, + /* 7 */ {4, 0, 2}, + /* 8 */ {4, 1, 3}, + /* 9 */ {5, 0, 2}, + /* 10 */ {5, 1, 3}, + /* 11 */ {6, 0, 2}, + /* 12 */ {6, 1, 3}, + /* 13 */ {7, 0, 2}, + /* 14 */ {7, 1, 3}, + /* 15 */ {8, 0, 2}, + /* 16 */ {8, 1, 3}, + /* 17 */ {9, 0, 2}, + /* 18 */ {9, 1, 3}, + /* 19 */ {10, 0, 2}, + /* 20 */ {10, 1, 3}, + /* 21 */ {11, 0, 2}, + /* 22 */ {11, 1, 3}, + /* 23 */ {12, 0, 2}, + /* 24 */ {12, 1, 3} +}; + +static const channelMap_t channelMap[CH_END] = { + /* Amp, Phase, Pos, AmpA, AmpB, AmpC, AmpD, AmpALL */ + /* [CH_ADC] = */ {CH_HW_ADC, // HwAmpChannel + -1, // HwPhaseChannel + -1, // HwPosChannel + 0, // CalcPos + {{WVF_GENAMP_A, // NDArrayAmp + WVF_GENAMP_B, + WVF_GENAMP_C, + WVF_GENAMP_D, + WVF_GENAMP_ALL}, + {WVF_AMP_PM_A, + WVF_AMP_PM_B, + WVF_AMP_PM_C, + WVF_AMP_PM_D, + WVF_AMP_PM_ALL}, + }, + {{-1, // NDArrayPhase + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{-1, // NDArrayPos + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + }, + /* [CH_ADCSWAP] = */ {CH_HW_ADCSWAP, // HwAmpChannel + -1, // HwPhaseChannel + -1, // HwPosChannel + 0, // CalcPos + {{WVF_GENAMP_A, // NDArrayAmp + WVF_GENAMP_B, + WVF_GENAMP_C, + WVF_GENAMP_D, + WVF_GENAMP_ALL}, + {WVF_AMP_PM_A, + WVF_AMP_PM_B, + WVF_AMP_PM_C, + WVF_AMP_PM_D, + WVF_AMP_PM_ALL}, + }, + {{-1, // NDArrayPhase + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{-1, // NDArrayPos + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + }, + /* [CH_TBT] = */ {CH_HW_TBT, // HwAmpChannel + -1, // HwPhaseChannel + -1, // HwPosChannel + 1, // CalcPos + {{WVF_GENAMP_A, // NDArrayAmp + WVF_GENAMP_B, + WVF_GENAMP_C, + WVF_GENAMP_D, + WVF_GENAMP_ALL}, + {WVF_AMP_PM_A, + WVF_AMP_PM_B, + WVF_AMP_PM_C, + WVF_AMP_PM_D, + WVF_AMP_PM_ALL}, + }, + {{-1, // NDArrayPhase + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{WVF_GENPOS_A, // NDArrayPos + WVF_GENPOS_B, + WVF_GENPOS_C, + WVF_GENPOS_D, + WVF_GENPOS_ALL}, + {WVF_POS_PM_A, + WVF_POS_PM_B, + WVF_POS_PM_C, + WVF_POS_PM_D, + WVF_POS_PM_ALL}, + }, + }, + /* [CH_FOFB] = */ {CH_HW_FOFB, // HwAmpChannel + -1, // HwPhaseChannel + -1, // HwPosChannel + 1, // CalcPos + {{WVF_GENAMP_A, // NDArrayAmp + WVF_GENAMP_B, + WVF_GENAMP_C, + WVF_GENAMP_D, + WVF_GENAMP_ALL}, + {WVF_AMP_PM_A, + WVF_AMP_PM_B, + WVF_AMP_PM_C, + WVF_AMP_PM_D, + WVF_AMP_PM_ALL}, + }, + {{-1, // NDArrayPhase + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{WVF_GENPOS_A, // NDArrayPos + WVF_GENPOS_B, + WVF_GENPOS_C, + WVF_GENPOS_D, + WVF_GENPOS_ALL}, + {WVF_POS_PM_A, + WVF_POS_PM_B, + WVF_POS_PM_C, + WVF_POS_PM_D, + WVF_POS_PM_ALL}, + }, + }, + /* [CH_TBTPHA] = */ {CH_HW_TBTPHA, // HwAmpChannel + -1, // HwPhaseChannel + -1, // HwPosChannel + 1, // CalcPos + {{WVF_GENAMP_A, // NDArrayAmp + WVF_GENAMP_B, + WVF_GENAMP_C, + WVF_GENAMP_D, + WVF_GENAMP_ALL}, + {WVF_AMP_PM_A, + WVF_AMP_PM_B, + WVF_AMP_PM_C, + WVF_AMP_PM_D, + WVF_AMP_PM_ALL}, + }, + {{-1, // NDArrayPhase + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{WVF_GENPOS_A, // NDArrayPos + WVF_GENPOS_B, + WVF_GENPOS_C, + WVF_GENPOS_D, + WVF_GENPOS_ALL}, + {WVF_POS_PM_A, + WVF_POS_PM_B, + WVF_POS_PM_C, + WVF_POS_PM_D, + WVF_POS_PM_ALL}, + }, + }, + /* [CH_FOFBPHA] = */ {CH_HW_FOFBPHA, // HwAmpChannel + -1, // HwPhaseChannel + -1, // HwPosChannel + 1, // CalcPos + {{WVF_GENAMP_A, // NDArrayAmp + WVF_GENAMP_B, + WVF_GENAMP_C, + WVF_GENAMP_D, + WVF_GENAMP_ALL}, + {WVF_AMP_PM_A, + WVF_AMP_PM_B, + WVF_AMP_PM_C, + WVF_AMP_PM_D, + WVF_AMP_PM_ALL}, + }, + {{-1, // NDArrayPhase + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{WVF_GENPOS_A, // NDArrayPos + WVF_GENPOS_B, + WVF_GENPOS_C, + WVF_GENPOS_D, + WVF_GENPOS_ALL}, + {WVF_POS_PM_A, + WVF_POS_PM_B, + WVF_POS_PM_C, + WVF_POS_PM_D, + WVF_POS_PM_ALL}, + }, + }, + /* [CH_MONIT1] = */ {CH_HW_MONIT1, // HwAmpChannel + -1, // HwPhaseChannel + -1, // HwPosChannel + 1, // CalcPos + {{WVF_GENAMP_A, // NDArrayAmp + WVF_GENAMP_B, + WVF_GENAMP_C, + WVF_GENAMP_D, + WVF_GENAMP_ALL}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{-1, // NDArrayPhase + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{WVF_GENPOS_A, // NDArrayPos + WVF_GENPOS_B, + WVF_GENPOS_C, + WVF_GENPOS_D, + WVF_GENPOS_ALL}, + {-1, + -1, + -1, + -1, + -1}, + }, + }, + /* [CH_SP] = */ {CH_HW_ADC, // HwAmpChannel + -1, // HwPhaseChannel + -1, // HwPosChannel + 0, // CalcPos + {{WVF_AMP_SP_A, // NDArrayAmp + WVF_AMP_SP_B, + WVF_AMP_SP_C, + WVF_AMP_SP_D, + WVF_AMP_SP_ALL}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{-1, // NDArrayPhase + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + {{-1, // NDArrayPos + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1}, + }, + }, }; +/* FIXME: This reverse mapping must match the maximum HwAmpChannel for ChannelMap */ +static const channelRevMap_t channelRevMap[CH_HW_END] = { + /* EPICS channel */ + /* [CH_HW_ADC] = */ {CH_ADC}, + /* [CH_HW_ADCSWAP] = */ {CH_ADCSWAP}, + /* 2 = Unavailable */ {-1}, + /* 3 = Unavailable */ {-1}, + /* 4 = Unavailable */ {-1}, + /* 5 = Unavailable */ {-1}, + /* [CH_HW_TBT] = */ {CH_TBT}, + /* [CH_HW_TBTPHA] = */ {CH_TBTPHA}, + /* 8 = Unavailable */ {-1}, + /* 9 = Unavailable */ {-1}, + /* 10 = Unavailable */ {-1}, + /* [CH_HW_FOFB] = */ {CH_FOFB}, + /* [CH_HW_FOFBPHA] = */ {CH_FOFBPHA}, + /* 13 = Unavailable */ {-1}, + /* [CH_HW_MONIT1] = */ {CH_MONIT1}, +}; + +/* This function should not be called, as there is no client function to replace it and + * * the EPICS Db should not export PVs that maps here. + * * FIXME: not sure why, but some unavailable functions are called even with no + * * "apperently" Db record mapped to it. When this happens, segfault occurs. So, + * * until we figure out what s happening we keep "NULL" function mapped to this dummy + * * functions */ +static halcs_client_err_e halcs_dummy_read_32 (halcs_client_t *self, char *service, uint32_t *param) +{ + (void) self; + (void) service; + (void) param; + return HALCS_CLIENT_ERR_INV_FUNCTION; +} + +static halcs_client_err_e halcs_dummy_read_chan_32 (halcs_client_t *self, char *service, + uint32_t chan, uint32_t *param) +{ + (void) self; + (void) service; + (void) chan; + (void) param; + return HALCS_CLIENT_ERR_INV_FUNCTION; +} + + /* Int32 functions mapping */ static const functionsAny_t fofbProcessingSetGetRamWriteFunc = {functionsUInt32_t{"FOFB_PROCESSING", halcs_set_fofb_processing_ram_write, halcs_get_fofb_processing_ram_write}}; @@ -176,8 +563,62 @@ static const functionsAny_t fofbCtrlSetGetRcbRdStrFunc = {functio 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 + }, + /* Post-Mortem Core */ + { + NULL, // drvFOFBp + FOFBIDPM, // coreID + FOFB_PM_POLL_TIME, // pollTime + true // autoStart + }, +}; + void acqTask(void *drvPvt); static void exitHandlerC(void *pPvt) @@ -193,7 +634,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 +651,45 @@ 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 = boardMap[fofbNumber].fofb; + break; - *serviceIDArg = boardMap[fofbNumber].fofb; + case FOFBIDPM: + serviceID = boardMap[fofbNumber].core_id; + break; + + 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; } @@ -242,16 +725,18 @@ asynStatus drvFOFB::getFullServiceName (int fofbNumber, int addr, const char *se } /** 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 ] - * * * */ + * * * * 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 +747,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; @@ -284,19 +770,64 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, this->verbose = verbose; this->timeout = timeout; + for (int i = 0; i < NUM_FOFB_MODES; ++i) { + for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { + this->readingActive[i][j] = 0; + this->repetitiveTrigger[i][j] = 0; + } + } + + for (int i = 0; i < NUM_FOFB_MODES; ++i) { + + for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { + /* Create events for signalling acquisition thread */ + this->startAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); + if (!this->startAcqEventId[i][j]) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s epicsEventCreate[%d] failure for start event\n", + driverName, functionName, i); + return; + } + + this->stopAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); + if (!this->stopAcqEventId[i][j]) { + printf("%s:%s: epicsEventCreate[%d] failure for stop event\n", + driverName, functionName, i); + return; + } + + this->abortAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); + if (!this->abortAcqEventId[i][j]) { + printf("%s:%s: epicsEventCreate[%d] failure for abort event\n", + driverName, functionName, i); + return; + } + + this->activeAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); + if (!this->activeAcqEventId[i][j]) { + printf("%s:%s: epicsEventCreate[%d] failure for active event\n", + driverName, functionName, i); + 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 */ + + /* Create fofb_processing 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,6 +846,7 @@ 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); + /* Create fofb_ctrl parameters */ createParam(P_FofbCtrlActPartString, asynParamUInt32Digital, &P_FofbCtrlActPart); createParam(P_FofbCtrlErrClrString, asynParamUInt32Digital, &P_FofbCtrlErrClr); createParam(P_FofbCtrlCcEnableString, asynParamUInt32Digital, &P_FofbCtrlCcEnable); @@ -353,9 +885,42 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, createParam(P_FofbCtrlRcbRdEnString, asynParamUInt32Digital, &P_FofbCtrlRcbRdEn); createParam(P_FofbCtrlRcbRdStrString, asynParamUInt32Digital, &P_FofbCtrlRcbRdStr); createParam(P_FofbCtrlRcbDataString, asynParamUInt32Digital, &P_FofbCtrlRcbData); + /* 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 */ + * * * * to the parameter library */ fofbHwFunc.emplace(P_FofbProcessingRamWrite, fofbProcessingSetGetRamWriteFunc); fofbHwFunc.emplace(P_FofbProcessingRamAddr, fofbProcessingSetGetRamAddrFunc); fofbHwFunc.emplace(P_FofbProcessingRamDataIn, fofbProcessingSetGetRamDataInFunc); @@ -416,14 +981,32 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, 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 */ + * * * * will ensure the reconnection to server if necessary, but we + * * * * must succeed here or we must abort completely */ if (status != asynSuccess) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error calling fofbClientConnect, status=%d\n", @@ -494,6 +1077,117 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, setUIntDigitalParam(P_FofbCtrlRcbRdStr, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbCtrlRcbData, 0, 0xFFFFFFFF); + /* Set acquisition parameters */ + + for (int addr = 0; addr < NUM_ACQ_CORES_PER_FOFB; ++addr) { + setIntegerParam(addr, P_FOFBStatus, FOFBStatusIdle); + } + + 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); + } + + /* Acquisition PM parameters */ + setUIntDigitalParam(FOFBIDPM, P_SamplesPre, SAMPLES_PRE_DEFAULT_PM(fofbMaxPoints), 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_SamplesPost,SAMPLES_POST_DEFAULT_PM(fofbMaxPoints),0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_NumShots, NUM_SHOTS_DEFAULT_PM, 0xFFFFFFFF); + setIntegerParam( FOFBIDPM, P_Channel, CH_DEFAULT_PM); + setDoubleParam( FOFBIDPM, P_UpdateTime, 1.0); + setUIntDigitalParam(FOFBIDPM, P_Trigger, ACQ_CLIENT_TRIG_EXTERNAL, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerEvent, TRIG_ACQ_START, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerRep, 1, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerDataThres, 100, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerDataPol, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerDataSel, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerDataFilt, 1, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_TriggerHwDly, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM, P_DataTrigChan, 0, 0xFFFFFFFF); + + /* Write to HW */ + for (int i = P_SamplesPre; i < P_DataTrigChan+1; ++i) { + setParamGeneric(i, FOFBIDPM); + } + + /* 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 trigger parameters for PM */ + for (int addr = 0; addr < MAX_WAVEFORM_TRIGGERS; ++addr) { + setIntegerParam( FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerChan, CH_DFLT_TRIGGER_CHAN); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerDir, 1, 0xFFFFFFFF); /* FPGA Input */ + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerDirPol, 1, 0xFFFFFFFF); /* Reverse Direction Polarity */ + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerRcvCntRst, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerTrnCntRst, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerCntRcv, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerCntTrn, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerRcvLen, 1, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerTrnLen, 1, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerRcvSrc, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerTrnSrc, 0, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerRcvInSel, CH_DFLT_TRIGGER_SEL_PM_CHAN, 0xFFFFFFFF); + setUIntDigitalParam(FOFBIDPM*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); + } + } + } + /* Do callbacks so higher layers see any changes. Call callbacks for every addr */ for (int i = 0; i < MAX_ADDR; ++i) { callParamCallbacks(i); @@ -508,7 +1202,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /** Destructor for the drvFOFB class. - * * */ + * * * */ drvFOFB::~drvFOFB() { asynStatus status = asynSuccess; @@ -517,6 +1211,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 +1247,61 @@ asynStatus drvFOFB::fofbClientConnect(asynUser* pasynUser) } } + /* 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]); + } + } + +create_halcs_client_monit_err: + /* Destroy regular fofbClient instance */ + halcs_client_destroy (&fofbClient); + create_halcs_client_err: return status; } @@ -580,204 +1322,1447 @@ asynStatus drvFOFB::fofbClientDisconnect(asynUser* pasynUser) halcs_client_destroy (&fofbClient); } + 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); +} + /********************************************************************/ -/********************* 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. + * * CAUTION. FIXME? Only one acquisition task is working at any given time: MultiMode or SinglePass + * */ +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 hwAmpChannel = 0; + int acqCompleted = 0; + int FOFBMode = 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); - /* Create full service name*/ - status = getFullServiceName (this->fofbNumber, addr, funcService, - 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; - } + /* Loop forever */ + lock (); + while (1) { + /* Free buffers if needed*/ + if (pArrayAllChannels) { + pArrayAllChannels->release (); + pArrayAllChannels = NULL; + } - /* Execute overloaded function for each function type we know of */ - status = func->second.executeHwWrite(*this, service, addr, functionParam); + getIntegerParam(coreID, P_FOFBStatus, &fofbStatus); + + /* Check if we received a stop event */ + status = epicsEventWaitWithTimeout(this->stopAcqEventId[FOFBMode][coreID], pollTime); + if (status == epicsEventWaitOK || !repetitiveTrigger[FOFBMode][coreID] || acqIsFOFBStatusErr(fofbStatus)) { + /* We got a stop event, stop repetitive acquisition */ + readingActive[FOFBMode][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[FOFBMode][coreID]); + lock(); + } + readingActive[FOFBMode][coreID] = 1; + autoStartFirst = 0; + } -get_reg_func_err: -get_service_err: - return (asynStatus)status; -} + /* We are acquiring. Get the current time */ + epicsTimeGetCurrent(&startTime); -asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char *service, + /* 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_AMP_TYPES) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: unsupported numAtoms > %d. Reduce this value in the gateware\n", + driverName, functionName, MAX_WVF_AMP_TYPES); + continue; + } + + /* Convert user channel into hw channel */ + hwAmpChannel = channelMap[channel].HwAmpChannel; + if(hwAmpChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", + driverName, functionName, hwAmpChannel); + 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, hwAmpChannel, 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, hwAmpChannel, 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[FOFBMode][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, hwAmpChannel, 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].NDArrayAmp[coreID][WVF_AMP_ALL]); + + /* Copy AMP data to arrays for each type of data, do callbacks on that */ + status = deinterleaveNDArray(pArrayAllChannels, channelMap[channel].NDArrayAmp[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[FOFBMode][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[FOFBMode][coreID], delay); + lock(); + } + } + } +} + +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 hwAmpChannel = 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 */ + hwAmpChannel = channelMap[channel].HwAmpChannel; + if(hwAmpChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", + driverName, functionName, hwAmpChannel); + status = asynError; + goto halcs_inv_channel; + } + + /* Get channel properties */ + status = getChannelProperties(addr, hwAmpChannel, &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[FOFBMode][addr]) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: Not starting acquistion as acqTask is still active\n", + driverName, functionName); + break; + } + + if (triggerRep) { + repetitiveTrigger[FOFBMode][addr] = 1; + } + else { + repetitiveTrigger[FOFBMode][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[FOFBMode][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[FOFBMode][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, FOFBMode); + 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, FOFBMode, 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, int fofbMode, bool abortAcqHw) +{ + asynStatus status = asynSuccess; + const char* functionName = "abortAcqTask"; + + /* we are waiting for a trigger */ + if (readingActive[fofbMode][addr]) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger ACQ_ABORT called for acqTask = %d, coreID = %d\n", + driverName, functionName, fofbMode, addr); + epicsEventSignal(this->abortAcqEventId[fofbMode][addr]); + } + else { + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger ACQ_ABORT but with acquisition in progress, " + "called for acqTask = %d, coreID = %d\n", + driverName, functionName, fofbMode, 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, int fofbMode) +{ + asynStatus status = asynSuccess; + const char* functionName = "stopAcqTask"; + + /* We are in repetitive mode */ + if (readingActive[fofbMode][addr]) { + repetitiveTrigger[fofbMode][addr] = 0; + /* Send the stop event */ + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: trigger ACQ_STOP called for acqTask = %d, coreID = %d\n", + driverName, functionName, fofbMode, addr); + epicsEventSignal(this->stopAcqEventId[fofbMode][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); + + /* 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)); + if (status) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error calling getFullServiceName, status=%d\n", + driverName, functionName, status); + goto get_service_err; + } + + /* Execute overloaded function for each function type we know of */ + status = func->second.executeHwWrite(*this, service, addr, functionParam); + +get_reg_func_err: +get_service_err: + return (asynStatus)status; +} + +asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32Chan_t &func, char *service, int addr, functionsArgs_t &functionParam) const { const char *functionName = "doExecuteHwWriteFunction"; @@ -813,7 +2798,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; } @@ -942,15 +3032,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 +3146,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, " @@ -1046,7 +3230,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 +3293,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 hwAmpChannel = 0; + int serviceID = 0; + + /* Set the parameter in the parameter library. */ + getUIntDigitalParam(addr, P_DataTrigChan, &dataTrigChan, mask); + + /* Convert user channel into hw channel */ + hwAmpChannel = channelMap[dataTrigChan].HwAmpChannel; + if(hwAmpChannel < 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", + driverName, functionName, hwAmpChannel); + 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, hwAmpChannel); + 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 hwAmpChannel = 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, &hwAmpChannel); + if (err != HALCS_CLIENT_SUCCESS) { + status = asynError; + goto halcs_get_data_trig_chan_err; + } + + if (hwAmpChannel > CH_HW_END-1) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: invalid HwAmpChannel channelRevMap for channel %d\n", + driverName, functionName, hwAmpChannel); + status = asynError; + goto halcs_inv_hw_channel; + } + + /* Convert user channel into hw channel */ + dataTrigChan = channelRevMap[hwAmpChannel].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 */ + * * * * \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 +3595,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) @@ -1103,3 +3625,4 @@ extern "C" { epicsExportRegistrar(drvFOFBRegister); } + diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index 29122b8..eed084d 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -1,17 +1,19 @@ /* - * * * drvFOFB.h - * * * - * * * Authors: Melissa Aguiar - * * * - * * * Created Dec. 03, 2021 - * * */ + * * * * drvFOFB.h + * * * * + * * * * Authors: Melissa Aguiar + * * * * + * * * * Created Dec. 03, 2021 + * * * */ #include "asynPortDriver.h" +#include "asynNDArrayDriver.h" #include #include /* Third-party libraries */ #include #include +#include /* any implementation for non c++-17 compilers */ #include "any.hpp" @@ -21,6 +23,176 @@ 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, + FOFBIDPM = 1, + 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 modes */ +typedef enum { + FOFBMode = 0, + FOFBModeEnd, +} fofb_mode_types; + +#define NUM_FOFB_MODES FOFBModeEnd + +/* 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_GENAMP_A = 0, + WVF_GENAMP_B, + WVF_GENAMP_C, + WVF_GENAMP_D, + WVF_GENAMP_ALL, + WVF_UNUSED_1, + WVF_GENPOS_A, + WVF_GENPOS_B, + WVF_GENPOS_C, + WVF_GENPOS_D, + WVF_GENPOS_ALL, + WVF_UNUSED_2, + WVF_AMP_PM_A, + WVF_AMP_PM_B, + WVF_AMP_PM_C, + WVF_AMP_PM_D, + WVF_AMP_PM_ALL, + WVF_UNUSED_3, + WVF_POS_PM_A, + WVF_POS_PM_B, + WVF_POS_PM_C, + WVF_POS_PM_D, + WVF_POS_PM_ALL, + WVF_UNUSED_4, + WVF_AMP_SP_A, + WVF_AMP_SP_B, + WVF_AMP_SP_C, + WVF_AMP_SP_D, + WVF_AMP_SP_ALL, + WVF_UNUSED_5, + WVF_MONIT_AMP_A, + WVF_MONIT_AMP_B, + WVF_MONIT_AMP_C, + WVF_MONIT_AMP_D, + WVF_MONIT_POS_X, + WVF_MONIT_POS_Y, + WVF_MONIT_POS_Q, + WVF_MONIT_POS_SUM, + WVF_MONIT_POSFAKE_X, + WVF_MONIT_POSFAKE_Y, + 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_ADCSWAP = 1, + CH_TBT = 2, + CH_FOFB = 3, + CH_TBTPHA = 4, + CH_FOFBPHA = 5, + CH_MONIT1 = 6, + CH_SP = 7, + CH_END +} ch_types; + +#define MAX_CHANNELS CH_END + +typedef enum { + CH_HW_ADC = 0, + CH_HW_ADCSWAP = 1, + CH_HW_TBT = 6, + CH_HW_TBTPHA = 7, + CH_HW_FOFB = 11, + CH_HW_FOFBPHA = 12, + CH_HW_MONIT1 = 14, + CH_HW_END +} ch_hw_types; + +#define MAX_HW_CHANNELS CH_HW_END + +/* Waveform AMP types IDs */ +typedef enum { + WVF_AMP_A = 0, + WVF_AMP_B, + WVF_AMP_C, + WVF_AMP_D, + WVF_AMP_ALL, + WVF_AMP_END +} wvf_amp_types; + +#define MAX_WVF_AMP_SINGLE (WVF_AMP_D+1) +#define MAX_WVF_AMP_TYPES WVF_AMP_END + +/* Waveform Phase types IDs */ +typedef enum { + WVF_PHASE_A = 0, + WVF_PHASE_B, + WVF_PHASE_C, + WVF_PHASE_D, + WVF_PHASE_ALL, + WVF_PHASE_END +} wvf_pha_types; + +#define MAX_WVF_PHA_SINGLE (WVF_PHASE_D+1) +#define MAX_WVF_PHA_TYPES WVF_PHASE_END + +/* Waveform Position types IDs */ +typedef enum { + WVF_POS_X = 0, + WVF_POS_Y, + WVF_POS_Q, + WVF_POS_SUM, + WVF_POS_ALL, + WVF_POS_END +} wvf_pos_types; + +#define MAX_WVF_POS_SINGLE (WVF_POS_SUM+1) +#define MAX_WVF_POS_TYPES WVF_POS_END + +/* One dimension for each point */ +#define MAX_WVF_DIMS 2 #define MAX_SLOTS 12 #define MAX_FOFB_PER_SLOT 2 @@ -35,8 +207,37 @@ using linb::bad_any_cast; typedef struct { int board; int fofb; + int core_id; /* Acquisition and Trigger core IDs */ } boardMap_t; +/* FOFB Channel structure */ +typedef struct { + /* HW channel mapping. -1 means not available */ + int HwAmpChannel; + int HwPhaseChannel; + int HwPosChannel; + /* 1 if we want to have position calculated from its amplitudes, + * * 0 otherwise */ + int CalcPos; + /* NDArray addresses mapping */ + int NDArrayAmp[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_AMP_TYPES]; + int NDArrayPhase[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_PHA_TYPES]; + int NDArrayPos[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_POS_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, uint32_t param); @@ -79,6 +280,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,7 +403,7 @@ 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 */ + * * * * 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 */ @@ -218,23 +464,66 @@ struct functionsAny_t { #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_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); + /* Overloaded functions for extracting service name*/ const char *doGetServiceNameFromFunc (functionsInt32_t &func) const { @@ -251,6 +540,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 +564,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 +579,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, @@ -341,16 +657,57 @@ class drvFOFB : public asynPortDriver { int P_FofbCtrlRcbRdEn; int P_FofbCtrlRcbRdStr; int P_FofbCtrlRcbData; -#define LAST_COMMAND P_FofbCtrlRcbData + int P_FOFBStatus; + 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; + 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_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + int repetitiveTrigger[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId startAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId stopAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId abortAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId reconfSPassAcqEventId[NUM_ACQ_CORES_PER_FOFB]; + epicsEventId activeAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; std::unordered_map fofbHwFunc; /* Our private methods */ @@ -359,17 +716,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, int fofbMode, bool abortAcqHw = false); + asynStatus stopAcqTask(int addr, int fofbMode); + 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) @@ -412,3 +800,4 @@ const char *functionsAny_t::getServiceNameFromFunc(const drvFOFB& drvFOFB, auto functionFpCast = any_cast(functionFp); return drvFOFB.doGetServiceNameFromFunc(functionFpCast); } + From 1af6204a9685ec902fe925e73f6cafdbcd2e5ae7 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Wed, 15 Dec 2021 15:20:55 -0200 Subject: [PATCH 07/42] FOFBApp and iocBoot: update acquisition functions and files --- FOFBApp/Db/FOFB.template | 20 ++-- FOFBApp/Db/FOFBAcq_settings.req | 13 +++ FOFBApp/Db/FOFBTrigger_settings.req | 8 ++ FOFBApp/src/FOFBInclude.dbd | 9 +- FOFBApp/src/Makefile | 6 +- FOFBApp/src/drvFOFB.cpp | 115 ++++++++++++----------- FOFBApp/src/drvFOFB.h | 2 - iocBoot/iocFOFB/FOFB.config | 9 ++ iocBoot/iocFOFB/FOFBCheckInitTries.sh | 2 +- iocBoot/iocFOFB/initCommonCommands | 0 iocBoot/iocFOFB/initFOFBCommands | 3 +- iocBoot/iocFOFB/save_restore.cmd | 1 + iocBoot/iocFOFB/stFOFB.cmd | 20 ++-- iocBoot/iocFOFB/statsPlugins.cmd | 119 ------------------------ iocBoot/iocFOFB/waveformFilePlugins.cmd | 40 -------- iocBoot/iocFOFB/waveformPlugins.cmd | 84 ----------------- scripts/Makefile | 4 + 17 files changed, 133 insertions(+), 322 deletions(-) create mode 100644 FOFBApp/Db/FOFBAcq_settings.req create mode 100644 FOFBApp/Db/FOFBTrigger_settings.req create mode 100644 iocBoot/iocFOFB/initCommonCommands delete mode 100644 iocBoot/iocFOFB/statsPlugins.cmd delete mode 100644 iocBoot/iocFOFB/waveformFilePlugins.cmd delete mode 100644 iocBoot/iocFOFB/waveformPlugins.cmd diff --git a/FOFBApp/Db/FOFB.template b/FOFBApp/Db/FOFB.template index b55d0d2..a0b7aa6 100644 --- a/FOFBApp/Db/FOFB.template +++ b/FOFBApp/Db/FOFB.template @@ -198,14 +198,14 @@ record(longin,"$(P)$(R)RtmLampPIOLSquareEn-RB"){ record(longout,"$(P)$(R)RtmLampPISPSquareEn-SP"){ field(DTYP,"asynUInt32Digital") - field(DESC,"set PI setpoint closed-loop square wave enable") + 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-RB"){ field(DTYP,"asynUInt32Digital") - field(DESC,"get PI setpoint closed-loop square wave enable") + 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") } @@ -240,14 +240,14 @@ record(longin,"$(P)$(R)RtmLampDacData-RB"){ record(longout,"$(P)$(R)RtmLampDacWr-SP"){ field(DTYP,"asynUInt32Digital") - field(DESC,"set register to write DAC data to external IC") + 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-RB"){ field(DTYP,"asynUInt32Digital") - field(DESC,"get register to write DAC data to external IC") + 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") } @@ -282,42 +282,42 @@ record(longin,"$(P)$(R)RtmLampPITI-RB"){ record(longout,"$(P)$(R)RtmLampPISP-SP"){ field(DTYP,"asynUInt32Digital") - field(DESC,"set PI setpoint (also used for PI test modes)") + 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-RB"){ field(DTYP,"asynUInt32Digital") - field(DESC,"get PI setpoint (also used for PI test modes)") + 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 (defines PI test mode waveform period)") + 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 (defines PI test mode waveform period)") + 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 (for PI test modes)") + 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 (for PI test modes)") + 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/FOFBAcq_settings.req b/FOFBApp/Db/FOFBAcq_settings.req new file mode 100644 index 0000000..8a12148 --- /dev/null +++ b/FOFBApp/Db/FOFBAcq_settings.req @@ -0,0 +1,13 @@ +$(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 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/src/FOFBInclude.dbd b/FOFBApp/src/FOFBInclude.dbd index 1ef3948..5acf659 100644 --- a/FOFBApp/src/FOFBInclude.dbd +++ b/FOFBApp/src/FOFBInclude.dbd @@ -3,7 +3,8 @@ include "asyn.dbd" include "asSupport.dbd" include "FOFBSupport.dbd" include "devIocStats.dbd" -#include "NDPluginSupport.dbd" -#include "busySupport.dbd" -#include "NDFileNetCDF.dbd" -#include "NDFileHDF5.dbd" +include "NDPluginSupport.dbd" +include "NDFileHDF5.dbd" +include "NDFileNetCDF.dbd" +include "busySupport.dbd" + diff --git a/FOFBApp/src/Makefile b/FOFBApp/src/Makefile index 5c40ee1..906c9f9 100644 --- a/FOFBApp/src/Makefile +++ b/FOFBApp/src/Makefile @@ -47,6 +47,8 @@ FOFB_LIBS += $(EPICS_BASE_IOC_LIBS) 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 @@ -71,6 +73,8 @@ FOFBCheckInit_SRCS += FOFBCheckInit.c 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 @@ -88,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 6827456..1aca109 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -416,32 +416,6 @@ static const channelRevMap_t channelRevMap[CH_HW_END] = { /* 13 = Unavailable */ {-1}, /* [CH_HW_MONIT1] = */ {CH_MONIT1}, }; - -/* This function should not be called, as there is no client function to replace it and - * * the EPICS Db should not export PVs that maps here. - * * FIXME: not sure why, but some unavailable functions are called even with no - * * "apperently" Db record mapped to it. When this happens, segfault occurs. So, - * * until we figure out what s happening we keep "NULL" function mapped to this dummy - * * functions */ -static halcs_client_err_e halcs_dummy_read_32 (halcs_client_t *self, char *service, uint32_t *param) -{ - (void) self; - (void) service; - (void) param; - return HALCS_CLIENT_ERR_INV_FUNCTION; -} - -static halcs_client_err_e halcs_dummy_read_chan_32 (halcs_client_t *self, char *service, - uint32_t chan, uint32_t *param) -{ - (void) self; - (void) service; - (void) chan; - (void) param; - return HALCS_CLIENT_ERR_INV_FUNCTION; -} - - /* Int32 functions mapping */ static const functionsAny_t fofbProcessingSetGetRamWriteFunc = {functionsUInt32_t{"FOFB_PROCESSING", halcs_set_fofb_processing_ram_write, halcs_get_fofb_processing_ram_write}}; @@ -1188,12 +1162,53 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } } +#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; + } + } + +#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); @@ -1298,10 +1313,6 @@ asynStatus drvFOFB::fofbClientConnect(asynUser* pasynUser) } } -create_halcs_client_monit_err: - /* Destroy regular fofbClient instance */ - halcs_client_destroy (&fofbClient); - create_halcs_client_err: return status; } @@ -2769,7 +2780,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*/ @@ -2810,27 +2820,27 @@ asynStatus drvFOFB::doExecuteHwWriteFunction(functionsUInt32Acq_t &func, char *s 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; - * } - * */ + /* 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; @@ -3001,7 +3011,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*/ diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index eed084d..e73bb12 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -201,8 +201,6 @@ typedef enum { #define FOFB_NUMBER_MIN 1 #define FOFB_NUMBER_MAX MAX_FOFBS -#define MAX_ADDR 8 - /* FOFB Mappping structure */ typedef struct { int board; 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/initCommonCommands b/iocBoot/iocFOFB/initCommonCommands new file mode 100644 index 0000000..e69de29 diff --git a/iocBoot/iocFOFB/initFOFBCommands b/iocBoot/iocFOFB/initFOFBCommands index 139597f..8707171 100644 --- a/iocBoot/iocFOFB/initFOFBCommands +++ b/iocBoot/iocFOFB/initFOFBCommands @@ -1,2 +1,3 @@ - +# Load common commands +< initCommonCommands diff --git a/iocBoot/iocFOFB/save_restore.cmd b/iocBoot/iocFOFB/save_restore.cmd index a0472dd..07cd4ea 100644 --- a/iocBoot/iocFOFB/save_restore.cmd +++ b/iocBoot/iocFOFB/save_restore.cmd @@ -37,5 +37,6 @@ 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") dbLoadRecords("$(AUTOSAVE)/asApp/Db/save_restoreStatus.db", "P=${P}${R}") diff --git a/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index edaa777..86be60d 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -4,10 +4,13 @@ epicsEnvSet("TOP","../..") epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(ADCORE)/db") +epicsEnvSet("FOFB_TYPE", "AFC_FOFB") + # devIOCStats vars epicsEnvSet("ENGINEER","$(ENGINEER=Melissa Aguiar)") epicsEnvSet("LOCATION","$(LOCATION=GCA)") epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(ADCORE)/db") +epicsEnvSet("STARTUP","$(TOP)") < FOFB.config @@ -15,23 +18,24 @@ epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(ADCORE)/db") dbLoadDatabase("${TOP}/dbd/FOFB.dbd") FOFB_registerRecordDeviceDriver (pdbbase) -drvFOFBConfigure("$(FOFB_NAME)", "$(FOFB_ENDPOINT)", "$(FOFB_NUMBER)", "$(FOFB_TYPE)", "$(FOFB_VERBOSE)", "$(FOFB_TIMEOUT)", "$(WAVEFORM_MAX_POINTS)", "$(MAXBUFFERS)", "$(MAXMEMORY)") +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("$(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 +# devIOCStats records +dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db","IOC=${P}${R}Stats") +dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminScanMon.db","IOC=${P}${R}Stats") -< triggerBPM.cmd -< fmc250m_4ch.cmd -< waveformPlugins.cmd -< waveformFilePlugins.cmd -< statsPlugins.cmd +< save_restore.cmd +< triggerFOFB.cmd # Turn on asynTraceFlow and asynTraceError for global trace, i.e. no connected asynUser. asynSetTraceIOMask("$(FOFB_NAME)",0,0x2) @@ -47,6 +51,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 deleted file mode 100644 index 8df0418..0000000 --- a/iocBoot/iocFOFB/statsPlugins.cmd +++ /dev/null @@ -1,119 +0,0 @@ -# Create statistics plugins - -##################### GEN AMP Statistics ########################## - -NDStatsConfigure("STATSGEN_A", $(QSIZE), 0, "$(PORT)", 0, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_A_STATS, PORT=STATSGEN_A,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSGEN_A_TS", $(QSIZE), 0, "STATSGEN_A", 0, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_A_TS_STATS, PORT=STATSGEN_A_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_A,NDARRAY_ADDR=0,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSGEN_B", $(QSIZE), 0, "$(PORT)", 1, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_B_STATS, PORT=STATSGEN_B,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=1,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSGEN_B_TS", $(QSIZE), 0, "STATSGEN_B", 1, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_B_TS_STATS, PORT=STATSGEN_B_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_B,NDARRAY_ADDR=1,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSGEN_C", $(QSIZE), 0, "$(PORT)", 2, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_C_STATS, PORT=STATSGEN_C,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=2,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSGEN_C_TS", $(QSIZE), 0, "STATSGEN_C", 2, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_C_TS_STATS, PORT=STATSGEN_C_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_C,NDARRAY_ADDR=2,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSGEN_D", $(QSIZE), 0, "$(PORT)", 3, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_D_STATS, PORT=STATSGEN_D,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=3,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSGEN_D_TS", $(QSIZE), 0, "STATSGEN_D", 3, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_D_TS_STATS, PORT=STATSGEN_D_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_D,NDARRAY_ADDR=3,NCHANS=$(NCHANS),ENABLED=0") - -##################### GEN POS Statistics ########################## - -NDStatsConfigure("STATSGEN_X", $(QSIZE), 0, "$(PORT)", 6, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_X_STATS, PORT=STATSGEN_X,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=6,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSGEN_X_TS", $(QSIZE), 0, "STATSGEN_X", 6, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_X_TS_STATS, PORT=STATSGEN_X_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_X,NDARRAY_ADDR=6,NCHANS=$(NCHANS),ENABLED=0") -# Alias -dbLoadRecords("${TOP}/db/FOFBStatsPluginAliases.template", "P=${P}, R=${R}, STATS_P=GEN_X_STATS, NEW_P=${P}, NEW_R=${R}, NEW_FIELD=ACQPosX-Mon") - -NDStatsConfigure("STATSGEN_Y", $(QSIZE), 0, "$(PORT)", 7, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_Y_STATS, PORT=STATSGEN_Y,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=7,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSGEN_Y_TS", $(QSIZE), 0, "STATSGEN_Y", 7, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_Y_TS_STATS, PORT=STATSGEN_Y_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_Y,NDARRAY_ADDR=7,NCHANS=$(NCHANS),ENABLED=0") -# Alias -dbLoadRecords("${TOP}/db/FOFBStatsPluginAliases.template", "P=${P}, R=${R}, STATS_P=GEN_Y_STATS, NEW_P=${P}, NEW_R=${R}, NEW_FIELD=ACQPosY-Mon") - -NDStatsConfigure("STATSGEN_Q", $(QSIZE), 0, "$(PORT)", 8, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_Q_STATS, PORT=STATSGEN_Q,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=8,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSGEN_Q_TS", $(QSIZE), 0, "STATSGEN_Q", 8, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_Q_TS_STATS, PORT=STATSGEN_Q_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_Q,NDARRAY_ADDR=8,NCHANS=$(NCHANS),ENABLED=0") -# Alias -dbLoadRecords("${TOP}/db/FOFBStatsPluginAliases.template", "P=${P}, R=${R}, STATS_P=GEN_Q_STATS, NEW_P=${P}, NEW_R=${R}, NEW_FIELD=ACQPosQ-Mon") - -NDStatsConfigure("STATSGEN_SUM", $(QSIZE), 0, "$(PORT)", 9, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}GEN_SUM_STATS, PORT=STATSGEN_SUM,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=9,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSGEN_SUM_TS", $(QSIZE), 0, "STATSGEN_SUM", 9, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}GEN_SUM_TS_STATS, PORT=STATSGEN_SUM_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSGEN_SUM,NDARRAY_ADDR=9,NCHANS=$(NCHANS),ENABLED=0") -# Alias -dbLoadRecords("${TOP}/db/FOFBStatsPluginAliases.template", "P=${P}, R=${R}, STATS_P=GEN_SUM_STATS, NEW_P=${P}, NEW_R=${R}, NEW_FIELD=ACQSum-Mon") - -##################### PM AMP Statistics ########################## - -NDStatsConfigure("STATSPM_A", $(QSIZE), 0, "$(PORT)", 12, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_A_STATS, PORT=STATSPM_A,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=12,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSPM_A_TS", $(QSIZE), 0, "STATSPM_A", 12, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_A_TS_STATS, PORT=STATSPM_A_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_A,NDARRAY_ADDR=12,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSPM_B", $(QSIZE), 0, "$(PORT)", 13, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_B_STATS, PORT=STATSPM_B,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=13,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSPM_B_TS", $(QSIZE), 0, "STATSPM_B", 13, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_B_TS_STATS, PORT=STATSPM_B_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_B,NDARRAY_ADDR=13,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSPM_C", $(QSIZE), 0, "$(PORT)", 14, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_C_STATS, PORT=STATSPM_C,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=14,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSPM_C_TS", $(QSIZE), 0, "STATSPM_C", 14, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_C_TS_STATS, PORT=STATSPM_C_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_C,NDARRAY_ADDR=14,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSPM_D", $(QSIZE), 0, "$(PORT)", 15, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_D_STATS, PORT=STATSPM_D,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=15,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSPM_D_TS", $(QSIZE), 0, "STATSPM_D", 15, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_D_TS_STATS, PORT=STATSPM_D_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_D,NDARRAY_ADDR=15,NCHANS=$(NCHANS),ENABLED=0") - -##################### PM POS Statistics ########################## - -NDStatsConfigure("STATSPM_X", $(QSIZE), 0, "$(PORT)", 18, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_X_STATS, PORT=STATSPM_X,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=18,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSPM_X_TS", $(QSIZE), 0, "STATSPM_X", 18, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_X_TS_STATS, PORT=STATSPM_X_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_X,NDARRAY_ADDR=18,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSPM_Y", $(QSIZE), 0, "$(PORT)", 19, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_Y_STATS, PORT=STATSPM_Y,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=19,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSPM_Y_TS", $(QSIZE), 0, "STATSPM_Y", 19, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_Y_TS_STATS, PORT=STATSPM_Y_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_Y,NDARRAY_ADDR=19,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSPM_Q", $(QSIZE), 0, "$(PORT)", 20, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_Q_STATS, PORT=STATSPM_Q,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=20,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSPM_Q_TS", $(QSIZE), 0, "STATSPM_Q", 20, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_Q_TS_STATS, PORT=STATSPM_Q_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_Q,NDARRAY_ADDR=20,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSPM_SUM", $(QSIZE), 0, "$(PORT)", 21, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}PM_SUM_STATS, PORT=STATSPM_SUM,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=21,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSPM_SUM_TS", $(QSIZE), 0, "STATSPM_SUM", 21, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}PM_SUM_TS_STATS, PORT=STATSPM_SUM_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSPM_SUM,NDARRAY_ADDR=21,NCHANS=$(NCHANS),ENABLED=0") - -##################### SP AMP Statistics ########################## - -NDStatsConfigure("STATSSP_A", $(QSIZE), 0, "$(PORT)", 24, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}SP_A_STATS, PORT=STATSSP_A,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=24,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSSP_A_TS", $(QSIZE), 0, "STATSSP_A", 24, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}SP_A_TS_STATS, PORT=STATSSP_A_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSSP_A,NDARRAY_ADDR=24,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSSP_B", $(QSIZE), 0, "$(PORT)", 25, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}SP_B_STATS, PORT=STATSSP_B,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=25,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSSP_B_TS", $(QSIZE), 0, "STATSSP_B", 25, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}SP_B_TS_STATS, PORT=STATSSP_B_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSSP_B,NDARRAY_ADDR=25,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSSP_C", $(QSIZE), 0, "$(PORT)", 26, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}SP_C_STATS, PORT=STATSSP_C,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=26,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSSP_C_TS", $(QSIZE), 0, "STATSSP_C", 26, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}SP_C_TS_STATS, PORT=STATSSP_C_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSSP_C,NDARRAY_ADDR=26,NCHANS=$(NCHANS),ENABLED=0") - -NDStatsConfigure("STATSSP_D", $(QSIZE), 0, "$(PORT)", 27, 0, 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStats.template", "P=${P},R=${R}SP_D_STATS, PORT=STATSSP_D,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=27,HIST_SIZE=256,XSIZE=$(RING_SIZE),YSIZE=0,NCHANS=$(NCHANS)") -NDTimeSeriesConfigure("STATSSP_D_TS", $(QSIZE), 0, "STATSSP_D", 27, 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDTimeSeries.template", "P=${P},R=${R}SP_D_TS_STATS, PORT=STATSSP_D_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATSSP_D,NDARRAY_ADDR=27,NCHANS=$(NCHANS),ENABLED=0") diff --git a/iocBoot/iocFOFB/waveformFilePlugins.cmd b/iocBoot/iocFOFB/waveformFilePlugins.cmd deleted file mode 100644 index c23bc1d..0000000 --- a/iocBoot/iocFOFB/waveformFilePlugins.cmd +++ /dev/null @@ -1,40 +0,0 @@ -##################### GEN AMP File Saving ########################## - -NDFileNetCDFConfigure("GEN_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 4) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}GEN_ABCD_NETCDF,PORT=GEN_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4") - -NDFileHDF5Configure("GEN_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 4) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}GEN_ABCD_HDF5,PORT=GEN_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4") - -##################### GEN POS File Saving ########################## - -NDFileNetCDFConfigure("GEN_XYQS_FileNetCDF", $(QSIZE), 0, "$(PORT)", 10) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}GEN_XYQS_NETCDF,PORT=GEN_XYQS_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10") - -NDFileHDF5Configure("GEN_XYQS_FileHDF5", $(QSIZE), 0, "$(PORT)", 10) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}GEN_XYQS_HDF5,PORT=GEN_XYQS_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10") - -##################### PM Amp File Saving ########################## - -NDFileNetCDFConfigure("PM_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 16) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}PM_ABCD_NETCDF,PORT=PM_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=16") - -NDFileHDF5Configure("PM_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 16) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}PM_ABCD_HDF5,PORT=PM_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=16") - -##################### PM POS File Saving ########################## - -NDFileNetCDFConfigure("PM_XYQS_FileNetCDF", $(QSIZE), 0, "$(PORT)", 22) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}PM_XYQS_NETCDF,PORT=PM_XYQS_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=22") - -NDFileHDF5Configure("PM_XYQS_FileHDF5", $(QSIZE), 0, "$(PORT)", 22) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}PM_XYQS_HDF5,PORT=PM_XYQS_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=22") - -##################### SP File Saving ########################## - -NDFileNetCDFConfigure("SP_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 28) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}SP_ABCD_NETCDF,PORT=SP_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=28") - -NDFileHDF5Configure("SP_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 28) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}SP_ABCD_HDF5,PORT=SP_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=28") - diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd deleted file mode 100644 index 65d35e8..0000000 --- a/iocBoot/iocFOFB/waveformPlugins.cmd +++ /dev/null @@ -1,84 +0,0 @@ -##################### GEN AMP Waveforms ########################## - -NDStdArraysConfigure("GEN_A_Array", $(QSIZE), 0, "$(PORT)", 0) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_A,PORT=GEN_A_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("GEN_B_Array", $(QSIZE), 0, "$(PORT)", 1) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_B,PORT=GEN_B_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=1,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("GEN_C_Array", $(QSIZE), 0, "$(PORT)", 2) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_C,PORT=GEN_C_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=2,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("GEN_D_Array", $(QSIZE), 0, "$(PORT)", 3) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}GEN_D,PORT=GEN_D_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=3,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -##################### AMP PM Waveforms ########################## - -NDStdArraysConfigure("PM_A_Array", $(QSIZE), 0, "$(PORT)", 12) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_A,PORT=PM_A_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=12,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_B_Array", $(QSIZE), 0, "$(PORT)", 13) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_B,PORT=PM_B_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=13,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_C_Array", $(QSIZE), 0, "$(PORT)", 14) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_C,PORT=PM_C_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=14,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_D_Array", $(QSIZE), 0, "$(PORT)", 15) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_D,PORT=PM_D_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=15,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -##################### Raw Data Single Pass Waveforms ########################## - -NDStdArraysConfigure("SP_A_Array", $(QSIZE), 0, "$(PORT)", 24) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}SP_A,PORT=SP_A_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=24,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("SP_B_Array", $(QSIZE), 0, "$(PORT)", 25) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}SP_B,PORT=SP_B_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=25,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("SP_C_Array", $(QSIZE), 0, "$(PORT)", 26) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}SP_C,PORT=SP_C_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=26,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("SP_D_Array", $(QSIZE), 0, "$(PORT)", 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}SP_D,PORT=SP_D_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=27,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -##################### Monit AMP/POS/POSFake Waveforms ########################## - -NDStdArraysConfigure("MONIT_A_Array", $(QSIZE), 0, "$(PORT)", 30) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_A,PORT=MONIT_A_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=30,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -#alias( "${P}${R}MONIT_AArrayData", "$(P)$(R)AmplA-Mon") - -NDStdArraysConfigure("MONIT_B_Array", $(QSIZE), 0, "$(PORT)", 31) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_B,PORT=MONIT_B_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=31,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -#alias( "${P}${R}MONIT_BArrayData", "$(P)$(R)AmplB-Mon") - -NDStdArraysConfigure("MONIT_C_Array", $(QSIZE), 0, "$(PORT)", 32) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_C,PORT=MONIT_C_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=32,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -#alias( "${P}${R}MONIT_CArrayData", "$(P)$(R)AmplC-Mon") - -NDStdArraysConfigure("MONIT_D_Array", $(QSIZE), 0, "$(PORT)", 33) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_D,PORT=MONIT_D_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=33,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -# alias( "${P}${R}MONIT_DArrayData", "$(P)$(R)AmplD-Mon") - -NDStdArraysConfigure("MONIT_X_Array", $(QSIZE), 0, "$(PORT)", 34) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_X,PORT=MONIT_X_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=34,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -# alias( "${P}${R}MONIT_XArrayData", "$(P)$(R)PosX-Mon") - -NDStdArraysConfigure("MONIT_Y_Array", $(QSIZE), 0, "$(PORT)", 35) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_Y,PORT=MONIT_Y_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=35,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -# alias( "${P}${R}MONIT_YArrayData", "$(P)$(R)PosY-Mon") - -NDStdArraysConfigure("MONIT_Q_Array", $(QSIZE), 0, "$(PORT)", 36) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_Q,PORT=MONIT_Q_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=36,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -# alias( "${P}${R}MONIT_QArrayData", "$(P)$(R)PosQ-Mon") - -NDStdArraysConfigure("MONIT_SUM_Array", $(QSIZE), 0, "$(PORT)", 37) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_SUM,PORT=MONIT_SUM_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=37,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -# alias( "${P}${R}MONIT_SUMArrayData", "$(P)$(R)Sum-Mon") - -NDStdArraysConfigure("MONIT_FAKEX_Array", $(QSIZE), 0, "$(PORT)", 38) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_FAKEX,PORT=MONIT_FAKEX_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=38,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -# alias( "${P}${R}MONIT_FAKEXArrayData", "$(P)$(R)PosXFake-Mon") - -NDStdArraysConfigure("MONIT_FAKEY_Array", $(QSIZE), 0, "$(PORT)", 39) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}MONIT_FAKEY,PORT=MONIT_FAKEY_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=39,TYPE=Float64,FTVL=DOUBLE,NELEMENTS=1") -# alias( "${P}${R}MONIT_FAKEYArrayData", "$(P)$(R)PosYFake-Mon") - 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: From cd15d74a755e454049d7cc4568b61f27f4768c23 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Wed, 15 Dec 2021 16:10:24 -0200 Subject: [PATCH 08/42] iocFOFB: add waveform files --- iocBoot/iocFOFB/stFOFB.cmd | 9 ++++----- iocBoot/iocFOFB/statsPlugins.cmd | 0 iocBoot/iocFOFB/waveformFilePlugins.cmd | 1 + iocBoot/iocFOFB/waveformPlugins.cmd | 3 +++ 4 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 iocBoot/iocFOFB/statsPlugins.cmd create mode 100644 iocBoot/iocFOFB/waveformFilePlugins.cmd create mode 100644 iocBoot/iocFOFB/waveformPlugins.cmd diff --git a/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index 86be60d..4aa70c5 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -4,7 +4,7 @@ epicsEnvSet("TOP","../..") epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(ADCORE)/db") -epicsEnvSet("FOFB_TYPE", "AFC_FOFB") +epicsEnvSet("FOFB_TYPE", "FOFB") # devIOCStats vars epicsEnvSet("ENGINEER","$(ENGINEER=Melissa Aguiar)") @@ -30,12 +30,11 @@ dbLoadRecords("${TOP}/db/FOFBAcq.template", "P=${P}, R=${R}, ACQ_NAME=ACQ_PM, PO dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db","IOC=${P}${R}Stats") dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminScanMon.db","IOC=${P}${R}Stats") -# 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) diff --git a/iocBoot/iocFOFB/statsPlugins.cmd b/iocBoot/iocFOFB/statsPlugins.cmd new file mode 100644 index 0000000..e69de29 diff --git a/iocBoot/iocFOFB/waveformFilePlugins.cmd b/iocBoot/iocFOFB/waveformFilePlugins.cmd new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/iocBoot/iocFOFB/waveformFilePlugins.cmd @@ -0,0 +1 @@ + diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd new file mode 100644 index 0000000..ae45018 --- /dev/null +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -0,0 +1,3 @@ +##################### FOFB configuration ########################## + +dbLoadRecords("${TOP}/db/FOFB.template", "P=${P}, R=${R}, GLOBAL_ARRAY_NAME_X=X, GLOBAL_ARRAY_NAME_Y=Y, GLOBAL_ARRAY_NAME_XY=XY, GLOBAL_ARRAY_NAME_Q=Q, GLOBAL_ARRAY_NAME_SUM=SUM, PORT=$(PORT), ADDR=0, TIMEOUT=1") From 87b43afa3663ecb75ea8e81a370e2ac78c6a7fd9 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Thu, 16 Dec 2021 11:20:57 -0200 Subject: [PATCH 09/42] FOFBApp/src/drvFOFB: update channelMap --- FOFBApp/src/drvFOFB.cpp | 122 ++-------------------------------------- FOFBApp/src/drvFOFB.h | 39 ++++++------- 2 files changed, 24 insertions(+), 137 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 1aca109..8a9e55f 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -129,44 +129,6 @@ static const channelMap_t channelMap[CH_END] = { -1}, }, }, - /* [CH_ADCSWAP] = */ {CH_HW_ADCSWAP, // HwAmpChannel - -1, // HwPhaseChannel - -1, // HwPosChannel - 0, // CalcPos - {{WVF_GENAMP_A, // NDArrayAmp - WVF_GENAMP_B, - WVF_GENAMP_C, - WVF_GENAMP_D, - WVF_GENAMP_ALL}, - {WVF_AMP_PM_A, - WVF_AMP_PM_B, - WVF_AMP_PM_C, - WVF_AMP_PM_D, - WVF_AMP_PM_ALL}, - }, - {{-1, // NDArrayPhase - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, - }, - {{-1, // NDArrayPos - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, - }, - }, /* [CH_TBT] = */ {CH_HW_TBT, // HwAmpChannel -1, // HwPhaseChannel -1, // HwPosChannel @@ -243,82 +205,6 @@ static const channelMap_t channelMap[CH_END] = { WVF_POS_PM_ALL}, }, }, - /* [CH_TBTPHA] = */ {CH_HW_TBTPHA, // HwAmpChannel - -1, // HwPhaseChannel - -1, // HwPosChannel - 1, // CalcPos - {{WVF_GENAMP_A, // NDArrayAmp - WVF_GENAMP_B, - WVF_GENAMP_C, - WVF_GENAMP_D, - WVF_GENAMP_ALL}, - {WVF_AMP_PM_A, - WVF_AMP_PM_B, - WVF_AMP_PM_C, - WVF_AMP_PM_D, - WVF_AMP_PM_ALL}, - }, - {{-1, // NDArrayPhase - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, - }, - {{WVF_GENPOS_A, // NDArrayPos - WVF_GENPOS_B, - WVF_GENPOS_C, - WVF_GENPOS_D, - WVF_GENPOS_ALL}, - {WVF_POS_PM_A, - WVF_POS_PM_B, - WVF_POS_PM_C, - WVF_POS_PM_D, - WVF_POS_PM_ALL}, - }, - }, - /* [CH_FOFBPHA] = */ {CH_HW_FOFBPHA, // HwAmpChannel - -1, // HwPhaseChannel - -1, // HwPosChannel - 1, // CalcPos - {{WVF_GENAMP_A, // NDArrayAmp - WVF_GENAMP_B, - WVF_GENAMP_C, - WVF_GENAMP_D, - WVF_GENAMP_ALL}, - {WVF_AMP_PM_A, - WVF_AMP_PM_B, - WVF_AMP_PM_C, - WVF_AMP_PM_D, - WVF_AMP_PM_ALL}, - }, - {{-1, // NDArrayPhase - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, - }, - {{WVF_GENPOS_A, // NDArrayPos - WVF_GENPOS_B, - WVF_GENPOS_C, - WVF_GENPOS_D, - WVF_GENPOS_ALL}, - {WVF_POS_PM_A, - WVF_POS_PM_B, - WVF_POS_PM_C, - WVF_POS_PM_D, - WVF_POS_PM_ALL}, - }, - }, /* [CH_MONIT1] = */ {CH_HW_MONIT1, // HwAmpChannel -1, // HwPhaseChannel -1, // HwPosChannel @@ -401,18 +287,18 @@ static const channelMap_t channelMap[CH_END] = { static const channelRevMap_t channelRevMap[CH_HW_END] = { /* EPICS channel */ /* [CH_HW_ADC] = */ {CH_ADC}, - /* [CH_HW_ADCSWAP] = */ {CH_ADCSWAP}, + /* 1 = Unavailable */ {-1}, /* 2 = Unavailable */ {-1}, /* 3 = Unavailable */ {-1}, /* 4 = Unavailable */ {-1}, /* 5 = Unavailable */ {-1}, /* [CH_HW_TBT] = */ {CH_TBT}, - /* [CH_HW_TBTPHA] = */ {CH_TBTPHA}, + /* 7 = Unavailable */ {-1}, /* 8 = Unavailable */ {-1}, /* 9 = Unavailable */ {-1}, /* 10 = Unavailable */ {-1}, /* [CH_HW_FOFB] = */ {CH_FOFB}, - /* [CH_HW_FOFBPHA] = */ {CH_FOFBPHA}, + /* 12 = Unavailable */ {-1}, /* 13 = Unavailable */ {-1}, /* [CH_HW_MONIT1] = */ {CH_MONIT1}, }; @@ -734,7 +620,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; diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index e73bb12..d6d59a5 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -1,10 +1,10 @@ /* - * * * * drvFOFB.h - * * * * - * * * * Authors: Melissa Aguiar - * * * * - * * * * Created Dec. 03, 2021 - * * * */ + * * * * * drvFOFB.h + * * * * * + * * * * * Authors: Melissa Aguiar + * * * * * + * * * * * Created Dec. 03, 2021 + * * * * */ #include "asynPortDriver.h" #include "asynNDArrayDriver.h" @@ -105,19 +105,19 @@ typedef enum { } 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 */ + * * * 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 */ + * * * 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 */ + * * * 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) @@ -215,7 +215,7 @@ typedef struct { int HwPhaseChannel; int HwPosChannel; /* 1 if we want to have position calculated from its amplitudes, - * * 0 otherwise */ + * * * 0 otherwise */ int CalcPos; /* NDArray addresses mapping */ int NDArrayAmp[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_AMP_TYPES]; @@ -305,7 +305,7 @@ typedef struct { 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) */ + * * * executed on hardware (the other one won't be changed) */ int parameterPos; } functions2UInt32_t; @@ -401,7 +401,7 @@ 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 */ + * * * * * 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 */ @@ -746,7 +746,7 @@ class drvFOFB : public asynNDArrayDriver { 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, @@ -799,3 +799,4 @@ const char *functionsAny_t::getServiceNameFromFunc(const drvFOFB& drvFOFB, return drvFOFB.doGetServiceNameFromFunc(functionFpCast); } + From fcf52eedd759ff6c2dd389bf1acca9930b11b3cf Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Thu, 16 Dec 2021 12:29:03 -0200 Subject: [PATCH 10/42] FOFBApp/src/drvFOFB: monit functions added --- FOFBApp/src/drvFOFB.cpp | 109 ++++++++++++++++++++++++++++++++++++++-- FOFBApp/src/drvFOFB.h | 19 +++++++ 2 files changed, 125 insertions(+), 3 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 8a9e55f..5ab08c7 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -33,6 +33,13 @@ #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 @@ -479,7 +486,15 @@ static taskParams_t taskParams[NUM_ACQ_CORES_PER_FOFB] = { }, }; +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) { @@ -672,6 +687,13 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } } + 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 @@ -745,6 +767,14 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, 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); @@ -937,6 +967,14 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, setUIntDigitalParam(P_FofbCtrlRcbRdStr, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbCtrlRcbData, 0, 0xFFFFFFFF); + 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 + /* Set acquisition parameters */ for (int addr = 0; addr < NUM_ACQ_CORES_PER_FOFB; ++addr) { @@ -1077,6 +1115,18 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } } + /* 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" @@ -1148,6 +1198,18 @@ 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) { @@ -1198,7 +1260,10 @@ asynStatus drvFOFB::fofbClientConnect(asynUser* pasynUser) 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; } @@ -1219,6 +1284,10 @@ 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]); @@ -1241,6 +1310,12 @@ void acqTask(void *drvPvt) pPvt->drvFOFBp->acqTask(pPvt->coreID, pPvt->pollTime, pPvt->autoStart); } +void acqMonitTask(void *drvPvt) +{ + taskParams_t *pPvt = (taskParams_t *)drvPvt; + pPvt->drvFOFBp->acqMonitTask(); +} + /********************************************************************/ /******************* FOFB Acquisition functions *********************/ /********************************************************************/ @@ -1737,6 +1812,22 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) } } +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_AMP_A; + epicsTimeStamp now; + int monitEnable = 0; + static const char *functionName = "acqMonitTask"; + char service[SERVICE_NAME_SIZE]; +} + asynStatus drvFOFB::deinterleaveNDArray (NDArray *pArrayAllChannels, const int *pNDArrayAddr, int pNDArrayAddrSize, int arrayCounter, epicsTimeStamp *timeStamp) { @@ -2410,8 +2501,20 @@ asynStatus drvFOFB::writeInt32(asynUser *pasynUser, epicsInt32 value) /* Set the parameter in the parameter library. */ setIntegerParam(addr, function, value); - /* Do operation on HW. Some functions do not set anything on hardware */ - status = setParamInteger(function, addr); + 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 */ diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index d6d59a5..a8480c3 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -462,6 +462,14 @@ struct functionsAny_t { #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 */ +#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 */ @@ -521,6 +529,7 @@ class drvFOFB : public asynNDArrayDriver { /* 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 @@ -656,6 +665,14 @@ class drvFOFB : public asynNDArrayDriver { int P_FofbCtrlRcbRdStr; int 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; @@ -691,6 +708,7 @@ class drvFOFB : public asynNDArrayDriver { 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; @@ -706,6 +724,7 @@ class drvFOFB : public asynNDArrayDriver { epicsEventId abortAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; epicsEventId reconfSPassAcqEventId[NUM_ACQ_CORES_PER_FOFB]; epicsEventId activeAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId activeMonitEnableEventId; std::unordered_map fofbHwFunc; /* Our private methods */ From 4b7adc53354cfed0838a8260131fcd07d4857896 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 21 Dec 2021 12:43:17 -0200 Subject: [PATCH 11/42] FOFBApp and iocFOFB: update waveform files --- FOFBApp/Db/FOFBAcq.template | 33 ++++++++++++++++++++++--- FOFBApp/Db/FOFB_settings.req | 3 +++ iocBoot/iocFOFB/auto_settings.req | 5 ++++ iocBoot/iocFOFB/initCommonCommands | 30 ++++++++++++++++++++++ iocBoot/iocFOFB/statsPlugins.cmd | 15 +++++++++++ iocBoot/iocFOFB/waveformFilePlugins.cmd | 14 +++++++++++ iocBoot/iocFOFB/waveformPlugins.cmd | 5 ++++ 7 files changed, 102 insertions(+), 3 deletions(-) diff --git a/FOFBApp/Db/FOFBAcq.template b/FOFBApp/Db/FOFBAcq.template index 8175893..7807859 100644 --- a/FOFBApp/Db/FOFBAcq.template +++ b/FOFBApp/Db/FOFBAcq.template @@ -1,7 +1,6 @@ -######################### +################################## # Waveform Acquisition parameters -######################### - +################################## record(longout,"$(P)$(R)$(ACQ_NAME)SamplesPre-SP"){ field(DTYP,"asynUInt32Digital") field(DESC,"Set number of pre samples for waveforms") @@ -399,3 +398,31 @@ record(ai, "$(P)$(R)$(ACQ_NAME)UpdateTime-RB"){ field(EGU, "s") } +record(waveform,"$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataWvf") +{ + field(DESC, "Data waveform $(ACQ)$(ARRAY_NAME)") + field(NELM,"$(NELEMENTS)") + field(FTVL, "$(FTVL)") + field(TSEL, "$(P)$(R)$(ACQ)ArrayData.TIME") + field(FLNK, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayData") +} + +record(subArray,"$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayData") +{ + field(DESC, "Data $(ACQ)$(ARRAY_NAME)") + field(INP, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataWvf NPP NMS") + field(TSEL, "$(P)$(R)$(ACQ)ArrayData.TIME") + field(MALM, "$(NELEMENTS)") + field(FTVL, "$(FTVL)") + field(FLNK, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataSeq") +} + +# Adjust NELM of subarray so clients get correct monitors when +# number os elements change +record(seq, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataSeq"){ +field(DESC,"Get NORD from $(ACQ)$ waveform") +field(PINI,"YES") +field(DOL1, "$(P)$(R)$(ACQ)ArrayData.NORD NPP NMS") +field(LNK1, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayData.NELM PP NMS") +field(SELM, "All") +} diff --git a/FOFBApp/Db/FOFB_settings.req b/FOFBApp/Db/FOFB_settings.req index e382821..14670bc 100644 --- a/FOFBApp/Db/FOFB_settings.req +++ b/FOFBApp/Db/FOFB_settings.req @@ -3,6 +3,9 @@ file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ_NAME=ACQ # to always return Post-Mortem to a safe state. # file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ_NAME=ACQ_PM +file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ=GEN, ARRAY_NAME=CH0 +file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ=PM, ARRAY_NAME=CH0 + # 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 diff --git a/iocBoot/iocFOFB/auto_settings.req b/iocBoot/iocFOFB/auto_settings.req index 1b4617b..7242c6f 100644 --- a/iocBoot/iocFOFB/auto_settings.req +++ b/iocBoot/iocFOFB/auto_settings.req @@ -1,5 +1,10 @@ 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)PM_CH0 +file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH0 + file "NDFile_settings.req", P=$(P), R=$(R)GEN_ABCD_NETCDF file "NDFile_settings.req", P=$(P), R=$(R)GEN_ABCD_HDF5 file "NDFile_settings.req", P=$(P), R=$(R)GEN_XYQS_NETCDF diff --git a/iocBoot/iocFOFB/initCommonCommands b/iocBoot/iocFOFB/initCommonCommands index e69de29..fdd3902 100644 --- a/iocBoot/iocFOFB/initCommonCommands +++ b/iocBoot/iocFOFB/initCommonCommands @@ -0,0 +1,30 @@ +# Waveform Plugin + +dbpf "${P}${R}GEN_CH0EnableCallbacks" 1 +dbpf "${P}${R}GEN_CH0ArrayData.TSE" -2 + +dbpf "${P}${R}PM_CH0EnableCallbacks" 1 +dbpf "${P}${R}PM_CH0ArrayData.TSE" -2 + +dbpf "${P}${R}MONIT_CH0EnableCallbacks" 1 +dbpf "${P}${R}MONIT_CH0ArrayData.TSE" -2 + +# File Saving Plugin + +dbpf "${P}${R}GEN_ABCD_NETCDFEnableCallbacks" 1 +dbpf "${P}${R}GEN_ABCD_HDF5EnableCallbacks" 1 + +dbpf "${P}${R}GEN_XYQS_NETCDFEnableCallbacks" 1 +dbpf "${P}${R}GEN_XYQS_HDF5EnableCallbacks" 1 + +# 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/statsPlugins.cmd b/iocBoot/iocFOFB/statsPlugins.cmd index e69de29..ee9450d 100644 --- a/iocBoot/iocFOFB/statsPlugins.cmd +++ 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/waveformFilePlugins.cmd b/iocBoot/iocFOFB/waveformFilePlugins.cmd index 8b13789..799fa5c 100644 --- a/iocBoot/iocFOFB/waveformFilePlugins.cmd +++ b/iocBoot/iocFOFB/waveformFilePlugins.cmd @@ -1 +1,15 @@ +##################### GEN Data File Saving ########################## +NDFileNetCDFConfigure("GEN_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 4) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}GEN_ABCD_NETCDF,PORT=GEN_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4") + +NDFileHDF5Configure("GEN_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 4) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}GEN_ABCD_HDF5,PORT=GEN_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4") + +##################### PM Data File Saving ########################## + +NDFileNetCDFConfigure("PM_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 10) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}PM_ABCD_NETCDF,PORT=PM_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10") + +NDFileHDF5Configure("PM_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 10) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}PM_ABCD_HDF5,PORT=PM_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10") diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd index ae45018..8c76659 100644 --- a/iocBoot/iocFOFB/waveformPlugins.cmd +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -1,3 +1,8 @@ ##################### FOFB configuration ########################## dbLoadRecords("${TOP}/db/FOFB.template", "P=${P}, R=${R}, GLOBAL_ARRAY_NAME_X=X, GLOBAL_ARRAY_NAME_Y=Y, GLOBAL_ARRAY_NAME_XY=XY, GLOBAL_ARRAY_NAME_Q=Q, GLOBAL_ARRAY_NAME_SUM=SUM, PORT=$(PORT), ADDR=0, TIMEOUT=1") + +##################### 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)") From 62f376a709fde5223a69b71fb85eebf80989ee45 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 21 Dec 2021 15:20:52 -0200 Subject: [PATCH 12/42] FOFBApp: update waveform records --- FOFBApp/Db/FOFBAcq.template | 48 +++++++++------------------------ FOFBApp/Db/FOFBAcq_settings.req | 3 +++ FOFBApp/src/drvFOFB.cpp | 38 -------------------------- FOFBApp/src/drvFOFB.h | 13 +++------ 4 files changed, 18 insertions(+), 84 deletions(-) diff --git a/FOFBApp/Db/FOFBAcq.template b/FOFBApp/Db/FOFBAcq.template index 7807859..1a3577b 100644 --- a/FOFBApp/Db/FOFBAcq.template +++ b/FOFBApp/Db/FOFBAcq.template @@ -69,16 +69,10 @@ record(mbbo, "$(P)$(R)$(ACQ_NAME)Channel-Sel"){ field(ONVL,"1") field(TWVL,"2") field(THVL,"3") - field(FRVL,"4") - field(FVVL,"5") - field(SXVL,"6") field(ZRST,"adc") - field(ONST,"adcswap") - field(TWST,"tbt") - field(THST,"fofb") - field(FRST,"tbtpha") - field(FVST,"fofbpha") - field(SXST,"monit1") + field(ONST,"tbt") + field(TWST,"fofb") + field(THST,"monit1") } record(mbbi, "$(P)$(R)$(ACQ_NAME)Channel-Sts"){ @@ -91,16 +85,10 @@ record(mbbi, "$(P)$(R)$(ACQ_NAME)Channel-Sts"){ field(ONVL,"1") field(TWVL,"2") field(THVL,"3") - field(FRVL,"4") - field(FVVL,"5") - field(SXVL,"6") field(ZRST,"adc") - field(ONST,"adcswap") - field(TWST,"tbt") - field(THST,"fofb") - field(FRST,"tbtpha") - field(FVST,"fofbpha") - field(SXST,"monit1") + field(ONST,"tbt") + field(TWST,"fofb") + field(THST,"monit1") } # For use with rate seq record defined in FFTRecords.template @@ -308,16 +296,10 @@ record(mbbo,"$(P)$(R)$(ACQ_NAME)DataTrigChan-Sel"){ field(ONVL,"1") field(TWVL,"2") field(THVL,"3") - field(FRVL,"4") - field(FVVL,"5") - field(SXVL,"6") field(ZRST,"adc") - field(ONST,"adcswap") - field(TWST,"tbt") - field(THST,"fofb") - field(FRST,"tbtpha") - field(FVST,"fofbpha") - field(SXST,"monit1") + field(ONST,"tbt") + field(TWST,"fofb") + field(THST,"monit1") field(OUT,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_DATA_TRIG_CHAN") } @@ -330,16 +312,10 @@ record(mbbi,"$(P)$(R)$(ACQ_NAME)DataTrigChan-Sts"){ field(ONVL,"1") field(TWVL,"2") field(THVL,"3") - field(FRVL,"4") - field(FVVL,"5") - field(SXVL,"6") field(ZRST,"adc") - field(ONST,"adcswap") - field(TWST,"tbt") - field(THST,"fofb") - field(FRST,"tbtpha") - field(FVST,"fofbpha") - field(SXST,"monit1") + field(ONST,"tbt") + field(TWST,"fofb") + field(THST,"monit1") field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))ACQ_DATA_TRIG_CHAN") } diff --git a/FOFBApp/Db/FOFBAcq_settings.req b/FOFBApp/Db/FOFBAcq_settings.req index 8a12148..17c4f34 100644 --- a/FOFBApp/Db/FOFBAcq_settings.req +++ b/FOFBApp/Db/FOFBAcq_settings.req @@ -11,3 +11,6 @@ $(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)$(ARRAY_NAME)ArrayDataWvf +$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayData +$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataSeq diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 5ab08c7..68bc911 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -250,44 +250,6 @@ static const channelMap_t channelMap[CH_END] = { -1}, }, }, - /* [CH_SP] = */ {CH_HW_ADC, // HwAmpChannel - -1, // HwPhaseChannel - -1, // HwPosChannel - 0, // CalcPos - {{WVF_AMP_SP_A, // NDArrayAmp - WVF_AMP_SP_B, - WVF_AMP_SP_C, - WVF_AMP_SP_D, - WVF_AMP_SP_ALL}, - {-1, - -1, - -1, - -1, - -1}, - }, - {{-1, // NDArrayPhase - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, - }, - {{-1, // NDArrayPos - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, - }, - }, }; /* FIXME: This reverse mapping must match the maximum HwAmpChannel for ChannelMap */ diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index a8480c3..c252db5 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -127,13 +127,9 @@ typedef enum { /* Channel IDs */ typedef enum { CH_ADC = 0, - CH_ADCSWAP = 1, - CH_TBT = 2, - CH_FOFB = 3, - CH_TBTPHA = 4, - CH_FOFBPHA = 5, - CH_MONIT1 = 6, - CH_SP = 7, + CH_TBT = 1, + CH_FOFB = 2, + CH_MONIT1 = 3, CH_END } ch_types; @@ -141,11 +137,8 @@ typedef enum { typedef enum { CH_HW_ADC = 0, - CH_HW_ADCSWAP = 1, CH_HW_TBT = 6, - CH_HW_TBTPHA = 7, CH_HW_FOFB = 11, - CH_HW_FOFBPHA = 12, CH_HW_MONIT1 = 14, CH_HW_END } ch_hw_types; From ad6c3ce23fd535c00037fe43c483147dc07dd256 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 21 Dec 2021 16:57:25 -0200 Subject: [PATCH 13/42] FOFBApp/src/drvFOFB: update channel map and waveform parameters --- FOFBApp/src/drvFOFB.cpp | 420 ++++++++++++++-------------------------- FOFBApp/src/drvFOFB.h | 136 ++++--------- 2 files changed, 181 insertions(+), 375 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 68bc911..fad8327 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 @@ -97,162 +97,37 @@ static const boardMap_t boardMap[MAX_FOFBS+1] = { }; static const channelMap_t channelMap[CH_END] = { - /* Amp, Phase, Pos, AmpA, AmpB, AmpC, AmpD, AmpALL */ - /* [CH_ADC] = */ {CH_HW_ADC, // HwAmpChannel - -1, // HwPhaseChannel - -1, // HwPosChannel - 0, // CalcPos - {{WVF_GENAMP_A, // NDArrayAmp - WVF_GENAMP_B, - WVF_GENAMP_C, - WVF_GENAMP_D, - WVF_GENAMP_ALL}, - {WVF_AMP_PM_A, - WVF_AMP_PM_B, - WVF_AMP_PM_C, - WVF_AMP_PM_D, - WVF_AMP_PM_ALL}, + /* [CH_ADC] = */ {CH_HW_ADC, // HwDataChannel + {{WVF_DATA_CH0, // NDArrayData + WVF_DATA_ALL}, + {WVF_PM_CH0, + WVF_PM_ALL}, }, - {{-1, // NDArrayPhase - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, }, - {{-1, // NDArrayPos - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, + /* [CH_TBT] = */ {CH_HW_ADC, // HwDataChannel + {{WVF_DATA_CH0, // NDArrayData + WVF_DATA_ALL}, + {WVF_PM_CH0, + WVF_PM_ALL}, }, }, - /* [CH_TBT] = */ {CH_HW_TBT, // HwAmpChannel - -1, // HwPhaseChannel - -1, // HwPosChannel - 1, // CalcPos - {{WVF_GENAMP_A, // NDArrayAmp - WVF_GENAMP_B, - WVF_GENAMP_C, - WVF_GENAMP_D, - WVF_GENAMP_ALL}, - {WVF_AMP_PM_A, - WVF_AMP_PM_B, - WVF_AMP_PM_C, - WVF_AMP_PM_D, - WVF_AMP_PM_ALL}, + /* [CH_FOFB] = */ {CH_HW_ADC, // HwDataChannel + {{WVF_DATA_CH0, // NDArrayData + WVF_DATA_ALL}, + {WVF_PM_CH0, + WVF_PM_ALL}, }, - {{-1, // NDArrayPhase - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, }, - {{WVF_GENPOS_A, // NDArrayPos - WVF_GENPOS_B, - WVF_GENPOS_C, - WVF_GENPOS_D, - WVF_GENPOS_ALL}, - {WVF_POS_PM_A, - WVF_POS_PM_B, - WVF_POS_PM_C, - WVF_POS_PM_D, - WVF_POS_PM_ALL}, - }, - }, - /* [CH_FOFB] = */ {CH_HW_FOFB, // HwAmpChannel - -1, // HwPhaseChannel - -1, // HwPosChannel - 1, // CalcPos - {{WVF_GENAMP_A, // NDArrayAmp - WVF_GENAMP_B, - WVF_GENAMP_C, - WVF_GENAMP_D, - WVF_GENAMP_ALL}, - {WVF_AMP_PM_A, - WVF_AMP_PM_B, - WVF_AMP_PM_C, - WVF_AMP_PM_D, - WVF_AMP_PM_ALL}, - }, - {{-1, // NDArrayPhase - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, - }, - {{WVF_GENPOS_A, // NDArrayPos - WVF_GENPOS_B, - WVF_GENPOS_C, - WVF_GENPOS_D, - WVF_GENPOS_ALL}, - {WVF_POS_PM_A, - WVF_POS_PM_B, - WVF_POS_PM_C, - WVF_POS_PM_D, - WVF_POS_PM_ALL}, - }, - }, - /* [CH_MONIT1] = */ {CH_HW_MONIT1, // HwAmpChannel - -1, // HwPhaseChannel - -1, // HwPosChannel - 1, // CalcPos - {{WVF_GENAMP_A, // NDArrayAmp - WVF_GENAMP_B, - WVF_GENAMP_C, - WVF_GENAMP_D, - WVF_GENAMP_ALL}, - {-1, - -1, - -1, - -1, - -1}, - }, - {{-1, // NDArrayPhase - -1, - -1, - -1, - -1}, - {-1, - -1, - -1, - -1, - -1}, - }, - {{WVF_GENPOS_A, // NDArrayPos - WVF_GENPOS_B, - WVF_GENPOS_C, - WVF_GENPOS_D, - WVF_GENPOS_ALL}, - {-1, - -1, - -1, - -1, - -1}, + /* [CH_MONIT1] = */ {CH_HW_ADC, // HwDataChannel + {{WVF_DATA_CH0, // NDArrayData + WVF_DATA_ALL}, + {WVF_PM_CH0, + WVF_PM_ALL}, }, }, }; -/* FIXME: This reverse mapping must match the maximum HwAmpChannel for ChannelMap */ +/* 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}, @@ -493,7 +368,7 @@ asynStatus drvFOFB::getServiceID (int fofbNumber, int addr, const char *serviceN /* 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 */ + * * * INIT service is always 0 per HALCS instance */ if (streq(serviceName, "TRIGGER_IFACE") || streq(serviceName, "INIT")) { *serviceIDArg = 0; return status; @@ -562,10 +437,10 @@ asynStatus drvFOFB::getFullServiceName (int fofbNumber, int addr, const char *se } /** 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 ] - * * * * */ + * * * * * 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, const char *type, int verbose, int timeout, int maxPoints, int maxBuffers, size_t maxMemory) @@ -657,12 +532,12 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* 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 */ @@ -772,7 +647,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, createParam(P_TriggerTrnOutSelString, asynParamUInt32Digital, &P_TriggerTrnOutSel); /* FOFB HW Int32 Functions mapping. Functions not mapped here are just written - * * * * to the parameter library */ + * * * * * to the parameter library */ fofbHwFunc.emplace(P_FofbProcessingRamWrite, fofbProcessingSetGetRamWriteFunc); fofbHwFunc.emplace(P_FofbProcessingRamAddr, fofbProcessingSetGetRamAddrFunc); fofbHwFunc.emplace(P_FofbProcessingRamDataIn, fofbProcessingSetGetRamDataInFunc); @@ -857,8 +732,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, 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 */ + * * * * * will ensure the reconnection to server if necessary, but we + * * * * * must succeed here or we must abort completely */ if (status != asynSuccess) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error calling fofbClientConnect, status=%d\n", @@ -985,8 +860,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* 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! */ + * * * 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); @@ -1064,7 +939,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, /* 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*/ + * * * The other parameters are already set-up*/ taskParams[i].drvFOFBp = this; status = (asynStatus)(epicsThreadCreate("drvFOFBTask", epicsThreadPriorityMedium, @@ -1091,13 +966,13 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, #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. - * * */ + * * * 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); @@ -1115,7 +990,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /** Destructor for the drvFOFB class. - * * * */ + * * * * */ drvFOFB::~drvFOFB() { asynStatus status = asynSuccess; @@ -1367,7 +1242,7 @@ asynStatus drvFOFB::setAcqTrig(int coreID, acq_client_trig_e trig) } /* This can only return if the ACQ engine is IDLE or waiting - * * for some trigger (External, Data or Software) */ + * * * 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) { @@ -1405,7 +1280,7 @@ fofb_status_types drvFOFB::getFOFBInitAcqStatus(int coreID) switch (trig) { case ACQ_CLIENT_TRIG_SKIP: /* If we are doing something and the trigger is set to SKIP, - * * then we are acquiring */ + * * * then we are acquiring */ fofbStatus = FOFBStatusAcquire; break; @@ -1455,12 +1330,12 @@ static bool acqIsFOFBStatusErr(int fofbStatus) } /* - * * FOFB acquisition functions - * */ + * * * FOFB acquisition functions + * * */ /** Acquisition task that runs as a separate thread. - * * CAUTION. FIXME? Only one acquisition task is working at any given time: MultiMode or SinglePass - * */ + * * * CAUTION. FIXME? Only one acquisition task is working at any given time: MultiMode or SinglePass + * * */ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) { int status = asynSuccess; @@ -1475,7 +1350,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) epicsUInt32 trigger; double updateTime; double delay; - int hwAmpChannel = 0; + int hwDataChannel = 0; int acqCompleted = 0; int FOFBMode = 0; int fofbStatus = 0; @@ -1493,9 +1368,9 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) 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 */ + * * * 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); @@ -1524,13 +1399,13 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) readingActive[FOFBMode][coreID] = 0; /* Default to new acquisition. If we are waiting for a trigger - * * we will change this */ + * * * 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) */ + * * * (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); @@ -1543,12 +1418,12 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) } /* 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 */ + * * * 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 */ + * * * new acquisition */ if (newAcq && !autoStartFirst) { unlock(); /* Release the lock while we wait for an event that says acquire has started, then lock again */ @@ -1581,24 +1456,24 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) /* Convert bit to byte */ atomWidth = atomWidth/8; - if(numAtoms > MAX_WVF_AMP_TYPES) { + 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_AMP_TYPES); + driverName, functionName, MAX_WVF_DATA_TYPES); continue; } /* Convert user channel into hw channel */ - hwAmpChannel = channelMap[channel].HwAmpChannel; - if(hwAmpChannel < 0) { + hwDataChannel = channelMap[channel].HwDataChannel; + if(hwDataChannel < 0) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", - driverName, functionName, hwAmpChannel); + "%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 */ + * * * samples in each dimension */ dims[0] = numAtoms; dims[1] = (num_samples_pre + num_samples_post)*num_shots; @@ -1613,7 +1488,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) } /* dims[1] must not exceed fofbMaxPoints, as we use this to alloc - * * points for the Waveform Plugins */ + * * * 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", @@ -1629,7 +1504,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) arrayCounter++; setIntegerParam(NDArrayCounter, arrayCounter); - status = getAcqNDArrayType(coreID, hwAmpChannel, atomWidth, &NDType); + 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", @@ -1662,17 +1537,17 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) /* Do acquisition */ unlock(); pasynManager->lockPort(pasynUser); - status = startAcq(coreID, hwAmpChannel, num_samples_pre, num_samples_post, + 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 ... - * */ + * * * 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); } @@ -1723,7 +1598,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) /* Get curve */ unlock(); pasynManager->lockPort(pasynUser); - getAcqCurve(coreID, pArrayAllChannels, hwAmpChannel, num_samples_pre, + getAcqCurve(coreID, pArrayAllChannels, hwDataChannel, num_samples_pre, num_samples_post, num_shots); pasynManager->unlockPort(pasynUser); lock(); @@ -1732,14 +1607,14 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) } /* Only do callbacks and calculate position if we could acquire some - * * data */ + * * * data */ if (acqCompleted == 1) { /* Do callbacks on the full waveform (all channels interleaved) */ doCallbacksGenericPointer(pArrayAllChannels, NDArrayData, - channelMap[channel].NDArrayAmp[coreID][WVF_AMP_ALL]); + channelMap[channel].NDArrayData[coreID][WVF_ALL]); - /* Copy AMP data to arrays for each type of data, do callbacks on that */ - status = deinterleaveNDArray(pArrayAllChannels, channelMap[channel].NDArrayAmp[coreID], + /* 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, @@ -1783,7 +1658,7 @@ void drvFOFB::acqMonitTask() NDArray *pArrayMonitData[MAX_MONIT_DATA]; double monitData[MAX_MONIT_DATA]; NDDataType_t NDType = NDFloat64; - int NDArrayAddrInit = WVF_MONIT_AMP_A; + int NDArrayAddrInit = WVF_MONIT_CH0; epicsTimeStamp now; int monitEnable = 0; static const char *functionName = "acqMonitTask"; @@ -1852,7 +1727,7 @@ asynStatus drvFOFB::deinterleaveNDArray (NDArray *pArrayAllChannels, const int * pOutFloat64 = (epicsFloat64 *)pArraySingleChannel->pData; /* Get only a single channel samples from a multi-channel - * * array */ + * * * array */ switch (NDType) { case NDInt8: for (size_t j = 0; j < dims[0]; ++j) { @@ -1910,7 +1785,7 @@ asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int addr) epicsUInt32 triggerEvent = 0; epicsUInt32 triggerType = 0; epicsUInt32 triggerRep = 0; - epicsUInt32 hwAmpChannel = 0; + epicsUInt32 hwDataChannel = 0; int channel = 0; channelProp_t channelProp; @@ -1921,17 +1796,17 @@ asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int addr) getIntegerParam(addr, P_Channel, &channel); /* Convert user channel into hw channel */ - hwAmpChannel = channelMap[channel].HwAmpChannel; - if(hwAmpChannel < 0) { + hwDataChannel = channelMap[channel].HwDataChannel; + if(hwDataChannel < 0) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", - driverName, functionName, hwAmpChannel); + "%s:%s: invalid hwDataChannel channelMap for channel %d\n", + driverName, functionName, hwDataChannel); status = asynError; goto halcs_inv_channel; } /* Get channel properties */ - status = getChannelProperties(addr, hwAmpChannel, &channelProp); + status = getChannelProperties(addr, hwDataChannel, &channelProp); if (status) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error calling getChannelProperties, status=%d\n", @@ -1947,7 +1822,7 @@ asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int addr) case TRIG_ACQ_START: /* Don't try to change anything is we are still acquiring. - * * We must stop r abort the acquisition first */ + * * * We must stop r abort the acquisition first */ if (readingActive[FOFBMode][addr]) { asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, "%s:%s: Not starting acquistion as acqTask is still active\n", @@ -1980,15 +1855,15 @@ asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int 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 */ + * * * 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, FOFBMode); 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 */ + * * * 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, FOFBMode, true); @@ -2027,8 +1902,8 @@ asynStatus drvFOFB::abortAcqTask(int addr, int fofbMode, bool abortAcqHw) "called for acqTask = %d, coreID = %d\n", driverName, functionName, fofbMode, 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 */ + * * * abort the acquisition anyway, as we might have something + * * * going on inside the FPGA from a previous acquisition */ if (abortAcqHw) { abortAcqFromPortThread(addr); } @@ -2313,13 +2188,13 @@ asynStatus drvFOFB::getChannelProperties(int coreID, int channel, channelProp_t /********************************************************************/ /* - * * * * Asyn overrided methods that are called by higher layers - * * * */ + * * * * * 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. */ + * * * * * 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) { @@ -2382,9 +2257,9 @@ asynStatus drvFOFB::writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, } /** 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. */ + * * * * * 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) { @@ -2435,10 +2310,10 @@ asynStatus drvFOFB::readUInt32Digital(asynUser *pasynUser, epicsUInt32 *value, } /** 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. */ + * * * 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; @@ -2498,10 +2373,10 @@ asynStatus drvFOFB::writeInt32(asynUser *pasynUser, epicsInt32 value) } /** 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 */ + * * * 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; @@ -2543,8 +2418,8 @@ asynStatus drvFOFB::readInt32(asynUser *pasynUser, epicsInt32 *value) } /** Called when asyn clients call pasynFloat64->write(). - * * \param[in] pasynUser pasynUser structure that encodes the reason and address. - * * \param[in] value Value to read */ + * * * \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; @@ -2592,8 +2467,8 @@ asynStatus drvFOFB::writeFloat64(asynUser *pasynUser, epicsFloat64 value) } /** Called when asyn clients call pasynFloat64->read(). - * * \param[in] pasynUser pasynUser structure that encodes the reason and address. - * * \param[in] value Value to 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; @@ -2813,7 +2688,7 @@ asynStatus drvFOFB::doExecuteHwWriteFunction(functions2UInt32_t &func, char *ser } /* Read the HW values first as we need to update - * only one of the parameters */ + * * only one of the parameters */ err = func.read(fofbClient, service, ¶m1, ¶m2); if (err != HALCS_CLIENT_SUCCESS) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, @@ -3035,7 +2910,7 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functions2UInt32_t &func, char *serv epicsUInt32 param2 = 0; /* Read the HW values first as we need to update - * only one of the parameters */ + * * only one of the parameters */ err = func.read(fofbClient, service, ¶m1, ¶m2); if (err != HALCS_CLIENT_SUCCESS) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, @@ -3083,10 +2958,10 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functionsFloat64_t &func, char *serv /********************************************************************/ /* - * * * * 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) { @@ -3190,7 +3065,7 @@ 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; } @@ -3244,7 +3119,7 @@ asynStatus drvFOFB::getParamInteger(int functionId, epicsInt32 *param, *param = functionArgs.argInt32; } /* We recover from asynDisabled just by retrieving - * * the parameter from the list */ + * * * the parameter from the list */ else if (status == asynDisabled){ status = asynSuccess; } @@ -3297,7 +3172,7 @@ asynStatus drvFOFB::getParamDouble(int functionId, epicsFloat64 *param, int addr *param = functionArgs.argFloat64; } /* We recover from asynDisabled just by retrieving - * * the parameter from the list */ + * * * the parameter from the list */ else if (status == asynDisabled){ status = asynSuccess; } @@ -3311,9 +3186,9 @@ asynStatus drvFOFB::getParamDouble(int functionId, epicsFloat64 *param, int addr /********************************************************************/ /* - * * * * 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) { @@ -3322,18 +3197,18 @@ asynStatus drvFOFB::setDataTrigChan(epicsUInt32 mask, int addr) int status = asynSuccess; const char* functionName = "setDataTrigChan"; epicsUInt32 dataTrigChan = 0; - int hwAmpChannel = 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 */ - hwAmpChannel = channelMap[dataTrigChan].HwAmpChannel; - if(hwAmpChannel < 0) { + hwDataChannel = channelMap[dataTrigChan].HwDataChannel; + if(hwDataChannel < 0) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelMap for channel %d\n", - driverName, functionName, hwAmpChannel); + "%s:%s: invalid hwDataChannel channelMap for channel %d\n", + driverName, functionName, hwDataChannel); status = asynError; goto halcs_inv_channel; } @@ -3349,7 +3224,7 @@ asynStatus drvFOFB::setDataTrigChan(epicsUInt32 mask, int addr) goto get_service_err; } - err = acq_set_data_trig_chan (fofbClientAcqParam[serviceID], service, hwAmpChannel); + err = acq_set_data_trig_chan (fofbClientAcqParam[serviceID], service, hwDataChannel); if (err != HALCS_CLIENT_SUCCESS) { status = asynError; goto halcs_set_data_trig_chan_err; @@ -3368,7 +3243,7 @@ asynStatus drvFOFB::getDataTrigChan(epicsUInt32 *channel, epicsUInt32 mask, int int status = asynSuccess; const char* functionName = "getDataTrigChan"; epicsUInt32 dataTrigChan = 0; - epicsUInt32 hwAmpChannel = 0; + epicsUInt32 hwDataChannel = 0; int serviceID = 0; /* Get correct service name*/ @@ -3385,22 +3260,22 @@ asynStatus drvFOFB::getDataTrigChan(epicsUInt32 *channel, epicsUInt32 mask, int /* Clear parameter in case of an error occurs */ *channel = 0; - err = acq_get_data_trig_chan (fofbClientAcqParam[serviceID], service, &hwAmpChannel); + 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 (hwAmpChannel > CH_HW_END-1) { + if (hwDataChannel > CH_HW_END-1) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: invalid HwAmpChannel channelRevMap for channel %d\n", - driverName, functionName, hwAmpChannel); + "%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[hwAmpChannel].epicsChannel; + dataTrigChan = channelRevMap[hwDataChannel].epicsChannel; if(dataTrigChan < 0) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: invalid channel channelRevMap for channel %d\n", @@ -3540,8 +3415,8 @@ asynStatus drvFOFB::readTriggerParams(epicsUInt32 mask, int addr) 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 */ + * * * * * \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, const char *type, int verbose, int timeout, int maxPoints, int maxBuffers, size_t maxMemory) @@ -3586,3 +3461,4 @@ extern "C" { epicsExportRegistrar(drvFOFBRegister); } + diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index c252db5..5966e14 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -1,10 +1,10 @@ /* - * * * * * drvFOFB.h - * * * * * - * * * * * Authors: Melissa Aguiar - * * * * * - * * * * * Created Dec. 03, 2021 - * * * * */ + * * * * * * drvFOFB.h + * * * * * * + * * * * * * Authors: Melissa Aguiar + * * * * * * + * * * * * * Created Dec. 03, 2021 + * * * * * */ #include "asynPortDriver.h" #include "asynNDArrayDriver.h" @@ -61,63 +61,28 @@ typedef enum { /* Waveform IDs */ typedef enum { - WVF_GENAMP_A = 0, - WVF_GENAMP_B, - WVF_GENAMP_C, - WVF_GENAMP_D, - WVF_GENAMP_ALL, - WVF_UNUSED_1, - WVF_GENPOS_A, - WVF_GENPOS_B, - WVF_GENPOS_C, - WVF_GENPOS_D, - WVF_GENPOS_ALL, - WVF_UNUSED_2, - WVF_AMP_PM_A, - WVF_AMP_PM_B, - WVF_AMP_PM_C, - WVF_AMP_PM_D, - WVF_AMP_PM_ALL, - WVF_UNUSED_3, - WVF_POS_PM_A, - WVF_POS_PM_B, - WVF_POS_PM_C, - WVF_POS_PM_D, - WVF_POS_PM_ALL, - WVF_UNUSED_4, - WVF_AMP_SP_A, - WVF_AMP_SP_B, - WVF_AMP_SP_C, - WVF_AMP_SP_D, - WVF_AMP_SP_ALL, - WVF_UNUSED_5, - WVF_MONIT_AMP_A, - WVF_MONIT_AMP_B, - WVF_MONIT_AMP_C, - WVF_MONIT_AMP_D, - WVF_MONIT_POS_X, - WVF_MONIT_POS_Y, - WVF_MONIT_POS_Q, - WVF_MONIT_POS_SUM, - WVF_MONIT_POSFAKE_X, - WVF_MONIT_POSFAKE_Y, + WVF_DATA_CH0 = 0, + WVF_DATA_ALL, + WVF_PM_CH0, + WVF_PM_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 */ + * * * * 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 */ + * * * * 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 */ + * * * * 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) @@ -145,44 +110,15 @@ typedef enum { #define MAX_HW_CHANNELS CH_HW_END -/* Waveform AMP types IDs */ +/* Waveform DATA types IDs */ typedef enum { - WVF_AMP_A = 0, - WVF_AMP_B, - WVF_AMP_C, - WVF_AMP_D, - WVF_AMP_ALL, - WVF_AMP_END -} wvf_amp_types; - -#define MAX_WVF_AMP_SINGLE (WVF_AMP_D+1) -#define MAX_WVF_AMP_TYPES WVF_AMP_END - -/* Waveform Phase types IDs */ -typedef enum { - WVF_PHASE_A = 0, - WVF_PHASE_B, - WVF_PHASE_C, - WVF_PHASE_D, - WVF_PHASE_ALL, - WVF_PHASE_END -} wvf_pha_types; - -#define MAX_WVF_PHA_SINGLE (WVF_PHASE_D+1) -#define MAX_WVF_PHA_TYPES WVF_PHASE_END - -/* Waveform Position types IDs */ -typedef enum { - WVF_POS_X = 0, - WVF_POS_Y, - WVF_POS_Q, - WVF_POS_SUM, - WVF_POS_ALL, - WVF_POS_END -} wvf_pos_types; + WVF_CH0 = 0, + WVF_ALL, + WVF_DATA_END +} wvf_data_types; -#define MAX_WVF_POS_SINGLE (WVF_POS_SUM+1) -#define MAX_WVF_POS_TYPES WVF_POS_END +#define MAX_WVF_DATA_SINGLE (WVF_D+1) +#define MAX_WVF_DATA_TYPES WVF_DATA_END /* One dimension for each point */ #define MAX_WVF_DIMS 2 @@ -204,16 +140,9 @@ typedef struct { /* FOFB Channel structure */ typedef struct { /* HW channel mapping. -1 means not available */ - int HwAmpChannel; - int HwPhaseChannel; - int HwPosChannel; - /* 1 if we want to have position calculated from its amplitudes, - * * * 0 otherwise */ - int CalcPos; + int HwDataChannel; /* NDArray addresses mapping */ - int NDArrayAmp[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_AMP_TYPES]; - int NDArrayPhase[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_PHA_TYPES]; - int NDArrayPos[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_POS_TYPES]; + int NDArrayData[NUM_ACQ_CORES_PER_FOFB][MAX_WVF_DATA_TYPES]; } channelMap_t; /* FOFB Reverse channel mapping structure */ @@ -298,7 +227,7 @@ typedef struct { 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) */ + * * * * executed on hardware (the other one won't be changed) */ int parameterPos; } functions2UInt32_t; @@ -394,7 +323,7 @@ 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 */ + * * * * * * 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 */ @@ -758,7 +687,7 @@ class drvFOFB : public asynNDArrayDriver { 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, @@ -812,3 +741,4 @@ const char *functionsAny_t::getServiceNameFromFunc(const drvFOFB& drvFOFB, } + From c776d179eabd54a21821f3ece485db62b011adf9 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Fri, 24 Dec 2021 15:56:34 -0200 Subject: [PATCH 14/42] scripts/pydm_test: acq_fofb.ui added --- scripts/pydm_test/acq_fofb.ui | 330 ++++++++++++++++++++++++++++++++++ 1 file changed, 330 insertions(+) create mode 100644 scripts/pydm_test/acq_fofb.ui diff --git a/scripts/pydm_test/acq_fofb.ui b/scripts/pydm_test/acq_fofb.ui new file mode 100644 index 0000000..b00b0fb --- /dev/null +++ b/scripts/pydm_test/acq_fofb.ui @@ -0,0 +1,330 @@ + + + Dialog + + + + 0 + 0 + 525 + 525 + + + + Dialog + + + + + 40 + 0 + 141 + 221 + + + + + + + ACQTriggerEvent: + + + + + + + ACQTriggerRep: + + + + + + + ACQTrigger: + + + + + + + ACQSamplesPre: + + + + + + + ACQSamplesPost: + + + + + + + ACQShots: + + + + + + + ACQChannel: + + + + + + + + + 200 + 0 + 121 + 221 + + + + + + + + + + XX-22SL23:DI-FOFB:ACQTriggerEvent-Sel + + + + + + + + + + XX-22SL23:DI-FOFB:ACQTriggerRep-Sel + + + + + + + + + + XX-22SL23:DI-FOFB:ACQTrigger-Sel + + + + + + + + + + XX-22SL23:DI-FOFB:ACQSamplesPre-SP + + + + + + + + + + XX-22SL23:DI-FOFB:ACQSamplesPost-SP + + + + + + + + + + XX-22SL23:DI-FOFB:ACQShots-SP + + + + + + + + + + XX-22SL23:DI-FOFB:ACQChannel-Sel + + + + + + + + + 330 + 0 + 151 + 223 + + + + + + + + + + XX-22SL23:DI-FOFB:ACQTriggerEvent-Sel + + + + + + + + + + XX-22SL23:DI-FOFB:ACQTriggerRep-Sel + + + + + + + + + + XX-22SL23:DI-FOFB:ACQTrigger-Sel + + + + + + + + + + XX-22SL23:DI-FOFB:ACQSamplesPre-SP + + + + + + + + + + XX-22SL23:DI-FOFB:ACQSamplesPost-SP + + + + + + + + + + XX-22SL23:DI-FOFB:ACQShots-SP + + + + + + + + 86 + 25 + + + + + 86 + 25 + + + + + + + XX-22SL23:DI-FOFB:ACQChannel-Sel + + + + + + + + + 170 + 490 + 81 + 22 + + + + ACQStatus: + + + + + + 270 + 490 + 91 + 22 + + + + + + + XX-22SL23:DI-FOFB:ACQStatus-Sts + + + + + + 40 + 240 + 441 + 241 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL19:DI-FOFB:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + PyDMLabel + QLabel +
pydm.widgets.label
+
+ + PyDMWaveformPlot + QGraphicsView +
pydm.widgets.waveformplot
+
+ + PyDMEnumComboBox + QComboBox +
pydm.widgets.enum_combo_box
+
+ + PyDMLineEdit + QLineEdit +
pydm.widgets.line_edit
+
+
+ + +
From c94914ec28650f5950b4351c2ea2359477302f93 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Fri, 24 Dec 2021 15:57:10 -0200 Subject: [PATCH 15/42] FOFBApp/src: boardMap structure removed from drvFOFB --- FOFBApp/src/drvFOFB.cpp | 365 ++++++++++++++++++---------------------- FOFBApp/src/drvFOFB.h | 74 ++++---- 2 files changed, 195 insertions(+), 244 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index fad8327..19e36a4 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 @@ -25,8 +25,8 @@ #include /** The polling interval when checking to see if acquisition is complete */ -#define FOFB_POLL_TIME .1 -#define FOFB_PM_POLL_TIME 1 +#define FOFB_POLL_TIME .1 +#define FOFB_PM_POLL_TIME 1 #define PI 3.14159265 #define FREQ_SAMPLE 100.00 /* Hz */ @@ -67,35 +67,6 @@ typedef struct { bool autoStart; } taskParams_t; -static const boardMap_t boardMap[MAX_FOFBS+1] = { - /* board, fofb, core_id*/ - /* 0 (INVALID) */ {-1, -1, -1}, - /* 1 */ {1, 0, 2}, - /* 2 */ {1, 1, 3}, - /* 3 */ {2, 0, 2}, - /* 4 */ {2, 1, 3}, - /* 5 */ {3, 0, 2}, - /* 6 */ {3, 1, 3}, - /* 7 */ {4, 0, 2}, - /* 8 */ {4, 1, 3}, - /* 9 */ {5, 0, 2}, - /* 10 */ {5, 1, 3}, - /* 11 */ {6, 0, 2}, - /* 12 */ {6, 1, 3}, - /* 13 */ {7, 0, 2}, - /* 14 */ {7, 1, 3}, - /* 15 */ {8, 0, 2}, - /* 16 */ {8, 1, 3}, - /* 17 */ {9, 0, 2}, - /* 18 */ {9, 1, 3}, - /* 19 */ {10, 0, 2}, - /* 20 */ {10, 1, 3}, - /* 21 */ {11, 0, 2}, - /* 22 */ {11, 1, 3}, - /* 23 */ {12, 0, 2}, - /* 24 */ {12, 1, 3} -}; - static const channelMap_t channelMap[CH_END] = { /* [CH_ADC] = */ {CH_HW_ADC, // HwDataChannel {{WVF_DATA_CH0, // NDArrayData @@ -368,7 +339,7 @@ asynStatus drvFOFB::getServiceID (int fofbNumber, int addr, const char *serviceN /* 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 */ + * INIT service is always 0 per HALCS instance */ if (streq(serviceName, "TRIGGER_IFACE") || streq(serviceName, "INIT")) { *serviceIDArg = 0; return status; @@ -385,11 +356,11 @@ asynStatus drvFOFB::getServiceID (int fofbNumber, int addr, const char *serviceN switch (addrMod) { case FOFBIDReg: - serviceID = boardMap[fofbNumber].fofb; + serviceID = 0; break; case FOFBIDPM: - serviceID = boardMap[fofbNumber].core_id; + serviceID = 1; break; default: @@ -411,6 +382,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); @@ -422,7 +397,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", @@ -436,11 +411,11 @@ 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, const char *type, int verbose, int timeout, int maxPoints, int maxBuffers, size_t maxMemory) @@ -482,45 +457,40 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, this->verbose = verbose; this->timeout = timeout; - for (int i = 0; i < NUM_FOFB_MODES; ++i) { - for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { - this->readingActive[i][j] = 0; - this->repetitiveTrigger[i][j] = 0; - } + for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { + this->readingActive[j] = 0; + this->repetitiveTrigger[j] = 0; } - for (int i = 0; i < NUM_FOFB_MODES; ++i) { - - for (int j = 0; j < NUM_ACQ_CORES_PER_FOFB; ++j) { - /* Create events for signalling acquisition thread */ - this->startAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); - if (!this->startAcqEventId[i][j]) { - asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s epicsEventCreate[%d] failure for start event\n", - driverName, functionName, i); - return; - } + 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[i][j] = epicsEventCreate(epicsEventEmpty); - if (!this->stopAcqEventId[i][j]) { - printf("%s:%s: epicsEventCreate[%d] failure for stop event\n", - driverName, functionName, i); - return; - } + this->stopAcqEventId[j] = epicsEventCreate(epicsEventEmpty); + if (!this->stopAcqEventId[j]) { + printf("%s:%s: epicsEventCreate failure for stop event\n", + driverName, functionName); + return; + } - this->abortAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); - if (!this->abortAcqEventId[i][j]) { - printf("%s:%s: epicsEventCreate[%d] failure for abort event\n", - driverName, functionName, i); - return; - } + this->abortAcqEventId[j] = epicsEventCreate(epicsEventEmpty); + if (!this->abortAcqEventId[j]) { + printf("%s:%s: epicsEventCreate failure for abort event\n", + driverName, functionName); + return; + } - this->activeAcqEventId[i][j] = epicsEventCreate(epicsEventEmpty); - if (!this->activeAcqEventId[i][j]) { - printf("%s:%s: epicsEventCreate[%d] failure for active event\n", - driverName, functionName, i); - return; - } + this->activeAcqEventId[j] = epicsEventCreate(epicsEventEmpty); + if (!this->activeAcqEventId[j]) { + printf("%s:%s: epicsEventCreate failure for active event\n", + driverName, functionName); + return; } } @@ -532,12 +502,12 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* 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 */ @@ -732,8 +702,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, 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 */ + * will ensure the reconnection to server if necessary, but we + * must succeed here or we must abort completely */ if (status != asynSuccess) { asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error calling fofbClientConnect, status=%d\n", @@ -803,7 +773,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, setUIntDigitalParam(P_FofbCtrlRcbRdEn, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbCtrlRcbRdStr, 0, 0xFFFFFFFF); setUIntDigitalParam(P_FofbCtrlRcbData, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_AdcRate, ADC_RATE_FACTOR, 0xFFFFFFFF); setUIntDigitalParam(P_TbtRate, TBT_RATE_FACTOR, 0xFFFFFFFF); setUIntDigitalParam(P_FofbRate, FOFB_RATE_FACTOR, 0xFFFFFFFF); @@ -860,8 +829,8 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* 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! */ + * 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); @@ -939,7 +908,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, /* 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*/ + * The other parameters are already set-up*/ taskParams[i].drvFOFBp = this; status = (asynStatus)(epicsThreadCreate("drvFOFBTask", epicsThreadPriorityMedium, @@ -966,13 +935,13 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, #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. - * * * */ + * 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); @@ -989,8 +958,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; @@ -1280,7 +1249,7 @@ fofb_status_types drvFOFB::getFOFBInitAcqStatus(int coreID) switch (trig) { case ACQ_CLIENT_TRIG_SKIP: /* If we are doing something and the trigger is set to SKIP, - * * * then we are acquiring */ + * then we are acquiring */ fofbStatus = FOFBStatusAcquire; break; @@ -1330,12 +1299,11 @@ static bool acqIsFOFBStatusErr(int fofbStatus) } /* - * * * FOFB acquisition functions - * * */ + * FOFB acquisition functions + */ -/** Acquisition task that runs as a separate thread. - * * * CAUTION. FIXME? Only one acquisition task is working at any given time: MultiMode or SinglePass - * * */ +/* Acquisition task that runs as a separate thread. + */ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) { int status = asynSuccess; @@ -1352,7 +1320,6 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) double delay; int hwDataChannel = 0; int acqCompleted = 0; - int FOFBMode = 0; int fofbStatus = 0; int newAcq = 1; bool autoStartFirst = autoStart; @@ -1368,9 +1335,9 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) 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 */ + * 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); @@ -1393,19 +1360,19 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) getIntegerParam(coreID, P_FOFBStatus, &fofbStatus); /* Check if we received a stop event */ - status = epicsEventWaitWithTimeout(this->stopAcqEventId[FOFBMode][coreID], pollTime); - if (status == epicsEventWaitOK || !repetitiveTrigger[FOFBMode][coreID] || acqIsFOFBStatusErr(fofbStatus)) { + status = epicsEventWaitWithTimeout(this->stopAcqEventId[coreID], pollTime); + if (status == epicsEventWaitOK || !repetitiveTrigger[coreID] || acqIsFOFBStatusErr(fofbStatus)) { /* We got a stop event, stop repetitive acquisition */ - readingActive[FOFBMode][coreID] = 0; + readingActive[coreID] = 0; /* Default to new acquisition. If we are waiting for a trigger - * * * we will change this */ + * 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) */ + * (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); @@ -1418,21 +1385,21 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) } /* 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 */ + * 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 */ + * 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[FOFBMode][coreID]); + epicsEventWait(startAcqEventId[coreID]); lock(); } - readingActive[FOFBMode][coreID] = 1; + readingActive[coreID] = 1; autoStartFirst = 0; } @@ -1473,7 +1440,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) } /* Our waveform will have "num_samples_pres + num_samples_post" - * * * samples in each dimension */ + * samples in each dimension */ dims[0] = numAtoms; dims[1] = (num_samples_pre + num_samples_post)*num_shots; @@ -1488,7 +1455,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) } /* dims[1] must not exceed fofbMaxPoints, as we use this to alloc - * * * points for the Waveform Plugins */ + * 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", @@ -1544,10 +1511,10 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) 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 ... - * * */ + * 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); } @@ -1574,7 +1541,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) /* Wait for acquisition to complete, but allow acquire stop events to be handled */ while (1) { unlock(); - status = epicsEventWaitWithTimeout(this->abortAcqEventId[FOFBMode][coreID], pollTime); + status = epicsEventWaitWithTimeout(this->abortAcqEventId[coreID], pollTime); lock(); if (status == epicsEventWaitOK) { /* We got a stop event, abort acquisition */ @@ -1607,7 +1574,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) } /* Only do callbacks and calculate position if we could acquire some - * * * data */ + * data */ if (acqCompleted == 1) { /* Do callbacks on the full waveform (all channels interleaved) */ doCallbacksGenericPointer(pArrayAllChannels, NDArrayData, @@ -1630,7 +1597,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) callParamCallbacks(coreID); /* If we are in repetitive mode then sleep for the acquire period minus elapsed time. */ - if (repetitiveTrigger[FOFBMode][coreID]) { + if (repetitiveTrigger[coreID]) { epicsTimeGetCurrent(&endTime); elapsedTime = epicsTimeDiffInSeconds(&endTime, &startTime); delay = updateTime - elapsedTime; @@ -1642,7 +1609,7 @@ void drvFOFB::acqTask(int coreID, double pollTime, bool autoStart) setIntegerParam(coreID, P_FOFBStatus, FOFBStatusWaiting); callParamCallbacks(coreID); unlock(); - epicsEventWaitWithTimeout(this->stopAcqEventId[FOFBMode][coreID], delay); + epicsEventWaitWithTimeout(this->stopAcqEventId[coreID], delay); lock(); } } @@ -1727,7 +1694,7 @@ asynStatus drvFOFB::deinterleaveNDArray (NDArray *pArrayAllChannels, const int * pOutFloat64 = (epicsFloat64 *)pArraySingleChannel->pData; /* Get only a single channel samples from a multi-channel - * * * array */ + * array */ switch (NDType) { case NDInt8: for (size_t j = 0; j < dims[0]; ++j) { @@ -1822,8 +1789,8 @@ asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int addr) 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[FOFBMode][addr]) { + * 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); @@ -1831,10 +1798,10 @@ asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int addr) } if (triggerRep) { - repetitiveTrigger[FOFBMode][addr] = 1; + repetitiveTrigger[addr] = 1; } else { - repetitiveTrigger[FOFBMode][addr] = 0; + repetitiveTrigger[addr] = 0; } status = setAcqTrig(addr, (acq_client_trig_e) triggerType); @@ -1846,27 +1813,27 @@ asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int addr) } /* Send event telling the current task to proceed */ - epicsEventSignal(activeAcqEventId[FOFBMode][addr]); + 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[FOFBMode][addr]); + 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 */ + * 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, FOFBMode); + 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 */ + * 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, FOFBMode, true); + abortAcqTask(addr, true); break; default: @@ -1884,26 +1851,26 @@ asynStatus drvFOFB::setAcqEvent(epicsUInt32 mask, int addr) return status; } -asynStatus drvFOFB::abortAcqTask(int addr, int fofbMode, bool abortAcqHw) +asynStatus drvFOFB::abortAcqTask(int addr, bool abortAcqHw) { asynStatus status = asynSuccess; const char* functionName = "abortAcqTask"; /* we are waiting for a trigger */ - if (readingActive[fofbMode][addr]) { + if (readingActive[addr]) { asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: trigger ACQ_ABORT called for acqTask = %d, coreID = %d\n", - driverName, functionName, fofbMode, addr); - epicsEventSignal(this->abortAcqEventId[fofbMode][addr]); + "%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 = %d, coreID = %d\n", - driverName, functionName, fofbMode, addr); + "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 */ + * abort the acquisition anyway, as we might have something + * going on inside the FPGA from a previous acquisition */ if (abortAcqHw) { abortAcqFromPortThread(addr); } @@ -1912,19 +1879,19 @@ asynStatus drvFOFB::abortAcqTask(int addr, int fofbMode, bool abortAcqHw) return status; } -asynStatus drvFOFB::stopAcqTask(int addr, int fofbMode) +asynStatus drvFOFB::stopAcqTask(int addr) { asynStatus status = asynSuccess; const char* functionName = "stopAcqTask"; /* We are in repetitive mode */ - if (readingActive[fofbMode][addr]) { - repetitiveTrigger[fofbMode][addr] = 0; + if (readingActive[addr]) { + repetitiveTrigger[addr] = 0; /* Send the stop event */ asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: trigger ACQ_STOP called for acqTask = %d, coreID = %d\n", - driverName, functionName, fofbMode, addr); - epicsEventSignal(this->stopAcqEventId[fofbMode][addr]); + "%s:%s: trigger ACQ_STOP called for acqTask, coreID = %d\n", + driverName, functionName, addr); + epicsEventSignal(this->stopAcqEventId[addr]); } return status; @@ -2188,13 +2155,13 @@ asynStatus drvFOFB::getChannelProperties(int coreID, int channel, channelProp_t /********************************************************************/ /* - * * * * * Asyn overrided methods that are called by higher layers - * * * * */ + * 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. */ +/* 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) { @@ -2256,10 +2223,10 @@ asynStatus drvFOFB::writeUInt32Digital(asynUser *pasynUser, epicsUInt32 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. */ +/* 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) { @@ -2309,11 +2276,11 @@ asynStatus drvFOFB::readUInt32Digital(asynUser *pasynUser, epicsUInt32 *value, 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. */ +/*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; @@ -2372,11 +2339,11 @@ asynStatus drvFOFB::writeInt32(asynUser *pasynUser, epicsInt32 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 */ +/* 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; @@ -2417,9 +2384,9 @@ asynStatus drvFOFB::readInt32(asynUser *pasynUser, epicsInt32 *value) 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 */ +/* 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; @@ -2466,9 +2433,9 @@ asynStatus drvFOFB::writeFloat64(asynUser *pasynUser, epicsFloat64 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 */ +/* 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; @@ -2688,7 +2655,7 @@ asynStatus drvFOFB::doExecuteHwWriteFunction(functions2UInt32_t &func, char *ser } /* Read the HW values first as we need to update - * * only one of the parameters */ + only one of the parameters */ err = func.read(fofbClient, service, ¶m1, ¶m2); if (err != HALCS_CLIENT_SUCCESS) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, @@ -2910,7 +2877,7 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functions2UInt32_t &func, char *serv epicsUInt32 param2 = 0; /* Read the HW values first as we need to update - * * only one of the parameters */ + only one of the parameters */ err = func.read(fofbClient, service, ¶m1, ¶m2); if (err != HALCS_CLIENT_SUCCESS) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, @@ -2958,10 +2925,10 @@ asynStatus drvFOFB::doExecuteHwReadFunction(functionsFloat64_t &func, char *serv /********************************************************************/ /* - * * * * * 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) { @@ -3119,7 +3086,7 @@ asynStatus drvFOFB::getParamInteger(int functionId, epicsInt32 *param, *param = functionArgs.argInt32; } /* We recover from asynDisabled just by retrieving - * * * the parameter from the list */ + * the parameter from the list */ else if (status == asynDisabled){ status = asynSuccess; } @@ -3172,7 +3139,7 @@ asynStatus drvFOFB::getParamDouble(int functionId, epicsFloat64 *param, int addr *param = functionArgs.argFloat64; } /* We recover from asynDisabled just by retrieving - * * * the parameter from the list */ + * the parameter from the list */ else if (status == asynDisabled){ status = asynSuccess; } @@ -3186,9 +3153,9 @@ asynStatus drvFOFB::getParamDouble(int functionId, epicsFloat64 *param, int addr /********************************************************************/ /* - * * * * * 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) { @@ -3414,9 +3381,9 @@ asynStatus drvFOFB::readTriggerParams(epicsUInt32 mask, int addr) /* 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, const char *type, int verbose, int timeout, int maxPoints, int maxBuffers, size_t maxMemory) diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index 5966e14..aca8277 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -1,15 +1,16 @@ /* - * * * * * * 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 @@ -35,14 +36,6 @@ typedef enum { #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 modes */ -typedef enum { - FOFBMode = 0, - FOFBModeEnd, -} fofb_mode_types; - -#define NUM_FOFB_MODES FOFBModeEnd - /* FOFB acquisition status */ typedef enum { FOFBStatusIdle = 0, @@ -70,19 +63,19 @@ typedef enum { } 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 */ + * 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 */ + * 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 */ + * 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) @@ -117,26 +110,19 @@ typedef enum { WVF_DATA_END } wvf_data_types; -#define MAX_WVF_DATA_SINGLE (WVF_D+1) +#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 +#define MAX_FOFB_PER_SLOT 2 #define MAX_FOFBS (MAX_SLOTS*MAX_FOFB_PER_SLOT) #define FOFB_NUMBER_MIN 1 #define FOFB_NUMBER_MAX MAX_FOFBS -/* FOFB Mappping structure */ -typedef struct { - int board; - int fofb; - int core_id; /* Acquisition and Trigger core IDs */ -} boardMap_t; - /* FOFB Channel structure */ typedef struct { /* HW channel mapping. -1 means not available */ @@ -639,13 +625,13 @@ class drvFOFB : public asynNDArrayDriver { int verbose; int timeout; char *fofbPortName; - int readingActive[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - int repetitiveTrigger[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - epicsEventId startAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - epicsEventId stopAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; - epicsEventId abortAcqEventId[NUM_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + 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_FOFB_MODES][NUM_ACQ_CORES_PER_FOFB]; + epicsEventId activeAcqEventId[NUM_ACQ_CORES_PER_FOFB]; epicsEventId activeMonitEnableEventId; std::unordered_map fofbHwFunc; @@ -667,8 +653,8 @@ class drvFOFB : public asynNDArrayDriver { asynStatus abortAcqRaw(int coreID, acq_client_t *acq_client); asynStatus abortAcq(int coreID); asynStatus abortAcqFromPortThread(int coreID); - asynStatus abortAcqTask(int addr, int fofbMode, bool abortAcqHw = false); - asynStatus stopAcqTask(int addr, int fofbMode); + 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, @@ -687,7 +673,7 @@ class drvFOFB : public asynNDArrayDriver { 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, @@ -740,5 +726,3 @@ const char *functionsAny_t::getServiceNameFromFunc(const drvFOFB& drvFOFB, return drvFOFB.doGetServiceNameFromFunc(functionFpCast); } - - From 46e97b9138e38121fdc40f71bdf7e83fef30a1b5 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Fri, 24 Dec 2021 17:20:23 -0200 Subject: [PATCH 16/42] FOFBApp and iocBoot: update waveform functions --- FOFBApp/Db/FOFBAcq.template | 29 --------- FOFBApp/Db/FOFBAcq_settings.req | 6 +- FOFBApp/Db/FOFBData.template | 29 +++++++++ FOFBApp/Db/FOFBInfo.template | 87 +++++++++++++++++++++++++ FOFBApp/Db/FOFBInfo_settings.req | 4 ++ iocBoot/iocFOFB/auto_settings.req | 47 ------------- iocBoot/iocFOFB/initCommonCommands | 28 +++----- iocBoot/iocFOFB/initFOFBCommands | 2 + iocBoot/iocFOFB/save_restore.cmd | 1 + iocBoot/iocFOFB/statsPlugins.cmd | 16 ++--- iocBoot/iocFOFB/waveformFilePlugins.cmd | 13 ---- iocBoot/iocFOFB/waveformPlugins.cmd | 9 +-- scripts/pydm_test/acq_fofb.ui | 2 +- 13 files changed, 150 insertions(+), 123 deletions(-) create mode 100644 FOFBApp/Db/FOFBData.template create mode 100644 FOFBApp/Db/FOFBInfo.template create mode 100644 FOFBApp/Db/FOFBInfo_settings.req diff --git a/FOFBApp/Db/FOFBAcq.template b/FOFBApp/Db/FOFBAcq.template index 1a3577b..1971230 100644 --- a/FOFBApp/Db/FOFBAcq.template +++ b/FOFBApp/Db/FOFBAcq.template @@ -373,32 +373,3 @@ record(ai, "$(P)$(R)$(ACQ_NAME)UpdateTime-RB"){ field(INP,"@asyn($(PORT),$(ADDR),$(TIMEOUT))ACQ_UPDATE_TIME") field(EGU, "s") } - -record(waveform,"$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataWvf") -{ - field(DESC, "Data waveform $(ACQ)$(ARRAY_NAME)") - field(NELM,"$(NELEMENTS)") - field(FTVL, "$(FTVL)") - field(TSEL, "$(P)$(R)$(ACQ)ArrayData.TIME") - field(FLNK, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayData") -} - -record(subArray,"$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayData") -{ - field(DESC, "Data $(ACQ)$(ARRAY_NAME)") - field(INP, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataWvf NPP NMS") - field(TSEL, "$(P)$(R)$(ACQ)ArrayData.TIME") - field(MALM, "$(NELEMENTS)") - field(FTVL, "$(FTVL)") - field(FLNK, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataSeq") -} - -# Adjust NELM of subarray so clients get correct monitors when -# number os elements change -record(seq, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataSeq"){ -field(DESC,"Get NORD from $(ACQ)$ waveform") -field(PINI,"YES") -field(DOL1, "$(P)$(R)$(ACQ)ArrayData.NORD NPP NMS") -field(LNK1, "$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayData.NELM PP NMS") -field(SELM, "All") -} diff --git a/FOFBApp/Db/FOFBAcq_settings.req b/FOFBApp/Db/FOFBAcq_settings.req index 17c4f34..16b2bf6 100644 --- a/FOFBApp/Db/FOFBAcq_settings.req +++ b/FOFBApp/Db/FOFBAcq_settings.req @@ -11,6 +11,6 @@ $(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)$(ARRAY_NAME)ArrayDataWvf -$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayData -$(P)$(R)$(ACQ)$(ARRAY_NAME)ArrayDataSeq +$(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..40d5781 --- /dev/null +++ b/FOFBApp/Db/FOFBData.template @@ -0,0 +1,29 @@ +record(waveform,"$(P)$(R)$(ACQ_NAME)ArrayDataWvf") +{ + field(DESC, "Data waveform $(ACQ_NAME)") + field(NELM,"100000") + field(FTVL, "LONG") + field(TSEL, "$(P)$(R)$(ACQ_NAME)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)$(ACQ_NAME)ArrayData.TIME") + field(MALM, "100000") + 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)$(ACQ_NAME)ArrayData.NORD NPP NMS") +field(LNK1, "$(P)$(R)$(ACQ_NAME)ArrayData.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/iocBoot/iocFOFB/auto_settings.req b/iocBoot/iocFOFB/auto_settings.req index 7242c6f..fcc0c63 100644 --- a/iocBoot/iocFOFB/auto_settings.req +++ b/iocBoot/iocFOFB/auto_settings.req @@ -5,50 +5,3 @@ file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_CH0 file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_CH0 file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_CH0 -file "NDFile_settings.req", P=$(P), R=$(R)GEN_ABCD_NETCDF -file "NDFile_settings.req", P=$(P), R=$(R)GEN_ABCD_HDF5 -file "NDFile_settings.req", P=$(P), R=$(R)GEN_XYQS_NETCDF -file "NDFile_settings.req", P=$(P), R=$(R)GEN_XYQS_HDF5 - -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_A -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_B -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_C -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_D -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_UncalX -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_UncalY -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_UncalQ -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)GEN_UncalSUM -file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_A -file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_B -file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_C -file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_D -file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_UncalX -file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_UncalY -file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_UncalQ -file "NDStdArrays_settings.req", P=$(P), R=$(R)GEN_UncalSUM - -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_A -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_B -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_C -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_D -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_UncalX -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_UncalY -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_UncalQ -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)PM_UncalSUM -file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_A -file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_B -file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_C -file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_D -file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_UncalX -file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_UncalY -file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_UncalQ -file "NDStdArrays_settings.req", P=$(P), R=$(R)PM_UncalSUM - -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)SP_A -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)SP_B -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)SP_C -file "NDPluginBase_settings_mod.req", P=$(P), R=$(R)SP_D -file "NDStdArrays_settings.req", P=$(P), R=$(R)SP_A -file "NDStdArrays_settings.req", P=$(P), R=$(R)SP_B -file "NDStdArrays_settings.req", P=$(P), R=$(R)SP_C -file "NDStdArrays_settings.req", P=$(P), R=$(R)SP_D diff --git a/iocBoot/iocFOFB/initCommonCommands b/iocBoot/iocFOFB/initCommonCommands index fdd3902..0348680 100644 --- a/iocBoot/iocFOFB/initCommonCommands +++ b/iocBoot/iocFOFB/initCommonCommands @@ -3,28 +3,20 @@ dbpf "${P}${R}GEN_CH0EnableCallbacks" 1 dbpf "${P}${R}GEN_CH0ArrayData.TSE" -2 -dbpf "${P}${R}PM_CH0EnableCallbacks" 1 -dbpf "${P}${R}PM_CH0ArrayData.TSE" -2 +#dbpf "${P}${R}PM_CH0EnableCallbacks" 1 +#dbpf "${P}${R}PM_CH0ArrayData.TSE" -2 -dbpf "${P}${R}MONIT_CH0EnableCallbacks" 1 -dbpf "${P}${R}MONIT_CH0ArrayData.TSE" -2 - -# File Saving Plugin - -dbpf "${P}${R}GEN_ABCD_NETCDFEnableCallbacks" 1 -dbpf "${P}${R}GEN_ABCD_HDF5EnableCallbacks" 1 - -dbpf "${P}${R}GEN_XYQS_NETCDFEnableCallbacks" 1 -dbpf "${P}${R}GEN_XYQS_HDF5EnableCallbacks" 1 +#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_STATSEnableCallbacks" 1 -dbpf "${P}${R}GEN_CH0_STATSComputeHistogram" No -dbpf "${P}${R}GEN_CH0_STATSComputeStatistics" Yes +#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_STATSEnableCallbacks" 1 -dbpf "${P}${R}PM_CH0_STATSComputeHistogram" No -dbpf "${P}${R}PM_CH0_STATSComputeStatistics" Yes +#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 8707171..be223c8 100644 --- a/iocBoot/iocFOFB/initFOFBCommands +++ b/iocBoot/iocFOFB/initFOFBCommands @@ -1,3 +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 07cd4ea..687f3c7 100644 --- a/iocBoot/iocFOFB/save_restore.cmd +++ b/iocBoot/iocFOFB/save_restore.cmd @@ -38,5 +38,6 @@ 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/statsPlugins.cmd b/iocBoot/iocFOFB/statsPlugins.cmd index ee9450d..8d3c8bf 100644 --- a/iocBoot/iocFOFB/statsPlugins.cmd +++ b/iocBoot/iocFOFB/statsPlugins.cmd @@ -2,14 +2,14 @@ ##################### 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") +#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") +#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/waveformFilePlugins.cmd b/iocBoot/iocFOFB/waveformFilePlugins.cmd index 799fa5c..139597f 100644 --- a/iocBoot/iocFOFB/waveformFilePlugins.cmd +++ b/iocBoot/iocFOFB/waveformFilePlugins.cmd @@ -1,15 +1,2 @@ -##################### GEN Data File Saving ########################## -NDFileNetCDFConfigure("GEN_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 4) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}GEN_ABCD_NETCDF,PORT=GEN_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4") -NDFileHDF5Configure("GEN_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 4) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}GEN_ABCD_HDF5,PORT=GEN_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=4") - -##################### PM Data File Saving ########################## - -NDFileNetCDFConfigure("PM_ABCD_FileNetCDF", $(QSIZE), 0, "$(PORT)", 10) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileNetCDF.template","P=${P},R=${R}PM_ABCD_NETCDF,PORT=PM_ABCD_FileNetCDF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10") - -NDFileHDF5Configure("PM_ABCD_FileHDF5", $(QSIZE), 0, "$(PORT)", 10) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDFileHDF5.template", "P=${P},R=${R}PM_ABCD_HDF5,PORT=PM_ABCD_FileHDF5,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=10") diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd index 8c76659..e62cb7b 100644 --- a/iocBoot/iocFOFB/waveformPlugins.cmd +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -1,8 +1,9 @@ -##################### FOFB configuration ########################## - -dbLoadRecords("${TOP}/db/FOFB.template", "P=${P}, R=${R}, GLOBAL_ARRAY_NAME_X=X, GLOBAL_ARRAY_NAME_Y=Y, GLOBAL_ARRAY_NAME_XY=XY, GLOBAL_ARRAY_NAME_Q=Q, GLOBAL_ARRAY_NAME_SUM=SUM, PORT=$(PORT), ADDR=0, TIMEOUT=1") - ##################### 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)") + +##################### FOFB configuration ########################## + +dbLoadRecords("${TOP}/db/FOFB.template", "P=${P}, R=${R}, PORT=$(PORT), ADDR=0, TIMEOUT=1") + diff --git a/scripts/pydm_test/acq_fofb.ui b/scripts/pydm_test/acq_fofb.ui index b00b0fb..8182cc8 100644 --- a/scripts/pydm_test/acq_fofb.ui +++ b/scripts/pydm_test/acq_fofb.ui @@ -298,7 +298,7 @@ - {"y_channel": "XX-22SL19:DI-FOFB:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "XX-22SL23:DI-FOFB:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} From 500c7edda8e9bb8a98daad18a0f43fdb1d8389b0 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Mon, 3 Jan 2022 10:33:17 -0200 Subject: [PATCH 17/42] FOFBApp: update waveform IDs --- FOFBApp/src/drvFOFB.cpp | 50 +++++++++++++++++++++++++++++++++++------ FOFBApp/src/drvFOFB.h | 21 +++++++++++++++++ 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 19e36a4..0306b51 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -70,32 +70,68 @@ typedef struct { 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_ALL}, {WVF_PM_CH0, + WVF_PM_CH1, + WVF_PM_CH2, + WVF_PM_CH3, + WVF_PM_CH4, + WVF_PM_CH5, + WVF_PM_CH6, + WVF_PM_CH7, WVF_PM_ALL}, }, }, /* [CH_TBT] = */ {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_ALL}, {WVF_PM_CH0, + WVF_PM_CH1, + WVF_PM_CH2, + WVF_PM_CH3, + WVF_PM_CH4, + WVF_PM_CH5, + WVF_PM_CH6, + WVF_PM_CH7, WVF_PM_ALL}, }, }, /* [CH_FOFB] = */ {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_ALL}, {WVF_PM_CH0, + WVF_PM_CH1, + WVF_PM_CH2, + WVF_PM_CH3, + WVF_PM_CH4, + WVF_PM_CH5, + WVF_PM_CH6, + WVF_PM_CH7, WVF_PM_ALL}, }, }, - /* [CH_MONIT1] = */ {CH_HW_ADC, // HwDataChannel - {{WVF_DATA_CH0, // NDArrayData - WVF_DATA_ALL}, - {WVF_PM_CH0, - WVF_PM_ALL}, - }, - }, + /* [CH_MONIT1] = */ }; /* FIXME: This reverse mapping must match the maximum hwDataChannel for ChannelMap */ diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index aca8277..549566c 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -55,8 +55,22 @@ typedef enum { /* 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_ALL, WVF_PM_CH0, + WVF_PM_CH1, + WVF_PM_CH2, + WVF_PM_CH3, + WVF_PM_CH4, + WVF_PM_CH5, + WVF_PM_CH6, + WVF_PM_CH7, WVF_PM_ALL, WVF_MONIT_CH0, WVF_END @@ -106,6 +120,13 @@ typedef enum { /* Waveform DATA types IDs */ typedef enum { WVF_CH0 = 0, + WVF_CH1, + WVF_CH2, + WVF_CH3, + WVF_CH4, + WVF_CH5, + WVF_CH6, + WVF_CH7, WVF_ALL, WVF_DATA_END } wvf_data_types; From 3c04005f3eb29f18bc31aa2aaf2554a679b3b5ec Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Mon, 3 Jan 2022 14:56:36 -0300 Subject: [PATCH 18/42] FOFBApp and iocBoot: update waveform functions and pydm test file --- FOFBApp/src/drvFOFB.cpp | 186 +++++++++++++----- FOFBApp/src/drvFOFB.h | 3 +- iocBoot/iocFOFB/auto_settings.req | 30 ++- iocBoot/iocFOFB/initCommonCommands | 46 ++++- iocBoot/iocFOFB/waveformPlugins.cmd | 47 +++++ .../{acq_fofb.ui => acq_fofb_test_board10.ui} | 32 +-- 6 files changed, 274 insertions(+), 70 deletions(-) rename scripts/pydm_test/{acq_fofb.ui => acq_fofb_test_board10.ui} (88%) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 0306b51..abd5c90 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -89,49 +89,69 @@ static const channelMap_t channelMap[CH_END] = { WVF_PM_ALL}, }, }, - /* [CH_TBT] = */ {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_ALL}, - {WVF_PM_CH0, - WVF_PM_CH1, - WVF_PM_CH2, - WVF_PM_CH3, - WVF_PM_CH4, - WVF_PM_CH5, - WVF_PM_CH6, - WVF_PM_CH7, - WVF_PM_ALL}, + /* [CH_TBT] = */ {CH_HW_TBT, + {{-1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1}, + {-1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1}, }, }, - /* [CH_FOFB] = */ {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_ALL}, - {WVF_PM_CH0, - WVF_PM_CH1, - WVF_PM_CH2, - WVF_PM_CH3, - WVF_PM_CH4, - WVF_PM_CH5, - WVF_PM_CH6, - WVF_PM_CH7, - WVF_PM_ALL}, + /* [CH_FOFB] = */ {CH_HW_FOFB, // HwDataChannel + {{-1, + -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, + -1}, }, }, - /* [CH_MONIT1] = */ }; /* FIXME: This reverse mapping must match the maximum hwDataChannel for ChannelMap */ @@ -419,7 +439,7 @@ asynStatus drvFOFB::getFullServiceName (int fofbNumber, int addr, const char *se 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 */ + /* 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; @@ -653,7 +673,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, createParam(P_TriggerTrnOutSelString, asynParamUInt32Digital, &P_TriggerTrnOutSel); /* FOFB HW Int32 Functions mapping. Functions not mapped here are just written - * * * * * to the parameter library */ + * to the parameter library */ fofbHwFunc.emplace(P_FofbProcessingRamWrite, fofbProcessingSetGetRamWriteFunc); fofbHwFunc.emplace(P_FofbProcessingRamAddr, fofbProcessingSetGetRamAddrFunc); fofbHwFunc.emplace(P_FofbProcessingRamDataIn, fofbProcessingSetGetRamDataInFunc); @@ -737,9 +757,7 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, 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", @@ -1247,7 +1265,7 @@ asynStatus drvFOFB::setAcqTrig(int coreID, acq_client_trig_e trig) } /* This can only return if the ACQ engine is IDLE or waiting - * * * for some trigger (External, Data or Software) */ + * 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) { @@ -1666,8 +1684,81 @@ void drvFOFB::acqMonitTask() 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) { @@ -3019,7 +3110,6 @@ asynStatus drvFOFB::setParamGeneric(int functionId, int addr) return (asynStatus)status; } - asynStatus drvFOFB::setParam32(int functionId, epicsUInt32 mask, int addr) { int status = asynSuccess; @@ -3463,5 +3553,3 @@ extern "C" { epicsExportRegistrar(drvFOFBRegister); } - - diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index 549566c..6f5d6da 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -138,7 +138,7 @@ typedef enum { #define MAX_WVF_DIMS 2 #define MAX_SLOTS 12 -#define MAX_FOFB_PER_SLOT 2 +#define MAX_FOFB_PER_SLOT 2 #define MAX_FOFBS (MAX_SLOTS*MAX_FOFB_PER_SLOT) #define FOFB_NUMBER_MIN 1 @@ -746,4 +746,3 @@ const char *functionsAny_t::getServiceNameFromFunc(const drvFOFB& drvFOFB, auto functionFpCast = any_cast(functionFp); return drvFOFB.doGetServiceNameFromFunc(functionFpCast); } - diff --git a/iocBoot/iocFOFB/auto_settings.req b/iocBoot/iocFOFB/auto_settings.req index fcc0c63..f06d93c 100644 --- a/iocBoot/iocFOFB/auto_settings.req +++ b/iocBoot/iocFOFB/auto_settings.req @@ -1,7 +1,35 @@ -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)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 diff --git a/iocBoot/iocFOFB/initCommonCommands b/iocBoot/iocFOFB/initCommonCommands index 0348680..0d7d618 100644 --- a/iocBoot/iocFOFB/initCommonCommands +++ b/iocBoot/iocFOFB/initCommonCommands @@ -3,8 +3,50 @@ dbpf "${P}${R}GEN_CH0EnableCallbacks" 1 dbpf "${P}${R}GEN_CH0ArrayData.TSE" -2 -#dbpf "${P}${R}PM_CH0EnableCallbacks" 1 -#dbpf "${P}${R}PM_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}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}MONIT_CH0EnableCallbacks" 1 #dbpf "${P}${R}MONIT_CH0ArrayData.TSE" -2 diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd index e62cb7b..aca275f 100644 --- a/iocBoot/iocFOFB/waveformPlugins.cmd +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -3,6 +3,53 @@ 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=0,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=0,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=0,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=0,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=0,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=0,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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +##################### GEN PM Waveforms ########################### + +NDStdArraysConfigure("PM_CH0_Array", $(QSIZE), 0, "$(PORT)", 9) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH0,PORT=PM_CH0_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH1_Array", $(QSIZE), 0, "$(PORT)", 10) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH1,PORT=PM_CH1_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH2_Array", $(QSIZE), 0, "$(PORT)", 11) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH2,PORT=PM_CH2_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH3_Array", $(QSIZE), 0, "$(PORT)", 12) +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH4_Array", $(QSIZE), 0, "$(PORT)", 13) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH4,PORT=PM_CH4_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH5_Array", $(QSIZE), 0, "$(PORT)", 14) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH5,PORT=PM_CH5_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH6_Array", $(QSIZE), 0, "$(PORT)", 15) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH6,PORT=PM_CH6_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH7_Array", $(QSIZE), 0, "$(PORT)", 16) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH7,PORT=PM_CH7_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + ##################### FOFB configuration ########################## dbLoadRecords("${TOP}/db/FOFB.template", "P=${P}, R=${R}, PORT=$(PORT), ADDR=0, TIMEOUT=1") diff --git a/scripts/pydm_test/acq_fofb.ui b/scripts/pydm_test/acq_fofb_test_board10.ui similarity index 88% rename from scripts/pydm_test/acq_fofb.ui rename to scripts/pydm_test/acq_fofb_test_board10.ui index 8182cc8..8b83ee3 100644 --- a/scripts/pydm_test/acq_fofb.ui +++ b/scripts/pydm_test/acq_fofb_test_board10.ui @@ -90,7 +90,7 @@ - XX-22SL23:DI-FOFB:ACQTriggerEvent-Sel + XX-22SL19:DI-FOFB:ACQTriggerEvent-Sel @@ -100,7 +100,7 @@ - XX-22SL23:DI-FOFB:ACQTriggerRep-Sel + XX-22SL19:DI-FOFB:ACQTriggerRep-Sel @@ -110,7 +110,7 @@ - XX-22SL23:DI-FOFB:ACQTrigger-Sel + XX-22SL19:DI-FOFB:ACQTrigger-Sel @@ -120,7 +120,7 @@ - XX-22SL23:DI-FOFB:ACQSamplesPre-SP + XX-22SL19:DI-FOFB:ACQSamplesPre-SP @@ -130,7 +130,7 @@ - XX-22SL23:DI-FOFB:ACQSamplesPost-SP + XX-22SL19:DI-FOFB:ACQSamplesPost-SP @@ -140,7 +140,7 @@ - XX-22SL23:DI-FOFB:ACQShots-SP + XX-22SL19:DI-FOFB:ACQShots-SP @@ -150,7 +150,7 @@ - XX-22SL23:DI-FOFB:ACQChannel-Sel + XX-22SL19:DI-FOFB:ACQChannel-Sel @@ -172,7 +172,7 @@ - XX-22SL23:DI-FOFB:ACQTriggerEvent-Sel + XX-22SL19:DI-FOFB:ACQTriggerEvent-Sel @@ -182,7 +182,7 @@ - XX-22SL23:DI-FOFB:ACQTriggerRep-Sel + XX-22SL19:DI-FOFB:ACQTriggerRep-Sel @@ -192,7 +192,7 @@ - XX-22SL23:DI-FOFB:ACQTrigger-Sel + XX-22SL19:DI-FOFB:ACQTrigger-Sel @@ -202,7 +202,7 @@ - XX-22SL23:DI-FOFB:ACQSamplesPre-SP + XX-22SL19:DI-FOFB:ACQSamplesPre-SP @@ -212,7 +212,7 @@ - XX-22SL23:DI-FOFB:ACQSamplesPost-SP + XX-22SL19:DI-FOFB:ACQSamplesPost-SP @@ -222,7 +222,7 @@ - XX-22SL23:DI-FOFB:ACQShots-SP + XX-22SL19:DI-FOFB:ACQShots-SP @@ -244,7 +244,7 @@ - XX-22SL23:DI-FOFB:ACQChannel-Sel + XX-22SL19:DI-FOFB:ACQChannel-Sel @@ -276,7 +276,7 @@ - XX-22SL23:DI-FOFB:ACQStatus-Sts + XX-22SL19:DI-FOFB:ACQStatus-Sts @@ -298,7 +298,7 @@ - {"y_channel": "XX-22SL23:DI-FOFB:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "XX-22SL19:DI-FOFB:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} From b5b3250dd74c8cb7beda299a69fea9bdf65fda62 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 4 Jan 2022 11:35:38 -0300 Subject: [PATCH 19/42] FOFBApp and iocBoot: update waveform parameters for rtm-lamp test --- FOFBApp/src/drvFOFB.cpp | 80 ++++++++++++++++++++++++++--- FOFBApp/src/drvFOFB.h | 24 +++++++++ iocBoot/iocFOFB/auto_settings.req | 32 ++++++++++++ iocBoot/iocFOFB/initCommonCommands | 48 +++++++++++++++++ iocBoot/iocFOFB/waveformPlugins.cmd | 64 ++++++++++++++++++++--- 5 files changed, 232 insertions(+), 16 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index abd5c90..58729c8 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -77,6 +77,14 @@ static const channelMap_t channelMap[CH_END] = { 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_PM_CH0, WVF_PM_CH1, @@ -86,10 +94,55 @@ static const channelMap_t channelMap[CH_END] = { WVF_PM_CH5, WVF_PM_CH6, WVF_PM_CH7, + WVF_PM_CH8, + WVF_PM_CH9, + WVF_PM_CH10, + WVF_PM_CH11, + WVF_PM_CH12, + WVF_PM_CH13, + WVF_PM_CH14, + WVF_PM_CH15, WVF_PM_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}, + {WVF_PM_CH0, + WVF_PM_CH1, + WVF_PM_CH2, + WVF_PM_CH3, + WVF_PM_CH4, + WVF_PM_CH5, + WVF_PM_CH6, + WVF_PM_CH7, + WVF_PM_CH8, + WVF_PM_CH9, + WVF_PM_CH10, + WVF_PM_CH11, + WVF_PM_CH12, + WVF_PM_CH13, + WVF_PM_CH14, + WVF_PM_CH15, + WVF_PM_ALL}, + }, + }, + /* [CH_FOFB] = */ {CH_HW_FOFB, // HwDataChannel {{-1, -1, -1, @@ -98,8 +151,7 @@ static const channelMap_t channelMap[CH_END] = { -1, -1, -1, - -1}, - {-1, + -1, -1, -1, -1, @@ -108,10 +160,8 @@ static const channelMap_t channelMap[CH_END] = { -1, -1, -1}, - }, - }, - /* [CH_FOFB] = */ {CH_HW_FOFB, // HwDataChannel - {{-1, + {-1, + -1, -1, -1, -1, @@ -119,8 +169,6 @@ static const channelMap_t channelMap[CH_END] = { -1, -1, -1, - -1}, - {-1, -1, -1, -1, @@ -133,6 +181,14 @@ static const channelMap_t channelMap[CH_END] = { }, /* [CH_MONIT1] = */ {CH_HW_MONIT1, // HwDataChannel {{-1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, -1, -1, -1, @@ -142,6 +198,14 @@ static const channelMap_t channelMap[CH_END] = { -1, -1}, {-1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, -1, -1, -1, diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index 6f5d6da..6c894ba 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -62,6 +62,14 @@ typedef enum { 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_PM_CH0, WVF_PM_CH1, @@ -71,6 +79,14 @@ typedef enum { WVF_PM_CH5, WVF_PM_CH6, WVF_PM_CH7, + WVF_PM_CH8, + WVF_PM_CH9, + WVF_PM_CH10, + WVF_PM_CH11, + WVF_PM_CH12, + WVF_PM_CH13, + WVF_PM_CH14, + WVF_PM_CH15, WVF_PM_ALL, WVF_MONIT_CH0, WVF_END @@ -127,6 +143,14 @@ typedef enum { 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; diff --git a/iocBoot/iocFOFB/auto_settings.req b/iocBoot/iocFOFB/auto_settings.req index f06d93c..bbd6188 100644 --- a/iocBoot/iocFOFB/auto_settings.req +++ b/iocBoot/iocFOFB/auto_settings.req @@ -16,6 +16,22 @@ 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 @@ -32,4 +48,20 @@ 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 index 0d7d618..3fa30b1 100644 --- a/iocBoot/iocFOFB/initCommonCommands +++ b/iocBoot/iocFOFB/initCommonCommands @@ -24,6 +24,30 @@ 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 @@ -48,6 +72,30 @@ 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 diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd index aca275f..cd28d7a 100644 --- a/iocBoot/iocFOFB/waveformPlugins.cmd +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -24,32 +24,80 @@ dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}G 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=0,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=0,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=0,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=0,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=0,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=0,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=0,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=0,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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + ##################### GEN PM Waveforms ########################### -NDStdArraysConfigure("PM_CH0_Array", $(QSIZE), 0, "$(PORT)", 9) +NDStdArraysConfigure("PM_CH0_Array", $(QSIZE), 0, "$(PORT)", 17) dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH0,PORT=PM_CH0_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -NDStdArraysConfigure("PM_CH1_Array", $(QSIZE), 0, "$(PORT)", 10) +NDStdArraysConfigure("PM_CH1_Array", $(QSIZE), 0, "$(PORT)", 18) dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH1,PORT=PM_CH1_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -NDStdArraysConfigure("PM_CH2_Array", $(QSIZE), 0, "$(PORT)", 11) +NDStdArraysConfigure("PM_CH2_Array", $(QSIZE), 0, "$(PORT)", 19) dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH2,PORT=PM_CH2_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -NDStdArraysConfigure("PM_CH3_Array", $(QSIZE), 0, "$(PORT)", 12) +NDStdArraysConfigure("PM_CH3_Array", $(QSIZE), 0, "$(PORT)", 20) 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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -NDStdArraysConfigure("PM_CH4_Array", $(QSIZE), 0, "$(PORT)", 13) +NDStdArraysConfigure("PM_CH4_Array", $(QSIZE), 0, "$(PORT)", 21) dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH4,PORT=PM_CH4_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -NDStdArraysConfigure("PM_CH5_Array", $(QSIZE), 0, "$(PORT)", 14) +NDStdArraysConfigure("PM_CH5_Array", $(QSIZE), 0, "$(PORT)", 22) dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH5,PORT=PM_CH5_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -NDStdArraysConfigure("PM_CH6_Array", $(QSIZE), 0, "$(PORT)", 15) +NDStdArraysConfigure("PM_CH6_Array", $(QSIZE), 0, "$(PORT)", 23) dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH6,PORT=PM_CH6_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -NDStdArraysConfigure("PM_CH7_Array", $(QSIZE), 0, "$(PORT)", 16) +NDStdArraysConfigure("PM_CH7_Array", $(QSIZE), 0, "$(PORT)", 24) dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH7,PORT=PM_CH7_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +NDStdArraysConfigure("PM_CH8_Array", $(QSIZE), 0, "$(PORT)", 25) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH8,PORT=PM_CH8_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH9_Array", $(QSIZE), 0, "$(PORT)", 26) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH9,PORT=PM_CH9_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH10_Array", $(QSIZE), 0, "$(PORT)", 27) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH10,PORT=PM_CH10_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH11_Array", $(QSIZE), 0, "$(PORT)", 28) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH11,PORT=PM_CH11_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH12_Array", $(QSIZE), 0, "$(PORT)", 29) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH12,PORT=PM_CH12_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH13_Array", $(QSIZE), 0, "$(PORT)", 30) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH13,PORT=PM_CH13_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH14_Array", $(QSIZE), 0, "$(PORT)", 31) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH14,PORT=PM_CH14_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + +NDStdArraysConfigure("PM_CH15_Array", $(QSIZE), 0, "$(PORT)", 32) +dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH15,PORT=PM_CH15_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") + ##################### FOFB configuration ########################## dbLoadRecords("${TOP}/db/FOFB.template", "P=${P}, R=${R}, PORT=$(PORT), ADDR=0, TIMEOUT=1") From 49f95dc322b844a5bd280d5e71e8b2e6a9c7f91a Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 4 Jan 2022 16:06:09 -0300 Subject: [PATCH 20/42] scripts: update pydm test file --- scripts/pydm_test/acq_fofb_test_board10.ui | 330 -------- scripts/pydm_test/acq_rtm_test.ui | 941 +++++++++++++++++++++ 2 files changed, 941 insertions(+), 330 deletions(-) delete mode 100644 scripts/pydm_test/acq_fofb_test_board10.ui create mode 100644 scripts/pydm_test/acq_rtm_test.ui diff --git a/scripts/pydm_test/acq_fofb_test_board10.ui b/scripts/pydm_test/acq_fofb_test_board10.ui deleted file mode 100644 index 8b83ee3..0000000 --- a/scripts/pydm_test/acq_fofb_test_board10.ui +++ /dev/null @@ -1,330 +0,0 @@ - - - Dialog - - - - 0 - 0 - 525 - 525 - - - - Dialog - - - - - 40 - 0 - 141 - 221 - - - - - - - ACQTriggerEvent: - - - - - - - ACQTriggerRep: - - - - - - - ACQTrigger: - - - - - - - ACQSamplesPre: - - - - - - - ACQSamplesPost: - - - - - - - ACQShots: - - - - - - - ACQChannel: - - - - - - - - - 200 - 0 - 121 - 221 - - - - - - - - - - XX-22SL19:DI-FOFB:ACQTriggerEvent-Sel - - - - - - - - - - XX-22SL19:DI-FOFB:ACQTriggerRep-Sel - - - - - - - - - - XX-22SL19:DI-FOFB:ACQTrigger-Sel - - - - - - - - - - XX-22SL19:DI-FOFB:ACQSamplesPre-SP - - - - - - - - - - XX-22SL19:DI-FOFB:ACQSamplesPost-SP - - - - - - - - - - XX-22SL19:DI-FOFB:ACQShots-SP - - - - - - - - - - XX-22SL19:DI-FOFB:ACQChannel-Sel - - - - - - - - - 330 - 0 - 151 - 223 - - - - - - - - - - XX-22SL19:DI-FOFB:ACQTriggerEvent-Sel - - - - - - - - - - XX-22SL19:DI-FOFB:ACQTriggerRep-Sel - - - - - - - - - - XX-22SL19:DI-FOFB:ACQTrigger-Sel - - - - - - - - - - XX-22SL19:DI-FOFB:ACQSamplesPre-SP - - - - - - - - - - XX-22SL19:DI-FOFB:ACQSamplesPost-SP - - - - - - - - - - XX-22SL19:DI-FOFB:ACQShots-SP - - - - - - - - 86 - 25 - - - - - 86 - 25 - - - - - - - XX-22SL19:DI-FOFB:ACQChannel-Sel - - - - - - - - - 170 - 490 - 81 - 22 - - - - ACQStatus: - - - - - - 270 - 490 - 91 - 22 - - - - - - - XX-22SL19:DI-FOFB:ACQStatus-Sts - - - - - - 40 - 240 - 441 - 241 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL19:DI-FOFB:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - - 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/acq_rtm_test.ui b/scripts/pydm_test/acq_rtm_test.ui new file mode 100644 index 0000000..6dc0e63 --- /dev/null +++ b/scripts/pydm_test/acq_rtm_test.ui @@ -0,0 +1,941 @@ + + + Dialog + + + + 0 + 0 + 1112 + 761 + + + + Dialog + + + + + 10 + 10 + 391 + 731 + + + + + + + + + + XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel + + + + + + + + + + XX-22SL03:DI-FOFB:ACQTrigger-Sel + + + + + + + + + + XX-22SL03:DI-FOFB:ACQChannel-Sel + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampStatus-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIEn-SP + + + + + + + RtmLampPIOLTriangEn: + + + + + + + RtmLampAmpTFlagR: + + + + + + + ACQShots: + + + + + + + RtmLampPISPSquareEn: + + + + + + + RtmLampPIOLDacCntMax: + + + + + + + RtmLampPISP: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP + + + + + + + RtmLampPITI: + + + + + + + + + + XX-22SL03:DI-FOFB:ACQTriggerRep-Sel + + + + + + + ACQTriggerEvent: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampDacWr-SP + + + + + + + RtmLampPIEn: + + + + + + + + + + XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel + + + + + + + + + + XX-22SL03:DI-FOFB:ACQShots-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP + + + + + + + + + + XX-22SL03:DI-FOFB:ACQTriggerRep-Sel + + + + + + + + + + XX-22SL03:DI-FOFB:ACQShots-SP + + + + + + + + + + XX-22SL03:DI-FOFB:ACQChannel-Sel + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIKP-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampDacData-SP + + + + + + + RtmLampAmpTFlagL: + + + + + + + ACQSamplesPost: + + + + + + + RtmLampDacData: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpEn-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP + + + + + + + ACQTrigger: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPISP-SP + + + + + + + + + + XX-22SL03:DI-FOFB:ACQSamplesPost-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpEn-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP + + + + + + + RtmLampPISPLimInf: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + + + + + + + RtmLampDacDataFromWb: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPITI-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + + + + + + + ACQSamplesPre: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPISP-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampStatus-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP + + + + + + + + + + XX-22SL03:DI-FOFB:ACQSamplesPre-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIEn-SP + + + + + + + RtmLampDacWr: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP + + + + + + + + + + XX-22SL03:DI-FOFB:ACQSamplesPre-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPITI-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampDacWr-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-22SL03:DI-FOFB:ACQSamplesPost-SP + + + + + + + ACQChannel: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP + + + + + + + + + + XX-22SL03:DI-FOFB:ACQTrigger-Sel + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampDacData-SP + + + + + + + RtmLampStatus: + + + + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIKP-SP + + + + + + + RtmLampAmpEn: + + + + + + + ACQTriggerRep: + + + + + + + + + 420 + 30 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 760 + 30 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH4ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 760 + 210 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 420 + 210 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 760 + 390 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 420 + 390 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 760 + 570 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 420 + 570 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + + 670 + 0 + 175 + 31 + + + + + + + ACQStatus: + + + + + + + + + + XX-22SL03:DI-FOFB:ACQStatus-Sts + + + + + + + + + PyDMLabel + QLabel +
pydm.widgets.label
+
+ + PyDMWaveformPlot + QGraphicsView +
pydm.widgets.waveformplot
+
+ + PyDMEnumComboBox + QComboBox +
pydm.widgets.enum_combo_box
+
+ + PyDMLineEdit + QLineEdit +
pydm.widgets.line_edit
+
+
+ + +
From c860acf9e64718e73c2dbffb477eabf30153c7c8 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 4 Jan 2022 16:30:14 -0300 Subject: [PATCH 21/42] scripts: update pydm test file --- scripts/pydm_test/acq_rtm_test.ui | 1120 +++++++++++++++++------------ 1 file changed, 665 insertions(+), 455 deletions(-) diff --git a/scripts/pydm_test/acq_rtm_test.ui b/scripts/pydm_test/acq_rtm_test.ui index 6dc0e63..f489eef 100644 --- a/scripts/pydm_test/acq_rtm_test.ui +++ b/scripts/pydm_test/acq_rtm_test.ui @@ -6,8 +6,8 @@ 0 0 - 1112 - 761 + 1125 + 789 @@ -19,251 +19,260 @@ 10 10 391 - 731 + 761 - - + + - XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel + XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP - - + + + + ACQTriggerEvent: + + + + + - XX-22SL03:DI-FOFB:ACQTrigger-Sel + XX-22SL03:DI-FOFB:RtmLampDacData-SP - - + + + + RtmLampPISPSquareEn: + + + + + - XX-22SL03:DI-FOFB:ACQChannel-Sel + XX-22SL03:DI-FOFB:ACQShots-SP - - + + - XX-22SL03:DI-FOFB:RtmLampStatus-SP + XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPIEn-SP + XX-22SL03:DI-FOFB:ACQTrigger-Sel - - - - RtmLampPIOLTriangEn: + + + + - - - - - - RtmLampAmpTFlagR: + + XX-22SL03:DI-FOFB:RtmLampStatus-SP - - + + - ACQShots: + RtmLampStatus: - - - - RtmLampPISPSquareEn: + + + + - - - - - - RtmLampPIOLDacCntMax: + + XX-22SL03:DI-FOFB:RtmLampPIKP-SP - - + + - RtmLampPISP: + RtmLampDacDataFromWb: - - + + - XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP + XX-22SL03:DI-FOFB:ACQChannel-Sel - - + + - RtmLampPITI: + RtmLampDacData: - - + + - XX-22SL03:DI-FOFB:ACQTriggerRep-Sel + XX-22SL03:DI-FOFB:RtmLampAmpEn-SP - - + + - ACQTriggerEvent: + RtmLampPISPLimInf: - - + + - XX-22SL03:DI-FOFB:RtmLampDacWr-SP - - - - - - - RtmLampPIEn: + XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP - - + + - XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel + XX-22SL03:DI-FOFB:RtmLampDacData-SP - - + + - XX-22SL03:DI-FOFB:ACQShots-SP + XX-22SL03:DI-FOFB:RtmLampPIKP-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP + XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP - - + + - XX-22SL03:DI-FOFB:ACQTriggerRep-Sel + XX-22SL03:DI-FOFB:RtmLampPITI-SP - - + + - XX-22SL03:DI-FOFB:ACQShots-SP + XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP - - + + - XX-22SL03:DI-FOFB:ACQChannel-Sel + XX-22SL03:DI-FOFB:ACQTriggerRep-Sel - - + + - XX-22SL03:DI-FOFB:RtmLampPIKP-SP + XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP - - + + - XX-22SL03:DI-FOFB:RtmLampDacData-SP + XX-22SL03:DI-FOFB:ACQSamplesPost-SP - - + + - RtmLampAmpTFlagL: + RtmLampPIOLSquareEn: - - + + - ACQSamplesPost: + RtmLampAmpIFlagL: - - + + + + + + + XX-22SL03:DI-FOFB:RtmLampPIEn-SP + + + + + - RtmLampDacData: + RtmLampPISP: @@ -277,618 +286,425 @@ - - + + + + RtmLampDacWr: + + + + + + + RtmLampPIOLTriangEn: + + + + + - XX-22SL03:DI-FOFB:RtmLampAmpEn-SP + XX-22SL03:DI-FOFB:RtmLampPISP-SP - - + + - XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP + XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP - - + + - XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP + XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP - - + + - ACQTrigger: + RtmLampAmpTFlagR: - - + + - XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP + XX-22SL03:DI-FOFB:RtmLampPITI-SP - - + + - XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP + XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPISP-SP + XX-22SL03:DI-FOFB:ACQSamplesPost-SP - - - - + + + + ACQSamplesPre: - - XX-22SL03:DI-FOFB:ACQSamplesPost-SP + + + + + + RtmLampAmpEn: - - + + - RtmLampPIOLSquareEn: + RtmLampAmpIFlagR: - - + + - XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP + XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP - - + + - XX-22SL03:DI-FOFB:RtmLampAmpEn-SP + XX-22SL03:DI-FOFB:ACQSamplesPre-SP - - + + - XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP - - - - - - - RtmLampPISPLimInf: + XX-22SL03:DI-FOFB:ACQSamplesPre-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP - - - - - - - RtmLampDacDataFromWb: + XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel - - + + - XX-22SL03:DI-FOFB:RtmLampPITI-SP + XX-22SL03:DI-FOFB:RtmLampDacWr-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + XX-22SL03:DI-FOFB:RtmLampAmpEn-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP - - - - - - - ACQSamplesPre: + XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPISP-SP + XX-22SL03:DI-FOFB:RtmLampPIEn-SP - - + + - XX-22SL03:DI-FOFB:RtmLampStatus-SP + XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP - - - - - - - XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP + + + + ACQChannel: - - + + - XX-22SL03:DI-FOFB:ACQSamplesPre-SP + XX-22SL03:DI-FOFB:ACQShots-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPIEn-SP + XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP - - + + - RtmLampDacWr: + ACQSamplesPost: - - + + - XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP + XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP - - + + - XX-22SL03:DI-FOFB:ACQSamplesPre-SP + XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPITI-SP + XX-22SL03:DI-FOFB:ACQTriggerRep-Sel - - - - RtmLampPIKP: + + + + + + + XX-22SL03:DI-FOFB:ACQChannel-Sel - - + + - XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP + XX-22SL03:DI-FOFB:ACQTrigger-Sel - - + + - RtmLampAmpIFlagR: + ACQTriggerRep: - - - - - - - XX-22SL03:DI-FOFB:RtmLampDacWr-SP + + + + ACQShots: - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP - - + + - RtmLampAmpIFlagL: + RtmLampPIKP: - - + + + + RtmLampPITI: + + + + + - XX-22SL03:DI-FOFB:ACQSamplesPost-SP + XX-22SL03:DI-FOFB:RtmLampStatus-SP - - + + - ACQChannel: + RtmLampPIOLDacCntMax: - - - - - - - XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP + + + + RtmLampAmpTFlagL: - - + + - XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP + XX-22SL03:DI-FOFB:RtmLampPISP-SP - - + + - XX-22SL03:DI-FOFB:ACQTrigger-Sel + XX-22SL03:DI-FOFB:RtmLampDacWr-SP - - + + - XX-22SL03:DI-FOFB:RtmLampDacData-SP - - - - - - - RtmLampStatus: + XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPIKP-SP + XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP - - + + - RtmLampAmpEn: + RtmLampPIEn: - - + + - ACQTriggerRep: + ACQTrigger: - - - - 420 - 30 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - - 760 - 30 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH4ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - - 760 - 210 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - - 420 - 210 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - - 760 - 390 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - - 420 - 390 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - - 760 - 570 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - - 420 - 570 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - 670 - 0 + 930 + 10 175 31 @@ -913,6 +729,400 @@ + + + + 410 + 10 + 701 + 761 + + + + 0 + + + + Current | Voltage [channels 0~3] + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH8ArrayData", "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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH1ArrayData", "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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH9ArrayData", "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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH2ArrayData", "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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH10ArrayData", "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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH11ArrayData", "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] + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + tabWidget + gridLayoutWidget_2 + horizontalLayoutWidget From c017d01dada96b31cd2a45fb1b65fce01004eafc Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 4 Jan 2022 16:34:57 -0300 Subject: [PATCH 22/42] scripts: add run_test.sh file --- scripts/pydm_test/run_test.sh | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 scripts/pydm_test/run_test.sh diff --git a/scripts/pydm_test/run_test.sh b/scripts/pydm_test/run_test.sh new file mode 100755 index 0000000..8802a88 --- /dev/null +++ b/scripts/pydm_test/run_test.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +pydm --hide-nav-bar --hide-menu-bar --hide-status-bar acq_rtm_test.ui From 149e6491b31d88b7a2a4e65dcb10c9d725dab24a Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Wed, 5 Jan 2022 08:01:58 -0300 Subject: [PATCH 23/42] scripts: update pydm test file --- scripts/pydm_test/acq_rtm_test.ui | 550 +++++++++++++++--------------- 1 file changed, 275 insertions(+), 275 deletions(-) diff --git a/scripts/pydm_test/acq_rtm_test.ui b/scripts/pydm_test/acq_rtm_test.ui index f489eef..11b96c5 100644 --- a/scripts/pydm_test/acq_rtm_test.ui +++ b/scripts/pydm_test/acq_rtm_test.ui @@ -19,75 +19,79 @@ 10 10 391 - 761 + 751 - - + + - XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP + XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP - - + + - ACQTriggerEvent: + RtmLampDacData: - - + + + + RtmLampAmpTFlagR: + + + + + - XX-22SL03:DI-FOFB:RtmLampDacData-SP + XX-22SL03:DI-FOFB:ACQSamplesPre-SP - - + + - RtmLampPISPSquareEn: + RtmLampPIOLTriangEn: - - + + - XX-22SL03:DI-FOFB:ACQShots-SP + XX-22SL03:DI-FOFB:ACQChannel-Sel - - - - - - - XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP + + + + ACQChannel: - - + + - XX-22SL03:DI-FOFB:ACQTrigger-Sel + XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP - + @@ -97,220 +101,170 @@ - - + + - RtmLampStatus: + ACQTrigger: - - + + - XX-22SL03:DI-FOFB:RtmLampPIKP-SP - - - - - - - RtmLampDacDataFromWb: + XX-22SL03:DI-FOFB:RtmLampDacWr-SP - - + + - XX-22SL03:DI-FOFB:ACQChannel-Sel + XX-22SL03:DI-FOFB:RtmLampPISP-SP - - + + - RtmLampDacData: + RtmLampPITI: - - + + - XX-22SL03:DI-FOFB:RtmLampAmpEn-SP + XX-22SL03:DI-FOFB:ACQTriggerRep-Sel - - + + - RtmLampPISPLimInf: + RtmLampStatus: - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP - - - - - - - XX-22SL03:DI-FOFB:RtmLampDacData-SP + + + + ACQShots: - - - - - - - XX-22SL03:DI-FOFB:RtmLampPIKP-SP + + + + RtmLampPISPSquareEn: - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + XX-22SL03:DI-FOFB:ACQSamplesPre-SP - - - - - - - XX-22SL03:DI-FOFB:RtmLampPITI-SP + + + + RtmLampPISP: - - - - - - - XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP + + + + RtmLampAmpEn: - - + + - XX-22SL03:DI-FOFB:ACQTriggerRep-Sel + XX-22SL03:DI-FOFB:RtmLampAmpEn-SP - - - - - - - XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + + + + ACQSamplesPre: - - + + - XX-22SL03:DI-FOFB:ACQSamplesPost-SP - - - - - - - RtmLampPIOLSquareEn: + XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP - - + + - RtmLampAmpIFlagL: + RtmLampDacDataFromWb: - - + + - XX-22SL03:DI-FOFB:RtmLampPIEn-SP - - - - - - - RtmLampPISP: + XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP - - + + - XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPIOLTriangEn: + XX-22SL03:DI-FOFB:RtmLampPIKP-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPISP-SP + XX-22SL03:DI-FOFB:RtmLampDacData-SP - + @@ -320,219 +274,239 @@ - - + + - XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP - - - - - - - RtmLampAmpTFlagR: + XX-22SL03:DI-FOFB:RtmLampDacData-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPITI-SP + XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel - - + + - XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP + XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP - - + + + + ACQTriggerRep: + + + + + - XX-22SL03:DI-FOFB:ACQSamplesPost-SP + XX-22SL03:DI-FOFB:RtmLampPISP-SP - - + + - ACQSamplesPre: + RtmLampPIOLSquareEn: + + + + + + + - - - - - - RtmLampAmpEn: + + XX-22SL03:DI-FOFB:RtmLampPITI-SP - - + + - RtmLampAmpIFlagR: + ACQTriggerEvent: - - + + - XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP + XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP - - + + - XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel + XX-22SL03:DI-FOFB:ACQTrigger-Sel - - + + - XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP + XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP - - + + - XX-22SL03:DI-FOFB:ACQSamplesPre-SP + XX-22SL03:DI-FOFB:RtmLampStatus-SP - - + + - XX-22SL03:DI-FOFB:ACQSamplesPre-SP + XX-22SL03:DI-FOFB:ACQTrigger-Sel - - + + - XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel + XX-22SL03:DI-FOFB:RtmLampPIEn-SP - - + + - XX-22SL03:DI-FOFB:RtmLampDacWr-SP + XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP - - + + + + RtmLampPIEn: + + + + + - XX-22SL03:DI-FOFB:RtmLampAmpEn-SP + XX-22SL03:DI-FOFB:RtmLampDacWr-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP + XX-22SL03:DI-FOFB:RtmLampPIKP-SP - - + + + + RtmLampAmpTFlagL: + + + + + - XX-22SL03:DI-FOFB:RtmLampPIEn-SP + XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel - + - XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP + XX-22SL03:DI-FOFB:RtmLampAmpEn-SP - - + + - ACQChannel: + RtmLampPISPLimInf: - - + + - XX-22SL03:DI-FOFB:ACQShots-SP + XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + XX-22SL03:DI-FOFB:RtmLampPIEn-SP - - - - ACQSamplesPost: + + + + + + + XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP - + @@ -542,13 +516,13 @@ - - + + - XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP @@ -562,139 +536,165 @@ - - + + - XX-22SL03:DI-FOFB:ACQChannel-Sel + XX-22SL03:DI-FOFB:ACQShots-SP - - + + - XX-22SL03:DI-FOFB:ACQTrigger-Sel + XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP - - + + - ACQTriggerRep: + RtmLampPIOLDacCntMax: - - - - ACQShots: + + + + + + + XX-22SL03:DI-FOFB:ACQSamplesPost-SP - - + + - XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP + XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP - - + + - RtmLampPIKP: + RtmLampAmpIFlagR: - - + + - RtmLampPITI: + RtmLampDacWr: - - + + + + RtmLampAmpIFlagL: + + + + + - XX-22SL03:DI-FOFB:RtmLampStatus-SP + XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP - - - - RtmLampPIOLDacCntMax: + + + + - - - - - - RtmLampAmpTFlagL: + + XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP - - + + - XX-22SL03:DI-FOFB:RtmLampPISP-SP + XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP - - + + - XX-22SL03:DI-FOFB:RtmLampDacWr-SP + XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP - - + + + + ACQSamplesPost: + + + + + + + RtmLampPIKP: + + + + + - XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP + XX-22SL03:DI-FOFB:RtmLampPITI-SP - - + + - XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP + XX-22SL03:DI-FOFB:ACQChannel-Sel - - - - RtmLampPIEn: + + + + + + + XX-22SL03:DI-FOFB:ACQShots-SP - - - - ACQTrigger: + + + + + + + XX-22SL03:DI-FOFB:ACQSamplesPost-SP From 95abdcf478172e4bcebf016cdf4a5e998d5f6b37 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Wed, 5 Jan 2022 10:27:22 -0300 Subject: [PATCH 24/42] scripts: update slot mapping file --- ...ot-mapping => fofb-epics-ioc-slot-mapping} | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) rename scripts/systemd/etc/sysconfig/{fofb-epics-slot-mapping => fofb-epics-ioc-slot-mapping} (95%) diff --git a/scripts/systemd/etc/sysconfig/fofb-epics-slot-mapping b/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping similarity index 95% rename from scripts/systemd/etc/sysconfig/fofb-epics-slot-mapping rename to scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping index 66b2955..d509c4a 100644 --- a/scripts/systemd/etc/sysconfig/fofb-epics-slot-mapping +++ b/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping @@ -1,3 +1,101 @@ +# --- CRATE 99 (minicrate) --- + +# Crate 99 - FOFB slot 1 - XX-99SL01:DI-FOFB +CRATE_99_FOFB_1_PV_AREA_PREFIX=XX-99SL01: +CRATE_99_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 2 - XX-99SL02:DI-FOFB +CRATE_99_FOFB_2_PV_AREA_PREFIX=XX-99SL02: +CRATE_99_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 3 - XX-99SL03:DI-FOFB +CRATE_99_FOFB_3_PV_AREA_PREFIX=XX-99SL03: +CRATE_99_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 4 - XX-99SL04:DI-FOFB +CRATE_99_FOFB_4_PV_AREA_PREFIX=XX-99SL04: +CRATE_99_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 5 - XX-99SL05:DI-FOFB +CRATE_99_FOFB_5_PV_AREA_PREFIX=XX-99SL05: +CRATE_99_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 6 - XX-99SL06:DI-FOFB +CRATE_99_FOFB_6_PV_AREA_PREFIX=XX-99SL06: +CRATE_99_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 7 - XX-99SL07:DI-PFOFB +CRATE_99_FOFB_7_PV_AREA_PREFIX=XX-99SL07: +CRATE_99_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB: + +# Crate 99 - FOFB slot 8 - XX-99SL08:DI-PFOFB +CRATE_99_FOFB_8_PV_AREA_PREFIX=XX-99SL08: +CRATE_99_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB: + +# Crate 99 - FOFB slot 9 - XX-99SL09:DI-PFOFB +CRATE_99_FOFB_9_PV_AREA_PREFIX=XX-99SL09: +CRATE_99_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB: + +# Crate 99 - FOFB slot 10 - XX-99SL10:DI-PFOFB +CRATE_99_FOFB_10_PV_AREA_PREFIX=XX-99SL10: +CRATE_99_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB: + +# Crate 99 - FOFB slot 11 - XX-99SL11:DI-FOFB +CRATE_99_FOFB_11_PV_AREA_PREFIX=XX-99SL11: +CRATE_99_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 12 - XX-99SL12:DI-FOFB +CRATE_99_FOFB_12_PV_AREA_PREFIX=XX-99SL12: +CRATE_99_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 13 - XX-99SL13:DI-FOFB +CRATE_99_FOFB_13_PV_AREA_PREFIX=XX-99SL13: +CRATE_99_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 14 - XX-99SL14:DI-FOFB +CRATE_99_FOFB_14_PV_AREA_PREFIX=XX-99SL14: +CRATE_99_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 15 - XX-99SL15:DI-FOFB +CRATE_99_FOFB_15_PV_AREA_PREFIX=XX-99SL15: +CRATE_99_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 16 - XX-99SL16:DI-FOFB +CRATE_99_FOFB_16_PV_AREA_PREFIX=XX-99SL16: +CRATE_99_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 17 - XX-99SL17:DI-FOFB +CRATE_99_FOFB_17_PV_AREA_PREFIX=XX-99SL17: +CRATE_99_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 18 - XX-99SL18:DI-FOFB +CRATE_99_FOFB_18_PV_AREA_PREFIX=XX-99SL18: +CRATE_99_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 19 - XX-99SL19:DI-FOFB +CRATE_99_FOFB_19_PV_AREA_PREFIX=XX-99SL19: +CRATE_99_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 20 - XX-99SL20:DI-FOFB +CRATE_99_FOFB_20_PV_AREA_PREFIX=XX-99SL20: +CRATE_99_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 21 - XX-99SL21:DI-FOFB +CRATE_99_FOFB_21_PV_AREA_PREFIX=XX-99SL21: +CRATE_99_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 22 - XX-99SL22:DI-FOFB +CRATE_99_FOFB_22_PV_AREA_PREFIX=XX-99SL22: +CRATE_99_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 23 - XX-99SL23:DI-FOFB +CRATE_99_FOFB_23_PV_AREA_PREFIX=XX-99SL23: +CRATE_22_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: + +# Crate 99 - FOFB slot 24 - XX-99SL24:DI-FOFB +CRATE_99_FOFB_24_PV_AREA_PREFIX=XX-99SL24: +CRATE_99_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: + # --- CRATE 1 --- # Crate 1 - FOFB slot 1 - XX-01SL01:DI-FOFB From a9b8c3d0c14ec77e87549c22d5d05861a5e15310 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Wed, 5 Jan 2022 11:20:41 -0300 Subject: [PATCH 25/42] scripts: add pydm test files --- .../{acq_rtm_test.ui => rtm_test_homolog.ui} | 0 scripts/pydm_test/rtm_test_minicrate.ui | 1151 +++++++++++++++++ scripts/pydm_test/run_test.sh | 3 - scripts/pydm_test/run_test_homolog.sh | 3 + scripts/pydm_test/run_test_minicrate.sh | 3 + 5 files changed, 1157 insertions(+), 3 deletions(-) rename scripts/pydm_test/{acq_rtm_test.ui => rtm_test_homolog.ui} (100%) create mode 100644 scripts/pydm_test/rtm_test_minicrate.ui delete mode 100755 scripts/pydm_test/run_test.sh create mode 100755 scripts/pydm_test/run_test_homolog.sh create mode 100755 scripts/pydm_test/run_test_minicrate.sh diff --git a/scripts/pydm_test/acq_rtm_test.ui b/scripts/pydm_test/rtm_test_homolog.ui similarity index 100% rename from scripts/pydm_test/acq_rtm_test.ui rename to scripts/pydm_test/rtm_test_homolog.ui diff --git a/scripts/pydm_test/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui new file mode 100644 index 0000000..3ca9a79 --- /dev/null +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -0,0 +1,1151 @@ + + + Dialog + + + + 0 + 0 + 1125 + 789 + + + + Dialog + + + + + 10 + 10 + 391 + 751 + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + + + + + + + RtmLampDacData: + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL03:DI-FOFB:ACQSamplesPre-SP + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL03:DI-FOFB:ACQChannel-Sel + + + + + + + ACQChannel: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpIFlagL-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampStatus-SP + + + + + + + ACQTrigger: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampDacWr-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPISP-SP + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL03:DI-FOFB:ACQTriggerRep-Sel + + + + + + + RtmLampStatus: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampDacDataFromWb-SP + + + + + + + ACQShots: + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL03:DI-FOFB:ACQSamplesPre-SP + + + + + + + RtmLampPISP: + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpEn-SP + + + + + + + ACQSamplesPre: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpTFlagL-SP + + + + + + + RtmLampDacDataFromWb: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpTFlagR-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIKP-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampDacData-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampDacData-SP + + + + + + + + + + XX-99SL03:DI-FOFB:ACQTriggerEvent-Sel + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + + + + + + + ACQTriggerRep: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPISP-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPITI-SP + + + + + + + ACQTriggerEvent: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + + + + + + + + + + XX-99SL03:DI-FOFB:ACQTrigger-Sel + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpIFlagR-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampStatus-SP + + + + + + + + + + XX-99SL03:DI-FOFB:ACQTrigger-Sel + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIEn-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpTFlagR-SP + + + + + + + RtmLampPIEn: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampDacWr-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIKP-SP + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL03:DI-FOFB:ACQTriggerEvent-Sel + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpEn-SP + + + + + + + RtmLampPISPLimInf: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPISPLimInf-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIEn-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampDacDataFromWb-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPISPSquareEn-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPISPSquareEn-SP + + + + + + + + + + XX-99SL03:DI-FOFB:ACQTriggerRep-Sel + + + + + + + + + + XX-99SL03:DI-FOFB:ACQShots-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPISPLimInf-SP + + + + + + + RtmLampPIOLDacCntMax: + + + + + + + + + + XX-99SL03:DI-FOFB:ACQSamplesPost-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + RtmLampDacWr: + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpTFlagL-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpIFlagL-SP + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampAmpIFlagR-SP + + + + + + + ACQSamplesPost: + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL03:DI-FOFB:RtmLampPITI-SP + + + + + + + + + + XX-99SL03:DI-FOFB:ACQChannel-Sel + + + + + + + + + + XX-99SL03:DI-FOFB:ACQShots-SP + + + + + + + + + + XX-99SL03:DI-FOFB:ACQSamplesPost-SP + + + + + + + + + 930 + 10 + 175 + 31 + + + + + + + ACQStatus: + + + + + + + + + + XX-99SL03:DI-FOFB:ACQStatus-Sts + + + + + + + + + 410 + 10 + 701 + 761 + + + + 0 + + + + Current | Voltage [channels 0~3] + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH8ArrayData", "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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH1ArrayData", "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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH9ArrayData", "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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH2ArrayData", "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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH10ArrayData", "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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH11ArrayData", "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] + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB: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} + + + + + {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + tabWidget + gridLayoutWidget_2 + horizontalLayoutWidget + + + + 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.sh b/scripts/pydm_test/run_test.sh deleted file mode 100755 index 8802a88..0000000 --- a/scripts/pydm_test/run_test.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -pydm --hide-nav-bar --hide-menu-bar --hide-status-bar acq_rtm_test.ui diff --git a/scripts/pydm_test/run_test_homolog.sh b/scripts/pydm_test/run_test_homolog.sh new file mode 100755 index 0000000..dd5314e --- /dev/null +++ b/scripts/pydm_test/run_test_homolog.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +pydm --hide-nav-bar --hide-menu-bar --hide-status-bar rtm_test_homolog.ui 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 From b860beda37ec4dfe57e272b7dd0c0b45cffa9bdb Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Wed, 5 Jan 2022 16:10:49 -0300 Subject: [PATCH 26/42] scripts: update PV prefix --- scripts/pydm_test/rtm_test_homolog.ui | 134 +- .../etc/sysconfig/fofb-epics-ioc-slot-mapping | 3372 ++++++++--------- 2 files changed, 1751 insertions(+), 1755 deletions(-) diff --git a/scripts/pydm_test/rtm_test_homolog.ui b/scripts/pydm_test/rtm_test_homolog.ui index 11b96c5..24898f5 100644 --- a/scripts/pydm_test/rtm_test_homolog.ui +++ b/scripts/pydm_test/rtm_test_homolog.ui @@ -29,7 +29,7 @@
- XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + SI-22:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP
@@ -53,7 +53,7 @@
- XX-22SL03:DI-FOFB:ACQSamplesPre-SP + SI-22:DI-FOFBCtrl:ACQSamplesPre-SP
@@ -70,7 +70,7 @@
- XX-22SL03:DI-FOFB:ACQChannel-Sel + SI-22:DI-FOFBCtrl:ACQChannel-Sel
@@ -87,7 +87,7 @@
- XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP + SI-22:DI-FOFBCtrl:RtmLampAmpIFlagL-SP
@@ -97,7 +97,7 @@
- XX-22SL03:DI-FOFB:RtmLampStatus-SP + SI-22:DI-FOFBCtrl:RtmLampStatus-SP
@@ -114,7 +114,7 @@
- XX-22SL03:DI-FOFB:RtmLampDacWr-SP + SI-22:DI-FOFBCtrl:RtmLampDacWr-SP
@@ -124,7 +124,7 @@
- XX-22SL03:DI-FOFB:RtmLampPISP-SP + SI-22:DI-FOFBCtrl:RtmLampPISP-SP
@@ -141,7 +141,7 @@
- XX-22SL03:DI-FOFB:ACQTriggerRep-Sel + SI-22:DI-FOFBCtrl:ACQTriggerRep-Sel
@@ -158,7 +158,7 @@
- XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP + SI-22:DI-FOFBCtrl:RtmLampDacDataFromWb-SP
@@ -182,7 +182,7 @@
- XX-22SL03:DI-FOFB:ACQSamplesPre-SP + SI-22:DI-FOFBCtrl:ACQSamplesPre-SP
@@ -206,7 +206,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpEn-SP + SI-22:DI-FOFBCtrl:RtmLampAmpEn-SP
@@ -223,7 +223,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP + SI-22:DI-FOFBCtrl:RtmLampAmpTFlagL-SP
@@ -240,7 +240,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP + SI-22:DI-FOFBCtrl:RtmLampAmpTFlagR-SP
@@ -250,7 +250,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIKP-SP + SI-22:DI-FOFBCtrl:RtmLampPIKP-SP
@@ -260,7 +260,7 @@ - XX-22SL03:DI-FOFB:RtmLampDacData-SP + SI-22:DI-FOFBCtrl:RtmLampDacData-SP
@@ -270,7 +270,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + SI-22:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP @@ -280,7 +280,7 @@ - XX-22SL03:DI-FOFB:RtmLampDacData-SP + SI-22:DI-FOFBCtrl:RtmLampDacData-SP @@ -290,7 +290,7 @@ - XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel + SI-22:DI-FOFBCtrl:ACQTriggerEvent-Sel @@ -300,7 +300,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + SI-22:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP @@ -317,7 +317,7 @@ - XX-22SL03:DI-FOFB:RtmLampPISP-SP + SI-22:DI-FOFBCtrl:RtmLampPISP-SP @@ -334,7 +334,7 @@ - XX-22SL03:DI-FOFB:RtmLampPITI-SP + SI-22:DI-FOFBCtrl:RtmLampPITI-SP @@ -351,7 +351,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + SI-22:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP @@ -361,7 +361,7 @@ - XX-22SL03:DI-FOFB:ACQTrigger-Sel + SI-22:DI-FOFBCtrl:ACQTrigger-Sel @@ -371,7 +371,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP + SI-22:DI-FOFBCtrl:RtmLampAmpIFlagR-SP @@ -381,7 +381,7 @@ - XX-22SL03:DI-FOFB:RtmLampStatus-SP + SI-22:DI-FOFBCtrl:RtmLampStatus-SP @@ -391,7 +391,7 @@ - XX-22SL03:DI-FOFB:ACQTrigger-Sel + SI-22:DI-FOFBCtrl:ACQTrigger-Sel @@ -401,7 +401,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIEn-SP + SI-22:DI-FOFBCtrl:RtmLampPIEn-SP @@ -411,7 +411,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpTFlagR-SP + SI-22:DI-FOFBCtrl:RtmLampAmpTFlagR-SP @@ -428,7 +428,7 @@ - XX-22SL03:DI-FOFB:RtmLampDacWr-SP + SI-22:DI-FOFBCtrl:RtmLampDacWr-SP @@ -438,7 +438,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIKP-SP + SI-22:DI-FOFBCtrl:RtmLampPIKP-SP @@ -455,7 +455,7 @@ - XX-22SL03:DI-FOFB:ACQTriggerEvent-Sel + SI-22:DI-FOFBCtrl:ACQTriggerEvent-Sel @@ -465,7 +465,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpEn-SP + SI-22:DI-FOFBCtrl:RtmLampAmpEn-SP @@ -482,7 +482,7 @@ - XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP + SI-22:DI-FOFBCtrl:RtmLampPISPLimInf-SP @@ -492,7 +492,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIEn-SP + SI-22:DI-FOFBCtrl:RtmLampPIEn-SP @@ -502,7 +502,7 @@ - XX-22SL03:DI-FOFB:RtmLampDacDataFromWb-SP + SI-22:DI-FOFBCtrl:RtmLampDacDataFromWb-SP @@ -512,7 +512,7 @@ - XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP + SI-22:DI-FOFBCtrl:RtmLampPISPSquareEn-SP @@ -522,7 +522,7 @@ - XX-22SL03:DI-FOFB:RtmLampPISPSquareEn-SP + SI-22:DI-FOFBCtrl:RtmLampPISPSquareEn-SP @@ -532,7 +532,7 @@ - XX-22SL03:DI-FOFB:ACQTriggerRep-Sel + SI-22:DI-FOFBCtrl:ACQTriggerRep-Sel @@ -542,7 +542,7 @@ - XX-22SL03:DI-FOFB:ACQShots-SP + SI-22:DI-FOFBCtrl:ACQShots-SP @@ -552,7 +552,7 @@ - XX-22SL03:DI-FOFB:RtmLampPISPLimInf-SP + SI-22:DI-FOFBCtrl:RtmLampPISPLimInf-SP @@ -569,7 +569,7 @@ - XX-22SL03:DI-FOFB:ACQSamplesPost-SP + SI-22:DI-FOFBCtrl:ACQSamplesPost-SP @@ -579,7 +579,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + SI-22:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP @@ -610,7 +610,7 @@ - XX-22SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + SI-22:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP @@ -620,7 +620,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpTFlagL-SP + SI-22:DI-FOFBCtrl:RtmLampAmpTFlagL-SP @@ -630,7 +630,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpIFlagL-SP + SI-22:DI-FOFBCtrl:RtmLampAmpIFlagL-SP @@ -640,7 +640,7 @@ - XX-22SL03:DI-FOFB:RtmLampAmpIFlagR-SP + SI-22:DI-FOFBCtrl:RtmLampAmpIFlagR-SP @@ -664,7 +664,7 @@ - XX-22SL03:DI-FOFB:RtmLampPITI-SP + SI-22:DI-FOFBCtrl:RtmLampPITI-SP @@ -674,7 +674,7 @@ - XX-22SL03:DI-FOFB:ACQChannel-Sel + SI-22:DI-FOFBCtrl:ACQChannel-Sel @@ -684,7 +684,7 @@ - XX-22SL03:DI-FOFB:ACQShots-SP + SI-22:DI-FOFBCtrl:ACQShots-SP @@ -694,7 +694,7 @@ - XX-22SL03:DI-FOFB:ACQSamplesPost-SP + SI-22:DI-FOFBCtrl:ACQSamplesPost-SP @@ -723,7 +723,7 @@ - XX-22SL03:DI-FOFB:ACQStatus-Sts + SI-22:DI-FOFBCtrl:ACQStatus-Sts @@ -764,7 +764,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -787,7 +787,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH8ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH8ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -810,7 +810,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -833,7 +833,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH9ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH9ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -856,7 +856,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -879,7 +879,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH10ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH10ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -902,7 +902,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -925,7 +925,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH11ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH11ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -953,7 +953,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH4ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH4ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -976,7 +976,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -999,7 +999,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1022,7 +1022,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1045,7 +1045,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH12ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH12ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1068,7 +1068,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH13ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH13ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1091,7 +1091,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH14ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH14ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1114,7 +1114,7 @@ - {"y_channel": "XX-22SL03:DI-FOFB:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} diff --git a/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping b/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping index d509c4a..88d7674 100644 --- a/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping +++ b/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping @@ -1,2281 +1,2277 @@ -# --- CRATE 99 (minicrate) --- -# Crate 99 - FOFB slot 1 - XX-99SL01:DI-FOFB -CRATE_99_FOFB_1_PV_AREA_PREFIX=XX-99SL01: -CRATE_99_FOFB_1_PV_DEVICE_PREFIX=DI-FOFB: +# --- CRATE 1 --- -# Crate 99 - FOFB slot 2 - XX-99SL02:DI-FOFB -CRATE_99_FOFB_2_PV_AREA_PREFIX=XX-99SL02: -CRATE_99_FOFB_2_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 1 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_1_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 3 - XX-99SL03:DI-FOFB -CRATE_99_FOFB_3_PV_AREA_PREFIX=XX-99SL03: -CRATE_99_FOFB_3_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 2 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_2_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 4 - XX-99SL04:DI-FOFB -CRATE_99_FOFB_4_PV_AREA_PREFIX=XX-99SL04: -CRATE_99_FOFB_4_PV_DEVICE_PREFIX=DI-FOFB: +# 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 99 - FOFB slot 5 - XX-99SL05:DI-FOFB -CRATE_99_FOFB_5_PV_AREA_PREFIX=XX-99SL05: -CRATE_99_FOFB_5_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 4 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_4_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 6 - XX-99SL06:DI-FOFB -CRATE_99_FOFB_6_PV_AREA_PREFIX=XX-99SL06: -CRATE_99_FOFB_6_PV_DEVICE_PREFIX=DI-FOFB: +# 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 99 - FOFB slot 7 - XX-99SL07:DI-PFOFB -CRATE_99_FOFB_7_PV_AREA_PREFIX=XX-99SL07: -CRATE_99_FOFB_7_PV_DEVICE_PREFIX=DI-PFOFB: +# Crate 1 - FOFB slot 6 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_6_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 8 - XX-99SL08:DI-PFOFB -CRATE_99_FOFB_8_PV_AREA_PREFIX=XX-99SL08: -CRATE_99_FOFB_8_PV_DEVICE_PREFIX=DI-PFOFB: +# Crate 1 - FOFB slot 7 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_7_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 9 - XX-99SL09:DI-PFOFB -CRATE_99_FOFB_9_PV_AREA_PREFIX=XX-99SL09: -CRATE_99_FOFB_9_PV_DEVICE_PREFIX=DI-PFOFB: +# Crate 1 - FOFB slot 8 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_8_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 10 - XX-99SL10:DI-PFOFB -CRATE_99_FOFB_10_PV_AREA_PREFIX=XX-99SL10: -CRATE_99_FOFB_10_PV_DEVICE_PREFIX=DI-PFOFB: +# Crate 1 - FOFB slot 9 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_9_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 11 - XX-99SL11:DI-FOFB -CRATE_99_FOFB_11_PV_AREA_PREFIX=XX-99SL11: -CRATE_99_FOFB_11_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 10 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_10_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 12 - XX-99SL12:DI-FOFB -CRATE_99_FOFB_12_PV_AREA_PREFIX=XX-99SL12: -CRATE_99_FOFB_12_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 11 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_11_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 13 - XX-99SL13:DI-FOFB -CRATE_99_FOFB_13_PV_AREA_PREFIX=XX-99SL13: -CRATE_99_FOFB_13_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 12 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_12_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 14 - XX-99SL14:DI-FOFB -CRATE_99_FOFB_14_PV_AREA_PREFIX=XX-99SL14: -CRATE_99_FOFB_14_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 13 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_13_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 15 - XX-99SL15:DI-FOFB -CRATE_99_FOFB_15_PV_AREA_PREFIX=XX-99SL15: -CRATE_99_FOFB_15_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 14 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_14_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 16 - XX-99SL16:DI-FOFB -CRATE_99_FOFB_16_PV_AREA_PREFIX=XX-99SL16: -CRATE_99_FOFB_16_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 15 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_15_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 17 - XX-99SL17:DI-FOFB -CRATE_99_FOFB_17_PV_AREA_PREFIX=XX-99SL17: -CRATE_99_FOFB_17_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 16 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_16_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 18 - XX-99SL18:DI-FOFB -CRATE_99_FOFB_18_PV_AREA_PREFIX=XX-99SL18: -CRATE_99_FOFB_18_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 17 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_17_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 19 - XX-99SL19:DI-FOFB -CRATE_99_FOFB_19_PV_AREA_PREFIX=XX-99SL19: -CRATE_99_FOFB_19_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 18 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_18_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 20 - XX-99SL20:DI-FOFB -CRATE_99_FOFB_20_PV_AREA_PREFIX=XX-99SL20: -CRATE_99_FOFB_20_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 19 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_19_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 21 - XX-99SL21:DI-FOFB -CRATE_99_FOFB_21_PV_AREA_PREFIX=XX-99SL21: -CRATE_99_FOFB_21_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 20 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_20_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 22 - XX-99SL22:DI-FOFB -CRATE_99_FOFB_22_PV_AREA_PREFIX=XX-99SL22: -CRATE_99_FOFB_22_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 21 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_21_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 23 - XX-99SL23:DI-FOFB -CRATE_99_FOFB_23_PV_AREA_PREFIX=XX-99SL23: -CRATE_22_FOFB_23_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 22 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_22_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# Crate 99 - FOFB slot 24 - XX-99SL24:DI-FOFB -CRATE_99_FOFB_24_PV_AREA_PREFIX=XX-99SL24: -CRATE_99_FOFB_24_PV_DEVICE_PREFIX=DI-FOFB: +# Crate 1 - FOFB slot 23 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_23_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 1 --- +# Crate 1 - FOFB slot 24 - SI-01:DI-FOFBCtrl +CRATE_1_FOFB_24_PV_AREA_PREFIX=SI-01: +CRATE_1_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 --- -# 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 2 - FOFB slot 1 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_1_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 2 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_2_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 2 - FOFB slot 4 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_4_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 2 - FOFB slot 6 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_6_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 7 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_7_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 8 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_8_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 9 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_9_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 10 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_10_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 11 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_11_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 12 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_12_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 13 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_13_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 14 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_14_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 15 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_15_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 16 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_16_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 17 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_17_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 18 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_18_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 19 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_19_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 20 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_20_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 2 - FOFB slot 21 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_21_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_22_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 2 - FOFB slot 23 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_23_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 2 --- +# Crate 2 - FOFB slot 24 - SI-02:DI-FOFBCtrl +CRATE_2_FOFB_24_PV_AREA_PREFIX=SI-02: +CRATE_2_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 --- -# 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 3 - FOFB slot 1 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_1_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 2 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_2_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 3 - FOFB slot 4 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_4_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 3 - FOFB slot 6 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_6_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 7 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_7_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 8 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_8_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 9 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_9_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 10 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_10_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 11 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_11_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 12 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_12_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 13 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_13_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 14 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_14_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 15 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_15_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 16 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_16_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 17 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_17_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 18 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_18_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 19 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_19_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 20 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_20_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 3 - FOFB slot 21 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_21_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_22_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 3 - FOFB slot 23 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_23_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 3 --- +# Crate 3 - FOFB slot 24 - SI-03:DI-FOFBCtrl +CRATE_3_FOFB_24_PV_AREA_PREFIX=SI-03: +CRATE_3_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 --- -# 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 4 - FOFB slot 1 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_1_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 2 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_2_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 4 - FOFB slot 4 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_4_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 4 - FOFB slot 6 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_6_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 7 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_7_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 8 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_8_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 9 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_9_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 10 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_10_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 11 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_11_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 12 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_12_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 13 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_13_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 14 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_14_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 15 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_15_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 16 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_16_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 17 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_17_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 18 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_18_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 19 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_19_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 20 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_20_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 4 - FOFB slot 21 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_21_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_22_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 4 - FOFB slot 23 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_23_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 4 --- +# Crate 4 - FOFB slot 24 - SI-04:DI-FOFBCtrl +CRATE_4_FOFB_24_PV_AREA_PREFIX=SI-04: +CRATE_4_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 --- -# 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 5 - FOFB slot 1 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_1_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 2 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_2_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 5 - FOFB slot 4 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_4_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 5 - FOFB slot 6 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_6_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 7 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_7_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 8 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_8_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 9 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_9_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 10 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_10_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 11 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_11_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 12 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_12_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 13 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_13_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 14 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_14_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 15 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_15_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 16 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_16_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 17 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_17_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 18 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_18_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 19 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_19_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 20 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_20_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 5 - FOFB slot 21 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_21_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_22_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 5 - FOFB slot 23 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_23_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 5 --- +# Crate 5 - FOFB slot 24 - SI-05:DI-FOFBCtrl +CRATE_5_FOFB_24_PV_AREA_PREFIX=SI-05: +CRATE_5_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 --- -# 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 6 - FOFB slot 1 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_1_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 2 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_2_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 6 - FOFB slot 4 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_4_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 6 - FOFB slot 6 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_6_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 7 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_7_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 8 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_8_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 9 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_9_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 10 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_10_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 11 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_11_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 12 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_12_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 13 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_13_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 14 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_14_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 15 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_15_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 16 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_16_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 17 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_17_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 18 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_18_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 19 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_19_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 20 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_20_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 6 - FOFB slot 21 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_21_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_22_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 6 - FOFB slot 23 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_23_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 6 --- +# Crate 6 - FOFB slot 24 - SI-06:DI-FOFBCtrl +CRATE_6_FOFB_24_PV_AREA_PREFIX=SI-06: +CRATE_6_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 --- -# 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 7 - FOFB slot 1 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_1_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 2 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_2_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 7 - FOFB slot 4 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_4_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 7 - FOFB slot 6 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_6_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 7 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_7_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 8 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_8_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 9 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_9_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 10 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_10_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 11 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_11_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 12 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_12_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 13 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_13_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 14 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_14_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 15 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_15_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 16 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_16_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 17 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_17_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 18 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_18_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 19 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_19_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 20 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_20_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 7 - FOFB slot 21 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_21_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_22_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 7 - FOFB slot 23 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_23_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 7 --- +# Crate 7 - FOFB slot 24 - SI-07:DI-FOFBCtrl +CRATE_7_FOFB_24_PV_AREA_PREFIX=SI-07: +CRATE_7_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 --- -# 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 8 - FOFB slot 1 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_1_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 2 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_2_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 8 - FOFB slot 4 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_4_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 8 - FOFB slot 6 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_6_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 7 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_7_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 8 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_8_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 9 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_9_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 10 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_10_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 11 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_11_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 12 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_12_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 13 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_13_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 14 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_14_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 15 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_15_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 16 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_16_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 17 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_17_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 18 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_18_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 19 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_19_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 20 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_20_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 8 - FOFB slot 21 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_21_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_22_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 8 - FOFB slot 23 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_23_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 8 --- +# Crate 8 - FOFB slot 24 - SI-08:DI-FOFBCtrl +CRATE_8_FOFB_24_PV_AREA_PREFIX=SI-08: +CRATE_8_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 --- -# 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 9 - FOFB slot 1 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_1_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 2 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_2_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 9 - FOFB slot 4 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_4_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 9 - FOFB slot 6 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_6_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 7 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_7_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 8 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_8_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 9 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_9_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 10 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_10_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 11 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_11_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 12 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_12_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 13 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_13_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 14 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_14_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 15 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_15_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 16 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_16_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 17 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_17_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 18 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_18_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 19 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_19_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 20 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_20_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 9 - FOFB slot 21 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_21_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_22_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 9 - FOFB slot 23 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_23_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 9 --- +# Crate 9 - FOFB slot 24 - SI-09:DI-FOFBCtrl +CRATE_9_FOFB_24_PV_AREA_PREFIX=SI-09: +CRATE_9_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 --- -# 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 10 - FOFB slot 1 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_1_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 2 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_2_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 10 - FOFB slot 4 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_4_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 10 - FOFB slot 6 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_6_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 7 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_7_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 8 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_8_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 9 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_9_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 10 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_10_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 11 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_11_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 12 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_12_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 13 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_13_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 14 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_14_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 15 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_15_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 16 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_16_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 17 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_17_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 18 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_18_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 19 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_19_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 20 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_20_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 10 - FOFB slot 21 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_21_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_22_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 10 - FOFB slot 23 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_23_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 10 --- +# Crate 10 - FOFB slot 24 - SI-10:DI-FOFBCtrl +CRATE_10_FOFB_24_PV_AREA_PREFIX=SI-10: +CRATE_10_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 --- -# 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 11 - FOFB slot 1 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_1_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 2 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_2_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 11 - FOFB slot 4 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_4_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 11 - FOFB slot 6 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_6_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 7 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_7_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 8 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_8_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 9 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_9_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 10 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_10_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 11 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_11_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 12 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_12_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 13 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_13_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 14 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_14_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 15 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_15_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 16 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_16_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 17 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_17_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 18 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_18_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 19 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_19_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 20 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_20_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 11 - FOFB slot 21 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_21_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_22_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 11 - FOFB slot 23 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_23_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 11 --- +# Crate 11 - FOFB slot 24 - SI-11:DI-FOFBCtrl +CRATE_11_FOFB_24_PV_AREA_PREFIX=SI-11: +CRATE_11_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 --- -# 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 12 - FOFB slot 1 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_1_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 2 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_2_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 12 - FOFB slot 4 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_4_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 12 - FOFB slot 6 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_6_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 7 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_7_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 8 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_8_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 9 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_9_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 10 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_10_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 11 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_11_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 12 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_12_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 13 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_13_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 14 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_14_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 15 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_15_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 16 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_16_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 17 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_17_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 18 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_18_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 19 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_19_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 20 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_20_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 12 - FOFB slot 21 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_21_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_22_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 12 - FOFB slot 23 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_23_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 12 --- +# Crate 12 - FOFB slot 24 - SI-12:DI-FOFBCtrl +CRATE_12_FOFB_24_PV_AREA_PREFIX=SI-12: +CRATE_12_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 --- -# 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 13 - FOFB slot 1 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_1_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 2 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_2_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 13 - FOFB slot 4 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_4_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 13 - FOFB slot 6 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_6_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 7 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_7_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 8 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_8_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 9 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_9_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 10 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_10_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 11 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_11_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 12 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_12_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 13 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_13_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 14 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_14_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 15 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_15_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 16 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_16_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 17 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_17_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 18 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_18_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 19 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_19_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 20 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_20_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 13 - FOFB slot 21 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_21_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_22_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 13 - FOFB slot 23 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_23_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 13 --- +# Crate 13 - FOFB slot 24 - SI-13:DI-FOFBCtrl +CRATE_13_FOFB_24_PV_AREA_PREFIX=SI-13: +CRATE_13_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 --- -# 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 14 - FOFB slot 1 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_1_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 2 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_2_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 14 - FOFB slot 4 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_4_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 14 - FOFB slot 6 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_6_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 7 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_7_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 8 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_8_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 9 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_9_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 10 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_10_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 11 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_11_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 12 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_12_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 13 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_13_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 14 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_14_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 15 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_15_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 16 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_16_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 17 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_17_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 18 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_18_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 19 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_19_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 20 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_20_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 14 - FOFB slot 21 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_21_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_22_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 14 - FOFB slot 23 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_23_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 14 --- +# Crate 14 - FOFB slot 24 - SI-14:DI-FOFBCtrl +CRATE_14_FOFB_24_PV_AREA_PREFIX=SI-14: +CRATE_14_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 --- -# 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 15 - FOFB slot 1 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_1_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 2 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_2_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 15 - FOFB slot 4 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_4_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 15 - FOFB slot 6 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_6_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 7 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_7_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 8 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_8_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 9 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_9_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 10 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_10_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 11 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_11_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 12 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_12_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 13 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_13_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 14 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_14_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 15 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_15_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 16 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_16_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 17 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_17_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 18 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_18_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 19 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_19_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 20 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_20_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 15 - FOFB slot 21 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_21_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_22_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 15 - FOFB slot 23 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_23_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 15 --- +# Crate 15 - FOFB slot 24 - SI-15:DI-FOFBCtrl +CRATE_15_FOFB_24_PV_AREA_PREFIX=SI-15: +CRATE_15_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 --- -# 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 16 - FOFB slot 1 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_1_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 2 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_2_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 16 - FOFB slot 4 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_4_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 16 - FOFB slot 6 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_6_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 7 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_7_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 8 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_8_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 9 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_9_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 10 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_10_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 11 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_11_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 12 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_12_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 13 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_13_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 14 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_14_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 15 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_15_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 16 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_16_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 17 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_17_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 18 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_18_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 19 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_19_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 20 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_20_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 16 - FOFB slot 21 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_21_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 22 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_22_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 16 - FOFB slot 23 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_23_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 16 --- +# Crate 16 - FOFB slot 24 - SI-16:DI-FOFBCtrl +CRATE_16_FOFB_24_PV_AREA_PREFIX=SI-16: +CRATE_16_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 --- -# 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 17 - FOFB slot 1 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_1_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 2 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_2_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 17 - FOFB slot 4 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_4_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 17 - FOFB slot 6 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_6_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 7 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_7_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 8 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_8_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 9 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_9_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 10 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_10_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 11 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_11_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 12 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_12_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 13 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_13_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 14 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_14_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 15 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_15_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 16 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_16_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 17 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_17_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 18 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_18_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 19 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_19_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 17 - FOFB slot 20 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_20_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 21 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_21_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 17 - FOFB slot 22 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_22_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 17 --- +# Crate 17 - FOFB slot 23 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_23_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 24 - SI-17:DI-FOFBCtrl +CRATE_17_FOFB_24_PV_AREA_PREFIX=SI-17: +CRATE_17_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 --- -# 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 18 - FOFB slot 1 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_1_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 2 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_2_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 18 - FOFB slot 4 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_4_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 18 - FOFB slot 6 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_6_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 7 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_7_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 8 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_8_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 9 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_9_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 10 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_10_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 11 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_11_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 12 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_12_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 13 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_13_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 14 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_14_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 15 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_15_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 16 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_16_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 17 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_17_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 18 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_18_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 19 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_19_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 18 - FOFB slot 20 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_20_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 21 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_21_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 18 - FOFB slot 22 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_22_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 18 --- +# Crate 18 - FOFB slot 23 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_23_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 24 - SI-18:DI-FOFBCtrl +CRATE_18_FOFB_24_PV_AREA_PREFIX=SI-18: +CRATE_18_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 --- -# 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 19 - FOFB slot 1 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_1_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 2 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_2_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 19 - FOFB slot 4 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_4_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 19 - FOFB slot 6 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_6_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 7 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_7_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 8 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_8_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 9 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_9_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 10 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_10_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 11 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_11_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 12 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_12_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 13 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_13_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 14 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_14_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 15 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_15_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 16 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_16_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 17 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_17_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 18 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_18_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 19 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_19_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 19 - FOFB slot 20 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_20_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 21 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_21_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 19 - FOFB slot 22 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_22_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 19 --- +# Crate 19 - FOFB slot 23 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_23_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 24 - SI-19:DI-FOFBCtrl +CRATE_19_FOFB_24_PV_AREA_PREFIX=SI-19: +CRATE_19_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 --- -# 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 20 - FOFB slot 1 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_1_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 2 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_2_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 20 - FOFB slot 4 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_4_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 20 - FOFB slot 6 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_6_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 7 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_7_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 8 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_8_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 9 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_9_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 10 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_10_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 11 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_11_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 12 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_12_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 13 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_13_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 14 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_14_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 15 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_15_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 16 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_16_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 17 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_17_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 18 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_18_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 19 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_19_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 20 - FOFB slot 20 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_20_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 21 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_21_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 20 - FOFB slot 22 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_22_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 20 --- +# Crate 20 - FOFB slot 23 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_23_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 24 - SI-20:DI-FOFBCtrl +CRATE_20_FOFB_24_PV_AREA_PREFIX=SI-20: +CRATE_20_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 --- -# 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 21 - FOFB slot 1 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_1_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 2 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_2_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 21 - FOFB slot 4 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_4_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 21 - FOFB slot 6 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_6_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 7 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_7_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 8 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_8_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 9 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_9_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 10 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_10_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 11 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_11_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 12 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_12_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 13 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_13_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 14 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_14_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 15 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_15_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 16 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_16_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 17 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_17_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 18 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_18_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 19 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_19_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 21 - FOFB slot 20 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_20_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 21 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_21_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: +# Crate 21 - FOFB slot 22 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_22_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 21 --- +# Crate 21 - FOFB slot 23 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_23_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 24 - SI-21:DI-FOFBCtrl +CRATE_21_FOFB_24_PV_AREA_PREFIX=SI-21: +CRATE_21_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 --- -# 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 22 - FOFB slot 1 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_1_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 2 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_2_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 22 - FOFB slot 4 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_4_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 22 - FOFB slot 6 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_6_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 7 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_7_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 8 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_8_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 9 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_9_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 10 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_10_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 11 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_11_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 12 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_12_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 13 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_13_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 14 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_14_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 15 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_15_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 16 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_16_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 17 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_17_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 18 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_18_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 19 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_19_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 22 - FOFB slot 20 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_20_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 - FOFB slot 21 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_21_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# --- CRATE 22 --- +# Crate 22 - FOFB slot 22 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_22_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 23 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_23_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: + +# Crate 22 - FOFB slot 24 - SI-22:DI-FOFBCtrl +CRATE_22_FOFB_24_PV_AREA_PREFIX=SI-22: +CRATE_22_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: + + +# --- CRATE 99 (minicrate) --- + +# Crate 99 - FOFB slot 1 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_1_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_1_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 2 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_2_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_2_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 99 - FOFB slot 4 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_4_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_4_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 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 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 99 - FOFB slot 6 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_6_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_6_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 7 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_7_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_7_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 8 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_8_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_8_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 9 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_9_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_9_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 10 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_10_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_10_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 11 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_11_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_11_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 12 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_12_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_12_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 13 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_13_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_13_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 14 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_14_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_14_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 15 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_15_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_15_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 16 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_16_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_16_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 17 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_17_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_17_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 18 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_18_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_18_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 19 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_19_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_19_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 20 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_20_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_20_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 21 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_21_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_21_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 22 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_22_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_22_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 23 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_23_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_23_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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 99 - FOFB slot 24 - SI-99:DI-FOFBCtrl +CRATE_99_FOFB_24_PV_AREA_PREFIX=SI-99: +CRATE_99_FOFB_24_PV_DEVICE_PREFIX=DI-FOFBCtrl: -# 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: From d0234d15b8691c02a3e002eee926fb675899270f Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Wed, 5 Jan 2022 17:10:20 -0300 Subject: [PATCH 27/42] scripts: update slot-mapping --- scripts/pydm_test/rtm_test_minicrate.ui | 134 +- .../etc/sysconfig/fofb-epics-ioc-slot-mapping | 2024 ++++++++--------- 2 files changed, 1079 insertions(+), 1079 deletions(-) diff --git a/scripts/pydm_test/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index 3ca9a79..717fb8d 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -29,7 +29,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + SI-99:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP @@ -53,7 +53,7 @@ - XX-99SL03:DI-FOFB:ACQSamplesPre-SP + SI-99:DI-FOFBCtrl:ACQSamplesPre-SP @@ -70,7 +70,7 @@ - XX-99SL03:DI-FOFB:ACQChannel-Sel + SI-99:DI-FOFBCtrl:ACQChannel-Sel @@ -87,7 +87,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpIFlagL-SP + SI-99:DI-FOFBCtrl:RtmLampAmpIFlagL-SP @@ -97,7 +97,7 @@ - XX-99SL03:DI-FOFB:RtmLampStatus-SP + SI-99:DI-FOFBCtrl:RtmLampStatus-SP @@ -114,7 +114,7 @@ - XX-99SL03:DI-FOFB:RtmLampDacWr-SP + SI-99:DI-FOFBCtrl:RtmLampDacWr-SP @@ -124,7 +124,7 @@ - XX-99SL03:DI-FOFB:RtmLampPISP-SP + SI-99:DI-FOFBCtrl:RtmLampPISP-SP @@ -141,7 +141,7 @@ - XX-99SL03:DI-FOFB:ACQTriggerRep-Sel + SI-99:DI-FOFBCtrl:ACQTriggerRep-Sel @@ -158,7 +158,7 @@ - XX-99SL03:DI-FOFB:RtmLampDacDataFromWb-SP + SI-99:DI-FOFBCtrl:RtmLampDacDataFromWb-SP @@ -182,7 +182,7 @@ - XX-99SL03:DI-FOFB:ACQSamplesPre-SP + SI-99:DI-FOFBCtrl:ACQSamplesPre-SP @@ -206,7 +206,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpEn-SP + SI-99:DI-FOFBCtrl:RtmLampAmpEn-SP @@ -223,7 +223,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpTFlagL-SP + SI-99:DI-FOFBCtrl:RtmLampAmpTFlagL-SP @@ -240,7 +240,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpTFlagR-SP + SI-99:DI-FOFBCtrl:RtmLampAmpTFlagR-SP @@ -250,7 +250,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIKP-SP + SI-99:DI-FOFBCtrl:RtmLampPIKP-SP @@ -260,7 +260,7 @@ - XX-99SL03:DI-FOFB:RtmLampDacData-SP + SI-99:DI-FOFBCtrl:RtmLampDacData-SP @@ -270,7 +270,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + SI-99:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP @@ -280,7 +280,7 @@ - XX-99SL03:DI-FOFB:RtmLampDacData-SP + SI-99:DI-FOFBCtrl:RtmLampDacData-SP @@ -290,7 +290,7 @@ - XX-99SL03:DI-FOFB:ACQTriggerEvent-Sel + SI-99:DI-FOFBCtrl:ACQTriggerEvent-Sel @@ -300,7 +300,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + SI-99:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP @@ -317,7 +317,7 @@ - XX-99SL03:DI-FOFB:RtmLampPISP-SP + SI-99:DI-FOFBCtrl:RtmLampPISP-SP @@ -334,7 +334,7 @@ - XX-99SL03:DI-FOFB:RtmLampPITI-SP + SI-99:DI-FOFBCtrl:RtmLampPITI-SP @@ -351,7 +351,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIOLSquareEn-SP + SI-99:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP @@ -361,7 +361,7 @@ - XX-99SL03:DI-FOFB:ACQTrigger-Sel + SI-99:DI-FOFBCtrl:ACQTrigger-Sel @@ -371,7 +371,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpIFlagR-SP + SI-99:DI-FOFBCtrl:RtmLampAmpIFlagR-SP @@ -381,7 +381,7 @@ - XX-99SL03:DI-FOFB:RtmLampStatus-SP + SI-99:DI-FOFBCtrl:RtmLampStatus-SP @@ -391,7 +391,7 @@ - XX-99SL03:DI-FOFB:ACQTrigger-Sel + SI-99:DI-FOFBCtrl:ACQTrigger-Sel @@ -401,7 +401,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIEn-SP + SI-99:DI-FOFBCtrl:RtmLampPIEn-SP @@ -411,7 +411,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpTFlagR-SP + SI-99:DI-FOFBCtrl:RtmLampAmpTFlagR-SP @@ -428,7 +428,7 @@ - XX-99SL03:DI-FOFB:RtmLampDacWr-SP + SI-99:DI-FOFBCtrl:RtmLampDacWr-SP @@ -438,7 +438,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIKP-SP + SI-99:DI-FOFBCtrl:RtmLampPIKP-SP @@ -455,7 +455,7 @@ - XX-99SL03:DI-FOFB:ACQTriggerEvent-Sel + SI-99:DI-FOFBCtrl:ACQTriggerEvent-Sel @@ -465,7 +465,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpEn-SP + SI-99:DI-FOFBCtrl:RtmLampAmpEn-SP @@ -482,7 +482,7 @@ - XX-99SL03:DI-FOFB:RtmLampPISPLimInf-SP + SI-99:DI-FOFBCtrl:RtmLampPISPLimInf-SP @@ -492,7 +492,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIEn-SP + SI-99:DI-FOFBCtrl:RtmLampPIEn-SP @@ -502,7 +502,7 @@ - XX-99SL03:DI-FOFB:RtmLampDacDataFromWb-SP + SI-99:DI-FOFBCtrl:RtmLampDacDataFromWb-SP @@ -512,7 +512,7 @@ - XX-99SL03:DI-FOFB:RtmLampPISPSquareEn-SP + SI-99:DI-FOFBCtrl:RtmLampPISPSquareEn-SP @@ -522,7 +522,7 @@ - XX-99SL03:DI-FOFB:RtmLampPISPSquareEn-SP + SI-99:DI-FOFBCtrl:RtmLampPISPSquareEn-SP @@ -532,7 +532,7 @@ - XX-99SL03:DI-FOFB:ACQTriggerRep-Sel + SI-99:DI-FOFBCtrl:ACQTriggerRep-Sel @@ -542,7 +542,7 @@ - XX-99SL03:DI-FOFB:ACQShots-SP + SI-99:DI-FOFBCtrl:ACQShots-SP @@ -552,7 +552,7 @@ - XX-99SL03:DI-FOFB:RtmLampPISPLimInf-SP + SI-99:DI-FOFBCtrl:RtmLampPISPLimInf-SP @@ -569,7 +569,7 @@ - XX-99SL03:DI-FOFB:ACQSamplesPost-SP + SI-99:DI-FOFBCtrl:ACQSamplesPost-SP @@ -579,7 +579,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIOLDacCntMax-SP + SI-99:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP @@ -610,7 +610,7 @@ - XX-99SL03:DI-FOFB:RtmLampPIOLTriangEn-SP + SI-99:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP @@ -620,7 +620,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpTFlagL-SP + SI-99:DI-FOFBCtrl:RtmLampAmpTFlagL-SP @@ -630,7 +630,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpIFlagL-SP + SI-99:DI-FOFBCtrl:RtmLampAmpIFlagL-SP @@ -640,7 +640,7 @@ - XX-99SL03:DI-FOFB:RtmLampAmpIFlagR-SP + SI-99:DI-FOFBCtrl:RtmLampAmpIFlagR-SP @@ -664,7 +664,7 @@ - XX-99SL03:DI-FOFB:RtmLampPITI-SP + SI-99:DI-FOFBCtrl:RtmLampPITI-SP @@ -674,7 +674,7 @@ - XX-99SL03:DI-FOFB:ACQChannel-Sel + SI-99:DI-FOFBCtrl:ACQChannel-Sel @@ -684,7 +684,7 @@ - XX-99SL03:DI-FOFB:ACQShots-SP + SI-99:DI-FOFBCtrl:ACQShots-SP @@ -694,7 +694,7 @@ - XX-99SL03:DI-FOFB:ACQSamplesPost-SP + SI-99:DI-FOFBCtrl:ACQSamplesPost-SP @@ -723,7 +723,7 @@ - XX-99SL03:DI-FOFB:ACQStatus-Sts + SI-99:DI-FOFBCtrl:ACQStatus-Sts @@ -764,7 +764,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -787,7 +787,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH8ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH8ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -810,7 +810,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -833,7 +833,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH9ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH9ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -856,7 +856,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -879,7 +879,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH10ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH10ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -902,7 +902,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -925,7 +925,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH11ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH11ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -953,7 +953,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH4ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH4ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -976,7 +976,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -999,7 +999,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1022,7 +1022,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1045,7 +1045,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH12ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH12ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1068,7 +1068,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH13ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH13ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1091,7 +1091,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH14ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH14ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} @@ -1114,7 +1114,7 @@ - {"y_channel": "XX-99SL03:DI-FOFB:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} diff --git a/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping b/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping index 88d7674..b603ff4 100644 --- a/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping +++ b/scripts/systemd/etc/sysconfig/fofb-epics-ioc-slot-mapping @@ -1,2277 +1,2277 @@ # --- CRATE 1 --- -# Crate 1 - FOFB slot 1 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_1_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_2_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_4_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_6_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_7_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_8_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_9_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_10_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_11_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_12_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_13_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_14_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_15_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_16_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_17_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_18_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_19_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_20_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_21_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_22_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_23_PV_AREA_PREFIX=SI-01: +# 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 - SI-01:DI-FOFBCtrl -CRATE_1_FOFB_24_PV_AREA_PREFIX=SI-01: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_1_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_2_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_4_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_6_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_7_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_8_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_9_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_10_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_11_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_12_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_13_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_14_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_15_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_16_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_17_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_18_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_19_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_20_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_21_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_22_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_23_PV_AREA_PREFIX=SI-02: +# 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 - SI-02:DI-FOFBCtrl -CRATE_2_FOFB_24_PV_AREA_PREFIX=SI-02: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_1_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_2_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_4_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_6_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_7_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_8_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_9_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_10_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_11_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_12_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_13_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_14_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_15_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_16_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_17_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_18_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_19_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_20_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_21_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_22_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_23_PV_AREA_PREFIX=SI-03: +# 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 - SI-03:DI-FOFBCtrl -CRATE_3_FOFB_24_PV_AREA_PREFIX=SI-03: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_1_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_2_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_4_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_6_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_7_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_8_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_9_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_10_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_11_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_12_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_13_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_14_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_15_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_16_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_17_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_18_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_19_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_20_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_21_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_22_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_23_PV_AREA_PREFIX=SI-04: +# 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 - SI-04:DI-FOFBCtrl -CRATE_4_FOFB_24_PV_AREA_PREFIX=SI-04: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_1_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_2_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_4_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_6_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_7_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_8_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_9_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_10_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_11_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_12_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_13_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_14_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_15_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_16_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_17_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_18_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_19_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_20_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_21_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_22_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_23_PV_AREA_PREFIX=SI-05: +# 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 - SI-05:DI-FOFBCtrl -CRATE_5_FOFB_24_PV_AREA_PREFIX=SI-05: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_1_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_2_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_4_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_6_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_7_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_8_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_9_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_10_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_11_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_12_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_13_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_14_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_15_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_16_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_17_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_18_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_19_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_20_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_21_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_22_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_23_PV_AREA_PREFIX=SI-06: +# 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 - SI-06:DI-FOFBCtrl -CRATE_6_FOFB_24_PV_AREA_PREFIX=SI-06: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_1_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_2_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_4_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_6_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_7_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_8_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_9_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_10_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_11_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_12_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_13_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_14_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_15_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_16_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_17_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_18_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_19_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_20_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_21_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_22_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_23_PV_AREA_PREFIX=SI-07: +# 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 - SI-07:DI-FOFBCtrl -CRATE_7_FOFB_24_PV_AREA_PREFIX=SI-07: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_1_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_2_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_4_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_6_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_7_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_8_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_9_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_10_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_11_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_12_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_13_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_14_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_15_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_16_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_17_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_18_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_19_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_20_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_21_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_22_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_23_PV_AREA_PREFIX=SI-08: +# 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 - SI-08:DI-FOFBCtrl -CRATE_8_FOFB_24_PV_AREA_PREFIX=SI-08: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_1_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_2_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_4_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_6_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_7_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_8_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_9_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_10_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_11_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_12_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_13_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_14_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_15_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_16_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_17_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_18_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_19_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_20_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_21_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_22_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_23_PV_AREA_PREFIX=SI-09: +# 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 - SI-09:DI-FOFBCtrl -CRATE_9_FOFB_24_PV_AREA_PREFIX=SI-09: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_2_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_4_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_6_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_7_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_8_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_9_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_10_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_11_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_12_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_13_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_14_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_15_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_16_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_17_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_18_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_19_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_20_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_21_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_22_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_23_PV_AREA_PREFIX=SI-10: +# 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 - SI-10:DI-FOFBCtrl -CRATE_10_FOFB_24_PV_AREA_PREFIX=SI-10: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_2_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_4_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_6_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_7_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_8_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_9_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_10_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_11_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_12_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_13_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_14_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_15_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_16_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_17_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_18_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_19_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_20_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_21_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_22_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_23_PV_AREA_PREFIX=SI-11: +# 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 - SI-11:DI-FOFBCtrl -CRATE_11_FOFB_24_PV_AREA_PREFIX=SI-11: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_2_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_4_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_6_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_7_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_8_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_9_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_10_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_11_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_12_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_13_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_14_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_15_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_16_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_17_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_18_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_19_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_20_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_21_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_22_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_23_PV_AREA_PREFIX=SI-12: +# 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 - SI-12:DI-FOFBCtrl -CRATE_12_FOFB_24_PV_AREA_PREFIX=SI-12: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_2_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_4_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_6_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_7_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_8_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_9_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_10_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_11_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_12_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_13_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_14_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_15_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_16_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_17_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_18_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_19_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_20_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_21_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_22_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_23_PV_AREA_PREFIX=SI-13: +# 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 - SI-13:DI-FOFBCtrl -CRATE_13_FOFB_24_PV_AREA_PREFIX=SI-13: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_2_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_4_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_6_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_7_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_8_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_9_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_10_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_11_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_12_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_13_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_14_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_15_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_16_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_17_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_18_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_19_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_20_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_21_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_22_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_23_PV_AREA_PREFIX=SI-14: +# 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 - SI-14:DI-FOFBCtrl -CRATE_14_FOFB_24_PV_AREA_PREFIX=SI-14: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_2_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_4_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_6_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_7_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_8_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_9_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_10_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_11_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_12_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_13_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_14_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_15_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_16_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_17_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_18_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_19_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_20_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_21_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_22_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_23_PV_AREA_PREFIX=SI-15: +# 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 - SI-15:DI-FOFBCtrl -CRATE_15_FOFB_24_PV_AREA_PREFIX=SI-15: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_2_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_4_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_6_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_7_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_8_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_9_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_10_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_11_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_12_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_13_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_14_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_15_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_16_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_17_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_18_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_19_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_20_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_21_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_22_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_23_PV_AREA_PREFIX=SI-16: +# 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 - SI-16:DI-FOFBCtrl -CRATE_16_FOFB_24_PV_AREA_PREFIX=SI-16: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_2_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_4_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_6_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_7_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_8_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_9_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_10_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_11_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_12_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_13_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_14_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_15_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_16_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_17_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_18_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_19_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_20_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_21_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_22_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_23_PV_AREA_PREFIX=SI-17: +# 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 - SI-17:DI-FOFBCtrl -CRATE_17_FOFB_24_PV_AREA_PREFIX=SI-17: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_2_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_4_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_6_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_7_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_8_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_9_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_10_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_11_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_12_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_13_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_14_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_15_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_16_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_17_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_18_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_19_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_20_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_21_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_22_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_23_PV_AREA_PREFIX=SI-18: +# 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 - SI-18:DI-FOFBCtrl -CRATE_18_FOFB_24_PV_AREA_PREFIX=SI-18: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_2_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_4_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_6_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_7_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_8_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_9_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_10_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_11_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_12_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_13_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_14_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_15_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_16_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_17_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_18_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_19_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_20_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_21_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_22_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_23_PV_AREA_PREFIX=SI-19: +# 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 - SI-19:DI-FOFBCtrl -CRATE_19_FOFB_24_PV_AREA_PREFIX=SI-19: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_2_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_4_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_6_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_7_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_8_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_9_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_10_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_11_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_12_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_13_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_14_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_15_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_16_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_17_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_18_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_19_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_20_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_21_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_22_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_23_PV_AREA_PREFIX=SI-20: +# 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 - SI-20:DI-FOFBCtrl -CRATE_20_FOFB_24_PV_AREA_PREFIX=SI-20: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_2_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_4_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_6_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_7_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_8_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_9_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_10_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_11_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_12_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_13_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_14_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_15_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_16_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_17_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_18_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_19_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_20_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_21_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_22_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_23_PV_AREA_PREFIX=SI-21: +# 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 - SI-21:DI-FOFBCtrl -CRATE_21_FOFB_24_PV_AREA_PREFIX=SI-21: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_1_PV_AREA_PREFIX=SI-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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_2_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_4_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_6_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_7_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_8_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_9_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_10_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_11_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_12_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_13_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_14_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_15_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_16_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_17_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_18_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_19_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_20_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_21_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_22_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_23_PV_AREA_PREFIX=SI-22: +# 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 - SI-22:DI-FOFBCtrl -CRATE_22_FOFB_24_PV_AREA_PREFIX=SI-22: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_1_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_2_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_4_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_6_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_7_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_8_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_9_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_10_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_11_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_12_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_13_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_14_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_15_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_16_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_17_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_18_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_19_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_20_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_21_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_22_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_23_PV_AREA_PREFIX=SI-99: +# 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 - SI-99:DI-FOFBCtrl -CRATE_99_FOFB_24_PV_AREA_PREFIX=SI-99: +# 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: From 05e4afb35ccc4273891c0b1c0386ffcbd3c35d62 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 11 Jan 2022 16:20:29 -0300 Subject: [PATCH 28/42] FOFBApp and iocBoot: update driver to work only for rtm_lamp --- FOFBApp/Db/FOFB.template | 595 ---------------------------- FOFBApp/Db/FOFB_settings.req | 52 --- FOFBApp/src/drvFOFB.cpp | 330 --------------- FOFBApp/src/drvFOFB.h | 106 +---- iocBoot/iocFOFB/triggerFOFB.cmd | 26 -- iocBoot/iocFOFB/waveformPlugins.cmd | 50 --- 6 files changed, 2 insertions(+), 1157 deletions(-) diff --git a/FOFBApp/Db/FOFB.template b/FOFBApp/Db/FOFB.template index a0b7aa6..e17661a 100644 --- a/FOFBApp/Db/FOFB.template +++ b/FOFBApp/Db/FOFB.template @@ -6,66 +6,6 @@ # 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 ############################ @@ -322,538 +262,3 @@ record(longin,"$(P)$(R)RtmLampPISPLimInf-RB"){ 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/FOFB_settings.req b/FOFBApp/Db/FOFB_settings.req index 14670bc..652563c 100644 --- a/FOFBApp/Db/FOFB_settings.req +++ b/FOFBApp/Db/FOFB_settings.req @@ -4,7 +4,6 @@ file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ_NAME=ACQ # file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ_NAME=ACQ_PM file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ=GEN, ARRAY_NAME=CH0 -file "FOFBAcq_settings.req", P=$(P), R=$(R), ACQ=PM, ARRAY_NAME=CH0 # Regular triggers file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=0, TRIGGER_NAME=TRIGGER @@ -58,15 +57,6 @@ file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=21, TRIGGER_NA 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 PROCESSING parameters -######################### - -$(P)$(R)FofbProcessingRamWriteEnable-SP -$(P)$(R)FofbProcessingRamAddr-SP -$(P)$(R)FofbProcessingRamDataIn-SP -$(P)$(R)FofbProcessingRamDataOut-SP - ######################### # RTM LAMP parameters ######################### @@ -90,45 +80,3 @@ $(P)$(R)RtmLampPISP-SP $(P)$(R)RtmLampPIOLDacCntMax-SP $(P)$(R)RtmLampPISPLimInf-SP -############################ -# FOFB CTRL parameters -############################ - -$(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/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 58729c8..95d1945 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -86,23 +86,6 @@ static const channelMap_t channelMap[CH_END] = { WVF_DATA_CH14, WVF_DATA_CH15, WVF_DATA_ALL}, - {WVF_PM_CH0, - WVF_PM_CH1, - WVF_PM_CH2, - WVF_PM_CH3, - WVF_PM_CH4, - WVF_PM_CH5, - WVF_PM_CH6, - WVF_PM_CH7, - WVF_PM_CH8, - WVF_PM_CH9, - WVF_PM_CH10, - WVF_PM_CH11, - WVF_PM_CH12, - WVF_PM_CH13, - WVF_PM_CH14, - WVF_PM_CH15, - WVF_PM_ALL}, }, }, /* [CH_TBT] = */ {CH_HW_TBT, @@ -123,23 +106,6 @@ static const channelMap_t channelMap[CH_END] = { WVF_DATA_CH14, WVF_DATA_CH15, WVF_DATA_ALL}, - {WVF_PM_CH0, - WVF_PM_CH1, - WVF_PM_CH2, - WVF_PM_CH3, - WVF_PM_CH4, - WVF_PM_CH5, - WVF_PM_CH6, - WVF_PM_CH7, - WVF_PM_CH8, - WVF_PM_CH9, - WVF_PM_CH10, - WVF_PM_CH11, - WVF_PM_CH12, - WVF_PM_CH13, - WVF_PM_CH14, - WVF_PM_CH15, - WVF_PM_ALL}, }, }, /* [CH_FOFB] = */ {CH_HW_FOFB, // HwDataChannel @@ -160,23 +126,6 @@ static const channelMap_t channelMap[CH_END] = { -1, -1, -1}, - {-1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1}, }, }, /* [CH_MONIT1] = */ {CH_HW_MONIT1, // HwDataChannel @@ -197,23 +146,6 @@ static const channelMap_t channelMap[CH_END] = { -1, -1, -1}, - {-1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1}, }, }, }; @@ -238,14 +170,6 @@ static const channelRevMap_t channelRevMap[CH_HW_END] = { /* [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, @@ -282,82 +206,6 @@ 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, @@ -405,13 +253,6 @@ static taskParams_t taskParams[NUM_ACQ_CORES_PER_FOFB] = { FOFB_POLL_TIME, // pollTime false // autoStart }, - /* Post-Mortem Core */ - { - NULL, // drvFOFBp - FOFBIDPM, // coreID - FOFB_PM_POLL_TIME, // pollTime - true // autoStart - }, }; static taskParams_t taskMonitParams = { @@ -479,10 +320,6 @@ asynStatus drvFOFB::getServiceID (int fofbNumber, int addr, const char *serviceN serviceID = 0; break; - case FOFBIDPM: - serviceID = 1; - break; - default: status = asynError; asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, @@ -631,11 +468,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, /* Create general parameters */ - /* Create fofb_processing 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); @@ -655,45 +487,6 @@ 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); - /* Create fofb_ctrl parameters */ - 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); @@ -738,10 +531,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, /* 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); fofbHwFunc.emplace(P_RtmLampStatus, rtmLampSetGetStatusFunc); fofbHwFunc.emplace(P_RtmLampDacDataFromWb, rtmLampSetGetDacDataFromWbFunc); fofbHwFunc.emplace(P_RtmLampAmpIFlagL, rtmLampSetGetAmpIFlagLFunc); @@ -760,44 +549,6 @@ 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); @@ -830,11 +581,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* Set the initial values of some parameters */ - - 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); @@ -853,44 +599,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, 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); setUIntDigitalParam(P_AdcRate, ADC_RATE_FACTOR, 0xFFFFFFFF); setUIntDigitalParam(P_TbtRate, TBT_RATE_FACTOR, 0xFFFFFFFF); setUIntDigitalParam(P_FofbRate, FOFB_RATE_FACTOR, 0xFFFFFFFF); @@ -925,27 +633,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, setUIntDigitalParam(addr, P_ChannelAtomWidth, DFLT_ATOM_WIDTH, 0xFFFFFFFF); } - /* Acquisition PM parameters */ - setUIntDigitalParam(FOFBIDPM, P_SamplesPre, SAMPLES_PRE_DEFAULT_PM(fofbMaxPoints), 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_SamplesPost,SAMPLES_POST_DEFAULT_PM(fofbMaxPoints),0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_NumShots, NUM_SHOTS_DEFAULT_PM, 0xFFFFFFFF); - setIntegerParam( FOFBIDPM, P_Channel, CH_DEFAULT_PM); - setDoubleParam( FOFBIDPM, P_UpdateTime, 1.0); - setUIntDigitalParam(FOFBIDPM, P_Trigger, ACQ_CLIENT_TRIG_EXTERNAL, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerEvent, TRIG_ACQ_START, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerRep, 1, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerDataThres, 100, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerDataPol, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerDataSel, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerDataFilt, 1, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_TriggerHwDly, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM, P_DataTrigChan, 0, 0xFFFFFFFF); - - /* Write to HW */ - for (int i = P_SamplesPre; i < P_DataTrigChan+1; ++i) { - setParamGeneric(i, FOFBIDPM); - } - /* 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! */ @@ -967,23 +654,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } } - /* Set trigger parameters for PM */ - for (int addr = 0; addr < MAX_WAVEFORM_TRIGGERS; ++addr) { - setIntegerParam( FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerChan, CH_DFLT_TRIGGER_CHAN); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerDir, 1, 0xFFFFFFFF); /* FPGA Input */ - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerDirPol, 1, 0xFFFFFFFF); /* Reverse Direction Polarity */ - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerRcvCntRst, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerTrnCntRst, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerCntRcv, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerCntTrn, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerRcvLen, 1, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerTrnLen, 1, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerRcvSrc, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerTrnSrc, 0, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*MAX_TRIGGERS + addr, P_TriggerRcvInSel, CH_DFLT_TRIGGER_SEL_PM_CHAN, 0xFFFFFFFF); - setUIntDigitalParam(FOFBIDPM*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); diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index 6c894ba..e20065c 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -29,7 +29,6 @@ using linb::bad_any_cast; typedef enum { FOFBIDReg = 0, - FOFBIDPM = 1, FOFBIDEnd, } fofb_coreID_types; @@ -71,23 +70,6 @@ typedef enum { WVF_DATA_CH14, WVF_DATA_CH15, WVF_DATA_ALL, - WVF_PM_CH0, - WVF_PM_CH1, - WVF_PM_CH2, - WVF_PM_CH3, - WVF_PM_CH4, - WVF_PM_CH5, - WVF_PM_CH6, - WVF_PM_CH7, - WVF_PM_CH8, - WVF_PM_CH9, - WVF_PM_CH10, - WVF_PM_CH11, - WVF_PM_CH12, - WVF_PM_CH13, - WVF_PM_CH14, - WVF_PM_CH15, - WVF_PM_ALL, WVF_MONIT_CH0, WVF_END } wvf_types; @@ -354,11 +336,7 @@ 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 */ @@ -377,44 +355,6 @@ 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 */ #define P_AdcRateString "INFO_ADCRATE" /* asynUInt32Digital, r/o */ #define P_TbtRateString "INFO_TBTRATE" /* asynUInt32Digital, r/o */ #define P_FofbRateString "INFO_FOFBRATE" /* asynUInt32Digital, r/o */ @@ -556,12 +496,8 @@ class drvFOFB : public asynNDArrayDriver { 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; @@ -579,44 +515,6 @@ class drvFOFB : public asynNDArrayDriver { 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; int P_FOFBStatus; int P_AdcRate; int P_TbtRate; diff --git a/iocBoot/iocFOFB/triggerFOFB.cmd b/iocBoot/iocFOFB/triggerFOFB.cmd index eac2dd3..e6d6947 100644 --- a/iocBoot/iocFOFB/triggerFOFB.cmd +++ b/iocBoot/iocFOFB/triggerFOFB.cmd @@ -25,29 +25,3 @@ dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), T 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") -# Second instance of the TRIGGER module - -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=0, ADDR=24, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=1, ADDR=25, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=2, ADDR=26, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=3, ADDR=27, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=4, ADDR=28, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=5, ADDR=29, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=6, ADDR=30, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=7, ADDR=31, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=8, ADDR=32, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=9, ADDR=33, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=10, ADDR=34, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=11, ADDR=35, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=12, ADDR=36, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=13, ADDR=37, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=14, ADDR=38, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=15, ADDR=39, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=16, ADDR=40, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=17, ADDR=41, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=18, ADDR=42, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=19, ADDR=43, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=20, ADDR=44, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=21, ADDR=45, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=22, ADDR=46, TIMEOUT=1") -dbLoadRecords("${TOP}/db/FOFBTrigger.template", "P=${P}, R=${R}, PORT=$(PORT), TRIGGER_NAME=TRIGGER_PM, TRIGGER_CHAN=23, ADDR=47, TIMEOUT=1") diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd index cd28d7a..17da475 100644 --- a/iocBoot/iocFOFB/waveformPlugins.cmd +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -48,56 +48,6 @@ dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}G 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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -##################### GEN PM Waveforms ########################### - -NDStdArraysConfigure("PM_CH0_Array", $(QSIZE), 0, "$(PORT)", 17) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH0,PORT=PM_CH0_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH1_Array", $(QSIZE), 0, "$(PORT)", 18) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH1,PORT=PM_CH1_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH2_Array", $(QSIZE), 0, "$(PORT)", 19) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH2,PORT=PM_CH2_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH3_Array", $(QSIZE), 0, "$(PORT)", 20) -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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH4_Array", $(QSIZE), 0, "$(PORT)", 21) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH4,PORT=PM_CH4_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH5_Array", $(QSIZE), 0, "$(PORT)", 22) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH5,PORT=PM_CH5_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH6_Array", $(QSIZE), 0, "$(PORT)", 23) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH6,PORT=PM_CH6_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH7_Array", $(QSIZE), 0, "$(PORT)", 24) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH7,PORT=PM_CH7_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH8_Array", $(QSIZE), 0, "$(PORT)", 25) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH8,PORT=PM_CH8_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH9_Array", $(QSIZE), 0, "$(PORT)", 26) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH9,PORT=PM_CH9_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH10_Array", $(QSIZE), 0, "$(PORT)", 27) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH10,PORT=PM_CH10_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH11_Array", $(QSIZE), 0, "$(PORT)", 28) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH11,PORT=PM_CH11_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH12_Array", $(QSIZE), 0, "$(PORT)", 29) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH12,PORT=PM_CH12_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH13_Array", $(QSIZE), 0, "$(PORT)", 30) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH13,PORT=PM_CH13_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH14_Array", $(QSIZE), 0, "$(PORT)", 31) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH14,PORT=PM_CH14_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - -NDStdArraysConfigure("PM_CH15_Array", $(QSIZE), 0, "$(PORT)", 32) -dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}PM_CH15,PORT=PM_CH15_Array,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NDARRAY_ADDR=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - ##################### FOFB configuration ########################## dbLoadRecords("${TOP}/db/FOFB.template", "P=${P}, R=${R}, PORT=$(PORT), ADDR=0, TIMEOUT=1") From f82852d9191ab46a4b4055cd73e77ba41622acf3 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Sat, 15 Jan 2022 15:06:27 -0300 Subject: [PATCH 29/42] FOFBApp and iocBoot: add pvs per channel --- FOFBApp/Db/FOFB.template | 56 ++++++++++++++++++------------------ FOFBApp/Db/FOFB_settings.req | 28 +++++++++--------- FOFBApp/src/drvFOFB.cpp | 8 +++--- FOFBApp/src/drvFOFB.h | 8 +++--- iocBoot/iocFOFB/stFOFB.cmd | 14 ++++++++- 5 files changed, 63 insertions(+), 51 deletions(-) diff --git a/FOFBApp/Db/FOFB.template b/FOFBApp/Db/FOFB.template index e17661a..4875bb9 100644 --- a/FOFBApp/Db/FOFB.template +++ b/FOFBApp/Db/FOFB.template @@ -38,196 +38,196 @@ record(longin,"$(P)$(R)RtmLampDacDataFromWb-RB"){ field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CTL_DAC_DATA_FROM_WB") } -record(longout,"$(P)$(R)RtmLampAmpIFlagL-SP"){ +record(longout,"$(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") } -record(longin,"$(P)$(R)RtmLampAmpIFlagL-RB"){ +record(longin,"$(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") } -record(longout,"$(P)$(R)RtmLampAmpTFlagL-SP"){ +record(longout,"$(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") } -record(longin,"$(P)$(R)RtmLampAmpTFlagL-RB"){ +record(longin,"$(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") } -record(longout,"$(P)$(R)RtmLampAmpIFlagR-SP"){ +record(longout,"$(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") } -record(longin,"$(P)$(R)RtmLampAmpIFlagR-RB"){ +record(longin,"$(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") } -record(longout,"$(P)$(R)RtmLampAmpTFlagR-SP"){ +record(longout,"$(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") } -record(longin,"$(P)$(R)RtmLampAmpTFlagR-RB"){ +record(longin,"$(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") } -record(longout,"$(P)$(R)RtmLampAmpEn-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +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-SP"){ +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-RB"){ +record(longin,"$(P)$(R)RtmLampPISP$(RTM_CHAN)-RB"){ field(DTYP,"asynUInt32Digital") field(DESC,"get PI setpoint") field(SCAN,"I/O Intr") diff --git a/FOFBApp/Db/FOFB_settings.req b/FOFBApp/Db/FOFB_settings.req index 652563c..9e11bb2 100644 --- a/FOFBApp/Db/FOFB_settings.req +++ b/FOFBApp/Db/FOFB_settings.req @@ -63,20 +63,20 @@ file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=23, TRIGGER_NA $(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)RtmLampAmpIFlagL$(RTM_CHAN)-SP +$(P)$(R)RtmLampAmpTFlagL$(RTM_CHAN)-SP +$(P)$(R)RtmLampAmpIFlagR$(RTM_CHAN)-SP +$(P)$(R)RtmLampAmpTFlagR$(RTM_CHAN)-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 diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 95d1945..ac69b68 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -174,13 +174,13 @@ static const functionsAny_t rtmLampSetGetStatusFunc = {functio 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}}; diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index e20065c..d41e644 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -339,10 +339,10 @@ struct functionsAny_t { * 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 */ diff --git a/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index 4aa70c5..c17d3b6 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -21,7 +21,19 @@ FOFB_registerRecordDeviceDriver (pdbbase) 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/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH0, PORT=$(PORT), ADDR=0, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH1, PORT=$(PORT), ADDR=1, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH2, PORT=$(PORT), ADDR=2, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH3, PORT=$(PORT), ADDR=3, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH4, PORT=$(PORT), ADDR=4, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH5, PORT=$(PORT), ADDR=5, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH6, PORT=$(PORT), ADDR=6, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH7, PORT=$(PORT), ADDR=7, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH8, PORT=$(PORT), ADDR=8, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH9, PORT=$(PORT), ADDR=9, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH10, PORT=$(PORT), ADDR=10, TIMEOUT=1") +dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH11, PORT=$(PORT), ADDR=11, TIMEOUT=1") + 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") From 40cc4e83cadbfaf339d508c8031bcdd162c02927 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Sat, 15 Jan 2022 15:06:31 -0300 Subject: [PATCH 30/42] FOFBApp and iocBoot: add pvs per channel --- scripts/pydm_test/rtm_test_homolog.ui | 1151 ------ scripts/pydm_test/rtm_test_minicrate.ui | 4659 ++++++++++++++++++----- scripts/pydm_test/run_test_homolog.sh | 3 - 3 files changed, 3775 insertions(+), 2038 deletions(-) delete mode 100644 scripts/pydm_test/rtm_test_homolog.ui delete mode 100755 scripts/pydm_test/run_test_homolog.sh diff --git a/scripts/pydm_test/rtm_test_homolog.ui b/scripts/pydm_test/rtm_test_homolog.ui deleted file mode 100644 index 24898f5..0000000 --- a/scripts/pydm_test/rtm_test_homolog.ui +++ /dev/null @@ -1,1151 +0,0 @@ - - - Dialog - - - - 0 - 0 - 1125 - 789 - - - - Dialog - - - - - 10 - 10 - 391 - 751 - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - RtmLampDacData: - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQSamplesPre-SP - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQChannel-Sel - - - - - - - ACQChannel: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampStatus-SP - - - - - - - ACQTrigger: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacWr-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISP-SP - - - - - - - RtmLampPITI: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - RtmLampStatus: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - - - - - - ACQShots: - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQSamplesPre-SP - - - - - - - RtmLampPISP: - - - - - - - RtmLampAmpEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpEn-SP - - - - - - - ACQSamplesPre: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - - - - - - RtmLampDacDataFromWb: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIKP-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacData-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacData-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTriggerEvent-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - - - - ACQTriggerRep: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISP-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPITI-SP - - - - - - - ACQTriggerEvent: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTrigger-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampStatus-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTrigger-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - - - - - - RtmLampPIEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacWr-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIKP-SP - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTriggerEvent-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpEn-SP - - - - - - - RtmLampPISPLimInf: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQShots-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - - - - - - RtmLampPIOLDacCntMax: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQSamplesPost-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - RtmLampDacWr: - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - - - - ACQSamplesPost: - - - - - - - RtmLampPIKP: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPITI-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQChannel-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQShots-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQSamplesPost-SP - - - - - - - - - 930 - 10 - 175 - 31 - - - - - - - ACQStatus: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQStatus-Sts - - - - - - - - - 410 - 10 - 701 - 761 - - - - 0 - - - - Current | Voltage [channels 0~3] - - - - - 10 - 10 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH8ArrayData", "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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH1ArrayData", "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} - - - - - {"y_channel": "SI-22: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 - 370 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH2ArrayData", "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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH10ArrayData", "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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH11ArrayData", "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] - - - - - 10 - 10 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - tabWidget - gridLayoutWidget_2 - horizontalLayoutWidget - - - - 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/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index 717fb8d..1e457b5 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -6,700 +6,13 @@ 0 0 - 1125 - 789 + 1399 + 776 Dialog - - - - 10 - 10 - 391 - 751 - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - RtmLampDacData: - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQSamplesPre-SP - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQChannel-Sel - - - - - - - ACQChannel: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampStatus-SP - - - - - - - ACQTrigger: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacWr-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISP-SP - - - - - - - RtmLampPITI: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - RtmLampStatus: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - - - - - - ACQShots: - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQSamplesPre-SP - - - - - - - RtmLampPISP: - - - - - - - RtmLampAmpEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpEn-SP - - - - - - - ACQSamplesPre: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - - - - - - RtmLampDacDataFromWb: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIKP-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacData-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacData-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTriggerEvent-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - - - - ACQTriggerRep: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISP-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPITI-SP - - - - - - - ACQTriggerEvent: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTrigger-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampStatus-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTrigger-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - - - - - - RtmLampPIEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacWr-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIKP-SP - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTriggerEvent-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpEn-SP - - - - - - - RtmLampPISPLimInf: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQShots-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - - - - - - RtmLampPIOLDacCntMax: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQSamplesPost-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - RtmLampDacWr: - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - - - - ACQSamplesPost: - - - - - - - RtmLampPIKP: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPITI-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQChannel-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQShots-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQSamplesPost-SP - - - - - @@ -723,7 +36,7 @@ - SI-99:DI-FOFBCtrl:ACQStatus-Sts + XX-99SL01:DI-FOFBCtrl:ACQStatus-Sts @@ -732,18 +45,18 @@ - 410 + 440 10 - 701 + 1041 761 - 0 + 1 - Current | Voltage [channels 0~3] + Current | Voltage [Channels 0~3] @@ -762,17 +75,719 @@ {"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} + + + + + + + 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} + + + + + + + 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 + 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} + + + + + + + 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} + + + + + + + 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} + + + + + + + 690 + 10 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH0-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH0-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH0-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH0-SP + + + + + + + [CH0] + + + + + + + [CH0] + + + + + + + + + 690 + 190 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + [CH1] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH1-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH1-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + [CH1] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH1-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH1-SP + + + + + + + + + 690 + 370 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH2-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH2-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH2-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH2-SP + + + + + + + [CH2] + + + + + + + [CH2] + + + + + + + + + 690 + 550 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH3-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH3-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH3-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH3-SP + + + + + + + [CH3] + + + + + + + [CH3] + + + + + + + + + Current | Voltage [Channels 4~7] + + + + + 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": "SI-99:DI-FOFBCtrl:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} - + - 350 - 10 + 10 + 370 331 171 @@ -785,17 +800,20 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Current [CH 6] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH8ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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 - 190 + 550 331 171 @@ -808,17 +826,20 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Current [CH 7] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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 - 190 + 10 331 171 @@ -831,17 +852,20 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Voltage [CH 4] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH9ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} - + - 10 - 370 + 350 + 190 331 171 @@ -854,13 +878,16 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Voltage [CH 5] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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 @@ -877,16 +904,19 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Voltage [CH 6] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH10ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} - + - 10 + 350 550 331 171 @@ -900,229 +930,3089 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Voltage [CH 7] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} - + + + + 690 + 10 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH4-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH4-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH4-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH4-SP + + + + + + + [CH4] + + + + + + + [CH4] + + + + + + + + + 690 + 190 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH5-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH5-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH5-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH5-SP + + + + + + + [CH5] + + + + + + + [CH5] + + + + + + + + + 690 + 370 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH6-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH6-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH6-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH6-SP + + + + + + + [CH6] + + + + + + + [CH6] + + + + + + + + + 690 + 550 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH7-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH7-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH7-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH7-SP + + + + + + + [CH7] + + + + + + + [CH7] + + + + + + + + + + + 10 + 10 + 421 + 311 + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + RtmLampPIOLDacCntMax: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + + + + + + + RtmLampDacDataFromWb: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + ACQSamplesPost: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + ACQTriggerRep: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQShots-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQShots-SP + + + + + + + ACQSamplesPre: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + + + ACQTrigger: + + + + + + + ACQShots: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampStatus-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + + + + + + + ACQChannel: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + ACQTriggerEvent: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + + + + + + + RtmLampPISPLimInf: + + + + + + + RtmLampStatus: + + + + + + + + + 10 + 340 + 431 + 431 + + + + 2 + + + + CH 0 + + - 350 - 550 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH11ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP + + + + - + - Current | Voltage [channels 4~7] + CH 1 - - - - 10 - 10 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99: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 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP + + + + - + + + + CH 2 + + - 10 - 370 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP + + + + - + + + + CH 3 + + - 10 - 550 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP + + + + - + + + + CH 4 + + - 350 - 10 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH12ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP + + + + - + + + + CH 5 + + - 350 - 190 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH13ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP + + + + - + + + + CH 6 + + - 350 - 370 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH14ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP + + + + - + + + + CH 7 + + - 350 - 550 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP + + + + + tabWidget_2 tabWidget - gridLayoutWidget_2 horizontalLayoutWidget + gridLayoutWidget @@ -1149,3 +4039,4 @@ + diff --git a/scripts/pydm_test/run_test_homolog.sh b/scripts/pydm_test/run_test_homolog.sh deleted file mode 100755 index dd5314e..0000000 --- a/scripts/pydm_test/run_test_homolog.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -pydm --hide-nav-bar --hide-menu-bar --hide-status-bar rtm_test_homolog.ui From d9dadfb165f5753cbbd39f323046cd74b7cef836 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Sat, 15 Jan 2022 15:06:48 -0300 Subject: [PATCH 31/42] Revert "FOFBApp and iocBoot: add pvs per channel" This reverts commit 40cc4e83cadbfaf339d508c8031bcdd162c02927. --- scripts/pydm_test/rtm_test_homolog.ui | 1151 ++++++ scripts/pydm_test/rtm_test_minicrate.ui | 4589 +++++------------------ scripts/pydm_test/run_test_homolog.sh | 3 + 3 files changed, 2003 insertions(+), 3740 deletions(-) create mode 100644 scripts/pydm_test/rtm_test_homolog.ui create mode 100755 scripts/pydm_test/run_test_homolog.sh diff --git a/scripts/pydm_test/rtm_test_homolog.ui b/scripts/pydm_test/rtm_test_homolog.ui new file mode 100644 index 0000000..24898f5 --- /dev/null +++ b/scripts/pydm_test/rtm_test_homolog.ui @@ -0,0 +1,1151 @@ + + + Dialog + + + + 0 + 0 + 1125 + 789 + + + + Dialog + + + + + 10 + 10 + 391 + 751 + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + + + RtmLampDacData: + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + ACQChannel: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpIFlagL-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampStatus-SP + + + + + + + ACQTrigger: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampDacWr-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPISP-SP + + + + + + + RtmLampPITI: + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + RtmLampStatus: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + + + + + + + ACQShots: + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + RtmLampPISP: + + + + + + + RtmLampAmpEn: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpEn-SP + + + + + + + ACQSamplesPre: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpTFlagL-SP + + + + + + + RtmLampDacDataFromWb: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpTFlagR-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIKP-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampDacData-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampDacData-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP + + + + + + + ACQTriggerRep: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPISP-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPITI-SP + + + + + + + ACQTriggerEvent: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQTrigger-Sel + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpIFlagR-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampStatus-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQTrigger-Sel + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIEn-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpTFlagR-SP + + + + + + + RtmLampPIEn: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampDacWr-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIKP-SP + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpEn-SP + + + + + + + RtmLampPISPLimInf: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPISPLimInf-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIEn-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPISPSquareEn-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPISPSquareEn-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQShots-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPISPLimInf-SP + + + + + + + RtmLampPIOLDacCntMax: + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQSamplesPost-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + RtmLampDacWr: + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpTFlagL-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpIFlagL-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampAmpIFlagR-SP + + + + + + + ACQSamplesPost: + + + + + + + RtmLampPIKP: + + + + + + + + + + SI-22:DI-FOFBCtrl:RtmLampPITI-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQShots-SP + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQSamplesPost-SP + + + + + + + + + 930 + 10 + 175 + 31 + + + + + + + ACQStatus: + + + + + + + + + + SI-22:DI-FOFBCtrl:ACQStatus-Sts + + + + + + + + + 410 + 10 + 701 + 761 + + + + 0 + + + + Current | Voltage [channels 0~3] + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH8ArrayData", "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} + + + + + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH1ArrayData", "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} + + + + + {"y_channel": "SI-22: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 + 370 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH2ArrayData", "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} + + + + + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH10ArrayData", "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} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH11ArrayData", "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] + + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22: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} + + + + + {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + + tabWidget + gridLayoutWidget_2 + horizontalLayoutWidget + + + + 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/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index 1e457b5..717fb8d 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -6,4013 +6,1123 @@ 0 0 - 1399 - 776 + 1125 + 789 Dialog - + - 930 + 10 10 - 175 - 31 + 391 + 751 - - - + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + - ACQStatus: + RtmLampDacData: - - + + + + RtmLampAmpTFlagR: + + + + + - XX-99SL01:DI-FOFBCtrl:ACQStatus-Sts + SI-99:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + RtmLampPIOLTriangEn: - - - - - - 440 - 10 - 1041 - 761 - - - - 1 - - - - Current | Voltage [Channels 0~3] - - - - - 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} - - - - - - - 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} - - - - - - - 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 - 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} - - - - - - - 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} - - - - - - - 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} - - - - - - - 690 - 10 - 254 - 171 - - - - - - - Amplifier Overcurrent - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH0-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH0-SP - - - - - - - - - - - - - - Amplifier Overtermperature - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH0-SP - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH0-SP - - - - - - - [CH0] - - - - - - - [CH0] - - - - - - - - - 690 - 190 - 254 - 171 - - - - - - - Amplifier Overcurrent - - - - - - - [CH1] - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH1-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH1-SP - - - - - - - - - - - - - - Amplifier Overtermperature - - - - - - - [CH1] - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH1-SP - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH1-SP - - - - - - - - - 690 - 370 - 254 - 171 - - - - - - - Amplifier Overcurrent - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH2-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH2-SP - - - - - - - - - - - - - - Amplifier Overtermperature - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH2-SP - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH2-SP - - - - - - - [CH2] - - - - - - - [CH2] - - - - - - - - - 690 - 550 - 254 - 171 - - - - - - - Amplifier Overcurrent - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH3-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH3-SP - - - - - - - - - - - - - - Amplifier Overtermperature - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH3-SP - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH3-SP - - - - - - - [CH3] - - - - - - - [CH3] - - - - - - - - - Current | Voltage [Channels 4~7] - - - - - 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} - - - - - - - 690 - 10 - 254 - 171 - - - - - - - Amplifier Overcurrent - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH4-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH4-SP - - - - - - - - - - - - - - Amplifier Overtermperature - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH4-SP - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH4-SP - - - - - - - [CH4] - - - - - - - [CH4] - - - - - - - - - 690 - 190 - 254 - 171 - - - - - - - Amplifier Overcurrent - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH5-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH5-SP - - - - - - - - - - - - - - Amplifier Overtermperature - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH5-SP - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH5-SP - - - - - - - [CH5] - - - - - - - [CH5] - - - - - - - - - 690 - 370 - 254 - 171 - - - - - - - Amplifier Overcurrent - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH6-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH6-SP - - - - - - - - - - - - - - Amplifier Overtermperature - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH6-SP - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH6-SP - - - - - - - [CH6] - - - - - - - [CH6] - - - - - - - - - 690 - 550 - 254 - 171 - - - - - - - Amplifier Overcurrent - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH7-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH7-SP - - - - - - - - - - - - - - Amplifier Overtermperature - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH7-SP - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH7-SP - - - - - - - [CH7] - - - - - - - [CH7] - - - - - - - - - - - 10 - 10 - 421 - 311 - - - + + + + + + SI-99:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + ACQChannel: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampAmpIFlagL-SP + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampStatus-SP + + + + + + + ACQTrigger: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampDacWr-SP + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPISP-SP + + + + + + + RtmLampPITI: + + + + + + + + + + SI-99:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + RtmLampStatus: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + + + + + + + ACQShots: + + + + + + + RtmLampPISPSquareEn: + + + + - XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + SI-99:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + RtmLampPISP: + + + + + + + RtmLampAmpEn: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampAmpEn-SP + + + + + + + ACQSamplesPre: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampAmpTFlagL-SP + + + + + + + RtmLampDacDataFromWb: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampAmpTFlagR-SP + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPIKP-SP + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampDacData-SP + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampDacData-SP + + + + + + + + + + SI-99:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP + + + + + + + ACQTriggerRep: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPISP-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPITI-SP + + + + + + + ACQTriggerEvent: + + + + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - RtmLampPIOLDacCntMax: + + + + + + + SI-99:DI-FOFBCtrl:ACQTrigger-Sel - - + + - XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + SI-99:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - RtmLampDacDataFromWb: + + + + + + + SI-99:DI-FOFBCtrl:RtmLampStatus-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + SI-99:DI-FOFBCtrl:ACQTrigger-Sel - - + + - XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + SI-99:DI-FOFBCtrl:RtmLampPIEn-SP - - + + - XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + SI-99:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - + + + + RtmLampPIEn: + + + + + - XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + SI-99:DI-FOFBCtrl:RtmLampDacWr-SP - - + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPIKP-SP + + + + + - ACQSamplesPost: + RtmLampAmpTFlagL: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + SI-99:DI-FOFBCtrl:ACQTriggerEvent-Sel - - + + - XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + SI-99:DI-FOFBCtrl:RtmLampAmpEn-SP - - + + - ACQTriggerRep: + RtmLampPISPLimInf: - - + + - XX-99SL01:DI-FOFBCtrl:ACQShots-SP + SI-99:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - + + - XX-99SL01:DI-FOFBCtrl:ACQShots-SP + SI-99:DI-FOFBCtrl:RtmLampPIEn-SP - - - - ACQSamplesPre: + + + + + + + SI-99:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + SI-99:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - + + - XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + SI-99:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - + + - XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + SI-99:DI-FOFBCtrl:ACQTriggerRep-Sel - + + + + + + + SI-99:DI-FOFBCtrl:ACQShots-SP + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + SI-99:DI-FOFBCtrl:RtmLampPISPLimInf-SP + + + + + + + RtmLampPIOLDacCntMax: - + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + SI-99:DI-FOFBCtrl:ACQSamplesPost-SP - - + + + + + + + SI-99:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + - ACQTrigger: + RtmLampAmpIFlagR: - - + + - ACQShots: + RtmLampDacWr: - - + + + + RtmLampAmpIFlagL: + + + + + - XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + SI-99:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampStatus-SP + SI-99:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - + + - XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + SI-99:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - + + - XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + SI-99:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - + + - ACQChannel: + ACQSamplesPost: - - + + + + RtmLampPIKP: + + + + + - XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + SI-99:DI-FOFBCtrl:RtmLampPITI-SP - - - - ACQTriggerEvent: + + + + + + + SI-99:DI-FOFBCtrl:ACQChannel-Sel - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + SI-99:DI-FOFBCtrl:ACQShots-SP - - - - RtmLampPISPLimInf: + + + + + + + SI-99:DI-FOFBCtrl:ACQSamplesPost-SP - - + + + + + + 930 + 10 + 175 + 31 + + + + + - RtmLampStatus: + ACQStatus: + + + + + + + + + + SI-99:DI-FOFBCtrl:ACQStatus-Sts - + - 10 - 340 - 431 - 431 + 410 + 10 + 701 + 761 - 2 + 0 - + - CH 0 + Current | Voltage [channels 0~3] - + + + + 10 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99: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} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH8ArrayData", "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} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH1ArrayData", "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} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH9ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + - 0 - 0 - 421 - 401 + 10 + 370 + 331 + 171 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP - - - - - - - RtmLampPIKP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP - - - - - - - RtmLampDacData: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP - - - - - - - RtmLampAmpEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPITI: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP - - - - - - - RtmLampPISP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP - - - - + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + - - - - CH 1 - - + - 0 - 0 - 421 - 401 + 350 + 370 + 331 + 171 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP - - - - - - - RtmLampPIKP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP - - - - - - - RtmLampDacData: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP - - - - - - - RtmLampAmpEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPITI: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP - - - - - - - RtmLampPISP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP - - - - + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH10ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + - - - - CH 2 - - + - 0 - 0 - 421 - 401 + 10 + 550 + 331 + 171 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP - - - - - - - RtmLampPIKP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP - - - - - - - RtmLampDacData: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP - - - - - - - RtmLampAmpEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPITI: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP - - - - - - - RtmLampPISP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP - - - - + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + - - - - CH 3 - - + - 0 - 0 - 421 - 401 + 350 + 550 + 331 + 171 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP - - - - - - - RtmLampPIKP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP - - - - - - - RtmLampDacData: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP - - - - - - - RtmLampAmpEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPITI: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP - - - - - - - RtmLampPISP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP - - - - + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH11ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + - + - CH 4 + Current | Voltage [channels 4~7] - + - 0 - 0 - 421 - 401 + 10 + 10 + 331 + 171 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP - - - - - - - RtmLampPIKP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP - - - - - - - RtmLampDacData: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-SP - - - - - - - RtmLampAmpEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPITI: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP - - - - - - - RtmLampPISP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP - - - - + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH4ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + - - - - CH 5 - - + + + + 10 + 190 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + - 0 - 0 - 421 - 401 + 10 + 370 + 331 + 171 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP - - - - - - - RtmLampPIKP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP - - - - - - - RtmLampDacData: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP - - - - - - - RtmLampAmpEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPITI: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP - - - - - - - RtmLampPISP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP - - - - + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + - - - - CH 6 - - + - 0 - 0 - 421 - 401 + 10 + 550 + 331 + 171 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP - - - - - - - RtmLampPIKP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP - - - - - - - RtmLampDacData: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-SP - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP - - - - - - - RtmLampAmpEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPITI: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP - - - - - - - RtmLampPISP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP - - - - + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + - - - - CH 7 - - + + + + 350 + 10 + 331 + 171 + + + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99: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} + + + + + {"y_channel": "SI-99: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} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH14ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + - 0 - 0 - 421 - 401 + 350 + 550 + 331 + 171 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-SP - - - - - - - RtmLampPIKP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP - - - - - - - RtmLampDacData: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP - - - - - - - RtmLampAmpEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP - - - - - - - RtmLampDacWr: - - - - - - - RtmLampPITI: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP - - - - - - - RtmLampPISP: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP - - - - + + + + + + {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + + + + {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + - tabWidget_2 tabWidget + gridLayoutWidget_2 horizontalLayoutWidget - gridLayoutWidget @@ -4039,4 +1149,3 @@ - diff --git a/scripts/pydm_test/run_test_homolog.sh b/scripts/pydm_test/run_test_homolog.sh new file mode 100755 index 0000000..dd5314e --- /dev/null +++ b/scripts/pydm_test/run_test_homolog.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +pydm --hide-nav-bar --hide-menu-bar --hide-status-bar rtm_test_homolog.ui From caea392870fb9cbfe519e9d23161a3c74ad23e53 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Sat, 15 Jan 2022 15:08:15 -0300 Subject: [PATCH 32/42] scripts: update graphical interface with pvs per channel --- scripts/pydm_test/rtm_test_homolog.ui | 1151 ------ scripts/pydm_test/rtm_test_minicrate.ui | 4659 ++++++++++++++++++----- scripts/pydm_test/run_test_homolog.sh | 3 - 3 files changed, 3775 insertions(+), 2038 deletions(-) delete mode 100644 scripts/pydm_test/rtm_test_homolog.ui delete mode 100755 scripts/pydm_test/run_test_homolog.sh diff --git a/scripts/pydm_test/rtm_test_homolog.ui b/scripts/pydm_test/rtm_test_homolog.ui deleted file mode 100644 index 24898f5..0000000 --- a/scripts/pydm_test/rtm_test_homolog.ui +++ /dev/null @@ -1,1151 +0,0 @@ - - - Dialog - - - - 0 - 0 - 1125 - 789 - - - - Dialog - - - - - 10 - 10 - 391 - 751 - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - RtmLampDacData: - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQSamplesPre-SP - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQChannel-Sel - - - - - - - ACQChannel: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampStatus-SP - - - - - - - ACQTrigger: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacWr-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISP-SP - - - - - - - RtmLampPITI: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - RtmLampStatus: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - - - - - - ACQShots: - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQSamplesPre-SP - - - - - - - RtmLampPISP: - - - - - - - RtmLampAmpEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpEn-SP - - - - - - - ACQSamplesPre: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - - - - - - RtmLampDacDataFromWb: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIKP-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacData-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacData-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTriggerEvent-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - - - - ACQTriggerRep: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISP-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPITI-SP - - - - - - - ACQTriggerEvent: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTrigger-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampStatus-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTrigger-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - - - - - - RtmLampPIEn: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacWr-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIKP-SP - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTriggerEvent-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpEn-SP - - - - - - - RtmLampPISPLimInf: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQShots-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - - - - - - RtmLampPIOLDacCntMax: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQSamplesPost-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - RtmLampDacWr: - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - - - - ACQSamplesPost: - - - - - - - RtmLampPIKP: - - - - - - - - - - SI-22:DI-FOFBCtrl:RtmLampPITI-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQChannel-Sel - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQShots-SP - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQSamplesPost-SP - - - - - - - - - 930 - 10 - 175 - 31 - - - - - - - ACQStatus: - - - - - - - - - - SI-22:DI-FOFBCtrl:ACQStatus-Sts - - - - - - - - - 410 - 10 - 701 - 761 - - - - 0 - - - - Current | Voltage [channels 0~3] - - - - - 10 - 10 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH8ArrayData", "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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH1ArrayData", "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} - - - - - {"y_channel": "SI-22: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 - 370 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH2ArrayData", "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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH10ArrayData", "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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH11ArrayData", "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] - - - - - 10 - 10 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22: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} - - - - - {"y_channel": "SI-22:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - - - - - tabWidget - gridLayoutWidget_2 - horizontalLayoutWidget - - - - 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/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index 717fb8d..1e457b5 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -6,700 +6,13 @@ 0 0 - 1125 - 789 + 1399 + 776 Dialog - - - - 10 - 10 - 391 - 751 - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - RtmLampDacData: - - - - - - - RtmLampAmpTFlagR: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQSamplesPre-SP - - - - - - - RtmLampPIOLTriangEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQChannel-Sel - - - - - - - ACQChannel: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampStatus-SP - - - - - - - ACQTrigger: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacWr-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISP-SP - - - - - - - RtmLampPITI: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - RtmLampStatus: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - - - - - - ACQShots: - - - - - - - RtmLampPISPSquareEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQSamplesPre-SP - - - - - - - RtmLampPISP: - - - - - - - RtmLampAmpEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpEn-SP - - - - - - - ACQSamplesPre: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - - - - - - RtmLampDacDataFromWb: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIKP-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacData-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacData-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTriggerEvent-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - - - - ACQTriggerRep: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISP-SP - - - - - - - RtmLampPIOLSquareEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPITI-SP - - - - - - - ACQTriggerEvent: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLSquareEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTrigger-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampStatus-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTrigger-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpTFlagR-SP - - - - - - - RtmLampPIEn: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacWr-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIKP-SP - - - - - - - RtmLampAmpTFlagL: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTriggerEvent-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpEn-SP - - - - - - - RtmLampPISPLimInf: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISPSquareEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQShots-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - - - - - - RtmLampPIOLDacCntMax: - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQSamplesPost-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - RtmLampAmpIFlagR: - - - - - - - RtmLampDacWr: - - - - - - - RtmLampAmpIFlagL: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPIOLTriangEn-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpTFlagL-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpIFlagL-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampAmpIFlagR-SP - - - - - - - ACQSamplesPost: - - - - - - - RtmLampPIKP: - - - - - - - - - - SI-99:DI-FOFBCtrl:RtmLampPITI-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQChannel-Sel - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQShots-SP - - - - - - - - - - SI-99:DI-FOFBCtrl:ACQSamplesPost-SP - - - - - @@ -723,7 +36,7 @@ - SI-99:DI-FOFBCtrl:ACQStatus-Sts + XX-99SL01:DI-FOFBCtrl:ACQStatus-Sts
@@ -732,18 +45,18 @@ - 410 + 440 10 - 701 + 1041 761 - 0 + 1 - Current | Voltage [channels 0~3] + Current | Voltage [Channels 0~3] @@ -762,17 +75,719 @@ {"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} + + + + + + + 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} + + + + + + + 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 + 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} + + + + + + + 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} + + + + + + + 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} + + + + + + + 690 + 10 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH0-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH0-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH0-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH0-SP + + + + + + + [CH0] + + + + + + + [CH0] + + + + + + + + + 690 + 190 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + [CH1] + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH1-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH1-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + [CH1] + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH1-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH1-SP + + + + + + + + + 690 + 370 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH2-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH2-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH2-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH2-SP + + + + + + + [CH2] + + + + + + + [CH2] + + + + + + + + + 690 + 550 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH3-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH3-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH3-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH3-SP + + + + + + + [CH3] + + + + + + + [CH3] + + + + + + + + + Current | Voltage [Channels 4~7] + + + + + 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": "SI-99:DI-FOFBCtrl:GEN_CH0ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} - + - 350 - 10 + 10 + 370 331 171 @@ -785,17 +800,20 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Current [CH 6] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH8ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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 - 190 + 550 331 171 @@ -808,17 +826,20 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Current [CH 7] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH1ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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 - 190 + 10 331 171 @@ -831,17 +852,20 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Voltage [CH 4] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH9ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} - + - 10 - 370 + 350 + 190 331 171 @@ -854,13 +878,16 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Voltage [CH 5] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH2ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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 @@ -877,16 +904,19 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Voltage [CH 6] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH10ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} - + - 10 + 350 550 331 171 @@ -900,229 +930,3089 @@ {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} + + Voltage [CH 7] + - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH3ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} - + + + + 690 + 10 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH4-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH4-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH4-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH4-SP + + + + + + + [CH4] + + + + + + + [CH4] + + + + + + + + + 690 + 190 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH5-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH5-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH5-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH5-SP + + + + + + + [CH5] + + + + + + + [CH5] + + + + + + + + + 690 + 370 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH6-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH6-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH6-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH6-SP + + + + + + + [CH6] + + + + + + + [CH6] + + + + + + + + + 690 + 550 + 254 + 171 + + + + + + + Amplifier Overcurrent + + + + + + + RtmLampAmpIFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH7-SP + + + + + + + RtmLampAmpIFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH7-SP + + + + + + + + + + + + + + Amplifier Overtermperature + + + + + + + RtmLampAmpTFlagL: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH7-SP + + + + + + + RtmLampAmpTFlagR: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH7-SP + + + + + + + [CH7] + + + + + + + [CH7] + + + + + + + + + + + 10 + 10 + 421 + 311 + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + RtmLampPIOLDacCntMax: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + + + + + + + RtmLampDacDataFromWb: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + ACQSamplesPost: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + + + + + + + ACQTriggerRep: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQShots-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQShots-SP + + + + + + + ACQSamplesPre: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + + + + + + + ACQTrigger: + + + + + + + ACQShots: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampStatus-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + + + + + + + ACQChannel: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + + + + + + + ACQTriggerEvent: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + + + + + + + RtmLampPISPLimInf: + + + + + + + RtmLampStatus: + + + + + + + + + 10 + 340 + 431 + 431 + + + + 2 + + + + CH 0 + + - 350 - 550 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH11ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP + + + + - + - Current | Voltage [channels 4~7] + CH 1 - - - - 10 - 10 - 331 - 171 - - - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99: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 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH5ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP + + + + - + + + + CH 2 + + - 10 - 370 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH6ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP + + + + - + + + + CH 3 + + - 10 - 550 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH7ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP + + + + - + + + + CH 4 + + - 350 - 10 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH12ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP + + + + - + + + + CH 5 + + - 350 - 190 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH13ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP + + + + - + + + + CH 6 + + - 350 - 370 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH14ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP + + + + - + + + + CH 7 + + - 350 - 550 - 331 - 171 + 0 + 0 + 421 + 401 - - - - - - {"name": "Axis 1", "orientation": "left", "minRange": -1.0, "maxRange": 1.0, "autoRange": true} - - - - - {"y_channel": "SI-99:DI-FOFBCtrl:GEN_CH15ArrayData", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} - - + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-SP + + + + + + + RtmLampPIKP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP + + + + + + + RtmLampDacData: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP + + + + + + + RtmLampPISPSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP + + + + + + + RtmLampPIEn: + + + + + + + RtmLampPIOLTriangEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP + + + + + + + RtmLampAmpEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP + + + + + + + RtmLampDacWr: + + + + + + + RtmLampPITI: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP + + + + + + + RtmLampPIOLSquareEn: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP + + + + + + + RtmLampPISP: + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP + + + + + tabWidget_2 tabWidget - gridLayoutWidget_2 horizontalLayoutWidget + gridLayoutWidget @@ -1149,3 +4039,4 @@ + diff --git a/scripts/pydm_test/run_test_homolog.sh b/scripts/pydm_test/run_test_homolog.sh deleted file mode 100755 index dd5314e..0000000 --- a/scripts/pydm_test/run_test_homolog.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -pydm --hide-nav-bar --hide-menu-bar --hide-status-bar rtm_test_homolog.ui From 80f151fedf49356e758b294b1c26f219884542fd Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Mon, 17 Jan 2022 16:51:57 -0300 Subject: [PATCH 33/42] scripts/pydm: update pv names in graphical interface --- scripts/pydm_test/rtm_test_minicrate.ui | 530 +++++++++++------------- 1 file changed, 237 insertions(+), 293 deletions(-) diff --git a/scripts/pydm_test/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index 1e457b5..b96cc19 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -283,6 +283,13 @@ + + + + [CH0] + + + @@ -296,7 +303,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH0-RB @@ -313,69 +320,55 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH0-RB - + - + Amplifier Overtermperature - - + + - Amplifier Overtermperature + [CH0] - + RtmLampAmpTFlagL: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH0-RB - + RtmLampAmpTFlagR: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH0-SP - - - - - - - [CH0] - - - - - - - [CH0] + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH0-RB @@ -418,7 +411,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH1-RB @@ -435,62 +428,55 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH1-RB - - - - - - - Amplifier Overtermperature - + [CH1] - + RtmLampAmpTFlagL: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH1-RB - + RtmLampAmpTFlagR: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH1-RB @@ -513,6 +499,13 @@ + + + + [CH2] + + + @@ -526,7 +519,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH2-RB @@ -543,69 +536,55 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH2-RB - + - + Amplifier Overtermperature - - + + - Amplifier Overtermperature + [CH2] - + RtmLampAmpTFlagL: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH2-RB - + RtmLampAmpTFlagR: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH2-SP - - - - - - - [CH2] - - - - - - - [CH2] + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH2-RB @@ -628,6 +607,13 @@ + + + + [CH3] + + + @@ -641,7 +627,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH3-RB @@ -658,69 +644,55 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH3-RB - + - + Amplifier Overtermperature - - + + - Amplifier Overtermperature + [CH3] - + RtmLampAmpTFlagL: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH3-RB - + RtmLampAmpTFlagR: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH3-SP - - - - - - - [CH3] - - - - - - - [CH3] + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH3-RB @@ -956,6 +928,13 @@ + + + + [CH4] + + + @@ -969,7 +948,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH4-RB @@ -986,69 +965,55 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH4-RB - + - + Amplifier Overtermperature - - + + - Amplifier Overtermperature + [CH4] - + RtmLampAmpTFlagL: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH4-RB - + RtmLampAmpTFlagR: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH4-SP - - - - - - - [CH4] - - - - - - - [CH4] + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH4-RB @@ -1071,6 +1036,13 @@ + + + + [CH5] + + + @@ -1084,7 +1056,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH5-RB @@ -1101,69 +1073,55 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH5-RB - + - + Amplifier Overtermperature - - + + - Amplifier Overtermperature + [CH5] - + RtmLampAmpTFlagL: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH5-RB - + RtmLampAmpTFlagR: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH5-SP - - - - - - - [CH5] - - - - - - - [CH5] + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH5-RB @@ -1186,6 +1144,13 @@ + + + + [CH6] + + + @@ -1199,7 +1164,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH6-RB @@ -1216,69 +1181,55 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH6-RB - + - + Amplifier Overtermperature - - + + - Amplifier Overtermperature + [CH6] - + RtmLampAmpTFlagL: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH6-RB - + RtmLampAmpTFlagR: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH6-SP - - - - - - - [CH6] - - - - - - - [CH6] + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH6-RB @@ -1301,6 +1252,13 @@ + + + + [CH7] + + + @@ -1314,7 +1272,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagLCH7-RB @@ -1331,69 +1289,55 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpIFlagRCH7-RB - + - + Amplifier Overtermperature - - + + - Amplifier Overtermperature + [CH7] - + RtmLampAmpTFlagL: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagLCH7-RB - + RtmLampAmpTFlagR: - + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH7-SP - - - - - - - [CH7] - - - - - - - [CH7] + XX-99SL01:DI-FOFBCtrl:RtmLampAmpTFlagRCH7-RB @@ -1417,7 +1361,7 @@ - XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-RB @@ -1451,7 +1395,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-RB @@ -1471,7 +1415,7 @@ - XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-RB @@ -1498,7 +1442,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-RB @@ -1525,7 +1469,7 @@ - XX-99SL01:DI-FOFBCtrl:ACQShots-SP + XX-99SL01:DI-FOFBCtrl:ACQShots-RB @@ -1582,7 +1526,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-RB
@@ -1626,7 +1570,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampStatus-SP + XX-99SL01:DI-FOFBCtrl:RtmLampStatus-RB
@@ -1710,7 +1654,7 @@ - 2 + 7 @@ -1759,7 +1703,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-RB @@ -1769,7 +1713,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-RB
@@ -1796,7 +1740,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-RB
@@ -1806,7 +1750,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-RB
@@ -1843,7 +1787,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-RB
@@ -1867,7 +1811,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-RB
@@ -1894,7 +1838,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-RB
@@ -1945,7 +1889,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-RB
@@ -1982,7 +1926,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-RB
@@ -1992,7 +1936,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-RB
@@ -2046,7 +1990,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-RB
@@ -2056,7 +2000,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-RB
@@ -2083,7 +2027,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-RB
@@ -2093,7 +2037,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-RB
@@ -2130,7 +2074,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-RB
@@ -2154,7 +2098,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-RB @@ -2181,7 +2125,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-RB @@ -2232,7 +2176,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-RB @@ -2269,7 +2213,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-RB @@ -2279,7 +2223,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-RB @@ -2333,7 +2277,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-RB @@ -2343,7 +2287,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-RB @@ -2370,7 +2314,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-RB @@ -2380,7 +2324,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-RB @@ -2417,7 +2361,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-RB @@ -2441,7 +2385,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-RB @@ -2468,7 +2412,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-RB @@ -2519,7 +2463,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-RB @@ -2556,7 +2500,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-RB @@ -2566,7 +2510,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-RB @@ -2620,7 +2564,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-RB @@ -2630,7 +2574,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-RB @@ -2657,7 +2601,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-RB @@ -2667,7 +2611,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-RB @@ -2704,7 +2648,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-RB @@ -2728,7 +2672,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-RB @@ -2755,7 +2699,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-RB @@ -2806,7 +2750,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-RB @@ -2843,7 +2787,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-RB @@ -2853,7 +2797,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-RB @@ -2907,7 +2851,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-RB @@ -2917,7 +2861,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-RB @@ -2944,7 +2888,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-RB @@ -2954,7 +2898,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-RB @@ -2991,7 +2935,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-RB @@ -3015,7 +2959,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-RB @@ -3042,7 +2986,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-RB @@ -3093,7 +3037,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-RB @@ -3130,7 +3074,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-RB @@ -3140,7 +3084,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-RB @@ -3194,7 +3138,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-RB @@ -3204,7 +3148,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-RB @@ -3231,7 +3175,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-RB @@ -3241,7 +3185,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-RB @@ -3278,7 +3222,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-RB @@ -3302,7 +3246,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-RB @@ -3329,7 +3273,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-RB @@ -3380,7 +3324,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-RB @@ -3417,7 +3361,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-RB @@ -3427,7 +3371,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-RB @@ -3481,7 +3425,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-RB @@ -3491,7 +3435,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-RB @@ -3518,7 +3462,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-RB @@ -3528,7 +3472,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-RB @@ -3565,7 +3509,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-RB @@ -3589,7 +3533,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-RB @@ -3616,7 +3560,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-RB @@ -3667,7 +3611,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-RB @@ -3704,7 +3648,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-RB @@ -3714,7 +3658,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-RB @@ -3768,7 +3712,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-RB @@ -3778,7 +3722,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-RB @@ -3805,7 +3749,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-RB @@ -3815,7 +3759,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-RB @@ -3852,7 +3796,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-RB @@ -3876,7 +3820,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-RB @@ -3903,7 +3847,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-RB @@ -3954,7 +3898,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-RB @@ -3991,7 +3935,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-RB @@ -4001,7 +3945,7 @@ - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-RB From 69c9d6a723adb927593598a6ba7d02039a3b21a4 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Mon, 17 Jan 2022 16:57:32 -0300 Subject: [PATCH 34/42] FOFBApp and iocBoot: update update rtm_lamp pvs and parameters --- .../Db/{FOFB.template => FOFBRtm.template} | 4 -- FOFBApp/Db/FOFBRtm_settings.req | 15 +++++++ FOFBApp/Db/FOFB_settings.req | 36 +++++++--------- FOFBApp/src/drvFOFB.cpp | 41 ++++++++++--------- FOFBApp/src/drvFOFB.h | 2 + iocBoot/iocFOFB/stFOFB.cmd | 24 +++++------ iocBoot/iocFOFB/waveformPlugins.cmd | 4 -- scripts/systemd/etc/sysconfig/fofb-epics-ioc | 2 +- 8 files changed, 66 insertions(+), 62 deletions(-) rename FOFBApp/Db/{FOFB.template => FOFBRtm.template} (99%) create mode 100644 FOFBApp/Db/FOFBRtm_settings.req diff --git a/FOFBApp/Db/FOFB.template b/FOFBApp/Db/FOFBRtm.template similarity index 99% rename from FOFBApp/Db/FOFB.template rename to FOFBApp/Db/FOFBRtm.template index 4875bb9..4d06fc7 100644 --- a/FOFBApp/Db/FOFB.template +++ b/FOFBApp/Db/FOFBRtm.template @@ -6,10 +6,6 @@ # Created Dez. 03, 2021 # -############################ -# RTM LAMP parameters -############################ - record(longout,"$(P)$(R)RtmLampStatus-SP"){ field(DTYP,"asynUInt32Digital") field(DESC,"set RTM LAMP status register") diff --git a/FOFBApp/Db/FOFBRtm_settings.req b/FOFBApp/Db/FOFBRtm_settings.req new file mode 100644 index 0000000..6c0a5d8 --- /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 + + diff --git a/FOFBApp/Db/FOFB_settings.req b/FOFBApp/Db/FOFB_settings.req index 9e11bb2..7e9b537 100644 --- a/FOFBApp/Db/FOFB_settings.req +++ b/FOFBApp/Db/FOFB_settings.req @@ -57,26 +57,18 @@ file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=21, TRIGGER_NA 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 -######################### -# RTM LAMP parameters -######################### - -$(P)$(R)RtmLampStatus-SP -$(P)$(R)RtmLampDacDataFromWb-SP -$(P)$(R)RtmLampAmpIFlagL$(RTM_CHAN)-SP -$(P)$(R)RtmLampAmpTFlagL$(RTM_CHAN)-SP -$(P)$(R)RtmLampAmpIFlagR$(RTM_CHAN)-SP -$(P)$(R)RtmLampAmpTFlagR$(RTM_CHAN)-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 +# RTM LAMP +file "FOFBRtm_settings.req", P=$(P), R=$(R) +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 diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index ac69b68..2d285d7 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -581,24 +581,6 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, } /* Set the initial values of some parameters */ - 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_AdcRate, ADC_RATE_FACTOR, 0xFFFFFFFF); setUIntDigitalParam(P_TbtRate, TBT_RATE_FACTOR, 0xFFFFFFFF); setUIntDigitalParam(P_FofbRate, FOFB_RATE_FACTOR, 0xFFFFFFFF); @@ -609,8 +591,29 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, /* Set acquisition parameters */ + setIntegerParam( P_FOFBStatus, FOFBStatusIdle); + setUIntDigitalParam(P_RtmLampStatus, 0, 0xFFFFFFFF); + setUIntDigitalParam(P_RtmLampDacDataFromWb, 0, 0xFFFFFFFF); + setUIntDigitalParam(P_RtmLampPIOLDacCntMax, 0, 0xFFFFFFFF); + setUIntDigitalParam(P_RtmLampPISPLimInf, 0, 0xFFFFFFFF); + for (int addr = 0; addr < NUM_ACQ_CORES_PER_FOFB; ++addr) { - setIntegerParam(addr, P_FOFBStatus, FOFBStatusIdle); + 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); + 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 < NUM_ACQ_CORES_PER_FOFB; ++addr) { diff --git a/FOFBApp/src/drvFOFB.h b/FOFBApp/src/drvFOFB.h index d41e644..6f039aa 100644 --- a/FOFBApp/src/drvFOFB.h +++ b/FOFBApp/src/drvFOFB.h @@ -150,6 +150,8 @@ typedef enum { #define FOFB_NUMBER_MIN 1 #define FOFB_NUMBER_MAX MAX_FOFBS +#define MAX_RTM_LAMP_CHANNELS 12 + /* FOFB Channel structure */ typedef struct { /* HW channel mapping. -1 means not available */ diff --git a/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index c17d3b6..4ff35a5 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -21,18 +21,18 @@ FOFB_registerRecordDeviceDriver (pdbbase) 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}, RTM_CHAN=CH0, PORT=$(PORT), ADDR=0, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH1, PORT=$(PORT), ADDR=1, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH2, PORT=$(PORT), ADDR=2, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH3, PORT=$(PORT), ADDR=3, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH4, PORT=$(PORT), ADDR=4, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH5, PORT=$(PORT), ADDR=5, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH6, PORT=$(PORT), ADDR=6, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH7, PORT=$(PORT), ADDR=7, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH8, PORT=$(PORT), ADDR=8, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH9, PORT=$(PORT), ADDR=9, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.template", "P=${P}, R=${R}, RTM_CHAN=CH10, PORT=$(PORT), ADDR=10, TIMEOUT=1") -dbLoadRecords("${TOP}/FOFBApp/Db/FOFB.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=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("$(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") diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd index 17da475..0f776d4 100644 --- a/iocBoot/iocFOFB/waveformPlugins.cmd +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -48,7 +48,3 @@ dbLoadRecords("$(AREA_DETECTOR_COMPAT)/db/NDStdArrays.template", "P=${P},R=${R}G 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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -##################### FOFB configuration ########################## - -dbLoadRecords("${TOP}/db/FOFB.template", "P=${P}, R=${R}, PORT=$(PORT), ADDR=0, TIMEOUT=1") - 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 From 822a1c7e70547a33461986dc94e3766a9c0edbdc Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 18 Jan 2022 14:45:41 -0300 Subject: [PATCH 35/42] FOFBApp and scripts: update pv names in graphical interface --- FOFBApp/src/drvFOFB.cpp | 46 +++++++++++++------------ scripts/pydm_test/rtm_test_minicrate.ui | 41 +++++++++++----------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/FOFBApp/src/drvFOFB.cpp b/FOFBApp/src/drvFOFB.cpp index 2d285d7..ef05855 100644 --- a/FOFBApp/src/drvFOFB.cpp +++ b/FOFBApp/src/drvFOFB.cpp @@ -589,33 +589,35 @@ drvFOFB::drvFOFB(const char *portName, const char *endpoint, int fofbNumber, setUIntDigitalParam(P_MonitPollTime, 4, 0xFFFFFFFF); // 4ms = 250 Hz setIntegerParam(P_MonitEnable, 0); // Disable by default - /* Set acquisition parameters */ + setIntegerParam( P_FOFBStatus, FOFBStatusIdle); - setIntegerParam( P_FOFBStatus, FOFBStatusIdle); - setUIntDigitalParam(P_RtmLampStatus, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampDacDataFromWb, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPIOLDacCntMax, 0, 0xFFFFFFFF); - setUIntDigitalParam(P_RtmLampPISPLimInf, 0, 0xFFFFFFFF); + setUIntDigitalParam(P_RtmLampStatus, 0, 0xFFFFFFFF); + setUIntDigitalParam(P_RtmLampDacDataFromWb, 0, 0xFFFFFFFF); + setUIntDigitalParam(P_RtmLampPIOLDacCntMax, 0, 0xFFFFFFFF); + setUIntDigitalParam(P_RtmLampPISPLimInf, 0, 0xFFFFFFFF); for (int addr = 0; addr < NUM_ACQ_CORES_PER_FOFB; ++addr) { - 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); - 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); - } + 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); diff --git a/scripts/pydm_test/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index b96cc19..a8b8056 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -6,7 +6,7 @@ 0 0 - 1399 + 1438 776 @@ -47,7 +47,7 @@ 440 10 - 1041 + 991 761 @@ -271,7 +271,7 @@ 690 10 - 254 + 291 171 @@ -379,7 +379,7 @@ 690 190 - 254 + 291 171 @@ -487,7 +487,7 @@ 690 370 - 254 + 291 171 @@ -595,7 +595,7 @@ 690 550 - 254 + 291 171 @@ -916,7 +916,7 @@ 690 10 - 254 + 291 171 @@ -1024,7 +1024,7 @@ 690 190 - 254 + 291 171 @@ -1132,7 +1132,7 @@ 690 370 - 254 + 291 171 @@ -1240,7 +1240,7 @@ 690 550 - 254 + 291 171 @@ -1351,7 +1351,7 @@ 10 10 421 - 311 + 321 @@ -1654,11 +1654,11 @@ - 7 + 0 - CH 0 + CH0 @@ -1945,7 +1945,7 @@ - CH 1 + CH1 @@ -2232,7 +2232,7 @@ - CH 2 + CH2 @@ -2519,7 +2519,7 @@ - CH 3 + CH3 @@ -2806,7 +2806,7 @@ - CH 4 + CH4 @@ -3093,7 +3093,7 @@ - CH 5 + CH5 @@ -3380,7 +3380,7 @@ - CH 6 + CH6 @@ -3667,7 +3667,7 @@ - CH 7 + CH7 @@ -3983,4 +3983,3 @@ - From c64014a2fee381431a00b918e4c19f4f8a67bd44 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Thu, 20 Jan 2022 16:30:59 -0300 Subject: [PATCH 36/42] FOFBApp and iocBoot: update converted waveforms --- FOFBApp/Db/FOFBData.template | 79 +++++++++++++++++++++++++++-- FOFBApp/Db/FOFBRtm_settings.req | 4 +- FOFBApp/Db/FOFB_settings.req | 2 +- FOFBApp/src/FOFBInclude.dbd | 1 + iocBoot/iocFOFB/stFOFB.cmd | 13 +++++ iocBoot/iocFOFB/waveformPlugins.cmd | 31 ++++++----- 6 files changed, 106 insertions(+), 24 deletions(-) diff --git a/FOFBApp/Db/FOFBData.template b/FOFBApp/Db/FOFBData.template index 40d5781..4c4a90b 100644 --- a/FOFBApp/Db/FOFBData.template +++ b/FOFBApp/Db/FOFBData.template @@ -1,9 +1,9 @@ record(waveform,"$(P)$(R)$(ACQ_NAME)ArrayDataWvf") { field(DESC, "Data waveform $(ACQ_NAME)") - field(NELM,"100000") + field(NELM,"$(NELEMENTS)") field(FTVL, "LONG") - field(TSEL, "$(P)$(R)$(ACQ_NAME)ArrayData.TIME") + field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") field(FLNK, "$(P)$(R)$(ACQ_NAME)ArrayData") } @@ -11,8 +11,8 @@ 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)$(ACQ_NAME)ArrayData.TIME") - field(MALM, "100000") + field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") + field(MALM, "$(NELEMENTS)") field(FTVL, "LONG") field(FLNK, "$(P)$(R)$(ACQ_NAME)ArrayDataSeq") } @@ -22,8 +22,77 @@ record(subArray,"$(P)$(R)$(ACQ_NAME)ArrayData") record(seq, "$(P)$(R)$(ACQ_NAME)ArrayDataSeq"){ field(DESC,"Get NORD from $(ACQ_NAME)$ waveform") field(PINI,"YES") -field(DOL1, "$(P)$(R)$(ACQ_NAME)ArrayData.NORD NPP NMS") +field(DOL1, "$(P)$(R)$(ACQ_NAME)RawArrayData.NORD NPP NMS") field(LNK1, "$(P)$(R)$(ACQ_NAME)ArrayData.NELM PP NMS") field(SELM, "All") } +# Offset and Gain records + +record(ao,"$(P)$(R)RtmLampCurrentOffset$(RTM_CHAN)-SP"){ + field(DTYP,"asynInt32") + field(DESC,"set current offset") + field(PINI,"YES") + field(SCAN,"Passive") + field(PREC,"3") + field(FLNK,"$(P)$(R)$(ACQ_NAME)ConvArrayDataC$(RTM_CHAN) CPP NMS") +} + +record(ao,"$(P)$(R)RtmLampCurrentGain$(RTM_CHAN)-SP"){ + field(DTYP,"asynInt32") + field(DESC,"set current gain") + field(PINI,"YES") + field(SCAN,"Passive") + field(PREC,"3") + 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 current $(ACQ_NAME)Conv") + field(DTYP, "Soft Channel") + field(NELM, "1000") + field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") + field(PINI, "YES") + field(SCAN, "Passive") + field(INPA, "$(P)$(R)RtmLampCurrentGain$(RTM_CHAN)-SP") + field(INPB, "$(P)$(R)RtmLampCurrentOffset$(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, "Current calibrated waveform $(ACQ_NAME)$(RTM_CHAN)") + field(NELM, "1000") + field(FTVL, "$(FTVL)") + field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") + field(FLNK, "$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN) PP") + } + +record(subArray,"$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN)") +{ + field(DESC, "Current calibrated $(ACQ_NAME)") +# field(SDIS, "$(P)$(R)PosCal-Sts CPP NMS") +# field(DISV, "1") + field(INP, "$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN) NPP NMS") + field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.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)$(ACQ_NAME)RawArrayData.NORD NPP NMS") + field(LNK1, "$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN).NELM PP NMS") + field(SELM, "All") +} + diff --git a/FOFBApp/Db/FOFBRtm_settings.req b/FOFBApp/Db/FOFBRtm_settings.req index 6c0a5d8..cb91db7 100644 --- a/FOFBApp/Db/FOFBRtm_settings.req +++ b/FOFBApp/Db/FOFBRtm_settings.req @@ -11,5 +11,5 @@ $(P)$(R)RtmLampPITI$(RTM_CHAN)-SP $(P)$(R)RtmLampPISP$(RTM_CHAN)-SP $(P)$(R)RtmLampPIOLDacCntMax-SP $(P)$(R)RtmLampPISPLimInf-SP - - +$(P)$(R)RtmLampCurrentGain$(RTM_CHAN)-SP +$(P)$(R)RtmLampCurrentOffset$(RTM_CHAN)-SP diff --git a/FOFBApp/Db/FOFB_settings.req b/FOFBApp/Db/FOFB_settings.req index 7e9b537..15eb0a6 100644 --- a/FOFBApp/Db/FOFB_settings.req +++ b/FOFBApp/Db/FOFB_settings.req @@ -58,7 +58,7 @@ file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=22, TRIGGER_NA file "FOFBTrigger_settings.req", P=$(P), R=$(R), TRIGGER_CHAN=23, TRIGGER_NAME=TRIGGER_PM # RTM LAMP -file "FOFBRtm_settings.req", P=$(P), R=$(R) + 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 diff --git a/FOFBApp/src/FOFBInclude.dbd b/FOFBApp/src/FOFBInclude.dbd index 5acf659..5988605 100644 --- a/FOFBApp/src/FOFBInclude.dbd +++ b/FOFBApp/src/FOFBInclude.dbd @@ -1,5 +1,6 @@ include "base.dbd" include "asyn.dbd" +include "calc.dbd" include "asSupport.dbd" include "FOFBSupport.dbd" include "devIocStats.dbd" diff --git a/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index 4ff35a5..8329fd9 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -34,6 +34,19 @@ dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH 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}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH0, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH1, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH2, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH3, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH4, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH5, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH6, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH7, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH8, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH9, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH10,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH11,FTVL=LONG,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") diff --git a/iocBoot/iocFOFB/waveformPlugins.cmd b/iocBoot/iocFOFB/waveformPlugins.cmd index 0f776d4..37985d5 100644 --- a/iocBoot/iocFOFB/waveformPlugins.cmd +++ b/iocBoot/iocFOFB/waveformPlugins.cmd @@ -4,47 +4,46 @@ 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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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=0,TYPE=Int32,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") - +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)") From 4dfc244bbc97f65f59c4aa654f5c930b6213ff5d Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Fri, 21 Jan 2022 13:55:57 -0300 Subject: [PATCH 37/42] FOFBApp and iocBoot: update records and converted waveforms --- FOFBApp/Db/FOFBData.template | 28 +++++++++++----------------- FOFBApp/Db/FOFBRtm_settings.req | 4 ++-- iocBoot/iocFOFB/stFOFB.cmd | 28 ++++++++++++++++------------ 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/FOFBApp/Db/FOFBData.template b/FOFBApp/Db/FOFBData.template index 4c4a90b..b53608c 100644 --- a/FOFBApp/Db/FOFBData.template +++ b/FOFBApp/Db/FOFBData.template @@ -29,45 +29,41 @@ field(SELM, "All") # Offset and Gain records -record(ao,"$(P)$(R)RtmLampCurrentOffset$(RTM_CHAN)-SP"){ - field(DTYP,"asynInt32") - field(DESC,"set current offset") +record(ao,"$(P)$(R)RtmLampWvfOffset$(RTM_CHAN)-SP"){ + field(DESC,"set waveform offset") field(PINI,"YES") field(SCAN,"Passive") - field(PREC,"3") field(FLNK,"$(P)$(R)$(ACQ_NAME)ConvArrayDataC$(RTM_CHAN) CPP NMS") } -record(ao,"$(P)$(R)RtmLampCurrentGain$(RTM_CHAN)-SP"){ - field(DTYP,"asynInt32") - field(DESC,"set current gain") +record(ao,"$(P)$(R)RtmLampWvfGain$(RTM_CHAN)-SP"){ + field(DESC,"set waveform gain") field(PINI,"YES") field(SCAN,"Passive") - field(PREC,"3") + 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 current $(ACQ_NAME)Conv") - field(DTYP, "Soft Channel") + field(DESC, "gain/offset waveform $(ACQ_NAME)Conv") field(NELM, "1000") field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") field(PINI, "YES") field(SCAN, "Passive") - field(INPA, "$(P)$(R)RtmLampCurrentGain$(RTM_CHAN)-SP") - field(INPB, "$(P)$(R)RtmLampCurrentOffset$(RTM_CHAN)-SP") + 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(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, "Current calibrated waveform $(ACQ_NAME)$(RTM_CHAN)") + field(DESC, "Data calibrated waveform $(ACQ_NAME)$(RTM_CHAN)") field(NELM, "1000") field(FTVL, "$(FTVL)") field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") @@ -76,9 +72,7 @@ record(waveform,"$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN)") record(subArray,"$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN)") { - field(DESC, "Current calibrated $(ACQ_NAME)") -# field(SDIS, "$(P)$(R)PosCal-Sts CPP NMS") -# field(DISV, "1") + field(DESC, "Data calibrated $(ACQ_NAME)") field(INP, "$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN) NPP NMS") field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") field(MALM, "1000") diff --git a/FOFBApp/Db/FOFBRtm_settings.req b/FOFBApp/Db/FOFBRtm_settings.req index cb91db7..adf9fc5 100644 --- a/FOFBApp/Db/FOFBRtm_settings.req +++ b/FOFBApp/Db/FOFBRtm_settings.req @@ -11,5 +11,5 @@ $(P)$(R)RtmLampPITI$(RTM_CHAN)-SP $(P)$(R)RtmLampPISP$(RTM_CHAN)-SP $(P)$(R)RtmLampPIOLDacCntMax-SP $(P)$(R)RtmLampPISPLimInf-SP -$(P)$(R)RtmLampCurrentGain$(RTM_CHAN)-SP -$(P)$(R)RtmLampCurrentOffset$(RTM_CHAN)-SP +$(P)$(R)RtmLampWvfGain$(RTM_CHAN)-SP +$(P)$(R)RtmLampWvfOffset$(RTM_CHAN)-SP diff --git a/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index 8329fd9..3554593 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -34,18 +34,22 @@ dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH 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}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH0, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH1, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH2, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH3, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH4, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH5, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH6, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH7, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH8, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH9, FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH10,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") -dbLoadRecords("${TOP}/db/FOFBData.template", "P=${P},R=${R},ACQ_NAME=GEN,RTM_CHAN=CH11,FTVL=LONG,NELEMENTS=$(WAVEFORM_MAX_POINTS)") +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") From 7a40f13e706d224c6dd2f542ee1f17500ea2b7fd Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Fri, 21 Jan 2022 13:57:17 -0300 Subject: [PATCH 38/42] scripts: add converted waveforms to graphical interface --- scripts/pydm_test/rtm_test_minicrate.ui | 4381 +++++++++++++++-------- 1 file changed, 2861 insertions(+), 1520 deletions(-) diff --git a/scripts/pydm_test/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index a8b8056..b4d47a2 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -6,49 +6,20 @@ 0 0 - 1438 - 776 + 1440 + 808 Dialog - - - - 930 - 10 - 175 - 31 - - - - - - - ACQStatus: - - - - - - - - - - XX-99SL01:DI-FOFBCtrl:ACQStatus-Sts - - - - - 440 10 991 - 761 + 791 @@ -58,221 +29,13 @@ Current | Voltage [Channels 0~3] - - - - 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} - - - - - - - 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} - - - - - - - 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 - 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} - - - - - - - 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} - - - - - - - 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} - - - - 690 - 10 + 700 + 50 291 - 171 + 161 @@ -377,10 +140,10 @@ - 690 - 190 + 700 + 230 291 - 171 + 161 @@ -485,10 +248,10 @@ - 690 - 370 + 700 + 410 291 - 171 + 161 @@ -593,10 +356,10 @@ - 690 - 550 + 700 + 590 291 - 171 + 161 @@ -698,226 +461,457 @@ - - - - Current | Voltage [Channels 4~7] - - - - - 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 + 0 + 0 + 691 + 761 - - - - - - {"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} - + + 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:GENConvArrayDataWvfCH0", "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:GENConvArrayDataWvfCH1", "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:GENConvArrayDataWvfCH2", "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:GENConvArrayDataWvfCH3", "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:GENConvArrayDataWvfCH8", "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:GENConvArrayDataWvfCH9", "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:GENConvArrayDataWvfCH10", "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:GENConvArrayDataWvfCH11", "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] + - 690 - 10 + 700 + 50 291 - 171 + 161 @@ -1022,10 +1016,10 @@ - 690 - 190 + 700 + 230 291 - 171 + 161 @@ -1130,10 +1124,10 @@ - 690 - 370 + 700 + 410 291 - 171 + 161 @@ -1238,10 +1232,10 @@ - 690 - 550 + 700 + 590 291 - 171 + 161 @@ -1343,6 +1337,445 @@ + + + + 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 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:GENConvArrayDataWvfCH4", "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:GENConvArrayDataWvfCH5", "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:GENConvArrayDataWvfCH6", "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:GENConvArrayDataWvfCH7", "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:GENConvArrayDataWvfCH12", "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:GENConvArrayDataWvfCH13", "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:GENConvArrayDataWvfCH14", "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:GENConvArrayDataWvfCH15", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + + + + + @@ -1351,61 +1784,64 @@ 10 10 421 - 321 + 306 - - + + - XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP - - + + - RtmLampPIOLDacCntMax: + ACQSamplesPost: - - + + - XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP - - - - RtmLampDacDataFromWb: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-RB + XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel - - + + - XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel + XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-RB @@ -1419,178 +1855,169 @@ - - + + - XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - - - - ACQSamplesPost: + XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-RB + XX-99SL01:DI-FOFBCtrl:ACQShots-SP - - + + - XX-99SL01:DI-FOFBCtrl:ACQSamplesPre-SP + XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel - - + + - ACQTriggerRep: + ACQTriggerEvent: - - - - - - - XX-99SL01:DI-FOFBCtrl:ACQShots-RB + + + + RtmLampDacDataFromWb: - - + + - XX-99SL01:DI-FOFBCtrl:ACQShots-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-RB - - + + - ACQSamplesPre: + ACQTrigger: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-SP + XX-99SL01:DI-FOFBCtrl:ACQTriggerEvent-Sel - - + + - XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel + XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel - - + + + + RtmLampPISPLimInf: + + + + + - XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + XX-99SL01:DI-FOFBCtrl:ACQShots-RB - - + + + + ACQTriggerRep: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-RB + XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - - - - - - ACQTrigger: + XX-99SL01:DI-FOFBCtrl:ACQSamplesPost-SP - - + + - ACQShots: + RtmLampPIOLDacCntMax: - - + + - XX-99SL01:DI-FOFBCtrl:ACQChannel-Sel + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLDacCntMax-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampStatus-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-RB - - - - - - - XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + + + + ACQSamplesPre: - - - - - - - XX-99SL01:DI-FOFBCtrl:ACQTrigger-Sel + + + + ACQShots: @@ -1611,34 +2038,23 @@ - - - - ACQTriggerEvent: - - - - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataFromWb-SP + XX-99SL01:DI-FOFBCtrl:ACQTriggerRep-Sel - - - - RtmLampPISPLimInf: + + + + - - - - - - RtmLampStatus: + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPLimInf-RB @@ -1648,13 +2064,13 @@ 10 - 340 + 330 431 - 431 + 471 - 0 + 6 @@ -1666,118 +2082,136 @@ 0 0 421 - 401 + 430 - - - - + + + + RtmLampDacWr: - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP + + + + + + RtmLampCurrentGain: - - + + + + RtmLampPISP: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP - - - - - - - RtmLampPIKP: + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-RB - - + + - RtmLampDacData: + RtmLampPIKP: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP - - + + + + RtmLampCurrentOffset: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP - - + + - RtmLampPISPSquareEn: + RtmLampPIOLTriangEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-RB + + + + + + + RtmLampDacData: @@ -1791,6 +2225,16 @@ + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-RB + + + @@ -1798,98 +2242,108 @@ - - + + - RtmLampPIOLTriangEn: + RtmLampVoltageGain: - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH0-RB + + + + RtmLampPITI: - - + + - RtmLampAmpEn: + RtmLampPIOLSquareEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP - - - - RtmLampDacWr: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH0-RB - - - - RtmLampPITI: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH0-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH0-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-RB - - + + - RtmLampPIOLSquareEn: + RtmLampPISPSquareEn: - - + + + + RtmLampAmpEn: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH0-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH0-SP @@ -1903,192 +2357,191 @@ - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-SP - - - - - - - RtmLampPISP: + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH0-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH0-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH0-RB - - + + + + RtmLampVoltageOffset: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH0-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH0-SP - - - - - - CH1 - - - - - 0 - 0 - 421 - 401 - - - - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH0-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP - - - - - - - RtmLampPIKP: + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH8-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH8-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-RB - - - - - - - RtmLampDacData: + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH0-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH0-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH8-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH8-SP - - + + + + + + CH1 + + + + + 0 + 0 + 421 + 430 + + + + + - RtmLampPISPSquareEn: + RtmLampDacWr: - - + + + + RtmLampDacData: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP - - - - RtmLampPIEn: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-SP - - - - RtmLampPIOLTriangEn: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH1-SP @@ -2109,101 +2562,91 @@ - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-RB + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP - - + + - RtmLampDacWr: + RtmLampCurrentGain: - - + + - RtmLampPITI: + RtmLampPISP: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-RB - - - - RtmLampPIOLSquareEn: - - - - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH1-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH1-SP - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH1-SP + + + + RtmLampPIOLTriangEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH1-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-RB - - + + - RtmLampPISP: + RtmLampPISPSquareEn: @@ -2227,199 +2670,229 @@ - - - - - - CH2 - - - - - 0 - 0 - 421 - 401 - - - - - - - + + + + RtmLampPIKP: - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP + + + + + + RtmLampPITI: - - + + + + RtmLampPIOLSquareEn: + + + + + + + RtmLampPIEn: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH1-RB - - - - RtmLampPIKP: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH1-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH1-SP - + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-RB - - + + - RtmLampDacData: + RtmLampCurrentOffset: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH1-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH1-SP - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-RB + + + + RtmLampVoltageGain: - - + + - RtmLampPISPSquareEn: + RtmLampVoltageOffset: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH1-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH1-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH9-SP - - - - RtmLampPIEn: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH9-SP - - - - RtmLampPIOLTriangEn: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH1-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH1-SP - - - - RtmLampAmpEn: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH9-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH9-SP - - + + + + + + CH2 + + + + + 0 + 0 + 421 + 430 + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-RB - - - - RtmLampDacWr: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP @@ -2440,958 +2913,1810 @@ - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-RB - - + + - RtmLampPIOLSquareEn: + RtmLampPISP: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-SP - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-SP + + + + RtmLampPISPSquareEn: - - + + - RtmLampPISP: + RtmLampPIOLSquareEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH2-RB - - + + + + RtmLampCurrentGain: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH2-RB - - - - - - CH3 - - - - - 0 - 0 - 421 - 401 - - - - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP - - - - - - - RtmLampPIKP: + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH2-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH2-SP - - + + - RtmLampDacData: + RtmLampPIOLTriangEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-SP - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-RB + + + + RtmLampDacData: - - - - + + + + RtmLampPIEn: - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH3-RB + + + + + + RtmLampVoltageGain: - - + + - RtmLampPISPSquareEn: + RtmLampPIKP: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH2-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH2-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH2-RB - - - - RtmLampPIEn: + + + + - - - - - - RtmLampPIOLTriangEn: + + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH2-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH2-SP - + RtmLampAmpEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-RB - - + + + + RtmLampCurrentOffset: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH2-SP - + RtmLampDacWr: - - + + - RtmLampPITI: + RtmLampVoltageOffset: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH2-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH2-SP - - - - RtmLampPIOLSquareEn: - - - - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH3-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH10-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH10-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH2-SP - - - - RtmLampPISP: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH2-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH3-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH10-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH3-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH10-SP - + - CH4 + CH3 - + 0 0 421 - 401 + 430 - - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-SP - - - + - + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH3-SP - - + + - RtmLampPIKP: + RtmLampVoltageOffset: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-RB - - - - - - - RtmLampDacData: + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH3-RB - + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH3-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH4-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH3-RB - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH4-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:RtmLampPITICH4-SP + 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:RtmLampPISPSquareEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-RB + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP - - + + - RtmLampPIEn: + RtmLampPISP: - - + + - RtmLampPIOLTriangEn: + RtmLampPISPSquareEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH4-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-RB - - + + - RtmLampAmpEn: + RtmLampCurrentGain: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH4-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP - - + + - RtmLampDacWr: + RtmLampPIEn: - + RtmLampPITI: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH4-SP - - - - - - - RtmLampPIOLSquareEn: + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP - + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH4-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-RB - - + + - RtmLampPISP: + RtmLampVoltageGain: - - + + + + RtmLampVoltageOffset: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH4-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH5-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH4-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH5-SP - - - - - - CH5 - - - - - 0 - 0 - 421 - 401 - - - - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH13-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH13-SP - - - - RtmLampPIKP: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH5-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH5-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH13-SP - - + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH13-SP + + + + + + + + + CH6 + + + + + 0 + 0 + 421 + 430 + + + + + - RtmLampDacData: + RtmLampCurrentOffset: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP - - - - + + + + RtmLampPIEn: - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH5-RB + + + + + + RtmLampPIOLTriangEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH5-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP - + RtmLampPISPSquareEn: - + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-RB - - + + + + RtmLampPIKP: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-RB - - + + - RtmLampPIEn: + RtmLampPISP: - - + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP + + + + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-RB + + + + + - RtmLampPIOLTriangEn: + RtmLampDacData: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH5-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP - - + + - RtmLampAmpEn: + RtmLampPIOLSquareEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-RB + + + + + + + RtmLampVoltageGain: - + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH5-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-RB - + RtmLampDacWr: - - - - RtmLampPITI: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP - - + + - RtmLampPIOLSquareEn: + RtmLampVoltageOffset: - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH5-RB + + + + RtmLampPITI: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-RB - - + + + + RtmLampAmpEn: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-SP - - - - - - - RtmLampPISP: + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH5-RB + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH5-RB + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-RB - - - - - - CH6 - - - - - 0 - 0 - 421 - 401 - - - @@ -3402,290 +4727,241 @@ - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-RB - - + + - RtmLampPIKP: + RtmLampCurrentGain: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-RB - - - - - - - RtmLampDacData: + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH6-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH6-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH6-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH14-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH6-RB - - - - - - - RtmLampPISPSquareEn: + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH6-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH6-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH14-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-RB - - - - - - - RtmLampPIEn: - - - - - - - RtmLampPIOLTriangEn: + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH14-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH6-RB - - - - - - - RtmLampAmpEn: + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH14-SP - - + + + + + + CH7 + + + + + 0 + 0 + 421 + 430 + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH6-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP - - - - RtmLampDacWr: + + + + - - - - - - RtmLampPITI: + + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-RB - - + + - RtmLampPIOLSquareEn: + RtmLampCurrentOffset: - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH6-RB + + + + RtmLampDacWr: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-SP - - - - - - - RtmLampPISP: + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH6-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH6-RB + XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-RB - - - - - - CH7 - - - - - 0 - 0 - 421 - 401 - - - - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-RB @@ -3699,6 +4975,13 @@ + + + + RtmLampAmpEn: + + + @@ -3706,23 +4989,44 @@ - - + + + + RtmLampPIEn: + + + + + + + RtmLampPITI: + + + + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-RB - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP + + + + + + + RtmLampPIOLSquareEn: @@ -3733,219 +5037,195 @@ - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-RB - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPIEnCH7-RB + + + + RtmLampPISP: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacDataCH7-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-SP - - + + - RtmLampPISPSquareEn: + RtmLampPIOLTriangEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-RB - - - - - - - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-SP + + + + RtmLampCurrentGain: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-RB - - - - - - - RtmLampPIEn: + XX-99SL01:DI-FOFBCtrl:RtmLampPISPCH7-RB - - + + - RtmLampPIOLTriangEn: + RtmLampPISPSquareEn: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-RB + XX-99SL01:DI-FOFBCtrl:RtmLampPITICH7-SP - - + + - RtmLampAmpEn: + RtmLampVoltageGain: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLSquareEnCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPISPSquareEnCH7-RB - - - - - - - RtmLampDacWr: + XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-RB - - + + - RtmLampPITI: + RtmLampVoltageOffset: - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH7-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampDacWrCH7-SP - - - - - - - RtmLampPIOLSquareEn: + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH7-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIOLTriangEnCH7-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH15-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH15-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-SP + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH7-SP - - - - RtmLampPISP: + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH7-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampAmpEnCH7-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfGainCH15-SP - - + + - XX-99SL01:DI-FOFBCtrl:RtmLampPIKPCH7-RB + XX-99SL01:DI-FOFBCtrl:RtmLampWvfOffsetCH15-SP @@ -3953,10 +5233,71 @@ - tabWidget_2 + + + + 1046 + 10 + 81 + 21 + + + + ACQStatus: + + + + + + 1130 + 6 + 101 + 31 + + + + + + + XX-99SL01:DI-FOFBCtrl:ACQStatus-Sts + + + + + + 1270 + 0 + 121 + 41 + + + + RtmLampStatus: + + + + + + 1385 + 7 + 21 + 21 + + + + + + + XX-99SL01:DI-FOFBCtrl:RtmLampStatus-RB + + tabWidget - horizontalLayoutWidget + tabWidget_2 gridLayoutWidget + PyDMLabel_3 + label_3 + label_9 + PyDMLabel_9 From e9f4cb0a068e5ab22ba2b58496fc70fdb4254865 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Mon, 24 Jan 2022 15:40:53 -0300 Subject: [PATCH 39/42] FOFBApp and iocBoot: update number of elements for converted waveforms --- FOFBApp/Db/FOFBData.template | 22 +++++++++++----------- iocBoot/iocFOFB/stFOFB.cmd | 4 ++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/FOFBApp/Db/FOFBData.template b/FOFBApp/Db/FOFBData.template index b53608c..7e6ced8 100644 --- a/FOFBApp/Db/FOFBData.template +++ b/FOFBApp/Db/FOFBData.template @@ -3,7 +3,7 @@ record(waveform,"$(P)$(R)$(ACQ_NAME)ArrayDataWvf") field(DESC, "Data waveform $(ACQ_NAME)") field(NELM,"$(NELEMENTS)") field(FTVL, "LONG") - field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") field(FLNK, "$(P)$(R)$(ACQ_NAME)ArrayData") } @@ -11,7 +11,7 @@ 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)$(ACQ_NAME)RawArrayData.TIME") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") field(MALM, "$(NELEMENTS)") field(FTVL, "LONG") field(FLNK, "$(P)$(R)$(ACQ_NAME)ArrayDataSeq") @@ -22,7 +22,7 @@ record(subArray,"$(P)$(R)$(ACQ_NAME)ArrayData") record(seq, "$(P)$(R)$(ACQ_NAME)ArrayDataSeq"){ field(DESC,"Get NORD from $(ACQ_NAME)$ waveform") field(PINI,"YES") -field(DOL1, "$(P)$(R)$(ACQ_NAME)RawArrayData.NORD NPP NMS") +field(DOL1, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.NORD NPP NMS") field(LNK1, "$(P)$(R)$(ACQ_NAME)ArrayData.NELM PP NMS") field(SELM, "All") } @@ -41,15 +41,15 @@ record(ao,"$(P)$(R)RtmLampWvfGain$(RTM_CHAN)-SP"){ field(PINI,"YES") field(SCAN,"Passive") field(PREC,"8") - field(FLNK,"$(P)$(R)$(ACQ_NAME)ConvArrayDataC$(RTM_CHAN) CPP NMS)") + 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, "1000") - field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") + 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") @@ -64,9 +64,9 @@ record(acalcout,"$(P)$(R)$(ACQ_NAME)ConvArrayDataC$(RTM_CHAN)") record(waveform,"$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN)") { field(DESC, "Data calibrated waveform $(ACQ_NAME)$(RTM_CHAN)") - field(NELM, "1000") + field(NELM, "$(NELEMENTS)") field(FTVL, "$(FTVL)") - field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") field(FLNK, "$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN) PP") } @@ -74,8 +74,8 @@ record(subArray,"$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN)") { field(DESC, "Data calibrated $(ACQ_NAME)") field(INP, "$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN) NPP NMS") - field(TSEL, "$(P)$(R)$(ACQ_NAME)RawArrayData.TIME") - field(MALM, "1000") + field(TSEL, "$(P)$(R)GEN_$(RTM_CHAN)ArrayData.TIME") + field(MALM, "$(NELEMENTS)") field(FTVL, "$(FTVL)") field(FLNK, "$(P)$(R)$(ACQ_NAME)ConvArrayDataSeq$(RTM_CHAN)") } @@ -85,7 +85,7 @@ record(subArray,"$(P)$(R)$(ACQ_NAME)ConvArrayData$(RTM_CHAN)") 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)$(ACQ_NAME)RawArrayData.NORD NPP NMS") + 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/iocBoot/iocFOFB/stFOFB.cmd b/iocBoot/iocFOFB/stFOFB.cmd index 3554593..f61f398 100644 --- a/iocBoot/iocFOFB/stFOFB.cmd +++ b/iocBoot/iocFOFB/stFOFB.cmd @@ -33,6 +33,10 @@ dbLoadRecords("${TOP}/FOFBApp/Db/FOFBRtm.template", "P=${P}, R=${R}, RTM_CHAN=CH 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)") From 8f8f34cba686ba90b4ca1c97935a9a6cd6ccbb19 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Mon, 24 Jan 2022 15:41:42 -0300 Subject: [PATCH 40/42] scripts: update waveforms in graphical interface --- scripts/pydm_test/rtm_test_minicrate.ui | 32 ++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/scripts/pydm_test/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index b4d47a2..77c930c 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -712,7 +712,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH0", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -738,7 +738,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH1", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -764,7 +764,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH2", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 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} @@ -790,7 +790,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH3", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -816,7 +816,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH8", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -842,7 +842,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH9", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -868,7 +868,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH10", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 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} @@ -894,7 +894,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH11", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -1588,7 +1588,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH4", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -1614,7 +1614,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH5", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -1640,7 +1640,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH6", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -1666,7 +1666,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH7", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -1692,7 +1692,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH12", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -1718,7 +1718,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH13", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -1744,7 +1744,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH14", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} @@ -1770,7 +1770,7 @@ - {"y_channel": "XX-99SL01:DI-FOFBCtrl:GENConvArrayDataWvfCH15", "x_channel": null, "name": "", "color": "white", "lineStyle": 1, "lineWidth": 1, "symbol": null, "symbolSize": 10, "yAxisName": "Axis 1", "redraw_mode": 2} + {"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} From 9a8ab9735c4f99ed58bba53c2e3fb423260f1974 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Mon, 24 Jan 2022 15:51:19 -0300 Subject: [PATCH 41/42] FOFBApp: update number of elements for converted waveforms --- FOFBApp/Db/FOFBData.template | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FOFBApp/Db/FOFBData.template b/FOFBApp/Db/FOFBData.template index 7e6ced8..3549a62 100644 --- a/FOFBApp/Db/FOFBData.template +++ b/FOFBApp/Db/FOFBData.template @@ -73,9 +73,10 @@ record(waveform,"$(P)$(R)$(ACQ_NAME)ConvArrayDataWvf$(RTM_CHAN)") 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, "$(NELEMENTS)") + field(MALM, "1000") field(FTVL, "$(FTVL)") field(FLNK, "$(P)$(R)$(ACQ_NAME)ConvArrayDataSeq$(RTM_CHAN)") } From 2741c81576a00340d99a69233a57da3178769231 Mon Sep 17 00:00:00 2001 From: Melissa Aguiar Date: Tue, 25 Jan 2022 09:20:44 -0300 Subject: [PATCH 42/42] scripts: update graphical interface --- FOFBApp/Db/FOFBRtm.template | 56 ++++++++-- scripts/pydm_test/rtm_test_minicrate.ui | 139 ++++++++++++++++++------ 2 files changed, 151 insertions(+), 44 deletions(-) diff --git a/FOFBApp/Db/FOFBRtm.template b/FOFBApp/Db/FOFBRtm.template index 4d06fc7..d3827ad 100644 --- a/FOFBApp/Db/FOFBRtm.template +++ b/FOFBApp/Db/FOFBRtm.template @@ -34,60 +34,100 @@ record(longin,"$(P)$(R)RtmLampDacDataFromWb-RB"){ field(INP,"@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))RTMLAMP_OHWR_CTL_DAC_DATA_FROM_WB") } -record(longout,"$(P)$(R)RtmLampAmpIFlagL$(RTM_CHAN)-SP"){ +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(longin,"$(P)$(R)RtmLampAmpIFlagL$(RTM_CHAN)-RB"){ +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(longout,"$(P)$(R)RtmLampAmpTFlagL$(RTM_CHAN)-SP"){ +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(longin,"$(P)$(R)RtmLampAmpTFlagL$(RTM_CHAN)-RB"){ +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(longout,"$(P)$(R)RtmLampAmpIFlagR$(RTM_CHAN)-SP"){ +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(longin,"$(P)$(R)RtmLampAmpIFlagR$(RTM_CHAN)-RB"){ +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(longout,"$(P)$(R)RtmLampAmpTFlagR$(RTM_CHAN)-SP"){ +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(longin,"$(P)$(R)RtmLampAmpTFlagR$(RTM_CHAN)-RB"){ +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"){ diff --git a/scripts/pydm_test/rtm_test_minicrate.ui b/scripts/pydm_test/rtm_test_minicrate.ui index 77c930c..49bccd8 100644 --- a/scripts/pydm_test/rtm_test_minicrate.ui +++ b/scripts/pydm_test/rtm_test_minicrate.ui @@ -6,7 +6,7 @@ 0 0 - 1440 + 1390 808 @@ -16,14 +16,14 @@ - 440 + 450 10 - 991 + 931 791 - 1 + 0 @@ -34,7 +34,7 @@ 700 50 - 291 + 249 161 @@ -62,8 +62,75 @@ - - + + + + + + + 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 @@ -90,7 +157,7 @@ - Amplifier Overtermperature + Amplifier Overtermp @@ -142,7 +209,7 @@ 700 230 - 291 + 249 161 @@ -198,7 +265,7 @@ - Amplifier Overtermperature + Amplifier Overtermp @@ -250,7 +317,7 @@ 700 410 - 291 + 249 161 @@ -306,7 +373,7 @@ - Amplifier Overtermperature + Amplifier Overtermp @@ -358,7 +425,7 @@ 700 590 - 291 + 249 161 @@ -414,7 +481,7 @@ - Amplifier Overtermperature + Amplifier Overtermp @@ -910,7 +977,7 @@ 700 50 - 291 + 249 161 @@ -966,7 +1033,7 @@ - Amplifier Overtermperature + Amplifier Overtermp @@ -1018,7 +1085,7 @@ 700 230 - 291 + 249 161 @@ -1074,7 +1141,7 @@ - Amplifier Overtermperature + Amplifier Overtermp @@ -1126,7 +1193,7 @@ 700 410 - 291 + 249 161 @@ -1182,7 +1249,7 @@ - Amplifier Overtermperature + Amplifier Overtermp @@ -1234,7 +1301,7 @@ 700 590 - 291 + 249 161 @@ -1290,7 +1357,7 @@ - Amplifier Overtermperature + Amplifier Overtermp @@ -1347,7 +1414,7 @@ - 1 + 0 @@ -2070,7 +2137,7 @@ - 6 + 0 @@ -5236,8 +5303,8 @@ - 1046 - 10 + 970 + 40 81 21 @@ -5249,10 +5316,10 @@ - 1130 - 6 + 1050 + 40 101 - 31 + 21 @@ -5265,10 +5332,10 @@ - 1270 - 0 + 1230 + 40 121 - 41 + 21 @@ -5278,9 +5345,9 @@ - 1385 - 7 - 21 + 1350 + 40 + 20 21 @@ -5294,8 +5361,8 @@ tabWidget tabWidget_2 gridLayoutWidget - PyDMLabel_3 label_3 + PyDMLabel_3 label_9 PyDMLabel_9