Driver: Block between read attempts

Driver:

* Refactored to limit accessibility of member fields;

Communication:

* readTask() now calls for a blocking wait;
This commit is contained in:
Kurt Wachowski
2024-08-13 13:55:12 +00:00
committed by Kyle Schwarz
parent f25a0a4a81
commit 75af3220b0
20 changed files with 116 additions and 104 deletions
+11 -13
View File
@@ -64,7 +64,7 @@ bool FTD3XX::open() {
}
handle.emplace(tmpHandle);
closing = false;
setIsClosing(false);
readThread = std::thread(&FTD3XX::readTask, this);
writeThread = std::thread(&FTD3XX::writeTask, this);
@@ -81,23 +81,21 @@ bool FTD3XX::close() {
return false;
}
closing = true;
disconnected = false;
setIsClosing(true);
setIsDisconnected(false);
if(readThread.joinable())
readThread.join();
if(writeThread.joinable())
writeThread.join();
WriteOperation flushop;
readBuffer.pop(readBuffer.size());
while(writeQueue.try_dequeue(flushop)) {}
clearBuffers();
if(const auto ret = FT_Close(*handle); ret != FT_OK) {
addEvent(ret, APIEvent::Severity::EventWarning);
}
closing = false;
setIsClosing(false);
return true;
}
@@ -110,7 +108,7 @@ void FTD3XX::readTask() {
FT_SetStreamPipe(*handle, false, false, READ_PIPE_ID, bufferSize);
FT_SetPipeTimeout(*handle, READ_PIPE_ID, 1);
while(!closing && !isDisconnected()) {
while(!isClosing() && !isDisconnected()) {
ULONG received = 0;
OVERLAPPED overlap = {};
FT_InitializeOverlapped(*handle, &overlap);
@@ -119,13 +117,13 @@ void FTD3XX::readTask() {
#else
FT_ReadPipeAsync(*handle, 0, buffer, bufferSize, &received, &overlap);
#endif
while(!closing) {
while(!isClosing()) {
const auto ret = FT_GetOverlappedResult(*handle, &overlap, &received, true);
if(ret == FT_IO_PENDING)
continue;
if(ret != FT_OK) {
if(ret == FT_IO_ERROR) {
disconnected = true;
setIsDisconnected(true);
report(APIEvent::Type::DeviceDisconnected, APIEvent::Severity::Error);
} else {
addEvent(ret, APIEvent::Severity::Error);
@@ -146,7 +144,7 @@ void FTD3XX::writeTask() {
FT_SetPipeTimeout(*handle, WRITE_PIPE_ID, 100);
WriteOperation writeOp;
while(!closing && !isDisconnected()) {
while(!isClosing() && !isDisconnected()) {
if(!writeQueue.wait_dequeue_timed(writeOp, std::chrono::milliseconds(100)))
continue;
@@ -160,13 +158,13 @@ void FTD3XX::writeTask() {
#else
FT_WritePipeAsync(*handle, 0, writeOp.bytes.data(), size, &sent, &overlap);
#endif
while(!closing) {
while(!isClosing()) {
const auto ret = FT_GetOverlappedResult(*handle, &overlap, &sent, true);
if(ret == FT_IO_PENDING)
continue;
if(ret != FT_OK) {
if(ret == FT_IO_ERROR) {
disconnected = true;
setIsDisconnected(true);
report(APIEvent::Type::DeviceDisconnected, APIEvent::Severity::Error);
} else {
addEvent(ret, APIEvent::Severity::Error);