Skip to content

ContinuousAdcWorker Doesn't Set or Track Flags #12

Description

@sjoubanian

The C++ implementation in adc-threads.cpp doesn't currently set or track flags. To start, this implementation sets a flag if buffers are created during the workloop, and tracks them to the callback invocation.
The macOS port also tracks status codes returned by AWU_GenericBulkIn with a new argument to the callback (and silences them from aiousb_library_err_print), but requires a larger modification.

diff --git a/aiousb/adc-threads.cpp b/aiousb/adc-threads.cpp
index 67eef3d..0388df3 100644
--- a/aiousb/adc-threads.cpp
+++ b/aiousb/adc-threads.cpp
@@ -434,6 +434,7 @@ ContinuousBufferManager::ContinuousBufferManager(int Count, size_t Size) : mSize
       ContBuff *Current = new ContBuff;
       Current->data = new uint16_t[Size];
       Current->used = 0;
+      Current->flags = 0;
 
       mEmptyBuffers->enqueue(Current);
     }
@@ -468,7 +469,7 @@ ContinuousBufferManager::~ContinuousBufferManager()
     delete mDataBuffers;
 }
 
-uint16_t* ContinuousBufferManager::EmptyBufferGet()
+uint16_t* ContinuousBufferManager::EmptyBufferGet(uint8_t *created)
 {
   ContBuff *Buff;
   uint16_t *retval;
@@ -477,10 +478,12 @@ uint16_t* ContinuousBufferManager::EmptyBufferGet()
 
   if (Buff == NULL)
     {
+      *created = true;
       retval = new uint16_t[mSize];
     }
   else
   {
+    *created = false;
     retval = Buff->data;
     delete Buff;
   }
@@ -497,22 +500,30 @@ void ContinuousBufferManager::EmptyBufferPut(uint16_t* Buff)
   mEmptyBuffers->enqueue(Current);
 }
 
-void ContinuousBufferManager::DataBufferGet(uint16_t **Buff, uint32_t *Used)
+void ContinuousBufferManager::DataBufferGet(uint16_t **Buff, uint32_t *Used, uint32_t *Flags)
 {
   ContBuff *Current = mDataBuffers->dequeue();
   if (Current != nullptr)
   {
     *Buff = Current->data;
     *Used = Current->used;
+    *Flags = Current->flags;
     delete Current;
   }
+  else
+  {
+      *Buff = nullptr;
+      *Used = 0;
+      *Flags = 0;
+  }
 }
 
-void ContinuousBufferManager::DataBufferPut(uint16_t* Buff, uint32_t Used)
+void ContinuousBufferManager::DataBufferPut(uint16_t* Buff, uint32_t Used, uint32_t Flags)
 {
   ContBuff *Current = new ContBuff;
   Current->data = Buff;
   Current->used = Used;
+  Current->flags = Flags;
   mDataBuffers->enqueue(Current);
 }
 
@@ -581,7 +592,8 @@ void ContinuousAdcWorker::ExecuteCapture ()
 
     while (!mTerminated)
       {
-        this_buff = mBuffManager->EmptyBufferGet();
+        uint8_t created;
+        this_buff = mBuffManager->EmptyBufferGet(&created);
 
         status = AWU_GenericBulkIn(mDevice,
                                       0,
@@ -595,7 +607,7 @@ void ContinuousAdcWorker::ExecuteCapture ()
         }
         if (used != 0)
           {
-            mBuffManager->DataBufferPut(this_buff, used);
+            mBuffManager->DataBufferPut(this_buff, used, created ? ADC_CONT_CALLBACK_FLAG_INSERTED : 0, status);
           }
         else
         {
@@ -635,7 +647,8 @@ void ContinuousAdcWorker::ExecuteCapture ()
 
     if ( bytes_left )
       {
-        this_buff = mBuffManager->EmptyBufferGet();
+        uint8_t created;
+        this_buff = mBuffManager->EmptyBufferGet(&created);
 
         status = AWU_GenericBulkIn(mDevice,
                                         0,
@@ -649,7 +662,7 @@ void ContinuousAdcWorker::ExecuteCapture ()
           }
         else
           {
-            mBuffManager->DataBufferPut(this_buff, used);
+            mBuffManager->DataBufferPut(this_buff, used, created ? ADC_CONT_CALLBACK_FLAG_INSERTED : 0, status);
           }
       }
 }
@@ -660,14 +673,15 @@ void ContinuousAdcWorker::ExecuteCallback ()
 {
   uint16_t *buff = nullptr;
   uint32_t used;
+  uint32_t flags;
   while (!mTerminated)
   {
-    mBuffManager->DataBufferGet(&buff, &used);
+    mBuffManager->DataBufferGet(&buff, &used, &flags);
     //TODO: For now Not doing the flags. Need to discuss with other team members
     //about need.
     if (buff != nullptr)
     {
-      mCallback(buff, used, 0, mContext);
+      mCallback(buff, used, flags, mContext);
 
       mBuffManager->EmptyBufferPut(buff);
     }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions