diff --git a/src/include/daqmap.h b/src/include/daqmap.h index 3ff3c9a38da6f6ae13829b8e2082678b0c93efc6..f0232743b90214f26418724a6d465fcd1bc57b16 100644 --- a/src/include/daqmap.h +++ b/src/include/daqmap.h @@ -258,6 +258,9 @@ typedef struct DAQ_INFO_BLOCK { int numEpicsFloats; int numEpicsFilts; int numEpicsTotal; + int epicsdblDataOffset; + int cpyepics2times; + int cpyIntSize[2]; unsigned long configFileCRC; ///< DAQ config file checksum struct { unsigned int tpnum; ///< Test point number to which this DAQ channel connects @@ -284,6 +287,9 @@ typedef struct DAQ_INFO_BLOCK { /* Defines the number of ASC test point outputs */ #define DAQ_GDS_TP_ASC_TP_NUM 56 +#define DAQ_DBL_PER_CYCLE 50 +#define DAQ_DBL_CYCLE_START 40 + static const int daqGdsTpNum[4] = { DAQ_GDS_TP_LSC_EX_NUM, DAQ_GDS_TP_ASC_EX_NUM, DAQ_GDS_TP_LSC_TP_NUM, DAQ_GDS_TP_ASC_TP_NUM }; /* GDS layout: diff --git a/src/include/drv/daqLib.c b/src/include/drv/daqLib.c index 0d3f410906104b2924d3f475ebf299d117cb5b98..f7e543af2196947e663f13167d89d599c6a4e6d7 100644 --- a/src/include/drv/daqLib.c +++ b/src/include/drv/daqLib.c @@ -14,13 +14,14 @@ struct rmIpcStr *dipc; ///< Pointer to DAQ IPC data in shared memory. struct cdsDaqNetGdsTpNum *tpPtr; ///< Pointer to TP table in shared memory. char *mcPtr; ///< Pointer to current DAQ data in shared memory. float *testPtr; ///< Pointer to current DAQ data in shared memory. -int *testPtrI; ///< Pointer to current DAQ data in shared memory. -int *readPtrI; +char *testPtrI; ///< Pointer to current DAQ data in shared memory. +char *readPtrI; char *lmPtr; ///< Pointer to current DAQ data in local memory data buffer. char *daqShmPtr; ///< Pointer to DAQ data in shared memory. int fillSize; ///< Amount of data to copy local to shared memory. char *pEpicsIntData; double *pEpicsDblData; +double *pEpicsDblData1; unsigned int curDaqBlockSize; @@ -254,7 +255,32 @@ static double dHistory[DCU_MAX_CHANNELS][MAX_HISTRY]; dataInfo.numEpicsTotal = pInfo->numEpicsTotal; pEpicsIntData = pEpics; epicsIntXferSize = dataInfo.numEpicsInts * 4; + + dataInfo.epicsdblDataOffset = 0; + dataInfo.cpyepics2times = 0; + dataInfo.cpyIntSize[0] = dataInfo.numEpicsInts * 4; + dataInfo.cpyIntSize[1] = 0; + + + ii = (sizeof(CDS_EPICS_OUT) / 4); + jj = dataInfo.numEpicsInts - ii; + printf("Have %d CDS epics integer and %d USR epics integer channels\n",ii,jj); + + if((ii%2) || (jj%2)) { + printf("Have at least 1 int mem hole %d %d \n",ii,jj); + dataInfo.epicsdblDataOffset = 1; + } + if ((ii%2)) { + // Have 4 byte mem hole after CDS data + // This will require 2 memcpys of integer data. + dataInfo.cpyIntSize[0] = ii *4; + dataInfo.cpyIntSize[1] = jj *4; + dataInfo.cpyepics2times = 1; + printf("Have 2 mem holes %d %d \nNeet to cpy ints twice - size 1 = %d size 2 = %d \n",ii,jj,dataInfo.cpyIntSize[0],dataInfo.cpyIntSize[1]); + } + pEpicsDblData = (pEpicsIntData + epicsIntXferSize); + if(dataInfo.epicsdblDataOffset) pEpicsDblData ++; printf("DAQ DATA INFO is at 0x%x\n",(long)pInfo); printf("DAQ EPICS INT DATA is at 0x%x with size %d\n",(long)pEpicsIntData,epicsIntXferSize); @@ -569,20 +595,32 @@ printf("Fast data offset = %d \n",offsetAccum); if(daqSlot == 0) { // Write EPICS integer values - memcpy(pWriteBuffer,pEpicsIntData,epicsIntXferSize); + + if(dataInfo.cpyepics2times) + { + memcpy(pWriteBuffer,pEpicsIntData,dataInfo.cpyIntSize[0]); + testPtrI = pWriteBuffer; + testPtrI += dataInfo.cpyIntSize[0]; + readPtrI = pEpicsIntData + dataInfo.cpyIntSize[0] + 4; + memcpy(testPtrI,readPtrI,dataInfo.cpyIntSize[1]); + } else { + memcpy(pWriteBuffer,pEpicsIntData,dataInfo.cpyIntSize[0]); + } + } if(daqSlot == 41) { // Write EPICS double values as float values - pEpicsDblData = (pEpicsIntData + epicsIntXferSize); + pEpicsDblData1 = pEpicsDblData; +// printf("DBlP old = 0x%x\n",(long)pEpicsDblData); // testPtr = (pWriteBuffer + epicsIntXferSize); testPtr = (float *)pWriteBuffer; testPtr += dataInfo.numEpicsInts; for(ii=0;ii<dataInfo.numEpicsFloats;ii++) { - *testPtr = (float)*pEpicsDblData; + *testPtr = (float)*pEpicsDblData1; testPtr ++; - pEpicsDblData ++; + pEpicsDblData1 ++; } } if(daqSlot == 42) @@ -717,22 +755,47 @@ if(daqSlot == 42) crcLength = 0; // Setup EPICS channel information/pointers - dataInfo.numEpicsInts = pInfo->numEpicsInts; - dataInfo.numEpicsFloats = pInfo->numEpicsFloats; - dataInfo.numEpicsFilts = pInfo->numEpicsFilts; - dataInfo.numEpicsTotal = pInfo->numEpicsTotal; - pEpicsIntData = pEpics; - epicsIntXferSize = dataInfo.numEpicsInts * 4; - pEpicsDblData = (pEpicsIntData + epicsIntXferSize); + dataInfo.numEpicsInts = pInfo->numEpicsInts; + dataInfo.numEpicsFloats = pInfo->numEpicsFloats; + dataInfo.numEpicsFilts = pInfo->numEpicsFilts; + dataInfo.numEpicsTotal = pInfo->numEpicsTotal; + pEpicsIntData = pEpics; + epicsIntXferSize = dataInfo.numEpicsInts * 4; - printf("DAQ DATA INFO is at 0x%x\n",(long)pInfo); - printf("DAQ EPICS INT DATA is at 0x%x with size %d\n",(long)pEpicsIntData,epicsIntXferSize); - printf("DAQ EPICS FLT DATA is at 0x%x\n",(long)pEpicsDblData); - printf("EPICS: Int = %d Flt = %d Filters = %d Total = %d Fast = %d\n",dataInfo.numEpicsInts,dataInfo.numEpicsFloats,dataInfo.numEpicsFilts, dataInfo.numEpicsTotal, dataInfo.numChans); + dataInfo.epicsdblDataOffset = 0; + dataInfo.cpyepics2times = 0; dataInfo.cpyIntSize[0] = dataInfo.numEpicsInts * 4; + dataInfo.cpyIntSize[1] = 0; - // Initialize CRC length with EPICS data size. - crcLength = 4 * dataInfo.numEpicsTotal; - printf("crc length epics = %d\n",crcLength); + + ii = (sizeof(CDS_EPICS_OUT) / 4); + jj = dataInfo.numEpicsInts - ii; + printf("Have %d CDS epics integer and %d USR epics integer channels\n",ii,jj); + + if((ii%2) || (jj%2)) { + printf("Have at least 1 int mem hole %d %d \n",ii,jj); + dataInfo.epicsdblDataOffset = 1; + } + if ((ii%2)) { + // Have 4 byte mem hole after CDS data + // This will require 2 memcpys of integer data. + dataInfo.cpyIntSize[0] = ii *4; + dataInfo.cpyIntSize[1] = jj *4; + dataInfo.cpyepics2times = 1; printf("Have 2 mem holes %d %d \nNeet to cpy ints twice - size 1 = %d size 2 = %d \n",ii,jj,dataInfo.cpyIntSize[0] + ,dataInfo.cpyIntSize[1]); + } + + pEpicsDblData = (pEpicsIntData + epicsIntXferSize); + if(dataInfo.epicsdblDataOffset) pEpicsDblData ++; + + + printf("DAQ DATA INFO is at 0x%x\n",(long)pInfo); + printf("DAQ EPICS INT DATA is at 0x%x with size %d\n",(long)pEpicsIntData,epicsIntXferSize); + printf("DAQ EPICS FLT DATA is at 0x%x\n",(long)pEpicsDblData); + printf("EPICS: Int = %d Flt = %d Filters = %d Total = %d Fast = %d\n",dataInfo.numEpicsInts,dataInfo.numEpicsFloats,dataInfo.numEpicsFilts, dataInfo.numEpicsTotal, dataInfo.numChans); + + // Initialize CRC length with EPICS data size. + crcLength = 4 * dataInfo.numEpicsTotal; + printf("crc length epics = %d\n",crcLength); /* Get the DAQ configuration information for all channels and calc a crc checksum length */