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);
}
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_GenericBulkInwith a new argument to the callback (and silences them fromaiousb_library_err_print), but requires a larger modification.