From 483d80accba29764ae36990bcf8cad7be86fb182 Mon Sep 17 00:00:00 2001 From: Matthew Newville Date: Mon, 14 Jul 2025 13:09:38 -0500 Subject: [PATCH 1/2] a better solution: wait at frame0 until getNumFramesRead() returns 0 --- xspress3App/src/xspress3Epics.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/xspress3App/src/xspress3Epics.cpp b/xspress3App/src/xspress3Epics.cpp index 7fd4d297..4b6e98de 100644 --- a/xspress3App/src/xspress3Epics.cpp +++ b/xspress3App/src/xspress3Epics.cpp @@ -2004,6 +2004,7 @@ static void xsp3DataTaskC(void *xspAD) bool acquire=false; bool aborted=false; bool error=false; + bool notready=false; int numChannels, maxSpectra, frameNumber, numFrames=0, acquired, lastAcquired; //int frame_count, last_frame_count, frame_counter, frames_remaining, frame_offset; @@ -2033,9 +2034,16 @@ static void xsp3DataTaskC(void *xspAD) numChannels = dims[1]; numFrames = pXspAD->getNumFramesToAcquire(); pXspAD->xspAsynPrint(ASYN_TRACE_FLOW, "Collect %d frames\n", numFrames); - // printf("data task acquire=%d, numframes=%d / frameNumber=%d\n", (int)acquire, numFrames, frameNumber); - while (acquire && (frameNumber < numFrames)) { - if (acquired == 0) { usleep(25000); } + //printf("data task acquire=%d, numframes=%d / frameNumber=%d\n", (int)acquire, numFrames, frameNumber); + if (acquire && (frameNumber == 0)) { + notready = pXspAD->getNumFramesRead(); + while (notready) { + usleep(250); + notready = pXspAD->getNumFramesRead(); + } + } + while (acquire && (frameNumber < numFrames)) { + usleep(1); acquired = pXspAD->getNumFramesRead(); if (frameNumber < acquired) { lastAcquired = acquired; From aed19ae7a80fc11da31dd1803b702283fd74f5cc Mon Sep 17 00:00:00 2001 From: Matthew Newville Date: Tue, 22 Jul 2025 15:14:27 -0500 Subject: [PATCH 2/2] add max time to wait for frame 1 to be ready --- xspress3App/src/xspress3Epics.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/xspress3App/src/xspress3Epics.cpp b/xspress3App/src/xspress3Epics.cpp index 4b6e98de..e80371d1 100644 --- a/xspress3App/src/xspress3Epics.cpp +++ b/xspress3App/src/xspress3Epics.cpp @@ -212,7 +212,7 @@ void Xspress3::createInitialParameters() createParam(xsp3ResetParamString, asynParamInt32, &xsp3ResetParam); createParam(xsp3EraseParamString, asynParamInt32, &xsp3EraseParam); createParam(xsp3EraseStartParamString, asynParamInt32, &xsp3EraseStartParam); - createParam(xsp3SoftTriggerParamString, asynParamInt32, &xsp3SoftTriggerParam); + createParam(xsp3SoftTriggerParamString, asynParamInt32, &xsp3SoftTriggerParam); createParam(xsp3NumChannelsParamString, asynParamInt32, &xsp3NumChannelsParam); createParam(xsp3MaxNumChannelsParamString, asynParamInt32, &xsp3MaxNumChannelsParam); createParam(xsp3MaxSpectraParamString, asynParamInt32, &xsp3MaxSpectraParam); @@ -2005,7 +2005,7 @@ static void xsp3DataTaskC(void *xspAD) bool aborted=false; bool error=false; bool notready=false; - + int notready_count; int numChannels, maxSpectra, frameNumber, numFrames=0, acquired, lastAcquired; //int frame_count, last_frame_count, frame_counter, frames_remaining, frame_offset; size_t dims[2]; @@ -2035,15 +2035,24 @@ static void xsp3DataTaskC(void *xspAD) numFrames = pXspAD->getNumFramesToAcquire(); pXspAD->xspAsynPrint(ASYN_TRACE_FLOW, "Collect %d frames\n", numFrames); //printf("data task acquire=%d, numframes=%d / frameNumber=%d\n", (int)acquire, numFrames, frameNumber); - if (acquire && (frameNumber == 0)) { - notready = pXspAD->getNumFramesRead(); + + // add check that getNumFrames returns 0 for the 0th frame. + // using this counter to indicate "ready to read frame" seems + // fragile at frames 0 and 1. + if (acquire && (frameNumber == 0) ) { + notready_count = 0; + notready = pXspAD->getNumFramesRead(); while (notready) { - usleep(250); + usleep(100); notready = pXspAD->getNumFramesRead(); + notready_count +=1; + if (notready_count > 5000) { + notready = 0; + } } } while (acquire && (frameNumber < numFrames)) { - usleep(1); + usleep(2); acquired = pXspAD->getNumFramesRead(); if (frameNumber < acquired) { lastAcquired = acquired;