diff --git a/api/icsneoc/icsneoc.cpp b/api/icsneoc/icsneoc.cpp index a1edc7d..9c2447f 100644 --- a/api/icsneoc/icsneoc.cpp +++ b/api/icsneoc/icsneoc.cpp @@ -189,6 +189,13 @@ bool icsneo_disableMessagePolling(const neodevice_t* device) { return device->device->disableMessagePolling(); } +bool icsneo_isMessagePollingEnabled(const neodevice_t* device) { + if(!icsneo_isValidNeoDevice(device)) + return false; + + return device->device->isMessagePollingEnabled(); +} + bool icsneo_getMessages(const neodevice_t* device, neomessage_t* messages, size_t* items, uint64_t timeout) { if(!icsneo_isValidNeoDevice(device)) return false; diff --git a/device/device.cpp b/device/device.cpp index c16bffe..d926818 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -78,7 +78,7 @@ std::string Device::describe() const { } void Device::enableMessagePolling() { - if(messagePollingCallbackID != 0) // We are already polling + if(isMessagePollingEnabled()) // We are already polling return; messagePollingCallbackID = com->addMessageCallback(MessageCallback([this](std::shared_ptr message) { @@ -88,7 +88,7 @@ void Device::enableMessagePolling() { } bool Device::disableMessagePolling() { - if(messagePollingCallbackID == 0) + if(!isMessagePollingEnabled()) return true; // Not currently polling auto ret = com->removeMessageCallback(messagePollingCallbackID); @@ -118,7 +118,7 @@ bool Device::getMessages(std::vector>& container, size_ } // not currently polling, throw error - if(messagePollingCallbackID == 0) { + if(!isMessagePollingEnabled()) { err(APIError::DeviceNotPolling); return false; } @@ -215,9 +215,10 @@ bool Device::goOnline() { return false; ledState = LEDState::Online; - updateLEDState(); online = true; + updateLEDState(); + return true; } @@ -226,9 +227,10 @@ bool Device::goOffline() { return false; ledState = (latestResetStatus && latestResetStatus->cmRunning) ? LEDState::CoreMiniRunning : LEDState::Offline; + updateLEDState(); - online = false; + return true; } @@ -246,12 +248,6 @@ bool Device::transmit(std::shared_ptr message) { return false; } - // not currently polling, throw error - if(messagePollingCallbackID == 0) { - err(APIError::DeviceNotPolling); - return false; - } - if(!isSupportedTXNetwork(message->network)) { err(APIError::UnsupportedTXNetwork); return false; diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index d2138e8..dc0b4f3 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -21,6 +21,7 @@ namespace icsneo { class Device { public: virtual ~Device() { + destructing = true; disableMessagePolling(); close(); } @@ -51,6 +52,7 @@ public: // Message polling related functions void enableMessagePolling(); bool disableMessagePolling(); + bool isMessagePollingEnabled() { return messagePollingCallbackID != 0; }; std::vector> getMessages(); bool getMessages(std::vector>& container, size_t limit = 0, std::chrono::milliseconds timeout = std::chrono::milliseconds(0)); size_t getCurrentMessageCount() { return pollingContainer.size_approx(); } @@ -114,7 +116,10 @@ protected: } virtual device_errorhandler_t makeErrorHandler() { - return [this](APIError::ErrorType type) { ErrorManager::GetInstance().add(type, this); }; + return [this](APIError::ErrorType type) { + if(!destructing) + ErrorManager::GetInstance().add(type, this); + }; } template @@ -169,6 +174,8 @@ private: size_t pollingMessageLimit = 20000; moodycamel::BlockingConcurrentQueue> pollingContainer; void enforcePollingMessageLimit(); + + bool destructing = false; }; } diff --git a/include/icsneo/icsneoc.h b/include/icsneo/icsneoc.h index 362c515..8ba2c50 100644 --- a/include/icsneo/icsneoc.h +++ b/include/icsneo/icsneoc.h @@ -195,6 +195,8 @@ extern bool DLLExport icsneo_enableMessagePolling(const neodevice_t* device); */ extern bool DLLExport icsneo_disableMessagePolling(const neodevice_t* device); +extern bool DLLExport icsneo_isMessagePollingEnabled(const neodevice_t* device); + /** * \brief Read out messages which have been recieved * \param[in] device A pointer to the neodevice_t structure specifying the device to operate on. @@ -696,6 +698,9 @@ fn_icsneo_enableMessagePolling icsneo_enableMessagePolling; typedef bool(*fn_icsneo_disableMessagePolling)(const neodevice_t* device); fn_icsneo_disableMessagePolling icsneo_disableMessagePolling; +typedef bool(*fn_icsneo_isMessagePollingEnabled)(const neodevice_t* device); +fn_icsneo_isMessagePollingEnabled icsneo_isMessagePollingEnabled; + typedef bool(*fn_icsneo_getMessages)(const neodevice_t* device, neomessage_t* messages, size_t* items, uint64_t timeout); fn_icsneo_getMessages icsneo_getMessages; @@ -804,6 +809,7 @@ int icsneo_init() { ICSNEO_IMPORTASSERT(icsneo_isOnline); ICSNEO_IMPORTASSERT(icsneo_enableMessagePolling); ICSNEO_IMPORTASSERT(icsneo_disableMessagePolling); + ICSNEO_IMPORTASSERT(icsneo_isMessagePollingEnabled); ICSNEO_IMPORTASSERT(icsneo_getMessages); ICSNEO_IMPORTASSERT(icsneo_getPollingMessageLimit); ICSNEO_IMPORTASSERT(icsneo_setPollingMessageLimit);