Device: Extend open() API for long-running tasks
parent
3d4e0a27e3
commit
b7c7d4349a
|
|
@ -2,6 +2,7 @@
|
||||||
#include "icsneo/communication/message/callback/messagecallback.h"
|
#include "icsneo/communication/message/callback/messagecallback.h"
|
||||||
#include "icsneo/api/eventmanager.h"
|
#include "icsneo/api/eventmanager.h"
|
||||||
#include "icsneo/communication/command.h"
|
#include "icsneo/communication/command.h"
|
||||||
|
#include "icsneo/device/extensions/deviceextension.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
@ -164,7 +165,7 @@ void Device::enforcePollingMessageLimit() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Device::open() {
|
bool Device::open(OpenFlags flags, OpenStatusHandler handler) {
|
||||||
if(!com) {
|
if(!com) {
|
||||||
report(APIEvent::Type::Unknown, APIEvent::Severity::Error);
|
report(APIEvent::Type::Unknown, APIEvent::Severity::Error);
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -178,8 +179,8 @@ bool Device::open() {
|
||||||
if(attemptErr != APIEvent::Type::NoErrorFound) {
|
if(attemptErr != APIEvent::Type::NoErrorFound) {
|
||||||
// We could not communicate with the device, let's see if an extension can
|
// We could not communicate with the device, let's see if an extension can
|
||||||
bool tryAgain = false;
|
bool tryAgain = false;
|
||||||
forEachExtension([&tryAgain](const std::shared_ptr<DeviceExtension>& ext) -> bool {
|
forEachExtension([&tryAgain, &flags, &handler](const std::shared_ptr<DeviceExtension>& ext) -> bool {
|
||||||
if(ext->onDeviceCommunicationDead())
|
if(ext->onDeviceCommunicationDead(flags, handler))
|
||||||
tryAgain = true;
|
tryAgain = true;
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
@ -197,8 +198,8 @@ bool Device::open() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool block = false;
|
bool block = false;
|
||||||
forEachExtension([&block](const std::shared_ptr<DeviceExtension>& ext) {
|
forEachExtension([&block, &flags, &handler](const std::shared_ptr<DeviceExtension>& ext) {
|
||||||
if(ext->onDeviceOpen())
|
if(ext->onDeviceOpen(flags, handler))
|
||||||
return true;
|
return true;
|
||||||
block = true;
|
block = true;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,13 @@
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <type_traits>
|
||||||
#include "icsneo/api/eventmanager.h"
|
#include "icsneo/api/eventmanager.h"
|
||||||
#include "icsneo/api/lifetime.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"
|
||||||
#include "icsneo/device/devicetype.h"
|
#include "icsneo/device/devicetype.h"
|
||||||
#include "icsneo/device/extensions/deviceextension.h"
|
|
||||||
#include "icsneo/communication/communication.h"
|
#include "icsneo/communication/communication.h"
|
||||||
#include "icsneo/communication/packetizer.h"
|
#include "icsneo/communication/packetizer.h"
|
||||||
#include "icsneo/communication/encoder.h"
|
#include "icsneo/communication/encoder.h"
|
||||||
|
|
@ -29,6 +29,8 @@
|
||||||
|
|
||||||
namespace icsneo {
|
namespace icsneo {
|
||||||
|
|
||||||
|
class DeviceExtension;
|
||||||
|
|
||||||
class Device {
|
class Device {
|
||||||
public:
|
public:
|
||||||
virtual ~Device();
|
virtual ~Device();
|
||||||
|
|
@ -50,7 +52,50 @@ public:
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool open();
|
class OpenFlags {
|
||||||
|
public:
|
||||||
|
enum Enum {
|
||||||
|
/**
|
||||||
|
* Even if the firmware does not match the current firmware version,
|
||||||
|
* the device will not be updated.
|
||||||
|
*
|
||||||
|
* Note: The device may still be flashed if the device has no firmware
|
||||||
|
*
|
||||||
|
* This has no effect if the DFU extension is not present
|
||||||
|
*/
|
||||||
|
SuppressAutoUpdate = 1 << 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Force reflash the device.
|
||||||
|
*
|
||||||
|
* This has no effect if the DFU extension is not present
|
||||||
|
*/
|
||||||
|
ForceReflash = 1 << 1
|
||||||
|
};
|
||||||
|
using EnumType = std::underlying_type<Enum>::type;
|
||||||
|
|
||||||
|
OpenFlags(Enum e = Enum(0)) : val(e) {}
|
||||||
|
EnumType operator&(Enum e) const { return EnumType(val) & EnumType(e); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Enum val;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class OpenDirective {
|
||||||
|
Continue,
|
||||||
|
Cancel,
|
||||||
|
Skip
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class OpenStatusType {
|
||||||
|
Question,
|
||||||
|
Progress
|
||||||
|
};
|
||||||
|
|
||||||
|
using OpenStatusHandler = std::function<OpenDirective(OpenStatusType type, const std::string& status, optional<double> progress)>;
|
||||||
|
|
||||||
|
bool open(OpenFlags flags = {}, OpenStatusHandler handler =
|
||||||
|
[](OpenStatusType type, const std::string& _s, optional<double> _p) { return OpenDirective::Continue; });
|
||||||
virtual bool close();
|
virtual bool close();
|
||||||
virtual bool isOnline() const { return online; }
|
virtual bool isOnline() const { return online; }
|
||||||
virtual bool isOpen() const { return com->isOpen(); }
|
virtual bool isOpen() const { return com->isOpen(); }
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "icsneo/communication/message/message.h"
|
#include "icsneo/communication/message/message.h"
|
||||||
#include "icsneo/api/eventmanager.h"
|
#include "icsneo/api/eventmanager.h"
|
||||||
|
#include "icsneo/device/device.h"
|
||||||
|
|
||||||
namespace icsneo {
|
namespace icsneo {
|
||||||
|
|
||||||
|
|
@ -18,10 +19,10 @@ public:
|
||||||
virtual const char* getName() const = 0;
|
virtual const char* getName() const = 0;
|
||||||
|
|
||||||
// Return false to block opening
|
// Return false to block opening
|
||||||
virtual bool onDeviceOpen() { return true; }
|
virtual bool onDeviceOpen(Device::OpenFlags flags, const Device::OpenStatusHandler& handler) { return true; }
|
||||||
|
|
||||||
// Return true to indicate that communication should now be back
|
// Return true to indicate that communication should now be back
|
||||||
virtual bool onDeviceCommunicationDead() { return false; }
|
virtual bool onDeviceCommunicationDead(Device::OpenFlags flags, const Device::OpenStatusHandler& handler) { return false; }
|
||||||
|
|
||||||
virtual void onGoOnline() {}
|
virtual void onGoOnline() {}
|
||||||
virtual void onGoOffline() {}
|
virtual void onGoOffline() {}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue