diff --git a/ADApp/pluginSrc/NDPluginCircularBuff.cpp b/ADApp/pluginSrc/NDPluginCircularBuff.cpp index 5e7bf67c0..69d6b8bda 100644 --- a/ADApp/pluginSrc/NDPluginCircularBuff.cpp +++ b/ADApp/pluginSrc/NDPluginCircularBuff.cpp @@ -190,6 +190,7 @@ void NDPluginCircularBuff::processCallbacks(NDArray *pArray) setStringParam(NDCircBuffStatus, preCount ? "Buffer filling" : "Dropping frames"); } else { + setIntegerParam(NDCircBuffSoftTrigger, 0); setIntegerParam(NDCircBuffTriggered, 0); setIntegerParam(NDCircBuffControl, 0); setStringParam(NDCircBuffStatus, "Acquisition Completed"); diff --git a/ADApp/pluginTests/test_NDPluginCircularBuff.cpp b/ADApp/pluginTests/test_NDPluginCircularBuff.cpp index c174d66ce..1359d3863 100644 --- a/ADApp/pluginTests/test_NDPluginCircularBuff.cpp +++ b/ADApp/pluginTests/test_NDPluginCircularBuff.cpp @@ -183,4 +183,34 @@ BOOST_AUTO_TEST_CASE(test_PreBufferOrder) BOOST_CHECK_EQUAL(3, ((uint8_t *)ds->arrays[3]->pData)[0]); } +BOOST_AUTO_TEST_CASE(test_SoftTriggerClearedAfterAcquisition) +{ + size_t gotbytes; + cbCalc->write("0", 2, &gotbytes); + + const int postTrigger = 5; + cbPreTrigger->write(10); + cbPostTrigger->write(postTrigger); + cbControl->write(1); + + size_t dims[2] = {2,5}; + NDArray *testArray = arrayPool->alloc(2,dims,NDFloat64,0,NULL); + + // Fill the pre-buffer + for (int i = 0; i < 10; i++) + cbProcess(testArray); + + // Fire the soft trigger + cbSoftTrigger->write(1); + + // Push through the post-trigger frames to complete the acquisition + for (int i = 0; i < postTrigger; i++) + cbProcess(testArray); + + // Once the acquisition completes the soft trigger busy record must be cleared + epicsInt32 softTrigger; + cbSoftTrigger->read(&softTrigger); + BOOST_CHECK_EQUAL(softTrigger, 0); +} + BOOST_AUTO_TEST_SUITE_END()