Package dcamj

Source Code of dcamj.DcamAquisitionRunnable

package dcamj;

import dcamapi.DCAMCAP_TRANSFERINFO;
import dcamapi.DcamapiLibrary.DCAMWAIT_EVENT;
import dcamj.utils.StopWatch;

class DcamAquisitionRunnable implements Runnable
{

  /**
   *
   */
  private final DcamAcquisition mDcamAcquisition;
  volatile boolean mTrueIfStarted = false;
  volatile boolean mStopContinousIfFalse = true;
  volatile boolean mStopIfFalse = true;
  volatile boolean mTrueIfStopped = false;
  volatile boolean mTrueIfError = false;

  private final long mNumberOfFramesToCapture;
  private final boolean mContinuousAcquisition;
  private final boolean mStackAcquisition;

  public DcamAquisitionRunnable(DcamAcquisition pDcamAcquisition,
                                final long pNumberOfFramesToCapture,
                                final boolean pContinuousAcquisition,
                                final boolean pStackAcquisition)
  {
    mDcamAcquisition = pDcamAcquisition;
    mNumberOfFramesToCapture = pNumberOfFramesToCapture;
    mContinuousAcquisition = pContinuousAcquisition;
    mStackAcquisition = pStackAcquisition;
  }

  @SuppressWarnings("unused")
  @Override
  public void run()
  {

    try
    {
      System.out.println("DcamJ: Starting acquisition:");

      mTrueIfStarted = true;
      mDcamAcquisition.mAcquiredFrameIndex = 0;

      if (mStackAcquisition && mContinuousAcquisition)
        while (mStopContinousIfFalse)
        {
          runOnce();
        }
      else
      {
        runOnce();
      }

    }
    catch (final Throwable e)
    {
      e.printStackTrace();
      mTrueIfError = true;
    }
    finally
    {
      if (!mStackAcquisition && mContinuousAcquisition)
        mDcamAcquisition.mDcamDevice.stop();
      mTrueIfStopped = true;
      System.out.println("DcamJ: stopping acquisition:");
      mDcamAcquisition.mAcquisitionFinishedSignal.countDown();
    }

  }

  private void runOnce()
  {
    mStopIfFalse = true;

    if (mContinuousAcquisition && !mStackAcquisition)
    {
      if (mDcamAcquisition.mDebug)
        System.out.format("DcamJ: Starting continuous acquisition \n");
      mDcamAcquisition.mDcamDevice.startContinuous();
    }
    else
    {
      if (mDcamAcquisition.mDebug)
        System.out.format("DcamJ: Starting acquisition sequence of %d frames \n",
                          mNumberOfFramesToCapture);/**/
      mDcamAcquisition.mDcamDevice.startSequence();
    }

    int lWaitTimeout = 1;

    /*if (mStackAcquisition)
      lWaitTimeout = 3000; // + (int) (10 * 1000 * mNumberOfFramesToCapture *
                            // mExposureInSeconds)
    /*else
    {
      if (mDcamAcquisition.isExternalTriggering())
        lWaitTimeout = 5000;
      else
        lWaitTimeout = 3000;
    }/**/

    if (mDcamAcquisition.mDebug)
      System.out.format("DcamJ: DcamWait timeout set to %d ms \n",
                        lWaitTimeout);/**/

    final long lNumberOfBuffers = mDcamAcquisition.getBufferControl()
                                                  .getNumberOfSinglePlaneBuffers();

    DCAMCAP_TRANSFERINFO lTransferinfo = mDcamAcquisition.getTransferinfo();
    mDcamAcquisition.mAcquiredFrameIndex = lTransferinfo.nFrameCount();

    while (mStopIfFalse)
    {

      // DCAMCAP_EVENT_FRAMEREADYORSTOPPED(2|16),
      final DCAMWAIT_EVENT lDcamcapEventToWaitFor;

      if (mContinuousAcquisition && !mStackAcquisition)
        lDcamcapEventToWaitFor = DCAMWAIT_EVENT.DCAMCAP_EVENT_FRAMEREADYORSTOPPED;
      else if (mStackAcquisition)
        lDcamcapEventToWaitFor = DCAMWAIT_EVENT.DCAMCAP_EVENT_FRAMEREADYORSTOPPED;
      else
        lDcamcapEventToWaitFor = DCAMWAIT_EVENT.DCAMCAP_EVENT_FRAMEREADY;

      mDcamAcquisition.mAcquisitionStartedSignal.countDown();
      if (mDcamAcquisition.mDebug)
        System.out.print("waitForEvent.before... ");
      final boolean lWaitSuccess = (mDcamAcquisition.mDcamDevice.getDcamWait().waitForEvent(lDcamcapEventToWaitFor,
                                                                                            lWaitTimeout));
      if (mDcamAcquisition.mDebug)
        System.out.println(" ...after.");
      final long lAcquisitionTimeStampInNanoseconds = StopWatch.absoluteTimeInNanoseconds();
      // System.out.println(System.nanoTime());

      lTransferinfo = mDcamAcquisition.getTransferinfo();

      final long lNumberOfFramesWrittenByDrivertoBuffers = lTransferinfo.nFrameCount();
      final long lDriversFrameIndex = lNumberOfFramesWrittenByDrivertoBuffers - 1;
      final long lReceivedFrameIndexInBufferList = lTransferinfo.nNewestFrameIndex();

      if (mDcamAcquisition.mDebug)
      {
        System.out.println("lDriversFrameIndex=" + lDriversFrameIndex);
        System.out.println("lReceivedFrameIndexInBufferList=" + lReceivedFrameIndexInBufferList);
      }

      if (!lWaitSuccess)
      {
        if (!mDcamAcquisition.isExternalTriggering() && !mDcamAcquisition.isSoftwareTriggering())
        {
          System.err.println("DcamJ: waiting for event failed!!!!");
          System.err.format("DcamJ: frame index = %d (local index = %d) out of %d frames to capture (%s acquisition)  \n",
                            mDcamAcquisition.mAcquiredFrameIndex,
                            lReceivedFrameIndexInBufferList,
                            mNumberOfFramesToCapture,
                            mStackAcquisition  ? "stack"
                                              : "single plane");
          System.err.println("DcamJ: timeout waiting for frame!");
          break;
        }
        continue;
      }

      final long lDcamWaitEvent = mDcamAcquisition.mDcamDevice.getDcamWait()
                                                              .getEvent();
      final boolean lReceivedStopEvent = lDcamWaitEvent == DCAMWAIT_EVENT.DCAMCAP_EVENT_STOPPED.value;
      final boolean lReceivedFrameReadyEvent = lDcamWaitEvent == DCAMWAIT_EVENT.DCAMCAP_EVENT_FRAMEREADY.value;

      DcamFrame lDcamFrame = null;

      if (mStackAcquisition && lReceivedStopEvent)
      {
        if (mDcamAcquisition.mDebug)
          System.out.println("DcamJ: Received Stop Event");
        if (mStackAcquisition)
        {
          lDcamFrame = mDcamAcquisition.getBufferControl()
                                        .getStackDcamFrame();
          lDcamFrame.setIndex(lDriversFrameIndex);
          lDcamFrame.setTimeStampInNs(lAcquisitionTimeStampInNanoseconds);
          mDcamAcquisition.notifyListenersmDcamAcquisition.mAcquiredFrameIndex,
                                            lAcquisitionTimeStampInNanoseconds,
                                            0,
                                            lDcamFrame);
          mDcamAcquisition.mAcquiredFrameIndex++;
          mStopIfFalse = false;
        }
      }

      if (!mStackAcquisition && lReceivedFrameReadyEvent)
      {
        long lFirstFrameNotYetAcquired = mDcamAcquisition.mAcquiredFrameIndex;
        long lNumberOfFramesToAcquire = lDriversFrameIndex - lFirstFrameNotYetAcquired;
        long lRingBufferFrameIndex = (lReceivedFrameIndexInBufferList - lNumberOfFramesToAcquire);
        while (lRingBufferFrameIndex < 0)
          lRingBufferFrameIndex += lNumberOfBuffers;
        lRingBufferFrameIndex %= lNumberOfBuffers;
        for (long lFrameIndex = lFirstFrameNotYetAcquired; lFrameIndex <= lDriversFrameIndex; lFrameIndex++)
        {
          lDcamFrame = mDcamAcquisition.getBufferControl()
                                        .getDcamFrameForIndex(lRingBufferFrameIndex);
          lDcamFrame.setIndex(lFrameIndex);
          lDcamFrame.setTimeStampInNs(lAcquisitionTimeStampInNanoseconds);
          mDcamAcquisition.notifyListenerslFrameIndex,
                                            lAcquisitionTimeStampInNanoseconds,
                                            lRingBufferFrameIndex,
                                            lDcamFrame);
          mDcamAcquisition.mAcquiredFrameIndex++;
          lRingBufferFrameIndex = (lRingBufferFrameIndex + 1) % lNumberOfBuffers;
        }
      }

