Device: Allow the suppression of disconnects from extensions
parent
6c1cbc9db8
commit
4cd7bafca7
|
|
@ -240,13 +240,13 @@ bool Device::open() {
|
||||||
while(!stopHeartbeatThread) {
|
while(!stopHeartbeatThread) {
|
||||||
// Wait for 110ms for a possible heartbeat
|
// Wait for 110ms for a possible heartbeat
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(110));
|
std::this_thread::sleep_for(std::chrono::milliseconds(110));
|
||||||
if(!receivedMessage) {
|
if(!receivedMessage && !heartbeatSuppressed()) {
|
||||||
// No heartbeat received, request a status
|
// No heartbeat received, request a status
|
||||||
com->sendCommand(Command::RequestStatusUpdate);
|
com->sendCommand(Command::RequestStatusUpdate);
|
||||||
// The response should come back quickly if the com is quiet
|
// The response should come back quickly if the com is quiet
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
// Check if we got a message, and if not, if settings are being applied
|
// Check if we got a message, and if not, if settings are being applied
|
||||||
if(!receivedMessage && !settings->applyingSettings) {
|
if(!receivedMessage && !heartbeatSuppressed()) {
|
||||||
if(!stopHeartbeatThread && !isDisconnected())
|
if(!stopHeartbeatThread && !isDisconnected())
|
||||||
report(APIEvent::Type::DeviceDisconnected, APIEvent::Severity::Error);
|
report(APIEvent::Type::DeviceDisconnected, APIEvent::Severity::Error);
|
||||||
break;
|
break;
|
||||||
|
|
@ -630,6 +630,11 @@ optional<double> Device::getAnalogIO(IO type, size_t number /* = 1 */) {
|
||||||
return nullopt;
|
return nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Lifetime Device::suppressDisconnects() {
|
||||||
|
heartbeatSuppressedByUser++;
|
||||||
|
return Lifetime([this] { heartbeatSuppressedByUser--; });
|
||||||
|
}
|
||||||
|
|
||||||
void Device::addExtension(std::shared_ptr<DeviceExtension>&& extension) {
|
void Device::addExtension(std::shared_ptr<DeviceExtension>&& extension) {
|
||||||
std::lock_guard<std::mutex> lk(extensionsLock);
|
std::lock_guard<std::mutex> lk(extensionsLock);
|
||||||
extensions.push_back(extension);
|
extensions.push_back(extension);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef __ICSNEO_LIFETIME_H_
|
||||||
|
#define __ICSNEO_LIFETIME_H_
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace icsneo {
|
||||||
|
|
||||||
|
class Lifetime {
|
||||||
|
public:
|
||||||
|
Lifetime() = default;
|
||||||
|
Lifetime(std::function<void(void)> onDeath) : fnOnDeath(onDeath) {}
|
||||||
|
~Lifetime() {
|
||||||
|
if(fnOnDeath)
|
||||||
|
fnOnDeath();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disallow copies so the fnOnDeath only happens once
|
||||||
|
Lifetime(const Lifetime&) = delete;
|
||||||
|
Lifetime& operator=(const Lifetime&) = delete;
|
||||||
|
|
||||||
|
// Explicitly allow moves
|
||||||
|
Lifetime(Lifetime&& moved) { *this = std::move(moved); }
|
||||||
|
Lifetime& operator=(Lifetime&& rhs) {
|
||||||
|
fnOnDeath = std::move(rhs.fnOnDeath);
|
||||||
|
rhs.fnOnDeath = std::function<void(void)>();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::function<void(void)> fnOnDeath;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include "icsneo/api/eventmanager.h"
|
#include "icsneo/api/eventmanager.h"
|
||||||
|
#include "icsneo/api/lifetime.h"
|
||||||
#include "icsneo/device/neodevice.h"
|
#include "icsneo/device/neodevice.h"
|
||||||
#include "icsneo/device/idevicesettings.h"
|
#include "icsneo/device/idevicesettings.h"
|
||||||
#include "icsneo/device/nullsettings.h"
|
#include "icsneo/device/nullsettings.h"
|
||||||
|
|
@ -24,6 +25,7 @@
|
||||||
#include "icsneo/communication/message/flexray/control/flexraycontrolmessage.h"
|
#include "icsneo/communication/message/flexray/control/flexraycontrolmessage.h"
|
||||||
#include "icsneo/third-party/concurrentqueue/concurrentqueue.h"
|
#include "icsneo/third-party/concurrentqueue/concurrentqueue.h"
|
||||||
#include "icsneo/platform/optional.h"
|
#include "icsneo/platform/optional.h"
|
||||||
|
#include "icsneo/platform/nodiscard.h"
|
||||||
|
|
||||||
namespace icsneo {
|
namespace icsneo {
|
||||||
|
|
||||||
|
|
@ -155,6 +157,12 @@ public:
|
||||||
|
|
||||||
virtual std::vector<std::shared_ptr<FlexRay::Controller>> getFlexRayControllers() const { return {}; }
|
virtual std::vector<std::shared_ptr<FlexRay::Controller>> getFlexRayControllers() const { return {}; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For use by extensions only.
|
||||||
|
*/
|
||||||
|
NODISCARD("If the Lifetime is not held, disconnects will be immediately unsuppressed")
|
||||||
|
Lifetime suppressDisconnects();
|
||||||
|
|
||||||
const device_eventhandler_t& getEventHandler() const { return report; }
|
const device_eventhandler_t& getEventHandler() const { return report; }
|
||||||
|
|
||||||
std::shared_ptr<Communication> com;
|
std::shared_ptr<Communication> com;
|
||||||
|
|
@ -275,6 +283,10 @@ private:
|
||||||
std::vector<Network> supportedTXNetworks;
|
std::vector<Network> supportedTXNetworks;
|
||||||
std::vector<Network> supportedRXNetworks;
|
std::vector<Network> supportedRXNetworks;
|
||||||
|
|
||||||
|
// Use heartbeatSuppressed instead when reading
|
||||||
|
std::atomic<int> heartbeatSuppressedByUser{0};
|
||||||
|
bool heartbeatSuppressed() const { return heartbeatSuppressedByUser > 0 || (settings && settings->applyingSettings); }
|
||||||
|
|
||||||
void handleNeoVIMessage(std::shared_ptr<CANMessage> message);
|
void handleNeoVIMessage(std::shared_ptr<CANMessage> message);
|
||||||
|
|
||||||
enum class LEDState : uint8_t {
|
enum class LEDState : uint8_t {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef __ICSNEO_NODISCARD_H_
|
||||||
|
#define __ICSNEO_NODISCARD_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow the use of the nodiscard attribute where it is supported.
|
||||||
|
*/
|
||||||
|
#if __cplusplus > 201703L // C++20 and above
|
||||||
|
#define NODISCARD(str) [[nodiscard(str)]]
|
||||||
|
#elif __cplusplus > 201402L // C++17 and above
|
||||||
|
#define NODISCARD(str) [[nodiscard]]
|
||||||
|
#else
|
||||||
|
#define NODISCARD(str)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue