diff --git a/ADOrcaApp/src/orca.cpp b/ADOrcaApp/src/orca.cpp index da91796..0a629f0 100644 --- a/ADOrcaApp/src/orca.cpp +++ b/ADOrcaApp/src/orca.cpp @@ -834,6 +834,7 @@ void Orca::imageTask() { uint64_t prevAcquisitionCount = 0; DCAMCAP_TRANSFERINFO captransferinfo; epicsTimeStamp prevAcqTime, currentAcqTime; + epicsTimeStamp acqTimestamp; epicsTimeStamp prev_trigger_time, current_trigger_time; double elapsedTime; int evr_counts = 0; @@ -841,6 +842,7 @@ void Orca::imageTask() { double maxAcqusitionTime, acqusitionRate; int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL; int triggerActive; + char buf[256]; lock(); while (1) { @@ -875,7 +877,7 @@ void Orca::imageTask() { // get image transfer status. unlock(); - imageTransferStatus(m_hdcam, captransferinfo); + imageTransferStatus(m_hdcam, captransferinfo, buf); lock(); if (prevAcquisitionCount < (uint64_t)captransferinfo.nFrameCount) { @@ -926,18 +928,19 @@ void Orca::imageTask() { // Update asyn parameters setIntegerParam(evrCountsSinceAcqStart, evr_counts_since_last_start); setIntegerParam(evrTriggerDropped, evr_trigger_dropped); - char buf[256]; - getStringParam(evrTimeStamp, 256, buf); // remember parsed timestamp values - sscanf(buf, "%u.%u", &mTimeStampSec, &mTimeStampNsec); - timestamp = mTimeStampSec + mTimeStampNsec / 1.e9; - FLOW_ARGS("mTimeStampSec: %u - mTimeStampNsec: %u\n", mTimeStampSec, - mTimeStampNsec); + sscanf(buf, "%u.%u", &acqTimestamp.secPastEpoch, &acqTimestamp.nsec); + acqTimestamp.secPastEpoch -= POSIX_TIME_AT_EPICS_EPOCH; + + timestamp = acqTimestamp.secPastEpoch + acqTimestamp.nsec / 1.e9; + FLOW_ARGS("acqTimestamp.secPastEpoch: %u - acqTimestamp.nsec: %u\n", acqTimestamp.secPastEpoch, + acqTimestamp.nsec); FLOW_ARGS("Timestamp from evr: %f\n", timestamp); } else { + updateTimeStamp(&acqTimestamp); timestamp = (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time); FLOW_ARGS("Timestamp from camera: %f\n", timestamp); @@ -967,7 +970,7 @@ void Orca::imageTask() { if (pImage) { pImage->uniqueId = count; pImage->timeStamp = timestamp; - updateTimeStamp(&pImage->epicsTS); + pImage->epicsTS = acqTimestamp; memcpy(pImage->pData, (epicsUInt16*)image, pImage->dataSize); @@ -1742,7 +1745,7 @@ void Orca::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, } asynStatus Orca::imageTransferStatus(HDCAM hdcam, - DCAMCAP_TRANSFERINFO& captransferinfo) { + DCAMCAP_TRANSFERINFO& captransferinfo, char *buf) { DCAMERR err; const char* functionName = "imageTransferStatus"; memset(&captransferinfo, 0, sizeof(captransferinfo)); @@ -1750,6 +1753,7 @@ asynStatus Orca::imageTransferStatus(HDCAM hdcam, // get number of captured image err = dcamcap_transferinfo(m_hdcam, &captransferinfo); + getStringParam(evrTimeStamp, 256, buf); if (failed(err)) { ERR_ARGS("DCAMERR: 0x%08X [%s]", m_err, "dcamcap_transferinfo"); return asynError; diff --git a/ADOrcaApp/src/orca.h b/ADOrcaApp/src/orca.h index 6a1696b..e2ecbff 100644 --- a/ADOrcaApp/src/orca.h +++ b/ADOrcaApp/src/orca.h @@ -189,9 +189,6 @@ class epicsShareClass Orca : public ADDriver { int readParameter(int propertyID, bool processPV = true); int readParameterStr(int paramIndex); - epicsUInt32 mTimeStampSec; - epicsUInt32 mTimeStampNsec; - void imageTask(); void temperatureTask(); @@ -333,7 +330,7 @@ class epicsShareClass Orca : public ADDriver { int32 rowbytes, int32 cx, int32 cy, epicsUInt32& ts_sec, epicsUInt32& ts_microsec); asynStatus imageTransferStatus(HDCAM hdcam, - DCAMCAP_TRANSFERINFO& captransferinfo); + DCAMCAP_TRANSFERINFO& captransferinfo, char *buf); // wrapper functions for dcamapi int allocateBuffers(unsigned int);