Add mechanism to check dropped frames

This commit is contained in:
Douglas Araujo
2024-01-29 09:21:22 +01:00
parent 94c13c6a48
commit 81ee3c28a5
5 changed files with 58 additions and 12 deletions
+38 -7
View File
@@ -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(&current_trigger_time);
if (epicsTimeDiffInSeconds(&current_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);