diff --git a/api/liboni/drivers/ft600/circbuffer.h b/api/liboni/drivers/ft600/circbuffer.h
index 106734b..d5e22e4 100644
--- a/api/liboni/drivers/ft600/circbuffer.h
+++ b/api/liboni/drivers/ft600/circbuffer.h
@@ -6,8 +6,8 @@
//This buffer and its functions should be thread safe as long as only one thread
//writes and only one thread reads
typedef struct {
- size_t read;
- size_t write;
+ volatile size_t read;
+ volatile size_t write;
size_t size;
uint8_t* buffer;
} circ_buffer_t;
diff --git a/api/liboni/drivers/ft600/onidriver_ft600.c b/api/liboni/drivers/ft600/onidriver_ft600.c
index db96992..f581e1e 100644
--- a/api/liboni/drivers/ft600/onidriver_ft600.c
+++ b/api/liboni/drivers/ft600/onidriver_ft600.c
@@ -71,7 +71,7 @@ struct oni_ft600_ctx_impl {
uint8_t* auxBuffer;
size_t auxSize;
uint32_t prioValue;
- oni_ft600_state state;
+ volatile oni_ft600_state state;
oni_ft600_sigstate sigState;
unsigned short sigOffset;
unsigned short sigError;
@@ -180,18 +180,26 @@ void oni_ft600_usb_callback(PVOID context, E_FT_NOTIFICATION_CALLBACK_TYPE type,
if (!info) return;
oni_ft600_ctx ctx = (oni_ft600_ctx)context;
ULONG transferred;
+ ULONG total = 0;
+ do {
+ FT_ReadPipe(ctx->ftHandle,
+ info->ucEndpointNo,
+ ctx->auxBuffer + total,
+ info->ulRecvNotificationLength - total,
+ &transferred,
+ &ctx->sigOverlapped);
+ ftStatus = FT_GetOverlappedResult(
+ ctx->ftHandle, &ctx->sigOverlapped, &transferred, TRUE);
+ if (ftStatus != FT_OK) {
+ ctx->sigError = 1;
+ return;
+ }
+ total += transferred;
+ } while (total < info->ulRecvNotificationLength);
- FT_ReadPipe(ctx->ftHandle, info->ucEndpointNo, ctx->auxBuffer, info->ulRecvNotificationLength, &transferred, &ctx->sigOverlapped);
- ftStatus = FT_GetOverlappedResult(ctx->ftHandle, &ctx->sigOverlapped, &transferred, TRUE);
- if (ftStatus != FT_OK)
- {
- ctx->sigError = 1;
- return;
- }
-
- if (transferred > 0)
+ if (total > 0)
{
fill_control_buffers(ctx, transferred);
}
@@ -529,6 +537,8 @@ int oni_driver_read_stream(oni_driver_ctx driver_ctx,
}
else if (stream == ONI_READ_STREAM_DATA)
{
+ while (ctx->state != STATE_RUNNING)
+ ;
size_t remaining = ((size >> 2) << 2);//round to 32bit boundaries;
FT_STATUS ftStatus;
int read = 0;
@@ -549,37 +559,55 @@ int oni_driver_read_stream(oni_driver_ctx driver_ctx,
dstPtr += to_read;
read += to_read;
}
- while (remaining > 0)
- {
- unsigned int simIndex = ctx->nextReadIndex % ctx->numInOverlapped;
- unsigned int nextIndex = (ctx->nextReadIndex + ctx->numInOverlapped) % (2 * ctx->numInOverlapped);
- ULONG transferred;
- ftStatus = FT_GetOverlappedResult(ctx->ftHandle, &ctx->inOverlapped[simIndex], &ctx->inTransferred[simIndex], TRUE);
- if (ftStatus != FT_OK)
- {
- printf("Read failure %d\n", ftStatus);
- return ONI_EREADFAILURE;
- }
- transferred = ctx->inTransferred[simIndex];
- //read in the next part of the double buffer
- FT_ReadPipeEx(ctx->ftHandle, pipe_in, ctx->inBuffer + ((size_t)nextIndex * ctx->inBlockSize), ctx->inBlockSize,
- &ctx->inTransferred[simIndex], &ctx->inOverlapped[simIndex]);
- srcPtr = ctx->inBuffer + ctx->inBlockSize * (size_t)ctx->nextReadIndex;
- to_read = MIN(remaining, transferred);
- memcpy(dstPtr, srcPtr, to_read);
- // for (int i = 0; i < to_read; i++) printf("%x ", *(dstPtr + i));
- remaining -= to_read;
- dstPtr += to_read;
- read += to_read;
- ctx->nextReadIndex = (ctx->nextReadIndex + 1) % (2 * ctx->numInOverlapped);
- if (to_read < transferred)
- {
- ctx->lastReadRead = transferred;
- ctx->lastReadOffset = to_read;
- }
- else
- ctx->lastReadOffset = 0;
- }
+ while (remaining > 0) {
+ unsigned int simIndex = ctx->nextReadIndex % ctx->numInOverlapped;
+ unsigned int nextIndex = (ctx->nextReadIndex + ctx->numInOverlapped)
+ % (2 * ctx->numInOverlapped);
+ ULONG transferred;
+ ftStatus = FT_GetOverlappedResult(ctx->ftHandle,
+ &ctx->inOverlapped[simIndex],
+ &ctx->inTransferred[simIndex],
+ TRUE);
+ if (ftStatus != FT_OK) {
+ printf("Read failure %d\n", ftStatus);
+ return ONI_EREADFAILURE;
+ }
+ transferred = ctx->inTransferred[simIndex];
+ // read in the next part of the double buffer
+ FT_ReadPipeEx(ctx->ftHandle,
+ pipe_in,
+ ctx->inBuffer
+ + ((size_t)nextIndex * ctx->inBlockSize),
+ ctx->inBlockSize,
+ &ctx->inTransferred[simIndex],
+ &ctx->inOverlapped[simIndex]);
+ // printf("R: %d\n", nextIndex);
+ srcPtr
+ = ctx->inBuffer + ctx->inBlockSize * (size_t)ctx->nextReadIndex;
+ to_read = MIN(remaining, transferred);
+ /* printf("\n%d - %d - %d - %d\n",
+ ctx->nextReadIndex,
+ nextIndex,
+ simIndex,
+ to_read);*/
+ memcpy(dstPtr, srcPtr, to_read);
+ /* for (int i = 0; i < to_read; i++)
+ printf("%x ", *(dstPtr + i));
+ printf("\n");
+ for (int i = 0; i < to_read; i++) printf("%x ", *(srcPtr +
+ i));*/
+ remaining -= to_read;
+ dstPtr += to_read;
+ read += to_read;
+ ctx->nextReadIndex
+ = (ctx->nextReadIndex + 1) % (2 * ctx->numInOverlapped);
+ if (to_read < transferred) {
+ ctx->lastReadRead = transferred;
+ ctx->lastReadOffset = to_read;
+ } else {
+ ctx->lastReadOffset = 0;
+ }
+ }
#else
ULONG transferred;
uint8_t* dstPtr = (uint8_t*)data;
@@ -738,12 +766,13 @@ int oni_driver_read_config(oni_driver_ctx driver_ctx, oni_config_t reg, oni_reg_
inline void oni_ft600_start_acq(oni_ft600_ctx ctx)
{
-#if _WIN32
+ #if _WIN32
FT_STATUS rc;
rc = FT_SetStreamPipe(ctx->ftHandle, FALSE, FALSE, pipe_in, ctx->inBlockSize);
for (size_t i = 0; i < ctx->numInOverlapped; i++)
{
FT_ReadPipeEx(ctx->ftHandle, pipe_in, ctx->inBuffer + (i * ctx->inBlockSize), ctx->inBlockSize, &ctx->inTransferred[i], &ctx->inOverlapped[i]);
+ //printf("R: %d\n", i);
}
#endif
ctx->state = STATE_RUNNING;
diff --git a/api/liboni/drivers/ft600/onidriver_ft600.vcxproj b/api/liboni/drivers/ft600/onidriver_ft600.vcxproj
index 521cd1f..4868617 100644
--- a/api/liboni/drivers/ft600/onidriver_ft600.vcxproj
+++ b/api/liboni/drivers/ft600/onidriver_ft600.vcxproj
@@ -29,26 +29,26 @@
DynamicLibrary
true
- v142
+ v143
MultiByte
DynamicLibrary
false
- v142
+ v143
true
MultiByte
DynamicLibrary
true
- v142
+ v143
MultiByte
DynamicLibrary
false
- v142
+ v143
true
MultiByte
diff --git a/api/liboni/drivers/riffa/onidriver_riffa.vcxproj b/api/liboni/drivers/riffa/onidriver_riffa.vcxproj
index a032fd2..6e3301d 100644
--- a/api/liboni/drivers/riffa/onidriver_riffa.vcxproj
+++ b/api/liboni/drivers/riffa/onidriver_riffa.vcxproj
@@ -28,26 +28,26 @@
DynamicLibrary
true
- v142
+ v143
MultiByte
DynamicLibrary
false
- v142
+ v143
true
MultiByte
DynamicLibrary
true
- v142
+ v143
MultiByte
DynamicLibrary
false
- v142
+ v143
true
MultiByte
diff --git a/api/liboni/drivers/test/onidriver_test.vcxproj b/api/liboni/drivers/test/onidriver_test.vcxproj
index 4453a5b..f5b4d45 100644
--- a/api/liboni/drivers/test/onidriver_test.vcxproj
+++ b/api/liboni/drivers/test/onidriver_test.vcxproj
@@ -29,26 +29,26 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/api/liboni/drivers/xillybus/onidriver_xillybus.vcxproj b/api/liboni/drivers/xillybus/onidriver_xillybus.vcxproj
index 1ea24c6..2d3878f 100644
--- a/api/liboni/drivers/xillybus/onidriver_xillybus.vcxproj
+++ b/api/liboni/drivers/xillybus/onidriver_xillybus.vcxproj
@@ -35,23 +35,23 @@
DynamicLibrary
true
- v142
+ v143
DynamicLibrary
false
- v142
+ v143
true
DynamicLibrary
true
- v142
+ v143
DynamicLibrary
false
- v142
+ v143
true
diff --git a/api/liboni/liboni-test/liboni-test.vcxproj b/api/liboni/liboni-test/liboni-test.vcxproj
index 1f19c40..7c964fc 100644
--- a/api/liboni/liboni-test/liboni-test.vcxproj
+++ b/api/liboni/liboni-test/liboni-test.vcxproj
@@ -28,26 +28,26 @@
Application
true
- v142
+ v143
Unicode
Application
false
- v142
+ v143
true
Unicode
Application
true
- v142
+ v143
Unicode
Application
false
- v142
+ v143
true
Unicode
diff --git a/api/liboni/liboni.vcxproj b/api/liboni/liboni.vcxproj
index fc49ee7..77d65eb 100644
--- a/api/liboni/liboni.vcxproj
+++ b/api/liboni/liboni.vcxproj
@@ -27,22 +27,22 @@
DynamicLibrary
true
- v142
+ v143
DynamicLibrary
false
- v142
+ v143
DynamicLibrary
true
- v142
+ v143
DynamicLibrary
false
- v142
+ v143
diff --git a/api/liboni/onix-loadtest/onix-loadtest.vcxproj b/api/liboni/onix-loadtest/onix-loadtest.vcxproj
index 746873e..60965b5 100644
--- a/api/liboni/onix-loadtest/onix-loadtest.vcxproj
+++ b/api/liboni/onix-loadtest/onix-loadtest.vcxproj
@@ -29,26 +29,26 @@
Application
true
- v142
+ v143
Unicode
Application
false
- v142
+ v143
true
Unicode
Application
true
- v142
+ v143
Unicode
Application
false
- v142
+ v143
true
Unicode
diff --git a/drivers/riffa/windows/lib/riffa.vcxproj b/drivers/riffa/windows/lib/riffa.vcxproj
index 9addb3a..87c13bf 100644
--- a/drivers/riffa/windows/lib/riffa.vcxproj
+++ b/drivers/riffa/windows/lib/riffa.vcxproj
@@ -28,26 +28,26 @@
DynamicLibrary
true
- v142
+ v143
MultiByte
DynamicLibrary
false
- v142
+ v143
true
MultiByte
DynamicLibrary
true
- v142
+ v143
MultiByte
DynamicLibrary
false
- v142
+ v143
true
MultiByte