Added support for NDDataType

git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@14401 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b
This commit is contained in:
rivers
2012-02-01 17:59:52 +00:00
parent be7e27464e
commit db4a34a5b5

View File

@@ -160,7 +160,8 @@ AndorCCD::AndorCCD(const char *portName, int maxBuffers, size_t maxMemory,
status |= setIntegerParam(ADNumExposures, 1);
status |= setIntegerParam(NDArraySizeX, sizeX);
status |= setIntegerParam(NDArraySizeY, sizeY);
status |= setIntegerParam(NDArraySize, sizeX*sizeY*sizeof(at_32));
status |= setIntegerParam(NDDataType, NDUInt16);
status |= setIntegerParam(NDArraySize, sizeX*sizeY*sizeof(epicsUInt16));
mAccumulatePeriod = 2.0;
status |= setDoubleParam(AndorAccumulatePeriod, mAccumulatePeriod);
status |= setIntegerParam(AndorAdcSpeed, 0);
@@ -783,7 +784,6 @@ asynStatus AndorCCD::setupAcquisition()
// for the actual size of the image, so we must compute it.
setIntegerParam(NDArraySizeX, sizeX/binX);
setIntegerParam(NDArraySizeY, sizeY/binY);
setIntegerParam(NDArraySize, sizeX/binX * sizeY/binY * sizeof(at_32));
try {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
@@ -867,7 +867,6 @@ asynStatus AndorCCD::setupAcquisition()
checkStatus(SetFastKineticsEx(sizeY, numImages, mAcquireTime, FKmode, binX, binY, minY));
setIntegerParam(NDArraySizeX, maxSizeX/binX);
setIntegerParam(NDArraySizeY, maxSizeY/binY);
setIntegerParam(NDArraySize, maxSizeX/binX * maxSizeY/binY * sizeof(at_32));
break;
}
// Read the actual times
@@ -901,16 +900,15 @@ void AndorCCD::dataTask(void)
int acquireStatus;
char *errorString = NULL;
int acquiring = 0;
epicsInt32 numImages = 0;
epicsInt32 numImagesCounter;
epicsInt32 numExposuresCounter;
epicsInt32 imageCounter;
epicsInt32 arrayCallbacks;
epicsInt32 sizeX, sizeY;
NDDataType_t dataType;
long firstImage, lastImage;
int dims[2];
int nDims = 2;
NDDataType_t dataType = NDInt32;
epicsTimeStamp startTime;
NDArray *pArray;
int autoSave;
@@ -946,7 +944,7 @@ void AndorCCD::dataTask(void)
continue;
}
//Read some parameters
getIntegerParam(ADNumImages, &numImages);
getIntegerParam(NDDataType, (epicsInt32*)&dataType);
getIntegerParam(NDAutoSave, &autoSave);
getIntegerParam(NDArrayCallbacks, &arrayCallbacks);
getIntegerParam(NDArraySizeX, &sizeX);
@@ -1003,9 +1001,18 @@ void AndorCCD::dataTask(void)
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetNumberNewImages, status=%d, firstImage=%d, lastImage=%d\n",
functionName, status, firstImage, lastImage);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetOldestImage(%p, %d)\n", functionName, pArray->pData, sizeX*sizeY);
checkStatus(GetOldestImage((at_32*)pArray->pData, sizeX*sizeY));
if (dataType == NDUInt32) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetOldestImage(%p, %d)\n", functionName, pArray->pData, sizeX*sizeY);
checkStatus(GetOldestImage((at_32*)pArray->pData, sizeX*sizeY));
setIntegerParam(NDArraySize, sizeX * sizeY * sizeof(epicsUInt32));
}
else if (dataType == NDUInt16) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetOldestImage16(%p, %d)\n", functionName, pArray->pData, sizeX*sizeY);
checkStatus(GetOldestImage16((epicsUInt16*)pArray->pData, sizeX*sizeY));
setIntegerParam(NDArraySize, sizeX * sizeY * sizeof(epicsUInt16));
}
/* Put the frame number and time stamp into the buffer */
pArray->uniqueId = imageCounter;
pArray->timeStamp = startTime.secPastEpoch + startTime.nsec / 1.e9;
@@ -1015,8 +1022,6 @@ void AndorCCD::dataTask(void)
/* Must release the lock here, or we can get into a deadlock, because we can
* block on the plugin lock, and the plugin can be calling us */
this->unlock();
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:, first pixel value=%d\n", functionName, *(at_32*)pArray->pData);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:, calling array callbacks\n", functionName);
doCallbacksGenericPointer(pArray, NDArrayData, 0);