9 Commits
1.1.0 ... 1.1.2

Author SHA1 Message Date
Jim Larsson
62065f7f44 Merge branch 'v1.1.2_fix' into 'master'
uncomment line

See merge request epics-modules/adorca!28
2024-12-19 10:49:18 +00:00
Jim Larsson
00cb454e8c uncomment line 2024-12-19 11:24:08 +01:00
Jim Larsson
66cbff0ca4 Merge branch '1.1.2_bugfixes' into 'master'
fix compilation errors and warnings

See merge request epics-modules/adorca!27
2024-12-18 13:17:23 +00:00
Jim Larsson
934ce7afd0 fix compilation errors and warnings 2024-12-18 13:16:44 +00:00
Jim Larsson
47a2b8435f Merge branch 'ICSHWI_19722_orca_acq_modes' into 'master'
Icshwi 19722 orca acq modes

See merge request epics-modules/adorca!26
2024-12-18 13:04:13 +00:00
Jim Larsson
eaebcece9d added placeholder for LEVEL and sync triggers 2024-12-05 16:21:56 +01:00
Jim Larsson
994242e524 seperate timeout from syncreadout 2024-12-03 14:47:06 +01:00
Douglas Araujo
ca22a8166c Fix initial value for SensorCooler 2024-10-29 10:57:26 +01:00
Douglas Araujo
6f0f6357be Fix mbbi item string length 2024-10-29 10:55:30 +01:00
3 changed files with 47 additions and 21 deletions

3
.gitignore vendored
View File

@@ -14,3 +14,6 @@ ecdc-kafka-ca.crt
.pre-commit-config.yaml .pre-commit-config.yaml
.clang-format .clang-format
.iocsh_history .iocsh_history
build
build.sh

View File

