Add mechanism to check dropped frames
This commit is contained in:
+38
-7
@@ -184,6 +184,8 @@ Orca::Orca(const char* portName, int cameraId, int maxBuffers, size_t maxMemory,
|
||||
|
||||
createParam(evrTimeStampString, asynParamOctet, &evrTimeStamp);
|
||||
createParam(evrCountString, asynParamInt32, &evrCounts);
|
||||
createParam(evrCountSinceAcqStartString, asynParamInt32, &evrCountsSinceAcqStart);
|
||||
createParam(evrTriggerDroppedString, asynParamInt32, &evrTriggerDropped);
|
||||
createParam(hAcqControlString, asynParamInt32, &hAcqControl);
|
||||
|
||||
setIntegerParam(NDArrayCallbacks, 1);
|
||||
@@ -773,10 +775,17 @@ void Orca::imageTask(){
|
||||
//int acquireStatusError = 0;
|
||||
int imageMode=0;
|
||||
int totalImages=0;
|
||||
int initial_evr_counters = 0;
|
||||
int evr_counts_since_last_start = 0;
|
||||
int evr_counts_since_last_start_previous = 0;
|
||||
int evr_trigger_dropped = 0;
|
||||
uint64_t prevAcquisitionCount = 0;
|
||||
DCAMCAP_TRANSFERINFO captransferinfo;
|
||||
epicsTimeStamp prevAcqTime, currentAcqTime;
|
||||
epicsTimeStamp prev_trigger_time, current_trigger_time;
|
||||
double elapsedTime;
|
||||
int evr_counts = 0;
|
||||
double exposure_time, readout_time;
|
||||
|
||||
int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL;
|
||||
|
||||
@@ -801,10 +810,16 @@ void Orca::imageTask(){
|
||||
epicsThreadSleep(.1);
|
||||
}
|
||||
else {
|
||||
getIntegerParam(ADNumImages, &totalImages);
|
||||
getIntegerParam(ADImageMode, &imageMode);
|
||||
setIntegerParam(ADStatus, ADStatusAcquire);
|
||||
acquire = 1;
|
||||
prevAcquisitionCount = 0;
|
||||
evr_trigger_dropped = 0;
|
||||
setIntegerParam(ADNumImagesCounter, 0);
|
||||
getIntegerParam(evrCounts, &initial_evr_counters);
|
||||
dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &readout_time);
|
||||
dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &exposure_time);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -842,16 +857,17 @@ void Orca::imageTask(){
|
||||
accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image,
|
||||
width * 2, width, height, ts_sec, ts_microsec);
|
||||
|
||||
double exposure_time, readout_time, timestamp;
|
||||
|
||||
dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &readout_time);
|
||||
dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &exposure_time);
|
||||
double timestamp;
|
||||
|
||||
getIntegerParam(hTriggerSource, &triggerMode);
|
||||
if (triggerMode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) {
|
||||
int evr_counts = 0;
|
||||
getIntegerParam(evrCounts, &evr_counts);
|
||||
evr_counts_since_last_start = evr_counts - initial_evr_counters;
|
||||
evr_trigger_dropped = evr_counts_since_last_start - captransferinfo.nFrameCount;
|
||||
printf("EVR event count: %d\n", evr_counts);
|
||||
printf("evr_counts_since_last_start: %d\n", evr_counts_since_last_start);
|
||||
setIntegerParam(evrCountsSinceAcqStart, evr_counts_since_last_start);
|
||||
setIntegerParam(evrTriggerDropped, evr_trigger_dropped);
|
||||
char buf[256];
|
||||
getStringParam(evrTimeStamp, 256, buf);
|
||||
|
||||
@@ -899,10 +915,25 @@ void Orca::imageTask(){
|
||||
delete[] image;
|
||||
}
|
||||
|
||||
getIntegerParam(ADNumImages, &totalImages);
|
||||
getIntegerParam(ADImageMode, &imageMode);
|
||||
setIntegerParam(ADNumImagesCounter, captransferinfo.nFrameCount);
|
||||
|
||||
getIntegerParam(evrCounts, &evr_counts);
|
||||
evr_counts_since_last_start = evr_counts - initial_evr_counters;
|
||||
if (evr_counts_since_last_start != evr_counts_since_last_start_previous) {
|
||||
setIntegerParam(evrCountsSinceAcqStart, evr_counts_since_last_start);
|
||||
epicsTimeGetCurrent(&prev_trigger_time);
|
||||
evr_counts_since_last_start_previous = evr_counts_since_last_start;
|
||||
}
|
||||
|
||||
epicsTimeGetCurrent(¤t_trigger_time);
|
||||
|
||||
if (epicsTimeDiffInSeconds(¤t_trigger_time, &prev_trigger_time) > (exposure_time + readout_time)) {
|
||||
if ((evr_counts_since_last_start) > captransferinfo.nFrameCount ) {
|
||||
evr_trigger_dropped = evr_counts_since_last_start - captransferinfo.nFrameCount;
|
||||
setIntegerParam(evrTriggerDropped, evr_trigger_dropped);
|
||||
}
|
||||
}
|
||||
|
||||
if ((imageMode == ADImageMultiple && totalImages == captransferinfo.nFrameCount) ||
|
||||
(imageMode == ADImageSingle && captransferinfo.nFrameCount == 1)) {
|
||||
setShutter(0);
|
||||
|
||||
Reference in New Issue
Block a user