|
|
|
|
@@ -840,6 +840,7 @@ void Orca::imageTask() {
|
|
|
|
|
double exposure_time, readout_time;
|
|
|
|
|
double maxAcqusitionTime, acqusitionRate;
|
|
|
|
|
int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL;
|
|
|
|
|
int triggerActive;
|
|
|
|
|
|
|
|
|
|
lock();
|
|
|
|
|
while (1) {
|
|
|
|
|
@@ -910,14 +911,19 @@ void Orca::imageTask() {
|
|
|
|
|
double timestamp;
|
|
|
|
|
|
|
|
|
|
getIntegerParam(hTriggerSource, &triggerMode);
|
|
|
|
|
|
|
|
|
|
if (triggerMode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) {
|
|
|
|
|
getIntegerParam(evrCounts, &evr_counts);
|
|
|
|
|
|
|
|
|
|
// Count events
|
|
|
|
|
evr_counts_since_last_start = evr_counts - initial_evr_counters;
|
|
|
|
|
evr_trigger_dropped =
|
|
|
|
|
evr_counts_since_last_start - captransferinfo.nFrameCount;
|
|
|
|
|
FLOW_ARGS("EVR event count: %d\n", evr_counts);
|
|
|
|
|
FLOW_ARGS("evr_counts_since_last_start: %d\n",
|
|
|
|
|
evr_counts_since_last_start);
|
|
|
|
|
|
|
|
|
|
// Update asyn parameters
|
|
|
|
|
setIntegerParam(evrCountsSinceAcqStart, evr_counts_since_last_start);
|
|
|
|
|
setIntegerParam(evrTriggerDropped, evr_trigger_dropped);
|
|
|
|
|
char buf[256];
|
|
|
|
|
@@ -929,20 +935,23 @@ void Orca::imageTask() {
|
|
|
|
|
FLOW_ARGS("mTimeStampSec: %u - mTimeStampNsec: %u\n", mTimeStampSec,
|
|
|
|
|
mTimeStampNsec);
|
|
|
|
|
FLOW_ARGS("Timestamp from evr: %f\n", timestamp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
timestamp =
|
|
|
|
|
(ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time);
|
|
|
|
|
FLOW_ARGS("Timestamp from camera: %f\n", timestamp);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FLOW_ARGS("readout_time: %f - exposure_time: %f\n", readout_time,
|
|
|
|
|
exposure_time);
|
|
|
|
|
|
|
|
|
|
// calculate time since previous frame and update framerate.
|
|
|
|
|
epicsTimeGetCurrent(¤tAcqTime);
|
|
|
|
|
elapsedTime = epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime);
|
|
|
|
|
prevAcqTime = currentAcqTime;
|
|
|
|
|
|
|
|
|
|
status = setDoubleParam(hFrameRate, (double)(1 / elapsedTime));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getIntegerParam(NDArrayCallbacks, &callback);
|
|
|
|
|
if (callback) {
|
|
|
|
|
NDArray* pImage;
|
|
|
|
|
@@ -973,6 +982,7 @@ void Orca::imageTask() {
|
|
|
|
|
|
|
|
|
|
setIntegerParam(ADNumImagesCounter, captransferinfo.nFrameCount);
|
|
|
|
|
|
|
|
|
|
// Check if evr count number has been updated and update parameters.
|
|
|
|
|
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) {
|
|
|
|
|
@@ -980,23 +990,35 @@ void Orca::imageTask() {
|
|
|
|
|
epicsTimeGetCurrent(&prev_trigger_time);
|
|
|
|
|
evr_counts_since_last_start_previous = evr_counts_since_last_start;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getIntegerParam(hTriggerActive, &triggerActive);
|
|
|
|
|
|
|
|
|
|
getDoubleParam(ADAcquirePeriod, &acqusitionRate);
|
|
|
|
|
getIntegerParam(ADStatus, &acqStatus);
|
|
|
|
|
maxAcqusitionTime = acqusitionRate * 2;
|
|
|
|
|
epicsTimeGetCurrent(¤tAcqTime);
|
|
|
|
|
if ((epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime) >
|
|
|
|
|
maxAcqusitionTime) &&
|
|
|
|
|
acqStatus != ADStatusAborted) {
|
|
|
|
|
FLOW_ARGS("maxAcqusitionTime %f\n", maxAcqusitionTime);
|
|
|
|
|
setShutter(0);
|
|
|
|
|
stopAcquire();
|
|
|
|
|
setIntegerParam(ADAcquire, 0);
|
|
|
|
|
setIntegerParam(hAcqControl, 0);
|
|
|
|
|
setIntegerParam(ADStatus, ADStatusError);
|
|
|
|
|
setStringParam(ADStatusMessage, "Acquisition timeout");
|
|
|
|
|
if (triggerActive == DCAMPROP_TRIGGERACTIVE__SYNCREADOUT) {
|
|
|
|
|
|
|
|
|
|
} else if (triggerActive == DCAMPROP_TRIGGERACTIVE__LEVEL) {
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
// Checks if the elapsed time since last frame is longer than the exposure,
|
|
|
|
|
// stop waiting for image and put in timeout status.
|
|
|
|
|
getDoubleParam(ADAcquirePeriod, &acqusitionRate);
|
|
|
|
|
getIntegerParam(ADStatus, &acqStatus);
|
|
|
|
|
maxAcqusitionTime = acqusitionRate * 2; // arbitrary time longer than the acqusiontime.
|
|
|
|
|
epicsTimeGetCurrent(¤tAcqTime);
|
|
|
|
|
if ((epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime) >
|
|
|
|
|
maxAcqusitionTime) &&
|
|
|
|
|
acqStatus != ADStatusAborted) {
|
|
|
|
|
FLOW_ARGS("maxAcqusitionTime %f\n", maxAcqusitionTime);
|
|
|
|
|
setShutter(0);
|
|
|
|
|
stopAcquire();
|
|
|
|
|
setIntegerParam(ADAcquire, 0);
|
|
|
|
|
setIntegerParam(hAcqControl, 0);
|
|
|
|
|
setIntegerParam(ADStatus, ADStatusError);
|
|
|
|
|
setStringParam(ADStatusMessage, "Acquisition timeout");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check if the camera has failed a trigger from the evr. Updates the
|
|
|
|
|
// amount dropped evr triggers.
|
|
|
|
|
epicsTimeGetCurrent(¤t_trigger_time);
|
|
|
|
|
if (epicsTimeDiffInSeconds(¤t_trigger_time, &prev_trigger_time) >
|
|
|
|
|
(exposure_time + readout_time)) {
|
|
|
|
|
@@ -1007,6 +1029,7 @@ void Orca::imageTask() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check if the acqusition is done (support single and multiple exposure)
|
|
|
|
|
if ((imageMode == ADImageMultiple &&
|
|
|
|
|
totalImages == captransferinfo.nFrameCount) ||
|
|
|
|
|
(imageMode == ADImageSingle && captransferinfo.nFrameCount == 1)) {
|
|
|
|
|
@@ -1078,7 +1101,7 @@ asynStatus Orca::writeInt32(asynUser* pasynUser, epicsInt32 value) {
|
|
|
|
|
} else if (!value &&
|
|
|
|
|
(adstatus == ADStatusAcquire || adstatus == ADStatusError ||
|
|
|
|
|
adstatus == ADStatusWaiting)) {
|
|
|
|
|
/* This was a command to stop acquisition */
|
|
|
|
|
/* This was a command to stop acquisition */ //But not anymore?
|
|
|
|
|
setIntegerParam(ADStatus, ADStatusAborted);
|
|
|
|
|
setIntegerParam(hAcqControl, 0);
|
|
|
|
|
setStringParam(ADStatusMessage, "Acquisition aborted by user");
|
|
|
|
|
|