@@ -1676,9 +1676,9 @@ record(mbbi, "$(P)$(R)FrameStampProd-R") {
field(DESC, "Timestamp produced source") field(DESC, "Timestamp produced source")
field(DTYP, "asynInt32") field(DTYP, "asynInt32")
field(ZRVL, "2") field(ZRVL, "2")
field(ZRST, "Frame timestamp DCAM module") field(ZRST, "DCAM module")
field(ONVL, "5") field(ONVL, "5")
field(ONST, "Frame timestamp image device") field(ONST, "Image device")
field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_FRAMESTAMP_PRODUCER") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_FRAMESTAMP_PRODUCER")
field(SCAN, "I/O Intr") field(SCAN, "I/O Intr")
} }
@@ -1694,7 +1694,7 @@ record(mbbo, "$(P)$(R)SensorCooler-S") {
field(TWVL, "4") field(TWVL, "4")
field(TWST, "Max") field(TWST, "Max")
field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_COOLER") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_COOLER")
field(VAL, "Off") field(VAL, "0")
} }
record(mbbi, "$(P)$(R)SensorCooler-RB") { record(mbbi, "$(P)$(R)SensorCooler-RB") {

View File

@@ -840,6 +840,7 @@ void Orca::imageTask() {
double exposure_time, readout_time; double exposure_time, readout_time;
double maxAcqusitionTime, acqusitionRate; double maxAcqusitionTime, acqusitionRate;
int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL; int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL;
int triggerActive;
lock(); lock();
while (1) { while (1) {
@@ -910,14 +911,19 @@ void Orca::imageTask() {
double timestamp; double timestamp;
getIntegerParam(hTriggerSource, &triggerMode); getIntegerParam(hTriggerSource, &triggerMode);
if (triggerMode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) { if (triggerMode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) {
getIntegerParam(evrCounts, &evr_counts); getIntegerParam(evrCounts, &evr_counts);
// Count events
evr_counts_since_last_start = evr_counts - initial_evr_counters; evr_counts_since_last_start = evr_counts - initial_evr_counters;
evr_trigger_dropped = evr_trigger_dropped =
evr_counts_since_last_start - captransferinfo.nFrameCount; evr_counts_since_last_start - captransferinfo.nFrameCount;
FLOW_ARGS("EVR event count: %d\n", evr_counts); FLOW_ARGS("EVR event count: %d\n", evr_counts);
FLOW_ARGS("evr_counts_since_last_start: %d\n", FLOW_ARGS("evr_counts_since_last_start: %d\n",
evr_counts_since_last_start); evr_counts_since_last_start);
// Update asyn parameters
setIntegerParam(evrCountsSinceAcqStart, evr_counts_since_last_start); setIntegerParam(evrCountsSinceAcqStart, evr_counts_since_last_start);
setIntegerParam(evrTriggerDropped, evr_trigger_dropped); setIntegerParam(evrTriggerDropped, evr_trigger_dropped);
char buf[256]; char buf[256];
@@ -929,6 +935,8 @@ void Orca::imageTask() {
FLOW_ARGS("mTimeStampSec: %u - mTimeStampNsec: %u\n", mTimeStampSec, FLOW_ARGS("mTimeStampSec: %u - mTimeStampNsec: %u\n", mTimeStampSec,
mTimeStampNsec); mTimeStampNsec);
FLOW_ARGS("Timestamp from evr: %f\n", timestamp); FLOW_ARGS("Timestamp from evr: %f\n", timestamp);
} else { } else {
timestamp = timestamp =
(ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time); (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time);
@@ -937,10 +945,11 @@ void Orca::imageTask() {
FLOW_ARGS("readout_time: %f - exposure_time: %f\n", readout_time, FLOW_ARGS("readout_time: %f - exposure_time: %f\n", readout_time,
exposure_time); exposure_time);
// calculate time since previous frame and update framerate.
epicsTimeGetCurrent(&currentAcqTime); epicsTimeGetCurrent(&currentAcqTime);
elapsedTime = epicsTimeDiffInSeconds(&currentAcqTime, &prevAcqTime); elapsedTime = epicsTimeDiffInSeconds(&currentAcqTime, &prevAcqTime);
prevAcqTime = currentAcqTime; prevAcqTime = currentAcqTime;
status = setDoubleParam(hFrameRate, (double)(1 / elapsedTime)); status = setDoubleParam(hFrameRate, (double)(1 / elapsedTime));
getIntegerParam(NDArrayCallbacks, &callback); getIntegerParam(NDArrayCallbacks, &callback);
@@ -973,6 +982,7 @@ void Orca::imageTask() {
setIntegerParam(ADNumImagesCounter, captransferinfo.nFrameCount); setIntegerParam(ADNumImagesCounter, captransferinfo.nFrameCount);
// Check if evr count number has been updated and update parameters.
getIntegerParam(evrCounts, &evr_counts); getIntegerParam(evrCounts, &evr_counts);
evr_counts_since_last_start = evr_counts - initial_evr_counters; evr_counts_since_last_start = evr_counts - initial_evr_counters;
if (evr_counts_since_last_start != evr_counts_since_last_start_previous) { if (evr_counts_since_last_start != evr_counts_since_last_start_previous) {
@@ -981,9 +991,18 @@ void Orca::imageTask() {
evr_counts_since_last_start_previous = evr_counts_since_last_start; evr_counts_since_last_start_previous = evr_counts_since_last_start;
} }
getIntegerParam(hTriggerActive, &triggerActive);
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); getDoubleParam(ADAcquirePeriod, &acqusitionRate);
getIntegerParam(ADStatus, &acqStatus); getIntegerParam(ADStatus, &acqStatus);
maxAcqusitionTime = acqusitionRate * 2; maxAcqusitionTime = acqusitionRate * 2; // arbitrary time longer than the acqusiontime.
epicsTimeGetCurrent(&currentAcqTime); epicsTimeGetCurrent(&currentAcqTime);
if ((epicsTimeDiffInSeconds(&currentAcqTime, &prevAcqTime) > if ((epicsTimeDiffInSeconds(&currentAcqTime, &prevAcqTime) >
maxAcqusitionTime) && maxAcqusitionTime) &&
@@ -996,7 +1015,10 @@ void Orca::imageTask() {
setIntegerParam(ADStatus, ADStatusError); setIntegerParam(ADStatus, ADStatusError);
setStringParam(ADStatusMessage, "Acquisition timeout"); setStringParam(ADStatusMessage, "Acquisition timeout");
} }
}
// Check if the camera has failed a trigger from the evr. Updates the
// amount dropped evr triggers.
epicsTimeGetCurrent(&current_trigger_time); epicsTimeGetCurrent(&current_trigger_time);
if (epicsTimeDiffInSeconds(&current_trigger_time, &prev_trigger_time) > if (epicsTimeDiffInSeconds(&current_trigger_time, &prev_trigger_time) >
(exposure_time + readout_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 && if ((imageMode == ADImageMultiple &&
totalImages == captransferinfo.nFrameCount) || totalImages == captransferinfo.nFrameCount) ||
(imageMode == ADImageSingle && captransferinfo.nFrameCount == 1)) { (imageMode == ADImageSingle && captransferinfo.nFrameCount == 1)) {
@@ -1078,7 +1101,7 @@ asynStatus Orca::writeInt32(asynUser* pasynUser, epicsInt32 value) {
} else if (!value && } else if (!value &&
(adstatus == ADStatusAcquire || adstatus == ADStatusError || (adstatus == ADStatusAcquire || adstatus == ADStatusError ||
adstatus == ADStatusWaiting)) { adstatus == ADStatusWaiting)) {
/* This was a command to stop acquisition */ /* This was a command to stop acquisition */ //But not anymore?
setIntegerParam(ADStatus, ADStatusAborted); setIntegerParam(ADStatus, ADStatusAborted);
setIntegerParam(hAcqControl, 0); setIntegerParam(hAcqControl, 0);
setStringParam(ADStatusMessage, "Acquisition aborted by user"); setStringParam(ADStatusMessage, "Acquisition aborted by user");