Added icsneo_isMessagePollingEnabled(), removed polling check from transmitting, and disabled error reporting on device destruction
parent
a608d21304
commit
28fc98c475
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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> 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<std::shared_ptr<Message>>& 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> 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;
|
||||
|
|
|
|||
|
|
@ -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<std::shared_ptr<Message>> getMessages();
|
||||
bool getMessages(std::vector<std::shared_ptr<Message>>& 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<typename Transport>
|
||||
|
|
@ -169,6 +174,8 @@ private:
|
|||
size_t pollingMessageLimit = 20000;
|
||||
moodycamel::BlockingConcurrentQueue<std::shared_ptr<Message>> pollingContainer;
|
||||
void enforcePollingMessageLimit();
|
||||
|
||||
bool destructing = false;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue