diff --git a/api/icsneoc/icsneoc.cpp b/api/icsneoc/icsneoc.cpp index c83a127..535652d 100644 --- a/api/icsneoc/icsneoc.cpp +++ b/api/icsneoc/icsneoc.cpp @@ -437,6 +437,13 @@ bool icsneo_transmitMessages(const neodevice_t* device, const neomessage_t* mess return true; } +void icsneo_setWriteBlocks(const neodevice_t* device, bool blocks) { + if(!icsneo_isValidNeoDevice(device)) + return; + + device->device->com->setWriteBlocks(blocks); +} + bool icsneo_describeDevice(const neodevice_t* device, char* str, size_t* maxLength) { // TAG String copy function if(maxLength == nullptr) { diff --git a/device/device.cpp b/device/device.cpp index 07d80de..a6c1e92 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -270,6 +270,10 @@ bool Device::transmit(std::vector> messages) { return true; } +void Device::setWriteBlocks(bool blocks) { + com->setWriteBlocks(blocks); +} + size_t Device::getNetworkCountByType(Network::Type type) const { size_t count = 0; for(const auto& net : getSupportedRXNetworks()) diff --git a/include/icsneo/communication/communication.h b/include/icsneo/communication/communication.h index 7f502bb..d19a147 100644 --- a/include/icsneo/communication/communication.h +++ b/include/icsneo/communication/communication.h @@ -38,6 +38,8 @@ public: bool rawWrite(const std::vector& bytes) { return impl->write(bytes); } virtual bool sendPacket(std::vector& bytes); + void setWriteBlocks(bool blocks) { impl->writeBlocks = blocks; } + virtual bool sendCommand(Command cmd, bool boolean) { return sendCommand(cmd, std::vector({ (uint8_t)boolean })); } virtual bool sendCommand(Command cmd, std::vector arguments = {}); bool getSettingsSync(std::vector& data, std::chrono::milliseconds timeout = std::chrono::milliseconds(50)); diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index d1fa154..cb4c232 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -69,6 +69,8 @@ public: bool transmit(std::shared_ptr message); bool transmit(std::vector> messages); + void setWriteBlocks(bool blocks); + const std::vector& getSupportedRXNetworks() const { return supportedRXNetworks; } const std::vector& getSupportedTXNetworks() const { return supportedTXNetworks; } virtual bool isSupportedRXNetwork(const Network& net) const { diff --git a/include/icsneo/icsneoc.h b/include/icsneo/icsneoc.h index 1c77d1b..58d334b 100644 --- a/include/icsneo/icsneoc.h +++ b/include/icsneo/icsneoc.h @@ -532,6 +532,15 @@ extern bool DLLExport icsneo_transmit(const neodevice_t* device, const neomessag */ extern bool DLLExport icsneo_transmitMessages(const neodevice_t* device, const neomessage_t* messages, size_t count); +/** + * \brief Set the behavior of whether writing is a blocking action or not. + * \param[in] device A pointer to the neodevice_t structure specifying the device to transmit on. + * \param[in] blocks Whether or not writing is a blocking action. + * + * By default, writing is a blocking action. + */ +extern void DLLExport icsneo_setWriteBlocks(const neodevice_t* device, bool blocks); + /** * \brief Get the friendly description for a specified device. * \param[in] device A pointer to the neodevice_t structure specifying the device to operate on. @@ -775,6 +784,9 @@ fn_icsneo_transmit icsneo_transmit; typedef bool(*fn_icsneo_transmitMessages)(const neodevice_t* device, const neomessage_t* messages, size_t count); fn_icsneo_transmitMessages icsneo_transmitMessages; +typedef bool(*fn_icsneo_setWriteBlocks)(const neodevice_t* device, bool blocks); +fn_icsneo_setWriteBlocks icsneo_setWriteBlocks; + typedef bool(*fn_icsneo_describeDevice)(const neodevice_t* device, char* str, size_t* maxLength); fn_icsneo_describeDevice icsneo_describeDevice; @@ -848,6 +860,7 @@ int icsneo_init() { ICSNEO_IMPORTASSERT(icsneo_setFDBaudrate); ICSNEO_IMPORTASSERT(icsneo_transmit); ICSNEO_IMPORTASSERT(icsneo_transmitMessages); + ICSNEO_IMPORTASSERT(icsneo_setWriteBlocks); ICSNEO_IMPORTASSERT(icsneo_describeDevice); ICSNEO_IMPORTASSERT(icsneo_getVersion); ICSNEO_IMPORTASSERT(icsneo_getEvents);