diff --git a/communication/communication.cpp b/communication/communication.cpp index 4071d7f..50673c8 100644 --- a/communication/communication.cpp +++ b/communication/communication.cpp @@ -143,6 +143,8 @@ std::shared_ptr Communication::waitForMessageSync(std::shared_ptr readBytes; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); + while(!closing) { readBytes.clear(); if(impl->readWait(readBytes)) { @@ -163,4 +165,6 @@ void Communication::readTask() { } } } + + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } diff --git a/communication/multichannelcommunication.cpp b/communication/multichannelcommunication.cpp index bb41569..ca93353 100644 --- a/communication/multichannelcommunication.cpp +++ b/communication/multichannelcommunication.cpp @@ -29,6 +29,8 @@ void MultiChannelCommunication::readTask() { std::vector readBytes; std::vector payloadBytes; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); + while(!closing) { if(readMore) { readBytes.clear(); @@ -124,4 +126,5 @@ void MultiChannelCommunication::readTask() { } } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } \ No newline at end of file diff --git a/platform/posix/ftdi.cpp b/platform/posix/ftdi.cpp index 7c4e061..8784ce4 100644 --- a/platform/posix/ftdi.cpp +++ b/platform/posix/ftdi.cpp @@ -178,15 +178,18 @@ bool FTDI::FTDIContext::closeDevice() { void FTDI::readTask() { constexpr size_t READ_BUFFER_SIZE = 8; uint8_t readbuf[READ_BUFFER_SIZE]; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { auto readBytes = ftdi.read(readbuf, READ_BUFFER_SIZE); if(readBytes > 0) readQueue.enqueue_bulk(readbuf, readBytes); } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } void FTDI::writeTask() { WriteOperation writeOp; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { if(!writeQueue.wait_dequeue_timed(writeOp, std::chrono::milliseconds(100))) continue; @@ -194,4 +197,5 @@ void FTDI::writeTask() { ftdi.write(writeOp.bytes.data(), (int)writeOp.bytes.size()); onWrite(); } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } \ No newline at end of file diff --git a/platform/posix/pcap.cpp b/platform/posix/pcap.cpp index 58ab956..34c3cc3 100644 --- a/platform/posix/pcap.cpp +++ b/platform/posix/pcap.cpp @@ -233,6 +233,7 @@ bool PCAP::close() { void PCAP::readTask() { struct pcap_pkthdr* header; const uint8_t* data; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { auto readBytes = pcap_next_ex(interface.fp, &header, &data); if(readBytes < 0) { @@ -256,12 +257,14 @@ void PCAP::readTask() { readQueue.enqueue_bulk(packet.payload.data(), packet.payload.size()); } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } void PCAP::writeTask() { WriteOperation writeOp; uint16_t sequence = 0; EthernetPacket sendPacket; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); // Set MAC address of packet memcpy(sendPacket.srcMAC, interface.macAddress, sizeof(sendPacket.srcMAC)); @@ -278,6 +281,7 @@ void PCAP::writeTask() { pcap_sendpacket(interface.fp, bs.data(), (int)bs.size()); // TODO Handle packet send errors } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } PCAP::EthernetPacket::EthernetPacket(const std::vector& bytestream) { diff --git a/platform/posix/stm32.cpp b/platform/posix/stm32.cpp index c597bce..cf376e1 100644 --- a/platform/posix/stm32.cpp +++ b/platform/posix/stm32.cpp @@ -287,15 +287,18 @@ bool STM32::close() { void STM32::readTask() { constexpr size_t READ_BUFFER_SIZE = 8; uint8_t readbuf[READ_BUFFER_SIZE]; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { auto bytesRead = ::read(fd, readbuf, READ_BUFFER_SIZE); if(bytesRead > 0) readQueue.enqueue_bulk(readbuf, bytesRead); } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } void STM32::writeTask() { WriteOperation writeOp; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { if(!writeQueue.wait_dequeue_timed(writeOp, std::chrono::milliseconds(100))) continue; @@ -306,4 +309,5 @@ void STM32::writeTask() { report(APIEvent::Type::FailedToWrite, APIEvent::Severity::Error); onWrite(); } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } \ No newline at end of file diff --git a/platform/windows/pcap.cpp b/platform/windows/pcap.cpp index b3a4cfc..997286d 100644 --- a/platform/windows/pcap.cpp +++ b/platform/windows/pcap.cpp @@ -252,6 +252,7 @@ bool PCAP::close() { void PCAP::readTask() { struct pcap_pkthdr* header; const uint8_t* data; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { auto readBytes = pcap.next_ex(interface.fp, &header, &data); if(readBytes < 0) { @@ -275,12 +276,14 @@ void PCAP::readTask() { readQueue.enqueue_bulk(packet.payload.data(), packet.payload.size()); } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } void PCAP::writeTask() { WriteOperation writeOp; uint16_t sequence = 0; EthernetPacket sendPacket; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); // Set MAC address of packet memcpy(sendPacket.srcMAC, interface.macAddress, sizeof(sendPacket.srcMAC)); @@ -298,6 +301,7 @@ void PCAP::writeTask() { onWrite(); // TODO Handle packet send errors } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } PCAP::EthernetPacket::EthernetPacket(const std::vector& bytestream) { diff --git a/platform/windows/vcp.cpp b/platform/windows/vcp.cpp index fc7ae98..19850bc 100644 --- a/platform/windows/vcp.cpp +++ b/platform/windows/vcp.cpp @@ -345,6 +345,7 @@ void VCP::readTask() { uint8_t readbuf[READ_BUFFER_SIZE]; IOTaskState state = LAUNCH; DWORD bytesRead = 0; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { switch(state) { case LAUNCH: { @@ -384,12 +385,14 @@ void VCP::readTask() { } } } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } void VCP::writeTask() { IOTaskState state = LAUNCH; VCP::WriteOperation writeOp; DWORD bytesWritten = 0; + EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { switch(state) { case LAUNCH: { @@ -425,4 +428,5 @@ void VCP::writeTask() { } } } + EventManager::GetInstance().cancelErrorDowngradingOnCurrentThread(); } \ No newline at end of file