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);
     }

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