      if (lDcamFrame != null)
      {
        if (mDcamAcquisition.mDebug)
          System.out.format("DcamJ: true frame index = %d, acquired frame index = %d (local index = %d) \n",
                            lDriversFrameIndex,
                            mDcamAcquisition.mAcquiredFrameIndex,
                            lReceivedFrameIndexInBufferList);

        lDcamFrame.setIndex(lDriversFrameIndex);
        lDcamFrame.setTimeStampInNs(lAcquisitionTimeStampInNanoseconds);
      }

      if (lReceivedFrameReadyEvent)
      {
        if (mDcamAcquisition.mDebug)
          System.out.println("DcamJ: Received frame ready Event");

        if (!mContinuousAcquisition && !mStackAcquisition
            && lReceivedFrameIndexInBufferList >= mNumberOfFramesToCapture - 1)
        {
          mStopIfFalse = false;
        }

      }

    }

    // if (!mContinuousAcquisition)
    {
      // System.out.println("getTransferinfo.before");
      lTransferinfo = mDcamAcquisition.getTransferinfo();
      // System.out.println("getTransferinfo.after");

      final int lNumberOfFramesWrittenByDrivertoBuffers = (int) lTransferinfo.nFrameCount();

      final long lReceivedFrameIndexInBufferList = lTransferinfo.nNewestFrameIndex();

      if (mDcamAcquisition.mDebug)
      {
        System.out.println("lNumberOfFramesWrittenByDrivertoBuffers=" + lNumberOfFramesWrittenByDrivertoBuffers);
        System.out.println("lReceivedFrameIndexInBufferList=" + lReceivedFrameIndexInBufferList);
        System.out.format("DcamJ: Wrote %d frames into external buffers (local frame index=%d) \n",
                          lNumberOfFramesWrittenByDrivertoBuffers,
                          lReceivedFrameIndexInBufferList);/**/
      }

      final boolean lWrongNumberofFramesAcquired = lNumberOfFramesWrittenByDrivertoBuffers != mNumberOfFramesToCapture;
      if (!mContinuousAcquisition && lWrongNumberofFramesAcquired)
      {
        System.err.format("DcamJ: Wrong number of frames acquired!\n");
        mTrueIfError = true;
      }

    }
  }

}
TOP

Related Classes of dcamj.DcamAquisitionRunnable

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.