1a56e2a107
We've decided to add a separate notion of a DeviceRole to track attached device roles now. We no longer use the collection of deviceSpecs to track which roles have been attached. Rather, this list will simply collate all known deviceAttachment specs which are expected to be maintained in an attached state. SMO can periodically scan through these and cross-reference this collection with the collection of attachedDeviceRoles. Then it can re-try to attach those which aren't currently attached at any given moment. This will give resilience against device attachment failures or device resets/malfunctions, at runtime.
96 lines
2.7 KiB
C++
96 lines
2.7 KiB
C++
#ifndef DEVICEMANAGER_H
|
|
#define DEVICEMANAGER_H
|
|
|
|
#include <vector>
|
|
#include <string>
|
|
#include <memory>
|
|
#include <opts.h>
|
|
#include <utility>
|
|
#include <iostream>
|
|
#include <functional>
|
|
#include <user/senseApiDesc.h>
|
|
#include <user/deviceAttachmentSpec.h>
|
|
#include <asynchronousLoop.h>
|
|
#include <deviceManager/device.h>
|
|
#include <deviceManager/deviceRole.h>
|
|
#include <callback.h>
|
|
|
|
namespace smo {
|
|
namespace device {
|
|
|
|
class DeviceManager
|
|
{
|
|
public:
|
|
static DeviceManager& getInstance()
|
|
{
|
|
static DeviceManager instance;
|
|
return instance;
|
|
}
|
|
|
|
void initialize(void)
|
|
{};
|
|
void finalize(void)
|
|
{};
|
|
|
|
std::string readDapSpecFile(const std::string& filename);
|
|
void collateAllDapSpecs(void);
|
|
void parseAllDapSpecs(void);
|
|
|
|
static const std::string stringifyDeviceSpecs(void);
|
|
|
|
// New async function for device attachment
|
|
typedef std::function<void(
|
|
bool success, std::shared_ptr<DeviceRole> deviceRole,
|
|
std::shared_ptr<DeviceAttachmentSpec> deviceSpec)>
|
|
newDeviceAttachmentSpecIndCbFn;
|
|
void newDeviceAttachmentSpecInd(
|
|
std::shared_ptr<DeviceAttachmentSpec> spec,
|
|
Callback<newDeviceAttachmentSpecIndCbFn> callback);
|
|
|
|
// Device attachment/detachment methods moved from SenseApiManager
|
|
typedef sense_api::sal_mlo_attachDeviceReqCbFn attachSenseDeviceReqCbFn;
|
|
typedef sense_api::sal_mlo_detachDeviceReqCbFn detachSenseDeviceReqCbFn;
|
|
|
|
void attachSenseDeviceReq(
|
|
const std::shared_ptr<DeviceAttachmentSpec>& spec,
|
|
Callback<attachSenseDeviceReqCbFn> cb);
|
|
void detachSenseDeviceReq(
|
|
const std::shared_ptr<DeviceAttachmentSpec>& spec,
|
|
Callback<detachSenseDeviceReqCbFn> cb);
|
|
|
|
typedef std::function<void(AsynchronousLoop &results)>
|
|
attachAllSenseDevicesFromSpecsReqCbFn;
|
|
typedef std::function<void(AsynchronousLoop &results)>
|
|
detachAllSenseDevicesReqCbFn;
|
|
|
|
void attachAllSenseDevicesFromSpecsReq(
|
|
Callback<attachAllSenseDevicesFromSpecsReqCbFn> cb);
|
|
void detachAllSenseDevicesReq(
|
|
Callback<detachAllSenseDevicesReqCbFn> cb);
|
|
|
|
private:
|
|
DeviceManager() = default;
|
|
~DeviceManager() = default;
|
|
DeviceManager(const DeviceManager&) = delete;
|
|
DeviceManager& operator=(const DeviceManager&) = delete;
|
|
|
|
public:
|
|
std::string allDapSpecs;
|
|
static std::vector<std::shared_ptr<DeviceAttachmentSpec>>
|
|
deviceAttachmentSpecs;
|
|
static std::vector<std::shared_ptr<Device>> devices;
|
|
static std::vector<std::shared_ptr<DeviceRole>> attachedDeviceRoles;
|
|
|
|
private:
|
|
class NewDeviceAttachmentSpecInd;
|
|
class AttachSenseDeviceReq;
|
|
typedef AttachSenseDeviceReq DetachSenseDeviceReq;
|
|
class AttachAllSenseDevicesFromSpecsReq;
|
|
class DetachAllSenseDevicesReq;
|
|
};
|
|
|
|
} // namespace device
|
|
} // namespace smo
|
|
|
|
#endif // DEVICEMANAGER_H
|